@ -87,7 +87,7 @@ function OptionTextItem:onTapSelect()
self.underline_container . color = Blitbuffer.COLOR_BLACK
self.config : onConfigChoose ( self.values , self.name ,
self.event , self.args ,
self.events , self.current_item )
self.events , self.current_item , self.hide_on_apply )
UIManager : setDirty ( self.config , function ( )
return " fast " , self [ 1 ] . dimen
end )
@ -159,7 +159,7 @@ function OptionIconItem:onTapSelect()
self.underline_container . color = Blitbuffer.COLOR_BLACK
self.config : onConfigChoose ( self.values , self.name ,
self.event , self.args ,
self.events , self.current_item )
self.events , self.current_item , self.hide_on_apply )
UIManager : setDirty ( self.config , function ( )
return " fast " , self [ 1 ] . dimen
end )
@ -478,6 +478,7 @@ function ConfigOption:init()
option_item.args = self.options [ c ] . args
option_item.event = self.options [ c ] . event
option_item.current_item = d
option_item.hide_on_apply = self.options [ c ] . hide_on_apply
option_item.config = self.config
option_item.document = self.document
table.insert ( option_items_group , option_item )
@ -518,6 +519,7 @@ function ConfigOption:init()
option_item.args = self.options [ c ] . args
option_item.event = self.options [ c ] . event
option_item.current_item = d
option_item.hide_on_apply = self.options [ c ] . hide_on_apply
option_item.config = self.config
table.insert ( option_items_group , option_item )
end
@ -549,7 +551,7 @@ function ConfigOption:init()
args = self.options [ c ] . args ,
event = self.options [ c ] . event ,
events = self.options [ c ] . events ,
delay_repaint = self.options [ c ] . delay_repaint ,
hide_on_apply = self.options [ c ] . hide_on_apply ,
config = self.config ,
enabled = enabled ,
row_count = row_count ,
@ -559,7 +561,7 @@ function ConfigOption:init()
self.options [ c ] . more_options_param.show_true_value_func = self.options [ c ] . show_true_value_func
end
self.config : onConfigMoreChoose ( self.options [ c ] . values , self.options [ c ] . name ,
self.options [ c ] . event , arg , name_text , self.options [ c ] . delay_repaint, self.options [ c ] . more_options_param)
self.options [ c ] . event , arg , name_text , self.options [ c ] . more_options_param)
end
end
}
@ -587,14 +589,14 @@ function ConfigOption:init()
callback = function ( arg )
if arg == " - " or arg == " + " then
self.config : onConfigFineTuneChoose ( self.options [ c ] . values , self.options [ c ] . name ,
self.options [ c ] . event , self.options [ c ] . args , self.options [ c ] . events , arg , self.options [ c ] . delay_repaint ,
self.options [ c ] . event , self.options [ c ] . args , self.options [ c ] . events , arg , self.options [ c ] . hide_on_apply ,
self.options [ c ] . fine_tune_param )
elseif arg == " ⋮ " then
self.config : onConfigMoreChoose ( self.options [ c ] . values , self.options [ c ] . name ,
self.options [ c ] . event , arg , name_text , self.options [ c ] . delay_repaint, self.options [ c ] . more_options_param)
self.options [ c ] . event , arg , name_text , self.options [ c ] . more_options_param)
else
self.config : onConfigChoose ( self.options [ c ] . values , self.options [ c ] . name ,
self.options [ c ] . event , self.options [ c ] . args , self.options [ c ] . events , arg , self.options [ c ] . delay_repaint )
self.options [ c ] . event , self.options [ c ] . args , self.options [ c ] . events , arg , self.options [ c ] . hide_on_apply )
end
UIManager : setDirty ( self.config , function ( )
return " fast " , switch.dimen
@ -923,8 +925,8 @@ function ConfigDialog:onConfigChoice(option_name, option_value)
return true
end
function ConfigDialog : onConfigEvent ( option_event , option_arg , refresh _callback)
self.ui : handleEvent ( Event : new ( option_event , option_arg , refresh _callback) )
function ConfigDialog : onConfigEvent ( option_event , option_arg , when_applied _callback)
self.ui : handleEvent ( Event : new ( option_event , option_arg , when_applied _callback) )
return true
end
@ -936,7 +938,7 @@ function ConfigDialog:onConfigEvents(option_events, arg_index)
return true
end
function ConfigDialog : onConfigChoose ( values , name , event , args , events , position , delay_repaint )
function ConfigDialog : onConfigChoose ( values , name , event , args , events , position , hide_on_apply )
UIManager : tickAfterNext ( function ( )
-- Repainting may be delayed depending on options
local refresh_dialog_func = function ( )
@ -954,15 +956,15 @@ function ConfigDialog:onConfigChoose(values, name, event, args, events, position
end )
end
end
local refresh _callback = nil
if type ( delay_repaint ) == " number " then -- timeout
UIManager : scheduleIn ( delay_repaint , refresh_dialog_func )
local when_applied _callback = nil
if type ( hide_on_apply ) == " number " then -- timeout
UIManager : scheduleIn ( hide_on_apply , refresh_dialog_func )
self.skip_paint = true
elseif delay_repaint then -- anything but nil or false: provide a callback
elseif hide_on_apply then -- anything but nil or false: provide a callback
-- This needs the config option to have an "event" key
-- The event handler is responsible for calling this callback when
-- it considers it appropriate
refresh _callback = refresh_dialog_func
when_applied _callback = refresh_dialog_func
self.skip_paint = true
end
if values then
@ -970,7 +972,7 @@ function ConfigDialog:onConfigChoose(values, name, event, args, events, position
end
if event then
args = args or { }
self : onConfigEvent ( event , args [ position ] , refresh _callback)
self : onConfigEvent ( event , args [ position ] , when_applied _callback)
end
if events then
self : onConfigEvents ( events , position )
@ -980,14 +982,14 @@ function ConfigDialog:onConfigChoose(values, name, event, args, events, position
-- toggles may have their state (enabled/disabled) modified
-- after this toggle update.
self : update ( )
if not delay_repaint then -- immediate refresh
if not hide_on_apply then -- immediate refresh
refresh_dialog_func ( )
end
end )
end
-- Tweaked variant used with the fine_tune variant of buttonprogress (direction can only be "-" or "+")
function ConfigDialog : onConfigFineTuneChoose ( values , name , event , args , events , direction , delay_repaint , params )
function ConfigDialog : onConfigFineTuneChoose ( values , name , event , args , events , direction , hide_on_apply , params )
UIManager : tickAfterNext ( function ( )
-- Repainting may be delayed depending on options
local refresh_dialog_func = function ( )
@ -1005,15 +1007,15 @@ function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events,
end )
end
end
local refresh _callback = nil
if type ( delay_repaint ) == " number " then -- timeout
UIManager : scheduleIn ( delay_repaint , refresh_dialog_func )
local when_applied _callback = nil
if type ( hide_on_apply ) == " number " then -- timeout
UIManager : scheduleIn ( hide_on_apply , refresh_dialog_func )
self.skip_paint = true
elseif delay_repaint then -- anything but nil or false: provide a callback
elseif hide_on_apply then -- anything but nil or false: provide a callback
-- This needs the config option to have an "event" key
-- The event handler is responsible for calling this callback when
-- it considers it appropriate
refresh _callback = refresh_dialog_func
when_applied _callback = refresh_dialog_func
self.skip_paint = true
end
if values then
@ -1070,7 +1072,7 @@ function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events,
arg = arg + 1
end
end
self : onConfigEvent ( event , arg , refresh _callback)
self : onConfigEvent ( event , arg , when_applied _callback)
end
if events then
self : onConfigEvents ( events , direction )
@ -1080,7 +1082,7 @@ function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events,
-- toggles may have their state (enabled/disabled) modified
-- after this toggle update.
self : update ( )
if not delay_repaint then -- immediate refresh
if not hide_on_apply then -- immediate refresh
refresh_dialog_func ( )
end
end )
@ -1088,14 +1090,16 @@ end
-- Tweaked variant used with the more options variant of buttonprogress and fine tune with numpicker
-- events are not supported
function ConfigDialog : onConfigMoreChoose ( values , name , event , args , name_text , delay_repaint, more_options_param)
function ConfigDialog : onConfigMoreChoose ( values , name , event , args , name_text , more_options_param)
if not more_options_param then
more_options_param = { }
end
UIManager : tickAfterNext ( function ( )
-- Repainting may be delayed depending on options
local refresh_dialog_func = function ( )
self.skip_paint = nil
local refresh_dialog_func = function ( keep_skip_paint )
if self.skip_paint and not keep_skip_paint then
self.skip_paint = nil
end
if self.config_options . needs_redraw_on_change then
-- Some Kopt document event handlers just save their setting,
-- and need a full repaint for kopt to load these settings,
@ -1104,20 +1108,31 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
else
-- CreDocument event handlers do their own refresh:
-- we can just redraw our frame
UIManager : setDirty ( self , function ( )
return " ui " , self.dialog_frame . dimen
end )
if self.skip_paint then
-- Redraw anything below the now hidden ConfigDialog
UIManager : setDirty ( " all " , function ( )
return " partial " , self.dialog_frame . dimen
end )
else
UIManager : setDirty ( self , function ( )
return " ui " , self.dialog_frame . dimen
end )
end
end
end
local refresh_callback = nil
if type ( delay_repaint ) == " number " then -- timeout
UIManager : scheduleIn ( delay_repaint , refresh_dialog_func )
local hide_on_picker_show = more_options_param.hide_on_picker_show
if hide_on_picker_show == nil then -- default to true if unset
hide_on_picker_show = true
end
local when_applied_callback = nil
if type ( hide_on_picker_show ) == " number " then -- timeout
UIManager : scheduleIn ( hide_on_picker_show , refresh_dialog_func )
self.skip_paint = true
elseif delay_repaint then -- anything but nil or false: provide a callback
elseif hide_on_picker_show then -- anything but nil or false: provide a callback
-- This needs the config option to have an "event" key
-- The event handler is responsible for calling this callback when
-- it considers it appropriate
refresh _callback = refresh_dialog_func
when_applied _callback = refresh_dialog_func
self.skip_paint = true
end
if values and event then
@ -1142,6 +1157,8 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
curr_values = self.configurable [ name ]
end
widget = DoubleSpinWidget : new {
title_text = name_text or _ ( " Set values " ) ,
info_text = more_options_param.info_text ,
width = math.floor ( Screen : getWidth ( ) * 0.6 ) ,
left_text = more_options_param.left_text ,
right_text = more_options_param.right_text ,
@ -1155,16 +1172,14 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
right_max = more_options_param.right_max ,
right_step = more_options_param.right_step ,
right_hold_step = more_options_param.right_hold_step ,
title_text = name_text or _ ( " Set values " ) ,
info_text = more_options_param.info_text ,
keep_shown_on_apply = true ,
callback = function ( left_value , right_value )
if widget : hasMoved ( ) and not self._dialog_closed then
-- If it has been moved, assume the user wants more
-- space and close bottom dialog
self._dialog_closed = true
self : closeDialog ( )
close_callback = function ( )
if when_applied_callback then
when_applied_callback ( )
when_applied_callback = nil
end
end ,
callback = function ( left_value , right_value )
local value_tables = { left_value , right_value }
if more_options_param.names then
self : onConfigChoice ( more_options_param.names [ 1 ] , left_value )
@ -1173,8 +1188,13 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
self : onConfigChoice ( name , value_tables )
end
if event then
-- Repainting (with when_applied_callback) if hide_on_picker_show
-- is done in close_callback, but we want onConfigEvent to
-- show a message when settings applied: handlers that can do
-- it actually do it when provided a callback as argument
local dummy_callback = when_applied_callback and function ( ) end
args = args or { }
self : onConfigEvent ( event , value_tables , refresh_callback )
self : onConfigEvent ( event , value_tables , dummy _callback)
self : update ( )
end
end ,
@ -1206,7 +1226,6 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
end )
end ,
} )
end ,
}
else -- SpinWidget with single value
@ -1232,6 +1251,8 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
end
end
widget = SpinWidget : new {
title_text = name_text or _ ( " Set value " ) ,
info_text = more_options_param.info_text ,
width = math.floor ( Screen : getWidth ( ) * 0.6 ) ,
value = curr_items ,
value_index = value_index ,
@ -1242,6 +1263,41 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
value_max = more_options_param.value_max or values [ # values ] ,
precision = more_options_param.precision or " %02d " ,
keep_shown_on_apply = true ,
close_callback = function ( )
if when_applied_callback then
when_applied_callback ( )
when_applied_callback = nil
end
end ,
callback = function ( spin )
if more_options_param.value_table then
if more_options_param.args_table then
self : onConfigChoice ( name , more_options_param.args_table [ spin.value_index ] )
else
self : onConfigChoice ( name , spin.value_index )
end
else
self : onConfigChoice ( name , spin.value )
end
if event then
-- Repainting (with when_applied_callback) if hide_on_picker_show
-- is done in close_callback, but we want onConfigEvent to
-- show a message when settings applied: handlers that can do
-- it actually do it when provided a callback as argument
local dummy_callback = when_applied_callback and function ( ) end
args = args or { }
if more_options_param.value_table then
if more_options_param.args_table then
self : onConfigEvent ( event , more_options_param.args_table [ spin.value_index ] , dummy_callback )
else
self : onConfigEvent ( event , spin.value_index , dummy_callback )
end
else
self : onConfigEvent ( event , spin.value , dummy_callback )
end
self : update ( )
end
end ,
extra_text = _ ( " Set as default " ) ,
extra_callback = function ( spin )
local value_string
@ -1270,51 +1326,14 @@ function ConfigDialog:onConfigMoreChoose(values, name, event, args, name_text, d
end )
end ,
} )
end ,
title_text = name_text or _ ( " Set value " ) ,
info_text = more_options_param.info_text ,
callback = function ( spin )
if widget : hasMoved ( ) and not self._dialog_closed then
-- If it has been moved, assume the user wants more
-- space and close bottom dialog
self._dialog_closed = true
self : closeDialog ( )
end
if more_options_param.value_table then
if more_options_param.args_table then
self : onConfigChoice ( name , more_options_param.args_table [ spin.value_index ] )
else
self : onConfigChoice ( name , spin.value_index )
end
else
self : onConfigChoice ( name , spin.value )
end
if event then
args = args or { }
if more_options_param.value_table then
if more_options_param.args_table then
self : onConfigEvent ( event , more_options_param.args_table [ spin.value_index ] , refresh_callback )
else
self : onConfigEvent ( event , spin.value_index , refresh_callback )
end
else
self : onConfigEvent ( event , spin.value , refresh_callback )
end
self : update ( )
end
end
}
end
if delay_repaint then
self._dialog_closed = true
self : closeDialog ( )
end
UIManager : show ( widget )
end
if not delay_repaint then -- immediate refresh
refresh_dialog_func ( )
end
-- Even if skip_paint (to temporarily hide it), we need
-- to issue setDirty for what's below to be painted
refresh_dialog_func ( true )
end )
end