mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
added manual item sorting options/buttons to EdiatbleList(..)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
4c387d328f
commit
3ae69acaa8
@ -227,7 +227,7 @@ var ExternalEditorUIActions = actions.Actions({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
new_button: false,
|
new_item: false,
|
||||||
itemButtons: [],
|
itemButtons: [],
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|||||||
@ -2456,7 +2456,7 @@ var FileSystemWriterUIActions = actions.Actions({
|
|||||||
'export-paths',
|
'export-paths',
|
||||||
'export-path',
|
'export-path',
|
||||||
{
|
{
|
||||||
new_button: false,
|
new_item: false,
|
||||||
})],
|
})],
|
||||||
]})
|
]})
|
||||||
// XXX make this editable???
|
// XXX make this editable???
|
||||||
@ -2536,7 +2536,7 @@ var FileSystemWriterUIActions = actions.Actions({
|
|||||||
'export-dialog-modes',
|
'export-dialog-modes',
|
||||||
'export-dialog-mode',
|
'export-dialog-mode',
|
||||||
{
|
{
|
||||||
new_button: false,
|
new_item: false,
|
||||||
itemButtons: [],
|
itemButtons: [],
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|||||||
@ -532,6 +532,10 @@ var URLHistoryUIActions = actions.Actions({
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: this partially re-implements browse.Items.EditableList(..)
|
||||||
|
// but since we have the pinned items we can't use it directly
|
||||||
|
// ...and since .EditableList(..) can't be used twice per
|
||||||
|
// dialog we can't work around this...
|
||||||
var o = browse.makeLister(null,
|
var o = browse.makeLister(null,
|
||||||
function(path, make){
|
function(path, make){
|
||||||
makeHistoryList()
|
makeHistoryList()
|
||||||
|
|||||||
@ -59,7 +59,7 @@ var SlideshowActions = actions.Actions({
|
|||||||
var button_text = 'New...'
|
var button_text = 'New...'
|
||||||
var o = widgets.makeConfigListEditor(that, 'slideshow-intervals', {
|
var o = widgets.makeConfigListEditor(that, 'slideshow-intervals', {
|
||||||
path: that.config['slideshow-interval'],
|
path: that.config['slideshow-interval'],
|
||||||
new_button: button_text,
|
new_item: button_text,
|
||||||
length_limit: that.config['slideshow-interval-max-count'],
|
length_limit: that.config['slideshow-interval-max-count'],
|
||||||
check: Date.str2ms,
|
check: Date.str2ms,
|
||||||
unique: Date.str2ms,
|
unique: Date.str2ms,
|
||||||
|
|||||||
@ -209,7 +209,7 @@ function(actions, list, list_key, value_key, options){
|
|||||||
var txt = $(this).find('.text').first().text()
|
var txt = $(this).find('.text').first().text()
|
||||||
|
|
||||||
var dfl_options = {
|
var dfl_options = {
|
||||||
new_button: 'New...',
|
new_item: 'New...',
|
||||||
length_limit: 10,
|
length_limit: 10,
|
||||||
// NOTE: this is called when adding a new value and
|
// NOTE: this is called when adding a new value and
|
||||||
// list maximum length is reached...
|
// list maximum length is reached...
|
||||||
|
|||||||
@ -365,7 +365,7 @@ function(data, options){
|
|||||||
//
|
//
|
||||||
// options format:
|
// options format:
|
||||||
// {
|
// {
|
||||||
// new_button: <text>|<bool>,
|
// new_item: <text>|<bool>,
|
||||||
//
|
//
|
||||||
// // if true, disable delete item button...
|
// // if true, disable delete item button...
|
||||||
// no_delete_button: <bool>,
|
// no_delete_button: <bool>,
|
||||||
@ -400,12 +400,49 @@ function(data, options){
|
|||||||
// // if function will be used as cmp for sorting...
|
// // if function will be used as cmp for sorting...
|
||||||
// sort: <bool> || function(a, b){ ... },
|
// sort: <bool> || function(a, b){ ... },
|
||||||
//
|
//
|
||||||
// // this is called when a new value is added via new_button but
|
// // this is called when a new value is added via new_item but
|
||||||
// // list length limit is reached...
|
// // list length limit is reached...
|
||||||
// overflow: function(selected){ ... },
|
// overflow: function(selected){ ... },
|
||||||
//
|
//
|
||||||
// // see: itemButtons doc in browse.js for more info...
|
// // special buttons...
|
||||||
// itemButtons: [..]
|
// //
|
||||||
|
// // NOTE: these can be used only if .sort if not set.
|
||||||
|
// //
|
||||||
|
// // Item order editing (up/down)
|
||||||
|
// item_order_buttons: false,
|
||||||
|
// // Up button html...
|
||||||
|
// shift_up_button: <html> | null,
|
||||||
|
// // Down button html...
|
||||||
|
// shift_down_button: <html> | null,
|
||||||
|
//
|
||||||
|
// // move to top/bottom buttons, if not false the button is enabled,
|
||||||
|
// // if not bool the value is set as button html.
|
||||||
|
// to_top_button: false | true | <html>,
|
||||||
|
// to_bottom_button: false | true | <html>,
|
||||||
|
//
|
||||||
|
// // item buttons...
|
||||||
|
// buttons: [
|
||||||
|
// // placeholders that if given will be replace with the corresponding
|
||||||
|
// // special button...
|
||||||
|
// // NOTE: placeholders for disabled or not activated buttons
|
||||||
|
// // will get removed.
|
||||||
|
// // NOTE: if button is enabled but no placeholder is preset
|
||||||
|
// // it will be appended to the button list.
|
||||||
|
// //
|
||||||
|
// // up...
|
||||||
|
// 'UP',
|
||||||
|
// // down...
|
||||||
|
// 'DOWN',
|
||||||
|
// // move to top...
|
||||||
|
// 'TO_TOP',
|
||||||
|
// // move to bottom...
|
||||||
|
// 'TO_BOTTOM'
|
||||||
|
// // remove item...
|
||||||
|
// 'REMOVE'
|
||||||
|
//
|
||||||
|
// // see: itemButtons doc in browse.js for more info...
|
||||||
|
// ..
|
||||||
|
// ],
|
||||||
//
|
//
|
||||||
// ...
|
// ...
|
||||||
// }
|
// }
|
||||||
@ -467,10 +504,86 @@ function(list, options){
|
|||||||
|
|
||||||
dialog.__list = lst
|
dialog.__list = lst
|
||||||
|
|
||||||
// add the 'x' button if not disabled...
|
|
||||||
var buttons = options.buttons = (options.buttons || []).slice()
|
var buttons = options.buttons = (options.buttons || []).slice()
|
||||||
|
var _buttons = {}
|
||||||
|
|
||||||
|
// XXX add top/bottom/up/down buttons...
|
||||||
|
// XXX add placeholders ($REMOVE, $UP, $DOWN, ...) in user buttons
|
||||||
|
// to reorder these...
|
||||||
|
if(!options.sort){
|
||||||
|
var move = function(p, offset){
|
||||||
|
var l = dialog.__list
|
||||||
|
var i = l.indexOf(p)
|
||||||
|
|
||||||
|
// not in list...
|
||||||
|
if(i < 0
|
||||||
|
// first element...
|
||||||
|
|| (i == 0 && offset < 0)
|
||||||
|
// last element...
|
||||||
|
|| (i >= l.length-1 && offset > 0)){
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var j = i + offset
|
||||||
|
j = j < 0 ? 0
|
||||||
|
: j >= l.length ? l.length-1
|
||||||
|
: j
|
||||||
|
|
||||||
|
// update list...
|
||||||
|
l.splice(j, 0, l.splice(i, 1)[0])
|
||||||
|
|
||||||
|
// XXX ???
|
||||||
|
return j - i
|
||||||
|
}
|
||||||
|
|
||||||
|
// up/down...
|
||||||
|
options.item_order_buttons
|
||||||
|
&& (_buttons['UP'] = [options.shift_up_button || '⏶',
|
||||||
|
function(p, e){
|
||||||
|
move(p, -1)
|
||||||
|
&& e.prev().before(e) }])
|
||||||
|
&& (_buttons['DOWN'] = [options.shift_down_button || '⏷',
|
||||||
|
function(p, e){
|
||||||
|
move(p, 1)
|
||||||
|
&& e.next().after(e) }])
|
||||||
|
|
||||||
|
// top...
|
||||||
|
options.to_top_button
|
||||||
|
&& (_buttons['TO_TOP'] = [options.to_top_button === true ?
|
||||||
|
'⤒'
|
||||||
|
: options.to_top_button,
|
||||||
|
function(p, e){
|
||||||
|
var d = move(p, -dialog.__list.length)
|
||||||
|
d && e.prevAll().eq(Math.abs(d+1)).before(e)
|
||||||
|
}])
|
||||||
|
|
||||||
|
// bottom...
|
||||||
|
options.to_bottom_button
|
||||||
|
&& (_buttons['TO_BOTTOM'] = [options.to_bottom_button === true ?
|
||||||
|
'⤓'
|
||||||
|
: options.to_bottom_button,
|
||||||
|
function(p, e){
|
||||||
|
var d = move(p, dialog.__list.length)
|
||||||
|
d && e.nextAll().eq(Math.abs(d)).before(e)
|
||||||
|
}])
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the 'x' button if not disabled...
|
||||||
!options.no_delete_button
|
!options.no_delete_button
|
||||||
&& buttons.push(Buttons.markForRemoval(to_remove))
|
&& (_buttons['REMOVE'] = Buttons.markForRemoval(to_remove))
|
||||||
|
|
||||||
|
// add the buttons...
|
||||||
|
Object.keys(_buttons).forEach(function(key){
|
||||||
|
var i = buttons.indexOf(key)
|
||||||
|
i < 0 ?
|
||||||
|
buttons.push(_buttons[key])
|
||||||
|
: buttons.splice(i, 1, _buttons[key])
|
||||||
|
})
|
||||||
|
// clear out the unused button placeholders...
|
||||||
|
buttons = buttons
|
||||||
|
.filter(function(b){
|
||||||
|
return ['UP', 'DOWN', 'TO_TOP', 'TO_BOTTOM', 'REMOVE'].indexOf(b) < 0 })
|
||||||
|
|
||||||
|
|
||||||
// make the list...
|
// make the list...
|
||||||
@ -488,74 +601,75 @@ function(list, options){
|
|||||||
res = res.toArray()
|
res = res.toArray()
|
||||||
|
|
||||||
// new button...
|
// new button...
|
||||||
var new_button = options.new_button || true
|
if(options.new_item !== false){
|
||||||
new_button = new_button === true ? 'New...' : new_button
|
var new_item = options.new_item || true
|
||||||
res.push(make.Editable(
|
new_item = new_item === true ? 'New...' : new_item
|
||||||
new_button,
|
res.push(make.Editable(
|
||||||
{
|
new_item,
|
||||||
action: true,
|
{
|
||||||
clear_on_edit: true,
|
action: true,
|
||||||
})
|
clear_on_edit: true,
|
||||||
// update list on edit done...
|
})
|
||||||
.on('edit-commit', function(evt, txt){
|
// update list on edit done...
|
||||||
txt = options.normalize ?
|
.on('edit-commit', function(evt, txt){
|
||||||
options.normalize(txt)
|
txt = options.normalize ?
|
||||||
: txt
|
options.normalize(txt)
|
||||||
|
: txt
|
||||||
|
|
||||||
// invalid format...
|
// invalid format...
|
||||||
if(options.check && !options.check(txt)){
|
if(options.check && !options.check(txt)){
|
||||||
|
dialog.update()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
lst = dialog.__list
|
||||||
|
|
||||||
|
// list length limit
|
||||||
|
if(options.length_limit
|
||||||
|
&& (lst.length >= options.length_limit)){
|
||||||
|
|
||||||
|
options.overflow
|
||||||
|
&& options.overflow.call(dialog, txt)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent editing non-arrays...
|
||||||
|
if(!editable || !lst){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// add new value and sort list...
|
||||||
|
lst.push(txt)
|
||||||
|
|
||||||
|
// unique...
|
||||||
|
if(options.unique == null || options.unique === true){
|
||||||
|
lst = lst.unique()
|
||||||
|
|
||||||
|
// unique normalized...
|
||||||
|
} else if(options.unique instanceof Function){
|
||||||
|
lst = lst.unique(options.unique)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort...
|
||||||
|
if(options.sort){
|
||||||
|
lst = lst
|
||||||
|
.sort(options.sort instanceof Function ?
|
||||||
|
options.sort
|
||||||
|
: undefined)
|
||||||
|
}
|
||||||
|
|
||||||
|
lst = write(list, lst)
|
||||||
|
|
||||||
|
dialog.__list = lst
|
||||||
|
|
||||||
|
// update list and select new value...
|
||||||
dialog.update()
|
dialog.update()
|
||||||
return
|
.done(function(){
|
||||||
}
|
dialog.select('"'+txt+'"')
|
||||||
|
})
|
||||||
lst = dialog.__list
|
}))
|
||||||
|
}
|
||||||
// list length limit
|
|
||||||
if(options.length_limit
|
|
||||||
&& (lst.length >= options.length_limit)){
|
|
||||||
|
|
||||||
options.overflow
|
|
||||||
&& options.overflow.call(dialog, txt)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// prevent editing non-arrays...
|
|
||||||
if(!editable || !lst){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// add new value and sort list...
|
|
||||||
lst.push(txt)
|
|
||||||
|
|
||||||
// unique...
|
|
||||||
if(options.unique == null || options.unique === true){
|
|
||||||
lst = lst.unique()
|
|
||||||
|
|
||||||
// unique normalized...
|
|
||||||
} else if(options.unique instanceof Function){
|
|
||||||
lst = lst.unique(options.unique)
|
|
||||||
}
|
|
||||||
|
|
||||||
// sort...
|
|
||||||
if(options.sort){
|
|
||||||
lst = lst
|
|
||||||
.sort(options.sort instanceof Function ?
|
|
||||||
options.sort
|
|
||||||
: undefined)
|
|
||||||
}
|
|
||||||
|
|
||||||
lst = write(list, lst)
|
|
||||||
|
|
||||||
dialog.__list = lst
|
|
||||||
|
|
||||||
// update list and select new value...
|
|
||||||
dialog.update()
|
|
||||||
.done(function(){
|
|
||||||
dialog.select('"'+txt+'"')
|
|
||||||
})
|
|
||||||
}))
|
|
||||||
|
|
||||||
|
|
||||||
// dialog handlers...
|
// dialog handlers...
|
||||||
// NOTE: we bind these only once per dialog...
|
// NOTE: we bind these only once per dialog...
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user