2 * Copyright (C) 2008-2012 Robert Ancell
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU General Public License as published by the Free Software
6 * Foundation, either version 2 of the License, or (at your option) any later
7 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
11 public class MathVariablePopup
: Gtk
.Window
13 private MathEquation equation
;
16 private Gtk
.Entry variable_name_entry
;
17 private Gtk
.Button add_variable_button
;
19 public MathVariablePopup (MathEquation equation
)
21 this
.equation
= equation
;
24 skip_taskbar_hint
= true;
27 /* Destroy this window when it loses focus */
28 focus_out_event
.connect ((event
) => { destroy (); return false; });
30 vbox
= new Gtk
.Box (Gtk
.Orientation
.VERTICAL
, 6);
31 vbox
.homogeneous
= true;
35 var names
= equation
.variables
.get_names ();
36 for (var i
= 0; names
[i
] != null; i
++)
38 var value
= equation
.variables
.get (names
[i
]);
39 var entry
= make_variable_entry (names
[i
], value
, true);
41 vbox
.pack_start (entry
, false, true, 0);
44 var entry
= new Gtk
.Box (Gtk
.Orientation
.HORIZONTAL
, 6);
47 // TODO: Show greyed "variable name" text to give user a hint how to use
48 variable_name_entry
= new Gtk
.Entry ();
49 variable_name_entry
.key_press_event
.connect (variable_name_key_press_cb
);
50 variable_name_entry
.changed
.connect (variable_name_changed_cb
);
51 variable_name_entry
.activate
.connect (add_variable_cb
);
52 entry
.pack_start (variable_name_entry
, true, true, 0);
53 variable_name_entry
.show ();
55 add_variable_button
= new Gtk
.Button ();
56 add_variable_button
.sensitive
= false;
57 add_variable_button
.clicked
.connect (add_variable_cb
);
58 var image
= new Gtk
.Image
.from_stock (Gtk
.Stock
.ADD
, Gtk
.IconSize
.BUTTON
);
59 add_variable_button
.add (image
);
60 entry
.pack_start (add_variable_button
, false, true, 0);
62 add_variable_button
.show ();
63 vbox
.pack_end (entry
, false, true, 0);
65 entry
= make_variable_entry ("rand", null, false);
67 vbox
.pack_end (entry
, false, true, 0);
69 entry
= make_variable_entry ("ans", equation
.answer
, false);
71 vbox
.pack_end (entry
, false, true, 0);
74 private void insert_variable_cb (Gtk
.Widget widget
)
76 var name
= widget
.get_data
<string> ("variable_name");
77 equation
.insert (name
);
79 widget
.get_toplevel ().destroy ();
82 private bool variable_name_key_press_cb (Gtk
.Widget widget
, Gdk
.EventKey event
)
84 /* Can't have whitespace in names, so replace with underscores */
85 if (event
.keyval
== Gdk
.Key
.space
|| event
.keyval
== Gdk
.Key
.KP_Space
)
86 event
.keyval
= Gdk
.Key
.underscore
;
91 private void variable_name_changed_cb ()
93 add_variable_button
.sensitive
= variable_name_entry
.get_text () != "";
96 private void add_variable_cb (Gtk
.Widget widget
)
98 var name
= variable_name_entry
.get_text ();
102 var z
= equation
.number
;
104 equation
.variables
.set (name
, z
);
105 else if (equation
.is_result
)
106 equation
.variables
.set (name
, equation
.answer
);
108 warning ("Can't add variable %s, the display is not a number", name
);
110 widget
.get_toplevel ().destroy ();
113 private void save_variable_cb (Gtk
.Widget widget
)
115 var name
= widget
.get_data
<string> ("variable_name");
116 var z
= equation
.number
;
118 equation
.variables
.set (name
, z
);
119 else if (equation
.is_result
)
120 equation
.variables
.set (name
, equation
.answer
);
122 warning ("Can't save variable %s, the display is not a number", name
);
124 widget
.get_toplevel ().destroy ();
127 private void delete_variable_cb (Gtk
.Widget widget
)
129 var name
= widget
.get_data
<string> ("variable_name");
130 equation
.variables
.delete (name
);
132 widget
.get_toplevel ().destroy ();
135 private Gtk
.Box
make_variable_entry (string name
, Number? value
, bool writable
)
137 var hbox
= new Gtk
.Box (Gtk
.Orientation
.HORIZONTAL
, 6);
142 var value_text
= equation
.serializer
.to_string (value
);
143 text
= "<b>%s</b> = %s".printf (name
, value_text
);
146 text
= "<b>%s</b>".printf (name
);
148 var button
= new Gtk
.Button ();
149 button
.set_data
<string> ("variable_name", name
);
150 button
.clicked
.connect (insert_variable_cb
);
151 button
.set_relief (Gtk
.ReliefStyle
.NONE
);
152 hbox
.pack_start (button
, true, true, 0);
155 var label
= new Gtk
.Label (text
);
156 label
.set_use_markup (true);
157 label
.set_alignment (0.0f
, 0.5f
);
163 button
= new Gtk
.Button ();
164 button
.set_data
<string> ("variable_name", name
);
165 var image
= new Gtk
.Image
.from_stock (Gtk
.Stock
.SAVE
, Gtk
.IconSize
.BUTTON
);
167 hbox
.pack_start (button
, false, true, 0);
168 button
.clicked
.connect (save_variable_cb
);
172 button
= new Gtk
.Button ();
173 button
.set_data
<string> ("variable_name", name
);
174 image
= new Gtk
.Image
.from_stock (Gtk
.Stock
.DELETE
, Gtk
.IconSize
.BUTTON
);
176 hbox
.pack_start (button
, false, true, 0);
177 button
.clicked
.connect (delete_variable_cb
);