Need help with connected / linked pop-up menus
want select preset.
what did create 2 pop-up menus. first preset folders , second presets folder.
each pop-up group has pop-up , static field current choise.
after selecting different value first pop-up menu want have second popup menu filled new, right presets of folder.
the first time works correct.
however when selecting different folder see "preset table" filled correct new preset of folder. static field below second pop-up menu shows first value of correct new presets. second pop-up menu still contains presets of first folder , not new folder.
yet in observer see preset table contains right , new presets.
my code below.
i based on sample in sdk manual.
question: how can update second pop-up menu pop-up menu shows right presets.
code below
local lrapplication = import 'lrapplication' local lrpathutils = import 'lrpathutils' local lrfileutils = import 'lrfileutils' local lrbinding = import "lrbinding" local lrdialogs = import "lrdialogs"local lrfunctioncontext = import "lrfunctioncontext" local lrview = import "lrview" local bind = lrview.bind -- shortcut bind() method -- https://github.com/kikito/inspect.lua local inspect = require 'inspect' local logfilename = 'presetlist' local mylogger = import 'lrlogger'( logfilename ) mylogger:enable( "logfile" ) local logpath --[[-------------------------------------------------------------------------- name emptylogfile purpose clears existing log file. cookbook: http://cookbooks.adobe.com/post_clearing_your_logfile_automatically-19677.html ----------------------------------------------------------------------------]] function emptylogfile() --local mylogger = import 'lrlogger'( 'stash' ) mylogger:disable() logpath = lrpathutils.child(lrpathutils.getstandardfilepath('documents'), logfilename .. ".log") if lrfileutils.exists( logpath ) local success, reason = lrfileutils.delete( logpath ) if not success logger:error("error deleting existing logfile!" .. reason) end end mylogger:enable( "logfile" ) end --[[-------------------------------------------------------------------------- name getlocationlogfile. purpose returns full path of current log file. ----------------------------------------------------------------------------]] function getlocationlogfile() return logpath end local function getpresetfolders() -- folders presets local lrpresetfolders = lrapplication.developpresetfolders() local presetfoldercache = {} local record = {} i, fo in ipairs( lrpresetfolders ) record = {title = fo:getname(), value = fo } --record = {title = fo:getname(), value = fo:getname() } --mylogger:info( "folder name = " .. fo:getname() ) table.insert ( presetfoldercache, record ) end -- mylogger:info("voor de listing") -- mylogger:info("preset folders : " .. inspect ( presetfoldercache ) ) return presetfoldercache end local function getpresets ( folderobject ) local presets = folderobject:getdeveloppresets() local presetcache = {} local record = {} j, p in ipairs( presets ) record = {title = p:getname(), value = p:getname() } --record = {title = p:getname(), value = p:getname() } mylogger:info( "getpresets = " .. p:getname() ) table.insert ( presetcache, record ) end mylogger:info("presets : " .. inspect ( presetcache ) ) return presetcache end local function choosepreset() emptylogfile() local presetfolders = getpresetfolders() local currentpresetfolder = presetfolders[1]["value"] local presets = getpresets ( currentpresetfolder ) mylogger:info(presets) -- mylogger:info("preset folders : " .. inspect ( presetfolders ) ) lrfunctioncontext.callwithcontext( 'pop-up example', function( context ) local f = lrview.osfactory() -- obtain view factory local properties = lrbinding.makepropertytable( context ) -- make prop table -- create keys initial values properties.presetfolder = presetfolders[1]["value"] -- radio buttons , pop-up menu properties.preset = presets[1]["value"] properties:addobserver( 'presetfolder', function( properties, key, newvalue ) mylogger:info("observer - preset list" ) currentpresetfolder = properties.presetfolder presets = getpresets ( currentpresetfolder ) mylogger:info(presets) mylogger:info("observer - preset table: " .. inspect ( presets ) ) -- set new value properties.preset = presets[1]["value"] mylogger:info("observer: " .. presets[1]["title"] ) end ) -- mylogger:info("presetfolder = " .. properties.presetfolder ) -- mylogger:info("preset = " .. properties.preset ) local contents = f:column { -- create view hierarchy fill_horizontal = 1, spacing = f:control_spacing(), bind_to_object = properties, -- default bound table 1 made f:group_box { title = "preset folders", fill_horizontal = 1, spacing = f:control_spacing(), f:popup_menu { value = bind 'presetfolder', -- current value bound same key static text items = presetfolders }, f:static_text { fill_horizontal = 1, title = bind 'presetfolder', -- bound same key current selection }, }, f:group_box { title = "presets", fill_horizontal = 1, spacing = f:control_spacing(), f:popup_menu { value = bind 'preset', -- current value bound same key static text items = presets -- items = getpresets ( currentpresetfolder ) }, f:static_text { fill_horizontal = 1, title = bind 'preset', -- bound same key current selection }, }, } local result = lrdialogs.presentmodaldialog( -- invoke dialog { title = "select preset", contents = contents, } ) end ) end -- display dialogs choosepreset()
if popup items not fixed (and in case, it's not), can bind property.
rob
More discussions in Lightroom SDK
adobe
Comments
Post a Comment