[gcalctool] Add shortcuts to change base (Ctrl+B, Ctrl+O, Ctrl+D, Ctrl+H), and change the displayed number base



commit 1c355644c9ebacf69b0d4613f6b2bdf6d5a515a0
Author: Robert Ancell <robert ancell gmail com>
Date:   Tue Feb 23 11:38:56 2010 +1100

    Add shortcuts to change base (Ctrl+B, Ctrl+O, Ctrl+D, Ctrl+H), and change the displayed number base on results

 NEWS              |    5 ++++
 data/gcalctool.ui |    6 ++--
 src/display.c     |   16 ++++++++++++++
 src/display.h     |    2 +
 src/gtk.c         |   60 ++++++++++++++++++++++++++++++++++++++++++++++------
 5 files changed, 79 insertions(+), 10 deletions(-)
---
diff --git a/NEWS b/NEWS
index 74f6a59..7bcf80d 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,11 @@
  *  All Rights Reserved.
  */
  
+Overview of changes in gcalctool 5.29.92
+
+    * Add shortcuts to change base (Ctrl+B, Ctrl+O, Ctrl+D, Ctrl+H), and change
+      the displayed number base on results.
+ 
 Overview of changes in gcalctool 5.29.91
 
     * Fix bug where backspace deletes all input in locales with no thousands
diff --git a/data/gcalctool.ui b/data/gcalctool.ui
index 56b0cb9..37983b6 100644
--- a/data/gcalctool.ui
+++ b/data/gcalctool.ui
@@ -3409,7 +3409,7 @@
                         <property name="AtkObject::accessible-name" translatable="yes" comments="Accessible name for the base 2 button">Base 2</property>
                       </object>
                     </child>
-                    <signal name="clicked" handler="button_cb"/>
+                    <signal name="clicked" handler="base_cb"/>
                     <child>
                       <object class="GtkLabel" id="base_2_label">
                         <property name="visible">True</property>
@@ -3440,7 +3440,7 @@
                         <property name="AtkObject::accessible-name" translatable="yes" comments="Accessible name for the base 8 button">Base 8</property>
                       </object>
                     </child>
-                    <signal name="clicked" handler="button_cb"/>
+                    <signal name="clicked" handler="base_cb"/>
                     <child>
                       <object class="GtkLabel" id="base_8_label">
                         <property name="visible">True</property>
@@ -3469,7 +3469,7 @@
                         <property name="AtkObject::accessible-name" translatable="yes" comments="Accessible name for the base 16 button">Base 16</property>
                       </object>
                     </child>
-                    <signal name="clicked" handler="button_cb"/>
+                    <signal name="clicked" handler="base_cb"/>
                     <child>
                       <object class="GtkLabel" id="base_16_label">
                         <property name="visible">True</property>
diff --git a/src/display.c b/src/display.c
index 62e9b99..d76f61d 100644
--- a/src/display.c
+++ b/src/display.c
@@ -295,6 +295,22 @@ display_set_error(GCDisplay *display, const char *message)
 }
 
 
+void
+display_convert(GCDisplay *display, DisplayFormat format)
+{
+    DisplayFormat old_format;
+
+    if (!display_is_result (display))
+        return;
+
+    /* FIXME: A bit hacky... */
+    old_format = display->format;
+    display->format = format;
+    display_set_answer(display);
+    display->format = old_format;
+}
+
+
 static void
 copy_state(GCDisplayState *dst, GCDisplayState *src)
 {
diff --git a/src/display.h b/src/display.h
index 1ccda3b..e639b01 100644
--- a/src/display.h
+++ b/src/display.h
@@ -96,6 +96,8 @@ void display_set_string(GCDisplay *display, const char *, int);
 void display_set_cursor(GCDisplay *display, int);
 void display_set_error(GCDisplay *display, const char *);
 
+void display_convert(GCDisplay *display, DisplayFormat format);
+
 void display_clear_stack(GCDisplay *);
 void display_push(GCDisplay *);
 void display_pop(GCDisplay *);
diff --git a/src/gtk.c b/src/gtk.c
index eab5357..f001525 100644
--- a/src/gtk.c
+++ b/src/gtk.c
@@ -75,9 +75,6 @@ static ButtonData button_data[] = {
     {"hyperbolic_cosine",  "cosh"},
     {"hyperbolic_tangent", "tanh"},
     {"inverse",            "�¹"},
-    {"base_2",             "â??"},
-    {"base_8",             "â??"},
-    {"base_16",            "â??â??"},
     {"and",                " AND "},
     {"or",                 " OR "},
     {"xor",                " XOR "},
@@ -1140,6 +1137,38 @@ digit_cb(GtkWidget *widget, GdkEventButton *event)
 }
 
 
+static void
+do_base(gint base)
+{
+    if (display_is_result(&v->display)) {
+        if (base == 2)
+            display_convert (&v->display, BIN);
+        else if (base == 8)
+            display_convert (&v->display, OCT);
+        else if (base == 16)
+            display_convert (&v->display, HEX);
+        else
+            display_convert (&v->display, DEC);
+    }
+    else {
+        if (base == 2)
+            do_text("â??");
+        else if (base == 8)
+            do_text("â??");
+        else if (base == 16)
+            do_text("â??â??");
+    }
+}
+
+
+G_MODULE_EXPORT
+void
+base_cb(GtkWidget *widget, GdkEventButton *event)
+{
+    do_base(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "base")));
+}
+
+
 G_MODULE_EXPORT
 void
 button_cb(GtkWidget *widget, GdkEventButton *event)
@@ -1182,8 +1211,11 @@ main_window_key_press_cb(GtkWidget *widget, GdkEventKey *event)
     if (state == GDK_CONTROL_MASK) {
         switch(event->keyval)
         {
-        case GDK_u:
-            do_text("µ");
+        case GDK_b:
+            do_base(2);
+            return TRUE;
+        case GDK_d:
+            do_base(10);
             return TRUE;
         case GDK_e:
             do_text("Ã?10");
@@ -1192,15 +1224,24 @@ main_window_key_press_cb(GtkWidget *widget, GdkEventKey *event)
         case GDK_f:
             do_button(FN_FACTORIZE, NULL);
             return TRUE;
-        case GDK_r:
-            do_text("â??");
+        case GDK_h:
+            do_base(16);          
             return TRUE;
         case GDK_i:
             do_text("�¹");
             return TRUE;
+        case GDK_o:
+            do_base(8);
+            return TRUE;
         case GDK_p:
             do_text("Ï?");
             return TRUE;
+        case GDK_r:
+            do_text("â??");
+            return TRUE;
+        case GDK_u:
+            do_text("µ");
+            return TRUE;
         }
     }
     if (state == GDK_CONTROL_MASK ||
@@ -1579,6 +1620,11 @@ create_main_window()
         set_string_data(X.ui, name, "calc_subscript_text", subscript_digits[i]);
         set_string_data(X.ui, name, "calc_superscript_text", superscript_digits[i]);
     }
+  
+    /* Set base button data */
+    set_int_data(X.ui, "calc_base_2_button", "base", 2);
+    set_int_data(X.ui, "calc_base_8_button", "base", 8);
+    set_int_data(X.ui, "calc_base_16_button", "base", 16);
 
     /* Connect menus to popup buttons */
     set_data(X.ui, "calc_shift_left_button", "calc_menu", GET_WIDGET("left_shift_popup"));



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