/*
* Copyright (C) 2008-2012 Robert Ancell
*
* 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.
*/
public class MathPreferencesDialog : Gtk.Dialog
{
public MathEquation equation { private get; construct; }
private Gtk.ComboBox angle_unit_combo;
private Gtk.ComboBox number_format_combo;
private Gtk.ComboBox word_size_combo;
private Gtk.SpinButton decimal_places_spin;
private Gtk.Switch thousands_separator_switch;
private Gtk.Switch trailing_zeroes_switch;
public MathPreferencesDialog (MathEquation eq)
{
Object(use_header_bar: 1, equation: eq, resizable: false);
}
construct
{
set_title (/* Title of preferences dialog */
_("Preferences"));
border_width = 8;
((Gtk.HeaderBar) get_header_bar ()).show_close_button = true;
var grid = new Gtk.Grid ();
grid.show ();
grid.border_width = 5;
grid.column_spacing = 6;
grid.row_spacing = 12;
get_content_area ().pack_start (grid, true, true, 0);
var label = new Gtk.Label.with_mnemonic (/* Preferences dialog: Label for number format combo box */
_("Number _Format:"));
label.show ();
label.xalign = 0;
grid.attach (label, 0, 0, 1, 1);
number_format_combo = new Gtk.ComboBox ();
label.mnemonic_widget = number_format_combo;
number_format_combo.show ();
number_format_combo.changed.connect (number_format_combo_changed_cb);
grid.attach (number_format_combo, 1, 0, 1, 1);
var model = new Gtk.ListStore (2, typeof (string), typeof (int));
number_format_combo.model = model;
Gtk.TreeIter iter;
model.append (out iter);
model.set (iter, 0,
/* Number display mode combo: Automatic, e.g. 1234 (or scientific for large number 1.234×10^99) */
_("Automatic"), 1, DisplayFormat.AUTOMATIC, -1);
model.append (out iter);
model.set (iter, 0,
/* Number display mode combo: Fixed, e.g. 1234 */
_("Fixed"), 1, DisplayFormat.FIXED, -1);
model.append (out iter);
model.set (iter, 0,
/* Number display mode combo: Scientific, e.g. 1.234×10^3 */
_("Scientific"), 1, DisplayFormat.SCIENTIFIC, -1);
model.append (out iter);
model.set (iter, 0,
/* Number display mode combo: Engineering, e.g. 1.234k */
_("Engineering"), 1, DisplayFormat.ENGINEERING, -1);
var renderer = new Gtk.CellRendererText ();
number_format_combo.pack_start (renderer, true);
number_format_combo.add_attribute (renderer, "text", 0);
var format_options_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 6);
format_options_box.margin_bottom = 6;
format_options_box.margin_start = 12;
format_options_box.halign = Gtk.Align.CENTER;
format_options_box.valign = Gtk.Align.CENTER;
format_options_box.show ();
grid.attach (format_options_box, 0, 1, 2, 1);
var decimal_places_adjustment = new Gtk.Adjustment (0.0, 0.0, 100.0, 1.0, 1.0, 0.0);
decimal_places_spin = new Gtk.SpinButton (decimal_places_adjustment, 0.0, 0);
label = new Gtk.Label.with_mnemonic (/* Preferences dialog: label for show trailing zeroes check button */
_("Number of _decimals"));
label.mnemonic_widget = decimal_places_spin;
label.show ();
label.xalign = 0;
grid.attach (label, 0, 2, 1, 1);
decimal_places_spin.show ();
decimal_places_spin.value_changed.connect (() => { equation.accuracy = decimal_places_spin.get_value_as_int (); });
grid.attach (decimal_places_spin, 1, 2, 1, 1);
label = new Gtk.Label.with_mnemonic (/* Preferences dialog: label for show trailing zeroes switch */
_("Trailing _zeroes"));
label.xalign = 0;
label.show ();
grid.attach (label, 0, 3, 1, 1);
label.mnemonic_widget = trailing_zeroes_switch;
trailing_zeroes_switch = new Gtk.Switch ();
trailing_zeroes_switch.show ();
trailing_zeroes_switch.state_set.connect ((state) => { equation.show_trailing_zeroes = state; });
trailing_zeroes_switch.halign = Gtk.Align.END;
grid.attach (trailing_zeroes_switch, 1, 3, 1, 1);
label = new Gtk.Label.with_mnemonic (/* Preferences dialog: label for show show thousands separator switch */
_("_Thousands separators"));
label.xalign = 0;
label.show ();
label.mnemonic_widget = thousands_separator_switch;
grid.attach (label, 0, 4, 1, 1);
thousands_separator_switch = new Gtk.Switch ();
thousands_separator_switch.show ();
thousands_separator_switch.state_set.connect ((state) => { equation.show_thousands_separators = state; });
thousands_separator_switch.halign = Gtk.Align.END;
grid.attach (thousands_separator_switch, 1, 4, 1, 1);
label = new Gtk.Label.with_mnemonic (/* Preferences dialog: Label for angle unit combo box */
_("_Angle units:"));
label.show ();
label.xalign = 0;
grid.attach (label, 0, 5, 1, 1);
angle_unit_combo = new Gtk.ComboBox ();
label.mnemonic_widget = angle_unit_combo;
angle_unit_combo.show ();
angle_unit_combo.changed.connect (angle_unit_combo_changed_cb);
grid.attach (angle_unit_combo, 1, 5, 1, 1);
model = new Gtk.ListStore (2, typeof (string), typeof (int));
angle_unit_combo.model = model;
model.append (out iter);
model.set (iter, 0,
/* Preferences dialog: Angle unit combo box: Use degrees for trigonometric calculations */
_("Degrees"), 1, AngleUnit.DEGREES, -1);
model.append (out iter);
model.set (iter, 0,
/* Preferences dialog: Angle unit combo box: Use radians for trigonometric calculations */
_("Radians"), 1, AngleUnit.RADIANS, -1);
model.append (out iter);
model.set (iter, 0,
/* Preferences dialog: Angle unit combo box: Use gradians for trigonometric calculations */
_("Gradians"), 1, AngleUnit.GRADIANS, -1);
renderer = new Gtk.CellRendererText ();
angle_unit_combo.pack_start (renderer, true);
angle_unit_combo.add_attribute (renderer, "text", 0);
label = new Gtk.Label.with_mnemonic (/* Preferences dialog: Label for word size combo box */
_("Word _size:"));
label.show ();
label.xalign = 0;
grid.attach (label, 0, 6, 1, 1);
word_size_combo = new Gtk.ComboBox ();
label.mnemonic_widget = word_size_combo;
word_size_combo.show ();
word_size_combo.changed.connect (word_size_combo_changed_cb);
grid.attach (word_size_combo, 1, 6, 1, 1);
model = new Gtk.ListStore (2, typeof (string), typeof (int));
word_size_combo.model = model;
model.append (out iter);
model.set (iter, 0, /* Word size combo: 8 bits */ _("8 bits"), 1, 8);
model.append (out iter);
model.set (iter, 0, /* Word size combo: 16 bits */ _("16 bits"), 1, 16);
model.append (out iter);
model.set (iter, 0, /* Word size combo: 32 bits */ _("32 bits"), 1, 32);
model.append (out iter);
model.set (iter, 0, /* Word size combo: 64 bits */ _("64 bits"), 1, 64);
renderer = new Gtk.CellRendererText ();
word_size_combo.pack_start (renderer, true);
word_size_combo.add_attribute (renderer, "text", 0);
decimal_places_spin.set_value (equation.accuracy);
equation.notify["accuracy"].connect ((pspec) => { decimal_places_spin.set_value (equation.accuracy); });
thousands_separator_switch.set_active (equation.show_thousands_separators);
equation.notify["show-thousands-separators"].connect (() => { thousands_separator_switch.set_active (equation.show_thousands_separators); });
trailing_zeroes_switch.set_active (equation.show_trailing_zeroes);
equation.notify["show-trailing_zeroes"].connect (() => { trailing_zeroes_switch.set_active (equation.show_trailing_zeroes); });
set_combo_box_from_int (number_format_combo, equation.number_format);
equation.notify["number-format"].connect ((pspec) => { set_combo_box_from_int (number_format_combo, equation.number_format); });
set_combo_box_from_int (word_size_combo, equation.word_size);
equation.notify["word-size"].connect ((pspec) => { set_combo_box_from_int (word_size_combo, equation.word_size); });
set_combo_box_from_int (angle_unit_combo, equation.angle_units);
equation.notify["angle-units"].connect ((pspec) => { set_combo_box_from_int (angle_unit_combo, equation.angle_units); });
}
protected override void response (int id)
{
hide ();
}
protected override bool delete_event (Gdk.EventAny event)
{
hide ();
return true;
}
private void number_format_combo_changed_cb (Gtk.ComboBox combo)
{
Gtk.TreeIter iter;
combo.get_active_iter (out iter);
DisplayFormat value;
combo.model.get (iter, 1, out value, -1);
equation.number_format = value;
}
private void angle_unit_combo_changed_cb (Gtk.ComboBox combo)
{
Gtk.TreeIter iter;
combo.get_active_iter (out iter);
AngleUnit value;
combo.model.get (iter, 1, out value, -1);
equation.angle_units = value;
}
private void word_size_combo_changed_cb (Gtk.ComboBox combo)
{
Gtk.TreeIter iter;
combo.get_active_iter (out iter);
int value;
combo.model.get (iter, 1, out value, -1);
equation.word_size = value;
}
private void set_combo_box_from_int (Gtk.ComboBox combo, int value)
{
Gtk.TreeIter iter;
var valid = combo.model.get_iter_first (out iter);
while (valid)
{
int v;
combo.model.get (iter, 1, out v, -1);
if (v == value)
break;
valid = combo.model.iter_next (ref iter);
}
if (!valid)
valid = combo.model.get_iter_first (out iter);
combo.set_active_iter (iter);
}
}