LED program dialog: add LED color button
[led-pattern-ed] / src / led-program-dialog.vala
index bb7c4ff..b3e9614 100644 (file)
@@ -36,10 +36,10 @@ class LedProgramDialog : Gtk.Dialog {
                var pannable = new Hildon.PannableArea ();
                var vbox = new Gtk.VBox (false, 0);
 
-               foreach (LedCommandRX51 command in lpv.pattern.engine1) {
-                       var label = new Gtk.Label ("0x%04x".printf (command.code));
+               foreach (LedCommand command in lpv.pattern.engine1) {
+                       var command_widget = new LedCommandWidget (command);
 
-                       vbox.pack_start (label, false, false, 0);
+                       vbox.pack_start (command_widget, false, false, 0);
                }
 
                pannable.add_with_viewport (vbox);
@@ -47,6 +47,13 @@ class LedProgramDialog : Gtk.Dialog {
 
                content.show_all ();
 
+               var led_color = new LedColorButton.with_map (lpv.pattern.led_map);
+               led_color.clicked.connect (on_color_clicked);
+               add_action_widget (led_color, 2);
+               action_area.set_child_secondary (led_color, true);
+
+               action_area.show_all ();
+
                add_button ("Test", 1);
                add_button ("Done", Gtk.ResponseType.ACCEPT);
 
@@ -55,7 +62,8 @@ class LedProgramDialog : Gtk.Dialog {
 
        void on_response (int response) {
                if (response == 1) {
-                       // Test pattern
+                       Timeout.add (200, delayed_spawn);
+                       return;
                }
                if (response == Gtk.ResponseType.ACCEPT) {
                        if (pattern.dump () != lpv.pattern.dump ()) {
@@ -63,4 +71,55 @@ class LedProgramDialog : Gtk.Dialog {
                        }
                }
        }
+
+       bool delayed_spawn () {
+               try {
+                       int exit_status;
+                       string error;
+                       var command = "sudo /usr/bin/led-pattern-helper test \"" +
+                                     lpv.pattern.dump () + "\"";
+                       Process.spawn_command_line_sync (command, null, out error, out exit_status);
+                       if (exit_status != 0) {
+                               var information = "Exit status: %d\n%s".printf (exit_status, error);
+                               Hildon.Banner.show_information (null, null, information);
+                       }
+               } catch (SpawnError e) {
+                       Hildon.Banner.show_information (null, null, e.message);
+               }
+
+               return false;
+       }
+
+       void on_color_clicked (Gtk.Button button) {
+               var dialog = new LedColorDialog ();
+               int response = dialog.run ();
+               if (response > 0) {
+                       ((LedColorButton) button).set_color ((LedColor) response);
+                       switch ((LedColor) response) {
+                       case LedColor.R:
+                               lpv.pattern.led_map = "r";
+                               break;
+                       case LedColor.G:
+                               lpv.pattern.led_map = "g";
+                               break;
+                       case LedColor.B:
+                               lpv.pattern.led_map = "b";
+                               break;
+                       case LedColor.RG:
+                               lpv.pattern.led_map = "rg";
+                               break;
+                       case LedColor.RB:
+                               lpv.pattern.led_map = "rb";
+                               break;
+                       case LedColor.GB:
+                               lpv.pattern.led_map = "gb";
+                               break;
+                       case LedColor.RGB:
+                               lpv.pattern.led_map = "rgb";
+                               break;
+                       }
+                       lpv.pattern.changed ();
+               }
+               dialog.destroy ();
+       }
 }