|
1 | 1 | /*
|
2 | 2 | This file is part of darktable,
|
3 |
| - Copyright (C) 2009-2024 darktable developers. |
| 3 | + Copyright (C) 2009-2025 darktable developers. |
4 | 4 |
|
5 | 5 | darktable is free software: you can redistribute it and/or modify
|
6 | 6 | it under the terms of the GNU General Public License as published by
|
|
23 | 23 | #include "control/control.h"
|
24 | 24 | #include "dtgtk/button.h"
|
25 | 25 | #include "dtgtk/expander.h"
|
26 |
| -#include "dtgtk/icon.h" |
27 | 26 | #include "gui/accelerators.h"
|
28 | 27 | #include "gui/drag_and_drop.h"
|
29 | 28 | #include "gui/gtk.h"
|
30 | 29 | #include "gui/presets.h"
|
| 30 | +#include <glib-2.0/glib.h> |
| 31 | +#include <string.h> |
31 | 32 | #ifdef GDK_WINDOWING_QUARTZ
|
32 |
| -#include "osx/osx.h" |
33 | 33 | #endif
|
34 | 34 | #include <stdbool.h>
|
35 | 35 | #include <stdlib.h>
|
@@ -103,6 +103,33 @@ gchar *dt_lib_get_active_preset_name(dt_lib_module_info_t *minfo)
|
103 | 103 | return name;
|
104 | 104 | }
|
105 | 105 |
|
| 106 | +// get dt_lib_module_info_t for a module. Must be freed by free_module_info() |
| 107 | +static dt_lib_module_info_t *_get_module_info_for_module(dt_lib_module_t *module) |
| 108 | +{ |
| 109 | + dt_lib_module_info_t *mi = calloc(1, sizeof(dt_lib_module_info_t)); |
| 110 | + |
| 111 | + mi->plugin_name = g_strdup(module->plugin_name); |
| 112 | + mi->version = module->version(); |
| 113 | + mi->module = module; |
| 114 | + mi->params = module->get_params ? module->get_params(module, &mi->params_size) : NULL; |
| 115 | + if(!mi->params) |
| 116 | + { |
| 117 | + // this is a valid case, for example in location.c when nothing got selected |
| 118 | + // fprintf(stderr, "something went wrong: ¶ms=%p, size=%i\n", |
| 119 | + // mi->params, mi->params_size); |
| 120 | + mi->params_size = 0; |
| 121 | + } |
| 122 | + return mi; |
| 123 | +} |
| 124 | + |
| 125 | +static void _set_module_preset_label(dt_lib_module_t *module, const gchar *preset_name) |
| 126 | +{ |
| 127 | + gchar *preset_label_text = (*preset_name == '\0')? g_strdup("") |
| 128 | + : g_strdup_printf("• %s", preset_name); |
| 129 | + gtk_label_set_text(GTK_LABEL(module->preset_label), preset_label_text); |
| 130 | + g_free(preset_label_text); |
| 131 | +} |
| 132 | + |
106 | 133 | static void edit_preset(const char *name_in,
|
107 | 134 | dt_lib_module_info_t *minfo)
|
108 | 135 | {
|
@@ -237,6 +264,7 @@ static void menuitem_delete_preset(GtkMenuItem *menuitem,
|
237 | 264 | dt_action_rename_preset(&minfo->module->actions, name, NULL);
|
238 | 265 |
|
239 | 266 | dt_lib_presets_remove(name, minfo->plugin_name, minfo->version);
|
| 267 | + _set_module_preset_label(minfo->module, ""); |
240 | 268 |
|
241 | 269 | DT_CONTROL_SIGNAL_RAISE(DT_SIGNAL_PRESETS_CHANGED,
|
242 | 270 | g_strdup(minfo->plugin_name));
|
@@ -356,6 +384,8 @@ gboolean dt_lib_presets_apply(const gchar *preset,
|
356 | 384 | dt_conf_set_string(tx, preset);
|
357 | 385 | g_free(tx);
|
358 | 386 | res = module->set_params(module, blob, length);
|
| 387 | + if(!res) |
| 388 | + _set_module_preset_label(module, preset); |
359 | 389 | break;
|
360 | 390 | }
|
361 | 391 | }
|
@@ -403,15 +433,8 @@ void dt_lib_presets_update(const gchar *preset,
|
403 | 433 | static void _menuitem_activate_preset(GtkMenuItem *menuitem,
|
404 | 434 | dt_lib_module_info_t *minfo)
|
405 | 435 | {
|
406 |
| - gchar *preset_name = g_object_get_data(G_OBJECT(menuitem), "dt-preset-name"); |
407 |
| - gboolean res = dt_lib_presets_apply(preset_name, |
408 |
| - minfo->plugin_name, minfo->version); |
409 |
| - |
410 |
| - if(res){ |
411 |
| - gchar *preset_label_text = g_strdup_printf("• %s", preset_name); |
412 |
| - gtk_label_set_text(GTK_LABEL(minfo->module->preset_label), preset_label_text); |
413 |
| - g_free(preset_label_text); |
414 |
| - } |
| 436 | + dt_lib_presets_apply(g_object_get_data(G_OBJECT(menuitem), "dt-preset-name"), |
| 437 | + minfo->plugin_name, minfo->version); |
415 | 438 | }
|
416 | 439 |
|
417 | 440 | static gboolean _menuitem_button_preset(GtkMenuItem *menuitem,
|
@@ -864,6 +887,12 @@ void dt_lib_gui_update(dt_lib_module_t *module)
|
864 | 887 | module->gui_update(module);
|
865 | 888 | module->gui_uptodate = TRUE;
|
866 | 889 | }
|
| 890 | + |
| 891 | + dt_lib_module_info_t *mi = _get_module_info_for_module(module); |
| 892 | + gchar *active_preset_name = dt_lib_get_active_preset_name(mi); |
| 893 | + free_module_info(NULL, mi); |
| 894 | + _set_module_preset_label(module, active_preset_name? active_preset_name : ""); |
| 895 | + g_free(active_preset_name); |
867 | 896 | }
|
868 | 897 |
|
869 | 898 | static void dt_lib_init_module(void *m)
|
@@ -907,19 +936,7 @@ static gboolean _presets_popup_callback(GtkButton *button,
|
907 | 936 | GdkEventButton *e,
|
908 | 937 | dt_lib_module_t *module)
|
909 | 938 | {
|
910 |
| - dt_lib_module_info_t *mi = calloc(1, sizeof(dt_lib_module_info_t)); |
911 |
| - |
912 |
| - mi->plugin_name = g_strdup(module->plugin_name); |
913 |
| - mi->version = module->version(); |
914 |
| - mi->module = module; |
915 |
| - mi->params = module->get_params ? module->get_params(module, &mi->params_size) : NULL; |
916 |
| - if(!mi->params) |
917 |
| - { |
918 |
| - // this is a valid case, for example in location.c when nothing got selected |
919 |
| - // fprintf(stderr, "something went wrong: ¶ms=%p, size=%i\n", |
920 |
| - // mi->params, mi->params_size); |
921 |
| - mi->params_size = 0; |
922 |
| - } |
| 939 | + dt_lib_module_info_t *mi = _get_module_info_for_module(module); |
923 | 940 | dt_lib_presets_popup_menu_show(mi, GTK_WIDGET(button));
|
924 | 941 |
|
925 | 942 | if(button)
|
@@ -1283,6 +1300,7 @@ GtkWidget *dt_lib_gui_get_expander(dt_lib_module_t *module)
|
1283 | 1300 | dt_action_define(&module->actions, NULL, NULL, label_evb, NULL);
|
1284 | 1301 | gtk_box_pack_start(GTK_BOX(header), label_evb, FALSE, FALSE, 0);
|
1285 | 1302 |
|
| 1303 | + /* add preset label */ |
1286 | 1304 | module->preset_label = gtk_label_new(NULL);
|
1287 | 1305 | gtk_widget_set_name(module->preset_label, "lib-module-name");
|
1288 | 1306 | gtk_label_set_ellipsize(GTK_LABEL(module->preset_label), PANGO_ELLIPSIZE_MIDDLE);
|
@@ -1331,6 +1349,15 @@ GtkWidget *dt_lib_gui_get_expander(dt_lib_module_t *module)
|
1331 | 1349 | dt_gui_add_class(pluginui_frame, "dt_plugin_ui");
|
1332 | 1350 | module->expander = expander;
|
1333 | 1351 |
|
| 1352 | + // get active preset and set preset_label |
| 1353 | + dt_lib_module_info_t *mi = _get_module_info_for_module(module); |
| 1354 | + gchar *preset_name = dt_lib_get_active_preset_name(mi); |
| 1355 | + if(preset_name) |
| 1356 | + { |
| 1357 | + _set_module_preset_label(mi->module, preset_name); |
| 1358 | + g_free(preset_name); |
| 1359 | + } |
| 1360 | + free_module_info(NULL, mi); |
1334 | 1361 |
|
1335 | 1362 | return module->expander;
|
1336 | 1363 | }
|
@@ -1553,6 +1580,11 @@ gboolean dt_lib_presets_can_autoapply(dt_lib_module_t *mod)
|
1553 | 1580 | return mod->preset_autoapply(mod);
|
1554 | 1581 | }
|
1555 | 1582 |
|
| 1583 | +void dt_lib_reset_preset_label(dt_lib_module_t *mod) |
| 1584 | +{ |
| 1585 | + gtk_label_set_text(GTK_LABEL(mod->preset_label), ""); |
| 1586 | +} |
| 1587 | + |
1556 | 1588 | static float _action_process(gpointer target,
|
1557 | 1589 | const dt_action_element_t element,
|
1558 | 1590 | const dt_action_effect_t effect,
|
|
0 commit comments