From f8c684067790e291f5056a0f6eb73e18f277100c Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 23 Oct 2011 21:31:28 +0000 Subject: Allow status bar components to be individually shown / hidden. git-svn-id: svn://localhost/ardour2/branches/3.0@10296 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui.cc | 16 ++++++ gtk2_ardour/ardour_ui.h | 6 +++ gtk2_ardour/ardour_ui_ed.cc | 121 +++++++++++++++++++++++++++++++++++++++++--- gtk2_ardour/enums.cc | 9 ++++ gtk2_ardour/enums.h | 9 ++++ 5 files changed, 155 insertions(+), 6 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 33b079da1e..63ca764477 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -329,6 +329,17 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) starting.connect (sigc::mem_fun(*this, &ARDOUR_UI::startup)); stopping.connect (sigc::mem_fun(*this, &ARDOUR_UI::shutdown)); + + { + _status_bar_visiblity = (StatusBarComponent) (StatusCPULoad | StatusBufferLoad | StatusSampleRate | StatusFormat); + XMLNode* n = Config->extra_xml (X_("UI")); + if (n) { + XMLProperty* p = n->property (X_("status-bar-visibility")); + if (p) { + _status_bar_visiblity = (StatusBarComponent) string_2_enum (p->value(), _status_bar_visiblity); + } + } + } } /** @return true if a session was chosen and `apply' clicked, otherwise false if `cancel' was clicked */ @@ -712,6 +723,11 @@ ARDOUR_UI::startup () add_window_proxy (_global_port_matrix[*i]); } + /* We have to do this here since goto_editor_window() ends up calling show_all() on the + * editor window, and we may want stuff to be hidden. + */ + update_status_bar_visibility (); + BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME)); } diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 5c2a99290d..2a3e428cc5 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -67,6 +67,7 @@ #include "editing.h" #include "ui_config.h" #include "window_proxy.h" +#include "enums.h" class About; class AddRouteDialog; @@ -720,6 +721,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr int ambiguous_file (std::string file, std::string path, std::vector hits); bool click_button_clicked (GdkEventButton *); + + bool status_bar_button_press_event (GdkEventButton *); + void update_status_bar_visibility (); + void toggle_status_bar_visibility (StatusBarComponent); + StatusBarComponent _status_bar_visiblity; }; #endif /* __ardour_gui_h__ */ diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 1771c944a1..bb627fc011 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -522,6 +522,13 @@ ARDOUR_UI::build_menu_bar () // so use this instead ... gtk_settings_set_long_property (gtk_settings_get_default(), "gtk-can-change-accels", 1, "Ardour:designers"); + EventBox* ev = manage (new EventBox); + ev->show (); + HBox* hbox = manage (new HBox); + hbox->show (); + + ev->add (*hbox); + wall_clock_box.add (wall_clock_label); wall_clock_box.set_name ("WallClock"); wall_clock_label.set_name ("WallClock"); @@ -562,18 +569,119 @@ ARDOUR_UI::build_menu_bar () if (!Profile->get_small_screen()) { #ifndef GTKOSX // OSX provides its own wallclock, thank you very much - menu_hbox.pack_end (wall_clock_box, false, false, 2); + _status_bar_visiblity = (StatusBarComponent) (_status_bar_visiblity | StatusWallClock); #endif - menu_hbox.pack_end (disk_space_box, false, false, 4); + _status_bar_visiblity = (StatusBarComponent) (_status_bar_visiblity | StatusDiskSpace); } + + hbox->pack_end (wall_clock_box, false, false, 2); + hbox->pack_end (disk_space_box, false, false, 4); + hbox->pack_end (cpu_load_box, false, false, 4); + hbox->pack_end (buffer_load_box, false, false, 4); + hbox->pack_end (sample_rate_box, false, false, 4); + hbox->pack_end (format_box, false, false, 4); - menu_hbox.pack_end (cpu_load_box, false, false, 4); - menu_hbox.pack_end (buffer_load_box, false, false, 4); - menu_hbox.pack_end (sample_rate_box, false, false, 4); - menu_hbox.pack_end (format_box, false, false, 4); + menu_hbox.pack_end (*ev, false, false); menu_bar_base.set_name ("MainMenuBar"); menu_bar_base.add (menu_hbox); + + ev->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::status_bar_button_press_event)); +} + +bool +ARDOUR_UI::status_bar_button_press_event (GdkEventButton* ev) +{ + if (ev->button != 3) { + return false; + } + + using namespace Menu_Helpers; + + Menu* m = manage (new Menu); + + MenuList& items = m->items (); + + items.push_back (CheckMenuElem (_("Wall Clock"))); + CheckMenuItem* i = dynamic_cast (&items.back ()); + i->set_active (_status_bar_visiblity & StatusWallClock); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_status_bar_visibility), StatusWallClock)); + + items.push_back (CheckMenuElem (_("Disk Space"))); + i = dynamic_cast (&items.back ()); + i->set_active (_status_bar_visiblity & StatusDiskSpace); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_status_bar_visibility), StatusDiskSpace)); + + items.push_back (CheckMenuElem (_("DSP"))); + i = dynamic_cast (&items.back ()); + i->set_active (_status_bar_visiblity & StatusCPULoad); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_status_bar_visibility), StatusCPULoad)); + + items.push_back (CheckMenuElem (_("Buffers"))); + i = dynamic_cast (&items.back ()); + i->set_active (_status_bar_visiblity & StatusBufferLoad); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_status_bar_visibility), StatusBufferLoad)); + + items.push_back (CheckMenuElem (_("JACK Sampling Rate and Latency"))); + i = dynamic_cast (&items.back ()); + i->set_active (_status_bar_visiblity & StatusSampleRate); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_status_bar_visibility), StatusSampleRate)); + + items.push_back (CheckMenuElem (_("File Format"))); + i = dynamic_cast (&items.back ()); + i->set_active (_status_bar_visiblity & StatusFormat); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_status_bar_visibility), StatusFormat)); + + m->popup (1, ev->time); + + return true; +} + +void +ARDOUR_UI::update_status_bar_visibility () +{ + if (_status_bar_visiblity & StatusWallClock) { + wall_clock_box.show (); + } else { + wall_clock_box.hide (); + } + + if (_status_bar_visiblity & StatusDiskSpace) { + disk_space_box.show (); + } else { + disk_space_box.hide (); + } + + if (_status_bar_visiblity & StatusCPULoad) { + cpu_load_box.show (); + } else { + cpu_load_box.hide (); + } + + if (_status_bar_visiblity & StatusBufferLoad) { + buffer_load_box.show (); + } else { + buffer_load_box.hide (); + } + + if (_status_bar_visiblity & StatusSampleRate) { + sample_rate_box.show (); + } else { + sample_rate_box.hide (); + } + + if (_status_bar_visiblity & StatusFormat) { + format_box.show (); + } else { + format_box.hide (); + } +} + +void +ARDOUR_UI::toggle_status_bar_visibility (StatusBarComponent c) +{ + _status_bar_visiblity = (StatusBarComponent) (_status_bar_visiblity ^ c); + update_status_bar_visibility (); } void @@ -721,6 +829,7 @@ ARDOUR_UI::save_ardour_state () Config->add_extra_xml (get_transport_controllable_state()); XMLNode* window_node = new XMLNode (X_("UI")); + window_node->add_property (X_("status-bar-visibility"), enum_2_string (_status_bar_visiblity)); for (list::iterator i = _window_proxies.begin(); i != _window_proxies.end(); ++i) { if ((*i)->rc_configured()) { diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc index 930ac7e2d6..76bcff4205 100644 --- a/gtk2_ardour/enums.cc +++ b/gtk2_ardour/enums.cc @@ -41,6 +41,7 @@ setup_gtk_ardour_enums () EditPoint edit_point; LayerDisplay layer_display; RegionListSortType region_list_sort_type; + StatusBarComponent status_bar_component; #define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear() #define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear() @@ -83,4 +84,12 @@ setup_gtk_ardour_enums () REGISTER_ENUM (ByStartInFile); REGISTER_ENUM (ByTimestamp); REGISTER (region_list_sort_type); + + REGISTER_ENUM (StatusWallClock); + REGISTER_ENUM (StatusDiskSpace); + REGISTER_ENUM (StatusCPULoad); + REGISTER_ENUM (StatusBufferLoad); + REGISTER_ENUM (StatusSampleRate); + REGISTER_ENUM (StatusFormat); + REGISTER_BITS (status_bar_component); } diff --git a/gtk2_ardour/enums.h b/gtk2_ardour/enums.h index 92b2923894..e0e94c57d1 100644 --- a/gtk2_ardour/enums.h +++ b/gtk2_ardour/enums.h @@ -53,6 +53,15 @@ enum Height { HeightSmall }; +enum StatusBarComponent { + StatusWallClock = 0x1, + StatusDiskSpace = 0x2, + StatusCPULoad = 0x4, + StatusBufferLoad = 0x8, + StatusSampleRate = 0x10, + StatusFormat = 0x20 +}; + extern void setup_gtk_ardour_enums (); #endif /* __ardour_gtk_enums_h__ */ -- cgit v1.2.3