coffeescript-ui
Version:
Coffeescript User Interface System
231 lines (178 loc) • 6.08 kB
text/coffeescript
###
* coffeescript-ui - Coffeescript User Interface System (CUI)
* Copyright (c) 2013 - 2016 Programmfabrik GmbH
* MIT Licence
* https://github.com/programmfabrik/coffeescript-ui, http://www.coffeescript-ui.org
###
CUI.Template.loadTemplateText(require('./Pane.html'));
class CUI.Pane extends CUI.VerticalLayout
:
button_tooltip: text: "Turn fullscreen on / off"
__init: ->
super()
= false
if
initOpts: ->
super()
padded:
check: Boolean
default: false
readOpts: ->
super()
hasHeader: ->
!!
hasFooter: ->
!!
getFillScreenState: ->
endFillScreen: (transition=true) ->
if not
return
= false
if not CUI.util.$elementIsInDOM()
.destroy()
= null
else
end_fill_screen = =>
#console.debug "Stopping", event
CUI.dom.insertBefore(, )
parentPopover = CUI.dom.data(CUI.dom.parent(), "element")
if parentPopover instanceof CUI.Popover
parentPopover.setVisible(true)
CUI.dom.remove()
.destroy()
delete()
CUI.Events.trigger
type: "end-fill-screen"
node:
CUI.Events.trigger
type: "viewport-resize"
node:
if transition
CUI.Events.wait
type: "transitionend"
node:
.always =>
end_fill_screen()
.removeClass("cui-pane-fill-screen-is-on")
else
end_fill_screen()
@
startFillScreen: ->
if
return
= new CUI.Template
name: "pane-fill-screen"
map:
inner: true
# measure DOM start position
rect = CUI.dom.getRect()
vp = CUI.dom.getDimensions(window)
= new CUI.Template
name: "pane-fill-screen-placeholder"
= .DOM
inner = .map.inner
# add DOM element classes of all parent dom elements
# to the inner container
# for el in .parents(".cui-dom-element")
# inner.addClass(DOM.data(el, "element").getDOMElementClasses())
CUI.dom.append(document.body, .DOM)
dim_fill = CUI.dom.getDimensions(.DOM)
dim_fill_inner = CUI.dom.getDimensions(inner)
# adjust start rect, so it matches the design of the
# fill div
adjust =
left: (dim_fill_inner.clientBoundingRect.left - dim_fill.clientBoundingRect.left) + dim_fill_inner.borderLeft + dim_fill_inner.paddingLeft
top: (dim_fill_inner.clientBoundingRect.top - dim_fill.clientBoundingRect.top) + dim_fill_inner.borderTop + dim_fill_inner.paddingTop
right: (dim_fill.clientBoundingRect.right - dim_fill_inner.clientBoundingRect.right) + dim_fill_inner.borderRight + dim_fill_inner.paddingRight
bottom: (dim_fill.clientBoundingRect.bottom - dim_fill_inner.clientBoundingRect.bottom) + dim_fill_inner.borderBottom + dim_fill_inner.paddingBottom
start_rect =
top: rect.top - adjust.top
left: rect.left - adjust.left
bottom: vp.height - rect.bottom - adjust.bottom
right: vp.width - rect.right - adjust.right
CUI.dom.remove(.DOM)
CUI.dom.setStyle(.DOM, start_rect)
CUI.dom.append(document.body, .DOM)
# copy keys over for the placeholder, so that it has the
# same dimension as the replaced div
# this assumes, that the placeholder dont uses padding, border
# or margin!
CUI.dom.setStyle(,
width: CUI.dom.getDimensions().marginBoxWidth
height: CUI.dom.getDimensions().marginBoxHeight
)
for key_copy in ["position", "top", "left", "right", "bottom"]
CUI.dom.setStyleOne(, key_copy, CUI.dom.getComputedStyle()[key_copy])
CUI.dom.insertAfter(, )
parentPopover = CUI.dom.data(CUI.dom.parent(), "element")
if parentPopover instanceof CUI.Popover
parentPopover.setVisible(false)
.replace(, "inner")
CUI.Events.wait
type: "transitionend"
node:
.always =>
CUI.Events.trigger
type: "start-fill-screen"
node:
CUI.Events.trigger
type: "viewport-resize"
node:
.addClass("cui-pane-fill-screen-is-on")
= true
checkToggle = =>
if not
return
if not CUI.util.$elementIsInDOM()
CUI.setTimeout(checkToggle, 50)
checkToggle()
toggleFillScreen: ->
if
else
# creates a button that can be used in paneheader (or somewhere else) to toggle fillscreen
: (_opts={}) ->
opts = CUI.Element.readOpts(_opts, "Pane.getToggleFillScreenButton",
icon_inactive:
mandatory: true
check: (v) =>
v instanceof CUI.Icon or CUI.util.isString(v) or CUI.util.isPlainObject(v)
default: "fa-expand"
icon_active:
mandatory: true
check: (v) =>
v instanceof CUI.Icon or CUI.util.isString(v) or CUI.util.isPlainObject(v)
default: "fa-compress"
group:
mandatory: false
check: String
tooltip:
mandatory: true
check: (v) =>
v instanceof CUI.Tooltip or CUI.util.isPlainObject(v)
default: CUI.Pane.defaults.button_tooltip
)
if CUI.util.isString(opts.icon_inactive)
opts.icon_inactive = new CUI.Icon(class: opts.icon_inactive)
if CUI.util.isString(opts.icon_active)
opts.icon_active = new CUI.Icon(class: opts.icon_active)
for key, value of {
switch: true
onClick: (ev, btn) =>
paneDiv = CUI.dom.closest(btn.DOM, ".cui-pane")
pane = CUI.dom.data(paneDiv, "element")
pane.toggleFillScreen()
}
opts[key] = value
new CUI.defaults.class.Button(opts)
CUI.Events.registerEvent
type: ["start-fill-screen", "end-fill-screen"]
sink: true