X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui_dialogs.cc;h=5422bb9957e4a8e0d62e213c63da2491883869ec;hb=20311ed2f3024bf8408171e1bc894f4934142128;hp=c187a5df56be3f459a24ba3eba0590c44f133fad;hpb=12e3fb454145be52ddc82871bedf19b5c32d1c39;p=ardour.git diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index c187a5df56..5422bb9957 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -25,22 +25,32 @@ #include "ardour/session.h" #include "ardour/audioengine.h" +#include "ardour/automation_watch.h" #include "actions.h" +#include "add_route_dialog.h" +#include "add_video_dialog.h" #include "ardour_ui.h" +#include "big_clock_window.h" +#include "bundle_manager.h" +#include "global_port_matrix.h" +#include "gui_object.h" +#include "gui_thread.h" +#include "keyeditor.h" #include "location_ui.h" +#include "main_clock.h" +#include "midi_tracer.h" #include "mixer_ui.h" -#include "rc_option_editor.h" -#include "session_option_editor.h" #include "public_editor.h" +#include "rc_option_editor.h" #include "route_params_ui.h" +#include "shuttle_control.h" +#include "session_option_editor.h" +#include "speaker_dialog.h" +#include "splash.h" #include "sfdb_ui.h" #include "theme_manager.h" -#include "bundle_manager.h" -#include "keyeditor.h" -#include "gui_thread.h" -#include "midi_tracer.h" -#include "add_route_dialog.h" +#include "time_info_box.h" #include "i18n.h" @@ -55,32 +65,42 @@ ARDOUR_UI::set_session (Session *s) { SessionHandlePtr::set_session (s); + if (!_session) { + WM::Manager::instance().set_session (s); + /* Session option editor cannot exist across change-of-session */ + session_option_editor.drop_window (); + /* Ditto for AddVideoDialog */ + add_video_dialog.drop_window (); return; } - if (location_ui) { - location_ui->set_session(s); - } + const XMLNode* node = _session->extra_xml (X_("UI")); - if (route_params) { - route_params->set_session (s); + if (node) { + const XMLNodeList& children = node->children(); + for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { + if ((*i)->name() == GUIObjectState::xml_node_name) { + gui_object_state->load (**i); + break; + } + } } - if (add_route_dialog) { - add_route_dialog->set_session (s); - } + WM::Manager::instance().set_session (s); + + AutomationWatch::instance().set_session (s); - if (session_option_editor) { - session_option_editor->set_session (s); + if (shuttle_box) { + shuttle_box->set_session (s); } - primary_clock.set_session (s); - secondary_clock.set_session (s); - big_clock.set_session (s); - preroll_clock.set_session (s); - postroll_clock.set_session (s); - + primary_clock->set_session (s); + secondary_clock->set_session (s); + big_clock->set_session (s); + time_info_box->set_session (s); + video_timeline->set_session (s); + /* sensitize menu bar options that are now valid */ ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true); @@ -115,7 +135,7 @@ ARDOUR_UI::set_session (Session *s) ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false); rec_button.set_sensitive (true); - shuttle_box.set_sensitive (true); + solo_alert_button.set_active (_session->soloing()); setup_session_options (); @@ -124,19 +144,22 @@ ARDOUR_UI::set_session (Session *s) Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::solo_blink)); Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink)); Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink)); + Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::feedback_blink)); _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context()); + _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context()); _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context()); _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context()); - _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context()); - _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context()); - _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context()); - _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context()); - _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context()); + _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context()); + _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context()); + _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context()); + _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context()); + _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context()); + _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ()); #ifdef HAVE_JACK_SESSION - engine->JackSessionEvent.connect (*_session, MISSING_INVALIDATOR, ui_bind (&Session::jack_session_event, _session, _1), gui_context()); + engine->JackSessionEvent.connect (*_session, MISSING_INVALIDATOR, boost::bind (&Session::jack_session_event, _session, _1), gui_context()); #endif /* Clocks are on by default after we are connected to a session, so show that here. @@ -161,13 +184,23 @@ ARDOUR_UI::set_session (Session *s) second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second), 1000); point_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100); point_zero_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40); + + update_format (); } int ARDOUR_UI::unload_session (bool hide_stuff) { + if (_session) { + ARDOUR_UI::instance()->video_timeline->sync_session_state(); + } + if (_session && _session->dirty()) { - switch (ask_about_saving_session (_("close"))) { + std::vector actions; + actions.push_back (_("Don't close")); + actions.push_back (_("Just close")); + actions.push_back (_("Save and close")); + switch (ask_about_saving_session (actions)) { case -1: // cancel return 1; @@ -181,7 +214,11 @@ ARDOUR_UI::unload_session (bool hide_stuff) if (hide_stuff) { editor->hide (); mixer->hide (); + meterbridge->hide (); theme_manager->hide (); + audio_port_matrix->hide(); + midi_port_matrix->hide(); + route_params->hide(); } second_connection.disconnect (); @@ -192,7 +229,9 @@ ARDOUR_UI::unload_session (bool hide_stuff) ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false); rec_button.set_sensitive (false); - shuttle_box.set_sensitive (false); + + WM::Manager::instance().set_session ((ARDOUR::Session*) 0); + ARDOUR_UI::instance()->video_timeline->close_session(); stop_blinking (); stop_clocking (); @@ -202,220 +241,225 @@ ARDOUR_UI::unload_session (bool hide_stuff) Blink.clear (); delete _session; + _session = 0; + + session_loaded = false; update_buffer_load (); return 0; } -void -ARDOUR_UI::toggle_big_clock_window () +static bool +_hide_splash (gpointer arg) { - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - - if (tact->get_active()) { - big_clock_window->show_all (); - big_clock_window->present (); - } else { - big_clock_window->hide (); - } - } + ((ARDOUR_UI*)arg)->hide_splash(); + return false; } void -ARDOUR_UI::new_midi_tracer_window () +ARDOUR_UI::goto_editor_window () { - RefPtr act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer")); - if (!act) { - return; - } - - std::list::iterator i = _midi_tracer_windows.begin (); - while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) { - ++i; + if (splash && splash->is_visible()) { + // in 2 seconds, hide the splash screen + Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 2000); } - if (i == _midi_tracer_windows.end()) { - /* all our MIDITracer windows are visible; make a new one */ - MidiTracer* t = new MidiTracer (); - manage_window (*t); - t->show_all (); - _midi_tracer_windows.push_back (t); - } else { - /* re-use the hidden one */ - (*i)->show_all (); - } + editor->show_window (); + editor->present (); + /* mixer should now be on top */ + WM::Manager::instance().set_transient_for (editor); + _mixer_on_top = false; } void -ARDOUR_UI::toggle_rc_options_window () +ARDOUR_UI::goto_mixer_window () { - if (rc_option_editor == 0) { - rc_option_editor = new RCOptionEditor; - rc_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("/Common/ToggleRCOptionsEditor"))); - rc_option_editor->set_session (_session); + Glib::RefPtr win; + Glib::RefPtr screen; + + if (editor) { + win = editor->get_window (); } - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - - if (tact->get_active()) { - rc_option_editor->show_all (); - rc_option_editor->present (); - } else { - rc_option_editor->hide (); - } + if (win) { + screen = win->get_screen(); + } else { + screen = Gdk::Screen::get_default(); + } + + if (screen && screen->get_height() < 700) { + Gtk::MessageDialog msg (_("This screen is not tall enough to display the mixer window")); + msg.run (); + return; } + + mixer->show_window (); + mixer->present (); + /* mixer should now be on top */ + WM::Manager::instance().set_transient_for (mixer); + _mixer_on_top = true; } void -ARDOUR_UI::toggle_session_options_window () +ARDOUR_UI::toggle_mixer_window () { - if (session_option_editor == 0) { - session_option_editor = new SessionOptionEditor (_session); - session_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("/Common/ToggleSessionOptionsEditor"))); + Glib::RefPtr act = ActionManager::get_action (X_("Common"), X_("toggle-mixer")); + if (!act) { + return; } - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic (act); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - if (tact->get_active()) { - session_option_editor->show_all (); - session_option_editor->present (); - } else { - session_option_editor->hide (); - } - } -} - -int -ARDOUR_UI::create_location_ui () -{ - if (location_ui == 0) { - location_ui = new LocationUIWindow (); - location_ui->set_session (_session); - location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("/Common/ToggleLocations"))); + if (tact->get_active()) { + goto_mixer_window (); + } else { + mixer->hide (); } - return 0; } void -ARDOUR_UI::toggle_location_window () +ARDOUR_UI::toggle_meterbridge () { - if (create_location_ui()) { + Glib::RefPtr act = ActionManager::get_action (X_("Common"), X_("toggle-meterbridge")); + if (!act) { return; } - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleLocations")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - if (tact->get_active()) { - location_ui->show_all (); - location_ui->present (); - } else { - location_ui->hide (); - } + if (tact->get_active()) { + meterbridge->show_window (); + } else { + meterbridge->hide_window (NULL); } } void -ARDOUR_UI::toggle_key_editor () +ARDOUR_UI::toggle_editor_mixer () { - if (key_editor == 0) { - key_editor = new KeyEditor; - key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("/Common/ToggleKeyEditor"))); - } - - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - - if (tact->get_active()) { - key_editor->show_all (); - key_editor->present (); + bool obscuring = false; + /* currently, if windows are on different + screens then we do nothing; but in the + future we may want to bring the window + to the front or something, so I'm leaving this + variable for future use + */ + bool same_screen = true; + + if (editor && mixer) { + + /* remeber: Screen != Monitor (Screen is a separately rendered + * continuous geometry that make include 1 or more monitors. + */ + + if (editor->get_screen() != mixer->get_screen() && (mixer->get_screen() != 0) && (editor->get_screen() != 0)) { + // different screens, so don't do anything + same_screen = false; + } else { + // they are on the same screen, see if they are obscuring each other + + gint ex, ey, ew, eh; + gint mx, my, mw, mh; + + editor->get_position (ex, ey); + editor->get_size (ew, eh); + + mixer->get_position (mx, my); + mixer->get_size (mw, mh); + + GdkRectangle e; + GdkRectangle m; + GdkRectangle r; + + e.x = ex; + e.y = ey; + e.width = ew; + e.height = eh; + + m.x = mx; + m.y = my; + m.width = mw; + m.height = mh; + + if (gdk_rectangle_intersect (&e, &m, &r)) { + obscuring = true; + } + } + } + + if (mixer && !mixer->not_visible() && mixer->property_has_toplevel_focus()) { + if (obscuring && same_screen) { + goto_editor_window(); + } + } else if (editor && !editor->not_visible() && editor->property_has_toplevel_focus()) { + if (obscuring && same_screen) { + goto_mixer_window(); + } + } else if (mixer && mixer->not_visible()) { + if (obscuring && same_screen) { + goto_mixer_window (); + } + } else if (editor && editor->not_visible()) { + if (obscuring && same_screen) { + goto_editor_window (); + } + } else if (obscuring && same_screen) { + //it's unclear what to do here, so just do the opposite of what we did last time (old behavior) + if (_mixer_on_top) { + goto_editor_window (); } else { - key_editor->hide (); + goto_mixer_window (); } - } + } } void -ARDOUR_UI::toggle_theme_manager () +ARDOUR_UI::new_midi_tracer_window () { - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); + RefPtr act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer")); + if (!act) { + return; + } - if (tact->get_active()) { - theme_manager->show_all (); - theme_manager->present (); - } else { - theme_manager->hide (); - } + std::list::iterator i = _midi_tracer_windows.begin (); + while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) { + ++i; + } + + if (i == _midi_tracer_windows.end()) { + /* all our MIDITracer windows are visible; make a new one */ + MidiTracer* t = new MidiTracer (); + t->show_all (); + _midi_tracer_windows.push_back (t); + } else { + /* re-use the hidden one */ + (*i)->show_all (); } } -void +BundleManager* ARDOUR_UI::create_bundle_manager () { - if (bundle_manager == 0) { - bundle_manager = new BundleManager (_session); - bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("/Common/ToggleBundleManager"))); - } + return new BundleManager (_session); } -void -ARDOUR_UI::toggle_bundle_manager () +AddVideoDialog* +ARDOUR_UI::create_add_video_dialog () { - create_bundle_manager (); - - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic (act); - - if (tact->get_active()) { - bundle_manager->show_all (); - bundle_manager->present (); - } else { - bundle_manager->hide (); - } - } + return new AddVideoDialog (_session); } -int -ARDOUR_UI::create_route_params () +SessionOptionEditor* +ARDOUR_UI::create_session_option_editor () { - if (route_params == 0) { - route_params = new RouteParams_UI (); - route_params->set_session (_session); - route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("/Common/ToggleInspector"))); - } - return 0; + return new SessionOptionEditor (_session); } -void -ARDOUR_UI::toggle_route_params_window () +BigClockWindow* +ARDOUR_UI::create_big_clock_window () { - if (create_route_params ()) { - return; - } - - RefPtr act = ActionManager::get_action (X_("Common"), X_("ToggleInspector")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - - if (tact->get_active()) { - route_params->show_all (); - route_params->present (); - } else { - route_params->hide (); - } - } + return new BigClockWindow (*big_clock); } void @@ -437,14 +481,18 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) && (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) { - float_big_clock (editor); + if (big_clock_window) { + big_clock_window->set_transient_for (*editor); + } } } else { if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) && (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) { - float_big_clock (mixer); + if (big_clock_window) { + big_clock_window->set_transient_for (*mixer); + } } }