Blob Blame History Raw
/*
 * Copyright (C) 2014 ELITA ASTRID ANGELINA LOBO
 *
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
 * license.
*/

[GtkTemplate (ui = "/org/gnome/calculator/history-view.ui")]
public class HistoryView : Gtk.ScrolledWindow
{
    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);
    public signal void row_added	();


    [GtkCallback]
    public void scroll_bottom ()
    {
        var adjustment = listbox.get_adjustment ();
        // TODO make this dynamic, do not hardcode listbox_height_request/number_of_rows
        int width, height;
        get_size_request (out width, out height);
        adjustment.page_size = height / 3;
        adjustment.set_value (adjustment.get_upper () - adjustment.get_page_size ());
    }

    public void insert_entry (string equation, Number answer, int number_base, uint representation_base)
    {

        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);

        listbox.insert (entry, -1);
        entry.show ();

        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;
        row_added ();
    }

    public void clear ()
    {
        listbox.foreach ((child) => { listbox.remove(child); });
    }
}

[GtkTemplate (ui = "/org/gnome/calculator/history-entry.ui")]
public class HistoryEntry : Gtk.ListBoxRow
{
    [GtkChild]
    Gtk.Label equation_label;
    [GtkChild]
    Gtk.Label answer_label;

    public signal void answer_clicked (string ans);
    public signal void equation_clicked (string equation);

    public HistoryEntry (string equation,
                         string answer_four_digits,
                         string answer_nine_digits)
    {
        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);
    }

    [GtkCallback]
    public bool answer_clicked_cb (Gtk.Widget widget, Gdk.EventButton eventbutton)
    {
        var answer = answer_label.get_text ();
        if (answer != null)
            answer_clicked (answer);
        return true;
    }

    [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;
    }
}