Code

reinstate wrongly ignored delta in pick; makes selecting small text objects much...
[inkscape.git] / src / ege-adjustment-action.cpp
index 2380e2e6bf669fbf15bdcc48444d995bba1bd51c..e6ec392adaf1c0c5e4991d68694549326f070f8a 100644 (file)
 
 /* Note: this file should be kept compilable as both .cpp and .c */
 
+#include <cmath>
 #include <string.h>
 
 #include <gdk/gdkkeysyms.h>
+#include <gtk/gtkversion.h>
 #include <gtk/gtktoolitem.h>
-#include <gtk/gtkspinbutton.h>
+#include <gtk/gtk.h>
 #include <gtk/gtkhscale.h>
+#if GTK_CHECK_VERSION(2,12,0)
+#include <gtk/gtkscalebutton.h>
+#include <gtk/gtkstock.h>
+#endif /* GTK_CHECK_VERSION(2,12,0) */
 #include <gtk/gtkhbox.h>
 #include <gtk/gtklabel.h>
 #include <gtk/gtkmisc.h>
@@ -89,6 +95,17 @@ enum {
     APPEARANCE_MINIMAL, // no label, just choices in a drop-down menu
 };
 
+#if GTK_CHECK_VERSION(2,12,0)
+/* TODO need to have appropriate icons setup for these: */
+static const gchar *floogles[] = {
+    GTK_STOCK_REMOVE,
+    GTK_STOCK_ADD,
+    GTK_STOCK_GO_DOWN,
+    GTK_STOCK_ABOUT,
+    GTK_STOCK_GO_UP,
+    0};
+#endif /* GTK_CHECK_VERSION(2,12,0) */
+
 typedef struct _EgeAdjustmentDescr EgeAdjustmentDescr;
 
 struct _EgeAdjustmentDescr
@@ -751,6 +768,13 @@ static gboolean event_cb( EgeAdjustmentAction* act, GdkEvent* evt )
     return handled;
 }
 
+static gchar*
+slider_format_falue (GtkScale* scale, gdouble value, gchar *label)
+{
+    (void)scale;
+    return g_strdup_printf("%s %d", label, (int) round(value));
+}
+
 static GtkWidget* create_tool_item( GtkAction* action )
 {
     GtkWidget* item = 0;
@@ -759,25 +783,31 @@ static GtkWidget* create_tool_item( GtkAction* action )
         EgeAdjustmentAction* act = EGE_ADJUSTMENT_ACTION( action );
         GtkWidget* spinbutton = 0;
         GtkWidget* hb = gtk_hbox_new( FALSE, 5 );
+
         GValue value;
+        memset( &value, 0, sizeof(value) );
+        g_value_init( &value, G_TYPE_STRING );
+        g_object_get_property( G_OBJECT(action), "short_label", &value );
+        const gchar* sss = g_value_get_string( &value );
 
         if ( act->private_data->appearanceMode == APPEARANCE_FULL ) {
             spinbutton = gtk_hscale_new( act->private_data->adj);
             gtk_widget_set_size_request(spinbutton, 100, -1);
+            gtk_scale_set_digits (GTK_SCALE(spinbutton), 0);
+            gtk_signal_connect(GTK_OBJECT(spinbutton), "format-value", GTK_SIGNAL_FUNC(slider_format_falue), (void *) sss);
+
+#if GTK_CHECK_VERSION(2,12,0)
+        } else if ( act->private_data->appearanceMode == APPEARANCE_MINIMAL ) {
+            spinbutton = gtk_scale_button_new( GTK_ICON_SIZE_MENU, 0, 100, 2, 0 );
+            gtk_scale_button_set_adjustment( GTK_SCALE_BUTTON(spinbutton), act->private_data->adj );
+            gtk_scale_button_set_icons( GTK_SCALE_BUTTON(spinbutton), floogles );
+#endif /* GTK_CHECK_VERSION(2,12,0) */
         } else {
             spinbutton = gtk_spin_button_new( act->private_data->adj, act->private_data->climbRate, act->private_data->digits );
         }
 
         item = GTK_WIDGET( gtk_tool_item_new() );
 
-        memset( &value, 0, sizeof(value) );
-        g_value_init( &value, G_TYPE_STRING );
-        g_object_get_property( G_OBJECT(action), "short_label", &value );
-        const gchar* sss = g_value_get_string( &value );
-
-        GtkWidget* lbl = gtk_label_new( sss ? sss : "wwww" );
-        GtkWidget* filler1 = gtk_label_new(" ");
-
         {
             GValue tooltip;
             memset( &tooltip, 0, sizeof(tooltip) );
@@ -792,10 +822,14 @@ static GtkWidget* create_tool_item( GtkAction* action )
             }
         }
 
-        gtk_misc_set_alignment( GTK_MISC(lbl), 1.0, 0.5 );
+        if ( act->private_data->appearanceMode != APPEARANCE_FULL ) {
+            GtkWidget* lbl = gtk_label_new( sss ? sss : "wwww" );
+            GtkWidget* filler1 = gtk_label_new(" ");
+            gtk_misc_set_alignment( GTK_MISC(lbl), 1.0, 0.5 );
+            gtk_box_pack_start( GTK_BOX(hb), filler1, FALSE, FALSE, 0 );
+            gtk_box_pack_start( GTK_BOX(hb), lbl, FALSE, FALSE, 0 );
+        }
 
-        gtk_box_pack_start( GTK_BOX(hb), filler1, FALSE, FALSE, 0 );
-        gtk_box_pack_start( GTK_BOX(hb), lbl, FALSE, FALSE, 0 );
         if ( act->private_data->appearanceMode == APPEARANCE_FULL ) {
             gtk_box_pack_start( GTK_BOX(hb), spinbutton, TRUE, TRUE, 0 );
         }  else {
@@ -817,6 +851,10 @@ static GtkWidget* create_tool_item( GtkAction* action )
         g_signal_connect_swapped( G_OBJECT(spinbutton), "event", G_CALLBACK(event_cb), action );
         if ( act->private_data->appearanceMode == APPEARANCE_FULL ) {
             /* */
+#if GTK_CHECK_VERSION(2,12,0)
+        } else if ( act->private_data->appearanceMode == APPEARANCE_MINIMAL ) {
+            /* */
+#endif /* GTK_CHECK_VERSION(2,12,0) */
         } else {
             gtk_entry_set_width_chars( GTK_ENTRY(spinbutton), act->private_data->digits + 3 );
         }
@@ -860,6 +898,10 @@ gboolean focus_in_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
         EgeAdjustmentAction* action = EGE_ADJUSTMENT_ACTION( data );
         if ( GTK_IS_SPIN_BUTTON(widget) ) {
             action->private_data->lastVal = gtk_spin_button_get_value( GTK_SPIN_BUTTON(widget) );
+#if GTK_CHECK_VERSION(2,12,0)
+        } else if ( GTK_IS_SCALE_BUTTON(widget) ) {
+            action->private_data->lastVal = gtk_scale_button_get_value( GTK_SCALE_BUTTON(widget) );
+#endif /* GTK_CHECK_VERSION(2,12,0) */
         } else if (GTK_IS_RANGE(widget) ) {
             action->private_data->lastVal = gtk_range_get_value( GTK_RANGE(widget) );
         }