set sysex height & position on redisplay.
[ardour.git] / gtk2_ardour / ardour_ui_dialogs.cc
index 8349683d5d09ba1cd4dd7628ffa8759de5bea38f..561fac9c158c6b458e10eca69b39640e9ab73690 100644 (file)
@@ -56,6 +56,7 @@
 #include "meter_patterns.h"
 #include "monitor_section.h"
 #include "midi_tracer.h"
+#include "mini_timeline.h"
 #include "mixer_ui.h"
 #include "public_editor.h"
 #include "processor_box.h"
 #include "speaker_dialog.h"
 #include "splash.h"
 #include "sfdb_ui.h"
-#include "theme_manager.h"
 #include "time_info_box.h"
 #include "timers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -108,14 +108,13 @@ ARDOUR_UI::set_session (Session *s)
 
        AutomationWatch::instance().set_session (s);
 
-       if (shuttle_box) {
-               shuttle_box->set_session (s);
-       }
+       shuttle_box.set_session (s);
+       mini_timeline.set_session (s);
+       time_info_box->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 */
@@ -171,6 +170,7 @@ ARDOUR_UI::set_session (Session *s)
        _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 ());
+       _session->auto_loop_location_changed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::set_loop_sensitivity, this), gui_context ());
 
        /* Clocks are on by default after we are connected to a session, so show that here.
        */
@@ -223,7 +223,7 @@ ARDOUR_UI::set_session (Session *s)
                        editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
                        editor_meter->clear_meters();
                        editor_meter->set_type (_session->master_out()->meter_type());
-                       editor_meter->setup_meters (30, 12, 6);
+                       editor_meter->setup_meters (30, 10, 6);
                        editor_meter->show();
                        meter_box.pack_start(*editor_meter);
                }
@@ -240,12 +240,7 @@ ARDOUR_UI::set_session (Session *s)
                editor_meter_max_peak = -INFINITY;
                editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
 
-               if (UIConfiguration::instance().get_show_editor_meter() && !ARDOUR::Profile->get_trx()) {
-                       transport_hbox.pack_start (meter_box, false, false);
-                       transport_hbox.pack_start (editor_meter_peak_display, false, false);
-                       meter_box.show();
-                       editor_meter_peak_display.show();
-               }
+               repack_transport_hbox ();
        }
 
        update_title ();
@@ -336,43 +331,66 @@ void
 ARDOUR_UI::toggle_editor_and_mixer ()
 {
        if (editor->tabbed() && mixer->tabbed()) {
+               /* both in the same window */
                if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
                        _tabs.set_current_page (_tabs.page_num (mixer->contents()));
                } else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
                        _tabs.set_current_page (_tabs.page_num (editor->contents()));
                } else {
-                       /* do nothing */
+                       /* go to mixer */
+                       _tabs.set_current_page (_tabs.page_num (mixer->contents()));
                }
                return;
        }
 
+
        if (editor->tabbed() && !mixer->tabbed()) {
-               if (!editor->fully_visible()) {
-                       if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
+               /* editor is tabbed, mixer is not */
+
+               Gtk::Window* mwin = mixer->current_toplevel ();
+
+               if (!mwin) {
+                       /* mixer's own window doesn't exist */
+                       mixer->make_visible ();
+               } else if (!mwin->is_mapped ()) {
+                       /* mixer's own window exists but isn't mapped */
+                       mixer->make_visible ();
+               } else {
+                       /* mixer window is mapped, editor is visible as tab */
+                       Gtk::Widget* f = mwin->get_focus();
+                       if (f && f->has_focus()) {
+                               /* mixer has focus, switch to editor */
+                               editor->make_visible ();
+                       } else {
                                mixer->make_visible ();
                        }
-               } else {
-                       _main_window.present ();
                }
                return;
        }
 
-       if (mixer->tabbed () && !editor->tabbed()) {
-               if (!editor->fully_visible()) {
-                       if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
+       if (!editor->tabbed() && mixer->tabbed()) {
+               /* mixer is tabbed, editor is not */
+
+               Gtk::Window* ewin = editor->current_toplevel ();
+
+               if (!ewin) {
+                       /* mixer's own window doesn't exist */
+                       editor->make_visible ();
+               } else if (!ewin->is_mapped ()) {
+                       /* editor's own window exists but isn't mapped */
+                       editor->make_visible ();
+               } else {
+                       /* editor window is mapped, mixer is visible as tab */
+                       Gtk::Widget* f = ewin->get_focus();
+                       if (f && f->has_focus()) {
+                               /* editor has focus, switch to mixer */
+                               mixer->make_visible ();
+                       } else {
                                editor->make_visible ();
                        }
-               } else {
-                       _main_window.present ();
                }
                return;
        }
-
-       if (editor->fully_visible()) {
-               mixer->make_visible ();
-       } else {
-               editor->make_visible ();
-       }
 }
 
 void
@@ -581,28 +599,36 @@ ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
 {
        if (editor && (page == (guint) _tabs.page_num (editor->contents()))) {
                editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+
                if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
                        mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
+
                if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
                        prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
        } else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
+
                if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
                        editor_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
+
                mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
 
                if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
                        prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
-       } else {
+
+       } else if (page == (guint) _tabs.page_num (rc_option_editor->contents())) {
+
                if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
                        editor_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
+
                if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
                        mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
+
                prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
        }
 
@@ -696,7 +722,7 @@ ARDOUR_UI::tabbable_state_change (Tabbable& t)
                vis_button = &mixer_visibility_button;
                other_vis_buttons.push_back (&editor_visibility_button);
                other_vis_buttons.push_back (&prefs_visibility_button);
-       } else {
+       } else if (&t == rc_option_editor) {
                vis_button = &prefs_visibility_button;
                other_vis_buttons.push_back (&editor_visibility_button);
                other_vis_buttons.push_back (&mixer_visibility_button);