1 /* This file is part of LED Pattern Editor.
3 * Copyright (C) 2010 Philipp Zabel
5 * LED Pattern Editor is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * LED Pattern Editor is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with LED Pattern Editor. If not, see <http://www.gnu.org/licenses/>.
19 class LedProgramDialog : Gtk.Dialog {
21 LedPatternRX51 pattern;
23 LedColorButton led_color1;
24 LedColorButton led_color2;
28 public LedProgramDialog (LedPatternRX51 _pattern) {
30 set_title ("LED pattern editor - " +
31 (pattern.name.has_prefix ("Pattern") ?
32 pattern.name.offset (7) : pattern.name) + " pattern");
34 var content = (Gtk.VBox) get_content_area ();
35 content.set_size_request (-1, 5*70);
37 lpv = new LedPatternView (pattern.copy ());
38 lpv.set_size_request (-1, 70);
39 content.pack_start (lpv, false, false, 0);
41 var hbox = new Gtk.HBox (true, 0);
42 list1 = led_command_list (1);
43 hbox.pack_start (list1, true, true, 0);
44 list2 = led_command_list (2);
45 hbox.pack_start (list2, true, true, 0);
46 content.pack_start (hbox, true, true, 0);
51 hbox = new Gtk.HBox (true, 0);
52 led_color1 = new LedColorButton.with_color (lpv.pattern.color1);
53 led_color1.clicked.connect (on_color1_clicked);
54 hbox.pack_start (led_color1, true, true, 0);
55 led_color2 = new LedColorButton.with_color (lpv.pattern.color2);
56 led_color2.clicked.connect (on_color2_clicked);
57 hbox.pack_start (led_color2, true, true, 0);
58 add_action_widget (hbox, 2);
59 action_area.set_child_secondary (hbox, true);
61 hbox = new Gtk.HBox (true, 0);
62 var radio = (Gtk.RadioButton) Hildon.gtk_radio_button_new (Hildon.SizeType.FINGER_HEIGHT, null);
63 radio.set_mode (false);
64 radio.set_label ("1");
65 radio.set_active (true);
66 radio.toggled.connect (on_engine1_toggled);
67 hbox.pack_start (radio, true, true, 0);
68 radio = (Gtk.RadioButton) Hildon.gtk_radio_button_new_from_widget (Hildon.SizeType.FINGER_HEIGHT, radio);
69 radio.set_mode (false);
70 radio.set_label ("2");
71 radio.toggled.connect (on_engine2_toggled);
72 hbox.pack_start (radio, true, true, 0);
73 add_action_widget (hbox, 2);
74 action_area.set_child_secondary (hbox, true);
76 action_area.show_all ();
78 add_button ("Copy", 2);
79 add_button ("Test", 1);
80 add_button ("Done", Gtk.ResponseType.ACCEPT);
82 key_press_event.connect (on_key_pressed);
83 response.connect (on_response);
86 private bool on_key_pressed (Gdk.EventKey event) {
87 if (Gdk.ModifierType.CONTROL_MASK in event.state) {
88 string key = Gdk.keyval_name (event.keyval);
97 private Gtk.Widget led_command_list (int engine) {
98 var pannable = new Hildon.PannableArea ();
99 var vbox = new Gtk.VBox (false, 0);
101 var label = new Gtk.Label ("Engine %d:".printf (engine));
102 label.set_alignment (0, 0.5f);
103 vbox.pack_start (label, false, false, 0);
105 unowned List<LedCommandRX51> list = (engine == 1) ?
106 lpv.pattern.engine1 : lpv.pattern.engine2;
107 foreach (LedCommandRX51 command in list) {
108 if (command.type == CommandType.RESET_MUX)
110 var command_widget = new LedCommandWidget (lpv.pattern, list,
113 vbox.pack_start (command_widget, false, false, 0);
116 var button = new Gtk.Button.with_label ("New command");
117 Hildon.gtk_widget_set_theme_size (button, Hildon.SizeType.FINGER_HEIGHT);
118 button.clicked.connect (on_new_command_clicked);
119 vbox.pack_end (button, false, false, 0);
121 pannable.add_with_viewport (vbox);
125 void on_response (int response) {
127 Timeout.add (200, delayed_spawn);
128 } else if (response == 2) {
130 } else if (response == Gtk.ResponseType.ACCEPT) {
131 if (pattern.dump () != lpv.pattern.dump ()) {
132 pattern.replace_with (lpv.pattern);
138 var clipboard = Gtk.Clipboard.@get (Gdk.SELECTION_CLIPBOARD);
140 clipboard.set_text (lpv.pattern.dump (), -1);
142 Hildon.Banner.show_information (null, null, "Copied");
146 var clipboard = Gtk.Clipboard.@get (Gdk.SELECTION_CLIPBOARD);
148 clipboard.request_text (on_text_received);
151 void on_text_received (Gtk.Clipboard clipboard, string text) {
152 var clip_pattern = new LedPatternRX51 ();
153 if (clip_pattern.parse (text)) {
154 lpv.pattern.replace_with (clip_pattern);
156 Hildon.Banner.show_information (null, null, "Not a valid pattern");
160 bool delayed_spawn () {
164 var command = "sudo /usr/bin/led-pattern-helper test \"" +
165 lpv.pattern.dump () + "\"";
166 Process.spawn_command_line_sync (command, null, out error, out exit_status);
167 if (exit_status != 0) {
168 var information = "Exit status: %d\n%s".printf (exit_status, error);
169 Hildon.Banner.show_information (null, null, information);
171 } catch (SpawnError e) {
172 Hildon.Banner.show_information (null, null, e.message);
178 void on_color1_clicked (Gtk.Button button) {
179 var dialog = new LedColorDialog ();
180 int response = dialog.run ();
182 LedColor color = (LedColor) response;
183 led_color1.set_color (color);
184 lpv.pattern.color1 = color;
185 color = led_color2.get_color () & ~response;
186 led_color2.set_color (color);
187 lpv.pattern.color2 = color;
188 lpv.pattern.changed ();
193 void on_color2_clicked (Gtk.Button button) {
194 var dialog = new LedColorDialog ();
195 int response = dialog.run ();
197 LedColor color = (LedColor) response;
198 led_color2.set_color (color);
199 lpv.pattern.color2 = color;
200 color = led_color1.get_color () & ~response;
201 led_color1.set_color (color);
202 lpv.pattern.color1 = color;
203 lpv.pattern.changed ();
208 void on_engine1_toggled (Gtk.ToggleButton source) {
209 if (source.get_active ())
215 void on_engine2_toggled (Gtk.ToggleButton source) {
216 if (source.get_active ())
222 void on_new_command_clicked (Gtk.Button button) {
223 var widget = button.parent.parent.parent;
224 unowned List<LedCommandRX51> engine;
225 if (widget == list1) {
226 engine = lpv.pattern.engine1;
227 } else if (widget == list2) {
228 engine = lpv.pattern.engine2;
233 var dialog = new Hildon.PickerDialog (this);
234 dialog.set_title ("New command");
236 var touch_selector = new Hildon.TouchSelector.text ();
237 touch_selector.append_text ("Set PWM");
238 touch_selector.append_text ("Ramp");
239 touch_selector.append_text ("Wait");
240 touch_selector.append_text ("Trigger");
241 touch_selector.append_text ("Go To Start");
242 touch_selector.append_text ("End");
243 dialog.set_selector (touch_selector);
245 int response = dialog.run ();
246 if (response == Gtk.ResponseType.OK) {
247 var command = new LedCommandRX51 ();
248 LedCommandRX51 last_command = engine.last ().data;
249 engine.append (command);
250 command.changed.connect (lpv.pattern.on_changed);
252 switch (touch_selector.get_active (0)) {
254 command.set_pwm (127);
257 if (last_command.type == CommandType.RAMP_WAIT) {
258 command.ramp_wait (last_command.step_time,
259 -last_command.steps);
260 } else if (last_command.level > 0) {
261 command.ramp_wait (125.0 / last_command.level,
262 -last_command.level);
264 command.ramp_wait (0.49, 255);
268 command.ramp_wait (100.0, 0);
271 command.type = CommandType.TRIGGER;
272 command.code = 0xe000;
276 command.go_to_start ();
282 var vbox = (Gtk.VBox) button.parent;
283 var command_widget = new LedCommandWidget (lpv.pattern, engine,
285 vbox.pack_start (command_widget, false, false, 0);
286 command_widget.show_all ();