[gnome-calculator] Migrate HistoryEntry to use a GtkBuilder template



commit 9bb6936ba74602ec891c1ffecdf1665dba1a1be4
Author: Alberto Ruiz <aruiz gnome org>
Date:   Sun Jan 17 03:09:44 2016 +0000

    Migrate HistoryEntry to use a GtkBuilder template

 data/gnome-calculator.gresource.xml |    1 +
 data/history-entry.ui               |   50 ++++++++++
 src/math-history.vala               |  173 +++++++++++------------------------
 3 files changed, 106 insertions(+), 118 deletions(-)
---
diff --git a/data/gnome-calculator.gresource.xml b/data/gnome-calculator.gresource.xml
index 8d33a98..15b681c 100644
--- a/data/gnome-calculator.gresource.xml
+++ b/data/gnome-calculator.gresource.xml
@@ -6,6 +6,7 @@
     <file preprocess="xml-stripblanks">buttons-financial.ui</file>
     <file preprocess="xml-stripblanks">buttons-programming.ui</file>
     <file preprocess="xml-stripblanks">history-view.ui</file>
+    <file preprocess="xml-stripblanks">history-entry.ui</file>
     <file preprocess="xml-stripblanks">math-converter.ui</file>
     <file preprocess="xml-stripblanks">math-window.ui</file>
     <file preprocess="xml-stripblanks">menu.ui</file>
diff --git a/data/history-entry.ui b/data/history-entry.ui
new file mode 100644
index 0000000..e7bccb8
--- /dev/null
+++ b/data/history-entry.ui
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.19.0 -->
+<interface>
+  <requires lib="gtk+" version="3.16"/>
+  <template class="HistoryEntry" parent="GtkListBoxRow">
+    <child>
+      <object class="GtkGrid" id="grid">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="column_homogeneous">True</property>
+        <child>
+          <object class="GtkLabel" id="equation_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="events">GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
+            <property name="xalign">0.0</property>
+            <property name="yalign">0.0</property>
+            <property name="ellipsize">end</property>
+            <property name="max_width_chars">1</property>
+            <signal name="button-press-event" handler="equation_clicked_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">0</property>
+            <property name="width">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="answer_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="events">GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
+            <property name="xalign">0.0</property>
+            <property name="yalign">0.0</property>
+            <property name="ellipsize">end</property>
+            <property name="max_width_chars">1</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+            <signal name="button-press-event" handler="answer_clicked_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="left_attach">3</property>
+            <property name="top_attach">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/src/math-history.vala b/src/math-history.vala
index 8fbdb23..c0900b0 100644
--- a/src/math-history.vala
+++ b/src/math-history.vala
@@ -13,12 +13,19 @@ public class HistoryView : Gtk.ScrolledWindow
 {
     int no_ofitems = 0; /* No of entries in history-view listbox */
 
+    string? last_answer = null;
+    string? last_equation = null;
+
+    Serializer serializer_four = new Serializer (DisplayFormat.AUTOMATIC, 10, 4);
+    Serializer serializer_nine = new Serializer (DisplayFormat.AUTOMATIC, 10, 9);
+
     [GtkChild]
     Gtk.ListBox listbox;
 
     public signal void answer_clicked   (string ans);
     public signal void equation_clicked (string equation);
 
+
     [GtkCallback]
     public void scroll_bottom ()
     {
@@ -27,141 +34,71 @@ public class HistoryView : Gtk.ScrolledWindow
     }
 
     public void insert_entry (string equation, Number answer, int number_base, uint representation_base)
-    {   /* Inserts a new entry into the history-view listbox */
-        string prev_eq = equation;
-        Serializer _serializer = new Serializer (DisplayFormat.AUTOMATIC, number_base, 9);
-        _serializer.set_representation_base (representation_base);
-        string ans = _serializer.to_string (answer);
-        bool check = check_history (prev_eq, ans);
-        if (check == false)
-        {
-            var entry = new HistoryEntryView (prev_eq, answer, number_base, representation_base);
-            if (entry != null)
-            {
-                listbox.add (entry);
-                entry.show ();
-                no_ofitems = no_ofitems + 1;
-
-                entry.answer_clicked.connect ((ans) => { this.answer_clicked (ans); });
-                entry.equation_clicked.connect ((eq) => { this.equation_clicked (eq); });
-            }
-        }
-    }
+    {
+
+        serializer_four.set_base (number_base);
+        serializer_nine.set_base (number_base);
+
+        serializer_four.set_representation_base (representation_base);
+        serializer_nine.set_representation_base (representation_base);
+
+        var answer_nine_digits = serializer_nine.to_string (answer);
+        var answer_four_digits = serializer_four.to_string (answer);
+
+        if (last_answer == answer_nine_digits && last_equation == equation)
+            return;
+
+        var entry = new HistoryEntry (equation, answer_four_digits, answer_nine_digits);
 
-    public bool check_history (string equation, string answer)
-    {   /* Checks if the last inserted calculation is the same as the current calculation to be inserted in 
history-view */
-        if (no_ofitems == 0)
-        {
-            return false; /* returns false for the first entry */
-        }
-        string current_equation = equation;
-        string ans = answer;
-        Gtk.ListBoxRow row = (listbox.get_row_at_index (no_ofitems - 1) as Gtk.ListBoxRow);
-        Gtk.Grid grid = (row.get_child () as Gtk.Grid);
-        if (grid != null)
-        {
-            Gtk.EventBox ans_eventbox = grid.get_children ().nth_data (0) as Gtk.EventBox;
-            string prev_ans = (ans_eventbox.get_child () as Gtk.Label).get_tooltip_text (); /* retrieves 
previous equation */
-            Gtk.EventBox eq_eventbox = grid.get_children ().nth_data (1) as Gtk.EventBox;
-            string prev_equation = (eq_eventbox.get_child () as Gtk.Label).get_tooltip_text (); /* retrieves 
previous answer */
-
-            if ((no_ofitems >= 1) && (prev_ans == ans) && (current_equation == prev_equation))
-                return true; /* returns true if last entered equation and answer is the same as the current 
equation and answer */
-        }
-        return false;
+        listbox.add (entry);
+        entry.show ();
+        no_ofitems++;
+
+        entry.answer_clicked.connect ((ans) => { this.answer_clicked (ans); });
+        entry.equation_clicked.connect ((eq) => { this.equation_clicked (eq); });
+
+        last_answer = answer_nine_digits;
+        last_equation = equation;
     }
 }
 
-public class HistoryEntryView : Gtk.ListBoxRow
+[GtkTemplate (ui = "/org/gnome/calculator/history-entry.ui")]
+public class HistoryEntry : Gtk.ListBoxRow
 {
-    private Number answer; /* Stores answer in Number object */
-    private string prev_equation; /* Stores equation to be entered in history-view */
-    private string prev_answer; /* Stores answer to be entered in history-view */
+    [GtkChild]
     Gtk.Label equation_label;
+    [GtkChild]
     Gtk.Label answer_label;
-    Gtk.EventBox eq_eventbox;
-    Gtk.EventBox ans_eventbox;
 
     public signal void answer_clicked (string ans);
     public signal void equation_clicked (string equation);
 
-    public HistoryEntryView (string equation, Number number, int number_base, uint representation_base)
+    public HistoryEntry (string equation,
+                         string answer_four_digits,
+                         string answer_nine_digits)
     {
-        answer = number;
-        prev_equation = equation;
-        Serializer _serializer = new Serializer (DisplayFormat.AUTOMATIC, number_base, 9);
-        Serializer ans_serializer = new Serializer (DisplayFormat.AUTOMATIC, number_base, 4);
-        ans_serializer.set_representation_base (representation_base);
-        _serializer.set_representation_base (representation_base);
-        prev_answer = _serializer.to_string (answer);
-        string answer_text = ans_serializer.to_string (answer);
-        Gtk.Grid grid = new Gtk.Grid ();
-        grid.insert_column (0);
-        grid.insert_column (1);
-        grid.insert_column (2);
-        grid.insert_column (3);
-        grid.insert_row (0);
-        grid.set_column_homogeneous (true);
-        add (grid);
-        equation_label = new Gtk.Label ("");
-        answer_label = new Gtk.Label ("");
-        eq_eventbox = new Gtk.EventBox ();
-        ans_eventbox = new Gtk.EventBox ();
-        eq_eventbox.add (equation_label);
-        ans_eventbox.add (answer_label);
-        eq_eventbox.set_events (Gdk.EventMask.BUTTON_PRESS_MASK);
-        ans_eventbox.set_events (Gdk.EventMask.BUTTON_PRESS_MASK);
-        eq_eventbox.button_press_event.connect (onclick_equation); /* Calls onclick_equation on clicking on 
equation_label */
-        ans_eventbox.button_press_event.connect (onclick_answer); /* Calls onclick_answer on clicking on 
answer_label */
-        equation_label.set_size_request (10, 10);
-        answer_label.set_size_request (10, 10);
-        equation_label.set_selectable (true);
-        answer_label.set_selectable (true);
-        eq_eventbox.set_above_child (true);
-        ans_eventbox.set_above_child (true);
-        equation_label.set_tooltip_text (prev_equation); /* Sets tooltip for equation_label */
-        answer_label.set_tooltip_text (prev_answer); /* Sets tooltip for answer_label */
-        equation_label.set_ellipsize (Pango.EllipsizeMode.END); /* Ellipsizes the equation when its size is 
greater than the size of the             equation_label */
-        answer_label.set_ellipsize (Pango.EllipsizeMode.END); /* Elipsizes the answer when its size is 
greater the than size of answer_label */
-        equation_label.set_text (prev_equation);
-        string final_answer = "= " + answer_text;
-        answer_label.set_text (final_answer);
-        grid.attach (eq_eventbox, 0, 0, 3, 1);
-        grid.attach (ans_eventbox, 3, 0, 1, 1);
-        equation_label.set_alignment (0, 0); /* Aligns equation on equation_label to the left */
-        answer_label.set_alignment (0, 0); /* Aligns answer on answer_label to the left */
-        Pango.AttrList list = new Pango.AttrList ();
-        Pango.FontDescription font = new Pango.FontDescription ();
-        font.set_weight (Pango.Weight.BOLD);
-        Pango.Attribute weight = Pango.attr_weight_new (Pango.Weight.BOLD);
-        list.insert ((owned) weight);
-        answer_label.set_attributes (list); /* Sets font weight of the text on answer_label to BOLD */
-        grid.show_all ();
+        equation_label.set_tooltip_text (equation);
+        answer_label.set_tooltip_text (answer_nine_digits);
+
+        equation_label.set_text (equation);
+        answer_label.set_text ("= " + answer_four_digits);
     }
 
-    public bool onclick_answer (Gtk.Widget widget, Gdk.EventButton eventbutton)
-    {   /* Callback function for button-press-event on ans_eventbox */
-        Gtk.EventBox event = (Gtk.EventBox) widget;
-        if (event != null)
-        {
-            Gtk.Label ans_label = (event.get_child () as Gtk.Label);
-            string prev_ans = ans_label.get_tooltip_text ();
-            if (prev_ans  != null)
-                answer_clicked (prev_ans);
-        }
+    [GtkCallback]
+    public bool answer_clicked_cb (Gtk.Widget widget, Gdk.EventButton eventbutton)
+    {
+        var answer = answer_label.get_tooltip_text ();
+        if (answer != null)
+            answer_clicked (answer);
         return true;
     }
 
-    private bool onclick_equation (Gtk.Widget widget, Gdk.EventButton eventbutton)
-    {   /* Callback function for button-press-event on eq_eventbox */
-        Gtk.EventBox event = (Gtk.EventBox) widget;
-        if (event != null)
-        {
-            Gtk.Label equation_label = (event.get_child () as Gtk.Label);
-            string prev_equation = equation_label.get_text ();
-            if (prev_equation != null)
-                equation_clicked (prev_equation);
-        }
+    [GtkCallback]
+    private bool equation_clicked_cb (Gtk.Widget widget, Gdk.EventButton eventbutton)
+    {
+        var equation = equation_label.get_text ();
+        if (equation != null)
+            equation_clicked (equation);
         return true;
     }
 }


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