[Rawstudio-commit] r2055 - trunk/src

Anders Brander anders at brander.dk
Tue Sep 30 21:15:11 CEST 2008


Author: abrander
Date: 2008-09-30 21:15:11 +0200 (Tue, 30 Sep 2008)
New Revision: 2055

Modified:
   trunk/src/gtk-interface.c
   trunk/src/rs-preview-widget.c
Log:
[229] Made color-indicator - well - colored (Patch by Aleksandr Zolotarev).

Modified: trunk/src/gtk-interface.c
===================================================================
--- trunk/src/gtk-interface.c	2008-09-30 19:12:16 UTC (rev 2054)
+++ trunk/src/gtk-interface.c	2008-09-30 19:15:11 UTC (rev 2055)
@@ -54,8 +54,8 @@
 static gboolean fullscreen;
 GtkWindow *rawstudio_window;
 static gint busycount = 0;
-static GtkWidget *valuefield;
-static GtkWidget *hbox;
+//static GtkWidget *valuefield[3];
+//static GtkWidget *hbox;
 GdkGC *dashed;
 GdkGC *grid;
 
@@ -793,14 +793,27 @@
 }
 
 void
-preview_motion(RSPreviewWidget *preview, RS_PREVIEW_CALLBACK_DATA *cbdata, RS_BLOB *rs)
+preview_motion(RSPreviewWidget *preview, RS_PREVIEW_CALLBACK_DATA *cbdata, GtkLabel **valuefield)
 {
+	gint c;
 	gchar tmp[20];
 
-	g_snprintf(tmp, 20, "%u %u %u", cbdata->pixel8[R], cbdata->pixel8[G], cbdata->pixel8[B]);
-	gtk_label_set_text(GTK_LABEL(valuefield), tmp);
+	for(c=0;c<3;c++)
+	{
+		g_snprintf(tmp, 20, "%u", cbdata->pixel8[c]);
+		gtk_label_set_markup (valuefield[c], tmp);
+	}
 }
 
+void
+preview_leave(RSPreviewWidget *preview, RS_PREVIEW_CALLBACK_DATA *cbdata, GtkLabel **valuefield)
+{
+	gint c;
+
+	for(c=0;c<3;c++)
+		gtk_label_set_text(valuefield[c], "-");
+}
+
 static gboolean
 open_file_in_mainloop(gpointer data)
 {
@@ -909,6 +922,10 @@
 	GdkColor grid_fg = {0, 32767, 32767, 32767};
 	GdkColor bgcolor = {0, 0, 0, 0 };
 	GString *window_title = g_string_new(_("Rawstudio"));
+	GdkColor tmpcolor;
+	GtkWidget *hbox; /* for statusbar */
+	GtkWidget *valuefield[3];
+
 	
 	gtk_window_set_default_icon_from_file(PACKAGE_DATA_DIR "/icons/" PACKAGE ".png", NULL);
 	rs->window = gui_window_make(rs);
@@ -926,9 +943,30 @@
 
 	/* Build status bar */
 	statusbar = GTK_STATUSBAR(gtk_statusbar_new());
-	valuefield = gtk_label_new(NULL);
+
+	valuefield[R] = gtk_label_new(NULL);
+	gtk_label_set_width_chars (GTK_LABEL(valuefield[R]), 3);
+	gtk_misc_set_alignment (GTK_MISC(valuefield[R]), 1.0, 0.5);
+	gdk_color_parse("#ef2929", &tmpcolor); /* Scarlet Red */
+	gtk_widget_modify_fg (GTK_WIDGET(valuefield[R]), GTK_STATE_NORMAL, &tmpcolor);
+
+	valuefield[G] = gtk_label_new(NULL);
+	gtk_label_set_width_chars (GTK_LABEL(valuefield[G]), 3);
+	gtk_misc_set_alignment (GTK_MISC(valuefield[G]), 1.0, 0.5);
+	gdk_color_parse("#8ae234", &tmpcolor); /* Chameleon */
+	gtk_widget_modify_fg (GTK_WIDGET(valuefield[G]), GTK_STATE_NORMAL, &tmpcolor);
+
+	valuefield[B] = gtk_label_new(NULL);
+	gtk_label_set_width_chars (GTK_LABEL(valuefield[B]), 3);
+	gtk_misc_set_alignment (GTK_MISC(valuefield[B]), 1.0, 0.5);
+	gdk_color_parse("#729fcf", &tmpcolor); /* Sky Blue */
+	gtk_widget_modify_fg (GTK_WIDGET(valuefield[B]), GTK_STATE_NORMAL, &tmpcolor);
+
 	hbox = gtk_hbox_new (FALSE, 0);
-	gtk_box_pack_start (GTK_BOX (hbox), valuefield, FALSE, TRUE, 0);
+	gtk_box_set_spacing(GTK_BOX(hbox), 3);
+	gtk_box_pack_start (GTK_BOX (hbox), valuefield[R], FALSE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), valuefield[G], FALSE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), valuefield[B], FALSE, TRUE, 0);
 	gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (statusbar), TRUE, TRUE, 0);
 
 	/* Build toolbox */
@@ -969,7 +1007,8 @@
 	rs_conf_get_color(CONF_PREBGCOLOR, &bgcolor);
 	rs_preview_widget_set_bgcolor(RS_PREVIEW_WIDGET(rs->preview), &bgcolor);
 	g_signal_connect(G_OBJECT(rs->preview), "wb-picked", G_CALLBACK(preview_wb_picked), rs);
-	g_signal_connect(G_OBJECT(rs->preview), "motion", G_CALLBACK(preview_motion), rs);
+	g_signal_connect(G_OBJECT(rs->preview), "motion", G_CALLBACK(preview_motion), valuefield);
+	g_signal_connect(G_OBJECT(rs->preview), "leave", G_CALLBACK(preview_leave), valuefield);
 
 	/* Split pane below iconbox */
 	pane = gtk_hpaned_new ();

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c	2008-09-30 19:12:16 UTC (rev 2054)
+++ trunk/src/rs-preview-widget.c	2008-09-30 19:15:11 UTC (rev 2055)
@@ -151,6 +151,8 @@
 	GdkPixbuf *buffer[MAX_VIEWS];
 	RSColorTransform *rct[MAX_VIEWS];
 	gint dirty[MAX_VIEWS]; /* Dirty flag, used for multiple things */
+
+	gboolean prev_inside_image; /* For motion and leave function*/
 };
 
 /* Define the boiler plate stuff using the predefined macro */
@@ -168,6 +170,7 @@
 enum {
 	WB_PICKED,
 	MOTION_SIGNAL,
+	LEAVE_SIGNAL,
 	LAST_SIGNAL
 };
 
@@ -183,6 +186,7 @@
 static void adjustment_changed(GtkAdjustment *adjustment, gpointer user_data);
 static gboolean button(GtkWidget *widget, GdkEventButton *event, RSPreviewWidget *preview);
 static gboolean motion(GtkWidget *widget, GdkEventMotion *event, gpointer user_data);
+static gboolean leave(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data);
 static void settings_changed(RS_PHOTO *photo, RSSettingsMask mask, RSPreviewWidget *preview);
 static void spatial_changed(RS_PHOTO *photo, RSPreviewWidget *preview);
 static void input_changed(RS_IMAGE16 *image, RSPreviewWidget *preview);
@@ -224,6 +228,14 @@
 		NULL,
 		g_cclosure_marshal_VOID__POINTER,
 		G_TYPE_NONE, 1, G_TYPE_POINTER);
+	signals[LEAVE_SIGNAL] = g_signal_new ("leave",
+		G_TYPE_FROM_CLASS (klass),
+		G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+		0, /* Is this right? */
+		NULL,
+		NULL,
+		g_cclosure_marshal_VOID__POINTER,
+		G_TYPE_NONE, 1, G_TYPE_POINTER);
 }
 
 /**
@@ -256,12 +268,15 @@
 		G_CALLBACK (button), preview);
 	g_signal_connect (G_OBJECT (preview->canvas), "motion_notify_event",
 		G_CALLBACK (motion), preview);
+	g_signal_connect (G_OBJECT (preview->canvas), "leave_notify_event",
+		G_CALLBACK (leave), preview);
 
 	/* Let us know about pointer movements */
 	gtk_widget_set_events(GTK_WIDGET(preview->canvas), 0
 		| GDK_BUTTON_PRESS_MASK
 		| GDK_BUTTON_RELEASE_MASK
-		| GDK_POINTER_MOTION_MASK);
+		| GDK_POINTER_MOTION_MASK
+		| GDK_LEAVE_NOTIFY_MASK);
 
 	preview->state = WB_PICKER;
 	preview->split = SPLIT_VERTICAL;
@@ -307,6 +322,8 @@
 	g_signal_connect(G_OBJECT(preview->canvas), "size-allocate", G_CALLBACK(size_allocate), preview);
 	g_signal_connect(G_OBJECT(preview), "realize", G_CALLBACK(realize), NULL);
 	g_signal_connect(G_OBJECT(preview->canvas), "scroll_event", G_CALLBACK (scroll), preview);
+
+	preview->prev_inside_image = FALSE;
 }
 
 /**
@@ -1865,9 +1882,37 @@
 		if (make_cbdata(preview, view, &cbdata, scaled_x, scaled_y, real_x, real_y))
 			g_signal_emit (G_OBJECT (preview), signals[MOTION_SIGNAL], 0, &cbdata);
 	}
+
+	/* Check not to generate superfluous signals "leave"*/
+	if (inside_image != preview->prev_inside_image)
+	{
+		preview->prev_inside_image = inside_image;
+		if (!inside_image && g_signal_has_handler_pending(preview, signals[LEAVE_SIGNAL], 0, FALSE))	
+		{
+			RS_PREVIEW_CALLBACK_DATA cbdata;
+			if (make_cbdata(preview, view, &cbdata, scaled_x, scaled_y, real_x, real_y))
+				g_signal_emit (G_OBJECT (preview), signals[LEAVE_SIGNAL], 0, &cbdata);
+		}
+	}
+
 	return TRUE;
 }
 
+static gboolean 
+leave(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
+{
+	RSPreviewWidget *preview = RS_PREVIEW_WIDGET(user_data);
+
+	/* Check not to generate superfluous signals "leave"*/
+	if (preview->prev_inside_image)
+	{
+		preview->prev_inside_image = FALSE;
+		if (g_signal_has_handler_pending(preview, signals[LEAVE_SIGNAL], 0, FALSE))
+			g_signal_emit (G_OBJECT (preview), signals[LEAVE_SIGNAL], 0, NULL);
+	}
+	return TRUE;
+}
+
 static void
 settings_changed(RS_PHOTO *photo, RSSettingsMask mask, RSPreviewWidget *preview)
 {




More information about the Rawstudio-commit mailing list