1 Commits

Author SHA1 Message Date
Bill Ferguson
8318569cdf contrib/rate_group - fix tooltip formation error 2024-09-03 19:06:07 -04:00
83 changed files with 716 additions and 2807 deletions

137
README.md
View File

@@ -15,17 +15,17 @@ These scripts are written primarily by the darktable developers and maintained b
Name|Standalone|OS |Purpose Name|Standalone|OS |Purpose
----|:--------:|:---:|------- ----|:--------:|:---:|-------
[check_for_updates](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/check_for_updates)|Yes|LMW|Check for updates to darktable [check_for_updates](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/check_for_updates)|Yes|LMW|Check for updates to darktable
[copy_paste_metadata](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/copy_paste_metadata)|Yes|LMW|Copy and paste metadata, tags, ratings, and color labels between images [copy_paste_metadata](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/copy_paste_metadata)|Yes|LMW|Copy and paste metadata, tags, ratings, and color labels between images
[delete_long_tags](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/delete_long_tags)|Yes|LMW|Delete all tags longer than a specified length [delete_long_tags](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/delete_long_tags)|Yes|LMW|Delete all tags longer than a specified length
[delete_unused_tags](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/delete_unused_tags)|Yes|LMW|Delete tags that have no associated images [delete_unused_tags](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/delete_unused_tags)|Yes|LMW|Delete tags that have no associated images
[enfuse](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/enfuse)|No|L|Exposure blend several images (HDR) [enfuse](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/enfuse)|No|L|Exposure blend several images (HDR)
[generate_image_txt](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/generate_image_txt)|No|L|Generate txt sidecar files to be overlaid on zoomed images [generate_image_txt](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/generate_image_txt)|No|L|Generate txt sidecar files to be overlaid on zoomed images
[image_path_in_ui](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/image_path_in_ui)|Yes|LMW|Plugin to display selected image path [image_path_in_ui](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/image_path_in_ui)|Yes|LMW|Plugin to display selected image path
[import_filter_manager](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/import_filter_manager)|Yes|LMW|Manager for import filters [import_filter_manager](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/import_filter_manager)|Yes|LMW|Manager for import filters
[import_filters](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/import_filters)|No|LMW|Two import filters for use with import_filter_manager [import_filters](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/import_filters)|No|LMW|Two import filters for use with import_filter_manager
[save_selection](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/save_selection)|Yes|LMW|Provide save and restore from multiple selection buffers [save_selection](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/save_selection)|Yes|LMW|Provide save and restore from multiple selection buffers
[selection_to_pdf](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/selection_to_pdf)|No|L|Generate a PDF file from the selected images [selection_to_pdf](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/official/selection_to_pdf)|No|L|Generate a PDF file from the selected images
### Contributed Scripts ### Contributed Scripts
@@ -34,51 +34,50 @@ These scripts are contributed by users. They are meant to have an "owner", i.e.
Name|Standalone|OS |Purpose Name|Standalone|OS |Purpose
----|:--------:|:---:|------- ----|:--------:|:---:|-------
[AutoGrouper](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/autogrouper)|Yes|LMW|Group images together by time [AutoGrouper](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/autogrouper)|Yes|LMW|Group images together by time
[autostyle](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/autostyle)|Yes|LMW|Automatically apply styles on import [autostyle](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/autostyle)|Yes|LMW|Automatically apply styles on import
[auto_tag_modified](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/auto_tag_modified)|Yes|LMW|Automatically tag images which have been manually modified in the darkroom
change_group_leader|Yes|LMW|Change which image leads group change_group_leader|Yes|LMW|Change which image leads group
[clear_GPS](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/clear_gps)|Yes|LMW|Reset GPS information for selected images [clear_GPS](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/clear_gps)|Yes|LMW|Reset GPS information for selected images
[CollectHelper](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/collecthelper)|Yes|LMW|Add buttons to selected images module to manipulate the collection [CollectHelper](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/collecthelper)|Yes|LMW|Add buttons to selected images module to manipulate the collection
color_profile_manager|Yes|LMW|Manage darktable input and output color profiles color_profile_manager|Yes|LMW|Manage darktable input and output color profiles
[copy_attach_detach_tags](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/copy_attach_detach_tags)|Yes|LMW|Copy and paste tags from/to images [copy_attach_detach_tags](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/copy_attach_detach_tags)|Yes|LMW|Copy and paste tags from/to images
[cr2hdr](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/cr2hdr)|Yes|L|Process image created with Magic Lantern Dual ISO [cr2hdr](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/cr2hdr)|Yes|L|Process image created with Magic Lantern Dual ISO
cycle_group_leader|Yes|LMW|cycle through images of a group making each the group leader in turn cycle_group_leader|Yes|LMW|cycle through images of a group making each the group leader in turn
dbmaint|Yes|LMW|find and remove database entries for missing film rolls and images dbmaint|Yes|LMW|find and remove database entries for missing film rolls and images
[enfuseAdvanced](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/enfuseadvanced)|No|LMW|Merge multiple images into Dynamic Range Increase (DRI) or Depth From Focus (DFF) images [enfuseAdvanced](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/enfuseadvanced)|No|LMW|Merge multiple images into Dynamic Range Increase (DRI) or Depth From Focus (DFF) images
[exportLUT](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/exportlut)|Yes|LMW|Create a LUT from a style and export it [exportLUT](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/exportlut)|Yes|LMW|Create a LUT from a style and export it
[ext_editor](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/ext_editor)|No|LW|Export pictures to collection and edit them with up to nine user-defined external editors [ext_editor](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/ext_editor)|No|LW|Export pictures to collection and edit them with up to nine user-defined external editors
[face_recognition](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/face_recognition)|No|LM|Identify and tag images using facial recognition [face_recognition](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/face_recognition)|No|LM|Identify and tag images using facial recognition
[fujifilm_dynamic_range](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/fujifilm_dynamic_range)|No|LMW|Correct fujifilm exposure based on exposure bias camera setting [fujifilm_dynamic_range](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/fujifilm_dynamic_range)|No|LMW|Correct fujifilm exposure based on exposure bias camera setting
[fujifilm_ratings](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/fujifilm_ratings)|No|LM|Support importing Fujifilm ratings [fujifilm_ratings](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/fujifilm_ratings)|No|LM|Support importing Fujifilm ratings
[geoJSON_export](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/geojson_export)|No|L|Create a geo JSON script with thumbnails for use in ... [geoJSON_export](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/geojson_export)|No|L|Create a geo JSON script with thumbnails for use in ...
[geoToolbox](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/geotoolbox)|No|LMW|A toolbox of geo functions [geoToolbox](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/geotoolbox)|No|LMW|A toolbox of geo functions
[gimp](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/gimp)|No|LMW|Open an image in GIMP for editing and return the result [gimp](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/gimp)|No|LMW|Open an image in GIMP for editing and return the result
[gpx_export](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/gpx_export)|No|LMW|Export a GPX track file from selected images GPS data [gpx_export](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/gpx_export)|No|LMW|Export a GPX track file from selected images GPS data
harmonic_armature|Yes|LMW|provide a harmonic armature guide harmonic_armature|Yes|LMW|provide a harmonic armature guide
hif_group_leader|Yes|LMW|change the group leader in a raw+heif image pair to the heif image hif_group_leader|Yes|LMW|change the group leader in a raw+heif image pair to the heif image
[HDRMerge](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/hdrmerge)|No|LMW|Combine the selected images into an HDR DNG and return the result [HDRMerge](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/hdrmerge)|No|LMW|Combine the selected images into an HDR DNG and return the result
[hugin](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/hugin)|No|LMW|Combine selected images into a panorama and return the result [hugin](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/hugin)|No|LMW|Combine selected images into a panorama and return the result
[image_stack](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/image_stack)|No|LMW|Combine a stack of images to remove noise or transient objects [image_stack](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/image_stack)|No|LMW|Combine a stack of images to remove noise or transient objects
[image_time](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/image_time)|Yes|LMW|Adjust the EXIF image time [image_time](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/image_time)|Yes|LMW|Adjust the EXIF image time
jpg_group_leader|Yes|LMW|change the group leader for a raw+jpg pair to the jpg image jpg_group_leader|Yes|LMW|change the group leader for a raw+jpg pair to the jpg image
[kml_export](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/kml_export)|No|L|Export photos with a KML file for usage in Google Earth [kml_export](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/kml_export)|No|L|Export photos with a KML file for usage in Google Earth
[LabelsToTags](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/labelstotags)|Yes|LMW|Apply tags based on color labels and ratings [LabelsToTags](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/labelstotags)|Yes|LMW|Apply tags based on color labels and ratings
[OpenInExplorer](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/openinexplorer)|No|LMW|Open the selected images in the system file manager [OpenInExplorer](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/openinexplorer)|No|LMW|Open the selected images in the system file manager
[passport_guide](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/passport_guide)|Yes|LMW|Add passport cropping guide to darkroom crop tool [passport_guide](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/passport_guide)|Yes|LMW|Add passport cropping guide to darkroom crop tool
passport_guide_germany|Yes|LMW|Add passport cropping guide for German passports to darkroom crop tool passport_guide_germany|Yes|LMW|Add passport cropping guide for German passports to darkroom crop tool
[pdf_slideshow](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/pdf_slideshow)|No|LM|Export images to a PDF slideshow [pdf_slideshow](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/pdf_slideshow)|No|LM|Export images to a PDF slideshow
[photils](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/photils)|No|LM|Automatic tag suggestions for your images [photils](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/photils)|No|LM|Automatic tag suggestions for your images
[quicktag](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/quicktag)|Yes|LMW|Create shortcuts for quickly applying tags [quicktag](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/quicktag)|Yes|LMW|Create shortcuts for quickly applying tags
[rate_group](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rate_group)|Yes|LMW|Apply or remove a star rating from grouped images [rate_group](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/rate_group)|Yes|LMW|Apply or remove a star rating from grouped images
[rename_images](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rename_images)|Yes|LMW|Rename single or multiple images [rename_images](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/rename_images)|Yes|LMW|Rename single or multiple images
[rename-tags](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rename-tags)|Yes|LMW|Change a tag name [rename-tags](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/rename-tags)|Yes|LMW|Change a tag name
[RL_out_sharp](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rl_out_sharp)|No|LW|Output sharpening using GMic (Richardson-Lucy algorithm) [RL_out_sharp](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/rl_out_sharp)|No|LW|Output sharpening using GMic (Richardson-Lucy algorithm)
[select_non_existing](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/select_non_existing)|Yes|LMW|Enable selection of non-existing images in the the currently worked on images [select_non_existing](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/select_non_existing)|Yes|LMW|Enable selection of non-existing images in the the currently worked on images
[select_untagged](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/select_untagged)|Yes|LMW|Enable selection of untagged images [select_untagged](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/select_untagged)|Yes|LMW|Enable selection of untagged images
[slideshowMusic](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/slideshowMusic)|No|L|Play music during a slideshow [slideshowMusic](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/slideshowMusic)|No|L|Play music during a slideshow
[transfer_hierarchy](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/transfer_hierarchy)|Yes|LMW|Image move/copy preserving directory hierarchy [transfer_hierarchy](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/transfer_hierarchy)|Yes|LMW|Image move/copy preserving directory hierarchy
[video_ffmpeg](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/video_ffmpeg)|No|LMW|Export video from darktable [video_ffmpeg](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/contrib/video_ffmpeg)|No|LMW|Export video from darktable
### Example Scripts ### Example Scripts
@@ -86,18 +85,18 @@ These scripts provide examples of how to use specific portions of the API. They
Name|Standalone|OS |Purpose Name|Standalone|OS |Purpose
----|:--------:|:---:|------- ----|:--------:|:---:|-------
[api_version](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/api_version)|Yes|LMW|Print the current API version [api_version](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/api_version)|Yes|LMW|Print the current API version
[darkroom_demo](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/darkroom_demo)|Yes|LMW|Demonstrate changing images in darkoom [darkroom_demo](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/darkroom_demo)|Yes|LMW|Demonstrate changing images in darkoom
[gettextExample](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/gettextexample)|Yes|LM|How to use translation [gettextExample](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/gettextexample)|Yes|LM|How to use translation
gui_actions|Yes|LMW|demonstrate controlling the GUI using darktable.gui.action calls gui_actions|Yes|LMW|demonstrate controlling the GUI using darktable.gui.action calls
[hello_world](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/hello_world)|Yes|LMW|Prints hello world when darktable starts [hello_world](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/hello_world)|Yes|LMW|Prints hello world when darktable starts
[lighttable_demo](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/lighttable_demo)|Yes|LMW|Demonstrate controlling lighttable mode, zoom, sorting and filtering [lighttable_demo](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/lighttable_demo)|Yes|LMW|Demonstrate controlling lighttable mode, zoom, sorting and filtering
[moduleExample](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/moduleexample)|Yes|LMW|How to create a lighttable module [moduleExample](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/moduleexample)|Yes|LMW|How to create a lighttable module
[multi_os](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/multi_os)|No|LMW|How to create a cross platform script that calls an external executable [multi_os](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/multi_os)|No|LMW|How to create a cross platform script that calls an external executable
[panels_demo](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/panels_demo)|Yes|LMW|Demonstrate hiding and showing darktable panels [panels_demo](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/panels_demo)|Yes|LMW|Demonstrate hiding and showing darktable panels
[preferenceExamples](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/preferenceexamples)|Yes|LMW|How to use preferences in a script [preferenceExamples](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/preferenceexamples)|Yes|LMW|How to use preferences in a script
[printExamples](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/printexamples)|Yes|LMW|How to use various print functions from a script [printExamples](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/printexamples)|Yes|LMW|How to use various print functions from a script
[running_os](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/running_os)|Yes|LMW|Print out the running operating system [running_os](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/examples/running_os)|Yes|LMW|Print out the running operating system
x-touch|Yes|LMW|demonstrate how to use an x-touch mini MIDI controller to control the darktable GUI x-touch|Yes|LMW|demonstrate how to use an x-touch mini MIDI controller to control the darktable GUI
### Tools ### Tools
@@ -106,11 +105,11 @@ Tool scripts perform functions relating to the repository, such as generating do
Name|Standalone|OS |Purpose Name|Standalone|OS |Purpose
----|:--------:|:---:|------- ----|:--------:|:---:|-------
[executable_manager](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/executable_manager)|Yes|LMW|Manage the external executables used by the lua scripts [executable_manager](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/tools/executable_manager)|Yes|LMW|Manage the external executables used by the lua scripts
[gen_i18n_mo](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/gen_i18n_mo)|No|LMW|Generate compiled translation files (.mo) from source files (.po) [gen_i18n_mo](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/tools/gen_i18n_mo)|No|LMW|Generate compiled translation files (.mo) from source files (.po)
[get_lib_manpages](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/get_lib_manpages)|No|LM|Retrieve the library documentation and output it in man page and PDF format [get_lib_manpages](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/tools/get_lib_manpages)|No|LM|Retrieve the library documentation and output it in man page and PDF format
[get_libdoc](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/get_libdoc)|No|LMW|Retrieve the library documentation and output it as text [get_libdoc](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/tools/get_libdoc)|No|LMW|Retrieve the library documentation and output it as text
[script_manager](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/script_manager)|No|LMW|Manage (install, update, enable, disable) the lua scripts [script_manager](https://darktable-org.github.io/luadocs/lua.scripts.manual/scripts/tools/script_manager)|No|LMW|Manage (install, update, enable, disable) the lua scripts
### Related third-party projects ### Related third-party projects
@@ -179,7 +178,7 @@ If you don't have %LOCALAPPDATA%\darktable you have to start dartable at least o
When darktable starts it looks for a file name `~/.config/darktable/luarc` (`%LOCALAPPDATA%\darktable\luarc` for windows) and reads it to see which scripts to include. The file is a plain text file with entries of the form `require "<directory>/<name>"` where directory is the directory containing the scripts, from the above list, and name is the name from the above list. To include GIMP the line would be `require "contrib/gimp"`. When darktable starts it looks for a file name `~/.config/darktable/luarc` (`%LOCALAPPDATA%\darktable\luarc` for windows) and reads it to see which scripts to include. The file is a plain text file with entries of the form `require "<directory>/<name>"` where directory is the directory containing the scripts, from the above list, and name is the name from the above list. To include GIMP the line would be `require "contrib/gimp"`.
The recommended way to enable and disable specific scripts is using the [script manager](https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/script_manager/) module. To use script manager do the following: The recommended way to enable and disable specific scripts is using the script manager module. To use script manager do the following:
### Linux or MacOS ### Linux or MacOS
@@ -238,18 +237,18 @@ To update the script repository, open a terminal or command prompt and do the fo
## Documentation ## Documentation
The [Lua Scripts Manual](https://docs.darktable.org/lua/stable/lua.scripts.manual/) provides documentation The [Lua Scripts Manual](https://darktable-org.github.io/luadocs/lua.scripts.manual/) provides documentation
for the scripts transcribed from the header comments. Each script also contains comments and usage instructions for the scripts transcribed from the header comments. Each script also contains comments and usage instructions
in the header comments. in the header comments.
The [Lua Scripts Library API Manual](https://docs.darktable.org/lua/stable/lua.scripts.api.manual/) provides The [Lua Scripts Library API Manual](https://darktable-org.github.io/luadocs/lua.scripts.api.manual/) provides
documentation of the libraries and functions. Lua-script libraries documentation may also be generated using documentation of the libraries and functions. Lua-script libraries documentation may also be generated using
the tools in the tools/ directory. the tools in the tools/ directory.
More information about the scripting with Lua can be found in the darktable user manual: More information about the scripting with Lua can be found in the darktable user manual:
[Scripting with Lua](https://darktable.org.github.io/dtdocs/lua/) [Scripting with Lua](https://darktable-org.github.io/dtdocs/lua/)
The [Lua API Manual](https://docs.darktable.org/lua/stable/lua.api.manual/) provides docuemntation of the The [Lua API Manual](https://darktable-org.github.io/luadocs/lua.api.manual/) provides docuemntation of the
darktable Lua API. darktable Lua API.
## Troubleshooting ## Troubleshooting

View File

@@ -43,10 +43,11 @@ du.check_min_api_version("7.0.0", "AutoGrouper")
local MOD = 'autogrouper' local MOD = 'autogrouper'
local gettext = dt.gettext.gettext local gettext = dt.gettext
gettext.bindtextdomain(MOD, dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext.gettext(msgid)
end end
-- return data structure for script_manager -- return data structure for script_manager
@@ -54,7 +55,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("auto group"), name = "AutoGrouper",
purpose = _("automatically group images by time interval"), purpose = _("automatically group images by time interval"),
author = "Kevin Ertel", author = "Kevin Ertel",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/AutoGrouper/" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/AutoGrouper/"
@@ -132,11 +133,10 @@ local function main(on_collection)
for i, image in ipairs(images) do for i, image in ipairs(images) do
if i == 1 then if i == 1 then
prev_image = image prev_image = image
image:make_group_leader()
elseif string.match(image.exif_datetime_taken, '[%d]') ~= nil then --make sure current image has a timestamp, if so check if it is within the user specified gap value and add to group elseif string.match(image.exif_datetime_taken, '[%d]') ~= nil then --make sure current image has a timestamp, if so check if it is within the user specified gap value and add to group
local curr_image = image local curr_image = image
if GetTimeDiff(curr_image, prev_image) <= GUI.gap.value then if GetTimeDiff(curr_image, prev_image) <= GUI.gap.value then
images[i]:group_with(images[i-1].group_leader) images[i]:group_with(images[i-1])
end end
prev_image = curr_image prev_image = curr_image
end end

View File

@@ -53,6 +53,8 @@ local all_active = false
du.check_min_api_version("7.0.0", "CollectHelper") du.check_min_api_version("7.0.0", "CollectHelper")
dt.gettext.bindtextdomain("CollectHelper", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -62,7 +64,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("collection helper"), name = "CollectHelper",
purpose = _("add collection helper buttons"), purpose = _("add collection helper buttons"),
author = "Kevin Ertel", author = "Kevin Ertel",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/CollectHelper/" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/CollectHelper/"
@@ -237,7 +239,7 @@ end
dt.preferences.register("module_CollectHelper", "all_and", -- name dt.preferences.register("module_CollectHelper", "all_and", -- name
"bool", -- type "bool", -- type
_('CollectHelper: all'), -- label _('CollectHelper: all'), -- label
_('creates a collect parameter set that utilizes all enabled CollectHelper types (and)'), -- tooltip _('will create a collect parameter set that utilizes all enabled CollectHelper types (and)'), -- tooltip
true -- default true -- default
) )
dt.preferences.register("module_CollectHelper", "colors", -- name dt.preferences.register("module_CollectHelper", "colors", -- name

View File

@@ -54,6 +54,8 @@ du.check_min_api_version("7.0.0", "HDRmerge")
-- Tell gettext where to find the .mo file translating messages for a particular domain -- Tell gettext where to find the .mo file translating messages for a particular domain
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("HDRMerge", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -63,7 +65,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("HDR merge"), name = "HDRmerge",
purpose = _("merge bracketed images into an HDR DNG image"), purpose = _("merge bracketed images into an HDR DNG image"),
author = "Kevin Ertel", author = "Kevin Ertel",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/HDRmerge" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/HDRmerge"
@@ -216,7 +218,7 @@ local function main()
PreCall({HDRM}) --check if furst run then check if install OK PreCall({HDRM}) --check if furst run then check if install OK
if HDRM.install_error then if HDRM.install_error then
dt.print_error('HDRMerge install issue') dt.print_error('HDRMerge install issue')
dt.print(_('HDRMerge install issue, please ensure the binary path is correct')) dt.print(_('HDRMerge install issue, please ensure the binary path is proper'))
return return
end end
images = dt.gui.selection() --get selected images images = dt.gui.selection() --get selected images
@@ -414,14 +416,14 @@ GUI.Target.copy_tags = dt.new_widget('check_button'){
temp = dt.preferences.read(mod, 'active_add_tags', 'string') temp = dt.preferences.read(mod, 'active_add_tags', 'string')
if temp == '' then temp = nil end if temp == '' then temp = nil end
GUI.Target.add_tags = dt.new_widget('entry'){ GUI.Target.add_tags = dt.new_widget('entry'){
tooltip = _('additional tags to be added on import, separate with commas, all spaces will be removed'), tooltip = _('additional tags to be added on import, seperate with commas, all spaces will be removed'),
text = temp, text = temp,
placeholder = _('enter tags, separated by commas'), placeholder = _('enter tags, seperated by commas'),
editable = true editable = true
} }
GUI.run = dt.new_widget('button'){ GUI.run = dt.new_widget('button'){
label = _('merge'), label = _('merge'),
tooltip =_('run HDRMerge with the above settings'), tooltip =_('run HDRMerge with the above specified settings'),
clicked_callback = function() main() end clicked_callback = function() main() end
} }
GUI.exes.HDRMerge = dt.new_widget('file_chooser_button'){ GUI.exes.HDRMerge = dt.new_widget('file_chooser_button'){

View File

@@ -54,6 +54,8 @@ du.check_min_api_version("7.0.0", "LabelsToTags")
local gettext = darktable.gettext.gettext local gettext = darktable.gettext.gettext
darktable.gettext.bindtextdomain("LabelsToTags", darktable.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -63,7 +65,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("labels to tags"), name = "LabelsToTags",
purpose = _("allows the mass-application of tags using color labels and ratings as a guide"), purpose = _("allows the mass-application of tags using color labels and ratings as a guide"),
author = "August Schwerdfeger (august@schwerdfeger.name)", author = "August Schwerdfeger (august@schwerdfeger.name)",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/LabelsToTags" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/LabelsToTags"
@@ -214,8 +216,8 @@ ltt.my_widget = darktable.new_widget("box") {
orientation = "vertical", orientation = "vertical",
mappingComboBox, mappingComboBox,
darktable.new_widget("button") { darktable.new_widget("button") {
label = _("start"), label = "start",
tooltip = _("tag all selected images"), tooltip = "Tag all selected images",
clicked_callback = doTagging clicked_callback = doTagging
} }
} }
@@ -245,7 +247,7 @@ end
local function install_module() local function install_module()
if not ltt.module_installed then if not ltt.module_installed then
darktable.register_lib(LIB_ID,_("labels to tags"),true,true,{ darktable.register_lib(LIB_ID,"labels to tags",true,true,{
[darktable.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER",20}, [darktable.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER",20},
},ltt.my_widget,nil,nil) },ltt.my_widget,nil,nil)
ltt.module_installed = true ltt.module_installed = true

View File

@@ -56,6 +56,8 @@ local gettext = dt.gettext.gettext
--Check API version --Check API version
du.check_min_api_version("7.0.0", "OpenInExplorer") du.check_min_api_version("7.0.0", "OpenInExplorer")
dt.gettext.bindtextdomain("OpenInExplorer", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -65,7 +67,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("open in explorer"), name = "OpenInExplorer",
purpose = _("open a selected file in the system file manager"), purpose = _("open a selected file in the system file manager"),
author = "Kevin Ertel", author = "Kevin Ertel",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/OpenInExplorer" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/OpenInExplorer"

View File

@@ -68,6 +68,8 @@ du.check_min_api_version("7.0.0", MODULE_NAME)
-- translation -- translation
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("RL_out_sharp", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -77,7 +79,7 @@ local function _(msgid)
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("RL output sharpening"), name = "RL_out_sharp",
purpose = _("Richardson-Lucy output sharpening using GMic"), purpose = _("Richardson-Lucy output sharpening using GMic"),
author = "Marco Carrarini <marco.carrarini@gmail.com>", author = "Marco Carrarini <marco.carrarini@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/RL_out_sharp" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/RL_out_sharp"
@@ -106,7 +108,7 @@ local function preserve_metadata(original, sharpened)
if exiftool then if exiftool then
dtsys.external_command("exiftool -overwrite_original_in_place -tagsFromFile " .. original .. " " .. sharpened) dtsys.external_command("exiftool -overwrite_original_in_place -tagsFromFile " .. original .. " " .. sharpened)
else else
dt.print_log(MODULE_NAME .. " exiftool not found, metadata not preserved") dt.print_log(MODULE .. " exiftool not found, metadata not preserved")
end end
end end

View File

@@ -59,8 +59,10 @@ du.check_min_api_version("7.0.0", MODULE) -- choose the minimum version that c
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain(MODULE , dt.configuration.config_dir .. "/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(MODULE, msgid)
end end
@@ -76,10 +78,10 @@ script_data.restart = nil -- how to restart the (lib) script after it'
script_data.show = nil -- only required for libs since the destroy_method only hides them script_data.show = nil -- only required for libs since the destroy_method only hides them
script_data.metadata = { script_data.metadata = {
name = _("auto snapshot"), -- name of script name = "auto_snapshot", -- name of script
purpose = _("automatically take a snapshot when an image is loaded in darkroom"), -- purpose of script purpose = _("automatically take a snapshot when an image is loaded in darkroom"), -- purpose of script
author = "Bill Ferguson <wpferguson@gamil.com>", -- your name and optionally e-mail address author = "Bill Ferguson <wpferguson@gamil.com>", -- your name and optionally e-mail address
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/auto_snapshot/" -- URL to help/documentation help = "" -- URL to help/documentation
} }
@@ -99,8 +101,8 @@ local auto_snapshot = {}
-- P R E F E R E N C E S -- P R E F E R E N C E S
-- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - -
dt.preferences.register(MODULE, "always_create_snapshot", "bool", "auto_snapshot - " .. _("always automatically create_snapshot"), dt.preferences.register(MODULE, "always_create_snapshot", "bool", "always automatically create_snapshot",
_("create a snapshot even if the image is altered"), false) "auto_snapshot - create a snapshot even if the image is altered", false)
-- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - -
-- D A R K T A B L E I N T E G R A T I O N -- D A R K T A B L E I N T E G R A T I O N

View File

@@ -1,129 +0,0 @@
--[[
auto_tag_modified.lua - automatically tag an image when it has been manually modified in darkroom
Copyright (C) 2025 Michael Reiger <michael@rauschpfeife.net>, modeled after auto_snapshot.lua by Bill Ferguson <wpferguson@gamil.com>.
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 <http://www.gnu.org/licenses/>.
]]
--[[
auto_tag_modified -
automatically tag an image when it has been manually modified in the darkroom, that is if its history has changed at the time it is closed from the darkroom.
(This will not catch applying styles from the light table though.)
ADDITIONAL SOFTWARE NEEDED FOR THIS SCRIPT
None
USAGE
* start the script from script_manager
* open an image in darkroom, and close it after making an operation that changes the history
BUGS, COMMENTS, SUGGESTIONS
Michael Reiger <michael@rauschpfeife.net>
CHANGES
]]
local dt = require "darktable"
local du = require "lib/dtutils"
local log = require "lib/dtutils.log"
-- - - - - - - - - - - - - - - - - - - - - - - -
-- C O N S T A N T S
-- - - - - - - - - - - - - - - - - - - - - - - -
local MODULE <const> = "auto_tag_modified"
local DEFAULT_TAG_NAME <const> = "darktable manually modified"
local DEFAULT_LOG_LEVEL <const> = log.error
-- - - - - - - - - - - - - - - - - - - - - - - -
-- A P I C H E C K
-- - - - - - - - - - - - - - - - - - - - - - - -
du.check_min_api_version("7.0.0", MODULE) -- choose the minimum version that contains the features you need
-- - - - - - - - - - - - - - - - - - - - - - - - - -
-- I 1 8 N
-- - - - - - - - - - - - - - - - - - - - - - - - - -
local gettext = dt.gettext.gettext
local function _(msgid)
return gettext(msgid)
end
-- - - - - - - - - - - - - - - - - - - - - - - - - -
-- 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
script_data.metadata = {
name = _("auto tag modified"), -- name of script
purpose = _("automatically tag an image when it has been manually modified in darkroom"), -- purpose of script
author = "Michael Reiger <michael@rauschpfeife.net>", -- your name and optionally e-mail address
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/auto_tag_modified/" -- URL to help/documentation
}
-- - - - - - - - - - - - - - - - - - - - - - - -
-- L O G L E V E L
-- - - - - - - - - - - - - - - - - - - - - - - -
log.log_level(DEFAULT_LOG_LEVEL)
-- - - - - - - - - - - - - - - - - - - - - - - -
-- N A M E S P A C E
-- - - - - - - - - - - - - - - - - - - - - - - -
local auto_tag_modified = {}
-- - - - - - - - - - - - - - - - - - - - - - - -
-- P R E F E R E N C E S
-- - - - - - - - - - - - - - - - - - - - - - - -
dt.preferences.register(MODULE, "auto_modified_tag_name", "string", "auto_tag_modified - " .. _("tag name to use for auto tagging modified images"),
_("tag name to use for auto tagging modified images"), DEFAULT_TAG_NAME)
-- - - - - - - - - - - - - - - - - - - - - - - -
-- D A R K T A B L E I N T E G R A T I O N
-- - - - - - - - - - - - - - - - - - - - - - - -
local function destroy()
dt.destroy_event(MODULE, "darkroom-image-history-changed")
end
script_data.destroy = destroy
-- - - - - - - - - - - - - - - - - - - - - - - -
-- E V E N T S
-- - - - - - - - - - - - - - - - - - - - - - - -
dt.register_event(MODULE, "darkroom-image-history-changed",
function(event, image)
local tag_name = dt.preferences.read(MODULE, "auto_modified_tag_name", "string")
local tag = dt.tags.create(tag_name)
dt.tags.attach(tag, image)
end
)
return script_data

View File

@@ -44,6 +44,7 @@ local syslib = require "lib/dtutils.system"
du.check_min_api_version("7.0.0", "autostyle") du.check_min_api_version("7.0.0", "autostyle")
local gettext = darktable.gettext.gettext local gettext = darktable.gettext.gettext
darktable.gettext.bindtextdomain("autostyle", darktable.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
@@ -53,10 +54,8 @@ end
local script_data = {} local script_data = {}
local have_not_printed_config_message = true
script_data.metadata = { script_data.metadata = {
name = _("auto style"), name = "autostyle",
purpose = _("automatically apply a style based on image EXIF tag"), purpose = _("automatically apply a style based on image EXIF tag"),
author = "Marc Cousin <cousinmarc@gmail.com>", author = "Marc Cousin <cousinmarc@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/autostyle/" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/autostyle/"
@@ -103,62 +102,56 @@ end
local function autostyle_apply_one_image (image) local function autostyle_apply_one_image (image)
local pref = darktable.preferences.read("autostyle", "exif_tag", "string") local pref = darktable.preferences.read("autostyle", "exif_tag", "string")
if pref and string.len(pref) >= 6 then
-- We need the tag, the value and the style_name provided from the configuration string -- We need the tag, the value and the style_name provided from the configuration string
local tag, value, style_name = string.match(pref, "(%g+)%s*=%s*([%g ]-)%s*=>%s*(%g+)") local tag, value, style_name = string.match(pref, "(%g+)%s*=%s*(%g+)%s*=>%s*(%g+)")
-- check they all exist (correct syntax) -- check they all exist (correct syntax)
if (not tag) then if (not tag) then
darktable.print(string.format(_("EXIF tag not found in %s"), pref)) darktable.print(string.format(_("EXIF tag not found in %s"), pref))
return 0 return 0
end end
if (not value) then if (not value) then
darktable.print(string.format(_("value to match not found in %s"), pref)) darktable.print(string.format(_("value to match not found in %s"), pref))
return 0 return 0
end end
if (not style_name) then if (not style_name) then
darktable.print(string.format(_("style name not found in %s"), pref)) darktable.print(string.format(_("style name not found in %s"), pref))
return 0 return 0
end end
if not filelib.check_if_bin_exists("exiftool") then if not filelib.check_if_bin_exists("exiftool") then
darktable.print(_("can't find exiftool")) darktable.print(_("can't find exiftool"))
return 0 return 0
end end
-- First find the style (we have its name) -- First find the style (we have its name)
local styles = darktable.styles local styles = darktable.styles
local style local style
for _, s in ipairs(styles) do for _, s in ipairs(styles) do
if s.name == style_name then if s.name == style_name then
style = s style = s
end end
end end
if (not style) then if (not style) then
darktable.print(string.format(_("style not found for autostyle: %s"), style_name)) darktable.print(string.format(_("style not found for autostyle: %s"), style_name))
return 0 return 0
end end
-- Apply the style to image, if it is tagged -- Apply the style to image, if it is tagged
local ok, auto_dr_attr = pcall(exiftool_attribute, image.path .. '/' .. image.filename,tag) local ok, auto_dr_attr = pcall(exiftool_attribute, image.path .. '/' .. image.filename,tag)
--darktable.print_error("dr_attr:" .. auto_dr_attr) --darktable.print_error("dr_attr:" .. auto_dr_attr)
-- If the lookup fails, stop here -- If the lookup fails, stop here
if (not ok) then if (not ok) then
darktable.print(string.format(_("couldn't get attribute %s from exiftool's output"), auto_dr_attr)) darktable.print(string.format(_("couldn't get attribute %s from exiftool's output"), auto_dr_attr))
return 0 return 0
end end
if auto_dr_attr == value then if auto_dr_attr == value then
darktable.print_log("Image " .. image.filename .. ": autostyle automatically applied " .. pref) darktable.print_log("Image " .. image.filename .. ": autostyle automatically applied " .. pref)
darktable.styles.apply(style,image) darktable.styles.apply(style,image)
return 1 return 1
else else
darktable.print_log("Image " .. image.filename .. ": autostyle not applied, exif tag " .. pref .. " not matched: " .. auto_dr_attr) darktable.print_log("Image " .. image.filename .. ": autostyle not applied, exif tag " .. pref .. " not matched: " .. auto_dr_attr)
return 0 return 0
end
elseif have_not_printed_config_message then
have_not_printed_config_message = false
darktable.print(string.format(_("%s is not configured, please configure the preference in Lua options"), script_data.metadata.name))
end end
end end
@@ -188,9 +181,7 @@ end
darktable.register_event("autostyle", "shortcut", autostyle_apply, darktable.register_event("autostyle", "shortcut", autostyle_apply,
_("apply your chosen style from exiftool tags")) _("apply your chosen style from exiftool tags"))
darktable.preferences.register("autostyle", "exif_tag", "string", darktable.preferences.register("autostyle", "exif_tag", "string", "Autostyle: EXIF_tag=value=>style", _("apply a style automatically if an EXIF tag matches value, find the tag with exiftool"), "")
string.format("%s: EXIF_tag=value=>style", script_data.metadata.name),
_("apply a style automatically if an EXIF tag matches value, find the tag with exiftool"), "")
darktable.register_event("autostyle", "post-import-image", darktable.register_event("autostyle", "post-import-image",
autostyle_apply_one_image_event) autostyle_apply_one_image_event)

View File

@@ -40,6 +40,8 @@ local gettext = dt.gettext.gettext
local MODULE = "change_group_leader" local MODULE = "change_group_leader"
dt.gettext.bindtextdomain(MODULE, dt.configuration.config_dir .."/lua/locale/")
du.check_min_api_version("3.0.0", MODULE) du.check_min_api_version("3.0.0", MODULE)
local function _(msgid) local function _(msgid)
@@ -51,7 +53,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("change group leader"), name = "change_group_leader",
purpose = _("automatically change the leader of raw+jpg paired image groups"), purpose = _("automatically change the leader of raw+jpg paired image groups"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/change_group_leader" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/change_group_leader"
@@ -63,7 +65,7 @@ script_data.restart = nil -- how to restart the (lib) script after it's been hid
script_data.show = nil -- only required for libs since the destroy_method only hides them script_data.show = nil -- only required for libs since the destroy_method only hides them
-- create a namespace to contain persistent data and widgets -- create a namespace to contain persistent data and widgets
local chg_grp_ldr = {} chg_grp_ldr = {}
local cgl = chg_grp_ldr local cgl = chg_grp_ldr
@@ -80,7 +82,7 @@ local function install_module()
if not cgl.module_installed then if not cgl.module_installed then
dt.register_lib( dt.register_lib(
MODULE, -- Module name MODULE, -- Module name
_("change group leader"), -- Visible name _("change_group_leader"), -- Visible name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 700}}, -- containers {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 700}}, -- containers

View File

@@ -40,6 +40,7 @@ local dt = require "darktable"
local du = require "lib/dtutils" local du = require "lib/dtutils"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("clear_GPS", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
@@ -50,7 +51,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("clear GPS info"), name = "clear_GPS",
purpose = _("remove GPS data from selected image(s)"), purpose = _("remove GPS data from selected image(s)"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/clear_gps/" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/clear_gps/"
@@ -91,7 +92,7 @@ dt.gui.libs.image.register_action(
dt.register_event( dt.register_event(
"clear_GPS", "shortcut", "clear_GPS", "shortcut",
function(event, shortcut) clear_GPS(dt.gui.action_images) end, function(event, shortcut) clear_GPS(dt.gui.action_images) end,
_("clear GPS data from selected images") _("clear GPS data")
) )
return script_data return script_data

View File

@@ -55,6 +55,8 @@ du.check_min_api_version("7.0.0", "color_profile_manager")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("color_profile_manager", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -363,7 +365,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("color profile manager"), name = "color_profile_manager",
purpose = _("manage external darktable color profiles"), purpose = _("manage external darktable color profiles"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/color_profile_manager" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/color_profile_manager"

View File

@@ -44,6 +44,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "copy_attach_detach_tags") du.check_min_api_version("7.0.0", "copy_attach_detach_tags")
dt.gettext.bindtextdomain("copy_attach_detach_tags", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -53,7 +55,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("copy attach detach tags"), name = "copy_attach_detach_tags",
purpose = _("shortcuts to copy, paste, replace, or remove tags from images"), purpose = _("shortcuts to copy, paste, replace, or remove tags from images"),
author = "Christian Kanzian", author = "Christian Kanzian",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/copy_attach_detach_tags" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/copy_attach_detach_tags"

View File

@@ -39,6 +39,8 @@ du.check_min_api_version("7.0.0", "cr2hdr")
local gettext = darktable.gettext.gettext local gettext = darktable.gettext.gettext
darktable.gettext.bindtextdomain("cr2hdr", darktable.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -48,7 +50,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("cr2hdr"), name = "cr2hdr",
purpose = _("process Magic Lantern dual ISO images"), purpose = _("process Magic Lantern dual ISO images"),
author = "Till Theato <theato@ttill.de>", author = "Till Theato <theato@ttill.de>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/cr2hdr" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/cr2hdr"

View File

@@ -60,6 +60,8 @@ du.check_min_api_version("7.0.0", MODULE)
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("cycle_group_leader", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -71,7 +73,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("cycle group leader"), name = "cycle_group_leader",
purpose = _("change image group leader"), purpose = _("change image group leader"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/cycle_group_leader" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/cycle_group_leader"
@@ -104,7 +106,7 @@ end
local function cycle_group_leader(image) local function cycle_group_leader(image)
local group_images = image:get_group_members() local group_images = image:get_group_members()
if #group_images < 2 then if #group_images < 2 then
hinter_msg(_("no images to cycle through in group")) hinter_msg(_("no images to cycle to in group"))
return return
else else
local position = nil local position = nil

View File

@@ -63,8 +63,10 @@ du.check_min_api_version("7.0.0", MODULE) -- choose the minimum version that c
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain(MODULE , dt.configuration.config_dir .. "/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(MODULE, msgid)
end end
@@ -80,7 +82,7 @@ script_data.restart = nil -- how to restart the (lib) script after it'
script_data.show = nil -- only required for libs since the destroy_method only hides them script_data.show = nil -- only required for libs since the destroy_method only hides them
script_data.metadata = { script_data.metadata = {
name = _("db maintenance"), name = "dbmaint",
purpose = _("perform database maintenance"), purpose = _("perform database maintenance"),
author = "Bill Ferguson <wpferguson@gamil.com>", author = "Bill Ferguson <wpferguson@gamil.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/dbmaint/" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/dbmaint/"
@@ -115,20 +117,6 @@ local namespace = dbmaint
-- F U N C T I O N S -- F U N C T I O N S
-- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - -
-------------------
-- helper functions
-------------------
local function set_log_level(level)
local old_log_level = log.log_level()
log.log_level(level)
return old_log_level
end
local function restore_log_level(level)
log.log_level(level)
end
local function scan_film_rolls() local function scan_film_rolls()
local missing_films = {} local missing_films = {}
@@ -142,21 +130,19 @@ local function scan_film_rolls()
end end
local function scan_images(film) local function scan_images(film)
local old_log_level = set_log_level(DEFAULT_LOG_LEVEL)
local missing_images = {} local missing_images = {}
if film then if film then
for i = 1, #film do for i = 1, #film do
local image = film[i] local image = film[i]
log.msg(log.debug, "checking " .. image.filename) log.log_msg(log.debug, "checking " .. image.filename)
if not df.check_if_file_exists(image.path .. PS .. image.filename) then if not df.check_if_file_exists(image.path .. PS .. image.filename) then
log.msg(log.info, image.filename .. " not found") log.log_msg(log.info, image.filename .. " not found")
table.insert(missing_images, image) table.insert(missing_images, image)
end end
end end
end end
restore_log_level(old_log_level)
return missing_images return missing_images
end end
@@ -209,23 +195,21 @@ dbmaint.list_widget = dt.new_widget("text_view"){
} }
dbmaint.chooser = dt.new_widget("combobox"){ dbmaint.chooser = dt.new_widget("combobox"){
label = _("scan for"), label = "scan for",
selected = 1, selected = 1,
_("film rolls"), _("images"), "film rolls", "images",
reset_callback = function(this) reset_callback = function(this)
this.selected = 1 this.selected = 1
end end
} }
dbmaint.scan_button = dt.new_widget("button"){ dbmaint.scan_button = dt.new_widget("button"){
label = _("scan"), label = "scan",
tooltip = _("click to scan for missing film rolls/files"), tooltip = "click to scan for missing film rolls/files",
clicked_callback = function(this) clicked_callback = function(this)
local found = nil local found = nil
local found_text = "" local found_text = ""
local old_log_level = set_log_level(DEFAULT_LOG_LEVEL) if dbmaint.chooser.value == "film rolls" then
log.msg(log.debug, "Button clicked")
if dbmaint.chooser.selected == 1 then -- film rolls
found = scan_film_rolls() found = scan_film_rolls()
if #found > 0 then if #found > 0 then
for _, film in ipairs(found) do for _, film in ipairs(found) do
@@ -234,7 +218,7 @@ dbmaint.scan_button = dt.new_widget("button"){
end end
end end
else else
log.msg(log.debug, "checking path " .. dt.collection[1].path .. " for missing files") log.log_msg(log.debug, "checking path " .. dt.collection[1].path .. " for missing files")
found = scan_images(dt.collection[1].film) found = scan_images(dt.collection[1].film)
if #found > 0 then if #found > 0 then
for _, image in ipairs(found) do for _, image in ipairs(found) do
@@ -243,14 +227,10 @@ dbmaint.scan_button = dt.new_widget("button"){
end end
end end
if #found > 0 then if #found > 0 then
log.msg(log.debug, "found " .. #found .. " missing items")
dbmaint.list_widget.text = found_text dbmaint.list_widget.text = found_text
dbmaint.found = found dbmaint.found = found
dbmaint.remove_button.sensitive = true dbmaint.remove_button.sensitive = true
else
log.msg(log.debug, "no missing items found")
end end
restore_log_level(old_log_level)
end, end,
reset_callback = function(this) reset_callback = function(this)
dbmaint.found = nil dbmaint.found = nil
@@ -258,11 +238,11 @@ dbmaint.scan_button = dt.new_widget("button"){
} }
dbmaint.remove_button = dt.new_widget("button"){ dbmaint.remove_button = dt.new_widget("button"){
label = _("remove"), label = "remove",
tooltip = _("remove missing film rolls/images"), tooltip = "remove missing film rolls/images",
sensitive = false, sensitive = false,
clicked_callback = function(this) clicked_callback = function(this)
if dbmaint.chooser.selected == 1 then -- film rolls if dbmaint.chooser.value == "film rolls" then
remove_missing_film_rolls(dbmaint.found) remove_missing_film_rolls(dbmaint.found)
else else
remove_missing_images(dbmaint.found) remove_missing_images(dbmaint.found)
@@ -278,7 +258,7 @@ dbmaint.remove_button = dt.new_widget("button"){
dbmaint.main_widget = dt.new_widget("box"){ dbmaint.main_widget = dt.new_widget("box"){
orientation = "vertical", orientation = "vertical",
dt.new_widget("section_label"){label = _("missing items")}, dt.new_widget("section_label"){label = "missing items"},
dbmaint.list_widget, dbmaint.list_widget,
dt.new_widget("label"){label = ""}, dt.new_widget("label"){label = ""},
dbmaint.chooser, dbmaint.chooser,

View File

@@ -70,6 +70,8 @@ du.check_min_api_version("7.0.0", "enfuseAdvanced")
-- Tell gettext where to find the .mo file translating messages for a particular domain -- Tell gettext where to find the .mo file translating messages for a particular domain
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("enfuseAdvanced", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -79,7 +81,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("enfuse advanced"), name = "enfuseAdvanced",
purpose = _("focus stack or exposure blend images"), purpose = _("focus stack or exposure blend images"),
author = "Kevin Ertel", author = "Kevin Ertel",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/enfuseAdvanced" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/enfuseAdvanced"
@@ -443,7 +445,7 @@ local function main(storage, image_table, extra_data)
dt.print(_('too few images selected, please select at least 2 images')) dt.print(_('too few images selected, please select at least 2 images'))
return return
elseif extra_data[1] == 2 then elseif extra_data[1] == 2 then
dt.print(_('installation error, please verify binary paths are correct')) dt.print(_('installation error, please verify binary paths are proper'))
return return
end end
local images_to_remove = '' local images_to_remove = ''
@@ -954,7 +956,7 @@ if temp == '' then temp = nil end
GUI.Target.add_tags = dt.new_widget('entry'){ GUI.Target.add_tags = dt.new_widget('entry'){
tooltip = _('additional tags to be added on import, seperate with commas, all spaces will be removed'), tooltip = _('additional tags to be added on import, seperate with commas, all spaces will be removed'),
text = temp, text = temp,
placeholder = _('enter tags, separated by commas'), placeholder = _('enter tags, seperated by commas'),
editable = true editable = true
} }
temp = dt.preferences.read(mod, 'active_current_preset_ind', 'integer') temp = dt.preferences.read(mod, 'active_current_preset_ind', 'integer')
@@ -1021,7 +1023,7 @@ GUI.Presets.variants_type = dt.new_widget('combobox'){
GUI.Presets.variants_type.sensitive = GUI.Presets.variants.value GUI.Presets.variants_type.sensitive = GUI.Presets.variants.value
temp = df.get_executable_path_preference(AIS.name) temp = df.get_executable_path_preference(AIS.name)
GUI.exes.align_image_stack = dt.new_widget('file_chooser_button'){ GUI.exes.align_image_stack = dt.new_widget('file_chooser_button'){
title = 'align_image_stack ' .. _('binary path'), title = 'AIS binary path',
value = temp, value = temp,
tooltip = temp, tooltip = temp,
is_directory = false, is_directory = false,
@@ -1029,7 +1031,7 @@ GUI.exes.align_image_stack = dt.new_widget('file_chooser_button'){
} }
temp = df.get_executable_path_preference(ENF.name) temp = df.get_executable_path_preference(ENF.name)
GUI.exes.enfuse = dt.new_widget('file_chooser_button'){ GUI.exes.enfuse = dt.new_widget('file_chooser_button'){
title = 'enfuse ' .. _('binary path'), title = 'enfuse binary path',
value = temp, value = temp,
tooltip = temp, tooltip = temp,
is_directory = false, is_directory = false,
@@ -1037,7 +1039,7 @@ GUI.exes.enfuse = dt.new_widget('file_chooser_button'){
} }
temp = df.get_executable_path_preference(EXF.name) temp = df.get_executable_path_preference(EXF.name)
GUI.exes.exiftool = dt.new_widget('file_chooser_button'){ GUI.exes.exiftool = dt.new_widget('file_chooser_button'){
title = 'exiftool ' .. _('binary path'), title = 'Exiftool binary path',
value = temp, value = temp,
tooltip = temp, tooltip = temp,
is_directory = false, is_directory = false,

View File

@@ -35,6 +35,8 @@ du.check_min_api_version("7.0.0", "exportLUT")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("exportLUT", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -44,7 +46,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("export LUT"), name = "exportLUT",
purpose = _("export a style as a LUT"), purpose = _("export a style as a LUT"),
author = "Noah Clarke", author = "Noah Clarke",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/exportLUT" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/exportLUT"
@@ -69,13 +71,13 @@ local mkdir_command = 'mkdir -p '
if dt.configuration.running_os == 'windows' then mkdir_command = 'mkdir ' end if dt.configuration.running_os == 'windows' then mkdir_command = 'mkdir ' end
local file_chooser_button = dt.new_widget("file_chooser_button"){ local file_chooser_button = dt.new_widget("file_chooser_button"){
title = _("choose the identity file"), title = _("identity_file_chooser"),
value = "", value = "",
is_directory = false is_directory = false
} }
local export_chooser_button = dt.new_widget("file_chooser_button"){ local export_chooser_button = dt.new_widget("file_chooser_button"){
title = _("choose the export location"), title = _("export_location_chooser"),
value = "", value = "",
is_directory = true is_directory = true
} }

View File

@@ -78,6 +78,8 @@ du.check_min_api_version("7.0.0", MODULE_NAME)
-- translation -- translation
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("ext_editor", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -87,7 +89,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("external editors"), name = "ext_editor",
purpose = _("edit images with external editors"), purpose = _("edit images with external editors"),
author = "Marco Carrarini, marco.carrarini@gmail.com", author = "Marco Carrarini, marco.carrarini@gmail.com",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/ext_editor" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/ext_editor"

View File

@@ -54,6 +54,8 @@ local OUTPUT = dt.configuration.tmp_dir .. PS .. "facerecognition.txt"
du.check_min_api_version("7.0.0", MODULE) du.check_min_api_version("7.0.0", MODULE)
dt.gettext.bindtextdomain("face_recognition", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -63,7 +65,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("face recognition"), name = "face_recognition",
purpose = _("use facial recognition to tag images"), purpose = _("use facial recognition to tag images"),
author = "Sebastian Witt", author = "Sebastian Witt",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/face_recognition" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/face_recognition"

View File

@@ -65,6 +65,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "fujifilm_dynamic_range") du.check_min_api_version("7.0.0", "fujifilm_dynamic_range")
dt.gettext.bindtextdomain("fujifilm_dynamic_range", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -74,7 +76,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("fujifilm dynamic range"), name = "fujifilm_dynamic_range",
purpose = _("compensate for Fujifilm raw files made using \"dynamic range\""), purpose = _("compensate for Fujifilm raw files made using \"dynamic range\""),
author = "Dan Torop <dant@pnym.net>", author = "Dan Torop <dant@pnym.net>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/fujifilm_dynamic_range" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/fujifilm_dynamic_range"

View File

@@ -31,6 +31,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "fujifilm_ratings") du.check_min_api_version("7.0.0", "fujifilm_ratings")
dt.gettext.bindtextdomain("fujifilm_ratings", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -40,7 +42,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("fujifilm ratings"), name = "fujifilm_ratings",
purpose = _("import Fujifilm in-camera ratings"), purpose = _("import Fujifilm in-camera ratings"),
author = "Ben Mendis <ben.mendis@gmail.com>", author = "Ben Mendis <ben.mendis@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/fujifilm_ratings" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/fujifilm_ratings"
@@ -56,7 +58,7 @@ local function detect_rating(event, image)
return return
end end
if not df.check_if_bin_exists("exiftool") then if not df.check_if_bin_exists("exiftool") then
dt.print_error("exiftool not found") dt.print_error(_("exiftool not found"))
return return
end end
local RAF_filename = df.sanitize_filename(tostring(image)) local RAF_filename = df.sanitize_filename(tostring(image))

View File

@@ -40,6 +40,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "geoJSON_export") du.check_min_api_version("7.0.0", "geoJSON_export")
dt.gettext.bindtextdomain("geoJSON_export", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -49,7 +51,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("geoJSON export"), name = "geoJSON_export",
purpose = _("export a geoJSON file from geo data"), purpose = _("export a geoJSON file from geo data"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/geoJSON_export" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/geoJSON_export"
@@ -90,19 +92,19 @@ end
local function create_geoJSON_file(storage, image_table, extra_data) local function create_geoJSON_file(storage, image_table, extra_data)
if not df.check_if_bin_exists("mkdir") then if not df.check_if_bin_exists("mkdir") then
dt.print_error("mkdir not found") dt.print_error(_("mkdir not found"))
return return
end end
if not df.check_if_bin_exists("convert") then if not df.check_if_bin_exists("convert") then
dt.print_error("convert not found") dt.print_error(_("convert not found"))
return return
end end
if not df.check_if_bin_exists("xdg-open") then if not df.check_if_bin_exists("xdg-open") then
dt.print_error("xdg-open not found") dt.print_error(_("xdg-open not found"))
return return
end end
if not df.check_if_bin_exists("xdg-user-dir") then if not df.check_if_bin_exists("xdg-user-dir") then
dt.print_error("xdg-user-dir not found") dt.print_error(_("xdg-user-dir not found"))
return return
end end
@@ -293,7 +295,7 @@ local function create_geoJSON_file(storage, image_table, extra_data)
file:write(geoJSON_file) file:write(geoJSON_file)
file:close() file:close()
dt.print(string.format(_("%s file created in %s"), "geoJSON", exportDirectory)) dt.print("geoJSON file created in "..exportDirectory)
-- Open the file with the standard programm -- Open the file with the standard programm
if ( dt.preferences.read("geoJSON_export","OpengeoJSONFile","bool") == true ) then if ( dt.preferences.read("geoJSON_export","OpengeoJSONFile","bool") == true ) then
@@ -313,19 +315,19 @@ end
dt.preferences.register("geoJSON_export", dt.preferences.register("geoJSON_export",
"CreateMapBoxHTMLFile", "CreateMapBoxHTMLFile",
"bool", "bool",
"geoJSON export: ".._("Create an additional HTML file"), _("geoJSON export: Create an additional HTML file"),
_("creates an HTML file that loads the geoJSON file. (needs a MapBox key"), _("creates an HTML file that loads the geoJSON file. (needs a MapBox key"),
false ) false )
dt.preferences.register("geoJSON_export", dt.preferences.register("geoJSON_export",
"mapBoxKey", "mapBoxKey",
"string", "string",
"geoJSON export: MapBox " .. _("key"), _("geoJSON export: MapBox key"),
"https://www.mapbox.com/studio/account/tokens", "https://www.mapbox.com/studio/account/tokens",
'' ) '' )
dt.preferences.register("geoJSON_export", dt.preferences.register("geoJSON_export",
"OpengeoJSONFile", "OpengeoJSONFile",
"bool", "bool",
"geoJSON export: " .. _("open geoJSON file after export"), _("geoJSON export: open geoJSON file after export"),
_("opens the geoJSON file after the export with the standard program for geoJSON files"), _("opens the geoJSON file after the export with the standard program for geoJSON files"),
false ) false )

View File

@@ -1,7 +1,6 @@
--[[ --[[
This file is part of darktable, This file is part of darktable,
copyright (c) 2016 Tobias Jakobs copyright (c) 2016 Tobias Jakobs
copyright (c) 2025 Balázs Dura-Kovács
darktable is free software: you can redistribute it and/or modify darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -34,6 +33,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "geoToolbox") du.check_min_api_version("7.0.0", "geoToolbox")
dt.gettext.bindtextdomain("geoToolbox", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -43,7 +44,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("geo toolbox"), name = "geoToolbox",
purpose = _("geodata tools"), purpose = _("geodata tools"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/geoToolbox" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/geoToolbox"
@@ -64,33 +65,21 @@ gT.event_registered = false
local labelDistance = dt.new_widget("label") local labelDistance = dt.new_widget("label")
labelDistance.label = _("distance:") labelDistance.label = _("distance:")
local checkbox_copy_gps_lat = dt.new_widget("check_button") local label_copy_gps_lat = dt.new_widget("check_button")
{ {
label = _("latitude:"),
value = true value = true
} }
local entry_gps_lat = dt.new_widget("entry") local label_copy_gps_lon = dt.new_widget("check_button")
{
tooltip = _("latitude (editable)"),
placeholder = _("latitude")
}
local checkbox_copy_gps_lon = dt.new_widget("check_button")
{ {
label = _("longitude:"),
value = true value = true
} }
local entry_gps_lon = dt.new_widget("entry") local label_copy_gps_ele = dt.new_widget("check_button")
{
tooltip = _("longitude (editable)"),
placeholder = _("longitude")
}
local checkbox_copy_gps_ele = dt.new_widget("check_button")
{ {
label = _("elevation:"),
value = true value = true
} }
local entry_gps_ele = dt.new_widget("entry")
{
tooltip = _("elevation (editable)"),
placeholder = _("elevation")
}
-- </GUI> -- </GUI>
local function select_with_gps() local function select_with_gps()
@@ -180,7 +169,7 @@ local function get_first_coordinate()
first_elevation = '' first_elevation = ''
first_image_date = 0 first_image_date = 0
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if not image then if not image then
first_have_data = false first_have_data = false
else else
@@ -219,7 +208,7 @@ local function get_second_coordinate()
second_elevation = '' second_elevation = ''
second_image_date = 0 second_image_date = 0
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if not image then if not image then
second_have_data = false second_have_data = false
else else
@@ -255,7 +244,7 @@ local calc_in_between_slider = dt.new_widget("slider")
--ToDo: this needs more love --ToDo: this needs more love
local function calc_in_between() local function calc_in_between()
local sel_images = dt.gui.action_images local sel_images = dt.gui.action_images
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if image then if image then
image_date = make_time_stamp(image.exif_datetime_taken) image_date = make_time_stamp(image.exif_datetime_taken)
if (first_have_data and second_have_data) then if (first_have_data and second_have_data) then
@@ -302,25 +291,25 @@ local function copy_gps()
copy_gps_longitude = '' copy_gps_longitude = ''
copy_gps_elevation = '' copy_gps_elevation = ''
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if not image then if not image then
copy_gps_have_data = false copy_gps_have_data = false
else else
copy_gps_have_data = true copy_gps_have_data = true
if (image.latitude and checkbox_copy_gps_lat.value) then if (image.latitude and label_copy_gps_lat.value) then
copy_gps_latitude = image.latitude copy_gps_latitude = image.latitude
end end
if (image.longitude and checkbox_copy_gps_lon.value) then if (image.longitude and label_copy_gps_lon.value) then
copy_gps_longitude = image.longitude copy_gps_longitude = image.longitude
end end
if (image.elevation and checkbox_copy_gps_ele.value) then if (image.elevation and label_copy_gps_ele.value) then
copy_gps_elevation = image.elevation copy_gps_elevation = image.elevation
end end
end end
entry_gps_lat.text = copy_gps_latitude label_copy_gps_lat.label = string.format(_("latitude: "), copy_gps_latitude)
entry_gps_lon.text = copy_gps_longitude label_copy_gps_lon.label = string.format(_("longitude: "),copy_gps_longitude)
entry_gps_ele.text = copy_gps_elevation label_copy_gps_ele.label = string.format(_("elevation: "), copy_gps_elevation)
return return
end end
@@ -329,15 +318,15 @@ end
local function paste_gps(image) local function paste_gps(image)
local sel_images = dt.gui.action_images local sel_images = dt.gui.action_images
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if (checkbox_copy_gps_lat.value) then if (label_copy_gps_lat.value) then
image.latitude = entry_gps_lat.text image.latitude = copy_gps_latitude
end end
if (checkbox_copy_gps_lon.value) then if (label_copy_gps_lon.value) then
image.longitude = entry_gps_lon.text image.longitude = copy_gps_longitude
end end
if (checkbox_copy_gps_ele.value) then if (label_copy_gps_ele.value) then
image.elevation = entry_gps_ele.text image.elevation = copy_gps_elevation
end end
end end
end end
@@ -356,7 +345,7 @@ local function open_location_in_gnome_maps()
local i = 0; local i = 0;
-- Use the first image with geo information -- Use the first image with geo information
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if ((image.longitude and image.latitude) and if ((image.longitude and image.latitude) and
(image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data (image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data
) then ) then
@@ -383,12 +372,12 @@ end
local function reverse_geocode() local function reverse_geocode()
if not df.check_if_bin_exists("curl") then if not df.check_if_bin_exists("curl") then
dt.print_error("curl not found") dt.print_error(_("curl not found"))
return return
end end
if not df.check_if_bin_exists("jq") then if not df.check_if_bin_exists("jq") then
dt.print_error("jq not found") dt.print_error(_("jq not found"))
return return
end end
@@ -399,7 +388,7 @@ local function reverse_geocode()
local i = 0; local i = 0;
-- Use the first image with geo information -- Use the first image with geo information
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if ((image.longitude and image.latitude) and if ((image.longitude and image.latitude) and
(image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data (image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data
) then ) then
@@ -474,7 +463,7 @@ local function calc_distance()
local sel_images = dt.gui.selection() local sel_images = dt.gui.selection()
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if ((image.longitude and image.latitude) and if ((image.longitude and image.latitude) and
(image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data (image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data
) then ) then
@@ -558,7 +547,7 @@ local function altitude_profile()
local elevationAdd = 0; local elevationAdd = 0;
local sel_images = dt.gui.action_images local sel_images = dt.gui.action_images
for jj,image in ipairs(sel_images) do for _,image in ipairs(sel_images) do
if ((not isnan(image.longitude) and not isnan(image.latitude) and not isnan(image.elevation) and image.elevation) and if ((not isnan(image.longitude) and not isnan(image.latitude) and not isnan(image.elevation) and image.elevation) and
(image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data (image.longitude ~= 0 and image.latitude ~= 90) -- Sometimes the north-pole but most likely just wrong data
) then ) then
@@ -608,7 +597,7 @@ local function install_module()
if not gT.module_installed then if not gT.module_installed then
dt.register_lib( dt.register_lib(
"geoToolbox", -- Module name "geoToolbox", -- Module name
_("geo toolbox"), -- name "geo toolbox", -- name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers
@@ -676,25 +665,13 @@ gT.widget = dt.new_widget("box")
tooltip = _("copy GPS data"), tooltip = _("copy GPS data"),
clicked_callback = copy_gps clicked_callback = copy_gps
}, },
dt.new_widget("box"){ label_copy_gps_lat,
orientation = "horizontal", label_copy_gps_lon,
checkbox_copy_gps_lat, label_copy_gps_ele,
entry_gps_lat
},
dt.new_widget("box"){
orientation = "horizontal",
checkbox_copy_gps_lon,
entry_gps_lon
},
dt.new_widget("box"){
orientation = "horizontal",
checkbox_copy_gps_ele,
entry_gps_ele
},
dt.new_widget("button") dt.new_widget("button")
{ {
label = _("apply GPS data to image"), label = _("paste GPS data"),
tooltip = _("apply GPS data to image"), tooltip = _("paste GPS data"),
clicked_callback = paste_gps clicked_callback = paste_gps
}, },
separator2,-------------------------------------------------------- separator2,--------------------------------------------------------

View File

@@ -74,6 +74,8 @@ local gimp_widget = nil
du.check_min_api_version("7.0.0", "gimp") du.check_min_api_version("7.0.0", "gimp")
dt.gettext.bindtextdomain("gimp", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -83,7 +85,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("edit with GIMP"), name = "gimp",
purpose = _("export and edit with GIMP"), purpose = _("export and edit with GIMP"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/gimp" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/gimp"

View File

@@ -25,12 +25,14 @@ For each source folder, a separate <trk> is generated in the gpx file.
local dt = require "darktable" local dt = require "darktable"
local df = require "lib/dtutils.file" local df = require "lib/dtutils.file"
local dl = require "lib/dtutils" local dl = require "lib/dtutils"
local gettext = dt.gettext.gettext local gettext = dt.gettext
dl.check_min_api_version("7.0.0", "gpx_export") dl.check_min_api_version("7.0.0", "gpx_export")
gettext.bindtextdomain("gpx_export", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext.dgettext("gpx_export", msgid)
end end
-- return data structure for script_manager -- return data structure for script_manager
@@ -38,7 +40,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("gpx export"), name = "gpx_export",
purpose = _("export gpx information to a file"), purpose = _("export gpx information to a file"),
author = "Jannis_V", author = "Jannis_V",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/gpx_export" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/gpx_export"
@@ -148,7 +150,7 @@ local function install_module()
if not gpx.module_installed then if not gpx.module_installed then
dt.register_lib( dt.register_lib(
"gpx_exporter", "gpx_exporter",
_("gpx export"), "gpx export",
true, -- expandable true, -- expandable
true, -- resetable true, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers

View File

@@ -36,6 +36,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("2.0.0", "harmonic_armature_guide") du.check_min_api_version("2.0.0", "harmonic_armature_guide")
dt.gettext.bindtextdomain("harmonic_armature_guide", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -43,7 +45,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("harmonic armature guide"), name = "harmonic_armature_guide",
purpose = _("harmonic artmature guide"), purpose = _("harmonic artmature guide"),
author = "Hubert Kowalski", author = "Hubert Kowalski",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/harmonic_armature_guide" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/harmonic_armature_guide"

View File

@@ -64,6 +64,8 @@ du.check_min_api_version("7.0.0", MODULE)
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("hif_group_leader", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -75,7 +77,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("HIF group leader"), name = "hif_group_leader",
purpose = _("make hif image group leader"), purpose = _("make hif image group leader"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/hif_group_leader" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/hif_group_leader"

View File

@@ -56,6 +56,8 @@ local PQ = dt.configuration.running_os == "windows" and '"' or "'"
-- works with darktable API version from 5.0.0 on -- works with darktable API version from 5.0.0 on
du.check_min_api_version("7.0.0", "hugin") du.check_min_api_version("7.0.0", "hugin")
dt.gettext.bindtextdomain("hugin", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -65,7 +67,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("hugin"), name = "hugin",
purpose = _("stitch images into a panorama"), purpose = _("stitch images into a panorama"),
author = "Wolfgang Goetz", author = "Wolfgang Goetz",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/hugin" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/hugin"
@@ -83,7 +85,7 @@ end
local function show_status(storage, image, format, filename, local function show_status(storage, image, format, filename,
number, total, high_quality, extra_data) number, total, high_quality, extra_data)
dt.print(string.format(_("exporting to hugin: %d / %d"), number, total)) dt.print("exporting to hugin: "..tostring(number).."/"..tostring(total))
end end
local function create_panorama(storage, image_table, extra_data) --finalize local function create_panorama(storage, image_table, extra_data) --finalize
@@ -144,7 +146,7 @@ local function create_panorama(storage, image_table, extra_data) --finalize
end end
if first_file == nil then if first_file == nil then
dt.print(_("no file selected")) dt.print("no file selected")
return return
end end

View File

@@ -73,6 +73,8 @@ local PS = dt.configuration.running_os == "windows" and "\\" or "/"
-- works with LUA API version 5.0.0 -- works with LUA API version 5.0.0
du.check_min_api_version("7.0.0", "image_stack") du.check_min_api_version("7.0.0", "image_stack")
dt.gettext.bindtextdomain("image_stack", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -82,7 +84,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("image stack"), name = "image_stack",
purpose = _("process a stack of images"), purpose = _("process a stack of images"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/image_stack" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/image_stack"
@@ -139,19 +141,19 @@ local chkbtn_will_align = dt.new_widget("check_button"){
local chkbtn_radial_distortion = dt.new_widget("check_button"){ local chkbtn_radial_distortion = dt.new_widget("check_button"){
label = _('optimize radial distortion for all images'), label = _('optimize radial distortion for all images'),
value = dt.preferences.read("align_image_stack", "def_radial_distortion", "bool"), value = dt.preferences.read("align_image_stack", "def_radial_distortion", "bool"),
tooltip = _('optimize radial distortion for all images, \nexcept the first'), tooltip = _('optimize radial distortion for all images, \nexcept for first'),
} }
local chkbtn_optimize_field = dt.new_widget("check_button"){ local chkbtn_optimize_field = dt.new_widget("check_button"){
label = _('optimize field of view for all images'), label = _('optimize field of view for all images'),
value = dt.preferences.read("align_image_stack", "def_optimize_field", "bool"), value = dt.preferences.read("align_image_stack", "def_optimize_field", "bool"),
tooltip =_('optimize field of view for all images, except the first. \nUseful for aligning focus stacks (DFF) with slightly \ndifferent magnification.'), tooltip =_('optimize field of view for all images, except for first. \nUseful for aligning focus stacks (DFF) with slightly \ndifferent magnification.'),
} }
local chkbtn_optimize_image_center = dt.new_widget("check_button"){ local chkbtn_optimize_image_center = dt.new_widget("check_button"){
label = _('optimize image center shift for all images'), label = _('optimize image center shift for all images'),
value = dt.preferences.read("align_image_stack", "def_optimize_image_center", "bool"), value = dt.preferences.read("align_image_stack", "def_optimize_image_center", "bool"),
tooltip =_('optimize image center shift for all images, \nexcept the first.'), tooltip =_('optimize image center shift for all images, \nexcept for first.'),
} }
local chkbtn_auto_crop = dt.new_widget("check_button"){ local chkbtn_auto_crop = dt.new_widget("check_button"){
@@ -504,7 +506,7 @@ local function image_stack(storage, image_table, extra_data)
return return
end end
job = dt.gui.create_job(_("image stack"), true, stop_job) job = dt.gui.create_job("image stack", true, stop_job)
job.percent = job.percent + percent_step job.percent = job.percent + percent_step
-- align images if requested -- align images if requested

View File

@@ -116,6 +116,8 @@ img_time.event_registered = false
du.check_min_api_version("7.0.0", "image_time") du.check_min_api_version("7.0.0", "image_time")
dt.gettext.bindtextdomain("image_time", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -125,7 +127,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("image time"), name = "image_time",
purpose = _("synchronize image time for images shot with different cameras or adjust or set image time"), purpose = _("synchronize image time for images shot with different cameras or adjust or set image time"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/image_time" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/image_time"
@@ -154,12 +156,12 @@ local function systime2exiftime(systime)
end end
local function vars2exiftime(year, month, day, hour, min, sec) local function vars2exiftime(year, month, day, hour, min, sec)
local y = tonumber(year) and string.format("%4d", year) or "0000" local y = tonumber(year) and string.format("%4d", year) or " "
local mo = tonumber(month) and string.format("%02d", month) or "00" local mo = tonumber(month) and string.format("%02d", month) or " "
local d = tonumber(day) and string.format("%02d", day) or "00" local d = tonumber(day) and string.format("%02d", day) or " "
local h = tonumber(hour) and string.format("%02d", hour) or "00" local h = tonumber(hour) and string.format("%02d", hour) or " "
local m = tonumber(min) and string.format("%02d", min) or "00" local m = tonumber(min) and string.format("%02d", min) or " "
local s = tonumber(sec) and string.format("%02d", sec) or "00" local s = tonumber(sec) and string.format("%02d", sec) or " "
return(y .. ":" .. mo .. ":" .. d .. " " .. h .. ":" .. m .. ":" .. s) return(y .. ":" .. mo .. ":" .. d .. " " .. h .. ":" .. m .. ":" .. s)
end end
@@ -193,7 +195,7 @@ end
local function synchronize_time(images) local function synchronize_time(images)
local sign = 1 local sign = 1
if img_time.sdir.value == _("subtract") then if img_time.sdir.value == "subtract" then
sign = -1 sign = -1
end end
synchronize_times(images, tonumber(img_time.diff_entry.text) * sign) synchronize_times(images, tonumber(img_time.diff_entry.text) * sign)
@@ -509,7 +511,7 @@ img_time.stack = dt.new_widget("stack"){
dt.new_widget("box"){ dt.new_widget("box"){
orientation = "vertical", orientation = "vertical",
dt.new_widget("label"){label = _("set time")}, dt.new_widget("label"){label = _("set time")},
dt.new_widget("section_label"){label = _("date:")}, dt.new_widget("section_label"){label = _("date: ")},
img_time.sdy, img_time.sdy,
img_time.smo, img_time.smo,
img_time.syr, img_time.syr,

View File

@@ -64,6 +64,8 @@ du.check_min_api_version("7.0.0", MODULE)
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("jpg_group_leader", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -75,7 +77,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("JPG group leader"), name = "jpg_group_leader",
purpose = _("make jpg image group leader"), purpose = _("make jpg image group leader"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/jpg_group_leader" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/jpg_group_leader"

View File

@@ -45,6 +45,8 @@ local PS = dt.configuration.running_os == "windows" and "\\" or "/"
du.check_min_api_version("7.0.0", "kml_export") du.check_min_api_version("7.0.0", "kml_export")
dt.gettext.bindtextdomain("kml_export", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -54,7 +56,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("kml export"), name = "kml_export",
purpose = _("export KML/KMZ data to a file"), purpose = _("export KML/KMZ data to a file"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/kml_export" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/kml_export"
@@ -93,12 +95,12 @@ local function create_kml_file(storage, image_table, extra_data)
end end
if not df.check_if_bin_exists(magickPath) then if not df.check_if_bin_exists(magickPath) then
dt.print_error("magick not found") dt.print_error(_("magick not found"))
return return
end end
if dt.configuration.running_os == "linux" then if dt.configuration.running_os == "linux" then
if not df.check_if_bin_exists("xdg-user-dir") then if not df.check_if_bin_exists("xdg-user-dir") then
dt.print_error("xdg-user-dir not found") dt.print_error(_("xdg-user-dir not found"))
return return
end end
end end
@@ -108,7 +110,7 @@ local function create_kml_file(storage, image_table, extra_data)
if ( dt.preferences.read("kml_export","CreateKMZ","bool") == true if ( dt.preferences.read("kml_export","CreateKMZ","bool") == true
and dt.configuration.running_os == "linux") then and dt.configuration.running_os == "linux") then
if not df.check_if_bin_exists("zip") then if not df.check_if_bin_exists("zip") then
dt.print_error("zip not found") dt.print_error(_("zip not found"))
return return
end end
exportDirectory = dt.configuration.tmp_dir exportDirectory = dt.configuration.tmp_dir

View File

@@ -41,6 +41,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("2.0.0", "passport_guide") du.check_min_api_version("2.0.0", "passport_guide")
dt.gettext.bindtextdomain("passport_guide", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -48,7 +50,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("passport guide"), name = "passport_guide",
purpose = _("guides for cropping passport photos"), purpose = _("guides for cropping passport photos"),
author = "Kåre Hampf", author = "Kåre Hampf",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/passport_guide" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/passport_guide"

View File

@@ -40,19 +40,21 @@ USAGE
local dt = require "darktable" local dt = require "darktable"
local du = require "lib/dtutils" local du = require "lib/dtutils"
local gettext = dt.gettext.gettext local gettext = dt.gettext
du.check_min_api_version("2.0.0", "passport_guide_germany") du.check_min_api_version("2.0.0", "passport_guide_germany")
-- Tell gettext where to find the .mo file translating messages for a particular domain -- Tell gettext where to find the .mo file translating messages for a particular domain
dt.gettext.bindtextdomain("passport_guide_germany",dt.configuration.config_dir.."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext.dgettext("passport_guide_germany", msgid)
end end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("passport guide Germany"), name = "passport_guide_germany",
purpose = _("guides for cropping passport and ID card (\"Personalausweis\") photos based on the \"Passbild-Schablone\" from the German Federal Ministry of the Interior and Community"), purpose = _("guides for cropping passport and ID card (\"Personalausweis\") photos based on the \"Passbild-Schablone\" from the German Federal Ministry of the Interior and Community"),
author = "menschmachine", author = "menschmachine",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/passport_guide_germany" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/passport_guide_germany"

View File

@@ -44,6 +44,8 @@ local df = require "lib/dtutils.file"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("pdf_slideshow", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -60,7 +62,7 @@ du.check_min_api_version("7.0.0", "pdf_slideshow")
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("PDF slideshow"), name = "pdf_slideshow",
purpose = _("generates a PDF slideshow (via Latex) containing all selected images one per slide"), purpose = _("generates a PDF slideshow (via Latex) containing all selected images one per slide"),
author = "Pascal Obry", author = "Pascal Obry",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/pdf_slideshow" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/pdf_slideshow"

View File

@@ -45,6 +45,7 @@ local MODULE_NAME = "photils"
du.check_min_api_version("7.0.0", MODULE_NAME) du.check_min_api_version("7.0.0", MODULE_NAME)
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("photils", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
@@ -55,7 +56,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("photils"), name = "photils",
purpose = _("suggest tags based on image classification"), purpose = _("suggest tags based on image classification"),
author = "Tobias Scheck", author = "Tobias Scheck",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/photils" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/photils"
@@ -338,7 +339,7 @@ function PHOTILS.on_tags_clicked()
end end
if #PHOTILS.tags == 0 then if #PHOTILS.tags == 0 then
local msg = string.format(_("no tags were found"), MODULE_NAME) local msg = string.format(_("no tags where found"), MODULE_NAME)
GUI.warning_label.label = msg GUI.warning_label.label = msg
GUI.stack.active = GUI.error_view GUI.stack.active = GUI.error_view
return return
@@ -393,7 +394,7 @@ end
local function install_module() local function install_module()
if not PHOTILS.module_installed then if not PHOTILS.module_installed then
dt.register_lib(MODULE_NAME, dt.register_lib(MODULE_NAME,
_("photils auto-tagger"), "photils autotagger",
true, true,
true, true,
PHOTILS.plugin_display_views, PHOTILS.plugin_display_views,

View File

@@ -51,6 +51,8 @@ du.check_min_api_version("7.0.0", "quicktag")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("quicktag", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -60,7 +62,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("quick tag"), name = "quicktag",
purpose = _("use buttons to quickly apply tags assigned to them"), purpose = _("use buttons to quickly apply tags assigned to them"),
author = "Christian Kanzian", author = "Christian Kanzian",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/quicktag" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/quicktag"
@@ -197,7 +199,7 @@ local function install_module()
if not qt.module_installed then if not qt.module_installed then
dt.register_lib( dt.register_lib(
"quicktag", -- Module name "quicktag", -- Module name
_("quick tag"), -- name "quicktag", -- name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 490}}, {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 490}},
@@ -304,7 +306,7 @@ end
for i=1,qnr do for i=1,qnr do
dt.register_event("quicktag " .. tostring(i), "shortcut", dt.register_event("quicktag " .. tostring(i), "shortcut",
function(event, shortcut) tagattach(tostring(quicktag_table[i])) end, function(event, shortcut) tagattach(tostring(quicktag_table[i])) end,
string.format(_("quick tag %i"),i)) string.format(_("quicktag %i"),i))
end end
script_data.destroy = destroy script_data.destroy = destroy

View File

@@ -46,6 +46,8 @@ du.check_min_api_version("7.0.0", "rate_group")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("rate_group", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -55,7 +57,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("rate group"), name = "rate_group",
purpose = _("rate all images in a group"), purpose = _("rate all images in a group"),
author = "Dom H (dom@hxy.io)", author = "Dom H (dom@hxy.io)",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rate_group" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rate_group"

View File

@@ -38,6 +38,8 @@ du.deprecated("contrib/rename-tags.lua","darktable release 4.0")
local gettext = darktable.gettext.gettext local gettext = darktable.gettext.gettext
darktable.gettext.bindtextdomain("rename-tags", darktable.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -47,7 +49,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("rename tags"), name = "rename-tags",
purpose = _("rename an existing tag"), purpose = _("rename an existing tag"),
author = "Sebastian Witt (se.witt@gmx.net)", author = "Sebastian Witt (se.witt@gmx.net)",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rename-tags" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rename-tags"

View File

@@ -43,12 +43,13 @@
local dt = require "darktable" local dt = require "darktable"
local du = require "lib/dtutils" local du = require "lib/dtutils"
local df = require "lib/dtutils.file" local df = require "lib/dtutils.file"
local ds = require "lib/dtutils.string"
du.check_min_api_version("7.0.0", "rename_images") du.check_min_api_version("7.0.0", "rename_images")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("rename_images", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -56,6 +57,12 @@ end
-- namespace variable -- namespace variable
local rename = { local rename = {
presets = {}, presets = {},
substitutes = {},
placeholders = {"ROLL_NAME","FILE_FOLDER","FILE_NAME","FILE_EXTENSION","ID","VERSION","SEQUENCE","YEAR","MONTH","DAY",
"HOUR","MINUTE","SECOND","EXIF_YEAR","EXIF_MONTH","EXIF_DAY","EXIF_HOUR","EXIF_MINUTE","EXIF_SECOND",
"STARS","LABELS","MAKER","MODEL","TITLE","CREATOR","PUBLISHER","RIGHTS","USERNAME","PICTURES_FOLDER",
"HOME","DESKTOP","EXIF_ISO","EXIF_EXPOSURE","EXIF_EXPOSURE_BIAS","EXIF_APERTURE","EXIF_FOCUS_DISTANCE",
"EXIF_FOCAL_LENGTH","LONGITUDE","LATITUDE","ELEVATION","LENS","DESCRIPTION","EXIF_CROP"},
widgets = {}, widgets = {},
} }
rename.module_installed = false rename.module_installed = false
@@ -65,7 +72,7 @@ rename.event_registered = false
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("rename images"), name = "rename_images",
purpose = _("rename an image file or files"), purpose = _("rename an image file or files"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rename_images" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/rename_images"
@@ -92,6 +99,83 @@ local DESKTOP = HOME .. PS .. "Desktop"
-- F U N C T I O N S -- F U N C T I O N S
-- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - -
local function build_substitution_list(image, sequence, datetime, username, pic_folder, home, desktop)
-- build the argument substitution list from each image
-- local datetime = os.date("*t")
local colorlabels = {}
if image.red then table.insert(colorlabels, "red") end
if image.yellow then table.insert(colorlabels, "yellow") end
if image.green then table.insert(colorlabels, "green") end
if image.blue then table.insert(colorlabels, "blue") end
if image.purple then table.insert(colorlabels, "purple") end
local labels = #colorlabels == 1 and colorlabels[1] or du.join(colorlabels, ",")
local eyear,emon,eday,ehour,emin,esec = string.match(image.exif_datetime_taken, "(%d-):(%d-):(%d-) (%d-):(%d-):(%d-)$")
local replacements = {image.film,
image.path,
df.get_filename(image.filename),
string.upper(df.get_filetype(image.filename)),
image.id,image.duplicate_index,
string.format("%04d", sequence),
datetime.year,
string.format("%02d", datetime.month),
string.format("%02d", datetime.day),
string.format("%02d", datetime.hour),
string.format("%02d", datetime.min),
string.format("%02d", datetime.sec),
eyear,
emon,
eday,
ehour,
emin,
esec,
image.rating,
labels,
image.exif_maker,
image.exif_model,
image.title,
image.creator,
image.publisher,
image.rights,
username,
pic_folder,
home,
desktop,
image.exif_iso,
image.exif_exposure,
image.exif_exposure_bias,
image.exif_aperture,
image.exif_focus_distance,
image.exif_focal_length,
image.longitude,
image.latitude,
image.elevation,
image.exif_lens,
image.description,
image.exif_crop
}
for i=1,#rename.placeholders,1 do rename.substitutes[rename.placeholders[i]] = replacements[i] end
end
local function substitute_list(str)
-- replace the substitution variables in a string
for match in string.gmatch(str, "%$%(.-%)") do
local var = string.match(match, "%$%((.-)%)")
if rename.substitutes[var] then
str = string.gsub(str, "%$%("..var.."%)", rename.substitutes[var])
else
dt.print_error("unrecognized variable " .. var)
dt.print(string.format(_("unknown variable %s, aborting..."), var))
return -1
end
end
return str
end
local function clear_substitute_list()
for i=1,#rename.placeholders,1 do rename.substitutes[rename.placeholders[i]] = nil end
end
local function stop_job(job) local function stop_job(job)
job.valid = false job.valid = false
end end
@@ -141,14 +225,14 @@ local function do_rename(images)
for i, image in ipairs(images) do for i, image in ipairs(images) do
if job.valid then if job.valid then
job.percent = i / #images job.percent = i / #images
ds.build_substitute_list(image, i, pattern, USER, PICTURES, HOME, DESKTOP) build_substitution_list(image, i, datetime, USER, PICTURES, HOME, DESKTOP)
local new_name = ds.substitute_list(pattern) local new_name = substitute_list(pattern)
if new_name == -1 then if new_name == -1 then
dt.print(_("unable to do variable substitution, exiting...")) dt.print(_("unable to do variable substitution, exiting..."))
stop_job(job) stop_job(job)
return return
end end
ds.clear_substitute_list() clear_substitute_list()
local args = {} local args = {}
local path = string.sub(df.get_path(new_name), 1, -2) local path = string.sub(df.get_path(new_name), 1, -2)
if string.len(path) == 0 then if string.len(path) == 0 then
@@ -194,8 +278,50 @@ end
-- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - -
rename.widgets.pattern = dt.new_widget("entry"){ rename.widgets.pattern = dt.new_widget("entry"){
tooltip = ds.get_substitution_tooltip(), tooltip = _("$(ROLL_NAME) - film roll name\n") ..
placeholder = _("enter pattern") .. "$(FILE_FOLDER)/$(FILE_NAME)", _("$(FILE_FOLDER) - image file folder\n") ..
_("$(FILE_NAME) - image file name\n") ..
_("$(FILE_EXTENSION) - image file extension\n") ..
_("$(ID) - image id\n") ..
_("$(VERSION) - version number\n") ..
_("$(SEQUENCE) - sequence number of selection\n") ..
_("$(YEAR) - current year\n") ..
_("$(MONTH) - current month\n") ..
_("$(DAY) - current day\n") ..
_("$(HOUR) - current hour\n") ..
_("$(MINUTE) - current minute\n") ..
_("$(SECOND) - current second\n") ..
_("$(EXIF_YEAR) - EXIF year\n") ..
_("$(EXIF_MONTH) - EXIF month\n") ..
_("$(EXIF_DAY) - EXIF day\n") ..
_("$(EXIF_HOUR) - EXIF hour\n") ..
_("$(EXIF_MINUTE) - EXIF minute\n") ..
_("$(EXIF_SECOND) - EXIF seconds\n") ..
_("$(EXIF_ISO) - EXIF ISO\n") ..
_("$(EXIF_EXPOSURE) - EXIF exposure\n") ..
_("$(EXIF_EXPOSURE_BIAS) - EXIF exposure bias\n") ..
_("$(EXIF_APERTURE) - EXIF aperture\n") ..
_("$(EXIF_FOCAL_LENGTH) - EXIF focal length\n") ..
_("$(EXIF_FOCUS_DISTANCE) - EXIF focus distance\n") ..
_("$(EXIF_CROP) - EXIF crop\n") ..
_("$(LONGITUDE) - longitude\n") ..
_("$(LATITUDE) - latitude\n") ..
_("$(ELEVATION) - elevation\n") ..
_("$(STARS) - star rating\n") ..
_("$(LABELS) - color labels\n") ..
_("$(MAKER) - camera maker\n") ..
_("$(MODEL) - camera model\n") ..
_("$(LENS) - lens\n") ..
_("$(TITLE) - title from metadata\n") ..
_("$(DESCRIPTION) - description from metadata\n") ..
_("$(CREATOR) - creator from metadata\n") ..
_("$(PUBLISHER) - publisher from metadata\n") ..
_("$(RIGHTS) - rights from metadata\n") ..
_("$(USERNAME) - username\n") ..
_("$(PICTURES_FOLDER) - pictures folder\n") ..
_("$(HOME) - user's home directory\n") ..
_("$(DESKTOP) - desktop directory"),
placeholder = _("enter pattern $(FILE_FOLDER)/$(FILE_NAME)"),
text = "" text = ""
} }

View File

@@ -31,6 +31,8 @@ local PS = dt.configuration.running_os == "windows" and "\\" or "/"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("select_non_existing", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -74,7 +76,7 @@ dt.gui.libs.select.register_selection(
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("select non existing"), name = "select_non_existing",
purpose = _("enable selection of non-existing images"), purpose = _("enable selection of non-existing images"),
author = "Dirk Dittmar", author = "Dirk Dittmar",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/select_non_existing" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/select_non_existing"

View File

@@ -24,6 +24,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "select_untagged") du.check_min_api_version("7.0.0", "select_untagged")
dt.gettext.bindtextdomain("select_untagged", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -33,7 +35,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("select untagged"), name = "select_untagged",
purpose = _("enable selection of untagged images"), purpose = _("enable selection of untagged images"),
author = "Jannis_V", author = "Jannis_V",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/select_untagged" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/select_untagged"

View File

@@ -31,6 +31,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "slideshowMusic") du.check_min_api_version("7.0.0", "slideshowMusic")
dt.gettext.bindtextdomain("slideshowMusic", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -40,7 +42,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("slideshow music"), name = "slideshowMusic",
purpose = _("play music during a slideshow"), purpose = _("play music during a slideshow"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/slideshowMusic" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/slideshowMusic"

View File

@@ -76,13 +76,14 @@ local darktable = require("darktable")
local dtutils = require("lib/dtutils") local dtutils = require("lib/dtutils")
local dtutils_file = require("lib/dtutils.file") local dtutils_file = require("lib/dtutils.file")
local dtutils_system = require("lib/dtutils.system") local dtutils_system = require("lib/dtutils.system")
local gettext = darktable.gettext.gettext
local LIB_ID = "transfer_hierarchy" local LIB_ID = "transfer_hierarchy"
dtutils.check_min_api_version("7.0.0", LIB_ID) dtutils.check_min_api_version("7.0.0", LIB_ID)
darktable.gettext.bindtextdomain("transfer_hierarchy", darktable.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return darktable.gettext.gettext(msgid)
end end
-- return data structure for script_manager -- return data structure for script_manager
@@ -90,7 +91,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("transfer hierarchy"), name = "transfer_hierarchy",
purpose = _("allows the moving or copying of images from one directory tree to another, while preserving the existing hierarchy"), purpose = _("allows the moving or copying of images from one directory tree to another, while preserving the existing hierarchy"),
author = "August Schwerdfeger (august@schwerdfeger.name)", author = "August Schwerdfeger (august@schwerdfeger.name)",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/transfer_hierarchy" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/transfer_hierarchy"
@@ -144,7 +145,7 @@ end
local function install_module() local function install_module()
if not th.module_installed then if not th.module_installed then
darktable.register_lib(LIB_ID, darktable.register_lib(LIB_ID,
_("transfer hierarchy"), true, true, { "transfer hierarchy", true, true, {
[darktable.gui.views.lighttable] = { "DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 700 } [darktable.gui.views.lighttable] = { "DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 700 }
}, th.transfer_widget, nil, nil) }, th.transfer_widget, nil, nil)
th.module_installed = true th.module_installed = true

File diff suppressed because it is too large Load Diff

View File

@@ -41,6 +41,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "video_ffmpeg") du.check_min_api_version("7.0.0", "video_ffmpeg")
dt.gettext.bindtextdomain("video_ffmpeg", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -50,7 +52,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("video ffmpeg"), name = "video_ffmpeg",
purpose = _("timelapse video plugin based on ffmpeg"), purpose = _("timelapse video plugin based on ffmpeg"),
author = "Dominik Markiewicz", author = "Dominik Markiewicz",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contib/video_ffmpeg" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contib/video_ffmpeg"
@@ -246,8 +248,8 @@ local function string_pref_write(name, widget_attribute)
end end
local framerates_selector = dt.new_widget("combobox"){ local framerates_selector = dt.new_widget("combobox"){
label = _("frame rate"), label = _("framerate"),
tooltip = _("select frame rate of output video"), tooltip = _("select framerate of output video"),
value = combobox_pref_read("framerate", framerates), value = combobox_pref_read("framerate", framerates),
changed_callback = combobox_pref_write("framerate"), changed_callback = combobox_pref_write("framerate"),
table.unpack(framerates) table.unpack(framerates)
@@ -416,7 +418,7 @@ local function export(extra_data)
local ffmpeg_path = df.check_if_bin_exists("ffmpeg") local ffmpeg_path = df.check_if_bin_exists("ffmpeg")
if not ffmpeg_path then if not ffmpeg_path then
dt.print_error("ffmpeg not found") dt.print_error("ffmpeg not found")
dt.print(_("ERROR - ffmpeg not found")) dt.print("ERROR - ffmpeg not found")
return return
end end
local dir = extra_data["tmp_dir"] local dir = extra_data["tmp_dir"]
@@ -448,7 +450,7 @@ local function finalize_export(storage, images_table, extra_data)
dt.print_error(filename, file.filename) dt.print_error(filename, file.filename)
df.file_move(filename, tmp_dir .. PS .. i .. extra_data["img_ext"]) df.file_move(filename, tmp_dir .. PS .. i .. extra_data["img_ext"])
end end
dt.print(_("start video building...")) dt.print("Start video building...")
local result, path = export(extra_data) local result, path = export(extra_data)
if result ~= 0 then if result ~= 0 then
dt.print(_("ERROR: cannot build image, see console for more info")) dt.print(_("ERROR: cannot build image, see console for more info"))

View File

@@ -27,6 +27,8 @@ local dt = require "darktable"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("api_version", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -39,7 +41,7 @@ end
local result = dt.configuration.api_version_string local result = dt.configuration.api_version_string
dt.print_log("API Version: " .. result) dt.print_log("API Version: " .. result)
dt.print("API " .. _("version") .. ": " .. result) dt.print(string.format(_("API version: %s"), result))
-- set the destroy routine so that script_manager can call it when -- set the destroy routine so that script_manager can call it when
-- it's time to destroy the script and then return the data to -- it's time to destroy the script and then return the data to
@@ -47,7 +49,7 @@ dt.print("API " .. _("version") .. ": " .. result)
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("APIversion"), name = "api_version",
purpose = _("display api_version example"), purpose = _("display api_version example"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/api_version" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/api_version"

View File

@@ -60,6 +60,8 @@ local PS = dt.configuration.running_os == "windows" and "\\" or "/"
-- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - -
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("darkroom_demo", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -91,7 +93,7 @@ dt.gui.current_view(dt.gui.views.darkroom)
local max_images = 10 local max_images = 10
dt.print(_("showing images, with a pause between each")) dt.print(_("showing images, with a pause in between each"))
sleep(1500) sleep(1500)
-- display first 10 images of collection pausing for a second between each -- display first 10 images of collection pausing for a second between each
@@ -117,7 +119,7 @@ dt.gui.current_view(current_view)
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("darkroom demo"), name = "darkroom_demo",
purpose = _("example demonstrating how to control image display in darkroom mode"), purpose = _("example demonstrating how to control image display in darkroom mode"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/darkroom_demo" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/darkroom_demo"

View File

@@ -69,6 +69,8 @@ dt.print_error("Hello World!")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("gettextExample", dt.configuration.config_dir .."/lua/locale/")
-- Translate a string using the darktable textdomain -- Translate a string using the darktable textdomain
dt.print_error(gettext("image")) dt.print_error(gettext("image"))
@@ -86,7 +88,7 @@ dt.print_error(_("hello world!"))
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("gettext example"), name = "gettextExample",
purpose = _("example of how translations works"), purpose = _("example of how translations works"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/gettextExample" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/gettextExample"

View File

@@ -5,6 +5,7 @@ local NaN = 0/0
local wg = {} local wg = {}
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("gui_action", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
@@ -15,7 +16,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("gui action"), name = "gui_action",
purpose = _("example of how to use darktable.gui.action() calls"), purpose = _("example of how to use darktable.gui.action() calls"),
author = "Diederik ter Rahe", author = "Diederik ter Rahe",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/gui_action" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/gui_action"
@@ -28,37 +29,37 @@ script_data.show = nil -- only required for libs since the destroy_method only h
wg.action = dt.new_widget("entry"){ wg.action = dt.new_widget("entry"){
text = "lib/filter/view", text = "lib/filter/view",
placeholder = _("action path"), placeholder = "action path",
tooltip = _("enter the full path of an action, for example 'lib/filter/view'") tooltip = "enter the full path of an action, for example 'lib/filter/view'"
} }
wg.instance = dt.new_widget("combobox"){ wg.instance = dt.new_widget("combobox"){
label = _("instance"), label = "instance",
tooltip = _("the instance of an image processing module to execute action on"), tooltip = "the instance of an image processing module to execute action on",
"0", "+1", "-1", "+2", "-2", "+3", "-3", "+4", "-4", "+5", "-5", "+6", "-6", "+7", "-7", "+8", "-8", "+9", "-9" "0", "+1", "-1", "+2", "-2", "+3", "-3", "+4", "-4", "+5", "-5", "+6", "-6", "+7", "-7", "+8", "-8", "+9", "-9"
} }
wg.element = dt.new_widget("entry"){ wg.element = dt.new_widget("entry"){
text = "", text = "",
placeholder = _("action element"), placeholder = "action element",
tooltip = _("enter the element of an action, for example 'selection', or leave empty for default") tooltip = "enter the element of an action, for example 'selection', or leave empty for default"
} }
wg.effect = dt.new_widget("entry"){ wg.effect = dt.new_widget("entry"){
text = "next", text = "next",
placeholder = _("action effect"), placeholder = "action effect",
tooltip = _("enter the effect of an action, for example 'next', or leave empty for default") tooltip = "enter the effect of an action, for example 'next', or leave empty for default"
} }
wg.speed = dt.new_widget("entry"){ wg.speed = dt.new_widget("entry"){
text = "1", text = "1",
placeholder = _("action speed"), placeholder = "action speed",
tooltip = _("enter the speed to use in action execution, or leave empty to only read state") tooltip = "enter the speed to use in action execution, or leave empty to only read state"
} }
wg.check = dt.new_widget("check_button"){ wg.check = dt.new_widget("check_button"){
label = _('perform action'), label = 'perform action',
tooltip = _('perform action or only read return'), tooltip = 'perform action or only read return',
clicked_callback = function() clicked_callback = function()
wg.speed.sensitive = wg.check.value wg.speed.sensitive = wg.check.value
end, end,
@@ -72,7 +73,7 @@ wg.return_value = dt.new_widget("entry"){
dt.register_lib( dt.register_lib(
"execute_action", -- Module name "execute_action", -- Module name
_("execute gui actions"), -- name "execute gui actions", -- name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_CENTER", 100}, {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_CENTER", 100},
@@ -84,37 +85,37 @@ dt.register_lib(
dt.new_widget("box") dt.new_widget("box")
{ {
orientation = "horizontal", orientation = "horizontal",
dt.new_widget("label"){label = _("action path"), halign = "start"}, dt.new_widget("label"){label = "action path", halign = "start"},
wg.action wg.action
}, },
wg.instance, wg.instance,
dt.new_widget("box") dt.new_widget("box")
{ {
orientation = "horizontal", orientation = "horizontal",
dt.new_widget("label"){label = _("element"), halign = "start"}, dt.new_widget("label"){label = "element", halign = "start"},
wg.element wg.element
}, },
dt.new_widget("box") dt.new_widget("box")
{ {
orientation = "horizontal", orientation = "horizontal",
dt.new_widget("label"){label = _("effect"), halign = "start"}, dt.new_widget("label"){label = "effect", halign = "start"},
wg.effect wg.effect
}, },
wg.check, wg.check,
dt.new_widget("box") dt.new_widget("box")
{ {
orientation = "horizontal", orientation = "horizontal",
dt.new_widget("label"){label = _("speed"), halign = "start"}, dt.new_widget("label"){label = "speed", halign = "start"},
wg.speed wg.speed
}, },
dt.new_widget("button") dt.new_widget("button")
{ {
label = _("execute action"), label = "execute action",
tooltip = _("execute the action specified in the fields above"), tooltip = "execute the action specified in the fields above",
clicked_callback = function(_) clicked_callback = function(_)
local sp = NaN local sp = NaN
if wg.check.value then sp = wg.speed.text end if wg.check.value then sp = wg.speed.text end
wg.return_value.text = dt.gui.action(wg.action.text, tonumber(wg.instance.value), wg.element.text, wg.effect.text, tonumber(sp)) wg.return_value.text = dt.gui.action(wg.action.text, wg.instance.value, wg.element.text, wg.effect.text, sp)
end end
}, },
dt.new_widget("box") dt.new_widget("box")

View File

@@ -35,6 +35,8 @@ du.check_min_api_version("2.0.0", "hello_world")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("hello_world", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -53,7 +55,7 @@ dt.print(_("hello, world"))
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("hello world"), name = "hello_world",
purpose = _("example of how to print a message to the screen"), purpose = _("example of how to print a message to the screen"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/hello_world" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/hello_world"

View File

@@ -218,7 +218,7 @@ current_sort_order = dt.gui.libs.filter.sort_order(current_sort_order)
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("lighttable demo"), name = "lighttable_demo",
purpose = _("example demonstrating how to control lighttable display modes"), purpose = _("example demonstrating how to control lighttable display modes"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/lighttable_demo" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/lighttable_demo"

View File

@@ -38,6 +38,8 @@ du.check_min_api_version("7.0.0", "moduleExample")
-- https://www.darktable.org/lua-api/index.html#darktable_gettext -- https://www.darktable.org/lua-api/index.html#darktable_gettext
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("moduleExample", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -47,7 +49,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = ("module example"), name = "moduleExample",
purpose = _("example of how to create a lighttable module"), purpose = _("example of how to create a lighttable module"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/moduleExample" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/moduleExample"
@@ -75,7 +77,7 @@ local function install_module()
-- https://www.darktable.org/lua-api/index.html#darktable_register_lib -- https://www.darktable.org/lua-api/index.html#darktable_register_lib
dt.register_lib( dt.register_lib(
"exampleModule", -- Module name "exampleModule", -- Module name
_("example module"), -- name "exampleModule", -- name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers
@@ -85,7 +87,7 @@ local function install_module()
orientation = "vertical", orientation = "vertical",
dt.new_widget("button") dt.new_widget("button")
{ {
label = _("my ") .. "button", label = _("my button"),
clicked_callback = function (_) clicked_callback = function (_)
dt.print(_("button clicked")) dt.print(_("button clicked"))
end end
@@ -110,10 +112,10 @@ local function restart()
end end
-- https://www.darktable.org/lua-api/types_lua_check_button.html -- https://www.darktable.org/lua-api/types_lua_check_button.html
local check_button = dt.new_widget("check_button"){label = _("my ") .. "check_button", value = true} local check_button = dt.new_widget("check_button"){label = _("my check_button"), value = true}
-- https://www.darktable.org/lua-api/types_lua_combobox.html -- https://www.darktable.org/lua-api/types_lua_combobox.html
local combobox = dt.new_widget("combobox"){label = _("my ") .. "combobox", value = 2, "8", "16", "32"} local combobox = dt.new_widget("combobox"){label = _("my combobox"), value = 2, "8", "16", "32"}
-- https://www.darktable.org/lua-api/types_lua_entry.html -- https://www.darktable.org/lua-api/types_lua_entry.html
local entry = dt.new_widget("entry") local entry = dt.new_widget("entry")
@@ -129,14 +131,14 @@ local entry = dt.new_widget("entry")
-- https://www.darktable.org/lua-api/types_lua_file_chooser_button.html -- https://www.darktable.org/lua-api/types_lua_file_chooser_button.html
local file_chooser_button = dt.new_widget("file_chooser_button") local file_chooser_button = dt.new_widget("file_chooser_button")
{ {
title = _("my ") .. "file_chooser_button", -- The title of the window when choosing a file title = _("my file_chooser_button"), -- The title of the window when choosing a file
value = "", -- The currently selected file value = "", -- The currently selected file
is_directory = false -- True if the file chooser button only allows directories to be selecte is_directory = false -- True if the file chooser button only allows directories to be selecte
} }
-- https://www.darktable.org/lua-api/types_lua_label.html -- https://www.darktable.org/lua-api/types_lua_label.html
local label = dt.new_widget("label") local label = dt.new_widget("label")
label.label = _("my ") .. "label" -- This is an alternative way to the "{}" syntax to set a property label.label = _("my label") -- This is an alternative way to the "{}" syntax to set a property
-- https://www.darktable.org/lua-api/types_lua_separator.html -- https://www.darktable.org/lua-api/types_lua_separator.html
local separator = dt.new_widget("separator"){} local separator = dt.new_widget("separator"){}
@@ -144,7 +146,7 @@ local separator = dt.new_widget("separator"){}
-- https://www.darktable.org/lua-api/types_lua_slider.html -- https://www.darktable.org/lua-api/types_lua_slider.html
local slider = dt.new_widget("slider") local slider = dt.new_widget("slider")
{ {
label = _("my ") .. "slider", label = _("my slider"),
soft_min = 10, -- The soft minimum value for the slider, the slider can't go beyond this point soft_min = 10, -- The soft minimum value for the slider, the slider can't go beyond this point
soft_max = 100, -- The soft maximum value for the slider, the slider can't go beyond this point soft_max = 100, -- The soft maximum value for the slider, the slider can't go beyond this point
hard_min = 0, -- The hard minimum value for the slider, the user can't manually enter a value beyond this point hard_min = 0, -- The hard minimum value for the slider, the user can't manually enter a value beyond this point

View File

@@ -72,6 +72,8 @@ local dtsys = require "lib/dtutils.system" -- system utilities
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("multi_os", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -213,7 +215,7 @@ end
if dt.configuration.running_os ~= "linux" then if dt.configuration.running_os ~= "linux" then
local executable = "ufraw-batch" local executable = "ufraw-batch"
local ufraw_batch_path_widget = dt.new_widget("file_chooser_button"){ local ufraw_batch_path_widget = dt.new_widget("file_chooser_button"){
title = string.format(_("select %s executable"), "ufraw-batch[.exe]"), title = _("select ufraw-batch[.exe] executable"),
value = df.get_executable_path_preference(executable), value = df.get_executable_path_preference(executable),
is_directory = false, is_directory = false,
changed_callback = function(self) changed_callback = function(self)
@@ -224,7 +226,7 @@ if dt.configuration.running_os ~= "linux" then
} }
dt.preferences.register("executable_paths", "ufraw-batch", -- name dt.preferences.register("executable_paths", "ufraw-batch", -- name
"file", -- type "file", -- type
'multi_os: ufraw-batch ' .. _('location'), -- label _('multi_os: ufraw-batch location'), -- label
_('installed location of ufraw-batch, requires restart to take effect.'), -- tooltip _('installed location of ufraw-batch, requires restart to take effect.'), -- tooltip
"ufraw-batch", -- default "ufraw-batch", -- default
ufraw_batch_path_widget ufraw_batch_path_widget
@@ -260,7 +262,7 @@ dt.register_event(
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("multi OS"), name = "multi_os",
purpose = _("example module thet runs on different operating systems"), purpose = _("example module thet runs on different operating systems"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/multi_os" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/multi_os"

View File

@@ -61,6 +61,8 @@ local PS = dt.configuration.running_os == "windows" and "\\" or "/"
-- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - -
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("panels_demo", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -93,11 +95,11 @@ dt.gui.panel_show_all()
-- hide center_top, center_bottom, left, top, right, bottom in order -- hide center_top, center_bottom, left, top, right, bottom in order
dt.print(_("hiding all panels, one at a time")) dt.print(_("hiding all panels, one at a tme"))
sleep(1500) sleep(1500)
for i = 1, #panels do for i = 1, #panels do
dt.print(string.format(_("hiding %s"), panels[i])) dt.print(_("hiding " .. panels[i]))
dt.gui.panel_hide(panels[i]) dt.gui.panel_hide(panels[i])
sleep(1500) sleep(1500)
end end
@@ -108,7 +110,7 @@ end
sleep(1500) sleep(1500)
for i = #panels, 1, -1 do for i = #panels, 1, -1 do
dt.print(string.format(_("showing %s"), panels[i])) dt.print(_("showing " .. panels[i]))
dt.gui.panel_show(panels[i]) dt.gui.panel_show(panels[i])
sleep(1500) sleep(1500)
end end
@@ -146,7 +148,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("panels demo"), name = "panels_demo",
purpose = _("example demonstrating how to contol panel visibility"), purpose = _("example demonstrating how to contol panel visibility"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/panels_demo" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/panels_demo"

View File

@@ -28,6 +28,8 @@ local du = require "lib/dtutils"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("preferenceExamples", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -35,7 +37,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("preference examples"), name = "preferenceExamples",
purpose = _("example to show the different preference types that are possible"), purpose = _("example to show the different preference types that are possible"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/preferenceExamples" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/preferenceExamples"
@@ -47,22 +49,22 @@ du.check_min_api_version("2.0.1", "preferenceExamples")
dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference. dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference.
"preferenceExamplesString", -- name "preferenceExamplesString", -- name
"string", -- type "string", -- type
_("example") .. " string", -- label _("example string"), -- label
_("example") .. " string " .. _("tooltip"), -- tooltip _("example string tooltip"), -- tooltip
"String") -- default "String") -- default
dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference. dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference.
"preferenceExamplesBool", -- name "preferenceExamplesBool", -- name
"bool", -- type "bool", -- type
_("example") .. " boolean", -- label _("example boolean"), -- label
_("example") .. " boolean " .. _("tooltip"), -- tooltip _("example boolean tooltip"), -- tooltip
true) -- default true) -- default
dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference. dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference.
"preferenceExamplesInteger", -- name "preferenceExamplesInteger", -- name
"integer", -- type "integer", -- type
_("example") .. " integer", -- label _("example integer"), -- label
_("example") .. " integer " .. _("tooltip"), -- tooltip _("example integer tooltip"), -- tooltip
2, -- default 2, -- default
1, -- min 1, -- min
99) -- max 99) -- max
@@ -70,8 +72,8 @@ dt.preferences.register("preferenceExamples", -- script: This is a string
dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference. dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference.
"preferenceExamplesFloat", -- name "preferenceExamplesFloat", -- name
"float", -- type "float", -- type
_("example") .. " float", -- label _("example float"), -- label
_("example") .. " float " .. _("tooltip"), -- tooltip _("example float tooltip"), -- tooltip
1.3, -- default 1.3, -- default
1, -- min 1, -- min
99, -- max 99, -- max
@@ -80,22 +82,22 @@ dt.preferences.register("preferenceExamples", -- script: This is a string
dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference. dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference.
"preferenceExamplesFile", -- name "preferenceExamplesFile", -- name
"file", -- type "file", -- type
_("example") .. " file", -- label _("example file"), -- label
_("example") .. " file " .. _("tooltip"), -- tooltip _("example file tooltip"), -- tooltip
"") -- default "") -- default
dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference. dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference.
"preferenceExamplesDirectory", -- name "preferenceExamplesDirectory", -- name
"directory", -- type "directory", -- type
_("example") .. " directory", -- label _("example directory"), -- label
_("example") .. " directory " .. _("tooltip"), -- tooltip _("example directory tooltip"), -- tooltip
"") -- default "") -- default
dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference. dt.preferences.register("preferenceExamples", -- script: This is a string used to avoid name collision in preferences (i.e namespace). Set it to something unique, usually the name of the script handling the preference.
"preferenceExamplesEnum", -- name "preferenceExamplesEnum", -- name
"enum", -- type "enum", -- type
_("example") .. " enum", -- label _("example enum"), -- label
_("example") .. " enum " .. _("tooltip"), -- tooltip _("example enum tooltip"), -- tooltip
"Enum 1", -- default "Enum 1", -- default
"Enum 1", "Enum 2") -- values "Enum 1", "Enum 2") -- values

View File

@@ -28,6 +28,8 @@ du.check_min_api_version("5.0.0", "printExamples")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("printExamples", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -58,7 +60,7 @@ dt.print_log("print log")
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("print examples"), name = "printExamples",
purpose = _("example showing the different types of printing messages"), purpose = _("example showing the different types of printing messages"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/printExamples" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/printExamples"

View File

@@ -34,6 +34,8 @@ du.check_min_api_version("5.0.0", "running_os")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("running_os", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -52,7 +54,7 @@ dt.print(string.format(_("you are running: %s"), dt.configuration.running_os))
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("running OS"), name = "running_os",
purpose = _("example of how to determine the operating system being used"), purpose = _("example of how to determine the operating system being used"),
author = "Tobias Jakobs", author = "Tobias Jakobs",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/running_os" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/running_os"

View File

@@ -48,9 +48,6 @@ midi:A-1=iop/colorzones;focus
midi:A#-1=iop/toneequal;focus midi:A#-1=iop/toneequal;focus
midi:B-1=iop/colorbalancergb;focus midi:B-1=iop/colorbalancergb;focus
midi:C0=iop/channelmixerrgb;focus midi:C0=iop/channelmixerrgb;focus
midi:C#0=iop/colorequal;focus
midi:D0=iop/colorequal/page;previous
midi:D#0=iop/colorequal/page;next
]] ]]
local dt = require "darktable" local dt = require "darktable"
@@ -59,6 +56,7 @@ local du = require "lib/dtutils"
du.check_min_api_version("9.2.0", "x-touch") du.check_min_api_version("9.2.0", "x-touch")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("gui_action", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
@@ -69,7 +67,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("x-touch"), name = "x-touch",
purpose = _("example of how to control an x-touch midi device"), purpose = _("example of how to control an x-touch midi device"),
author = "Diederik ter Rahe", author = "Diederik ter Rahe",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/x-touch" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/examples/x-touch"
@@ -122,18 +120,6 @@ for k = 1,8 do
"magenta" } "magenta" }
element = e[k] element = e[k]
-- try if colorequalizer module is focused; if so select element of graph
elseif dt.gui.action("iop/colorequal", "focus") ~= 0 then
local e = { "red",
"orange",
"yellow",
"green",
"cyan",
"blue",
"lavender",
"magenta" }
which = "iop/colorequal/graph"
element = e[k]
-- if the sigmoid rgb primaries is focused, -- if the sigmoid rgb primaries is focused,
-- check sliders -- check sliders

View File

@@ -61,7 +61,7 @@ dtutils.libdoc.functions["check_min_api_version"] = {
function dtutils.check_min_api_version(min_api, script_name) function dtutils.check_min_api_version(min_api, script_name)
local current_api = dt.configuration.api_version_string local current_api = dt.configuration.api_version_string
if dtutils.compare_api_versions(min_api, current_api) > 0 then if min_api > current_api then
dt.print_error("This application is written for lua api version " .. min_api .. " or later.") dt.print_error("This application is written for lua api version " .. min_api .. " or later.")
dt.print_error("The current lua api version is " .. current_api) dt.print_error("The current lua api version is " .. current_api)
dt.print("ERROR: " .. script_name .. " failed to load. Lua API version " .. min_api .. " or later required.") dt.print("ERROR: " .. script_name .. " failed to load. Lua API version " .. min_api .. " or later required.")
@@ -96,7 +96,7 @@ dtutils.libdoc.functions["check_max_api_version"] = {
function dtutils.check_max_api_version(max_api, script_name) function dtutils.check_max_api_version(max_api, script_name)
local current_api = dt.configuration.api_version_string local current_api = dt.configuration.api_version_string
if dtutils.compare_api_versions(current_api, max_api) > 0 then if current_api > max_api then
dt.print_error("This application is written for lua api version " .. max_api .. " or earlier.") dt.print_error("This application is written for lua api version " .. max_api .. " or earlier.")
dt.print_error("The current lua api version is " .. current_api) dt.print_error("The current lua api version is " .. current_api)
dt.print("ERROR: " .. script_name .. " failed to load. Lua API version " .. max_api .. " or earlier required.") dt.print("ERROR: " .. script_name .. " failed to load. Lua API version " .. max_api .. " or earlier required.")
@@ -374,7 +374,7 @@ dtutils.libdoc.functions["deprecated"] = {
du.deprecated(script_name, removal_string) du.deprecated(script_name, removal_string)
script_name - name of the script being deprecated script_name - name of the script being deprecated
removal_string - a string explaining when the script will be removed]], removal_strubg - a string explaining when the script will be removed]],
Description = [[deprecated prints an error message saying the script is deprecated and when it will be removed]], Description = [[deprecated prints an error message saying the script is deprecated and when it will be removed]],
Return_Value = [[]], Return_Value = [[]],
Limitations = [[]], Limitations = [[]],
@@ -391,77 +391,5 @@ function dtutils.deprecated(script_name, removal_string)
dt.print_error("WARNING: " .. script_name .. " is deprecated and will be removed in " .. removal_string) dt.print_error("WARNING: " .. script_name .. " is deprecated and will be removed in " .. removal_string)
end end
dtutils.libdoc.functions["gen_uuid"] = {
Name = [[gen_uuid]],
Synopsis = [[generate a UUID string]],
Usage = [[local du = require "lib/dtutils"
uuid = du.gen_uuid(case)
case - "upper" or "lower" to specify the case of the UUID string]],
Description = [[gen_uuid prints an error message saying the script is gen_uuid and when it will be removed]],
Return_Value = [[uuid - string - a hexidecimal string representing the UUID in the requested case]],
Limitations = [[]],
Example = [[]],
See_Also = [[]],
Reference = [[https://gist.github.com/jrus/3197011]],
License = [[]],
Copyright = [[]],
}
function dtutils.gen_uuid(case)
local template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
-- seed with os.time in seconds and add an extra degree of random for multiple calls in the same second
math.randomseed(os.time(), math.random(0, 65536))
local uuid = string.gsub(template, '[xy]', function (c)
local v = (c == 'x') and math.random(0, 0xf) or math.random(8, 0xb)
return string.format('%x', v)
end
)
if case and case == "upper" then
uuid = string.upper(uuid)
end
return uuid
end
dtutils.libdoc.functions["compare_api_versions"] = {
Name = [[compare_api_versions]],
Synopsis = [[compare two API version strings]],
Usage = [[local du = require "lib/dtutils"
local result = du.compare_api_versions(version1, version2)
version1 - string - the first version string to compare (example: "5.0.0")
version2 - string - the second version string to compare (example: "5.1.0")]],
Description = [[compare_api_versions compares two version strings and returns 1 if version1 is greater,
-1 if version2 is greater, and 0 if they are equal.]],
Return_Value = [[result - 1 if version1 is greater, -1 if version2 is greater, 0 if they are equal.]],
Limitations = [[]],
Example = [[compare_api_versions("5.0.0", "5.1.0") returns -1]],
See_Also = [[]],
Reference = [[]],
License = [[]],
Copyright = [[]],
}
function dtutils.compare_api_versions(version1, version2)
local v1 = {}
for num in version1:gmatch("%d+") do table.insert(v1, tonumber(num)) end
local v2 = {}
for num in version2:gmatch("%d+") do table.insert(v2, tonumber(num)) end
for i = 1, math.max(#v1, #v2) do
local num1 = v1[i] or 0
local num2 = v2[i] or 0
if num1 > num2 then
return 1
elseif num1 < num2 then
return -1
end
end
return 0
end
return dtutils return dtutils

View File

@@ -24,12 +24,15 @@ dtutils_file.libdoc = {
functions = {} functions = {}
} }
local gettext = dt.gettext.gettext local gettext = dt.gettext
du.check_min_api_version("5.0.0", "dtutils.file") du.check_min_api_version("5.0.0", "dtutils.file")
-- Tell gettext where to find the .mo file translating messages for a particular domain
gettext.bindtextdomain("dtutils.file",dt.configuration.config_dir.."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext.dgettext("dtutils.file", msgid)
end end
--[[ --[[
@@ -519,9 +522,9 @@ function dtutils_file.file_copy(fromFile, toFile)
local result = nil local result = nil
-- if cp exists, use it -- if cp exists, use it
if dt.configuration.running_os == "windows" then if dt.configuration.running_os == "windows" then
result = os.execute('copy ' .. dtutils_file.sanitize_filename(fromFile) .. ' ' .. dtutils_file.sanitize_filename(toFile)) result = os.execute('copy "' .. fromFile .. '" "' .. toFile .. '"')
elseif dtutils_file.check_if_bin_exists("cp") then elseif dtutils_file.check_if_bin_exists("cp") then
result = os.execute("cp " .. dtutils_file.sanitize_filename(fromFile) .. ' ' .. dtutils_file.sanitize_filename(toFile)) result = os.execute("cp '" .. fromFile .. "' '" .. toFile .. "'")
end end
-- if cp was not present, or if cp failed, then a pure lua solution -- if cp was not present, or if cp failed, then a pure lua solution
@@ -572,7 +575,7 @@ function dtutils_file.file_move(fromFile, toFile)
if not success then if not success then
-- an error occurred, so let's try using the operating system function -- an error occurred, so let's try using the operating system function
if dtutils_file.check_if_bin_exists("mv") then if dtutils_file.check_if_bin_exists("mv") then
success = os.execute("mv " .. dtutils_file.sanitize_filename(fromFile) .. ' ' .. dtutils_file.sanitize_filename(toFile)) success = os.execute("mv '" .. fromFile .. "' '" .. toFile .. "'")
end end
-- if the mv didn't exist or succeed, then... -- if the mv didn't exist or succeed, then...
if not success then if not success then
@@ -812,7 +815,7 @@ dtutils_file.libdoc.functions["mkdir"] = {
function dtutils_file.mkdir(path) function dtutils_file.mkdir(path)
if not dtutils_file.check_if_file_exists(path) then if not dtutils_file.check_if_file_exists(path) then
local mkdir_cmd = dt.configuration.running_os == "windows" and "mkdir" or "mkdir -p" local mkdir_cmd = dt.configuration.running_os == "windows" and "mkdir" or "mkdir -p"
return dsys.external_command(mkdir_cmd.." "..dtutils_file.sanitize_filename(path)) return dsys.external_command(mkdir_cmd.." "..path)
else else
return 0 return 0
end end
@@ -837,7 +840,7 @@ dtutils_file.libdoc.functions["rmdir"] = {
function dtutils_file.rmdir(path) function dtutils_file.rmdir(path)
local rm_cmd = dt.configuration.running_os == "windows" and "rmdir /S /Q" or "rm -r" local rm_cmd = dt.configuration.running_os == "windows" and "rmdir /S /Q" or "rm -r"
return dsys.external_command(rm_cmd.." "..dtutils_file.sanitize_filename(path)) return dsys.external_command(rm_cmd.." "..path)
end end
dtutils_file.libdoc.functions["create_tmp_file"] = { dtutils_file.libdoc.functions["create_tmp_file"] = {

View File

@@ -3,14 +3,9 @@ local dtutils_string = {}
local dt = require "darktable" local dt = require "darktable"
local du = require "lib/dtutils" local du = require "lib/dtutils"
local log = require "lib/dtutils.log" local log = require "lib/dtutils.log"
local gettext = dt.gettext.gettext
local DEFAULT_LOG_LEVEL = log.error local DEFAULT_LOG_LEVEL = log.error
local function _(msg)
return gettext(msg)
end
dtutils_string.log_level = DEFAULT_LOG_LEVEL dtutils_string.log_level = DEFAULT_LOG_LEVEL
dtutils_string.libdoc = { dtutils_string.libdoc = {
@@ -306,16 +301,8 @@ end
local function _should_be_sanitized(str) local function _should_be_sanitized(str)
local old_log_level = log.log_level() local old_log_level = log.log_level()
local result = false local result = false
local UNSAFE_POSIX_FILENAME_CHARS <const> = "[^%w/._%-]+"
local UNSAFE_WIN_FILENAME_CHARS <const> = "[^%w\\._%-:]+"
local pattern = UNSAFE_POSIX_FILENAME_CHARS
if dt.configuration.running_os == "windows" then
pattern = UNSAFE_WIN_FILENAME_CHARS
end
log.log_level(dtutils_string.log_level) log.log_level(dtutils_string.log_level)
if string.match(str, pattern) then if string.match(str, "[^%g]") then
result = true result = true
end end
log.log_level(old_log_level) log.log_level(old_log_level)
@@ -566,7 +553,6 @@ local PLACEHOLDERS = {"ROLL.NAME",
"MONTH.SHORT", "MONTH.SHORT",
"DAY", "DAY",
"HOUR", "HOUR",
"HOUR.AMPM", -- Not Implemented
"MINUTE", "MINUTE",
"SECOND", "SECOND",
"MSEC", "MSEC",
@@ -577,7 +563,6 @@ local PLACEHOLDERS = {"ROLL.NAME",
"EXIF.MONTH.SHORT", "EXIF.MONTH.SHORT",
"EXIF.DAY", "EXIF.DAY",
"EXIF.HOUR", "EXIF.HOUR",
"EXIF.HOUR.AMPM", -- Not Implemented
"EXIF.MINUTE", "EXIF.MINUTE",
"EXIF.SECOND", "EXIF.SECOND",
"EXIF.MSEC", "EXIF.MSEC",
@@ -586,23 +571,12 @@ local PLACEHOLDERS = {"ROLL.NAME",
"EXIF.ISO", "EXIF.ISO",
"EXIF.EXPOSURE", "EXIF.EXPOSURE",
"EXIF.EXPOSURE.BIAS", "EXIF.EXPOSURE.BIAS",
"EXIF.EXPOSURE.PROGRAM", -- Not Implemented
"EXIF.APERTURE", "EXIF.APERTURE",
"EXIF.CROP.FACTOR", "EXIF.CROP.FACTOR",
"EXIF.FOCAL.LENGTH", "EXIF.FOCAL.LENGTH",
"EXIF.FOCAL.LENGTH.EQUIV", -- Not Implemented "EXIF.FOCAL.LENGTH.EQUIV", -- Not Implemented
"EXIF.FOCUS.DISTANCE", "EXIF.FOCUS.DISTANCE",
"EXIF.MAKER", "IMAGE.EXIF", -- Not Implemented
"EXIF.MODEL",
"EXIF.WHTIEBALANCE", -- Not Implemented
"EXIF.METERING", -- Not Implemented
"EXIF.LENS",
"EXIF.FLASH.ICON", -- Not Implemented
"EXIF.FLASH", -- Not Implemented
"GPS.LONGITUDE", -- Not Implemented
"GPS.LATITUDE", -- Not Implemented
"GPS.ELEVATION", -- Not Implemented
"GPS.LOCATION.ICON", -- Not Implemented
"LONGITUDE", "LONGITUDE",
"LATITUDE", "LATITUDE",
"ELEVATION", "ELEVATION",
@@ -611,6 +585,9 @@ local PLACEHOLDERS = {"ROLL.NAME",
"RATING.ICONS", -- Not Implemented "RATING.ICONS", -- Not Implemented
"LABELS", "LABELS",
"LABELS.ICONS", -- Not Implemented "LABELS.ICONS", -- Not Implemented
"MAKER",
"MODEL",
"LENS",
"TITLE", "TITLE",
"DESCRIPTION", "DESCRIPTION",
"CREATOR", "CREATOR",
@@ -711,7 +688,7 @@ end
-- build the argument substitution list from each image -- build the argument substitution list from each image
function dtutils_string.build_substitute_list(image, sequence, variable_string, username, pic_folder, home, desktop) function dtutils_string.build_substition_list(image, sequence, variable_string, username, pic_folder, home, desktop)
local old_log_level = log.log_level() local old_log_level = log.log_level()
log.log_level(dtutils_string.log_level) log.log_level(dtutils_string.log_level)
@@ -722,8 +699,6 @@ function dtutils_string.build_substitute_list(image, sequence, variable_string,
is_api_9_1 = false is_api_9_1 = false
end end
local is_api_9_4 = dt.configuration.api_version_string >= "9.4.0" and true or false
local datetime = os.date("*t") local datetime = os.date("*t")
local long_month = os.date("%B") local long_month = os.date("%B")
local short_month = os.date("%b") local short_month = os.date("%b")
@@ -734,43 +709,26 @@ function dtutils_string.build_substitute_list(image, sequence, variable_string,
local labels = get_colorlabels(image) local labels = get_colorlabels(image)
local datetime_taken = ""
local use_millisecs = false
if dt.preferences.read("darktable", "lighttable/ui/milliseconds", "bool") and is_api_9_1 then
use_millisecs = true
end
if image.exif_datetime_taken and image.exif_datetime_taken ~= "" then
datetime_taken = image.exif_datetime_taken
else
if use_millisecs then
datetime_taken = "0000:00:00 00:00:00.0"
else
datetime_taken = "0000:00:00 00:00:00"
end
end
local eyear, emon, eday, ehour, emin, esec, emsec local eyear, emon, eday, ehour, emin, esec, emsec
if use_millisecs then if dt.preferences.read("darktable", "lighttable/ui/milliseconds", "bool") and is_api_9_1 then
eyear, emon, eday, ehour, emin, esec, emsec = eyear, emon, eday, ehour, emin, esec, emsec =
string.match(datetime_taken, "(%d+):(%d+):(%d+) (%d+):(%d+):(%d+)%.(%d+)$") string.match(image.exif_datetime_taken, "(%d+):(%d+):(%d+) (%d+):(%d+):(%d+)%.(%d+)$")
else else
emsec = "0" emsec = "0"
eyear, emon, eday, ehour, emin, esec = eyear, emon, eday, ehour, emin, esec =
string.match(datetime_taken, "(%d+):(%d+):(%d+) (%d+):(%d+):(%d+)$") string.match(image.exif_datetime_taken, "(%d+):(%d+):(%d+) (%d+):(%d+):(%d+)$")
end end
local version_multi = #image:get_group_members() > 1 and image.version or ""
local version_multi = #image:get_group_members() > 1 and image.duplicate_index or "" local replacements = {image.film.path, -- ROLL.NAME
local replacements = {dtutils_string.get_basename(image.film.path),-- ROLL.NAME
image.path, -- FILE.FOLDER image.path, -- FILE.FOLDER
dtutils_string.get_basename(image.filename),-- FILE.NAME image.filename, -- FILE.NAME
dtutils_string.get_filetype(image.filename),-- FILE.EXTENSION dtutils_string.get_filetype(image.filename),-- FILE.EXTENSION
image.id, -- ID image.id, -- ID
image.duplicate_index, -- VERSION image.duplicate_index, -- VERSION
version_multi, -- VERSION.IF_MULTI version_multi, -- VERSION.IF_MULTI
image.version_name and image.version_name or "", -- VERSION.NAME image.version_name, -- VERSION.NAME
dt.configuration.version, -- DARKTABLE.VERSION dt.configuration.version, -- DARKTABLE.VERSION
"", -- DARKTABLE.NAME "", -- DARKTABLE.NAME
string.format("%04d", sequence), -- SEQUENCE string.format("%04d", sequence), -- SEQUENCE
@@ -791,18 +749,16 @@ function dtutils_string.build_substitute_list(image, sequence, variable_string,
short_month, -- MONTH.SHORT short_month, -- MONTH.SHORT
string.format("%02d", datetime.day), -- DAY string.format("%02d", datetime.day), -- DAY
string.format("%02d", datetime.hour), -- HOUR string.format("%02d", datetime.hour), -- HOUR
"", -- HOUR.AMPM
string.format("%02d", datetime.min), -- MINUTE string.format("%02d", datetime.min), -- MINUTE
string.format("%02d", datetime.sec), -- SECOND string.format("%02d", datetime.sec), -- SECOND
0, -- MSEC 0, -- MSEC
eyear, -- EXIF.YEAR eyear, -- EXIF.YEAR
string.sub(eyear, 3), -- EXIF.YEAR.SHORT string.sub(eyear, 3), -- EXIF.YEAR.SHORT
emon, -- EXIF.MONTH emon, -- EXIF.MONTH
os.date("%B", exiftime2systime(datetime_taken)), -- EXIF.MONTH.LONG os.date("%B", exiftime2systime(image.exif_datetime_taken)), -- EXIF.MONTH.LONG
os.date("%b", exiftime2systime(datetime_taken)), -- EXIF.MONTH.SHORT os.date("%b", exiftime2systime(image.exif_datetime_taken)), -- EXIF.MONTH.SHORT
eday, -- EXIF.DAY eday, -- EXIF.DAY
ehour, -- EXIF.HOUR ehour, -- EXIF.HOUR
"", -- EXIF.HOUR.AMPM
emin, -- EXIF.MINUTE emin, -- EXIF.MINUTE
esec, -- EXIF.SECOND esec, -- EXIF.SECOND
emsec, -- EXIF.MSEC emsec, -- EXIF.MSEC
@@ -811,23 +767,12 @@ function dtutils_string.build_substitute_list(image, sequence, variable_string,
string.format("%d", image.exif_iso), -- EXIF.ISO string.format("%d", image.exif_iso), -- EXIF.ISO
string.format("%.0f", 1./image.exif_exposure), -- EXIF.EXPOSURE string.format("%.0f", 1./image.exif_exposure), -- EXIF.EXPOSURE
image.exif_exposure_bias, -- EXIF.EXPOSURE.BIAS image.exif_exposure_bias, -- EXIF.EXPOSURE.BIAS
"", -- EXIF.EXPOSURE.PROGRAM
string.format("%.01f", image.exif_aperture), -- EXIF.APERTURE string.format("%.01f", image.exif_aperture), -- EXIF.APERTURE
string.format("%.01f", image.exif_crop),-- EXIF.CROP_FACTOR string.format("%.01f", image.exif_crop),-- EXIF.CROP_FACTOR
string.format("%.0f", image.exif_focal_length), -- EXIF.FOCAL.LENGTH string.format("%.0f", image.exif_focal_length), -- EXIF.FOCAL.LENGTH
string.format("%.0f", image.exif_focal_length * image.exif_crop), -- EXIF.FOCAL.LENGTH.EQUIV string.format("%.0f", image.exif_focal_length * image.exif_crop), -- EXIF.FOCAL.LENGTH.EQUIV
image.exif_focus_distance, -- EXIF.FOCUS.DISTANCE image.exif_focus_distance, -- EXIF.FOCUS.DISTANCE
image.exif_maker, -- EXIF.MAKER "", -- IMAGE.EXIF
image.exif_model, -- EXIF.MODEL
is_api_9_4 and image.exif_whitebalance or "", -- EXIF.WHITEBALANCE
is_api_9_4 and image.exif_metering_mode or "", -- EXIF.METERING
image.exif_lens, -- LENS
"", -- EXIF.FLASH.ICON
is_api_9_4 and image.exif_flash or "", -- EXIF.FLASH
"", -- GPS.LONGITUDE
"", -- GPS.LATITUDE
"", -- GPS.ELEVATION
"", -- GPS.LOCATION.ICON
image.longitude or "", -- LONGITUDE image.longitude or "", -- LONGITUDE
image.latitude or "", -- LATITUDE image.latitude or "", -- LATITUDE
image.elevation or "", -- ELEVATION image.elevation or "", -- ELEVATION
@@ -836,11 +781,14 @@ function dtutils_string.build_substitute_list(image, sequence, variable_string,
"", -- RATING.ICONS - wont be implemented "", -- RATING.ICONS - wont be implemented
labels, -- LABELS labels, -- LABELS
"", -- LABELS.ICONS - wont be implemented "", -- LABELS.ICONS - wont be implemented
image.title and image.title or "", -- TITLE image.exif_maker, -- MAKER
image.description and image.description or "", -- DESCRIPTION image.exif_model, -- MODEL
image.creator and image.creator or "", -- CREATOR image.exif_lens, -- LENS
image.publisher and image.publisher or "", -- PUBLISHER image.title, -- TITLE
image.rights and image.rights or "", -- RIGHTS image.description, -- DESCRIPTION
image.creator, -- CREATOR
image.publisher, -- PUBLISHER
image.rights, -- RIGHTS
"", -- TAGS - wont be implemented "", -- TAGS - wont be implemented
"", -- SIDECAR.TXT - wont be implemented "", -- SIDECAR.TXT - wont be implemented
pictures_folder, -- FOLDER.PICTURES pictures_folder, -- FOLDER.PICTURES
@@ -866,114 +814,6 @@ function dtutils_string.build_substitute_list(image, sequence, variable_string,
log.log_level(old_log_level) log.log_level(old_log_level)
end end
dtutils_string.libdoc.functions["get_substitution_tooltip"] = {
Name = [[get_substitution_tooltip]],
Synopsis = [[get a tooltip that lists the substitution variables]],
Usage = [[local ds = require "lib/dtutils.string"
ds.get_substitution_tooltip()
Description = [[get_substitution_tooltip lists the variables with brief explanations]],
Return_Value = [[string - the tooltip]],
Limitations = [[]],
Example = [[]],
See_Also = [[https://docs.darktable.org/usermanual/4.6/en/special-topics/variables/]],
Reference = [[]],
License = [[]],
Copyright = [[]],
}
function dtutils_string.get_substitution_tooltip()
return table.concat({
_("$(ROLL.NAME) - roll of the input image"),
_("$(FILE.FOLDER) - folder containing the input image"),
_("$(FILE.NAME) - basename of the input image"),
_("$(FILE.EXTENSION) - extension of the input image"),
_("$(ID) - image ID"),
_("$(VERSION) - duplicate version"),
_("$(VERSION.IF_MULTI) - same as $(VERSION) but null string if only one version exists"),
_("$(VERSION.NAME) - version name from metadata"),
_("$(DARKTABLE.VERSION) - current darktable version"),
-- _("$(DARKTABLE.NAME) - darktable name"), -- not implemented
_("$(SEQUENCE[n,m]) - sequence number, n: number of digits, m: start number"),
_("$(WIDTH.SENSOR) - image sensor width"),
_("$(HEIGHT.SENSOR) - image sensor height"),
_("$(WIDTH.RAW) - RAW image width"),
_("$(HEIGHT.RAW) - RAW image height"),
_("$(WIDTH.CROP) - image width after crop"),
_("$(HEIGHT.CROP) - image height after crop"),
_("$(WIDTH.EXPORT) - exported image width"),
_("$(HEIGHT.EXPORT) - exported image height"),
-- _("$(WIDTH.MAX) - maximum image export width"), -- not implemented
-- _("$(HEIGHT.MAX) - maximum image export height"), -- not implemented
_("$(YEAR) - year"),
_("$(YEAR.SHORT) - year without century"),
_("$(MONTH) - month"),
_("$(MONTH.LONG) - full month name according to the current locale"),
_("$(MONTH.SHORT) - abbreviated month name according to the current locale"),
_("$(DAY) - day"),
_("$(HOUR) - hour"),
-- _("$(HOUR.AMPM) - hour, 12-hour clock"), -- not implemented
_("$(MINUTE) - minute"),
_("$(SECOND) - second"),
_("$(MSEC) - millisecond"),
_("$(EXIF.YEAR) - EXIF year"),
_("$(EXIF.YEAR.SHORT) - EXIF year without century"),
_("$(EXIF.MONTH) - EXIF month"),
_("$(EXIF.MONTH.LONG) - full EXIF month name according to the current locale"),
_("$(EXIF.MONTH.SHORT) - abbreviated EXIF month name according to the current locale"),
_("$(EXIF.DAY) - EXIF day"),
_("$(EXIF.HOUR) - EXIF hour"),
-- _("$(EXIF.HOUR.AMPM) - EXIF hour, 12-hour clock") .. "\n" .. -- not implemented
_("$(EXIF.MINUTE) - EXIF minute"),
_("$(EXIF.SECOND) - EXIF second"),
_("$(EXIF.MSEC) - EXIF millisecond"),
-- _("$(EXIF.DATE.REGIONAL) - localized EXIF date"), -- not implemented
-- _("$(EXIF.TIME.REGIONAL) - localized EXIF time"), -- not implemented
_("$(EXIF.ISO) - ISO value"),
_("$(EXIF.EXPOSURE) - EXIF exposure"),
_("$(EXIF.EXPOSURE.BIAS) - EXIF exposure bias"),
-- _("$(EXIF.EXPOSURE.PROGRAM) - EXIF exposure program"), -- not implemented
_("$(EXIF.APERTURE) - EXIF aperture"),
_("$(EXIF.CROP_FACTOR) - EXIF crop factor"),
_("$(EXIF.FOCAL.LENGTH) - EXIF focal length"),
_("$(EXIF.FOCAL.LENGTH.EQUIV) - EXIF 35 mm equivalent focal length"),
_("$(EXIF.FOCUS.DISTANCE) - EXIF focal distance"),
_("$(EXIF.MAKER) - camera maker") ..
_("$(EXIF.MODEL) - camera model") ..
_("$(EXIF.WHITEBALANCE) - EXIF selected white balance") .. -- not implemented
_("$(EXIF.METERING) - EXIF exposure metering mode") .. -- not implemented
_("$(EXIF.LENS) - lens") ..
-- _("$(EXIF.FLASH.ICON) - icon indicating whether flash was used") .. -- not implemented
_("$(EXIF.FLASH) - was flash used (yes/no/--)") .. -- not implemented
-- _("$(GPS.LONGITUDE) - longitude"),-- not implemented
-- _("$(GPS.LATITUDE) - latitude"),-- not implemented
-- _("$(GPS.ELEVATION) - elevation"),-- not implemented
-- _("$(GPS.LOCATION.ICON) - icon indicating whether GPS location is known"),-- not implemented
_("$(LONGITUDE) - longitude"),
_("$(LATITUDE) - latitude"),
_("$(ELEVATION) - elevation"),
_("$(STARS) - star rating as number (-1 for rejected)"),
-- _("$(RATING.ICONS) - star/reject rating in icon form"),-- not implemented
_("$(LABELS) - color labels as text"),
-- _("$(LABELS.ICONS) - color labels as icons"),-- not implemented
_("$(TITLE) - title from metadata"),
_("$(DESCRIPTION) - description from metadata"),
_("$(CREATOR) - creator from metadata"),
_("$(PUBLISHER) - publisher from metadata"),
_("$(RIGHTS) - rights from metadata"),
--_("$(TAGS) - tags as set in metadata settings"),
_("$(CATEGORY[n,category]) - subtag of level n in hierarchical tags"),
_("$(SIDECAR_TXT) - contents of .txt sidecar file, if present"),
_("$(FOLDER.PICTURES) - pictures folder"),
_("$(FOLDER.HOME) - home folder"),
_("$(FOLDER.DESKTOP) - desktop folder"),
-- _("$(OPENCL.ACTIVATED) - whether OpenCL is activated"),
_("$(USERNAME) - login name"),
-- _("$(NL) - newline"),
-- _("$(JOBCODE) - job code for import"),
""}, "\n")
end
-- handle different versions of names -- handle different versions of names
local function check_legacy_vars(var_name) local function check_legacy_vars(var_name)
@@ -1007,11 +847,10 @@ local function treat(var_string)
if string.match(var_string, "CATEGORY%d") or string.match(var_string, "CATEGORY%[") then if string.match(var_string, "CATEGORY%d") or string.match(var_string, "CATEGORY%[") then
log.msg(log.info, "substituting for " .. var_string) log.msg(log.info, "substituting for " .. var_string)
ret_val = substitutes[var_string] ret_val = substitutes[var_string]
if not ret_val then ret_val = "" end
log.msg(log.info, "ret_val is " .. ret_val) log.msg(log.info, "ret_val is " .. ret_val)
elseif string.match(var_string, "SEQUENCE%[") then elseif string.match(var_string, "SEQUENCE%[") then
local width, start = string.match(var_string, "(%d+),(%d+)") local start, width = string.match(var_string, "(%d+),(%d)")
local seq_val = tonumber(substitutes[var]) local seq_val = tonumber(substitutes[var])
local pat = "%0" .. width .. "d" local pat = "%0" .. width .. "d"
substitutes[var_string] = string.format(pat, start + (seq_val - 1)) substitutes[var_string] = string.format(pat, start + (seq_val - 1))

View File

@@ -86,13 +86,8 @@ function dtutils_system.windows_command(command)
local file = io.open(fname, "w") local file = io.open(fname, "w")
if file then if file then
dt.print_log("opened file") dt.print_log("opened file")
file:write("@echo off\n") command = string.gsub(command, "%%", "%%%%") -- escape % from windows shell
file:write('for /f "tokens=2 delims=:." %%x in (\'chcp\') do set cp=%%x\n') file:write(command)
file:write("chcp 65001>nul\n") -- change the encoding of the terminal to handle non-english characters in path
file:write("\n")
file:write(command .. "\n")
file:write("\n")
file:write("chcp %cp%>nul\n")
file:close() file:close()
result = dt.control.execute(fname) result = dt.control.execute(fname)

View File

@@ -14,7 +14,7 @@ msgstr ""
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n" "X-Generator: Poedit 1.5.4\n"
"Language: de_DE\n" "Language: de_DE\n"

View File

@@ -1,514 +0,0 @@
--[[
apply_camera_style.lua - apply camera style to matching images
Copyright (C) 2024 Bill Ferguson <wpferguson@gmail.com>.
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 <http://www.gnu.org/licenses/>.
]]
--[[
apply_camera_style - apply darktable camera style to matching images
apply a camera style corresponding to the camera used to
take the image to provide a starting point for editing that
is similar to the SOOC jpeg.
ADDITIONAL SOFTWARE NEEDED FOR THIS SCRIPT
none
USAGE
start the script from script_manager
BUGS, COMMENTS, SUGGESTIONS
Bill Ferguson <wpferguson@gmail.com>
CHANGES
20251202 - fixed pattern matching bugs affecting Canon EOS R? series
styles and styles being applied twice if images are reimported
Added more debugging statements to pattern matching functions
]]
local dt = require "darktable"
local du = require "lib/dtutils"
-- local df = require "lib/dtutils.file"
local ds = require "lib/dtutils.string"
-- local dtsys = require "lib/dtutils.system"
local log = require "lib/dtutils.log"
-- local debug = require "darktable.debug"
-- - - - - - - - - - - - - - - - - - - - - - - -
-- C O N S T A N T S
-- - - - - - - - - - - - - - - - - - - - - - - -
local MODULE <const> = "apply_camera_style"
local DEFAULT_LOG_LEVEL <const> = log.warn
local TMP_DIR <const> = dt.configuration.tmp_dir
local STYLE_PREFIX <const> = "_l10n_darktable|_l10n_camera styles|"
local MAKER = 3
local STYLE = 4
-- path separator
local PS <const> = dt.configuration.running_os == "windows" and "\\" or "/"
-- command separator
local CS <const> = dt.configuration.running_os == "windows" and "&" or ";"
-- - - - - - - - - - - - - - - - - - - - - - - -
-- A P I C H E C K
-- - - - - - - - - - - - - - - - - - - - - - - -
du.check_min_api_version("9.4.0", MODULE) -- camera styles added to darktable 5.0
-- - - - - - - - - - - - - - - - - - - - - - - - - -
-- I 1 8 N
-- - - - - - - - - - - - - - - - - - - - - - - - - -
local gettext = dt.gettext.gettext
local function _(msgid)
return gettext(msgid)
end
-- - - - - - - - - - - - - - - - - - - - - - - - - -
-- 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
script_data.metadata = {
name = _("apply camera style"), -- name of script
purpose = _("apply darktable camera style to matching images"), -- purpose of script
author = "Bill Ferguson <wpferguson@gmail.com>", -- your name and optionally e-mail address
help = "https://docs.darktable.org/lua/development/lua.scripts.manual/scripts/official/apply_camera_style/" -- URL to help/documentation
}
-- - - - - - - - - - - - - - - - - - - - - - - -
-- L O G L E V E L
-- - - - - - - - - - - - - - - - - - - - - - - -
log.log_level(DEFAULT_LOG_LEVEL)
-- - - - - - - - - - - - - - - - - - - - - - - -
-- N A M E S P A C E
-- - - - - - - - - - - - - - - - - - - - - - - -
local apply_camera_style = {}
-- - - - - - - - - - - - - - - - - - - - - - - -
-- G L O B A L V A R I A B L E S
-- - - - - - - - - - - - - - - - - - - - - - - -
apply_camera_style.imported_images = {}
apply_camera_style.styles = {}
apply_camera_style.log_level = DEFAULT_LOG_LEVEL
-- - - - - - - - - - - - - - - - - - - - - - - -
-- P R E F E R E N C E S
-- - - - - - - - - - - - - - - - - - - - - - - -
-- - - - - - - - - - - - - - - - - - - - - - - -
-- A L I A S E S
-- - - - - - - - - - - - - - - - - - - - - - - -
local namespace = apply_camera_style
local acs = apply_camera_style
-- - - - - - - - - - - - - - - - - - - - - - - -
-- F U N C T I O N S
-- - - - - - - - - - - - - - - - - - - - - - - -
-------------------
-- helper functions
-------------------
local function set_log_level(level)
local old_log_level = log.log_level()
log.log_level(level)
return old_log_level
end
local function restore_log_level(level)
log.log_level(level)
end
-------------------
-- script functions
-------------------
local function process_pattern(pattern)
local log_level = set_log_level(acs.log_level)
log.msg(log.debug, "input pattern is " .. pattern)
pattern = string.lower(pattern)
log.msg(log.debug, "lower case pattern is " .. pattern)
-- strip off series
pattern = string.gsub(pattern, " series$", "?")
log.msg(log.debug, "series stripped off pattern is " .. pattern)
-- match a character
if string.match(pattern, "r%?%?$") then
-- handle EOS R case
pattern = string.gsub(pattern, "%?%?", ".?")
log.msg(log.debug, "matched EOS R pattern is " .. pattern)
else
pattern = string.gsub(pattern, "?", ".")
log.msg(log.debug, "didn't match EOS R pattern is " .. pattern)
end
-- escape dashes
pattern = string.gsub(pattern, "%-", "%%-")
log.msg(log.debug, "escape dashes conditional pattern is " .. pattern)
-- make spaces optional
pattern = string.gsub(pattern, " ", " ?")
-- until we end up with a set, I'll defer set processing, i.e. [...]
--log.msg(log.debug, "make spaces conditional again? pattern is " .. pattern)
-- anchor the pattern to ensure we don't short match
pattern = "^" .. pattern .. "$"
log.msg(log.debug, "anchored pattern is " .. pattern)
restore_log_level(log_level)
return pattern
end
local function process_set(pattern_set)
local log_level = set_log_level(acs.log_level)
local to_process = {}
local processed = {}
local base, set, tail
if string.match(pattern_set, "]$") then
base, set = string.match(pattern_set, "(.+)%[(.+)%]")
else
base, set, tail = string.match(pattern_set, "(.+)%[(.+)%](.+)")
end
log.msg(log.debug, "base is " .. base .. " and set is " .. set)
to_process = du.split(set, ",")
for _, item in ipairs(to_process) do
local pat = base .. item
if tail then
pat = pat .. tail
end
table.insert(processed, process_pattern(pat))
end
restore_log_level(log_level)
return processed
end
local function get_camera_styles()
local log_level = set_log_level(acs.log_level)
-- separate the styles into
--
-- acs.styles -
-- maker -
-- styles {}
-- patterns {}
for _, style in ipairs(dt.styles) do
if string.match(style.name, STYLE_PREFIX) then
log.msg(log.debug, "got " .. style.name)
local parts = du.split(style.name, "|")
parts[MAKER] = string.lower(parts[MAKER])
log.msg(log.debug, "maker is " .. parts[MAKER])
if not acs.styles[parts[MAKER]] then
acs.styles[parts[MAKER]] = {}
acs.styles[parts[MAKER]]["styles"] = {}
acs.styles[parts[MAKER]]["patterns"] = {}
end
if parts[STYLE] then
if not string.match(parts[STYLE], "]") then
table.insert(acs.styles[parts[MAKER]].styles, style)
local processed_pattern = process_pattern(parts[#parts])
table.insert(acs.styles[parts[MAKER]].patterns, processed_pattern)
log.msg(log.debug, "pattern for " .. style.name .. " is " .. processed_pattern)
else
local processed_patterns = process_set(parts[STYLE])
for _, pat in ipairs(processed_patterns) do
table.insert(acs.styles[parts[MAKER]].styles, style)
table.insert(acs.styles[parts[MAKER]].patterns, pat)
log.msg(log.debug, "pattern for " .. style.name .. " is " .. pat)
end
end
end
end
end
restore_log_level(log_level)
end
local function normalize_model(maker, model)
local log_level = set_log_level(acs.log_level)
model = string.lower(model)
-- strip off the maker name
if maker == "canon" then
model = string.gsub(model, "canon ", "")
elseif maker == "hasselblad" then
model = string.gsub(model, "hasselblad ", "")
elseif maker == "leica" then
model = string.gsub(model, "leica ", "")
elseif maker == "lg" then
model = string.gsub(model, "lg ", "")
elseif maker == "nikon" then
model = string.gsub(model, "nikon ", "")
elseif maker == "nokia" then
model = string.gsub(model, "nokia ", "")
elseif maker == "oneplus" then
model = string.gsub(model, "oneplus ", "")
elseif maker == "pentax" then
model = string.gsub(model, "pentax ", "")
model = string.gsub(model, "ricoh ", "")
end
restore_log_level(log_level)
return model
end
local function normalize_maker(maker)
local log_level = set_log_level(acs.log_level)
maker = string.lower(maker)
if string.match(maker, "^fujifilm") then
maker = "fujifilm"
elseif string.match(maker, "^hmd ") then
maker = "nokia"
elseif string.match(maker, "^leica") then
maker = "leica"
elseif string.match(maker, "^minolta") then
maker = "minolta"
elseif string.match(maker, "^nikon") then
maker = "nikon"
elseif string.match(maker, "^om ") then
maker = "om system"
elseif string.match(maker, "^olympus") then
maker = "olympus"
elseif string.match(maker, "^pentax") or string.match(maker, "^ricoh") then
maker = "pentax"
end
restore_log_level(log_level)
return maker
end
local function has_style_tag(image, tag_name)
local log_level = set_log_level(acs.log_level)
local result = false
log.msg(log.debug, "looking for tag " .. tag_name)
for _, tag in ipairs(image:get_tags()) do
log.msg(log.debug, "got attached tag " .. tag.name)
local cleaned_tag_name = string.gsub(tag_name, "_l10n_", "")
log.msg(log.debug, "checking against " .. cleaned_tag_name)
if ds.sanitize_lua(tag.name) == cleaned_tag_name then
log.msg(log.debug, "matched tag " .. cleaned_tag_name)
result = true
end
end
restore_log_level(log_level)
return result
end
local function mangle_model(model)
local log_level = set_log_level(acs.log_level)
if string.match(model, "eos") then
log.msg(log.debug, "mangle model got " .. model)
model = string.gsub(model, "r6m2", "r6 mark ii")
model = string.gsub(model, "eos 350d digital", "eos kiss digital n")
model = string.gsub(model, "eos 500d", "eos rebel t1")
model = string.gsub(model, "eos 550d", "eos rebel t2")
model = string.gsub(model, "eos 600d", "eos rebel t3i")
model = string.gsub(model, "eos 650d", "eos rebel t4i")
model = string.gsub(model, "eos 700d", "eos rebel t5")
model = string.gsub(model, "eos 750d", "eos rebel t6i")
model = string.gsub(model, "eos 760d", "eos rebel t6s")
model = string.gsub(model, "eos 100d", "eos rebel t6")
model = string.gsub(model, "eos 1100d", "eos rebel t3")
model = string.gsub(model, "eos 1200d", "eos rebel t5")
model = string.gsub(model, "eos 1300d", "eos rebel t6")
model = string.gsub(model, "eos 2000d", "eos rebel t7")
log.msg(log.debug, "mangle model returning " .. model)
end
restore_log_level(log_level)
return model
end
local function stop_job()
if acs.job then
if acs.job.valid then
acs.job.valid = false
end
end
end
local function apply_style_to_images(images)
local log_level = set_log_level(acs.log_level)
acs.job = dt.gui.create_job(_("applying camera styles to images"), true, stop_job)
for count, image in ipairs(images) do
local maker = normalize_maker(image.exif_maker)
local model = normalize_model(maker, image.exif_model)
model = mangle_model(model)
log.msg(log.debug, "got maker " .. maker .. " and model " .. model .. " from image " .. image.filename)
if acs.styles[maker] then
local no_match = true
for i, pattern in ipairs(acs.styles[maker].patterns) do
log.msg(log.debug, "pattern is " .. pattern)
if string.match(model, pattern) or
(i == #acs.styles[maker].patterns and string.match(pattern, "generic")) then
local tag_name = "darktable|style|" .. acs.styles[maker].styles[i].name
if not has_style_tag(image, tag_name) then
image:apply_style(acs.styles[maker].styles[i])
log.msg(log.info, "applied style " .. acs.styles[maker].styles[i].name .. " to " .. image.filename)
end
no_match = false
log.log_level(loglevel)
break
end
end
if no_match then
log.msg(log.info, "no style found for " .. maker .. " " .. model)
end
else
log.msg(log.info, "no maker found for " .. image.filename)
end
if count % 10 == 0 then
acs.job.percent = count / #images
end
if dt.control.ending then
stop_job()
end
end
stop_job()
restore_log_level(log_level)
end
local function apply_camera_style(collection)
local log_level = set_log_level(acs.log_level)
local images = nil
if collection == true then
images = dt.collection
log.msg(log.info, "applying camera styles to collection")
elseif collection == false then
images = dt.gui.selection()
if #images == 0 then
images = dt.gui.action_images
end
log.msg(log.info, "applying camera styles to selection")
end
apply_style_to_images(images)
restore_log_level(log_level)
end
-- - - - - - - - - - - - - - - - - - - - - - - -
-- M A I N P R O G R A M
-- - - - - - - - - - - - - - - - - - - - - - - -
get_camera_styles()
-- - - - - - - - - - - - - - - - - - - - - - - -
-- U S E R I N T E R F A C E
-- - - - - - - - - - - - - - - - - - - - - - - -
-- - - - - - - - - - - - - - - - - - - - - - - -
-- D A R K T A B L E I N T E G R A T I O N
-- - - - - - - - - - - - - - - - - - - - - - - -
local function destroy()
dt.destroy_event(MODULE, "post-import-image")
dt.destroy_event(MODULE, "post-import-film")
end
script_data.destroy = destroy
-- - - - - - - - - - - - - - - - - - - - - - - -
-- E V E N T S
-- - - - - - - - - - - - - - - - - - - - - - - -
dt.register_event(MODULE, "shortcut",
function(event, shortcut)
apply_camera_style(true)
end, _("apply darktable camera styles to collection")
)
dt.register_event(MODULE, "shortcut",
function(event, shortcut)
apply_camera_style(false)
end, _("apply darktable camera styles to selection")
)
dt.register_event(MODULE, "post-import-image",
function(event, image)
if image.is_raw then
table.insert(acs.imported_images, image)
end
end
)
dt.register_event(MODULE, "post-import-film",
function(event, film)
apply_style_to_images(acs.imported_images)
acs.imported_images = {}
end
)
return script_data

View File

@@ -36,6 +36,8 @@ du.check_min_api_version("2.0.0", "check_for_updates")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("check_for_updates", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -45,7 +47,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("check for updates"), name = "check_for_updates",
purpose = _("check for newer darktable releases"), purpose = _("check for newer darktable releases"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/check_for_updates" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/check_for_updates"

View File

@@ -31,6 +31,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "copy_paste_metadata") du.check_min_api_version("7.0.0", "copy_paste_metadata")
dt.gettext.bindtextdomain("copy_paste_metadata", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -40,7 +42,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("copy paste metadata"), name = "copy_paste_metadata",
purpose = _("adds keyboard shortcuts and buttons to copy/paste metadata between images"), purpose = _("adds keyboard shortcuts and buttons to copy/paste metadata between images"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/copy_paste_metadata" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/copy_paste_metadata"

View File

@@ -35,6 +35,8 @@ du.check_min_api_version("2.0.0", "delete_long_tags")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("delete_long_tags", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -44,7 +46,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("delete long tags"), name = "delete_long_tags",
purpose = _("delete all tags longer than a set length"), purpose = _("delete all tags longer than a set length"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/delete_long_tags" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/delete_long_tags"

View File

@@ -39,6 +39,8 @@ end
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("delete_unused_tags", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -48,7 +50,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("delete unused tags"), name = "delete_unused_tags",
purpose = _("delete unused tags"), purpose = _("delete unused tags"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/delete_unused_tags" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/delete_unused_tags"

View File

@@ -43,6 +43,8 @@ local gettext = dt.gettext.gettext
du.check_min_api_version("7.0.0", "enfuse") du.check_min_api_version("7.0.0", "enfuse")
dt.gettext.bindtextdomain("enfuse", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -52,7 +54,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("enfuse"), name = "enfuse",
purpose = _("exposure blend images"), purpose = _("exposure blend images"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/enfuse" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/enfuse"
@@ -72,7 +74,7 @@ local function install_module()
if not enf.module_installed then if not enf.module_installed then
dt.register_lib( dt.register_lib(
"enfuse", -- plugin name "enfuse", -- plugin name
_("enfuse"), -- name "enfuse", -- name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_RIGHT_CENTER", 100}}, -- containers
@@ -135,7 +137,7 @@ if enfuse_installed then
if version < "4.2" then if version < "4.2" then
exposure_mu = dt.new_widget("slider") exposure_mu = dt.new_widget("slider")
{ {
label = _("exposure mu"), label = "exposure mu",
tooltip = _("center also known as mean of gaussian weighting function (0 <= mean <= 1); default: 0.5"), tooltip = _("center also known as mean of gaussian weighting function (0 <= mean <= 1); default: 0.5"),
hard_min = 0, hard_min = 0,
hard_max = 1, hard_max = 1,
@@ -144,7 +146,7 @@ if enfuse_installed then
else else
exposure_mu = dt.new_widget("slider") exposure_mu = dt.new_widget("slider")
{ {
label = _("exposure optimum"), label = "exposure optimum",
tooltip = _("optimum exposure value, usually the maximum of the weighting function (0 <= optimum <=1); default 0.5"), tooltip = _("optimum exposure value, usually the maximum of the weighting function (0 <= optimum <=1); default 0.5"),
hard_min = 0, hard_min = 0,
hard_max = 1, hard_max = 1,
@@ -154,7 +156,7 @@ if enfuse_installed then
local depth = dt.new_widget("combobox") local depth = dt.new_widget("combobox")
{ {
label = _("depth"), label = "depth",
tooltip = _("the number of bits per channel of the output image"), tooltip = _("the number of bits per channel of the output image"),
value = dt.preferences.read("enfuse", "depth", "integer"), value = dt.preferences.read("enfuse", "depth", "integer"),
changed_callback = function(w) dt.preferences.write("enfuse", "depth", "integer", w.selected) end, changed_callback = function(w) dt.preferences.write("enfuse", "depth", "integer", w.selected) end,
@@ -163,7 +165,7 @@ if enfuse_installed then
local blend_colorspace = dt.new_widget("combobox") local blend_colorspace = dt.new_widget("combobox")
{ {
label = _("blend colorspace"), label = "blend colorspace",
tooltip = _("force blending in selected colorspace"), tooltip = _("force blending in selected colorspace"),
changed_callback = function(w) dt.preferences.write("enfuse", "blend_colorspace", "string", w.selected) end, changed_callback = function(w) dt.preferences.write("enfuse", "blend_colorspace", "string", w.selected) end,
"", "identity", "ciecam" "", "identity", "ciecam"

View File

@@ -40,6 +40,8 @@ require "darktable.debug"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("generate_image_txt", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -51,7 +53,7 @@ du.check_min_api_version("7.0.0", "generate_image_txt")
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("generate image text"), name = "generate_image_txt",
purpose = _("overlay metadata on the selected image(s)"), purpose = _("overlay metadata on the selected image(s)"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/generate_image_txt" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/generate_image_txt"

View File

@@ -35,6 +35,8 @@ du.check_min_api_version("7.0.0", "image_path_in_ui")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("image_path_in_ui", dt.configuration.config_dir .."/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext(msgid)
end end
@@ -44,7 +46,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("image path in UI"), name = "image_path_in_ui",
purpose = _("print the image path in the UI"), purpose = _("print the image path in the UI"),
author = "Jérémy Rosen", author = "Jérémy Rosen",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/image_path_in_ui" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/image_path_in_ui"
@@ -63,7 +65,7 @@ local main_label = dt.new_widget("label"){selectable = true, ellipsize = "middle
local function install_module() local function install_module()
if not ipiu.module_installed then if not ipiu.module_installed then
dt.register_lib("image_path_no_ui",_("selected images path"),true,false,{ dt.register_lib("image_path_no_ui","selected images path",true,false,{
[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_CENTER",300} [dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_CENTER",300}
}, main_label }, main_label
) )

View File

@@ -34,6 +34,8 @@ local dt = require "darktable"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("import_filter_manager", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -41,7 +43,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("import filter manager"), name = "import_filter_manager",
purpose = _("manage import filters"), purpose = _("manage import filters"),
author = "Tobias Ellinghaus", author = "Tobias Ellinghaus",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/import_filter_manager" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/import_filter_manager"

View File

@@ -32,6 +32,8 @@ local dt = require "darktable"
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("import_filters", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -39,7 +41,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("import filters"), name = "import_filters",
purpose = _("import filtering"), purpose = _("import filtering"),
author = "Tobias Ellinghaus & Christian Mandel", author = "Tobias Ellinghaus & Christian Mandel",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/import_filters" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/import_filters"

View File

@@ -1,267 +0,0 @@
--[[
regenerate_thumbnails.lua - regenerate mipmap cache for selected images
Copyright (C) 2025 Bill Ferguson <wpferguson@gmail.com>.
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 <http://www.gnu.org/licenses/>.
]]
--[[
regenerate_thumbnails - regenerate mipmap cache for selected images
regenerate_thumbnails drops the cached thumbnail for each selected image
and generates a new thumbnail.
ADDITIONAL SOFTWARE NEEDED FOR THIS SCRIPT
None
USAGE
* enable the script in script_manager
* assign a shortcut, if desired, to apply the script by hovering
over a skull and using the shortcut to regenerate the thumbnail
BUGS, COMMENTS, SUGGESTIONS
Bill Ferguson <wpferguson@gmail.com>
CHANGES
]]
local dt = require "darktable"
local du = require "lib/dtutils"
-- local df = require "lib/dtutils.file"
-- local ds = require "lib/dtutils.string"
-- local dtsys = require "lib/dtutils.system"
local log = require "lib/dtutils.log"
-- local debug = require "darktable.debug"
-- - - - - - - - - - - - - - - - - - - - - - - -
-- A P I C H E C K
-- - - - - - - - - - - - - - - - - - - - - - - -
du.check_min_api_version("7.0.0", MODULE) -- choose the minimum version that contains the features you need
-- - - - - - - - - - - - - - - - - - - - - - - - - -
-- I 1 8 N
-- - - - - - - - - - - - - - - - - - - - - - - - - -
local gettext = dt.gettext.gettext
local function _(msgid)
return gettext(msgid)
end
-- - - - - - - - - - - - - - - - - - - - - - - - - -
-- 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
script_data.metadata = {
name = _("regenerate_thumbnails"), -- visible name of script
purpose = _("regenerate mipmap cache for selected images"), -- purpose of script
author = "Bill Ferguson <wpferguson@gmail.com>", -- your name and optionally e-mail address
help = "https://docs.darktable.org/lua/development/lua.scripts.manual/scripts/official/regenerate_thumbnails" -- URL to help/documentation
}
-- - - - - - - - - - - - - - - - - - - - - - - -
-- C O N S T A N T S
-- - - - - - - - - - - - - - - - - - - - - - - -
local MODULE <const> = "regenerate_thumbnails"
local DEFAULT_LOG_LEVEL <const> = log.info
local TMP_DIR <const> = dt.configuration.tmp_dir
-- path separator
local PS <const> = dt.configuration.running_os == "windows" and "\\" or "/"
-- command separator
local CS <const> = dt.configuration.running_os == "windows" and "&" or ";"
-- - - - - - - - - - - - - - - - - - - - - - - -
-- L O G L E V E L
-- - - - - - - - - - - - - - - - - - - - - - - -
log.log_level(DEFAULT_LOG_LEVEL)
-- - - - - - - - - - - - - - - - - - - - - - - -
-- N A M E S P A C E
-- - - - - - - - - - - - - - - - - - - - - - - -
local regenerate_thumbnails = {}
-- - - - - - - - - - - - - - - - - - - - - - - -
-- G L O B A L V A R I A B L E S
-- - - - - - - - - - - - - - - - - - - - - - - -
-- - - - - - - - - - - - - - - - - - - - - - - -
-- P R E F E R E N C E S
-- - - - - - - - - - - - - - - - - - - - - - - -
-- - - - - - - - - - - - - - - - - - - - - - - -
-- A L I A S E S
-- - - - - - - - - - - - - - - - - - - - - - - -
local namespace = regenerate_thumbnails
local rt = regenerate_thumbnails
-- - - - - - - - - - - - - - - - - - - - - - - -
-- F U N C T I O N S
-- - - - - - - - - - - - - - - - - - - - - - - -
-------------------
-- helper functions
-------------------
local function set_log_level(level)
local old_log_level = log.log_level()
log.log_level(level)
return old_log_level
end
local function restore_log_level(level)
log.log_level(level)
end
local function pref_read(name, pref_type)
local old_log_level = set_log_level(sm.log_level)
log.msg(log.debug, "name is " .. name .. " and type is " .. pref_type)
local val = dt.preferences.read(MODULE, name, pref_type)
log.msg(log.debug, "read value " .. tostring(val))
restore_log_level(old_log_level)
return val
end
local function pref_write(name, pref_type, value)
local old_log_level = set_log_level(sm.log_level)
log.msg(log.debug, "writing value " .. tostring(value) .. " for name " .. name)
dt.preferences.write(MODULE, name, pref_type, value)
restore_log_level(old_log_level)
end
local function stop_job()
rt.job.valid = false
end
local function generate_thumbnails(images)
local has_job = false
if #images > 50 then
rt.job = dt.gui.create_job("regenerating thumbnails", true, stop_job)
has_job = true
end
for count, image in ipairs(images) do
image:drop_cache()
image:generate_cache(true, 1, 3)
if has_job then
if not rt.job.valid then
return
end
if count % 10 == 0 then
rt.job.percent = count / #images
end
end
end
if has_job then
rt.job.valid = false
end
end
local function update_button_sensitivity()
if #dt.gui.action_images > 0 then
dt.gui.libs.image.set_sensitive(MODULE, true)
else
dt.gui.libs.image.set_sensitive(MODULE, false)
end
end
-- - - - - - - - - - - - - - - - - - - - - - - -
-- M A I N P R O G R A M
-- - - - - - - - - - - - - - - - - - - - - - - -
-- - - - - - - - - - - - - - - - - - - - - - - -
-- U S E R I N T E R F A C E
-- - - - - - - - - - - - - - - - - - - - - - - -
dt.gui.libs.image.register_action(
MODULE,
_("generate thumbnails"),
function(event, images)
generate_thumbnails(images)
end,
_("generate thumbnails")
)
update_button_sensitivity()
-- - - - - - - - - - - - - - - - - - - - - - - -
-- D A R K T A B L E I N T E G R A T I O N
-- - - - - - - - - - - - - - - - - - - - - - - -
local function destroy()
dt.destroy_event(MODULE, "selection-changed")
dt.destroy_event(MODULE, "mouse-over-image-changed")
dt.gui.libs.image.destroy_action(MODULE, "regenerate thumbnails")
end
script_data.destroy = destroy
-- - - - - - - - - - - - - - - - - - - - - - - -
-- E V E N T S
-- - - - - - - - - - - - - - - - - - - - - - - -
dt.register_event(MODULE, "shortcut",
function(event, shortcut)
local images = dt.gui.action_images
if images then
generate_thumbnails(images)
end
end, "regenerate thumbnails"
)
dt.register_event(MODULE, "selection-changed",
function(event)
update_button_sensitivity()
end
)
dt.register_event(MODULE, "mouse-over-image-changed",
function(event, image)
if #dt.gui.selection() < 1 then
if image then
dt.gui.libs.image.set_sensitive(MODULE, true)
else
dt.gui.libs.image.set_sensitive(MODULE, false)
end
end
end
)
return script_data

View File

@@ -40,6 +40,8 @@ du.check_min_api_version("7.0.0", "save_selection")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("save_selection", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -49,7 +51,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("save selection"), name = "save_selection",
purpose = _("shortcuts providing multiple selection buffers"), purpose = _("shortcuts providing multiple selection buffers"),
author = "Jérémy Rosen", author = "Jérémy Rosen",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/save_selection" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/save_selection"

View File

@@ -40,20 +40,18 @@ du.check_min_api_version("7.0.0", "selection_to_pdf")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("selection_to_pdf", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
local NIX_OPEN <const> = "xdg-open "
local MAC_OPEN <const> = "open "
local WIN_OPEN <const> = "start "
-- return data structure for script_manager -- return data structure for script_manager
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("selection to PDF"), name = "selection_to_pdf",
purpose = _("generate a pdf file of selected images"), purpose = _("generate a pdf file of selected images"),
author = "Jérémy Rosen & Pascal Obry", author = "Jérémy Rosen & Pascal Obry",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/selection_to_pdf" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/selection_to_pdf"
@@ -67,8 +65,8 @@ script_data.show = nil -- only required for libs since the destroy_method only h
dt.preferences.register dt.preferences.register
("selection_to_pdf","Open with","string", ("selection_to_pdf","Open with","string",
_("a pdf viewer"), _("a pdf viewer"),
_("can be an absolute pathname or the tool may be in the PATH\nif not specified the system default will be used to open the pdf"), _("can be an absolute pathname or the tool may be in the PATH"),
"") "xdg-open")
local title_widget = dt.new_widget("entry") { local title_widget = dt.new_widget("entry") {
placeholder = _("title") placeholder = _("title")
@@ -119,9 +117,8 @@ local function thumbnail(latexfile,i,image,file)
-- fact is that latex will get confused if the filename has multiple dots. -- fact is that latex will get confused if the filename has multiple dots.
-- so \includegraphics{file.01.jpg} wont work. We need to output the filename -- so \includegraphics{file.01.jpg} wont work. We need to output the filename
-- and extention separated, e.g: \includegraphics{{file.01}.jpg} -- and extention separated, e.g: \includegraphics{{file.01}.jpg}
local filenoext=string.gsub(file, "(.*)(%..*)", "%1")
local filenoext = string.gsub(file, "(.*)(%..*)", "%1") local ext=string.gsub(file, "(.*)(%..*)", "%2")
local ext = string.gsub(file, "(.*)(%..*)", "%2")
my_write(latexfile,"\\begin{minipage}[b]{"..width.."\\textwidth}\n") my_write(latexfile,"\\begin{minipage}[b]{"..width.."\\textwidth}\n")
my_write(latexfile,"\\includegraphics[width=\\textwidth]{{"..filenoext.."}"..ext.."}\\newline\n") my_write(latexfile,"\\includegraphics[width=\\textwidth]{{"..filenoext.."}"..ext.."}\\newline\n")
my_write(latexfile,"\\centering{"..i..": \\verb|"..title.."|}\n") my_write(latexfile,"\\centering{"..i..": \\verb|"..title.."|}\n")
@@ -134,7 +131,7 @@ local function destroy()
dt.print_log("done destroying") dt.print_log("done destroying")
end end
dt.register_storage("export_pdf", _("export thumbnails to pdf"), dt.register_storage(_("export_pdf"),_("export thumbnails to pdf"),
nil, nil,
function(storage,image_table) function(storage,image_table)
local my_title = title_widget.text local my_title = title_widget.text
@@ -143,7 +140,7 @@ dt.register_storage("export_pdf", _("export thumbnails to pdf"),
end end
local thumbs_per_line = no_of_thumbs_widget.value local thumbs_per_line = no_of_thumbs_widget.value
thumbs_per_line = tonumber(thumbs_per_line) thumbs_per_line = tonumber(thumbs_per_line)
width = (1 / thumbs_per_line) - 0.01 width = (1/thumbs_per_line) - 0.01
local preamble = [[ local preamble = [[
\documentclass[a4paper,10pt]{article} \documentclass[a4paper,10pt]{article}
@@ -153,31 +150,31 @@ dt.register_storage("export_pdf", _("export thumbnails to pdf"),
\usepackage{geometry} \usepackage{geometry}
\geometry{a4paper,left=5mm,right=5mm, top=5mm, bottom=5mm} \geometry{a4paper,left=5mm,right=5mm, top=5mm, bottom=5mm}
\begin{document} \begin{document}
{\Large\bfseries ]] .. my_title .. [[} \\ {\Large\bfseries ]]..my_title..[[} \\
\bigskip\bigskip \bigskip\bigskip
]] ]]
local errmsg local errmsg
local latexfile local latexfile
latexfile,errmsg = io.open(filename, "w") latexfile,errmsg=io.open(filename,"w")
if not latexfile then if not latexfile then
error(errmsg) error(errmsg)
end end
my_write(latexfile, preamble) my_write(latexfile,preamble)
local i = 1 local i = 1
for img, file in pairs(image_table) do for img,file in pairs(image_table) do
thumbnail(latexfile, i, img, file) thumbnail(latexfile,i,img,file)
if i % thumbs_per_line == 0 then if i % thumbs_per_line == 0 then
my_write(latexfile, "\n\\bigskip\n") my_write(latexfile,"\n\\bigskip\n")
end end
i = i + 1 i = i+1
end end
my_write(latexfile,ending) my_write(latexfile,ending)
latexfile:close() latexfile:close()
-- convert to PDF -- convert to PDF
local dir = string.gsub(filename, "(.*/)(.*)", "%1") local dir=string.gsub(filename, "(.*/)(.*)", "%1")
local locfile = string.gsub(filename, "(.*/)(.*)", "%2") local locfile=string.gsub(filename, "(.*/)(.*)", "%2")
local command = "pdflatex -halt-on-error -output-directory "..dir.." "..locfile local command = "pdflatex -halt-on-error -output-directory "..dir.." "..locfile
local result = dt.control.execute(command) local result = dt.control.execute(command)
if result ~= 0 then if result ~= 0 then
@@ -186,18 +183,9 @@ dt.register_storage("export_pdf", _("export thumbnails to pdf"),
end end
-- open the PDF -- open the PDF
local pdffile = string.gsub(filename, ".tex", ".pdf") local pdffile=string.gsub(filename, ".tex", ".pdf")
command = dt.preferences.read("selection_to_pdf","Open with","string") command = dt.preferences.read("selection_to_pdf","Open with","string")
if command == "" then command = command.." "..pdffile
if dt.configuration.running_os == "windows" then
command = WIN_OPEN
elseif dt.configuration.running_os == "macos" then
command = MAC_OPEN
else
command = NIX_OPEN
end
end
command = command .. " " .. pdffile
local result = dt.control.execute(command) local result = dt.control.execute(command)
if result ~= 0 then if result ~= 0 then
dt.print(_("problem running pdf viewer")) -- this one is probably usefull to the user dt.print(_("problem running pdf viewer")) -- this one is probably usefull to the user

View File

@@ -37,6 +37,8 @@ du.check_min_api_version("7.0.0", "executable_manager")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("executable_manager", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -46,7 +48,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("executable manager"), name = "executable_manager",
purpose = _("manage the list of external executables used by the lua scripts"), purpose = _("manage the list of external executables used by the lua scripts"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/executable_manager" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/executable_manager"
@@ -115,7 +117,7 @@ local function install_module()
if not exec_man.module_installed then if not exec_man.module_installed then
dt.register_lib( dt.register_lib(
"executable_manager", -- Module name "executable_manager", -- Module name
_("executables"), -- Visible name "executable manager", -- Visible name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {panel, panel_pos}}, -- containers {[dt.gui.views.lighttable] = {panel, panel_pos}}, -- containers
@@ -199,7 +201,7 @@ exec_man.stack = dt.new_widget("stack"){}
-- create a combobox to for indexing into the stack of widgets -- create a combobox to for indexing into the stack of widgets
exec_man.selector = dt.new_widget("combobox"){ exec_man.selector = dt.new_widget("combobox"){
label = _("executable"), label = "executable",
tooltip = _("select executable to modify"), tooltip = _("select executable to modify"),
value = 1, "placeholder", value = 1, "placeholder",
changed_callback = function(self) changed_callback = function(self)

View File

@@ -15,6 +15,8 @@ du.check_min_api_version("3.0.0", "get_lib_manpages")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("get_lib_manpages", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -88,7 +90,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("get library man pages"), name = "get_lib_manpages",
purpose = _("output the internal library documentation as man pages"), purpose = _("output the internal library documentation as man pages"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/get_lib_manpages" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/get_lib_manpages"

View File

@@ -12,6 +12,8 @@ du.check_min_api_version("3.0.0", "get_libdoc")
local gettext = dt.gettext.gettext local gettext = dt.gettext.gettext
dt.gettext.bindtextdomain("get_libdoc", dt.configuration.config_dir .."/lua/locale/")
local function _(msg) local function _(msg)
return gettext(msg) return gettext(msg)
end end
@@ -62,7 +64,7 @@ end
local script_data = {} local script_data = {}
script_data.metadata = { script_data.metadata = {
name = _("get library docs"), name = "get_libdoc",
purpose = _("retrieve and print the documentation to the console"), purpose = _("retrieve and print the documentation to the console"),
author = "Bill Ferguson <wpferguson@gmail.com>", author = "Bill Ferguson <wpferguson@gmail.com>",
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/get_libdoc" help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/tools/get_libdoc"

View File

@@ -56,10 +56,14 @@ local dtsys = require "lib/dtutils.system"
local log = require "lib/dtutils.log" local log = require "lib/dtutils.log"
local debug = require "darktable.debug" local debug = require "darktable.debug"
local gettext = dt.gettext.gettext local gettext = dt.gettext
-- Tell gettext where to find the .mo file translating messages for a particular domain
dt.gettext.bindtextdomain("script_manager", dt.configuration.config_dir .. "/lua/locale/")
local function _(msgid) local function _(msgid)
return gettext(msgid) return gettext.dgettext("script_manager", msgid)
end end
-- api check -- api check
@@ -132,7 +136,6 @@ sm.event_registered = false
sm.widgets = {} sm.widgets = {}
sm.folders = {} sm.folders = {}
sm.translated_folders = {}
-- set log level for functions -- set log level for functions
@@ -178,7 +181,6 @@ sm.log_level = DEFAULT_LOG_LEVEL
]] ]]
sm.scripts = {} sm.scripts = {}
sm.start_queue = {}
sm.page_status = {} sm.page_status = {}
sm.page_status.num_buttons = DEFAULT_BUTTONS_PER_PAGE sm.page_status.num_buttons = DEFAULT_BUTTONS_PER_PAGE
sm.page_status.buttons_created = 0 sm.page_status.buttons_created = 0
@@ -366,9 +368,8 @@ end
local function string_trim(str) local function string_trim(str)
local old_log_level = set_log_level(sm.log_level) local old_log_level = set_log_level(sm.log_level)
local result = string.gsub(str, "^%s+", "") -- trim leading spaces local result = string.gsub(str, "^%s+", "")
result = string.gsub(result, "%s+$", "") -- trim trailing spaces result = string.gsub(result, "%s+$", "")
result = string.gsub(result, ",?%s+%-%-.+$", "") -- trim trailing comma and comments
restore_log_level(old_log_level) restore_log_level(old_log_level)
return result return result
@@ -390,42 +391,11 @@ end
-- script handling -- script handling
------------------ ------------------
local function is_folder_known(folder_table, name)
local match = false
for _, folder_name in ipairs(folder_table) do
if name == folder_name then
match = true
end
end
return match
end
local function find_translated_name(folder)
local translated_name = nil
if folder == "contrib" then
translated_name = _("contributed")
elseif folder == "examples" then
translated_name = _("examples")
elseif folder == "official" then
translated_name = _("official")
elseif folder == "tools" then
translated_name = _("tools")
else
translated_name = _(folder) -- in case we get lucky and the string got translated elsewhere
end
return translated_name
end
local function add_script_folder(folder) local function add_script_folder(folder)
local old_log_level = set_log_level(sm.log_level) local old_log_level = set_log_level(sm.log_level)
if #sm.folders == 0 or not is_folder_known(sm.folders, folder) then if #sm.folders == 0 or not string.match(du.join(sm.folders, " "), ds.sanitize_lua(folder)) then
table.insert(sm.folders, folder) table.insert(sm.folders, folder)
table.insert(sm.translated_folders, find_translated_name(folder))
sm.scripts[folder] = {} sm.scripts[folder] = {}
log.msg(log.debug, "created folder " .. folder) log.msg(log.debug, "created folder " .. folder)
end end
@@ -439,8 +409,8 @@ local function get_script_metadata(script)
log.msg(log.debug, "processing metatdata for " .. script) log.msg(log.debug, "processing metatdata for " .. script)
local metadata_block = nil local description = nil
local metadata = {} local metadata = nil
f = io.open(LUA_DIR .. PS .. script .. ".lua") f = io.open(LUA_DIR .. PS .. script .. ".lua")
if f then if f then
@@ -448,20 +418,20 @@ local function get_script_metadata(script)
local content = f:read("*all") local content = f:read("*all")
f:close() f:close()
-- grab the script_data.metadata table -- grab the script_data.metadata table
metadata_block = string.match(content, "script_data%.metadata = %{\r?\n(.-)\r?\n%}") description = string.match(content, "script_data%.metadata = %{\r?\n(.-)\r?\n%}")
else else
log.msg(log.error, "cant read from " .. script) log.msg(log.error, "cant read from " .. script)
end end
if metadata_block then if description then
-- break up the lines into key value pairs metadata = ""
local lines = du.split(metadata_block, "\n") -- format it into a string block for display
local lines = du.split(description, "\n")
log.msg(log.debug, "got " .. #lines .. " lines") log.msg(log.debug, "got " .. #lines .. " lines")
local first = 1
for i = 1, #lines do for i = 1, #lines do
log.msg(log.debug, "splitting line " .. lines[i]) log.msg(log.debug, "splitting line " .. lines[i])
local parts = du.split(lines[i], " = ") local parts = du.split(lines[i], " = ")
parts[1] = string_trim(parts[1])
parts[2] = string_trim(parts[2])
log.msg(log.debug, "got value " .. parts[1] .. " and data " .. parts[2]) log.msg(log.debug, "got value " .. parts[1] .. " and data " .. parts[2])
if string.match(parts[2], "%_%(") then if string.match(parts[2], "%_%(") then
parts[2] = _(string_dequote(string_dei18n(parts[2]))) parts[2] = _(string_dequote(string_dei18n(parts[2])))
@@ -471,15 +441,14 @@ local function get_script_metadata(script)
if string.match(parts[2], ",$") then if string.match(parts[2], ",$") then
parts[2] = string_chop(parts[2]) parts[2] = string_chop(parts[2])
end end
log.msg(log.debug, "parts 1 is " .. parts[1] .. " and parts 2 is " .. parts[2]) metadata = metadata .. string.format("%s%-10s\t%s", first and "" or "\n", parts[1], parts[2])
metadata[parts[1]] = parts[2] first = nil
log.msg(log.debug, "metadata " .. parts[1] .. " is " .. metadata[parts[1]])
end end
log.msg(log.debug, "script data found for " .. metadata["name"]) log.msg(log.debug, "script data is \n" .. metadata)
end end
restore_log_level(old_log_level) restore_log_level(old_log_level)
return metadata_block and metadata or nil return metadata
end end
local function get_script_doc(script) local function get_script_doc(script)
@@ -500,7 +469,7 @@ local function get_script_doc(script)
return description return description
else else
restore_log_level(old_log_level) restore_log_level(old_log_level)
return _("no documentation available") return "No documentation available"
end end
end end
@@ -548,7 +517,6 @@ local function activate(script)
status = true status = true
pref_write(script.script_name, "bool", true) pref_write(script.script_name, "bool", true)
end end
script_manager_running_script = "script_manager"
restore_log_level(old_log_level) restore_log_level(old_log_level)
return status return status
@@ -596,24 +564,6 @@ local function deactivate(script)
restore_log_level(old_log_level) restore_log_level(old_log_level)
end end
local function start_scripts()
for _, script in ipairs(sm.start_queue) do
activate(script)
for i = 1, sm.page_status.num_buttons do
local name = script.metadata and script.metadata.name or script.name
if sm.widgets.labels[i].label == name then
sm.widgets.buttons[i].name = "pb_on"
break
end
end
end
sm.start_queue = {}
end
local function queue_script_to_start(script)
table.insert(sm.start_queue, script)
end
local function add_script_name(name, path, folder) local function add_script_name(name, path, folder)
local old_log_level = set_log_level(sm.log_level) local old_log_level = set_log_level(sm.log_level)
@@ -633,7 +583,7 @@ local function add_script_name(name, path, folder)
table.insert(sm.scripts[folder], script) table.insert(sm.scripts[folder], script)
if pref_read(script.script_name, "bool") then if pref_read(script.script_name, "bool") then
queue_script_to_start(script) activate(script)
else else
pref_write(script.script_name, "bool", false) pref_write(script.script_name, "bool", false)
end end
@@ -884,7 +834,7 @@ local function install_scripts()
if count > 0 then if count > 0 then
update_combobox_choices(sm.widgets.folder_selector, sm.folders, sm.widgets.folder_selector.selected) update_combobox_choices(sm.widgets.folder_selector, sm.folders, sm.widgets.folder_selector.selected)
dt.print(_(string.format("scripts successfully installed into folder %s"), folder)) dt.print(_("scripts successfully installed into folder ") .. folder)
table.insert(sm.installed_repositories, {name = folder, directory = LUA_DIR .. PS .. folder}) table.insert(sm.installed_repositories, {name = folder, directory = LUA_DIR .. PS .. folder})
update_script_update_choices() update_script_update_choices()
@@ -963,11 +913,11 @@ local function populate_buttons(folder, first, last)
end end
button.image = POWER_ICON button.image = POWER_ICON
label.label = script.metadata and script.metadata.name or script.name label.label = script.name
label.name = "pb_label" label.name = "pb_label"
button.ellipsize = "end" button.ellipsize = "end"
button.sensitive = true button.sensitive = true
label.tooltip = script.metadata and script.metadata.purpose or script.doc label.tooltip = script.metadata and script.metadata or script.doc
button.clicked_callback = function (this) button.clicked_callback = function (this)
local cb_script = script local cb_script = script
@@ -1059,7 +1009,7 @@ local function paginate(direction)
last = first + sm.page_status.num_buttons - 1 last = first + sm.page_status.num_buttons - 1
end end
sm.widgets.page_status.label = string.format(_("page %d of %d"), cur_page, max_pages) sm.widgets.page_status.label = _(string.format("page %d of %d", cur_page, max_pages))
populate_buttons(folder, first, last) populate_buttons(folder, first, last)
@@ -1214,7 +1164,7 @@ local function install_module()
if not sm.module_installed then if not sm.module_installed then
dt.register_lib( dt.register_lib(
"script_manager", -- Module name "script_manager", -- Module name
_("scripts"), -- Visible name "script manager", -- Visible name
true, -- expandable true, -- expandable
false, -- resetable false, -- resetable
{[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_BOTTOM", 100}}, -- containers {[dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_BOTTOM", 100}}, -- containers
@@ -1230,7 +1180,6 @@ local function install_module()
log.msg(log.debug, "set run to true, loading preferences") log.msg(log.debug, "set run to true, loading preferences")
load_preferences() load_preferences()
scan_repositories() scan_repositories()
start_scripts()
restore_log_level(old_log_level) restore_log_level(old_log_level)
end end
@@ -1403,7 +1352,7 @@ sm.widgets.disable_scripts = dt.new_widget("button"){
sm.widgets.install_update = dt.new_widget("box"){ sm.widgets.install_update = dt.new_widget("box"){
orientation = "vertical", orientation = "vertical",
dt.new_widget("section_label"){label = " "}, dt.new_widget("section_label"){label = _(" ")},
dt.new_widget("label"){label = " "}, dt.new_widget("label"){label = " "},
dt.new_widget("label"){label = _("update scripts")}, dt.new_widget("label"){label = _("update scripts")},
dt.new_widget("label"){label = " "}, dt.new_widget("label"){label = " "},
@@ -1432,10 +1381,10 @@ sm.widgets.folder_selector = dt.new_widget("combobox"){
changed_callback = function(self) changed_callback = function(self)
if sm.run then if sm.run then
pref_write("folder_selector", "integer", self.selected) pref_write("folder_selector", "integer", self.selected)
change_folder(sm.folders[self.selected]) change_folder(self.value)
end end
end, end,
table.unpack(sm.translated_folders), table.unpack(sm.folders),
} }
-- a script "button" consists of: -- a script "button" consists of:
@@ -1458,7 +1407,7 @@ end
local page_back = "<" local page_back = "<"
local page_forward = ">" local page_forward = ">"
sm.widgets.page_status = dt.new_widget("label"){label = _("page") .. ":"} sm.widgets.page_status = dt.new_widget("label"){label = _("page:")}
sm.widgets.page_back = dt.new_widget("button"){ sm.widgets.page_back = dt.new_widget("button"){
label = page_back, label = page_back,