Adding first code drop
[demorecorder] / src / FirstRunWizard.vala
diff --git a/src/FirstRunWizard.vala b/src/FirstRunWizard.vala
new file mode 100644 (file)
index 0000000..93f03b2
--- /dev/null
@@ -0,0 +1,277 @@
+/*  Demo Recorder for MAEMO 5
+*   Copyright (C) 2010 Dru Moore <usr@dru-id.co.uk>
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2,
+*   or (at your option) any later version, as published by the Free
+*   Software Foundation
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details
+*
+*   You should have received a copy of the GNU General Public
+*   License along with this program; if not, write to the
+*   Free Software Foundation, Inc.,
+*   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+namespace IdWorks {
+
+public class FirstRunWizard : Hildon.WizardDialog {
+
+  public ApplicationSettings app_settings {public get; public set;}
+  Gtk.Notebook notebook;
+  Hildon.Button directory_btn;
+  Hildon.TouchSelector on_open_selector;
+  Hildon.TouchSelector on_close_selector;
+  Hildon.TouchSelector on_add_selector;
+  Hildon.TouchSelector on_bounce_selector;
+  Hildon.TouchSelector on_remove_selector;
+  Hildon.TouchSelector on_mixdown_selector;
+  private enum WizardPage {
+    WORKING_FOLDER = 0,
+    ON_OPEN,
+    ON_CLOSE,
+    ON_ADD,
+    ON_BOUNCE,
+    ON_REMOVE,
+    ON_MIXDOWN
+  }
+  
+  public FirstRunWizard(Gtk.Window parent, string wizard_name) {
+    app_settings = new ApplicationSettings();
+    this.set_parent(parent);
+    this.wizard_name = wizard_name;
+    this.autotitle = true;
+    this.wizard_notebook = get_notebook(app_settings);
+    //Hildon.WizardDialogPageFunc func_delegate = forward_page_function;
+    this.set_forward_page_func(forward_page_function);
+    this.show_all();
+  }
+  
+  private void on_open_updated(string val) {
+    this.app_settings.open_action = ApplicationSettings.OpenAction.from_label(val);
+  }
+  private void on_close_updated(string val) {
+    this.app_settings.close_action = ApplicationSettings.CloseAction.from_label(val);
+  }
+  private void on_add_updated(string val) {
+    this.app_settings.add_track_action = ApplicationSettings.AddTrackAction.from_label(val);
+  }
+  private void on_bounce_updated(string val) {
+    this.app_settings.bounce_tracks_action = ApplicationSettings.BounceTracksAction.from_label(val);
+  }
+  private void on_remove_updated(string val) {
+    this.app_settings.remove_track_action = ApplicationSettings.RemoveTrackAction.from_label(val);
+  }
+  private void on_mixdown_updated(string val) {
+    this.app_settings.mixdown_action = ApplicationSettings.MixdownAction.from_label(val);
+  }
+  
+  private Gtk.Notebook get_notebook(ApplicationSettings settings) {
+    notebook = new Gtk.Notebook();
+    
+    // page 1 - WORKING_FOLDER
+    Gtk.VBox page_1 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_1 = new Gtk.Label("Pick a working directory, this is where all your projects will be stored.\n\nFor better performance try using an SD card.");
+    msg_1.set_line_wrap(true);
+    msg_1.set_alignment(0, 0);
+    directory_btn = new Hildon.Button.with_text(Hildon.SizeType.FINGER_HEIGHT | Hildon.SizeType.HALFSCREEN_WIDTH, Hildon.ButtonArrangement.VERTICAL, "Working folder", settings.working_directory);
+    directory_btn.set_style(Hildon.ButtonStyle.PICKER);
+    directory_btn.set_alignment(0, 0, 1, 1);
+    directory_btn.set_value(settings.working_directory);
+    directory_btn.clicked.connect(select_directory);
+    page_1.pack_start(directory_btn, false, false, 4);
+    page_1.add(msg_1);
+    
+    notebook.append_page(page_1, null);
+    
+    // page 2 - ON_OPEN
+    Gtk.VBox page_2 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_2 = new Gtk.Label("What should happen at application start?\nIf you are unsure accept the defaults.");
+    msg_2.set_line_wrap(true);
+    msg_2.set_alignment(0, 0);
+    on_open_selector = new Hildon.TouchSelector.text();
+    on_open_selector.append_text(ApplicationSettings.OpenAction.to_label(ApplicationSettings.OpenAction.LAST_PROJECT));
+    on_open_selector.append_text(ApplicationSettings.OpenAction.to_label(ApplicationSettings.OpenAction.RECENT_PROJECTS));
+    on_open_selector.append_text(ApplicationSettings.OpenAction.to_label(ApplicationSettings.OpenAction.NEW_PROJECT));
+    on_open_selector.append_text(ApplicationSettings.OpenAction.to_label(ApplicationSettings.OpenAction.NAMED_PROJECT));
+    on_open_selector.set_active(0, (int)settings.open_action);
+    Hildon.PickerButton on_open_picker = new Hildon.PickerButton(Hildon.SizeType.FINGER_HEIGHT | Hildon.SizeType.HALFSCREEN_WIDTH, Hildon.ButtonArrangement.VERTICAL);
+    on_open_picker.set_title("Application start behaviour");
+    on_open_picker.set_selector(on_open_selector);
+    on_open_picker.set_alignment(0, 0, 1, 1);
+    on_open_picker.value_changed.connect( (s) => { on_open_updated(s.get_selector().get_current_text()); } );
+    page_2.pack_start(on_open_picker, false, false, 4);
+    page_2.add(msg_2);
+    
+    notebook.append_page(page_2, null);
+    
+    // page 3 - ON_CLOSE
+    Gtk.VBox page_3 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_3 = new Gtk.Label("What should happen at application end?\nIf you are unsure accept the defaults.");
+    msg_3.set_line_wrap(true);
+    msg_3.set_alignment(0, 0);
+    on_close_selector = new Hildon.TouchSelector.text();
+    on_close_selector.append_text(ApplicationSettings.CloseAction.to_label(ApplicationSettings.CloseAction.AUTO_SAVE_PROJECT));
+    on_close_selector.append_text(ApplicationSettings.CloseAction.to_label(ApplicationSettings.CloseAction.PROMPT_SAVE_PROJECT));
+    on_close_selector.append_text(ApplicationSettings.CloseAction.to_label(ApplicationSettings.CloseAction.DO_NOTHING));
+    on_close_selector.set_active(0, (int)settings.close_action);
+    Hildon.PickerButton on_close_picker = new Hildon.PickerButton(Hildon.SizeType.FINGER_HEIGHT | Hildon.SizeType.HALFSCREEN_WIDTH, Hildon.ButtonArrangement.VERTICAL);
+    on_close_picker.set_title("Application end behaviour");
+    on_close_picker.set_selector(on_close_selector);
+    on_close_picker.set_alignment(0, 0, 1, 1);
+    on_close_picker.value_changed.connect( (s) => { on_close_updated(s.get_selector().get_current_text()); } );
+    page_3.pack_start(on_close_picker, false, false, 4);
+    page_3.add(msg_3);
+    
+    notebook.append_page(page_3, null);
+    
+    // page 4 - ON_ADD
+    Gtk.VBox page_4 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_4 = new Gtk.Label("What should happen when you add a track?\nIf you are unsure accept the defaults.");
+    msg_4.set_line_wrap(true);
+    msg_4.set_alignment(0, 0);
+    on_add_selector = new Hildon.TouchSelector.text();
+    on_add_selector.append_text(ApplicationSettings.AddTrackAction.to_label(ApplicationSettings.AddTrackAction.SET_ACTIVE));
+    on_add_selector.append_text(ApplicationSettings.AddTrackAction.to_label(ApplicationSettings.AddTrackAction.SET_SOLO));
+    on_add_selector.append_text(ApplicationSettings.AddTrackAction.to_label(ApplicationSettings.AddTrackAction.SET_INACTIVE));
+    on_add_selector.append_text(ApplicationSettings.AddTrackAction.to_label(ApplicationSettings.AddTrackAction.SET_MUTE));
+    on_add_selector.set_active(0, (int)settings.add_track_action);
+    Hildon.PickerButton on_add_picker = new Hildon.PickerButton(Hildon.SizeType.FINGER_HEIGHT | Hildon.SizeType.HALFSCREEN_WIDTH, Hildon.ButtonArrangement.VERTICAL);
+    on_add_picker.set_title("Add track behaviour");
+    on_add_picker.set_selector(on_add_selector);
+    on_add_picker.set_alignment(0, 0, 1, 1);
+    on_add_picker.value_changed.connect( (s) => { on_add_updated(s.get_selector().get_current_text()); } );
+    page_4.pack_start(on_add_picker, false, false, 4);
+    page_4.add(msg_4);
+    
+    notebook.append_page(page_4, null);
+    
+    // page 5 - ON_BOUNCE
+    Gtk.VBox page_5 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_5 = new Gtk.Label("What should happen when you bounce tracks?\nIf you are unsure accept the defaults.");
+    msg_5.set_line_wrap(true);
+    msg_5.set_alignment(0, 0);
+    on_bounce_selector = new Hildon.TouchSelector.text();
+    on_bounce_selector.append_text(ApplicationSettings.BounceTracksAction.to_label(ApplicationSettings.BounceTracksAction.SET_SOURCE_INACTIVE));
+    on_bounce_selector.append_text(ApplicationSettings.BounceTracksAction.to_label(ApplicationSettings.BounceTracksAction.SET_SOURCE_MUTE));
+    on_bounce_selector.append_text(ApplicationSettings.BounceTracksAction.to_label(ApplicationSettings.BounceTracksAction.SET_TARGET_SOLO));
+    on_bounce_selector.append_text(ApplicationSettings.BounceTracksAction.to_label(ApplicationSettings.BounceTracksAction.SET_TARGET_INACTIVE));
+    on_bounce_selector.append_text(ApplicationSettings.BounceTracksAction.to_label(ApplicationSettings.BounceTracksAction.SET_TARGET_MUTE));
+    on_bounce_selector.set_active(0, (int)settings.bounce_tracks_action);
+    Hildon.PickerButton on_bounce_picker = new Hildon.PickerButton(Hildon.SizeType.FINGER_HEIGHT | Hildon.SizeType.HALFSCREEN_WIDTH, Hildon.ButtonArrangement.VERTICAL);
+    on_bounce_picker.set_title("Bounce tracks behaviour");
+    on_bounce_picker.set_selector(on_bounce_selector);
+    on_bounce_picker.set_alignment(0, 0, 1, 1);
+    on_bounce_picker.value_changed.connect( (s) => { on_bounce_updated(s.get_selector().get_current_text()); } );
+    page_5.pack_start(on_bounce_picker, false, false, 4);
+    page_5.add(msg_5);
+    
+    notebook.append_page(page_5, null);
+    
+    // page 6 - ON_REMOVE
+    Gtk.VBox page_6 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_6 = new Gtk.Label("What should happen when you remove a track?\nIf you are unsure accept the defaults.");
+    msg_6.set_line_wrap(true);
+    msg_6.set_alignment(0, 0);
+    on_remove_selector = new Hildon.TouchSelector.text();
+    on_remove_selector.append_text(ApplicationSettings.RemoveTrackAction.to_label(ApplicationSettings.RemoveTrackAction.PROMPT));
+    on_remove_selector.append_text(ApplicationSettings.RemoveTrackAction.to_label(ApplicationSettings.RemoveTrackAction.DELETE_FILE));
+    on_remove_selector.append_text(ApplicationSettings.RemoveTrackAction.to_label(ApplicationSettings.RemoveTrackAction.PRESERVE_FILE));
+    on_remove_selector.set_active(0, (int)settings.remove_track_action);
+    Hildon.PickerButton on_remove_picker = new Hildon.PickerButton(Hildon.SizeType.FINGER_HEIGHT | Hildon.SizeType.HALFSCREEN_WIDTH, Hildon.ButtonArrangement.VERTICAL);
+    on_remove_picker.set_title("Remove tracks behaviour");
+    on_remove_picker.set_selector(on_remove_selector);
+    on_remove_picker.set_alignment(0, 0, 1, 1);
+    on_remove_picker.value_changed.connect( (s) => { on_remove_updated(s.get_selector().get_current_text()); } );
+    page_6.pack_start(on_remove_picker, false, false, 4);
+    page_6.add(msg_6);
+    
+    notebook.append_page(page_6, null);
+    
+    // page 7 - ON_MIXDOWN
+    Gtk.VBox page_7 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_7 = new Gtk.Label("What should happen when you mixdown your tracks?\nIf you are unsure accept the defaults.");
+    msg_7.set_line_wrap(true);
+    msg_7.set_alignment(0, 0);
+    on_mixdown_selector = new Hildon.TouchSelector.text();
+    on_mixdown_selector.append_text(ApplicationSettings.MixdownAction.to_label(ApplicationSettings.MixdownAction.NONE));
+    on_mixdown_selector.append_text(ApplicationSettings.MixdownAction.to_label(ApplicationSettings.MixdownAction.PLAY_TARGET));
+    on_mixdown_selector.set_active(0, (int)settings.mixdown_action);
+    Hildon.PickerButton on_mixdown_picker = new Hildon.PickerButton(Hildon.SizeType.FINGER_HEIGHT | Hildon.SizeType.HALFSCREEN_WIDTH, Hildon.ButtonArrangement.VERTICAL);
+    on_mixdown_picker.set_title("Mixdown behaviour");
+    on_mixdown_picker.set_selector(on_mixdown_selector);
+    on_mixdown_picker.set_alignment(0, 0, 1, 1);
+    on_mixdown_picker.value_changed.connect( (s) => { on_mixdown_updated(s.get_selector().get_current_text()); } );
+    page_7.pack_start(on_mixdown_picker, false, false, 4);
+    page_7.add(msg_7);
+    
+    notebook.append_page(page_7, null);
+    
+    // page 8 - Thank You
+    Gtk.VBox page_8 = new Gtk.VBox(false, 4);
+    Gtk.Label msg_8 = new Gtk.Label("That's all for now. \n\nYou can change these settings at any time from the settings menu option.\n\nEnjoy!");
+    msg_8.set_line_wrap(true);
+    msg_8.set_alignment(0, 0);
+    page_8.add(msg_8);
+    
+    notebook.append_page(page_8, null);
+    notebook.show_all();
+    
+    return notebook;
+  }
+  
+  public bool forward_page_function(Gtk.Notebook notebook, int current_page) {
+    bool good = false;
+    // current page is page about to be left!
+    switch (current_page) {
+      case WizardPage.WORKING_FOLDER:
+        good = true;
+        break;
+      case WizardPage.ON_OPEN:
+        this.directory_btn.value = this.app_settings.working_directory;
+        good = true;
+        break;
+      case WizardPage.ON_CLOSE:
+        good = true;
+        break;
+      case WizardPage.ON_ADD:
+        good = true;
+        break;
+      case WizardPage.ON_BOUNCE:
+        good = true;
+        break;
+      case WizardPage.ON_REMOVE:
+        good = true;
+        break;
+      case WizardPage.ON_MIXDOWN:
+        good = true;
+        break;
+      default:
+        this.directory_btn.value = this.app_settings.working_directory;
+        good = true;
+        break;
+    }
+    return good;
+  }
+  
+  private void select_directory() {
+    // get a filename
+    Hildon.FileChooserDialog file_chooser = new Hildon.FileChooserDialog(this, Gtk.FileChooserAction.SELECT_FOLDER);
+    file_chooser.set_show_upnp(false);
+    Gtk.ResponseType ret = (Gtk.ResponseType) file_chooser.run();
+    if (Gtk.ResponseType.OK == ret) {
+      this.directory_btn.value = file_chooser.get_filename();
+      this.app_settings.working_directory = file_chooser.get_filename();
+    }
+    file_chooser.destroy ();
+  }
+  
+  /*public void destroy_notify(ApplicationSettings* data) {
+    /// TODO
+  }*/
+
+}
+
+}