[gthumb] Re-added the 2.10 semi-trasparent property box in fullscreen mode



commit eee507beb921419b8a7dd7247187a65e7f048d9c
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Wed Jan 5 19:18:42 2011 +0100

    Re-added the 2.10 semi-trasparent property box in fullscreen mode
    
    The i key shows/hides the property box in fullscreen mode.

 extensions/file_viewer/gth-file-viewer-page.c      |   14 ++
 extensions/gstreamer_tools/gth-media-viewer-page.c |   14 ++
 extensions/image_viewer/gth-image-viewer-page.c    |  184 ++++++++++++++++++++
 gthumb/cairo-utils.c                               |    1 +
 gthumb/gth-browser.c                               |   74 +++++++--
 gthumb/gth-browser.h                               |    3 +
 gthumb/gth-image-viewer.c                          |   53 ++++++
 gthumb/gth-image-viewer.h                          |    4 +
 gthumb/gth-viewer-page.c                           |   17 ++
 gthumb/gth-viewer-page.h                           |    8 +
 10 files changed, 358 insertions(+), 14 deletions(-)
---
diff --git a/extensions/file_viewer/gth-file-viewer-page.c b/extensions/file_viewer/gth-file-viewer-page.c
index 6befb78..7d1d031 100644
--- a/extensions/file_viewer/gth-file-viewer-page.c
+++ b/extensions/file_viewer/gth-file-viewer-page.c
@@ -304,6 +304,19 @@ gth_file_viewer_page_real_can_save (GthViewerPage *base)
 
 
 static void
+gth_file_viewer_page_real_update_info (GthViewerPage *base,
+				       GthFileData   *file_data)
+{
+	GthFileViewerPage *self = GTH_FILE_VIEWER_PAGE (base);
+
+	if (! _g_file_equal (self->priv->file_data->file, file_data->file))
+		return;
+	_g_object_unref (self->priv->file_data);
+	self->priv->file_data = gth_file_data_dup (file_data);
+}
+
+
+static void
 gth_file_viewer_page_finalize (GObject *obj)
 {
 	GthFileViewerPage *self;
@@ -341,6 +354,7 @@ gth_viewer_page_interface_init (GthViewerPageIface *iface)
 	iface->show_pointer = gth_file_viewer_page_real_show_pointer;
 	iface->update_sensitivity = gth_file_viewer_page_real_update_sensitivity;
 	iface->can_save = gth_file_viewer_page_real_can_save;
+	iface->update_info = gth_file_viewer_page_real_update_info;
 }
 
 
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c b/extensions/gstreamer_tools/gth-media-viewer-page.c
index 402f0e1..9dfa057 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -1220,6 +1220,19 @@ gth_media_viewer_page_real_revert (GthViewerPage *base)
 
 
 static void
+gth_media_viewer_page_real_update_info (GthViewerPage *base,
+				        GthFileData   *file_data)
+{
+	GthMediaViewerPage *self = GTH_MEDIA_VIEWER_PAGE (base);
+
+	if (! _g_file_equal (self->priv->file_data->file, file_data->file))
+		return;
+	_g_object_unref (self->priv->file_data);
+	self->priv->file_data = gth_file_data_dup (file_data);
+}
+
+
+static void
 gth_media_viewer_page_finalize (GObject *obj)
 {
 	GthMediaViewerPage *self;
@@ -1270,6 +1283,7 @@ gth_viewer_page_interface_init (GthViewerPageIface *iface)
 	iface->save = gth_media_viewer_page_real_save;
 	iface->save_as = gth_media_viewer_page_real_save_as;
 	iface->revert = gth_media_viewer_page_real_revert;
+	iface->update_info = gth_media_viewer_page_real_update_info;
 }
 
 
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 171f064..c6567a2 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -452,6 +452,153 @@ pref_viewer_shrink_wrap_changed (GConfClient *client,
 
 
 static void
+paint_comment_over_image_func (GthImageViewer *image_viewer,
+			       GdkEventExpose *event,
+			       cairo_t        *cr,
+			       gpointer        user_data)
+{
+	GthImageViewerPage *self = user_data;
+	GthFileData        *file_data = self->priv->file_data;
+	GString            *file_info;
+	char               *comment;
+	const char         *file_date;
+	const char         *file_size;
+	int                 current_position;
+	int                 n_visibles;
+	int                 width;
+	int                 height;
+	GthMetadata        *metadata;
+	PangoLayout        *layout;
+	PangoAttrList      *attr_list = NULL;
+	GError             *error = NULL;
+	char               *text;
+	static GdkPixbuf   *icon = NULL;
+	int                 icon_width;
+	int                 icon_height;
+	int                 image_width;
+	int                 image_height;
+	const int           x_padding = 10;
+	const int           y_padding = 10;
+	int                 max_text_width;
+	PangoRectangle      bounds;
+	int                 text_x;
+	int                 text_y;
+	int                 icon_x;
+	int                 icon_y;
+
+	file_info = g_string_new ("");
+
+	comment = gth_file_data_get_attribute_as_string (file_data, "general::description");
+	if (comment != NULL) {
+		g_string_append_printf (file_info, "<b>%s</b>\n\n", comment);
+		g_free (comment);
+	}
+
+	metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::datetime");
+	if (metadata != NULL)
+		file_date = gth_metadata_get_formatted (metadata);
+	else
+		file_date = g_file_info_get_attribute_string (file_data->info, "gth::file::display-mtime");
+	file_size = g_file_info_get_attribute_string (file_data->info, "gth::file::display-size");
+
+	gth_browser_get_file_list_info (self->priv->browser, &current_position, &n_visibles);
+	gth_image_viewer_get_original_size (GTH_IMAGE_VIEWER (self->priv->viewer), &width, &height);
+
+	g_string_append_printf (file_info,
+			        "<small><i>%s - %dx%d (%d%%) - %s</i>\n<tt>%d/%d - %s</tt></small>",
+			        file_date,
+			        width,
+			        height,
+			        (int) (gth_image_viewer_get_zoom (GTH_IMAGE_VIEWER (self->priv->viewer)) * 100),
+			        file_size,
+			        current_position + 1,
+			        n_visibles,
+				g_file_info_get_attribute_string (file_data->info, "standard::display-name"));
+
+	layout = gtk_widget_create_pango_layout (GTK_WIDGET (self->priv->viewer), NULL);
+	pango_layout_set_wrap (layout, PANGO_WRAP_WORD);
+	pango_layout_set_font_description (layout, GTK_WIDGET (self->priv->viewer)->style->font_desc);
+	pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT);
+
+	if (! pango_parse_markup (file_info->str,
+			          -1,
+				  0,
+				  &attr_list,
+				  &text,
+				  NULL,
+				  &error))
+	{
+		g_warning ("Failed to set text from markup due to error parsing markup: %s\nThis is the text that caused the error: %s",  error->message, file_info->str);
+		g_error_free (error);
+		g_object_unref (layout);
+		g_string_free (file_info, TRUE);
+		return;
+	}
+
+	pango_layout_set_attributes (layout, attr_list);
+        pango_layout_set_text (layout, text, strlen (text));
+
+        if (icon == NULL) {
+        	GIcon *gicon;
+
+        	gicon = g_themed_icon_new (GTK_STOCK_PROPERTIES);
+        	icon = _g_icon_get_pixbuf (gicon, 24, NULL);
+
+        	g_object_unref (gicon);
+        }
+	icon_width = gdk_pixbuf_get_width (icon);
+	icon_height = gdk_pixbuf_get_height (icon);
+
+	gdk_drawable_get_size (gtk_widget_get_window (self->priv->viewer), &image_width, &image_height);
+	max_text_width = ((image_width * 3 / 4) - icon_width - (x_padding * 3) - (x_padding * 2));
+
+	pango_layout_set_width (layout, max_text_width * PANGO_SCALE);
+	pango_layout_get_pixel_extents (layout, NULL, &bounds);
+
+	bounds.width += (2 * x_padding) + (icon_width + x_padding);
+	bounds.height = MIN (image_height - icon_height - (y_padding * 2), bounds.height + (2 * y_padding));
+	bounds.x = MAX ((image_width - bounds.width) / 2, 0);
+	bounds.y = MAX (image_height - bounds.height - (y_padding * 3), 0);
+
+	text_x = bounds.x + x_padding + icon_width + x_padding;
+	text_y = bounds.y + y_padding;
+	icon_x = bounds.x + x_padding;
+	icon_y = bounds.y + (bounds.height - icon_height) / 2;
+
+	cairo_save (cr);
+
+	/* background */
+
+	_cairo_draw_rounded_box (cr, bounds.x, bounds.y, bounds.width, bounds.height, 8.0);
+	cairo_set_source_rgba (cr, 0.94, 0.94, 0.94, 0.81);
+	cairo_fill (cr);
+	cairo_set_line_width (cr, 1.0);
+	cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+	cairo_stroke (cr);
+
+	/* icon */
+
+	gdk_cairo_set_source_pixbuf (cr, icon, icon_x, icon_y);
+	cairo_rectangle (cr, icon_x, icon_y, icon_width, icon_height);
+	cairo_fill (cr);
+
+	/* text */
+
+	cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+	pango_cairo_update_layout (cr, layout);
+	cairo_move_to (cr, text_x, text_y);
+	pango_cairo_show_layout (cr, layout);
+
+	cairo_restore (cr);
+
+        g_free (text);
+        pango_attr_list_unref (attr_list);
+	g_object_unref (layout);
+	g_string_free (file_info, TRUE);
+}
+
+
+static void
 gth_image_viewer_page_real_activate (GthViewerPage *base,
 				     GthBrowser    *browser)
 {
@@ -742,6 +889,7 @@ gth_image_viewer_page_real_fullscreen (GthViewerPage *base,
 	GthImageViewerPage *self;
 
 	self = (GthImageViewerPage *) base;
+
 	if (active) {
 		gth_image_navigator_set_scrollbars_visible (GTH_IMAGE_NAVIGATOR (self->priv->image_navigator), FALSE);
 		gth_image_viewer_set_black_background (GTH_IMAGE_VIEWER (self->priv->viewer), TRUE);
@@ -1055,6 +1203,40 @@ gth_image_viewer_page_real_revert (GthViewerPage *base)
 
 
 static void
+gth_image_viewer_page_real_update_info (GthViewerPage *base,
+					GthFileData   *file_data)
+{
+	GthImageViewerPage *self = GTH_IMAGE_VIEWER_PAGE (base);
+
+	if (! _g_file_equal (self->priv->file_data->file, file_data->file))
+		return;
+	_g_object_unref (self->priv->file_data);
+	self->priv->file_data = gth_file_data_dup (file_data);
+
+	if (self->priv->viewer == NULL)
+		return;
+
+	gth_image_viewer_update_view (GTH_IMAGE_VIEWER (self->priv->viewer));
+}
+
+
+static void
+gth_image_viewer_page_real_show_properties (GthViewerPage *base,
+					    gboolean       show)
+{
+	GthImageViewerPage *self;
+
+	self = GTH_IMAGE_VIEWER_PAGE (base);
+
+	if (show)
+		gth_image_viewer_add_painter (GTH_IMAGE_VIEWER (self->priv->viewer), paint_comment_over_image_func, self);
+	else
+		gth_image_viewer_remove_painter (GTH_IMAGE_VIEWER (self->priv->viewer), paint_comment_over_image_func, self);
+	gth_image_viewer_update_view (GTH_IMAGE_VIEWER (self->priv->viewer));
+}
+
+
+static void
 gth_image_viewer_page_finalize (GObject *obj)
 {
 	GthImageViewerPage *self;
@@ -1096,6 +1278,8 @@ gth_viewer_page_interface_init (GthViewerPageIface *iface)
 	iface->save = gth_image_viewer_page_real_save;
 	iface->save_as = gth_image_viewer_page_real_save_as;
 	iface->revert = gth_image_viewer_page_real_revert;
+	iface->update_info = gth_image_viewer_page_real_update_info;
+	iface->show_properties = gth_image_viewer_page_real_show_properties;
 }
 
 
diff --git a/gthumb/cairo-utils.c b/gthumb/cairo-utils.c
index b37af37..5b72c29 100644
--- a/gthumb/cairo-utils.c
+++ b/gthumb/cairo-utils.c
@@ -144,6 +144,7 @@ _cairo_draw_rounded_box (cairo_t *cr,
 	cairo_rel_line_to (cr, - (w - (r * 2)), 0);
 	if (r > 0)
 		cairo_arc (cr, x + r, y + h - r, r, 0.5 * M_PI, 1.0 * M_PI);
+	cairo_rel_line_to (cr, 0, - (h - (r * 2)));
 }
 
 
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index e713ce5..4f71c75 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -110,6 +110,7 @@ struct _GthBrowserPrivateData {
 	GList             *viewer_pages;
 	GtkWidget         *viewer_thumbnails_pane;
 	GtkWidget         *viewer_sidebar_pane;
+	GtkWidget         *viewer_sidebar_alignment;
 	GtkWidget         *viewer_sidebar;
 	GtkWidget         *viewer_container;
 	GtkWidget         *viewer_toolbar;
@@ -135,6 +136,8 @@ struct _GthBrowserPrivateData {
 	GthFileData       *location;
 	GthFileData       *current_file;
 	GthFileSource     *location_source;
+	int                n_visibles;
+	int                current_file_position;
 	GFile             *monitor_location;
 	gboolean           activity_ref;
 	GthIconCache      *menu_icon_cache;
@@ -157,6 +160,7 @@ struct _GthBrowserPrivateData {
 	gboolean           constructed;
 	guint              selection_changed_event;
 	GthFileData       *folder_popup_file_data;
+	gboolean           properties_on_screen;
 
 	/* fulscreen */
 
@@ -477,8 +481,9 @@ _gth_browser_update_parent_list (GthBrowser *browser)
 void
 gth_browser_update_title (GthBrowser *browser)
 {
-	GString    *title;
-	const char *name = NULL;
+	GString      *title;
+	const char   *name = NULL;
+	GthFileStore *file_store;
 
 	title = g_string_new (NULL);
 
@@ -497,14 +502,18 @@ gth_browser_update_title (GthBrowser *browser)
 	else
 		g_string_append (title, _("gthumb"));
 
+	file_store = gth_browser_get_file_store (browser);
+	browser->priv->n_visibles = gth_file_store_n_visibles (file_store);
+	browser->priv->current_file_position = -1;
+
 	if (browser->priv->current_file != NULL) {
-		GthFileStore *file_store;
-		int           pos;
+		int pos;
 
-		file_store = gth_browser_get_file_store (browser);
 		pos = gth_file_store_get_pos (file_store, browser->priv->current_file->file);
-		if (pos >= 0)
-			g_string_append_printf (title, " (%d/%d)", pos + 1, gth_file_store_n_visibles (file_store));
+		if (pos >= 0) {
+			browser->priv->current_file_position = pos;
+			g_string_append_printf (title, " (%d/%d)", browser->priv->current_file_position + 1, browser->priv->n_visibles);
+		}
 	}
 
 	gtk_window_set_title (GTK_WINDOW (browser), title->str);
@@ -3907,9 +3916,12 @@ _gth_browser_construct (GthBrowser *browser)
 	gtk_widget_show (browser->priv->viewer_container);
 
 	gtk_paned_pack1 (GTK_PANED (browser->priv->viewer_sidebar_pane), browser->priv->viewer_container, TRUE, FALSE);
+	browser->priv->viewer_sidebar_alignment = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
 	browser->priv->viewer_sidebar = gth_sidebar_new ("file-tools");
 	gtk_widget_set_size_request (browser->priv->viewer_sidebar, DEF_VIEWER_SIDEBAR_WIDTH, -1);
-	gtk_paned_pack2 (GTK_PANED (browser->priv->viewer_sidebar_pane), browser->priv->viewer_sidebar, FALSE, FALSE);
+	gtk_widget_show (browser->priv->viewer_sidebar);
+	gtk_container_add (GTK_CONTAINER (browser->priv->viewer_sidebar_alignment), browser->priv->viewer_sidebar);
+	gtk_paned_pack2 (GTK_PANED (browser->priv->viewer_sidebar_pane), browser->priv->viewer_sidebar_alignment, FALSE, FALSE);
 
 	browser->priv->thumbnail_list = gth_file_list_new ((viewer_thumbnails_orientation == GTK_ORIENTATION_HORIZONTAL) ? GTH_FILE_LIST_TYPE_H_SIDEBAR : GTH_FILE_LIST_TYPE_V_SIDEBAR, TRUE);
 	gth_file_list_set_caption (GTH_FILE_LIST (browser->priv->thumbnail_list), "none");
@@ -4557,6 +4569,18 @@ gth_browser_set_sort_order (GthBrowser      *browser,
 
 
 void
+gth_browser_get_file_list_info (GthBrowser *browser,
+				int        *current_position,
+				int        *n_visibles)
+{
+	if (current_position != NULL)
+		*current_position = browser->priv->current_file_position;
+	if (n_visibles != NULL)
+		*n_visibles = browser->priv->n_visibles;
+}
+
+
+void
 gth_browser_stop (GthBrowser *browser)
 {
 	if (browser->priv->fullscreen)
@@ -4750,6 +4774,21 @@ gth_browser_viewer_scroll_event_cb (GthBrowser     *browser,
 }
 
 
+static void
+gth_browser_toggle_properties_on_screen (GthBrowser *browser)
+{
+	gboolean on_screen;
+
+	on_screen = browser->priv->fullscreen && (GTH_VIEWER_PAGE_GET_INTERFACE (browser->priv->viewer_page)->show_properties != NULL);
+	if (on_screen) {
+		browser->priv->properties_on_screen = ! browser->priv->properties_on_screen;
+		gth_viewer_page_show_properties (browser->priv->viewer_page, browser->priv->properties_on_screen);
+	}
+	else
+		gth_browser_show_viewer_properties (browser, ! _gth_browser_get_action_active (browser, "Viewer_Properties"));
+}
+
+
 gboolean
 gth_browser_viewer_key_press_cb (GthBrowser  *browser,
 				 GdkEventKey *event)
@@ -4784,7 +4823,7 @@ gth_browser_viewer_key_press_cb (GthBrowser  *browser,
 			return TRUE;
 
 		case GDK_i:
-			gth_browser_show_viewer_properties (GTH_BROWSER (browser), ! _gth_browser_get_action_active (browser, "Viewer_Properties"));
+			gth_browser_toggle_properties_on_screen (GTH_BROWSER (browser));
 			return TRUE;
 
 		case GDK_f:
@@ -5148,6 +5187,8 @@ file_metadata_ready_cb (GList    *files,
 	if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER)
 		_gth_browser_make_file_visible (browser, browser->priv->current_file);
 	gth_browser_update_sensitivity (browser);
+	if (browser->priv->viewer_page != NULL)
+		gth_viewer_page_update_info (browser->priv->viewer_page, browser->priv->current_file);
 
 	if (browser->priv->location == NULL) {
 		GFile *parent;
@@ -5354,14 +5395,13 @@ gth_browser_show_viewer_properties (GthBrowser *browser,
 
 	if (show) {
 		_gth_browser_set_action_active (browser, "Viewer_Tools", FALSE);
-		gtk_widget_show (browser->priv->viewer_sidebar);
+		gtk_widget_show (browser->priv->viewer_sidebar_alignment);
 		gth_sidebar_show_properties (GTH_SIDEBAR (browser->priv->viewer_sidebar));
 	}
 	else
-		gtk_widget_hide (browser->priv->viewer_sidebar);
+		gtk_widget_hide (browser->priv->viewer_sidebar_alignment);
 }
 
-
 void
 gth_browser_show_viewer_tools (GthBrowser *browser,
 			       gboolean    show)
@@ -5370,11 +5410,11 @@ gth_browser_show_viewer_tools (GthBrowser *browser,
 
 	if (show) {
 		_gth_browser_set_action_active (browser, "Viewer_Properties", FALSE);
-		gtk_widget_show (browser->priv->viewer_sidebar);
+		gtk_widget_show (browser->priv->viewer_sidebar_alignment);
 		gth_sidebar_show_tools (GTH_SIDEBAR (browser->priv->viewer_sidebar));
 	}
 	else
-		gtk_widget_hide (browser->priv->viewer_sidebar);
+		gtk_widget_hide (browser->priv->viewer_sidebar_alignment);
 }
 
 
@@ -5701,12 +5741,16 @@ fullscreen_motion_notify_event_cb (GtkWidget      *widget,
 	{
 		if (! gtk_widget_get_visible (browser->priv->fullscreen_toolbar)) {
 			GList *scan;
+			int    fullscreen_toolbar_height;
 
 			for (scan = browser->priv->fullscreen_controls; scan; scan = scan->next)
 				gtk_widget_show ((GtkWidget *) scan->data);
 
 			if (browser->priv->viewer_page != NULL)
 				gth_viewer_page_show_pointer (GTH_VIEWER_PAGE (browser->priv->viewer_page), TRUE);
+
+			gtk_window_get_size (GTK_WINDOW (browser->priv->fullscreen_toolbar), NULL, &fullscreen_toolbar_height);
+			gtk_alignment_set_padding (GTK_ALIGNMENT (browser->priv->viewer_sidebar_alignment), fullscreen_toolbar_height + 6, 0, 0, 0);
 		}
 	}
 
@@ -5800,6 +5844,8 @@ gth_browser_unfullscreen (GthBrowser *browser)
 	g_list_free (browser->priv->fullscreen_controls);
 	browser->priv->fullscreen_controls = NULL;
 
+	gtk_alignment_set_padding (GTK_ALIGNMENT (browser->priv->viewer_sidebar_alignment), 0, 0, 0, 0);
+
 	gth_browser_update_sensitivity (browser);
 }
 
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 6f36519..11c4632 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -115,6 +115,9 @@ void             gth_browser_get_sort_order         (GthBrowser       *browser,
 void             gth_browser_set_sort_order         (GthBrowser       *browser,
 						     GthFileDataSort  *sort_type,
 						     gboolean          inverse);
+void             gth_browser_get_file_list_info     (GthBrowser       *browser,
+						     int              *current_position,
+						     int              *n_visibles);
 void             gth_browser_stop                   (GthBrowser       *browser);
 void             gth_browser_reload                 (GthBrowser       *browser);
 void             gth_browser_exec_task              (GthBrowser       *browser,
diff --git a/gthumb/gth-image-viewer.c b/gthumb/gth-image-viewer.c
index 99a518f..b596912 100644
--- a/gthumb/gth-image-viewer.c
+++ b/gthumb/gth-image-viewer.c
@@ -988,6 +988,19 @@ scroll_to (GthImageViewer *self,
 	self->x_offset = *x_offset;
 	self->y_offset = *y_offset;
 
+	if (self->priv->painters != NULL) {
+		GdkRectangle  area;
+
+		area.x = 0;
+		area.y = 0;
+		area.width = allocation.width;
+		area.height = allocation.height;
+		gdk_window_invalidate_rect (drawable, &area, TRUE);
+		gdk_window_process_updates (drawable, TRUE);
+
+		return;
+	}
+
 	/* move without invalidating the frame */
 
 	{
@@ -1809,10 +1822,24 @@ gth_image_viewer_add_painter (GthImageViewer          *self,
 			      GthImageViewerPaintFunc  func,
 			      gpointer                 user_data)
 {
+	GList       *link;
+	GList       *scan;
 	PainterData *painter_data;
 
 	g_return_if_fail (self != NULL);
 
+	link = NULL;
+	for (scan = self->priv->painters; scan; scan = scan->next) {
+		PainterData *painter_data = scan->data;
+		if ((painter_data->func == func) && (painter_data->user_data == user_data)) {
+			link = scan;
+			break;
+		}
+	}
+
+	if (link != NULL)
+		return;
+
 	painter_data = g_new0 (PainterData, 1);
 	painter_data->func = func;
 	painter_data->user_data = user_data;
@@ -1820,6 +1847,32 @@ gth_image_viewer_add_painter (GthImageViewer          *self,
 }
 
 
+void
+gth_image_viewer_remove_painter (GthImageViewer          *self,
+				 GthImageViewerPaintFunc  func,
+				 gpointer                 user_data)
+{
+	GList *link;
+	GList *scan;
+
+	link = NULL;
+	for (scan = self->priv->painters; scan; scan = scan->next) {
+		PainterData *painter_data = scan->data;
+		if ((painter_data->func == func) && (painter_data->user_data == user_data)) {
+			link = scan;
+			break;
+		}
+	}
+
+	if (link == NULL)
+		return;
+
+	self->priv->painters = g_list_remove_link (self->priv->painters, link);
+	painter_data_free (link->data);
+	g_list_free (link);
+}
+
+
 int
 gth_image_viewer_get_image_width (GthImageViewer *self)
 {
diff --git a/gthumb/gth-image-viewer.h b/gthumb/gth-image-viewer.h
index 155a04c..e8210e4 100644
--- a/gthumb/gth-image-viewer.h
+++ b/gthumb/gth-image-viewer.h
@@ -172,6 +172,10 @@ void           gth_image_viewer_add_painter              (GthImageViewer     *vi
 							  GthImageViewerPaintFunc
 							  	  	      func,
 							  gpointer            user_data);
+void           gth_image_viewer_remove_painter           (GthImageViewer     *viewer,
+							  GthImageViewerPaintFunc
+							  	  	      func,
+							  gpointer            user_data);
 
 /* image info. */
 
diff --git a/gthumb/gth-viewer-page.c b/gthumb/gth-viewer-page.c
index 4cc9c94..72fc2e1 100644
--- a/gthumb/gth-viewer-page.c
+++ b/gthumb/gth-viewer-page.c
@@ -193,6 +193,23 @@ gth_viewer_page_revert (GthViewerPage *self)
 
 
 void
+gth_viewer_page_update_info (GthViewerPage *self,
+		  	     GthFileData   *file_data)
+{
+	GTH_VIEWER_PAGE_GET_INTERFACE (self)->update_info (self, file_data);
+}
+
+
+void
+gth_viewer_page_show_properties (GthViewerPage *self,
+				 gboolean       show)
+{
+	if (GTH_VIEWER_PAGE_GET_INTERFACE (self)->show_properties != NULL)
+		GTH_VIEWER_PAGE_GET_INTERFACE (self)->show_properties (self, show);
+}
+
+
+void
 gth_viewer_page_file_loaded (GthViewerPage *self,
 			     GthFileData   *file_data,
 			     gboolean       success)
diff --git a/gthumb/gth-viewer-page.h b/gthumb/gth-viewer-page.h
index 70611d2..e9eef08 100644
--- a/gthumb/gth-viewer-page.h
+++ b/gthumb/gth-viewer-page.h
@@ -70,6 +70,10 @@ struct _GthViewerPageIface {
 					  FileSavedFunc  func,
 					  gpointer       data);
 	void      (*revert)              (GthViewerPage *self);
+	void      (*update_info)         (GthViewerPage *self,
+					  GthFileData   *file_data);
+	void      (*show_properties)     (GthViewerPage *self,
+					  gboolean       show);
 
 	/*< signals >*/
 
@@ -103,6 +107,10 @@ void         gth_viewer_page_save_as             (GthViewerPage  *self,
 						  FileSavedFunc   func,
 						  gpointer        data);
 void         gth_viewer_page_revert              (GthViewerPage  *self);
+void         gth_viewer_page_update_info         (GthViewerPage  *self,
+		  	  	  	  	  GthFileData    *file_data);
+void         gth_viewer_page_show_properties     (GthViewerPage  *self,
+						  gboolean        show);
 void         gth_viewer_page_file_loaded         (GthViewerPage  *self,
 						  GthFileData    *file_data,
 						  gboolean        success);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]