gimp r25016 - in branches/weskaggs: . libgimpwidgets



Author: weskaggs
Date: Mon Mar  3 22:53:19 2008
New Revision: 25016
URL: http://svn.gnome.org/viewvc/gimp?rev=25016&view=rev

Log:
Bill Skaggs  <weskaggs primate ucdavis edu>

	* libgimpwidgets/gimpscalecontrol.[ch]: assorted fixes, and
	improvements in appearance.


Modified:
   branches/weskaggs/ChangeLog
   branches/weskaggs/libgimpwidgets/gimpscalecontrol.c
   branches/weskaggs/libgimpwidgets/gimpscalecontrol.h

Modified: branches/weskaggs/libgimpwidgets/gimpscalecontrol.c
==============================================================================
--- branches/weskaggs/libgimpwidgets/gimpscalecontrol.c	(original)
+++ branches/weskaggs/libgimpwidgets/gimpscalecontrol.c	Mon Mar  3 22:53:19 2008
@@ -70,6 +70,21 @@
 static GtkWidget *     gimp_scale_control_create_label      (GimpScaleControl *scale_control,
                                                            const gchar    *text);
 
+static GtkWidget *     gimp_scale_control_popup           (GimpScaleControl *scale_control);
+
+static void            gimp_scale_control_show_popup      (GtkWidget        *widget,
+                                                           GimpScaleControl *scale_control);
+
+static void            gimp_scale_control_remove_popup    (GtkWidget        *widget,
+                                                           GdkEventCrossing *event,
+                                                           GimpScaleControl *scale_control);
+
+static void            gimp_scale_control_value_changed   (GimpScaleControl *scale_control);
+
+static void            gimp_scale_control_set_value       (GimpScaleControl *scale_control,
+                                                           gdouble           value);
+
+
 G_DEFINE_TYPE (GimpScaleControl, gimp_scale_control, GTK_TYPE_ADJUSTMENT)
 
 #define parent_class gimp_scale_control_parent_class
@@ -96,15 +111,19 @@
   scale_control->help_id             = NULL;
   scale_control->logarithmic         = FALSE;
   scale_control->policy              = GTK_UPDATE_DISCONTINUOUS;
+  scale_control->text                = NULL;
 
   scale_control->scale_adj           = NULL;
   scale_control->spinbutton_adj      = NULL;
 
+  scale_control->button              = NULL;
+  scale_control->button_label        = NULL;
   scale_control->label               = NULL;
   scale_control->scale               = NULL;
   scale_control->spinbutton          = NULL;
   scale_control->entry               = NULL;
   scale_control->popup_button        = NULL;
+  scale_control->popup_window        = NULL;
 }
 
 static void
@@ -300,10 +319,16 @@
  */
 static GtkWidget *
 gimp_scale_control_create_label (GimpScaleControl *scale_control,
-                               const gchar    *text)
+                               const gchar        *text)
 {
+  gchar     *markup;
+  GtkWidget *label;
+
+  markup = g_markup_printf_escaped ("%s", text);
+  label = gtk_label_new (NULL);
 
-  GtkWidget *label = gtk_label_new_with_mnemonic (text);
+  gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), markup);
+  g_free (markup);
 
   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
 
@@ -372,88 +397,85 @@
                       const gchar *help_id)
 {
   GimpScaleControl *scale_control;
+  GtkWidget        *entry;
+  GtkWidget        *popup_button;
+  GtkWidget        *arrow;
+  GtkWidget        *hbox;
 
-  scale_control = gimp_scale_control_create (FALSE, scale_width, spinbutton_width,
+  /* we override the scale width */
+  scale_control = gimp_scale_control_create (FALSE, 180, spinbutton_width,
                                          value, lower, upper, step_increment,
                                          page_increment, digits, constrain,
                                          unconstrained_upper, unconstrained_lower,
                                          tooltip, help_id);
 
-  gimp_scale_control_create_widgets (scale_control);
-
+  scale_control->text  = text;
   scale_control->label = gimp_scale_control_create_label (scale_control, text);
 
-  gtk_table_attach (GTK_TABLE (table), scale_control->label,
-                    column, column + 1, row, row + 1,
-                    GTK_FILL, GTK_FILL, 0, 0);
-  gtk_widget_show (scale_control->label);
-  gtk_table_attach (GTK_TABLE (table), scale_control->scale,
-                    column + 1, column + 2, row, row + 1,
-                    GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
-  gtk_widget_show (scale_control->scale);
-  gtk_table_attach (GTK_TABLE (table), scale_control->spinbutton,
-                    column + 2, column + 3, row, row + 1,
-                    GTK_SHRINK, GTK_SHRINK, 0, 0);
-  gtk_widget_show (scale_control->spinbutton);
-
-  return GTK_OBJECT (scale_control);
-}
+  g_signal_connect (scale_control, "value-changed",
+                    G_CALLBACK (gimp_scale_control_value_changed),
+                    NULL);
+
+/*   scale_control->button = gtk_button_new (); */
+/*   gtk_button_set_relief (GTK_BUTTON (scale_control->button), */
+/*                          GTK_RELIEF_NONE); */
+/*   gtk_button_set_alignment (GTK_BUTTON (scale_control->button), */
+/*                             0, 0.5); */
+
+/*   scale_control->button_label = gtk_label_new (NULL); */
+/*   gtk_container_add (GTK_CONTAINER (scale_control->button), */
+/*                      scale_control->button_label); */
+/*   gtk_misc_set_alignment (GTK_MISC (scale_control->button_label), 0, 0.5); */
+/*   gtk_widget_show (scale_control->button_label); */
+
+/*   g_signal_connect (scale_control->button, "clicked", */
+/*      G_CALLBACK (gimp_scale_control_show_popup), */
+/*      (gpointer) scale_control); */
 
-GtkObject *
-gimp_scale_control_compact_new (GtkTable    *table,
-                              gint         column,
-                              gint         row,
-                              const gchar *text,
-                              gint         scale_width,
-                              gint         spinbutton_width,
-                              gdouble      value,
-                              gdouble      lower,
-                              gdouble      upper,
-                              gdouble      step_increment,
-                              gdouble      page_increment,
-                              guint        digits,
-                              gboolean     constrain,
-                              gdouble      unconstrained_lower,
-                              gdouble      unconstrained_upper,
-                              const gchar *tooltip,
-                              const gchar *help_id)
-{
-  GimpScaleControl *scale_control;
-  GtkWidget      *entry;
-  GtkWidget      *popup_button;
-  GtkWidget      *arrow;
-  gchar           value_str[20];
+  scale_control->entry = entry = gtk_entry_new ();
 
-  scale_control = gimp_scale_control_create (FALSE, scale_width, spinbutton_width,
-                                         value, lower, upper, step_increment,
-                                         page_increment, digits, constrain,
-                                         unconstrained_upper, unconstrained_lower,
-                                         tooltip, help_id);
+  if (digits == 0)
+    gtk_entry_set_width_chars (GTK_ENTRY (entry), 4);
+  else
+    gtk_entry_set_width_chars (GTK_ENTRY (entry), 8);
 
-  entry = gtk_entry_new ();
-  sprintf (value_str, "%lg", value);
-  gtk_entry_set_width_chars (GTK_ENTRY (entry), 8);
   gtk_entry_set_has_frame (GTK_ENTRY (entry), FALSE);
-  gtk_entry_set_text (GTK_ENTRY (entry), value_str);
+  gimp_scale_control_set_value (scale_control, value);
 
-  popup_button = gtk_button_new ();
-  gtk_button_set_relief (GTK_BUTTON (popup_button), GTK_RELIEF_NONE);
+  scale_control->popup_button = popup_button = gtk_button_new ();
+/*   gtk_button_set_relief (GTK_BUTTON (popup_button), GTK_RELIEF_NONE); */
+
+  g_signal_connect (popup_button, "clicked",
+     G_CALLBACK (gimp_scale_control_show_popup),
+     (gpointer) scale_control);
 
   arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_ETCHED_OUT);
   gtk_container_add (GTK_CONTAINER (popup_button), arrow);
   gtk_widget_show (arrow);
 
-  gtk_table_attach (GTK_TABLE (table), entry,
-                    column + 1, column + 2, row, row + 1,
+  hbox = gtk_hbox_new (FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), scale_control->entry, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), popup_button, FALSE, FALSE, 0);
+  gtk_widget_show (hbox);
+
+  gtk_table_attach (GTK_TABLE (table), scale_control->label,
+                    column, column + 1, row, row + 1,
                     GTK_FILL, GTK_FILL, 0, 0);
-  gtk_widget_show (entry);
-  gtk_table_attach (GTK_TABLE (table), popup_button,
-                    column + 2, column + 3, row, row + 1,
+  gtk_widget_show (scale_control->label);
+/*   gtk_table_attach (GTK_TABLE (table), scale_control->entry, */
+/*                     column + 1, column + 2, row, row + 1, */
+/*                     GTK_FILL, GTK_FILL, 0, 0); */
+
+
+/*   gtk_widget_show (scale_control->button); */
+  gtk_widget_show (scale_control->entry);
+
+  gtk_table_attach (GTK_TABLE (table), hbox,
+                    column + 1, column + 2, row, row + 1,
                     GTK_SHRINK, GTK_FILL, 0, 0);
   gtk_widget_show (popup_button);
 
-  scale_control->entry        = entry;
-  scale_control->popup_button = popup_button;
+  scale_control->popup_window = gimp_scale_control_popup (scale_control);
 
   return GTK_OBJECT (scale_control);
 }
@@ -506,6 +528,7 @@
 
   gimp_scale_control_create_widgets (scale_control);
 
+  scale_control->text  = text;
   scale_control->label = gimp_scale_control_create_label (scale_control, text);
 
   gtk_table_attach (GTK_TABLE (table), scale_control->label,
@@ -586,8 +609,10 @@
                                         scale_adj->step_increment,
                                         scale_adj->page_increment,
                                         0.0);
-          gtk_range_set_adjustment (GTK_RANGE (scale_control->scale),
-                                    GTK_ADJUSTMENT (new_adj));
+
+          if (scale_control->scale)
+            gtk_range_set_adjustment (GTK_RANGE (scale_control->scale),
+                                      GTK_ADJUSTMENT (new_adj));
 
           scale_adj = (GtkAdjustment *) new_adj;
           scale_control->scale_adj = GTK_OBJECT (scale_adj);
@@ -618,10 +643,7 @@
                          G_CALLBACK (log_adjustment_callback),
                          scale_adj);
 
-       g_object_set_data (G_OBJECT (adjustment),
-                          "logarithmic", GINT_TO_POINTER (TRUE));
-
-  scale_control->logarithmic = TRUE;
+       scale_control->logarithmic = TRUE;
     }
   else
     {
@@ -734,3 +756,166 @@
 
   GIMP_SCALE_CONTROL (adjustment)->policy = policy;
 }
+
+/*
+ * creates the popup.  It can later be shown by calling
+ * gimp_scale_control_show_popup.
+ */
+static GtkWidget *
+gimp_scale_control_popup (GimpScaleControl *scale_control)
+{
+  GtkWidget     *popup_window;
+  GtkWidget     *table;
+  GtkWidget     *frame;
+  GtkWidget     *label;
+  gchar         *value_str;
+  GdkColor       bg             = {0, 50000, 40000, 50000};
+  GtkAdjustment *adjustment     = GTK_ADJUSTMENT (scale_control->scale_adj);
+
+  gimp_scale_control_create_widgets (scale_control);
+
+  popup_window = gtk_window_new (GTK_WINDOW_POPUP);
+  gtk_widget_set_name (popup_window, "gimp-scale-control-popup-window");
+  gtk_window_set_type_hint (GTK_WINDOW (popup_window),
+                            GDK_WINDOW_TYPE_HINT_COMBO);
+  gtk_widget_set_size_request (popup_window, 220, 80);
+  gtk_window_set_resizable (GTK_WINDOW (popup_window), FALSE);
+  gtk_window_set_gravity (GTK_WINDOW (popup_window), GDK_GRAVITY_WEST);
+  gtk_widget_add_events (popup_window, GDK_LEAVE_NOTIFY_MASK);
+  gtk_widget_modify_bg (popup_window, GTK_STATE_NORMAL, &bg);
+  g_signal_connect (popup_window, "leave-notify-event",
+                    G_CALLBACK (gimp_scale_control_remove_popup),
+                    scale_control);
+
+  frame = gtk_frame_new (scale_control->text);
+  gtk_container_add (GTK_CONTAINER (popup_window), frame);
+  gtk_widget_show (frame);
+
+  table = gtk_table_new (4, 9, TRUE);
+  gtk_container_add (GTK_CONTAINER (frame), table);
+  gtk_widget_show (table);
+
+  gtk_table_attach (GTK_TABLE (table), scale_control->scale,
+                    1, 7, 0, 1,
+                    GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+  gtk_widget_show (scale_control->scale);
+
+  gtk_table_attach (GTK_TABLE (table), scale_control->spinbutton,
+                    3, 5, 1, 3,
+                    GTK_SHRINK, GTK_SHRINK, 0, 0);
+  gtk_widget_show (scale_control->spinbutton);
+
+  value_str = g_strdup_printf ("%lg", adjustment->lower);
+  label = gtk_label_new (value_str);
+  g_free (value_str);
+  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0);
+  gtk_table_attach (GTK_TABLE (table), label,
+                    0, 2, 1, 2,
+                    GTK_SHRINK, GTK_SHRINK, 0, 0);
+  gtk_widget_show (label);
+
+  value_str = g_strdup_printf ("%lg", adjustment->upper);
+  label = gtk_label_new (value_str);
+  g_free (value_str);
+  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0);
+  gtk_table_attach (GTK_TABLE (table), label,
+                    6, 8, 1, 2,
+                    GTK_SHRINK, GTK_SHRINK, 0, 0);
+  gtk_widget_show (label);
+
+  return popup_window;
+}
+
+/*
+ * position the popup window next to the calling widget,
+ * and show it
+ */
+static void
+gimp_scale_control_show_popup (GtkWidget        *widget,
+                               GimpScaleControl *scale_control)
+{
+  GtkWidget *popup_window = scale_control->popup_window;
+  GtkWidget *toplevel;
+  gint       x0;
+  gint       y0;
+  gint       x1;
+  gint       y1;
+
+
+  toplevel = gtk_widget_get_toplevel (widget);
+
+  if (! GTK_IS_WINDOW (toplevel))
+    return;
+
+  gtk_window_get_position (GTK_WINDOW (toplevel), &x0, &y0);
+  gtk_widget_translate_coordinates (widget, toplevel, 0, 0, &x1, &y1);
+
+  gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)),
+                               GTK_WINDOW (popup_window));
+  gtk_window_set_transient_for (GTK_WINDOW (popup_window),
+                                GTK_WINDOW (toplevel));
+
+  gtk_window_set_screen (GTK_WINDOW (popup_window),
+                         gtk_widget_get_screen (widget));
+
+  gtk_window_move (GTK_WINDOW (popup_window), x1 + x0 - 100, y1 + y0);
+
+  gtk_widget_show (popup_window);
+}
+
+static void
+gimp_scale_control_remove_popup (GtkWidget        *widget,
+                                 GdkEventCrossing *event,
+                                 GimpScaleControl *scale_control)
+{
+  if (event->detail != GDK_NOTIFY_INFERIOR)
+    gtk_widget_hide (scale_control->popup_window);
+}
+
+static void
+gimp_scale_control_value_changed (GimpScaleControl *scale_control)
+{
+  gdouble value;
+
+  value = GTK_ADJUSTMENT (scale_control)->value;
+
+  gimp_scale_control_set_value (scale_control, value);
+}
+
+/*
+ * sets the value in the entry
+ */
+static void
+gimp_scale_control_set_value (GimpScaleControl *scale_control,
+                              gdouble           value)
+{
+/*   gchar *markup; */
+  gchar *text;
+
+/*   markup = g_strdup_printf ("<u>%.*lf</u>", scale_control->digits, value); */
+
+  if (scale_control->digits == 0)
+    text = g_strdup_printf ("%d", (gint) value);
+  else
+    text = g_strdup_printf ("%.*lf", scale_control->digits, value);
+
+
+  if (scale_control->entry)
+      gtk_entry_set_text (GTK_ENTRY (scale_control->entry), text);
+/*       gtk_label_set_markup (GTK_LABEL (scale_control->button_label), markup); */
+
+  g_free (text);
+/*   g_free (markup); */
+}
+
+/*
+ * return the visible widget in the interface
+ */
+GtkWidget *
+gimp_scale_control_get_widget (GtkObject *adjustment)
+{
+  g_return_val_if_fail (GIMP_IS_SCALE_CONTROL (adjustment), NULL);
+
+  /* the hbox */
+  return GIMP_SCALE_CONTROL (adjustment)->entry->parent;
+}

Modified: branches/weskaggs/libgimpwidgets/gimpscalecontrol.h
==============================================================================
--- branches/weskaggs/libgimpwidgets/gimpscalecontrol.h	(original)
+++ branches/weskaggs/libgimpwidgets/gimpscalecontrol.h	Mon Mar  3 22:53:19 2008
@@ -63,6 +63,7 @@
   const gchar   *help_id;
   gboolean       logarithmic;
   GtkUpdateType  policy;
+  const gchar   *text;
 
   GtkObject     *scale_adj;
   GtkObject     *spinbutton_adj;
@@ -70,8 +71,11 @@
   GtkWidget     *label;
   GtkWidget     *scale;
   GtkWidget     *spinbutton;
+  GtkWidget     *button;
+  GtkWidget     *button_label;
   GtkWidget     *entry;
   GtkWidget     *popup_button;
+  GtkWidget     *popup_window;
 };
 
 struct _GimpScaleControlClass
@@ -151,6 +155,8 @@
 void        gimp_scale_control_set_update_policy (GtkObject     *adjustment,
                                                 GtkUpdateType  policy);
 
+GtkWidget * gimp_scale_control_get_widget     (GtkObject     *adjustment);
+
 G_END_DECLS
 
 #endif /* __GIMP_SCALE_CONTROL_H__ */



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