diff --git a/ui/lib/panels.js b/ui/lib/panels.js index cb8618a9..aa2f0df8 100755 --- a/ui/lib/panels.js +++ b/ui/lib/panels.js @@ -84,6 +84,13 @@ function _resetSortedElem(elem){ } +function isPanelVisible(panel){ + return panel.prop('open') + && (panel.parents('.panel').prop('open') + || panel.parents('.side-panel').width() > 20) +} + + // wrap a sub-panel with a new panel... // function wrapWithPanel(panel, parent, offset){ @@ -98,11 +105,17 @@ function wrapWithPanel(panel, parent, offset){ // close the panel and fire close events on it and all sub-panels... // +// XXX do we need a panelRemoved event??? +// ...and a symmetrical panelCreated?? function closePanel(panel){ - panel.find('.sub-panel') - .trigger('panelClosing') + panel.find('.sub-panel').each(function(){ + var p = $(this) + if(p.prop('open')){ + p.trigger('panelClosing', p) + } + }) panel - .trigger('panelClosing') + .trigger('panelClosing', panel) .remove() } @@ -124,7 +137,7 @@ function makePanel(title, parent, open, keep_empty, close_button){ var panel = $('
') .prop('open', open == null ? true : open) .addClass('panel noScroll') - .append(close_button + .append((close_button ? $(''+title+'') .append($('') .addClass('close-button') @@ -134,6 +147,22 @@ function makePanel(title, parent, open, keep_empty, close_button){ }) .html('×')) : $(''+title+'')) + // XXX also do this on enter... + // XXX + .click(function(){ + if(!panel.prop('open')){ + var evt = 'panelOpening' + } else { + var evt = 'panelClosing' + } + panel.trigger(evt, panel) + panel.find('.sub-panel').each(function(){ + var sub_panel = $(this) + if(sub_panel.prop('open')){ + sub_panel.trigger(evt, sub_panel) + } + }) + })) .draggable({ containment: 'parent', scroll: false, @@ -210,6 +239,9 @@ function makePanel(title, parent, open, keep_empty, close_button){ panel.appendTo(parent) } + // NOTE: no need to call the panelOpening event here as at this point + // no one had the chance to bind a handler... + return panel } @@ -217,7 +249,9 @@ function makePanel(title, parent, open, keep_empty, close_button){ // side can be: // - left // - right +// // XXX in part this is exactly the same as makePanel +// XXX need to trigger open/close sub panel events... function makeSidePanel(side, parent, autohide){ autohide = autohide == null ? 'on' : 'off' parent = parent == null ? $(PANEL_ROOT) : parent @@ -229,6 +263,8 @@ function makeSidePanel(side, parent, autohide){ panel = $('
') .addClass('side-panel panel-content ' + side) .attr('autohide', autohide) + // XXX trigger open/close events on hide/show.. + // XXX // toggle auto-hide... .dblclick(function(e){ var elem = $(this) @@ -278,6 +314,9 @@ function makeSidePanel(side, parent, autohide){ panel.appendTo(parent) } + // NOTE: no need to call the panelOpening event here as at this point + // no one had the chance to bind a handler... + return panel } @@ -302,7 +341,16 @@ function makeSubPanel(title, content, parent, open, content_resizable){ var sub_panel = $('
') .addClass('sub-panel noScroll') .prop('open', open) - .append($(''+title+'')) + .append($(''+title+'') + // XXX also do this on enter... + // XXX + .click(function(){ + if(!sub_panel.prop('open')){ + sub_panel.trigger('panelOpening', sub_panel) + } else { + sub_panel.trigger('panelClosing', sub_panel) + } + })) .append(content_elem) if(parent != null){ @@ -327,6 +375,9 @@ function makeSubPanel(title, content, parent, open, content_resizable){ }) } + // NOTE: no need to call the panelOpening event here as at this point + // no one had the chance to bind a handler... + return sub_panel } @@ -340,11 +391,16 @@ var PANELS = { } +// +// content_builder() - should build and setup panel content +// panel_setup(panel) - should register panel open/close event +// handlers +// // NOTE: this will search an element by title, so if it is not unique // an existing element will be returned... -function buildPanelController(title, content_builder, setup){ +function buildPanelController(title, content_builder, panel_setup){ - var controller = function(parent){ + var builder = function(parent){ // 1) search for panel and return it if it exists... var panel = $('[id="'+ title +'"]') @@ -353,19 +409,26 @@ function buildPanelController(title, content_builder, setup){ if(panel.length == 0){ parent = parent == null ? $(PANEL_ROOT) : parent - panel = makeSubPanel(title, content_builder, false) + panel = makeSubPanel(title, content_builder(), false) .attr('id', title) - setup(panel) panel.appendTo(parent) + + // XXX should this be before or after the append??? + panel_setup(panel) + + // trigger the open event... + if(isPanelVisible(panel)){ + panel.trigger('panelOpening', panel) + } } return panel } - PANELS[title] = controller + PANELS[title] = builder - return controller + return builder }