kdf
Version:
369 lines (246 loc) • 9.42 kB
text/coffeescript
KD = require './../../core/kd.coffee'
KDView = require './../../core/view.coffee'
KDSplitViewPanel = require './splitpanel.coffee'
KDSplitResizer = require './splitresizer.coffee'
module.exports = class KDSplitView extends KDView
constructor: (options = {}, data) ->
options.type or= "vertical" # "vertical" or "horizontal"
options.resizable ?= yes # yes or no
options.sizes or= [.5, .5] # an Array of Strings such as ["50%","50%"] or ["500px","150px",null] and null for the available rest area
options.minimums or= [0, 0] # an Array of Strings
options.maximums or= ['100%', '100%'] # an Array of Strings
options.views or= [] # an Array of KDViews
options.fixed or= [] # an Array of Booleans
options.duration or= 200 # a Number in miliseconds
options.separator or= null # a KDView instance or null for default separator
options.colored ?= no # a Boolean
options.resizeHandleSize or= 2 # a Number
options.type = options.type.toLowerCase()
options.cssClass = KD.utils.curry "kdsplitview kdsplitview-#{options.type}", options.cssClass
super options,data
{ , } =
= []
= null
= []
= []
= []
= 0
viewAppended:->
if and [1]
?.on "PanelDidResize", KD.utils.debounce 10, '_windowDidResize'
_createPanels:->
0
1 if [1]?
_createPanel:(index)->
{fixed, panelClass} =
panel = new (panelClass or KDSplitViewPanel)
cssClass : "kdsplitview-panel panel-#{index}"
index : index
type :
size : [index]
fixed : !!fixed[index]
panel.on "KDObjectWillBeDestroyed", => panel
"SplitPanelCreated", panel
[index] = panel
return panel
_putPanels:->
[0]
[1]
if .colored
[0].setCss backgroundColor : KD.utils.getRandomRGB()
[1].setCss backgroundColor : KD.utils.getRandomRGB()
_resizePanels:-> [0]
_panelIsBeingDestroyed:(panel)->
{views} =
{index} = panel
[index] = null
[index] = null
[index] = null
[index] = null
views[index] = null
_createResizer:->
{type, resizeHandleSize} =
= new KDSplitResizer
cssClass : "kdsplitview-resizer #{type}"
type :
panel0 : [0]
panel1 : [1]
handleSize : resizeHandleSize
_repositionResizer:-> ._setOffset [0]
_putViews:->
{views} =
return unless views
views[0], 0 if views[0]
views[1], 1 if views[1]
_calculateSizes:->
{sizes} =
givenSizes = sizes
splitSize =
legitSizes = []
legitSizes[0] = , 0
legitSizes[1] = , 1
totalSize = legitSizes[0] + legitSizes[1]
if totalSize > splitSize
legitSizes[1] = splitSize - legitSizes[0]
else if totalSize < splitSize
if givenSizes[0] and (not givenSizes[1] or givenSizes[1] is 'auto')
legitSizes[1] = splitSize - legitSizes[0]
else if givenSizes[1] and (not givenSizes[0] or givenSizes[0] is 'auto')
legitSizes[0] = splitSize - legitSizes[1]
= splitSize
= legitSizes
_sanitizeSize: (size) ->
return if "number" is typeof size
if 1 > size > 0
then * size
else size
else if /px$/.test size then parseInt size, 10
else if /%$/.test size
then / 100 * parseInt size, 10
else null
_setMinsAndMaxs:->
{minimums, maximums} =
[0] = minimums[0]
[1] = minimums[1]
[0] = maximums[0]
[1] = maximums[1]
_getSize:->
if then
else if
then
else
_setSize:(size)->
if
then size
else size
_getParentSize:->
if
if and .isInDom()
then .getWidth()
else window.innerWidth
else
if and .isInDom()
then .getHeight()
else window.innerHeight
_getLegitPanelSize: (size, index) ->
min = [index] or 0
max = [index] or
return Math.min Math.max(min, size), max
_windowDidResize: ->
= null
# find a way to do that for when parent get resized and split reachs a min-width
# if > then "min-width-reached" else "min-width-reached"
if
mouseUp: (event) ->
@$().unbind "mousemove.resizeHandle"
_panelReachedMinimum:(index)->
panel = [index]
panel.emit "PanelReachedMinimum"
"PanelReachedMinimum", {panel}
_panelReachedMaximum:(index)->
panel = [index]
panel.emit "PanelReachedMaximum"
"PanelReachedMaximum", {panel}
_resizeDidStart:(event)->
"ResizeDidStart", event
document.body.classList.add "resize-in-action"
_resizeDidStop: do ->
unsetResizeInAction = KD.utils.throttle 1000, (view)->
document.body.classList.remove "resize-in-action"
(event)->
s1 = [0]/
s2 = [1]/
'sizes', [s1, s2]
"ResizeDidStop", event
unsetResizeInAction this
isVertical:-> is "vertical"
getPanelIndex: (panel)-> panel.index
hidePanel: (index, callback = noop)->
panel = [index]
panel._lastSize = panel._getSize()
if panel.isFloating
panel.setCss "width", 0
callback { panel, index }
else
0, index, callback.bind this, { panel, index }
showPanel: (index, callback = noop) ->
panel = [index]
newSize = panel._lastSize or [index] or 200
panel._lastSize = null
if panel.isFloating
panel.setCss 'width', newSize
left = panel.getRelativeX()
panel.setCss 'left', left - newSize if left > 0
KD.getSingleton('windowController').addLayer panel
panel.once 'ReceivedClickElsewhere', =>
index
callback { panel, index }
else
newSize, index, callback.bind this, { panel, index }
setFloatingPanel: (index, size = 0) ->
panel = [index]
panel.setClass 'floating'
panel.isFloating = yes
panel._lastSize = panel._getSize()
size, index
'PanelSetToFloating', panel
unsetFloatingPanel: (index) ->
panel = [index]
delete panel.isFloating
panel.unsetClass 'floating'
index
'PanelSetToNormal', panel
resizePanel:(value = 0, index = 0, callback = noop, forceResize = no)->
return unless [1]?
return if
value = value
value = if value >
askedPanel = [index]
affectedPanel = [(index + 1) % 2]
if askedPanel._getSize() is value and not forceResize
callback()
return
= yes
value = value, index
sizes = [value, - value]
offset = if index then sizes[1] else sizes[0]
askedPanel._setSize sizes[0]
affectedPanel._setSize sizes[1]
[1]._setOffset offset
._setOffset offset if
= no
merge: ->
{views} =
.views = []
views.forEach (view, i) =>
return unless view
view.detach()
view.unsetParent()
[i].subViews = []
"SplitIsBeingMerged", views
removePanel:(index)->
setView: (view, index) ->
return warn "view is missing at KDSplitView::setView" unless view
return warn "index is missing at KDSplitView::setView" if index > .length
return warn "index is missing at KDSplitView::setView" unless view instanceof KDView
[index].addSubView view
# deprecated methods
deprecated = -> warn 'deprecated method invoked'
_repositionPanels: deprecated
_repositionResizers: deprecated
_setPanelPositions: deprecated