~artem-anufrij/metronome/trunk

« back to all changes in this revision

Viewing changes to src/Metronome.vala

  • Committer: Artem Anufrij
  • Date: 2015-10-05 23:35:34 UTC
  • Revision ID: artem.anufrij@live.de-20151005233534-5tarac8mok59dur7
added presets (dev)

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
        public Gtk.Window mainwindow;
8
8
 
9
9
        // Controls
 
10
        Gtk.Paned root;
10
11
        Gtk.Grid content;
 
12
        Gtk.Box sidebar;
 
13
        Gtk.ListBox list_box;
 
14
 
11
15
        Gtk.Button start_button;
12
16
 
13
17
        Gtk.SpinButton tempo;
120
124
            });
121
125
 
122
126
            click.tempo_changed.connect ((current_tempo) => {
 
127
                debug ("current_tempo %d", (int)current_tempo);
123
128
                tempo_value.label = "<b>" + current_tempo.to_string () + "</b>";
124
129
            });
125
130
 
151
156
            mainwindow.set_resizable (false);
152
157
            mainwindow.add_events(Gdk.EventMask.KEY_PRESS_MASK);
153
158
 
 
159
            root = new Gtk.Paned (Gtk.Orientation.HORIZONTAL);
 
160
 
154
161
            content = new Gtk.Grid ();
 
162
            content.width_request = 200;
155
163
            content.margin = 24;
156
164
            content.hexpand = true;
157
165
            content.row_spacing = 24;
163
171
            // VOLUME sliders
164
172
            build_volume_sliders ();
165
173
 
 
174
            // SIDEBAR
 
175
            build_sidebar ();
 
176
 
166
177
            // START-STOP button
167
178
            start_button = new Gtk.Button.with_label (_("Start"));
168
179
            start_button.hexpand = true;
190
201
            var led_gray_left = new Gtk.Image.from_file (Constants.PKGDATADIR + "/icons/led_gray.png");
191
202
            content.attach (led_gray_left, 0, 1, 1, 1);
192
203
 
193
 
            mainwindow.add (content);
 
204
            mainwindow.add (root);
194
205
            mainwindow.show_all ();
195
206
 
 
207
            sidebar.visible = false;
196
208
            led_green_right.visible = false;
197
209
            led_red_left.visible = false;
198
210
 
292
304
            settings_buttons.append (tempo_button);
293
305
            settings_buttons.append (beat_button);
294
306
 
295
 
            var reset = new Gtk.Button ();
 
307
            var sidebar_toogle = new Gtk.Button ();
 
308
            sidebar_toogle.image = new Gtk.Image.from_icon_name ("pane-show-symbolic-rtl", Gtk.IconSize.LARGE_TOOLBAR);
 
309
            sidebar_toogle.relief = Gtk.ReliefStyle.NONE;
 
310
            sidebar_toogle.clicked.connect (() => {
 
311
                if (sidebar.visible) {
 
312
                    sidebar.visible = false;
 
313
                    sidebar_toogle.image = new Gtk.Image.from_icon_name ("pane-show-symbolic-rtl", Gtk.IconSize.LARGE_TOOLBAR);
 
314
                } else {
 
315
                    sidebar.visible = true;
 
316
                    sidebar_toogle.image = new Gtk.Image.from_icon_name ("pane-hide-symbolic-rtl", Gtk.IconSize.LARGE_TOOLBAR);
 
317
                }
 
318
            });
 
319
 
 
320
            headerbar.pack_end (sidebar_toogle);
 
321
 
 
322
            /*var reset = new Gtk.Button ();
296
323
            reset.image = new Gtk.Image.from_icon_name ("document-revert-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
297
324
            reset.tooltip_text = _("Revert all settings");
298
325
            reset.relief = Gtk.ReliefStyle.NONE;
299
326
            reset.clicked.connect (reset_settings);
300
327
 
301
 
            headerbar.pack_end (reset);
 
328
            headerbar.pack_end (reset);*/
302
329
        }
303
330
 
304
331
        private void build_volume_sliders () {
348
375
            volumes.attach (icon_quaver, 3, 1, 1, 1);
349
376
 
350
377
            content.attach (volumes, 0, 0, 4, 1);
 
378
 
 
379
            root.pack1 (content, true, false);
 
380
        }
 
381
 
 
382
        private void build_sidebar () {
 
383
 
 
384
            sidebar = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
 
385
            sidebar.visible = false;
 
386
            sidebar.width_request = 140;
 
387
 
 
388
            var list_scroll = new Gtk.ScrolledWindow (null, null);
 
389
            list_scroll.vexpand = true;
 
390
            list_scroll.get_style_context().set_junction_sides(Gtk.JunctionSides.BOTTOM);
 
391
 
 
392
            // LIST BOX
 
393
            list_box = new Gtk.ListBox ();
 
394
            list_box.expand = true;
 
395
            list_box.row_activated.connect ((row) => {
 
396
                var custom_setting =  (((Metronome.SettingRow)row).setting);
 
397
                tempo.set_value (custom_setting.tempo);
 
398
                beat.set_value (custom_setting.beat);
 
399
            });
 
400
 
 
401
            list_scroll.add (list_box);
 
402
 
 
403
            var list_toolbar = new Gtk.Toolbar ();
 
404
            list_toolbar.expand = false;
 
405
            list_toolbar.set_style (Gtk.ToolbarStyle.ICONS);
 
406
            list_toolbar.set_icon_size (Gtk.IconSize.SMALL_TOOLBAR);
 
407
            list_toolbar.set_show_arrow (false);
 
408
            list_toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
 
409
            list_toolbar.get_style_context().set_junction_sides(Gtk.JunctionSides.TOP);
 
410
 
 
411
 
 
412
 
 
413
            // ADD Button
 
414
            var list_toolbar_add = new Gtk.ToolButton (null, null);
 
415
            list_toolbar_add.icon_name = "list-add-symbolic";
 
416
            list_toolbar.insert (list_toolbar_add, -1);
 
417
 
 
418
            // ADD Popover
 
419
            var popover_grid = new Gtk.Grid ();
 
420
            popover_grid.margin = 6;
 
421
            popover_grid.row_spacing = 6;
 
422
            popover_grid.column_spacing = 6;
 
423
 
 
424
            var new_setting_label = new Gtk.Label (_("Title:"));
 
425
 
 
426
            var new_setting_title = new Gtk.Entry ();
 
427
            new_setting_title.hexpand = true;
 
428
            new_setting_title.set_placeholder_text (_("Setting title"));
 
429
 
 
430
            var add_setting_popover = new Gtk.Popover (list_toolbar_add);
 
431
            add_setting_popover.position = Gtk.PositionType.TOP;
 
432
            add_setting_popover.add (popover_grid);
 
433
 
 
434
            var new_setting_add = new Gtk.Button.with_label (_("Add"));
 
435
            new_setting_add.clicked.connect (() => {
 
436
                if (new_setting_title.buffer.text != "") {
 
437
                    var new_custom_setting = new Metronome.Setting ();
 
438
                    new_custom_setting.title = new_setting_title.buffer.text;
 
439
                    new_custom_setting.tempo = click.current_tempo;
 
440
                    new_custom_setting.beat = click.current_beat;
 
441
 
 
442
                    add_custom_setting (new_custom_setting);
 
443
                    add_setting_popover.hide ();
 
444
                }
 
445
            });
 
446
 
 
447
            popover_grid.attach (new_setting_label, 0, 0, 1, 1);
 
448
            popover_grid.attach (new_setting_title, 1, 0, 1, 1);
 
449
            popover_grid.attach (new_setting_add, 0, 1, 2, 1);
 
450
 
 
451
            list_toolbar_add.clicked.connect (() => {
 
452
               new_setting_title.text = "";
 
453
               add_setting_popover.show_all ();
 
454
            });
 
455
 
 
456
            // REMOVE Button
 
457
            var list_toolbar_remove = new Gtk.ToolButton (null, null);
 
458
            list_toolbar_remove.icon_name = "list-remove-symbolic";
 
459
            list_toolbar_remove.clicked.connect (() => {
 
460
                list_box.remove(list_box.get_selected_row ());
 
461
            });
 
462
            list_toolbar.insert (list_toolbar_remove, -1);
 
463
 
 
464
            // SAVE Button
 
465
            var list_toolbar_save = new Gtk.ToolButton (null, null);
 
466
            list_toolbar_save.icon_name = "document-save-symbolic";
 
467
            list_toolbar_save.clicked.connect (() => {
 
468
                (list_box.get_selected_row () as Metronome.SettingRow).setting.beat = click.current_beat;
 
469
                (list_box.get_selected_row () as Metronome.SettingRow).setting.tempo = click.current_tempo;
 
470
            });
 
471
            list_toolbar.insert (list_toolbar_save, -1);
 
472
 
 
473
            sidebar.pack_start (list_scroll, true, true);
 
474
            sidebar.pack_start (list_toolbar, false, false);
 
475
 
 
476
            root.pack2 (sidebar, true, false);
351
477
        }
352
478
 
353
479
        private void do_click (click_interval interval, bool beat) {
454
580
            volume_minim.set_value (settings.volume_minim);
455
581
            volume_crotchet.set_value (settings.volume_crotchet);
456
582
            volume_quaver.set_value (settings.volume_quaver);
 
583
 
 
584
            foreach (string item in settings.custom_settings) {
 
585
                var custom_setting = Metronome.Setting.parse (item);
 
586
                if (custom_setting != null)
 
587
                    add_custom_setting (custom_setting);
 
588
            }
457
589
        }
458
590
 
459
591
        private void save_settings () {
463
595
            settings.volume_minim = volume_minim.get_value ();
464
596
            settings.volume_crotchet = volume_crotchet.get_value ();
465
597
            settings.volume_quaver = volume_quaver.get_value ();
 
598
 
 
599
            GLib.Array<string> custom_settings = new GLib.Array<string> ();
 
600
            foreach (Gtk.Widget row in list_box.get_children ()) {
 
601
                if (row is Metronome.SettingRow) {
 
602
                    debug ("save custom setting %s", (row as Metronome.SettingRow).setting.get_setting_string ());
 
603
                    custom_settings.append_val((row as Metronome.SettingRow).setting.get_setting_string ());
 
604
                }
 
605
            }
 
606
            settings.custom_settings = custom_settings.data;
466
607
        }
467
608
 
468
 
        private void reset_settings () {
469
 
            click.stop ();
470
 
 
471
 
            foreach(string key in settings.schema.list_keys ())
472
 
                settings.schema.reset (key);
473
 
 
474
 
            load_settings ();
 
609
        private void add_custom_setting (Metronome.Setting custom_setting) {
 
610
            var row = new Metronome.SettingRow (custom_setting);
 
611
            list_box.add(row);
 
612
            row.get_style_context ().remove_class("button");
 
613
            debug ("add custom setting %s", custom_setting.title);
475
614
        }
476
615
    }
477
616
}