[Rawstudio-commit] r2071 - trunk/src
Anders Brander
anders at brander.dk
Wed Oct 15 05:35:39 CEST 2008
Author: abrander
Date: 2008-10-15 05:35:39 +0200 (Wed, 15 Oct 2008)
New Revision: 2071
Modified:
trunk/src/gtk-helper.c
trunk/src/gtk-helper.h
Log:
Added gui_label_new_with_mouseover().
Modified: trunk/src/gtk-helper.c
===================================================================
--- trunk/src/gtk-helper.c 2008-10-13 20:27:11 UTC (rev 2070)
+++ trunk/src/gtk-helper.c 2008-10-15 03:35:39 UTC (rev 2071)
@@ -53,6 +53,7 @@
static gboolean rs_gtk_tree_model_count_helper(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
static gint rs_gtk_tree_model_count(GtkTreeModel *model);
static inline guint8 convert_color_channel (guint8 src, guint8 alpha);
+static gboolean label_new_with_mouseover_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data);
static const gchar *color_profiles[] = {
"*.icc",
@@ -1116,3 +1117,77 @@
return button;
}
+
+static gboolean
+label_new_with_mouseover_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
+{
+ /* Do some mangling to get the GtkLabel */
+ GtkLabel *label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(widget)));
+ const gchar *key;
+
+ /* Get the relevant key - if any */
+ switch (event->type)
+ {
+ case GDK_ENTER_NOTIFY:
+ key = "rs-mouseover-enter";
+ gtk_widget_set_state(widget, GTK_STATE_PRELIGHT);
+ break;
+ case GDK_LEAVE_NOTIFY:
+ key = "rs-mouseover-leave";
+ gtk_widget_set_state(widget, GTK_STATE_NORMAL);
+ break;
+ default:
+ key = NULL;
+ break;
+ }
+
+ /* Set new text */
+ if (key)
+ gtk_label_set_text(label, g_object_get_data(G_OBJECT(label), key));
+
+ /* No need to propagate this event */
+ return TRUE;
+}
+
+/**
+ * This will create a new GtkLabel that can alternate text when the pointer is
+ * hovering above it.
+ * @param normal_text The text to display when pointer is not hovering above
+ * @param hover_text The text to display when pointer is hovering above the label
+ * @return A new GtkLabel
+ */
+GtkWidget *
+gui_label_new_with_mouseover(const gchar *normal_text, const gchar *hover_text)
+{
+ GtkWidget *eventbox;
+ GtkWidget *label;
+ gint max_width;
+
+ g_assert(normal_text != NULL);
+ g_assert(hover_text != NULL);
+
+ label = gtk_label_new(normal_text);
+
+ /* Align right */
+ gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
+
+ /* Calculate the maximum amount of characters displayed to avoid flickering */
+ max_width = MAX(g_utf8_strlen(normal_text, -1), g_utf8_strlen(hover_text, -1));
+ gtk_label_set_width_chars(GTK_LABEL(label), max_width);
+
+ /* Keep these in memory - AND free them with the GtkLabel */
+ g_object_set_data_full(G_OBJECT(label), "rs-mouseover-leave", g_strdup(normal_text), g_free);
+ g_object_set_data_full(G_OBJECT(label), "rs-mouseover-enter", g_strdup(hover_text), g_free);
+
+ /* Use an event box, since GtkLabel has no window of its own */
+ eventbox = gtk_event_box_new();
+
+ /* Listen for enter/leave events */
+ gtk_widget_set_events(eventbox, GDK_ENTER_NOTIFY_MASK|GDK_LEAVE_NOTIFY_MASK);
+ g_signal_connect(eventbox, "enter-notify-event", G_CALLBACK(label_new_with_mouseover_cb), NULL);
+ g_signal_connect(eventbox, "leave-notify-event", G_CALLBACK(label_new_with_mouseover_cb), NULL);
+
+ gtk_container_add(GTK_CONTAINER(eventbox), label);
+
+ return eventbox;
+}
Modified: trunk/src/gtk-helper.h
===================================================================
--- trunk/src/gtk-helper.h 2008-10-13 20:27:11 UTC (rev 2070)
+++ trunk/src/gtk-helper.h 2008-10-15 03:35:39 UTC (rev 2071)
@@ -70,3 +70,12 @@
* @return a new GtkButton
*/
extern GtkWidget *gui_button_new_from_stock_with_label(const gchar *stock_id, const gchar *label);
+
+/**
+ * This will create a new GtkLabel that can alternate text when the pointer is
+ * hovering above it.
+ * @param normal_text The text to display when pointer is not hovering above
+ * @param hover_text The text to display when pointer is hovering above the label
+ * @return A new GtkLabel
+ */
+extern GtkWidget *gui_label_new_with_mouseover(const gchar *normal_text, const gchar *hover_text);
More information about the Rawstudio-commit
mailing list