From 5c8bd6e977380bacd8cc61f8237745078cffcc3e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 15 Nov 2024 03:51:53 +0100 Subject: [PATCH] Tweak Tabbable Layout * allow for left side resizable pane * automatically set attachment button sensitivity * remove right-side pane box when unused --- libs/widgets/tabbable.cc | 45 +++++++++++++++++++++++++-------- libs/widgets/widgets/tabbable.h | 14 +++++++++- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/libs/widgets/tabbable.cc b/libs/widgets/tabbable.cc index 13ff0b43a5..d6125e2102 100644 --- a/libs/widgets/tabbable.cc +++ b/libs/widgets/tabbable.cc @@ -37,10 +37,11 @@ using namespace Gtk; using namespace Gtkmm2ext; using namespace ArdourWidgets; -Tabbable::Tabbable (const string& visible_name, string const & nontranslatable_name, Widget* w, bool tabbed_by_default) +Tabbable::Tabbable (const string& visible_name, string const & nontranslatable_name, Widget* w, bool tabbed_by_default, PaneLayout pl) : WindowProxy (visible_name, nontranslatable_name) , _parent_notebook (0) , tab_requested_by_state (tabbed_by_default) + , _panelayout (pl) { if (w) { _contents = w; @@ -77,6 +78,10 @@ Tabbable::default_layout () right_attachment_button.set_tweaks (ArdourButton::ExpandtoSquare); bottom_attachment_button.set_tweaks (ArdourButton::ExpandtoSquare); + left_attachment_button.set_sensitive (0 != (_panelayout & (PaneLeft | AttLeft))); // Editor Mixer + right_attachment_button.set_sensitive (0 != (_panelayout & PaneRight)); + bottom_attachment_button.set_sensitive (0 != (_panelayout & PaneBottom)); + content_attachment_hbox.set_border_width(3); content_attachment_hbox.set_spacing(3); content_attachment_hbox.pack_end (right_attachment_button, false, false); @@ -95,27 +100,42 @@ Tabbable::default_layout () toolbar_frame->add (content_header_hbox); _content_vbox.pack_start (*toolbar_frame, false, false); - _content_vbox.pack_start (content_hbox, true, true); - content_hbox.pack_start (content_att_left, false, false); - content_hbox.pack_start (content_midlevel_vbox, true, true); + if (_panelayout & PaneLeft) { + _content_vbox.pack_start (content_left_pane, true, true); + content_left_pane.add (content_att_left); + content_left_pane.add (content_midlevel_vbox); + } else { + _content_vbox.pack_start (content_hbox, true, true); + content_hbox.pack_start (content_att_left, false, false); + content_hbox.pack_start (content_midlevel_vbox, true, true); + } content_midlevel_vbox.pack_start (content_right_pane, true, true); content_midlevel_vbox.pack_start (content_att_bottom, false, false); content_right_pane.add (content_inner_vbox); - content_right_pane.add (content_right_vbox); - //TODO: menu switcher here? - content_right_vbox.pack_start (content_att_right, true, true); + if (_panelayout & PaneRight) { + content_right_pane.add (content_right_vbox); + content_right_vbox.pack_start (content_att_right, true, true); + } content_inner_vbox.pack_start (content_toolbar, false, false); content_inner_vbox.pack_start (content_innermost_hbox, true, true); - content_right_pane.set_child_minsize (content_att_right, 160); /* rough guess at width of notebook tabs */ + if (_panelayout & PaneRight) { + content_right_pane.set_child_minsize (content_att_right, 160); /* rough guess at width of notebook tabs */ + } content_right_pane.set_check_divider_position (true); content_right_pane.set_divider (0, 0.85); + if (_panelayout & PaneLeft) { + content_left_pane.set_child_minsize (content_att_left, 80); + } + content_left_pane.set_check_divider_position (true); + content_left_pane.set_divider (0, 0.15); + _content_vbox.show_all(); } @@ -408,7 +428,8 @@ Tabbable::get_state() const node.set_property (X_("tabbed"), tabbed()); - node.set_property (string_compose("%1%2", _menu_name, X_("-listpane-pos")).c_str(), content_right_pane.get_divider ()); + node.set_property (string_compose("%1%2", _menu_name, X_("-rightpane-pos")).c_str(), content_right_pane.get_divider ()); + node.set_property (string_compose("%1%2", _menu_name, X_("-leftpane-pos")).c_str(), content_left_pane.get_divider ()); return node; } @@ -432,10 +453,14 @@ Tabbable::set_state (const XMLNode& node, int version) if (window_node) { window_node->get_property (X_("tabbed"), tab_requested_by_state); float fract; - if ( window_node->get_property (string_compose("%1%2", _menu_name, X_("-listpane-pos")).c_str(), fract) ) { + if ( window_node->get_property (string_compose("%1%2", _menu_name, X_("-rightpane-pos")).c_str(), fract) ) { fract = std::max (.05f, std::min (.95f, fract)); content_right_pane.set_divider (0, fract); } + if ( window_node->get_property (string_compose("%1%2", _menu_name, X_("-leftpane-pos")).c_str(), fract) ) { + fract = std::max (.05f, std::min (.95f, fract)); + content_left_pane.set_divider (0, fract); + } } diff --git a/libs/widgets/widgets/tabbable.h b/libs/widgets/widgets/tabbable.h index a7be3cd8e8..103d1bdbfb 100644 --- a/libs/widgets/widgets/tabbable.h +++ b/libs/widgets/widgets/tabbable.h @@ -48,7 +48,17 @@ namespace ArdourWidgets { class LIBWIDGETS_API Tabbable : public Gtkmm2ext::WindowProxy { public: - Tabbable (const std::string& user_visible_name, std::string const & untranslated_name, Gtk::Widget* top = NULL, bool tabbed_by_default = true); + enum PaneLayout { + NoPanes = 0x0, + PaneLeft = 0x1, + PaneRight = 0x2, + PaneBottom = 0x4, + PaneLeftBtm = 0x5, + PaneRightBtm = 0x6, + AttLeft = 0x8, + }; + + Tabbable (const std::string& user_visible_name, std::string const & untranslated_name, Gtk::Widget* top = NULL, bool tabbed_by_default = true, PaneLayout pl = PaneRightBtm); ~Tabbable (); void add_to_notebook (Gtk::Notebook& notebook); @@ -113,6 +123,7 @@ protected: Gtk::EventBox content_attachments; /* a placeholder the (strip, list, props) visibility buttons for this tab */ Gtk::HBox content_attachment_hbox; EventBoxExt content_tabbables; /* a placeholder for the tabbable switching buttons (used by ArdourUI) */ + HPane content_left_pane; Gtk::HBox content_hbox; EventBoxExt content_att_left; /* a placeholder for the mixer strip, if you want one */ Gtk::VBox content_midlevel_vbox; @@ -144,6 +155,7 @@ private: Gtk::Notebook _own_notebook; Gtk::Notebook* _parent_notebook; bool tab_requested_by_state; + PaneLayout _panelayout; };