return button;
}
-/*
- *-----------------------------------------------------------------------------
- * color profile button (and menu)
- *-----------------------------------------------------------------------------
- */
-
-#ifdef HAVE_LCMS
-
-static void layout_color_menu_enable_cb(GtkWidget *widget, gpointer data)
-{
- LayoutWindow *lw = data;
-
- layout_image_color_profile_set_use(lw, (!layout_image_color_profile_get_use(lw)));
- layout_image_refresh(lw);
-}
-
-static void layout_color_menu_use_image_cb(GtkWidget *widget, gpointer data)
-{
- LayoutWindow *lw = data;
- gint input, screen;
- gboolean use_image;
-
- if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
- layout_image_color_profile_set(lw, input, screen, !use_image);
- layout_image_refresh(lw);
-}
-
-#define COLOR_MENU_KEY "color_menu_key"
-
-static void layout_color_menu_input_cb(GtkWidget *widget, gpointer data)
-{
- LayoutWindow *lw = data;
- gint type;
- gint input, screen;
- gboolean use_image;
-
- if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return;
-
- type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), COLOR_MENU_KEY));
- if (type < 0 || type >= COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS) return;
-
- if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
- if (type == input) return;
-
- layout_image_color_profile_set(lw, type, screen, use_image);
- layout_image_refresh(lw);
-}
-
-static void layout_color_menu_screen_cb(GtkWidget *widget, gpointer data)
-{
- LayoutWindow *lw = data;
- gint type;
- gint input, screen;
- gboolean use_image;
-
- if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return;
-
- type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), COLOR_MENU_KEY));
- if (type < 0 || type > 1) return;
-
- if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
- if (type == screen) return;
-
- layout_image_color_profile_set(lw, input, type, use_image);
- layout_image_refresh(lw);
-}
-
-static gchar *layout_color_name_parse(const gchar *name)
-{
- if (!name || !*name) return g_strdup(_("Empty"));
- return g_strdelimit(g_strdup(name), "_", '-');
-}
-
-#endif /* HAVE_LCMS */
-
-static void layout_color_button_press_cb(GtkWidget *widget, gpointer data)
-{
-#ifndef HAVE_LCMS
- gchar *msg = g_strdup_printf(_("This installation of %s was not built with support for color profiles."), GQ_APPNAME);
- file_util_warning_dialog(_("Color profiles not supported"),
- msg,
- GTK_STOCK_DIALOG_INFO, widget);
- g_free(msg);
- return;
-#else
- LayoutWindow *lw = data;
- GtkWidget *menu;
- GtkWidget *item;
- gchar *buf;
- gboolean active;
- gint input = 0;
- gint screen = 0;
- gboolean use_image = FALSE;
- gboolean from_image;
- gint image_profile;
- gint i;
-
- if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
-
- image_profile = layout_image_color_profile_get_from_image(lw);
- from_image = use_image && (image_profile != COLOR_PROFILE_NONE);
- menu = popup_menu_short_lived();
-
- active = layout_image_color_profile_get_use(lw);
- menu_item_add_check(menu, _("Use _color profiles"), active,
- G_CALLBACK(layout_color_menu_enable_cb), lw);
-
- menu_item_add_divider(menu);
-
- item = menu_item_add_check(menu, _("Use profile from _image"), use_image,
- G_CALLBACK(layout_color_menu_use_image_cb), lw);
- gtk_widget_set_sensitive(item, image_profile == COLOR_PROFILE_MEM || (image_profile > COLOR_PROFILE_NONE && image_profile < COLOR_PROFILE_FILE));
-
- for (i = COLOR_PROFILE_SRGB; i < COLOR_PROFILE_FILE; i++)
- {
- const gchar *label;
-
- switch (i)
- {
- case COLOR_PROFILE_SRGB: label = _("sRGB"); break;
- case COLOR_PROFILE_ADOBERGB: label = _("AdobeRGB compatible"); break;
- default: label = "fixme"; break;
- }
- buf = g_strdup_printf(_("Input _%d: %s%s"), i, label, (i == image_profile) ? " *" : "");
- item = menu_item_add_radio(menu, (i == COLOR_PROFILE_SRGB) ? NULL : item,
- buf, (input == i),
- G_CALLBACK(layout_color_menu_input_cb), lw);
- g_free(buf);
- g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(i));
- gtk_widget_set_sensitive(item, active && !from_image);
- }
-
- for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
- {
- const gchar *name = options->color_profile.input_name[i];
- const gchar *file = options->color_profile.input_file[i];
- gchar *end;
-
- if (!name || !name[0]) name = filename_from_path(file);
-
- end = layout_color_name_parse(name);
- buf = g_strdup_printf(_("Input _%d: %s"), i + COLOR_PROFILE_FILE, end);
- g_free(end);
-
- item = menu_item_add_radio(menu, item,
- buf, (i + COLOR_PROFILE_FILE == input),
- G_CALLBACK(layout_color_menu_input_cb), lw);
- g_free(buf);
- g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(i + COLOR_PROFILE_FILE));
- gtk_widget_set_sensitive(item, active && !from_image && is_readable_file(file));
- }
-
- menu_item_add_divider(menu);
-
- item = menu_item_add_radio(menu, NULL,
- _("Screen sRGB"), (screen == 0),
- G_CALLBACK(layout_color_menu_screen_cb), lw);
-
- g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(0));
- gtk_widget_set_sensitive(item, active);
-
- item = menu_item_add_radio(menu, item,
- _("_Screen profile"), (screen == 1),
- G_CALLBACK(layout_color_menu_screen_cb), lw);
- g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(1));
- gtk_widget_set_sensitive(item, active && is_readable_file(options->color_profile.screen_file));
-
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME);
-#endif /* HAVE_LCMS */
-}
-
+#if 0
static GtkWidget *layout_color_button(LayoutWindow *lw)
{
GtkWidget *button;
return button;
}
-
+#endif
/*
*-----------------------------------------------------------------------------
* write button
gtk_box_pack_start(GTK_BOX(hbox), lw->info_sort, FALSE, FALSE, 0);
gtk_widget_show(lw->info_sort);
- lw->info_color = layout_color_button(lw);
- gtk_widget_show(lw->info_color);
-
lw->info_write = layout_write_button(lw);
gtk_widget_show(lw->info_write);
- if (small_format) gtk_box_pack_end(GTK_BOX(hbox), lw->info_color, FALSE, FALSE, 0);
if (small_format) gtk_box_pack_end(GTK_BOX(hbox), lw->info_write, FALSE, FALSE, 0);
lw->info_status = layout_status_label(NULL, lw->info_box, TRUE, 0, (!small_format));
hbox = lw->info_box;
}
lw->info_details = layout_status_label(NULL, hbox, TRUE, 0, TRUE);
- if (!small_format) gtk_box_pack_start(GTK_BOX(hbox), lw->info_color, FALSE, FALSE, 0);
if (!small_format) gtk_box_pack_start(GTK_BOX(hbox), lw->info_write, FALSE, FALSE, 0);
lw->info_pixel = layout_status_label(NULL, hbox, FALSE, PIXEL_LABEL_WIDTH, TRUE);
if (lw->options.info_pixel_hidden) gtk_widget_hide(gtk_widget_get_parent(lw->info_pixel));
lw->info_box = NULL;
lw->info_progress_bar = NULL;
lw->info_sort = NULL;
- lw->info_color = NULL;
lw->info_status = NULL;
lw->info_details = NULL;
lw->info_pixel = NULL;
#include "collect.h"
#include "collect-dlg.h"
#include "compat.h"
+#include "color-man.h"
#include "dupe.h"
#include "editors.h"
#include "filedata.h"
static gboolean layout_bar_enabled(LayoutWindow *lw);
static gboolean layout_bar_sort_enabled(LayoutWindow *lw);
+static void layout_util_sync_color(LayoutWindow *lw);
/*
*-----------------------------------------------------------------------------
#endif
+
+/*
+ *-----------------------------------------------------------------------------
+ * color profile button (and menu)
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_color_menu_enable_cb(GtkToggleAction *action, gpointer data)
+{
+#ifdef HAVE_LCMS
+ LayoutWindow *lw = data;
+
+ layout_image_color_profile_set_use(lw, gtk_toggle_action_get_active(action));
+ layout_util_sync_color(lw);
+ layout_image_refresh(lw);
+#endif
+}
+
+static void layout_color_menu_use_image_cb(GtkToggleAction *action, gpointer data)
+{
+#ifdef HAVE_LCMS
+ LayoutWindow *lw = data;
+ gint input, screen;
+ gboolean use_image;
+
+ if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
+ layout_image_color_profile_set(lw, input, screen, gtk_toggle_action_get_active(action));
+ layout_util_sync_color(lw);
+ layout_image_refresh(lw);
+#endif
+}
+
+static void layout_color_menu_input_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
+{
+#ifdef HAVE_LCMS
+ LayoutWindow *lw = data;
+ gint type;
+ gint input, screen;
+ gboolean use_image;
+
+ type = gtk_radio_action_get_current_value(action);
+ if (type < 0 || type >= COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS) return;
+
+ if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
+ if (type == input) return;
+
+ layout_image_color_profile_set(lw, type, screen, use_image);
+ layout_image_refresh(lw);
+#endif
+}
+
+#if 0
+static gchar *layout_color_name_parse(const gchar *name)
+{
+ if (!name || !*name) return g_strdup(_("Empty"));
+ return g_strdelimit(g_strdup(name), "_", '-');
+}
+
+
+static void layout_color_button_press_cb(GtkWidget *widget, gpointer data)
+{
+#ifndef HAVE_LCMS
+ gchar *msg = g_strdup_printf(_("This installation of %s was not built with support for color profiles."), GQ_APPNAME);
+ file_util_warning_dialog(_("Color profiles not supported"),
+ msg,
+ GTK_STOCK_DIALOG_INFO, widget);
+ g_free(msg);
+ return;
+#else
+ LayoutWindow *lw = data;
+ GtkWidget *menu;
+ GtkWidget *item;
+ gchar *buf;
+ gboolean active;
+ gint input = 0;
+ gint screen = 0;
+ gboolean use_image = FALSE;
+ gboolean from_image;
+ gint image_profile;
+ gint i;
+
+ if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
+
+ image_profile = layout_image_color_profile_get_from_image(lw);
+ from_image = use_image && (image_profile != COLOR_PROFILE_NONE);
+ menu = popup_menu_short_lived();
+
+ active = layout_image_color_profile_get_use(lw);
+ menu_item_add_check(menu, _("Use _color profiles"), active,
+ G_CALLBACK(layout_color_menu_enable_cb), lw);
+
+ menu_item_add_divider(menu);
+
+ item = menu_item_add_check(menu, _("Use profile from _image"), use_image,
+ G_CALLBACK(layout_color_menu_use_image_cb), lw);
+ gtk_widget_set_sensitive(item, image_profile == COLOR_PROFILE_MEM || (image_profile > COLOR_PROFILE_NONE && image_profile < COLOR_PROFILE_FILE));
+
+ for (i = COLOR_PROFILE_SRGB; i < COLOR_PROFILE_FILE; i++)
+ {
+ const gchar *label;
+
+ switch (i)
+ {
+ case COLOR_PROFILE_SRGB: label = _("sRGB"); break;
+ case COLOR_PROFILE_ADOBERGB: label = _("AdobeRGB compatible"); break;
+ default: label = "fixme"; break;
+ }
+ buf = g_strdup_printf(_("Input _%d: %s%s"), i, label, (i == image_profile) ? " *" : "");
+ item = menu_item_add_radio(menu, (i == COLOR_PROFILE_SRGB) ? NULL : item,
+ buf, (input == i),
+ G_CALLBACK(layout_color_menu_input_cb), lw);
+ g_free(buf);
+ g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(i));
+ gtk_widget_set_sensitive(item, active && !from_image);
+ }
+
+ for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
+ {
+ const gchar *name = options->color_profile.input_name[i];
+ const gchar *file = options->color_profile.input_file[i];
+ gchar *end;
+
+ if (!name || !name[0]) name = filename_from_path(file);
+
+ end = layout_color_name_parse(name);
+ buf = g_strdup_printf(_("Input _%d: %s"), i + COLOR_PROFILE_FILE, end);
+ g_free(end);
+
+ item = menu_item_add_radio(menu, item,
+ buf, (i + COLOR_PROFILE_FILE == input),
+ G_CALLBACK(layout_color_menu_input_cb), lw);
+ g_free(buf);
+ g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(i + COLOR_PROFILE_FILE));
+ gtk_widget_set_sensitive(item, active && !from_image && is_readable_file(file));
+ }
+
+ menu_item_add_divider(menu);
+
+ item = menu_item_add_radio(menu, NULL,
+ _("Screen sRGB"), (screen == 0),
+ G_CALLBACK(layout_color_menu_screen_cb), lw);
+
+ g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(0));
+ gtk_widget_set_sensitive(item, active);
+
+ item = menu_item_add_radio(menu, item,
+ _("_Screen profile"), (screen == 1),
+ G_CALLBACK(layout_color_menu_screen_cb), lw);
+ g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(1));
+ gtk_widget_set_sensitive(item, active && is_readable_file(options->color_profile.screen_file));
+
+ gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME);
+#endif /* HAVE_LCMS */
+}
+
+#endif
+
/*
*-----------------------------------------------------------------------------
* recent menu
{ "ViewMenu", NULL, N_("_View"), NULL, NULL, NULL },
{ "DirMenu", NULL, N_("_View Directory as"), NULL, NULL, NULL },
{ "ZoomMenu", NULL, N_("_Zoom"), NULL, NULL, NULL },
+ { "ColorMenu", NULL, N_("Color _Management"), NULL, NULL, NULL },
{ "ConnectZoomMenu", NULL, N_("_Connected Zoom"), NULL, NULL, NULL },
{ "SplitMenu", NULL, N_("_Split"), NULL, NULL, NULL },
{ "HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL },
{ "SBar", NULL, N_("_Info"), "<control>K", NULL, CB(layout_menu_bar_cb), FALSE },
{ "SBarSort", NULL, N_("Sort _manager"), "<control>S", NULL, CB(layout_menu_bar_sort_cb), FALSE },
{ "SlideShow", NULL, N_("Toggle _slideshow"),"S", NULL, CB(layout_menu_slideshow_cb), FALSE },
+ { "UseColorProfiles", NULL, N_("Use _color profiles"), NULL, NULL, CB(layout_color_menu_enable_cb), FALSE},
+ { "UseImageProfile", NULL, N_("Use profile from _image"), NULL, NULL, CB(layout_color_menu_use_image_cb), FALSE},
};
static GtkRadioActionEntry menu_radio_entries[] = {
{ "SplitSingle", NULL, N_("Single"), "Y", NULL, SPLIT_NONE }
};
+static GtkRadioActionEntry menu_color_radio_entries[] = {
+ { "ColorProfile0", NULL, N_("Input _0: sRGB"), NULL, NULL, COLOR_PROFILE_SRGB },
+ { "ColorProfile1", NULL, N_("Input _1: AdobeRGB compatible"), NULL, NULL, COLOR_PROFILE_ADOBERGB },
+ { "ColorProfile2", NULL, N_("Input _2"), NULL, NULL, COLOR_PROFILE_FILE },
+ { "ColorProfile3", NULL, N_("Input _3"), NULL, NULL, COLOR_PROFILE_FILE + 1 },
+ { "ColorProfile4", NULL, N_("Input _4"), NULL, NULL, COLOR_PROFILE_FILE + 2 },
+ { "ColorProfile5", NULL, N_("Input _5"), NULL, NULL, COLOR_PROFILE_FILE + 3 }
+};
#undef CB
" <menuitem action='PanView'/>"
" <placeholder name='WindowSection'/>"
" <separator/>"
+" <menu action='ColorMenu'>"
+" <menuitem action='UseColorProfiles'/>"
+" <menuitem action='UseImageProfile'/>"
+" <menuitem action='ColorProfile0'/>"
+" <menuitem action='ColorProfile1'/>"
+" <menuitem action='ColorProfile2'/>"
+" <menuitem action='ColorProfile3'/>"
+" <menuitem action='ColorProfile4'/>"
+" <menuitem action='ColorProfile5'/>"
+" </menu>"
" <menu action='ZoomMenu'>"
" <menuitem action='ZoomIn'/>"
" <menuitem action='ZoomOut'/>"
gtk_action_group_add_radio_actions(lw->action_group,
menu_view_dir_radio_entries, VIEW_DIR_TYPES_COUNT,
0, G_CALLBACK(layout_menu_view_dir_as_cb), lw);
+ gtk_action_group_add_radio_actions(lw->action_group,
+ menu_color_radio_entries, COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS,
+ 0, G_CALLBACK(layout_color_menu_input_cb), lw);
+
lw->ui_manager = gtk_ui_manager_new();
gtk_ui_manager_set_add_tearoffs(lw->ui_manager, TRUE);
* misc
*-----------------------------------------------------------------------------
*/
+static gchar *layout_color_name_parse(const gchar *name)
+{
+ if (!name || !*name) return g_strdup(_("Empty"));
+ return g_strdelimit(g_strdup(name), "_", '-');
+}
+
+static void layout_util_sync_color(LayoutWindow *lw)
+{
+ GtkAction *action;
+ gint input = 0;
+ gint screen = 0;
+ gboolean use_color;
+ gboolean use_image = FALSE;
+ gint i;
+ gchar action_name[15];
+
+ if (!lw->action_group) return;
+ if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
+
+ use_color = layout_image_color_profile_get_use(lw);
+
+ action = gtk_action_group_get_action(lw->action_group, "UseColorProfiles");
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), use_color);
+
+ action = gtk_action_group_get_action(lw->action_group, "UseImageProfile");
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), use_image);
+ gtk_action_set_sensitive(action, use_color);
+
+ for (i = 0; i < COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS; i++)
+ {
+ sprintf(action_name, "ColorProfile%d", i);
+ action = gtk_action_group_get_action(lw->action_group, action_name);
+
+ if (i >= COLOR_PROFILE_FILE)
+ {
+ const gchar *name = options->color_profile.input_name[i - COLOR_PROFILE_FILE];
+ const gchar *file = options->color_profile.input_file[i - COLOR_PROFILE_FILE];
+ gchar *end;
+ gchar *buf;
+
+ if (!name || !name[0]) name = filename_from_path(file);
+
+ end = layout_color_name_parse(name);
+ buf = g_strdup_printf(_("Input _%d: %s"), i, end);
+ g_free(end);
+
+ g_object_set(G_OBJECT(action), "label", buf, NULL);
+ g_free(buf);
+
+ gtk_action_set_visible(action, file && file[0]);
+ }
+
+ gtk_action_set_sensitive(action, !use_image);
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), (i == input));
+ }
+}
static void layout_util_sync_views(LayoutWindow *lw)
{
action = gtk_action_group_get_action(lw->action_group, "SlideShow");
gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), layout_image_slideshow_active(lw));
+ layout_util_sync_color(lw);
}
void layout_util_sync_thumb(LayoutWindow *lw)