49 GdkModifierType mods, gpointer user_data)
56 gchar *title = g_strdup_printf(_(
"Apply style \"%s\" — merge settings"), style_name);
59 "history/style/copy_iop_order",
67 const gboolean duplicate =
dt_conf_get_bool(
"ui_last/styles_create_duplicate");
70 if(is_darkroom_image_in_list)
94 GdkModifierType mods, gpointer user_data)
97 if(imgid <= 0)
return FALSE;
112 GdkModifierType mods, gpointer user_data)
131#ifdef GDK_WINDOWING_QUARTZ
133 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
135 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
136 gtk_window_set_modal(GTK_WINDOW(dialog),
FALSE);
138 gtk_window_set_title(GTK_WINDOW(dialog), _(
"Ansel - Styles"));
145 GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
146 gtk_box_pack_start(GTK_BOX(content), w,
TRUE,
TRUE, 0);
147 gtk_widget_set_visible(w,
TRUE);
148 gtk_widget_show_all(dialog);
159 if(items_string && *items_string)
163 gchar *desc = g_markup_escape_text(style->
description, -1);
164 tooltip = g_strconcat(
"<b>", desc,
"</b>\n", items_string, NULL);
169 tooltip = g_strdup(items_string);
182 GtkWidget *parent,
const gchar *path,
const gchar *label,
188 GtkWidget *submenu = g_hash_table_lookup(submenus, path);
189 if(submenu)
return submenu;
191 gchar *menu_label = g_markup_escape_text(label, -1);
192 if(
IS_NULL_PTR(menu_label)) menu_label = g_strdup(
"");
194 submenu = gtk_menu_new();
198 if(g_strrstr(clean_label,
"/") != NULL)
199 g_strdelimit(clean_label,
"/",
'-');
200 gchar *accel_path =
dt_accels_build_path(gtk_menu_get_accel_path(GTK_MENU(parent)), clean_label);
201 gtk_menu_set_accel_path(GTK_MENU(submenu), accel_path);
206 NULL, NULL, NULL, NULL, 0, 0,
208 gtk_menu_item_set_submenu(GTK_MENU_ITEM(entry->
widget), submenu);
209 gtk_menu_shell_append(GTK_MENU_SHELL(parent), entry->
widget);
211 g_hash_table_insert(submenus, g_strdup(path), submenu);
217 const gchar *label,
const gchar *
tooltip,
const gchar *style_name)
223 gtk_menu_shell_append(GTK_MENU_SHELL(parent), entry->
widget);
224 gtk_menu_item_set_reserve_indicator(GTK_MENU_ITEM(entry->
widget),
TRUE);
225 g_object_set_data_full(G_OBJECT(entry->
widget),
"custom-data", g_strdup(style_name), g_free);
232 GdkModifierType mods, gpointer user_data)
244 GdkModifierType mods, gpointer user_data)
256 GdkModifierType mods, gpointer user_data)
268 GdkModifierType mods, gpointer user_data)
280 GdkModifierType mods, gpointer user_data)
296 GList *children = gtk_container_get_children(GTK_CONTAINER(menu));
297 for(GList *child = children; child; child = g_list_next(child))
298 gtk_widget_destroy(GTK_WIDGET(child->data));
299 g_list_free(children);
317 return G_SOURCE_REMOVE;
326 return G_SOURCE_REMOVE;
352 add_sub_menu_entry(menus, lists, _(
"No styles available"), index, NULL, NULL, NULL, NULL,
357 GHashTable *submenus = g_hash_table_new_full(g_str_hash, g_str_equal,
dt_free_gpointer, NULL);
359 for(GList *iter = styles; iter; iter = g_list_next(iter))
364 gchar **split = g_strsplit(style->
name,
"|", -1);
368 for(
int i = 0; split[
i];
i++)
369 if(split[
i][0] !=
'\0')
373 GString *submenu_path = g_string_new(NULL);
374 for(
int i = 0;
i < leaf;
i++)
376 if(split[
i][0] ==
'\0')
continue;
378 if(submenu_path->len > 0)
379 g_string_append_c(submenu_path,
'|');
380 g_string_append(submenu_path, split[
i]);
382 submenu_path->str, split[
i], index);
385 gchar *label = g_markup_escape_text(leaf >= 0 ? split[leaf] : style->
name, -1);
389 g_string_free(submenu_path,
TRUE);
395 g_hash_table_destroy(submenus);
408 _(
"Apply style BEFORE the current history.\n"
409 "CURRENT EDITS are applied afterwards and win conflicts."));
414 _(
"Apply style AFTER the current history.\n"
415 "STYLE EDITS are applied afterwards and win conflicts."));
420 _(
"Discard the current history and replace it entirely with the style."));
gchar * dt_accels_build_path(const gchar *scope, const gchar *feature)
Handle default and user-set shortcuts (accelerators)
int dt_act_on_get_images_nb(const gboolean only_visible, const gboolean force)
GList * dt_act_on_get_images()
int32_t dt_act_on_get_first_image()
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
static gchar * strip_markup(const char *s)
Remove Pango/Gtk markup and accels mnemonics from text labels. If the markup parsing fails,...
static void dt_free_gpointer(gpointer ptr)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
void dt_dev_undo_start_record(dt_develop_t *dev)
void dt_dev_undo_end_record(dt_develop_t *dev)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
#define DT_PIXEL_APPLY_DPI(value)
void dt_gui_styles_dialog_new(int32_t imgid)
gboolean dt_history_style_on_image(const int32_t imgid, const char *name, const gboolean duplicate)
gboolean dt_history_style_on_list(const GList *list, const char *name, const gboolean duplicate)
@ DT_HISTORY_MERGE_REPLACE
@ DT_HISTORY_MERGE_PREPEND
@ DT_HISTORY_MERGE_APPEND
gboolean dt_gui_merge_options_dialog(const char *title, const char *mode_key, const char *iop_order_key, const char *ask_key, const gboolean iop_order_available)
Show a modal dialog to pick merge mode and pipeline order before a paste or style apply.
void dt_lib_gui_set_expanded(dt_lib_module_t *module, gboolean expanded)
GtkWidget * dt_lib_gui_get_expander(dt_lib_module_t *module)
void dt_osx_disallow_fullscreen(GtkWidget *widget)
@ DT_SIGNAL_STYLE_CHANGED
This signal is raised when a style is added/deleted/changed
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
struct _GtkWidget GtkWidget
char * dt_styles_get_item_list_as_string(const char *name)
void dt_style_free(gpointer data)
gboolean dt_styles_has_module_order(const char *name)
GList * dt_styles_get_list(const char *filter)
static GList ** _styles_lists
static dt_menus_t _styles_index
static void _styles_menu_rebuild_callback(gpointer instance, gpointer user_data)
static GtkWidget ** _styles_menus
static gboolean _styles_ask_checked_callback(GtkWidget *widget)
static gboolean _styles_history_prepend_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static GtkWidget * _styles_get_submenu(GtkWidget **menus, GList **lists, GHashTable *submenus, GtkWidget *parent, const gchar *path, const gchar *label, const dt_menus_t index)
static gboolean _styles_apply_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean _styles_ask_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean _styles_history_prepend_checked_callback(GtkWidget *widget)
static gboolean _styles_copy_iop_order_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static void _close_styles_popup(GtkWidget *dialog, gint response_id, gpointer data)
static gboolean _styles_open_popup_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean _styles_signal_connected
static gboolean _styles_menu_disabled(GtkWidget *widget)
static gboolean _styles_history_append_checked_callback(GtkWidget *widget)
void append_styles(GtkWidget **menus, GList **lists, const dt_menus_t index)
static void _styles_add_menu_entry(GtkWidget **menus, GList **lists, GtkWidget *parent, const dt_menus_t index, const gchar *label, const gchar *tooltip, const gchar *style_name)
static guint _styles_menu_rebuild_source
static gboolean _styles_history_append_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean _styles_copy_iop_order_checked_callback(GtkWidget *widget)
static gchar * _styles_build_tooltip(const dt_style_t *style)
static gboolean _styles_create_sensitive_callback(GtkWidget *widget)
static gboolean _styles_create_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean _styles_history_replace_checked_callback(GtkWidget *widget)
static void _styles_menu_clear(void)
static gboolean _styles_menu_rebuild_idle(gpointer user_data)
static gboolean _styles_history_replace_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
struct dt_gui_gtk_t * gui
struct dt_control_signal_t * signals
struct dt_develop_t * develop
GtkAccelGroup * global_accels
struct dt_gui_gtk_t::@49 styles_popup
char * dt_get_help_url(char *name)