From 06901461c43839c2a43dbdaba7d3d6cbfd43cfd6 Mon Sep 17 00:00:00 2001 From: Tobias Ellinghaus Date: Wed, 24 Jun 2015 17:27:43 +0200 Subject: [PATCH] Add a manager for import filters + 2 examples This adds a new callback to darktable: darktable.register_import_filter(name, callback) --- official/import_filter_manager.lua | 79 +++++++++++++++++++++++++++++ official/import_filters.lua | 80 ++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 official/import_filter_manager.lua create mode 100644 official/import_filters.lua diff --git a/official/import_filter_manager.lua b/official/import_filter_manager.lua new file mode 100644 index 0000000..140b569 --- /dev/null +++ b/official/import_filter_manager.lua @@ -0,0 +1,79 @@ +--[[ + This file is part of darktable, + copyright (c) 2015 Tobias Ellinghaus + + darktable 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. + + darktable 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 darktable. If not, see . +]] +--[[ +IMPORT FILTER MANAGER +This script adds a dropdown list with import filters to the import dialog. +Scripts can add new filters by registering them with + darktable.register_import_filter(name, callback) +The callback has type function(event, images), i.e., it is the same as when +directly registering the pre-import event. + + +USAGE +* require this script from your main lua file +* also require some files with import filters, for example import_filters.lua. + it is important to add them AFTER this one! +]] + +local dt = require "darktable" + +local import_filter_list = {} +local n_import_filters = 1 + +-- allow changing the filter from the preferences +dt.preferences.register("import_filter_manager", "active_filter", "string", + "import filter", "the name of the filter used for importing images", "") + + +-- the dropdown to select the active filter from the import dialog +local filter_dropdown = dt.new_widget("combobox") +{ + label = "import filter", + editable = false, + + changed_callback = function(widget) + dt.preferences.write("import_filter_manager", "active_filter", "string", widget.value) + end, + + "" -- the first entry in the list is hard coded to "" so it's possible to have no filter +} +dt.gui.libs.import.register_widget(filter_dropdown) + + +-- this is just a wrapper which calls the active import filter +dt.register_event("pre-import", function(event, images) + local active_filter = dt.preferences.read("import_filter_manager", "active_filter", "string") + if active_filter == "" then return end + local callback = import_filter_list[active_filter] + if callback then callback(event, images) end +end) + + +-- add a new global function to register import filters +dt.register_import_filter = function(name, callback) + local active_filter = dt.preferences.read("import_filter_manager", "active_filter", "string") + dt.print_error("registering import filter `" .. name .. "'") + import_filter_list[name] = callback + n_import_filters = n_import_filters + 1 + filter_dropdown[n_import_filters] = name + if name == active_filter then filter_dropdown.value = n_import_filters end +end + + +-- vim: shiftwidth=2 expandtab tabstop=2 cindent +-- kate: tab-indents: off; indent-width 2; replace-tabs on; remove-trailing-space on; diff --git a/official/import_filters.lua b/official/import_filters.lua new file mode 100644 index 0000000..5980a72 --- /dev/null +++ b/official/import_filters.lua @@ -0,0 +1,80 @@ +--[[ + This file is part of darktable, + copyright (c) 2015 Tobias Ellinghaus + + darktable 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. + + darktable 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 darktable. If not, see . +]] +--[[ +EXAMPLE IMPORT FILTERS +This script goes along with the import filter manager. It adds two filters: +* ignore jpegs: this one does the same as the existing option in the import dialog + and just skips all JPEGs during import. +* prefer raw over jpeg: this one is a bit more elaborate, it ignores JPEGs when there + is also another file with the same basename, otherwise it + allows JPEGs, too. + +USAGE +* require this script from your main lua file AFTER import_filter_manager.lua +]] + +local dt = require "darktable" + +-- we get fed a sorted list of filenames. just setting images to ignore to nil is enough + +-- ignore jpeg +dt.register_import_filter("ignore jpegs", function(event, images) + dt.print_error("ignoring all jpegs") + for i, img in ipairs(images) do + local extension = img:match("[^.]*$"):upper() + if (extension == "JPG") or (extension == "JPEG") then + images[i] = nil + end + end +end) + + +-- ignore jpeg iff another format for the image is found +dt.register_import_filter("prefer raw over jpeg", function(event, images) + dt.print_error("prefering raw over jpeg") + local current_base = "" + local jpg_indices = {} + local other_format_found = false + for i, img in ipairs(images) do + local extension = img:match("[^.]*$"):upper() + local base = img:match("^.*[.]") + + if base ~= current_base then + -- we are done with the base name, act according to what we found out + if other_format_found then + for _, jpg in ipairs(jpg_indices) do + images[jpg] = nil + end + end + current_base = base + other_format_found = false + for k,_ in pairs(jpg_indices) do jpg_indices[k] = nil end + end + + -- remember what we have here to act accordingly after all instances of this base name were checked + if (extension == "JPG") or (extension == "JPEG") then + table.insert(jpg_indices, i) + else + other_format_found = true + end + + end +end) + +-- vim: shiftwidth=2 expandtab tabstop=2 cindent +-- kate: tab-indents: off; indent-width 2; replace-tabs on; remove-trailing-space on;