diff src/layout.c @ 113:55166d93498d

Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net> * configure.in: Add test for lcms (little cms). * Makefile.am: Add color-man.[ch]: * color-man.[ch]: New files for color management support. * globals.c, gqview.h, main.c, rcfile.c, typedefs.h: Add color profile variables and option saving. * image.[ch]: Add color profile functions. * layout.c, layout_image.[ch]: Add color profile icon, popup menu, and fix sort menu to use radio buttons. * menu.c: Use radio buttons for sort menu when appropriate. * preferences.c: Add color profile options to preferences. * ui_menu.[ch]: Add menu_item_add_radio() for radio item menus. * ui_misc.c: Fix gtk_table_attach() arg for vertical expansion. * view_file_icon.c, view_file_list.c: Check for active state in sort menu callbacks. * README: Add info about lcms, and how to disable.
author gqview
date Sat, 25 Nov 2006 03:00:33 +0000
parents d063f97503b7
children 50fc73e08550
line wrap: on
line diff
--- a/src/layout.c	Sat Nov 18 00:12:22 2006 +0000
+++ b/src/layout.c	Sat Nov 25 03:00:33 2006 +0000
@@ -1,6 +1,6 @@
 /*
  * GQview
- * (C) 2004 John Ellis
+ * (C) 2006 John Ellis
  *
  * Author: John Ellis
  *
@@ -19,6 +19,7 @@
 #include "menu.h"
 #include "pixbuf-renderer.h"
 #include "pixbuf_util.h"
+#include "utilops.h"
 #include "view_dir_list.h"
 #include "view_dir_tree.h"
 #include "view_file_list.h"
@@ -226,6 +227,8 @@
 	LayoutWindow *lw;
 	SortType type;
 
+	if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return;
+
 	lw = submenu_item_get_data(widget);
 	if (!lw) return;
 
@@ -301,6 +304,180 @@
 
 /*
  *-----------------------------------------------------------------------------
+ * color profile button (and menu)
+ *-----------------------------------------------------------------------------
+ */
+
+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);
+}
+
+#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, 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_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, 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)
+{
+	gchar *result;
+	gchar *p;
+
+	if (!name) name = _("Empty");
+
+	result = g_strdup(name);
+	p = result;
+	while (*p != '\0')
+		{
+		if (*p == '_') *p = '-';
+		p++;
+		}
+	return result;
+}
+
+static void layout_color_button_press_cb(GtkWidget *widget, gpointer data)
+{
+	LayoutWindow *lw = data;
+	GtkWidget *menu;
+	GtkWidget *item;
+	gchar *buf;
+	gchar *front;
+	gchar *end;
+	gint active;
+	gint input = 0;
+	gint screen = 0;
+	gint use_image = 0;
+	gint i;
+
+#ifndef HAVE_LCMS
+	file_util_warning_dialog(_("Color profiles not supported"),
+				 _("This installation of GQview was not built with support for color profiles."),
+				 GTK_STOCK_DIALOG_INFO, widget);
+	return;
+#endif
+
+	active = layout_image_color_profile_get_use(lw);
+	if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return;
+
+	menu = popup_menu_short_lived();
+
+	menu_item_add_check(menu, _("Use _color profiles"), active,
+			    G_CALLBACK(layout_color_menu_enable_cb), lw);
+
+	menu_item_add_divider(menu);
+
+	front = g_strdup_printf(_("Input _%d:"), 0);
+	buf = g_strdup_printf("%s %s", front, "sRGB");
+	g_free(front);
+	item = menu_item_add_radio(menu, NULL,
+				   buf, (color_profile_input_type == 0),
+				   G_CALLBACK(layout_color_menu_input_cb), lw);
+	g_free(buf);
+	g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(0));
+	gtk_widget_set_sensitive(item, active);
+
+	for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
+		{
+		const gchar *name;
+
+		name = color_profile_input_name[i];
+		if (!name) name = filename_from_path(color_profile_input_file[i]);
+
+		front = g_strdup_printf(_("Input _%d:"), i + 1);
+		end = layout_color_name_parse(name);
+		buf = g_strdup_printf("%s %s", front, end);
+		g_free(front);
+		g_free(end);
+
+		item = menu_item_add_radio(menu, item,
+					   buf, (i + 1 == 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 + 1));
+		gtk_widget_set_sensitive(item, active && color_profile_input_file[i]);
+		}
+
+	menu_item_add_divider(menu);
+
+	buf = g_strdup_printf("%s sRGB", _("Screen"));
+	item = menu_item_add_radio(menu, NULL,
+				   buf, (screen == 0),
+				   G_CALLBACK(layout_color_menu_screen_cb), lw);
+	g_free(buf);
+	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 && color_profile_screen_file);
+
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME);
+}
+
+static GtkWidget *layout_color_button(LayoutWindow *lw)
+{
+	GtkWidget *button;
+	GtkWidget *image;
+	gint enable;
+
+	button = gtk_button_new();
+	image = gtk_image_new_from_stock(GTK_STOCK_SELECT_COLOR, GTK_ICON_SIZE_MENU);
+	gtk_container_add(GTK_CONTAINER(button), image);
+	gtk_widget_show(image);
+	g_signal_connect(G_OBJECT(button), "clicked",
+			 G_CALLBACK(layout_color_button_press_cb), lw);
+        gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+
+	enable = (lw->image) ? lw->image->color_profile_enable : FALSE;
+#ifndef HAVE_LCMS
+	enable = FALSE;
+#endif
+	gtk_widget_set_sensitive(image, enable);
+
+	return button;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
  * status bar
  *-----------------------------------------------------------------------------
  */
@@ -486,6 +663,11 @@
 	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);
+
+	if (small_format) gtk_box_pack_end(GTK_BOX(hbox), lw->info_color, FALSE, FALSE, 0);
+
 	lw->info_status = layout_status_label(NULL, lw->info_box, TRUE, 0, (!small_format));
 
 	if (small_format)
@@ -499,6 +681,7 @@
 		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);
 	lw->info_zoom = layout_status_label(NULL, hbox, FALSE, ZOOM_LABEL_WIDTH, FALSE);
 }
 
@@ -1396,6 +1579,7 @@
 	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_zoom = NULL;