open session patch from Doug McLain
[ardour.git] / gtk2_ardour / ardour_ui.cc
index f66b6ff0d1d817d3230cbd408337663b7f814466..c2edada43df375d13caed8f666762cdd91e68dbb 100644 (file)
@@ -56,6 +56,7 @@
 #include <ardour/port.h>
 #include <ardour/audio_track.h>
 
+#include "actions.h"
 #include "ardour_ui.h"
 #include "ardour_message.h"
 #include "public_editor.h"
@@ -830,11 +831,16 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        if (theArdourUI == 0) {
                theArdourUI = this;
        }
+
+       // allow run-time rebinding of accels
+
+       Settings::get_default()->property_gtk_can_change_accels() = true;
+
+       ActionManager::init ();
        
        m_new_session_dialog = 0;
        m_new_session_dialog_ref = NewSessionDialogFactory::create();
-       m_new_session_dialog_ref->get_widget_derived(NewSessionDialogFactory::top_level_widget_name(),
-                                                    m_new_session_dialog);
+       m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
        editor = 0;
        mixer = 0;
        session = 0;
@@ -845,7 +851,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        connection_editor = 0;
        add_route_dialog = 0;
        route_params = 0;
-       meter_bridge = 0;
        option_editor = 0;
        location_ui = 0;
        open_session_selector = 0;
@@ -859,26 +864,15 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        last_configure_time.tv_sec = 0;
        last_configure_time.tv_usec = 0;
 
-       ui_manager = UIManager::create ();
-
        shuttle_grabbed = false;
        shuttle_fract = 0.0;
 
        set_shuttle_units (Percentage);
        set_shuttle_behaviour (Sprung);
 
-       Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
-       
-       shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Percentage));
-       shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Semitones));
-       shuttle_actions->add (Action::create (X_("SetShuttleActionSprung"), _("Sprung")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_behaviour), Sprung));
-       shuttle_actions->add (Action::create (X_("SetShuttleActionWheel"), _("Wheel")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_behaviour), Wheel));
-       
-       ui_manager->insert_action_group (shuttle_actions);
+       shuttle_style_menu = 0;
+       shuttle_unit_menu = 0;
 
-       shuttle_style_menu = dynamic_cast<Menu*> (ui_manager->get_widget ("ShuttleStylePopup"));
-       shuttle_unit_menu = dynamic_cast<Menu*> (ui_manager->get_widget ("ShuttleUnitPopup"));
-       
        gettimeofday (&last_peak_grab, 0);
        gettimeofday (&last_shuttle_request, 0);
 
@@ -934,7 +928,8 @@ ARDOUR_UI::set_engine (AudioEngine& e)
        }
 
        if (GTK_ARDOUR::show_key_actions) {
-               KeyboardTarget::show_all_actions ();
+               // GTK2FIX
+               // show_all_actions ();
                exit (0);
        }
 
@@ -1098,24 +1093,16 @@ If you still wish to quit, please use the\n\n\
 int
 ARDOUR_UI::ask_about_saving_session (string what)
 {
-       ArdourDialog window ("saving dialog");
-       Gtk::VBox   packer;
+       ArdourDialog window (_("ardour: save session?"));
        Gtk::Label  prompt_label;
-       Gtk::HBox   button_packer;
-
        string msg;
 
        msg = string_compose(_("Save and %1"), what);
-       
-       Gtk::Button save_button (msg);
-       save_button.set_name ("EditorGTKButton");
-
+       window.add_button (msg, RESPONSE_ACCEPT);
        msg = string_compose(_("Just %1"), what);
-
-       Gtk::Button nosave_button (msg);
-       nosave_button.set_name ("EditorGTKButton");
-
+       window.add_button (msg, RESPONSE_REJECT);
        msg = string_compose(_("Don't %1"), what);
+       window.add_button (msg, RESPONSE_REJECT);
 
        Gtk::Button noquit_button (msg);
        noquit_button.set_name ("EditorGTKButton");
@@ -1134,36 +1121,30 @@ ARDOUR_UI::ask_about_saving_session (string what)
        prompt_label.set_text (prompt);
        prompt_label.set_alignment (0.5, 0.5);
        prompt_label.set_name (X_("PrompterLabel"));
-
-       save_button.signal_clicked().connect (bind(mem_fun(window,&ArdourDialog::stop), 1));
-       nosave_button.signal_clicked().connect (bind(mem_fun(window,&ArdourDialog::stop), 0));
-       noquit_button.signal_clicked().connect (bind(mem_fun(window,&ArdourDialog::stop), -1));
-
-       button_packer.set_spacing (10);
-       button_packer.pack_start (save_button);
-       button_packer.pack_start (nosave_button);
-       button_packer.pack_start (noquit_button);
        
-       packer.set_spacing (10);
-       packer.set_border_width (10);
-       packer.pack_start (prompt_label);
-       packer.pack_start (button_packer);
+       window.get_vbox()->pack_start (prompt_label);
 
        window.set_name (_("Prompter"));
-       window.set_title (_("ardour: save session?"));
        window.set_position (Gtk::WIN_POS_MOUSE);
        window.set_modal (true);
-       window.add (packer);
        window.show_all ();
-       window.set_keyboard_input (true);
 
        save_the_session = 0;
 
        editor->ensure_float (window);
 
-       window.run ();
+       ResponseType r = (ResponseType) window.run();
 
-       return window.run_status();
+       window.hide ();
+
+       switch (r) {
+       case RESPONSE_ACCEPT:
+               return 0;
+       default:
+               break;
+       }
+
+       return -1;
 }
        
 gint
@@ -1719,17 +1700,10 @@ ARDOUR_UI::build_session_selector ()
 {
        session_selector_window = new ArdourDialog ("session selector");
        
-       Gtk::VBox *vpacker = manage (new Gtk::VBox);
        Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
-       Gtk::HBox *button_packer = manage (new Gtk::HBox);
-       Gtk::Button *cancel_button = manage (new Gtk::Button (_("cancel")));
-       Gtk::Button *rescan_button = manage (new Gtk::Button (_("rescan")));
 
-       button_packer->pack_start (*rescan_button);
-       button_packer->pack_start (*cancel_button);
-
-       vpacker->pack_start (*scroller);
-       vpacker->pack_start (*button_packer, false, false);
+       session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
+       session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
 
        recent_session_model = TreeStore::create (recent_session_columns);
        recent_session_display.set_model (recent_session_model);
@@ -1739,9 +1713,9 @@ ARDOUR_UI::build_session_selector ()
        scroller->add (recent_session_display);
        scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
 
-       session_selector_window->add (*vpacker);
        session_selector_window->set_name ("SessionSelectorWindow");
        session_selector_window->set_size_request (200, 400);
+       session_selector_window->get_vbox()->pack_start (*scroller);
 }
 
 void
@@ -1755,13 +1729,13 @@ ARDOUR_UI::open_recent_session ()
 
        redisplay_recent_sessions ();
 
-       session_selector_window->run ();
+       ResponseType r = (ResponseType) session_selector_window->run ();
 
+       session_selector_window->hide();
 
-       switch (session_selector_window->run_status()) {
-       case 0:
+       switch (r) {
+       case RESPONSE_ACCEPT:
                break;
-
        default:
                return;
        }
@@ -1775,11 +1749,9 @@ ARDOUR_UI::open_recent_session ()
        Glib::ustring path = (*i)[recent_session_columns.fullpath];
        Glib::ustring state = (*i)[recent_session_columns.visible_name];
 
-       session_selector_window->response (RESPONSE_ACCEPT);
        _session_is_new = false;
 
        load_session (path, state);
-
 }
 
 bool
@@ -1819,8 +1791,7 @@ ARDOUR_UI::open_session ()
                
                FileFilter filter_ardour;
                filter_ardour.set_name (_("Ardour sessions"));
-               filter_ardour.add_custom (FILE_FILTER_FILENAME, mem_fun (*this, &ARDOUR_UI::filter_ardour_session_dirs));
-
+               filter_ardour.add_pattern("*.ardour");
                open_session_selector->add_filter (filter_ardour);
        }
 
@@ -1896,7 +1867,6 @@ restart JACK with more ports."));
 void
 ARDOUR_UI::diskstream_added (DiskStream* ds)
 {
-       // meter_bridge_dialog_check->set_sensitive (true);
 }
 
 void
@@ -2233,10 +2203,8 @@ void
 ARDOUR_UI::engine_stopped ()
 {
        ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
-
-       jack_disconnect_item->set_sensitive (false);
-       jack_reconnect_item->set_sensitive (true);
-       jack_bufsize_menu->set_sensitive (false);
+       ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
+       ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
 }
 
 
@@ -2244,10 +2212,8 @@ void
 ARDOUR_UI::engine_running ()
 {
        ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
-
-       jack_disconnect_item->set_sensitive (true);
-       jack_reconnect_item->set_sensitive (false);
-       jack_bufsize_menu->set_sensitive (true);
+       ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
+       ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
 }
 
 void
@@ -2255,9 +2221,8 @@ ARDOUR_UI::engine_halted ()
 {
        ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
 
-       jack_disconnect_item->set_sensitive (false);
-       jack_reconnect_item->set_sensitive (true);
-       jack_bufsize_menu->set_sensitive (false);
+       ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
+       ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
 
        update_sample_rate (0);
 
@@ -2550,14 +2515,6 @@ ARDOUR_UI::restore_state (string name)
        }
 }
 
-void
-ARDOUR_UI::allow_focus (bool yn)
-{
-       if (keyboard) {
-               keyboard->allow_focus (yn);
-       }
-}
-
 void
 ARDOUR_UI::primary_clock_value_changed ()
 {
@@ -2632,20 +2589,6 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff)
        }
 }
 
-gint
-ARDOUR_UI::generic_focus_in_event (GdkEventFocus *ev)
-{
-       ARDOUR_UI::instance()->allow_focus (true);
-       return FALSE;
-}
-
-gint
-ARDOUR_UI::generic_focus_out_event (GdkEventFocus *ev)
-{
-       ARDOUR_UI::instance()->allow_focus (false);
-       return FALSE;
-}
-
 gint
 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
 {
@@ -2703,6 +2646,13 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
                        
                        std::string session_name = m_new_session_dialog->session_name();
                        std::string session_path = m_new_session_dialog->session_folder();
+                       
+                       /*
+                         XXX This is needed because session constructor wants a 
+                         non-existant path. hopefully this will be fixed at some point.
+                       */
+                       session_path = Glib::build_filename(session_path, session_name);
+                       
                        std::string template_name = m_new_session_dialog->session_template_name();
                        
                        if (m_new_session_dialog->use_session_template()) {
@@ -2716,13 +2666,13 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
                                Session::AutoConnectOption iconnect;
                                Session::AutoConnectOption oconnect;
                                
-                               if (m_new_session_dialog->create_control_track()) {
+                               if (m_new_session_dialog->create_control_bus()) {
                                        cchns = (uint32_t) m_new_session_dialog->control_channel_count();
                                } else {
                                        cchns = 0;
                                }
                                
-                               if (m_new_session_dialog->create_master_track()) {
+                               if (m_new_session_dialog->create_master_bus()) {
                                        mchns = (uint32_t) m_new_session_dialog->master_channel_count();
                                } else {
                                        mchns = 0;
@@ -2867,7 +2817,7 @@ ARDOUR_UI::show ()
        }
 
        if (session && mixer) {
-               mixer->show_window ();
+               // mixer->show_window ();
        }
        
        if (about) {
@@ -2909,7 +2859,7 @@ require some unused files to continue to exist."));
                return;
        } 
 
-       ArdourDialog results ("cleanup results");
+       ArdourDialog results (_("ardour: cleanup"), true);
        
        struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
            CleanupResultsModelColumns() { 
@@ -2932,11 +2882,6 @@ require some unused files to continue to exist."));
 
        Gtk::ScrolledWindow list_scroller;
        Gtk::Label txt;
-       Gtk::Button ok_button (_("OK"));
-       Gtk::VBox vpacker;
-       
-       vpacker.set_border_width (10);
-       vpacker.set_spacing (10);
 
        if (rep.space < 1048576.0f) {
                if (removed > 1) {
@@ -2952,7 +2897,7 @@ require some unused files to continue to exist."));
                }
        }
 
-       vpacker.pack_start (txt, false, false);
+       results.get_vbox()->pack_start (txt, false, false);
        
        for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
                TreeModel::Row row = *(results_model->append());
@@ -2964,14 +2909,9 @@ require some unused files to continue to exist."));
        list_scroller.set_size_request (-1, 250);
        list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
        
-       vpacker.pack_start (list_scroller, true, true);
-       vpacker.pack_start (ok_button, false, false);
-       
-       results.add (vpacker);
-       
+       results.get_vbox()->pack_start (list_scroller, true, true);
+       results.add_button (Stock::OK, RESPONSE_ACCEPT);
        results.set_position (Gtk::WIN_POS_MOUSE);
-       results.set_title (_("ardour: cleanup"));
-       results.set_modal (true);
 
        results.run ();
 }
@@ -2984,40 +2924,22 @@ ARDOUR_UI::cleanup ()
                return;
        }
 
-       ArdourDialog checker (X_("cleanup confirm dialog"));
+       ArdourDialog checker (_("ardour cleanup"));
        Gtk::Label label (_("\
 Cleanup is a destructive operation.\n\
 ALL undo/redo information will be lost if you cleanup.\n\
 Unused audio files will be moved to a \"dead sounds\" location."));
-
-       Gtk::Button ok_button (_("Proceed with cleanup"));
-       Gtk::Button cancel_button (_("Cancel"));
-       Gtk::HBox   bbox;
-       Gtk::VBox   vbox;
-
-       bbox.set_border_width (6);
-       bbox.set_spacing (12);
-       bbox.pack_start (ok_button, true, false);
-       bbox.pack_start (cancel_button, true, false);
        
-       vbox.set_border_width (6);
-       vbox.set_spacing (12);
-       vbox.pack_start (label, false, false);
-       vbox.pack_start (bbox, false, false);
-       
-       checker.add (vbox);
+       checker.get_vbox()->pack_start (label, false, false);
+       checker.add_button (Stock::OK, RESPONSE_ACCEPT);
+       checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
+
        checker.set_name (_("CleanupDialog"));
-       checker.set_title (_("ardour cleanup"));
        checker.set_wmclass (_("ardour_cleanup"), "Ardour");
        checker.set_position (Gtk::WIN_POS_MOUSE);
 
-       ok_button.signal_clicked().connect (bind (mem_fun (checker, &ArdourDialog::stop), 1));
-       cancel_button.signal_clicked().connect (bind (mem_fun (checker, &ArdourDialog::stop), 0));
-
-       checker.run ();
-
-       switch (checker.run_status()) {
-       case 0:
+       switch (checker.run()) {
+       case RESPONSE_ACCEPT:
                break;
        default:
                return;
@@ -3079,10 +3001,16 @@ ARDOUR_UI::add_route ()
                return;
        }
 
-       add_route_dialog->run ();
+       ResponseType r = (ResponseType) add_route_dialog->run ();
+       
+       add_route_dialog->hide();
 
-       if (add_route_dialog->run_status()) {
+       switch (r) {
+       case RESPONSE_ACCEPT:
+               break;
+       default:
                return;
+               break;
        }
 
        if ((count = add_route_dialog->count()) <= 0) {
@@ -3237,8 +3165,6 @@ int
 ARDOUR_UI::pending_state_dialog ()
 {
        ArdourDialog dialog ("pending state dialog");
-       Button use_button (_("Recover from crash"));
-       Button cancel_button (_("Ignore crash data"));
        Label  message (_("\
 This session appears to have been in\n\
 middle of recording when ardour or\n\
@@ -3247,28 +3173,18 @@ the computer was shutdown.\n\
 Ardour can recover any captured audio for\n\
 you, or it can ignore it. Please decide\n\
 what you would like to do.\n"));
-       HBox hpacker;
-       VBox vpacker;
 
-       vpacker.set_border_width (12);
-       vpacker.set_spacing (7);
-       vpacker.pack_start (message);
-       vpacker.pack_start (hpacker);
-
-       hpacker.set_spacing (7);
-       hpacker.pack_start (use_button);
-       hpacker.pack_start (cancel_button);
-       
-       use_button.signal_clicked().connect (bind (mem_fun (dialog, &ArdourDialog::stop), 0));
-       cancel_button.signal_clicked().connect (bind (mem_fun (dialog, &ArdourDialog::stop), 1));
+       dialog.get_vbox()->pack_start (message);
+       dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
+       dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
 
-       dialog.add (vpacker);
        dialog.set_position (WIN_POS_CENTER);
        dialog.show_all ();
        
-       dialog.run ();
-
-       if (dialog.run_status () != 0) {
+       switch (dialog.run ()) {
+       case RESPONSE_ACCEPT:
+               break;
+       default:
                return 1;
        }