diff src/layout_util.c @ 1582:2ca277a9845b

- handle color profile and write metadata buttons on statusbar by ui_manager - statusbar buttons made configurable
author nadvornik
date Fri, 01 May 2009 23:15:51 +0000
parents 3d9f5c078521
children 70d59df4d2a2
line wrap: on
line diff
--- a/src/layout_util.c	Fri May 01 09:49:27 2009 +0000
+++ b/src/layout_util.c	Fri May 01 23:15:51 2009 +0000
@@ -54,7 +54,6 @@
 
 static gboolean layout_bar_enabled(LayoutWindow *lw);
 static gboolean layout_bar_sort_enabled(LayoutWindow *lw);
-static void layout_util_sync_color(LayoutWindow *lw);
 
 /*
  *-----------------------------------------------------------------------------
@@ -1037,6 +1036,11 @@
 
 #endif
 
+static void layout_menu_metadata_write_cb(GtkAction *action, gpointer data)
+{
+	metadata_write_queue_confirm(NULL, NULL);
+}
+
 
 /*
  *-----------------------------------------------------------------------------
@@ -1088,111 +1092,6 @@
 #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
 
 /*
  *-----------------------------------------------------------------------------
@@ -1358,6 +1257,7 @@
   { "LayoutConfig",GTK_STOCK_PREFERENCES,N_("_Configure this window..."),	NULL,	NULL,	CB(layout_menu_layout_config_cb) },
   { "Maintenance",	NULL,		N_("_Thumbnail maintenance..."),NULL,	NULL,	CB(layout_menu_remove_thumb_cb) },
   { "Wallpaper",	NULL,		N_("Set as _wallpaper"),NULL,		NULL,	CB(layout_menu_wallpaper_cb) },
+  { "SaveMetadata",	GTK_STOCK_SAVE,		N_("Save metadata"),NULL,		NULL,	CB(layout_menu_metadata_write_cb) },
 
   { "ZoomIn",	GTK_STOCK_ZOOM_IN,	N_("Zoom _in"),		"equal",	N_("Zoom in"),	CB(layout_menu_zoom_in_cb) },
   { "ZoomInAlt1",GTK_STOCK_ZOOM_IN,	N_("Zoom _in"),		"KP_Add",	N_("Zoom in"),	CB(layout_menu_zoom_in_cb) },
@@ -1427,7 +1327,7 @@
   { "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},
+  { "UseColorProfiles",	GTK_STOCK_SELECT_COLOR,		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},
   { "Grayscale",	NULL,		N_("Toggle _grayscale"),"<shift>G",	NULL,	CB(layout_menu_alter_desaturate_cb), FALSE},
 };
@@ -1520,6 +1420,7 @@
 "        <menuitem action='Flip'/>"
 "        <menuitem action='AlterNone'/>"
 "      </menu>"
+"      <menuitem action='SaveMetadata'/>"
 "      <placeholder name='PropertiesSection'/>"
 "      <separator/>"
 "      <menuitem action='Preferences'/>"
@@ -1634,6 +1535,8 @@
 "  </menubar>"
 "  <toolbar name='ToolBar'>"
 "  </toolbar>"
+"  <toolbar name='StatusBar'>"
+"  </toolbar>"
 "<accelerator action='PrevImageAlt1'/>"
 "<accelerator action='PrevImageAlt2'/>"
 "<accelerator action='NextImageAlt1'/>"
@@ -1883,6 +1786,7 @@
 void layout_actions_setup(LayoutWindow *lw)
 {
 	GError *error;
+	gint i;
 
 	if (lw->ui_manager) return;
 
@@ -1919,12 +1823,17 @@
 		exit(EXIT_FAILURE);
 		}
 	
-	layout_toolbar_clear(lw);
-	layout_toolbar_add_default(lw);
+	for (i = 0; i < TOOLBAR_COUNT; i++)
+		{
+		layout_toolbar_clear(lw, i);
+		layout_toolbar_add_default(lw, i);
+		}
 	
 	layout_actions_setup_marks(lw);
 	layout_actions_setup_editors(lw);
 
+	layout_util_status_update_write(lw);
+	
 	layout_actions_add_window(lw, lw->window);
 }
 
@@ -1972,59 +1881,110 @@
 	return lw->menu_bar;
 }
 
-GtkWidget *layout_actions_toolbar(LayoutWindow *lw)
+GtkWidget *layout_actions_toolbar(LayoutWindow *lw, ToolbarType type)
 {
-	if (lw->toolbar) return lw->toolbar;
-	lw->toolbar = gtk_ui_manager_get_widget(lw->ui_manager, "/ToolBar");
-	g_object_ref(lw->toolbar);
-	gtk_toolbar_set_icon_size(GTK_TOOLBAR(lw->toolbar), GTK_ICON_SIZE_SMALL_TOOLBAR);
-	gtk_toolbar_set_style(GTK_TOOLBAR(lw->toolbar), GTK_TOOLBAR_ICONS);
-	return lw->toolbar;
+	if (lw->toolbar[type]) return lw->toolbar[type];
+	switch (type)
+		{
+		case TOOLBAR_MAIN:
+			lw->toolbar[type] = gtk_ui_manager_get_widget(lw->ui_manager, "/ToolBar");
+			gtk_toolbar_set_icon_size(GTK_TOOLBAR(lw->toolbar[type]), GTK_ICON_SIZE_SMALL_TOOLBAR);
+			gtk_toolbar_set_style(GTK_TOOLBAR(lw->toolbar[type]), GTK_TOOLBAR_ICONS);
+			break;
+		case TOOLBAR_STATUS:
+			lw->toolbar[type] = gtk_ui_manager_get_widget(lw->ui_manager, "/StatusBar");
+			gtk_toolbar_set_icon_size(GTK_TOOLBAR(lw->toolbar[type]), GTK_ICON_SIZE_MENU);
+			gtk_toolbar_set_style(GTK_TOOLBAR(lw->toolbar[type]), GTK_TOOLBAR_ICONS);
+			gtk_toolbar_set_show_arrow(GTK_TOOLBAR(lw->toolbar[type]), FALSE);
+			break;
+		default:
+			break;
+		}
+	g_object_ref(lw->toolbar[type]);
+	return lw->toolbar[type];
 }
 
-void layout_toolbar_clear(LayoutWindow *lw)
+void layout_toolbar_clear(LayoutWindow *lw, ToolbarType type)
 {
-	if (lw->toolbar_merge_id) 
+	if (lw->toolbar_merge_id[type]) 
 		{
-		gtk_ui_manager_remove_ui(lw->ui_manager, lw->toolbar_merge_id);
+		gtk_ui_manager_remove_ui(lw->ui_manager, lw->toolbar_merge_id[type]);
 		gtk_ui_manager_ensure_update(lw->ui_manager);
 		}
-	string_list_free(lw->toolbar_actions);
-	lw->toolbar_actions = NULL;
+	string_list_free(lw->toolbar_actions[type]);
+	lw->toolbar_actions[type] = NULL;
 	
-	lw->toolbar_merge_id = gtk_ui_manager_new_merge_id(lw->ui_manager);
+	lw->toolbar_merge_id[type] = gtk_ui_manager_new_merge_id(lw->ui_manager);
 }
 	
 
-void layout_toolbar_add(LayoutWindow *lw, const gchar *action)
+void layout_toolbar_add(LayoutWindow *lw, ToolbarType type, const gchar *action)
 {
+	const gchar *path = NULL;
 	if (!action || !lw->ui_manager) return;
 	
-	if (g_list_find_custom(lw->toolbar_actions, action, (GCompareFunc)strcmp)) return;
+	if (g_list_find_custom(lw->toolbar_actions[type], action, (GCompareFunc)strcmp)) return;
+
+	switch (type)
+		{
+		case TOOLBAR_MAIN:
+			path = "/ToolBar";
+			break;
+		case TOOLBAR_STATUS:
+			path = "/StatusBar";
+			break;
+		default:
+			break;
+		}
 	
-	gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id, "/ToolBar", action, action, GTK_UI_MANAGER_TOOLITEM, FALSE); 
-	lw->toolbar_actions = g_list_append(lw->toolbar_actions, g_strdup(action));
+	gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id[type], path, action, action, GTK_UI_MANAGER_TOOLITEM, FALSE); 
+	lw->toolbar_actions[type] = g_list_append(lw->toolbar_actions[type], g_strdup(action));
 }
 
 
-void layout_toolbar_add_default(LayoutWindow *lw)
+void layout_toolbar_add_default(LayoutWindow *lw, ToolbarType type)
 {
-	layout_toolbar_add(lw, "Thumbnails");
-	layout_toolbar_add(lw, "Back");
-	layout_toolbar_add(lw, "Home");
-	layout_toolbar_add(lw, "Refresh");
-	layout_toolbar_add(lw, "ZoomIn");
-	layout_toolbar_add(lw, "ZoomOut");
-	layout_toolbar_add(lw, "ZoomFit");
-	layout_toolbar_add(lw, "Zoom100");
-	layout_toolbar_add(lw, "Preferences");
-	layout_toolbar_add(lw, "FloatTools");
+	switch (type)
+		{
+		case TOOLBAR_MAIN:
+			layout_toolbar_add(lw, type, "Thumbnails");
+			layout_toolbar_add(lw, type, "Back");
+			layout_toolbar_add(lw, type, "Home");
+			layout_toolbar_add(lw, type, "Refresh");
+			layout_toolbar_add(lw, type, "ZoomIn");
+			layout_toolbar_add(lw, type, "ZoomOut");
+			layout_toolbar_add(lw, type, "ZoomFit");
+			layout_toolbar_add(lw, type, "Zoom100");
+			layout_toolbar_add(lw, type, "Preferences");
+			layout_toolbar_add(lw, type, "FloatTools");
+			break;
+		case TOOLBAR_STATUS:
+			layout_toolbar_add(lw, type, "UseColorProfiles");
+			layout_toolbar_add(lw, type, "SaveMetadata");
+			break;
+		default:
+			break;
+		}
 }
 
-void layout_toolbar_write_config(LayoutWindow *lw, GString *outstr, gint indent)
+void layout_toolbar_write_config(LayoutWindow *lw, ToolbarType type, GString *outstr, gint indent)
 {
-	GList *work = lw->toolbar_actions;
-	WRITE_NL(); WRITE_STRING("<toolbar>");
+	const gchar *name = NULL;
+	GList *work = lw->toolbar_actions[type];
+
+	switch (type)
+		{
+		case TOOLBAR_MAIN:
+			name = "toolbar";
+			break;
+		case TOOLBAR_STATUS:
+			name = "statusbar";
+			break;
+		default:
+			break;
+		}
+
+	WRITE_NL(); WRITE_STRING("<%s>", name);
 	indent++;
 	WRITE_NL(); WRITE_STRING("<clear/>");
 	while (work)
@@ -2036,10 +1996,10 @@
 		WRITE_STRING("/>");
 		}
 	indent--;
-	WRITE_NL(); WRITE_STRING("</toolbar>");
+	WRITE_NL(); WRITE_STRING("</%s>", name);
 }
 
-void layout_toolbar_add_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values)
+void layout_toolbar_add_from_config(LayoutWindow *lw, ToolbarType type, const gchar **attribute_names, const gchar **attribute_values)
 {
 	gchar *action = NULL;
 	
@@ -2053,7 +2013,7 @@
 		log_printf("unknown attribute %s = %s\n", option, value);
 		}
 
-	layout_toolbar_add(lw, action);
+	layout_toolbar_add(lw, type, action);
 	g_free(action);	
 }
 
@@ -2062,13 +2022,46 @@
  * misc
  *-----------------------------------------------------------------------------
  */
+
+void layout_util_status_update_write(LayoutWindow *lw)
+{
+	GtkAction *action;
+	gint n = metadata_queue_length();
+	action = gtk_action_group_get_action(lw->action_group, "SaveMetadata");
+	gtk_action_set_sensitive(action, n > 0);
+	if (n > 0)
+		{
+		gchar *buf = g_strdup_printf(_("Number of files with unsaved metadata: %d"), n);
+		g_object_set(G_OBJECT(action), "tooltip", buf, NULL);
+		g_free(buf);
+		}
+	else
+		{
+		g_object_set(G_OBJECT(action), "tooltip", _("No unsaved metadata"), NULL);
+		}
+}
+
+void layout_util_status_update_write_all(void)
+{
+	GList *work;
+
+	work = layout_window_list;
+	while (work)
+		{
+		LayoutWindow *lw = work->data;
+		work = work->next;
+
+		layout_util_status_update_write(lw);
+		}
+}
+
 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)
+void layout_util_sync_color(LayoutWindow *lw)
 {
 	GtkAction *action;
 	gint input = 0;
@@ -2076,6 +2069,9 @@
 	gboolean use_image = FALSE;
 	gint i;
 	gchar action_name[15];
+	gchar *image_profile;
+	gchar *screen_profile;
+
 
 	if (!lw->action_group) return;
 	if (!layout_image_color_profile_get(lw, &input, &use_image)) return;
@@ -2084,6 +2080,20 @@
 
 	action = gtk_action_group_get_action(lw->action_group, "UseColorProfiles");
 	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), use_color);
+	
+	if (layout_image_color_profile_get_status(lw, &image_profile, &screen_profile))
+		{
+		gchar *buf;
+		buf = g_strdup_printf(_("Image profile: %s\nScreen profile: %s"), image_profile, screen_profile);
+		g_object_set(G_OBJECT(action), "tooltip", buf, NULL);
+		g_free(image_profile);
+		g_free(screen_profile);
+		g_free(buf);
+		}
+	else
+		{
+		g_object_set(G_OBJECT(action), "tooltip", _("Click to enable color management"), NULL);
+		}
 
 	action = gtk_action_group_get_action(lw->action_group, "UseImageProfile");
 	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), use_image);