Alternative approach for show/hide Meterbridge #6386
authorRobin Gareus <robin@gareus.org>
Fri, 26 Jun 2015 20:35:40 +0000 (22:35 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 26 Jun 2015 20:35:54 +0000 (22:35 +0200)
* no more on-top (transient to editor)
* similar approach as toggle editor/mixer

see also 0cd1db76f04

gtk2_ardour/ardour_ui_dialogs.cc
gtk2_ardour/ardour_ui_ed.cc
gtk2_ardour/ardour_ui_mixer.cc
gtk2_ardour/meterbridge.cc

index d1efb4d7def93dbf0454dc2c122025de23172848..65562382404c63a4a28e1b95cdf97f5837371cda 100644 (file)
@@ -393,19 +393,61 @@ ARDOUR_UI::toggle_mixer_window ()
 void
 ARDOUR_UI::toggle_meterbridge ()
 {
-       Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-meterbridge"));
-       if (!act) {
+       if (!editor || !meterbridge) {
+               /* can this really happen?
+                * keyboard shortcut during session close, maybe?
+                */
+#ifndef NDEBUG
+                /* one way to find out: */
+               printf("ARDOUR_UI::toggle_meterbridge: Editor: %p MB: %p\n", editor, meterbridge);
+               PBD::stacktrace (std::cerr, 20);
+               assert (0);
+#endif
                return;
        }
 
-       Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+       bool show = false;
+       bool obscuring = false;
 
-       if (tact->get_active()) {
+       if (meterbridge->not_visible ()) {
+               show = true;
+       }
+       else if (editor->get_screen() == meterbridge->get_screen()) {
+               gint ex, ey, ew, eh;
+               gint mx, my, mw, mh;
+
+               editor->get_position (ex, ey);
+               editor->get_size (ew, eh);
+               meterbridge->get_position (mx, my);
+               meterbridge->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 (obscuring && editor->property_has_toplevel_focus()) {
+               show = true;
+       }
+
+       if (show) {
                meterbridge->show_window ();
                meterbridge->present ();
-               if (editor) {
-                       meterbridge->set_transient_for (*editor);
-               }
+               meterbridge->raise ();
        } else {
                meterbridge->hide_window (NULL);
        }
index 3f0bb4433618edfd1644d8537be26096a5203b36..2b427bf04f3590591ec960fc77139a537e610e52 100644 (file)
@@ -203,7 +203,7 @@ if (Profile->get_mixbus())
 
        ActionManager::register_toggle_action (common_actions, X_("toggle-mixer"), S_("Window|Mixer"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_window));
        ActionManager::register_action (common_actions, X_("toggle-editor-mixer"), _("Toggle Editor+Mixer"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_editor_mixer));
-       ActionManager::register_toggle_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
+       ActionManager::register_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
 
        ActionManager::register_action (common_actions, X_("reattach-all-tearoffs"), _("Reattach All Tearoffs"), sigc::mem_fun (*this, &ARDOUR_UI::reattach_all_tearoffs));
 
index a2669f968d92bf86c4fc94f3a13443ad4efceaa9..009442f76904ede21ebb5c267544674b4fccc75a 100644 (file)
@@ -65,7 +65,6 @@ ARDOUR_UI::create_meterbridge ()
        }
 
        meterbridge->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
-       meterbridge->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/toggle-meterbridge")));
 
        return 0;
 }
index e325ff814beda35f10cbaa3d81b6df43ec910880..aaf1842c79e077b2370650a7c04e429a82d201ea 100644 (file)
@@ -439,7 +439,6 @@ Meterbridge::set_session (Session* s)
        if (_visible) {
                show_window();
                present ();
-               ActionManager::check_toggleaction ("<Actions>/Common/toggle-meterbridge");
        }
        start_updating ();
 }