diff --git a/ui/lib/panels.js b/ui/lib/panels.js index 0b70aa3a..9cd47bc3 100755 --- a/ui/lib/panels.js +++ b/ui/lib/panels.js @@ -15,8 +15,25 @@ var PANEL_HELPER_HIDE_DELAY = 50 var PANEL_HELPER_HIDE_DELAY_NO_ROOT = 100 -var PANELS = { -} +// Panel controller registry... +// +// Format: +// { +// : <controller>, +// ... +// } +// +// The controller is generated by makePanelController(...) and is called +// automatically by openPanel(...) +var PANELS = {} + + +// XXX write real doc... +// XXX see getPanelState(...) +// XXX we should keep track of panel state while moving, opening, closing +// and resizing panels... +// XXX move this to config??? +var PANEL_STATE = {} @@ -116,74 +133,10 @@ function getPanel(title){ } -function openPanel(panel){ - var title = typeof(panel) == typeof('str') ? panel : null - panel = typeof(panel) == typeof('str') - ? getPanel(panel) - : panel - title = title == null ? panel.attr('id') : title - var open = false - - // create a new panel... - if(panel.length == 0){ - if(title in PANELS){ - var builder = PANELS[title] - panel = builder({ open: true }) - } - // show/open the panel and all it's parents... - } else { - open = isPanelVisible(panel) - panel - .prop('open', true) - .parents('.panel') - .prop('open', true) - // XXX show side panels too... - } - - // if the panel was not open trigger the event... - if(!open){ - panel.trigger('panelOpening', panel) - } - - return panel -} - - -// Close the panel... -// -// NOTE: this does not care if it's a panel or sub-panel... -// XXX do we need a panelRemoved event??? -// ...and a symmetrical panelCreated?? -function closePanel(panel){ - panel = typeof(panel) == typeof('str') - ? getPanel(panel) - : panel - panel.find('.sub-panel').each(function(){ - var p = $(this) - if(p.prop('open')){ - p.trigger('panelClosing', p) - } - }) - return panel - .prop('open', false) - .trigger('panelClosing', panel) -} - - -// Remove the panel after firing close events on it and all sub-panels... -// -function removePanel(panel){ - panel = typeof(panel) == typeof('str') - ? getPanel(panel) - : panel - return closePanel(panel) - .remove() -} - - - -/*********************************************************************/ +/********************************************************************** +* Constructors... +*/ // XXX dragging out, into another panel and back out behaves oddly: // should: @@ -457,6 +410,80 @@ function makeSubPanel(title, content, parent, open, content_resizable, close_but +/********************************************************************** +* Actions... +*/ + +// XXX this should take the state into consideration while opening panels +// and open panels in specific parents and locations, maybe even with +// other neighbor panels... +function openPanel(panel){ + var title = typeof(panel) == typeof('str') ? panel : null + panel = typeof(panel) == typeof('str') + ? getPanel(panel) + : panel + title = title == null ? panel.attr('id') : title + var open = false + + // create a new panel... + if(panel.length == 0){ + if(title in PANELS){ + var builder = PANELS[title] + panel = builder({ open: true }) + } + + // show/open the panel and all it's parents... + } else { + open = isPanelVisible(panel) + panel + .prop('open', true) + .parents('.panel') + .prop('open', true) + // XXX show side panels too... + } + + // if the panel was not open trigger the event... + if(!open){ + panel.trigger('panelOpening', panel) + } + + return panel +} + + +// Close the panel... +// +// NOTE: this does not care if it's a panel or sub-panel... +// XXX do we need a panelRemoved event??? +// ...and a symmetrical panelCreated?? +function closePanel(panel){ + panel = typeof(panel) == typeof('str') + ? getPanel(panel) + : panel + panel.find('.sub-panel').each(function(){ + var p = $(this) + if(p.prop('open')){ + p.trigger('panelClosing', p) + } + }) + return panel + .prop('open', false) + .trigger('panelClosing', panel) +} + + +// Remove the panel after firing close events on it and all sub-panels... +// +function removePanel(panel){ + panel = typeof(panel) == typeof('str') + ? getPanel(panel) + : panel + return closePanel(panel) + .remove() +} + + + /********************************************************************** * High level interface... */