local LrTasks = import 'LrTasks' local LrApplication = import 'LrApplication' local LrFunctionContext = import 'LrFunctionContext' local LrDevelopController = import 'LrDevelopController' local json2 = require 'Json2' require 'Globals' adjustmentObservingInterval = 0.2 -- 200ms photoObservingInterval = 1 -- 1s adjustmentsCache = {} observableAdjustments = {} adjustmentsValueObserverIsWorking = false function enableValueSync(adjustmentsToObserve) adjustmentsCache = {} observableAdjustments = adjustmentsToObserve if not photoChangedObserverIsWorking then startObservingPhotoChange() photoChangedCallback() end if not adjustmentsValueObserverIsWorking then startObservingAdjustmentsValueChange() end end function disableValueSync() adjustmentsCache = {} if photoChangedObserverIsWorking then stopObservingPhotoChange() end if adjustmentsValueObserverIsWorking then stopObservingAdjustmentsValueChange() end end -- This method works only for non reference values. If you want compare tables or arrays, please update this method function updateCache() local changedAdjustments = {} for _, adjustmentName in ipairs(observableAdjustments) do local newAdjustmentValue = LrDevelopController.getValue(adjustmentName) if adjustmentsCache[adjustmentName] ~= newAdjustmentValue then adjustmentsCache[adjustmentName] = newAdjustmentValue changedAdjustments[adjustmentName] = newAdjustmentValue end end return changedAdjustments end function checkUpdatedAdjustmentValuesAndSendEvent() local changedAdjustments = updateCache() if not tableIsEmpty(changedAdjustments) then sendEvent('adjustmentvaluechanged', json2:encode(changedAdjustments)) end end -- Function to start observing changes. function startObservingAdjustmentsValueChange() adjustmentsValueObserverIsWorking = true LrTasks.startAsyncTask(function() while adjustmentsValueObserverIsWorking do checkUpdatedAdjustmentValuesAndSendEvent() LrTasks.sleep(adjustmentObservingInterval) -- 200ms end end) end -- Function to stop observing changes. function stopObservingAdjustmentsValueChange() adjustmentsValueObserverIsWorking = false end photoChangedObserver = {} photoChangedObserverIsWorking = false catalog = LrApplication.activeCatalog() function startObservingPhotoChange() photoChangedObserverIsWorking = true LrTasks.startAsyncTask(function() LrFunctionContext.callWithContext("Observer", function(context) LrApplication.addActivePhotoChangeObserver(context, photoChangedObserver, photoChangedCallback) while photoChangedObserverIsWorking do LrTasks.sleep(photoObservingInterval) -- 1s end end) end) end function photoChangedCallback() catalog:withReadAccessDo(function() local targetPhoto = catalog:getTargetPhoto() if targetPhoto then -- a photo is selected sendEvent('newphotoselected', '') else -- no photo is selected sendEvent('photodeselected', '') end end) end function stopObservingPhotoChange() photoChangedObserverIsWorking = false end