started cleanup and refactoring panels...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2013-12-26 23:00:20 +04:00
parent 3ea0f99dc6
commit fd6271d00c
2 changed files with 135 additions and 89 deletions

View File

@ -22,11 +22,13 @@
-o-user-select: none;
user-select: none;
}
.panel summary {
.panel summary,
.sub-panel summary {
padding-left: 3px;
background: silver
}
.panel summary::-webkit-details-marker {
.panel summary::-webkit-details-marker,
.sub-panel summary::-webkit-details-marker {
color: gray;
}
.panel .close-button {
@ -218,7 +220,8 @@
.dark .panel summary {
background: #333;
}
.dark .panel summary::-webkit-details-marker {
.dark .panel summary::-webkit-details-marker,
.dark .sub-panel summary::-webkit-details-marker {
color: #555;
}
.dark .sub-panel button,
@ -295,7 +298,8 @@
.gray .panel summary {
background: #444;
}
.gray .panel summary::-webkit-details-marker {
.gray .panel summary::-webkit-details-marker,
.gray .sub-panel summary::-webkit-details-marker {
color: #555;
}
.gray .sub-panel button,

View File

@ -6,35 +6,111 @@
//var DEBUG = DEBUG != null ? DEBUG : true
// this is an element/selector to be used as the temporary parent for
// helpers while dragging/sorting sub-panels...
// if set to null, the parent of a nearest panel will be used (slower)
var PANEL_ROOT = 'body'
var PANEL_HELPER_HIDE_DELAY = 50
var PANEL_HELPER_HIDE_DELAY_NO_ROOT = 100
/**********************************************************************
* Helpers...
*/
// - start monitoring where we are dragged to...
// - open hidden side panels...
function _startSortHandler(e, ui){
// make the sorted element on top of everything...
// NOTE: showing and hiding the helper for 100ms here prevents it
// from blinking in the upper-left corner of the screen which
// is more distracting...
// XXX find a better way to do this...
(PANEL_ROOT == null
? ui.item.parents('.panel, .side-panel').first().parent()
: $(PANEL_ROOT))
.append(ui.helper.css('display', 'none'))
setTimeout(function(){
ui.helper.css('display', '')
}, PANEL_ROOT == null
? PANEL_HELPER_HIDE_DELAY_NO_ROOT
: PANEL_HELPER_HIDE_DELAY)
ui.item.data('isoutside', false)
ui.placeholder
.height(ui.helper.outerHeight())
.width(ui.helper.outerWidth())
// show all hidden panels...
$('.side-panel').each(function(){
var p = $(this)
if(p.attr('autohide') == 'on'){
p.attr('autohide', 'off')
p.data('autohide', true)
} else {
p.data('autohide', false)
}
})
}
// wrap a sub-panel with a new panel...
//
function wrapWithPanel(panel, parent, offset){
var new_panel = makePanel()
.css(offset)
.appendTo(parent)
new_panel.find('.panel-content')
.append(panel)
return new_panel
}
// close the panel and fire close events on it and all sub-panels...
//
function closePanel(panel, skip_sub_panel_events){
skip_sub_panel_events = skip_sub_panel_events == null ? false : true
if(!skip_sub_panel_events){
panel.find('.sub-panel')
.trigger('panelClosing')
}
panel
.trigger('panelClosing')
.remove()
}
/*********************************************************************/
function makePanel(title, open, editable_title, keep_empty){
// XXX dragging out, into another panel and back out behaves oddly:
// should:
// either revert or create a new panel
// does:
// drops to last placeholder
function makePanel(title, open, keep_empty, close_button){
title = title == null || title.trim() == '' ? '&nbsp;' : title
close_button = close_button == null ? true : false
// tool panel...
// the outer panel...
var panel = $('<details/>')
.prop('open', open == null ? true : open)
.addClass('panel noScroll')
.append($('<summary>'+title+'</summary>')
.attr({
contenteditable: editable_title == null ? 'false' : 'true',
})
.append($('<span/>')
.addClass('close-button')
.click(function(){
panel
.trigger('panelClosing')
.remove()
return false
})
.html('&times;')))
.append(close_button
? $('<summary>'+title+'</summary>')
.append($('<span/>')
.addClass('close-button')
.click(function(){
closePanel(panel)
return false
})
.html('&times;'))
: $('<summary>'+title+'</summary>'))
.draggable({
containment: 'parent',
scroll: false,
// XXX this makes things quite a bit slower...
//stack: '.panel, .sub-panel',
stack: '.panel',
// sanp to panels...
//snap: ".panel",
//snapMode: "outer",
})
@ -44,41 +120,23 @@ function makePanel(title, open, editable_title, keep_empty){
position: 'absolute',
})
// wrapper for sub-panels...
// XXX dragging out, into another panel and back out behaves oddly:
// should:
// either revert or create a new panel
// does:
// drops to last placeholder
// XXX the helper should be above all other panels...
// content -- wrapper for sub-panels...
var content = $('<span class="panel-content content">')
.sortable({
// general settings...
forcePlaceholderSize: true,
opacity: 0.7,
connectWith: '.panel-content',
zIndex: 9999,
start: function(e, ui){
ui.item.data('isoutside', false)
ui.placeholder
.height(ui.helper.outerHeight())
.width(ui.helper.outerWidth())
// show all hidden panels...
$('.side-panel').each(function(){
var p = $(this)
if(p.attr('autohide') == 'on'){
p.attr('autohide', 'off')
p.data('autohide', true)
} else {
p.data('autohide', false)
}
})
},
// create a new panel when dropping outside of curent panel...
start: _startSortHandler,
// - create a new panel when dropping outside of curent panel...
// - remove empty panels...
beforeStop: function(e, ui){
var c = 0
// do this only when dropping outside the panel...
//if(ui.placeholder.css('display') == 'none'
if(ui.item.data('isoutside')
// prevent draggingout the last panel...
// NOTE: 2 because we are taking into account
@ -89,19 +147,13 @@ function makePanel(title, open, editable_title, keep_empty){
// ...this is likely to the fact that we jquery-ui did
// not cleanup yet
c = 1
var new_panel = makePanel()
.css(ui.offset)
.appendTo(panel.parent())
new_panel.find('.panel-content')
.append(ui.item)
panel.trigger('newPanel', [new_panel])
wrapWithPanel(ui.item, panel.parent(), ui.offset)
}
// remove the panel when it runs out of sub-panels...
if(!keep_empty && panel.find('.sub-panel').length-c <= 0){
panel
.trigger('panelClosing')
.remove()
// XXX need to trigger sub-panel's 'closing' event...
closePanel(panel, true)
}
// reset the auto-hide of the side panels...
@ -114,14 +166,18 @@ function makePanel(title, open, editable_title, keep_empty){
ui.item.data('isoutside', false)
},
over: function(e, ui){
ui.item.data('isoutside', false)
ui.placeholder.show()
},
out: function(e, ui){
ui.item.data('isoutside', true)
ui.placeholder.hide()
},
})
.appendTo(panel)
return panel
}
@ -139,38 +195,30 @@ function makeSidePanel(side, autohide){
}
panel = $('<div/>')
.addClass('side-panel panel-content ' + side)
.attr('autohide', autohide)
// toggle auto-hide...
.dblclick(function(e){
var elem = $(this)
if(elem.attr('autohide') == 'off'){
elem.attr('autohide', 'on')
} else {
elem.attr('autohide', 'off')
}
return false
})
.sortable({
forcePlaceholderSize: true,
opacity: 0.7,
connectWith: '.panel-content',
zIndex: 9999,
start: function(e, ui){
ui.item.data('isoutside', false)
ui.placeholder
.height(ui.helper.outerHeight())
.width(ui.helper.outerWidth())
// show all hidden panels...
$('.side-panel').each(function(){
var p = $(this)
if(p.attr('autohide') == 'on'){
p.attr('autohide', 'off')
p.data('autohide', true)
} else {
p.data('autohide', false)
}
})
},
// create a new panel when dropping outside of curent panel...
start: _startSortHandler,
// - create a new panel when dropping outside of curent panel...
// - remove empty panels...
beforeStop: function(e, ui){
// do this only when dropping outside the panel...
if(ui.item.data('isoutside')){
var new_panel = makePanel()
.css(ui.offset)
.appendTo(panel.parent())
new_panel.find('.panel-content')
.append(ui.item)
panel.trigger('newPanel', [new_panel])
wrapWithPanel(ui.item, panel.parent(), ui.offset)
}
// reset the auto-hide of the side panels...
@ -183,23 +231,17 @@ function makeSidePanel(side, autohide){
ui.item.data('isoutside', false)
},
over: function(e, ui){
ui.item.data('isoutside', false)
ui.placeholder.show()
},
out: function(e, ui){
ui.item.data('isoutside', true)
ui.placeholder.hide()
},
})
.dblclick(function(e){
var elem = $(this)
if(elem.attr('autohide') == 'off'){
elem.attr('autohide', 'on')
} else {
elem.attr('autohide', 'off')
}
return false
})
.attr('autohide', autohide)
return panel
}