diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2015-11-18 22:25:18 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-02-22 15:31:25 -0500 |
commit | 51879285c5ec92f981c1e7bd0c9a38659b7d9a9f (patch) | |
tree | 43d1d6f1e919ec53928d35b0907e59f0d8c249d3 | |
parent | e9234c856a783ff3e585e1852852c72843d8ce7f (diff) |
tab-free tabbed display, part 1.2
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 3 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_dependents.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_dialogs.cc | 88 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_ed.cc | 58 | ||||
-rw-r--r-- | libs/gtkmm2ext/tabbable.cc | 3 |
6 files changed, 134 insertions, 25 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 5ee8d46ad9..344ca17d18 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -293,6 +293,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , _feedback_exists (false) , _log_not_acknowledged (LogLevelNone) , duplicate_routes_dialog (0) + , editor_visibility_button (S_("Window|Editor")) + , mixer_visibility_button (S_("Window|Mixer")) + , prefs_visibility_button (S_("Window|Preferences")) { Gtkmm2ext::init (localedir); diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 407616e062..e9236adda4 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -827,8 +827,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void grab_focus_after_dialog (); void tabs_switch (GtkNotebookPage*, guint page_number); - void tabs_page_added (Gtk::Widget*, guint page_number); - void tabs_page_removed (Gtk::Widget*, guint page_number); + ArdourButton editor_visibility_button; + ArdourButton mixer_visibility_button; + ArdourButton prefs_visibility_button; + bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings*); bool try_gtk_accel_binding (GtkWindow* win, GdkEventKey* ev, bool translate, GdkModifierType modifier); diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index afcecd3f4f..b194f3ca89 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -242,6 +242,7 @@ ARDOUR_UI::setup_windows () */ _tabs.signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_button_event), false); _tabs.signal_button_release_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_button_event), false); + _tabs.signal_switch_page().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_switch)); rc_option_editor = new RCOptionEditor; rc_option_editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 8a51d83308..6fdd3d7ef7 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -365,12 +365,52 @@ ARDOUR_UI::detach_tabbable (Tabbable* t) } void +ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page) +{ + if (page == _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 (page == _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 { + 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); + } + +} + +void ARDOUR_UI::tabbable_state_change (Tabbable& t) { std::vector<std::string> insensitive_action_names; std::vector<std::string> sensitive_action_names; + std::vector<std::string> active_action_names; + std::vector<std::string> inactive_action_names; Glib::RefPtr<Action> action; std::string downcased_name = downcase (t.name()); + enum ViewState { + Tabbed, + Windowed, + Hidden + }; + ViewState vs; if (t.tabbed()) { @@ -379,6 +419,8 @@ ARDOUR_UI::tabbable_state_change (Tabbable& t) sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name)); sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name)); + vs = Tabbed; + } else if (t.tabbed_by_default ()) { insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name)); @@ -386,6 +428,8 @@ ARDOUR_UI::tabbable_state_change (Tabbable& t) sensitive_action_names.push_back (string_compose ("show-%1", downcased_name)); sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name)); + vs = Hidden; + } else if (t.window_visible()) { insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name)); @@ -393,6 +437,11 @@ ARDOUR_UI::tabbable_state_change (Tabbable& t) sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name)); sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name)); + active_action_names.push_back (string_compose ("show-%1", downcased_name)); + inactive_action_names.push_back (string_compose ("hide-%1", downcased_name)); + + vs = Windowed; + } else { /* not currently visible. allow user to retab it or just make @@ -403,8 +452,12 @@ ARDOUR_UI::tabbable_state_change (Tabbable& t) insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name)); sensitive_action_names.push_back (string_compose ("show-%1", downcased_name)); sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name)); - } + active_action_names.push_back (string_compose ("hide-%1", downcased_name)); + inactive_action_names.push_back (string_compose ("show-%1", downcased_name)); + + vs = Hidden; + } for (std::vector<std::string>::iterator s = insensitive_action_names.begin(); s != insensitive_action_names.end(); ++s) { action = ActionManager::get_action (X_("Common"), (*s).c_str()); @@ -419,6 +472,39 @@ ARDOUR_UI::tabbable_state_change (Tabbable& t) action->set_sensitive (true); } } + + ArdourButton* vis_button = 0; + std::vector<ArdourButton*> other_vis_buttons; + + if (&t == editor) { + vis_button = &editor_visibility_button; + other_vis_buttons.push_back (&mixer_visibility_button); + other_vis_buttons.push_back (&prefs_visibility_button); + } else if (&t == mixer) { + vis_button = &mixer_visibility_button; + other_vis_buttons.push_back (&editor_visibility_button); + other_vis_buttons.push_back (&prefs_visibility_button); + } else { + vis_button = &prefs_visibility_button; + other_vis_buttons.push_back (&editor_visibility_button); + other_vis_buttons.push_back (&mixer_visibility_button); + } + + if (!vis_button) { + return; + } + + switch (vs) { + case Tabbed: + vis_button->set_active_state (Gtkmm2ext::ImplicitActive); + break; + case Windowed: + vis_button->set_active_state (Gtkmm2ext::ExplicitActive); + break; + case Hidden: + vis_button->set_active_state (Gtkmm2ext::Off); + break; + } } void diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index a07b943433..15b129ef89 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -222,9 +222,9 @@ ARDOUR_UI::install_actions () global_actions.register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish)))); global_actions.register_action (common_actions, X_("Hide"), _("Hide"), sigc::mem_fun (*this, &ARDOUR_UI::hide_application)); - global_actions.register_toggle_action (common_actions, X_("show-editor"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), editor)); - global_actions.register_toggle_action (common_actions, X_("show-mixer"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), mixer)); - global_actions.register_toggle_action (common_actions, X_("show-preferences"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), rc_option_editor)); + global_actions.register_action (common_actions, X_("show-editor"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), editor)); + global_actions.register_action (common_actions, X_("show-mixer"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), mixer)); + global_actions.register_action (common_actions, X_("show-preferences"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), rc_option_editor)); global_actions.register_action (common_actions, X_("hide-editor"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), editor)); global_actions.register_action (common_actions, X_("hide-mixer"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), mixer)); @@ -553,29 +553,43 @@ ARDOUR_UI::build_menu_bar () use_menubar_as_top_menubar (); #endif - ArdourButton* editor_button = manage (new ArdourButton (S_("Window|Editor"))); - ArdourButton* mixer_button = manage (new ArdourButton (S_("Window|Mixer"))); - ArdourButton* prefs_button = manage (new ArdourButton (S_("Window|Preferences"))); Gtk::HBox* window_button_box = manage (new Gtk::HBox); std::vector<TargetEntry> drag_target_entries; drag_target_entries.push_back (TargetEntry ("tabbable")); - editor_button->drag_source_set (drag_target_entries); - editor_button->drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (S_("Window|Editor"), - Pango::FontDescription ("Sans 12"), - 40, 20, - Gdk::Color ("red"))); - - editor_button->signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), editor)); - - editor_button->set_related_action (ActionManager::get_action (X_("Common"), X_("show-editor"))); - editor_button->set_name (X_("page switch button")); - mixer_button->set_related_action (ActionManager::get_action (X_("Common"), X_("show-mixer"))); - mixer_button->set_name (X_("page switch button")); - - window_button_box->pack_start (*editor_button, false, false); - window_button_box->pack_start (*mixer_button, false, false); - window_button_box->pack_start (*prefs_button, false, false); + + editor_visibility_button.drag_source_set (drag_target_entries); + editor_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (editor->name(), + Pango::FontDescription ("Sans 24"), + 40, 20, + Gdk::Color ("red"))); + editor_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), editor)); + + mixer_visibility_button.drag_source_set (drag_target_entries); + mixer_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (mixer->name(), + Pango::FontDescription ("Sans 24"), + 40, 20, + Gdk::Color ("red"))); + mixer_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), mixer)); + + prefs_visibility_button.drag_source_set (drag_target_entries); + prefs_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (rc_option_editor->name(), + Pango::FontDescription ("Sans 24"), + 40, 20, + Gdk::Color ("red"))); + prefs_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), rc_option_editor)); + + + editor_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("show-editor"))); + editor_visibility_button.set_name (X_("page switch button")); + mixer_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("show-mixer"))); + mixer_visibility_button.set_name (X_("page switch button")); + prefs_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("show-preferences"))); + prefs_visibility_button.set_name (X_("page switch button")); + + window_button_box->pack_start (editor_visibility_button, false, false); + window_button_box->pack_start (mixer_visibility_button, false, false); + window_button_box->pack_start (prefs_visibility_button, false, false); menu_hbox.pack_start (*window_button_box, false, false, 20); diff --git a/libs/gtkmm2ext/tabbable.cc b/libs/gtkmm2ext/tabbable.cc index a451aeeb3d..4344f39749 100644 --- a/libs/gtkmm2ext/tabbable.cc +++ b/libs/gtkmm2ext/tabbable.cc @@ -27,6 +27,8 @@ #include "gtkmm2ext/utils.h" #include "gtkmm2ext/visibility_tracker.h" +#include "pbd/stacktrace.h" + #include "i18n.h" using namespace Gtkmm2ext; @@ -36,6 +38,7 @@ using std::string; Tabbable::Tabbable (Widget& w, const string& name) : WindowProxy (name) , _contents (w) + , _parent_notebook (0) , tab_close_image (ArdourIcon::CloseCross, 0xffffffff) , tab_requested_by_state (true) { |