diff --git a/contrib/cycle_group_leader.lua b/contrib/cycle_group_leader.lua new file mode 100644 index 0000000..e4bdd11 --- /dev/null +++ b/contrib/cycle_group_leader.lua @@ -0,0 +1,158 @@ +--[[ + + cycle_group_leader.lua - change image grouip leader + + Copyright (C) 2024 Bill Ferguson + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +]] +--[[ + cycle_group_leader - change image grouip leader + + cycle_group_leader changes the group leader to the next + image in the group. If the end of the group is reached + then the next image is wrapped around to the first image. + + ADDITIONAL SOFTWARE NEEDED FOR THIS SCRIPT + None + + USAGE + * enable with script_manager + * assign a key to the shortcut + + BUGS, COMMENTS, SUGGESTIONS + Bill Ferguson + + CHANGES +]] + +local dt = require "darktable" +local du = require "lib/dtutils" +local df = require "lib/dtutils.file" + +-- - - - - - - - - - - - - - - - - - - - - - - - +-- C O N S T A N T S +-- - - - - - - - - - - - - - - - - - - - - - - - + +local MODULE = "cycle_group_leader" + +-- - - - - - - - - - - - - - - - - - - - - - - - +-- A P I C H E C K +-- - - - - - - - - - - - - - - - - - - - - - - - + +du.check_min_api_version("7.0.0", MODULE) + + +-- - - - - - - - - - - - - - - - - - - - - - - - - - +-- S C R I P T M A N A G E R I N T E G R A T I O N +-- - - - - - - - - - - - - - - - - - - - - - - - - - + +local script_data = {} + +script_data.destroy = nil -- function to destory the script +script_data.destroy_method = nil -- set to hide for libs since we can't destroy them commpletely yet +script_data.restart = nil -- how to restart the (lib) script after it's been hidden - i.e. make it visible again +script_data.show = nil -- only required for libs since the destroy_method only hides them + +-- - - - - - - - - - - - - - - - - - - - - - - - - - +-- I 1 8 N +-- - - - - - - - - - - - - - - - - - - - - - - - - - + +local gettext = dt.gettext + +-- Tell gettext where to find the .mo file translating messages for a particular domain +gettext.bindtextdomain(MODULE, dt.configuration.config_dir .. "/lua/locale/") + +local function _(msgid) + return gettext.dgettext(MODULE, msgid) +end + +-- - - - - - - - - - - - - - - - - - - - - - - - +-- F U N C T I O N S +-- - - - - - - - - - - - - - - - - - - - - - - - + +local function toggle_global_toolbox_grouping() + dt.gui.libs.global_toolbox.grouping = false + dt.gui.libs.global_toolbox.grouping = true +end + +local function hinter_msg(msg) + dt.print_hinter(msg) + dt.control.sleep(1500) + dt.print_hinter(" ") +end + +-- - - - - - - - - - - - - - - - - - - - - - - - +-- M A I N P R O G R A M +-- - - - - - - - - - - - - - - - - - - - - - - - + +local function cycle_group_leader(image) + local group_images = image:get_group_members() + if #group_images < 2 then + hinter_msg(_("No images to cycle to in group")) + return + else + local position = nil + for i, img in ipairs(group_images) do + if image == img then + position = i + end + end + + if position == #group_images then + position = 1 + else + position = position + 1 + end + + new_leader = group_images[position] + new_leader:make_group_leader() + dt.gui.selection({new_leader}) + + if dt.gui.libs.global_toolbox.grouping then + -- toggle the grouping to make the new leader show + toggle_global_toolbox_grouping() + end + end +end + +-- - - - - - - - - - - - - - - - - - - - - - - - +-- D A R K T A B L E I N T E G R A T I O N +-- - - - - - - - - - - - - - - - - - - - - - - - + +local function destroy() + -- put things to destroy (events, storages, etc) here + dt.destroy_event(MODULE, "shortcut") +end + +script_data.destroy = destroy + +-- - - - - - - - - - - - - - - - - - - - - - - - +-- E V E N T S +-- - - - - - - - - - - - - - - - - - - - - - - - + +dt.register_event(MODULE, "shortcut", + function(event, shortcut) + -- ignore the film roll, it contains all the images, not just the imported + local images = dt.gui.selection() + if #images < 1 then + dt.print(_("No image selected. Please select an image and try again")) + else + cycle_group_leader(images[1]) + end + end, + _("cycle group leader") +) + +return script_data