diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 60827d3c37..0edc858e91 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -689,9 +689,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void add_routes (ARDOUR::RouteList&); void timeaxisview_deleted (TimeAxisView *); - void master_meter_clicked (); - - Gtk::Container& inspector_home; + Gtk::Container& inspector_home; Gtk::Container& _master_bus_ui_home; MasterBusUI* _master_bus_ui; Gtk::VBox& vpacker; diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index ecf9d9e735..103ce17d5a 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -211,28 +211,11 @@ Editor::create_editor_mixer () } if (!_master_bus_ui) { - _master_bus_ui = new MasterBusUI (_session); + _master_bus_ui = new MasterBusUI (_session, *this); _master_bus_ui_home.add (*_master_bus_ui); } else { _master_bus_ui->init(_session); } - - _master_bus_ui->MasterMeterClicked.connect(*this, invalidator (*this), boost::bind (&Editor::master_meter_clicked, this), gui_context() ); -} - -void -Editor::master_meter_clicked () -{ - if (!_session) { - return; - } - - TimeAxisView* tv = axis_view_from_route (_session->master_out() ); - if (tv) { - TrackViewList selected; - selected.push_back(tv); - get_selection().set(selected); - } } void diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 036b3e91c3..5824af29af 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -943,7 +943,10 @@ void Editor::track_selection_changed () { if (!selection->tracks.empty() ) { - + set_selected_mixer_strip (*(selection->tracks.front())); + // the commented out implementation shows master bus in the inspector + // when master track is selected. Requirements chenged for this case + /* bool master_bus_set = false; TimeAxisView* tv = selection->tracks.front(); RouteTimeAxisView* rtv = dynamic_cast (tv); @@ -960,9 +963,10 @@ Editor::track_selection_changed () if (!master_bus_set) { set_selected_mixer_strip(*tv); - } + }*/ } else { + // set master bus visible if it's available RouteTimeAxisView* rtv = 0; bool set_master_bus = false; diff --git a/gtk2_ardour/icons/master_mute.png b/gtk2_ardour/icons/master_mute.png index c7c868283d..16bd09a37b 100644 Binary files a/gtk2_ardour/icons/master_mute.png and b/gtk2_ardour/icons/master_mute.png differ diff --git a/gtk2_ardour/icons/master_mute_active.png b/gtk2_ardour/icons/master_mute_active.png index da71b7de15..7c2ae0c1f6 100644 Binary files a/gtk2_ardour/icons/master_mute_active.png and b/gtk2_ardour/icons/master_mute_active.png differ diff --git a/gtk2_ardour/icons/master_mute_prelight.png b/gtk2_ardour/icons/master_mute_prelight.png index 7e0a874f1a..30d6a73028 100644 Binary files a/gtk2_ardour/icons/master_mute_prelight.png and b/gtk2_ardour/icons/master_mute_prelight.png differ diff --git a/gtk2_ardour/master_bus_ui.cc b/gtk2_ardour/master_bus_ui.cc index f5050c93e8..6a140e1466 100644 --- a/gtk2_ardour/master_bus_ui.cc +++ b/gtk2_ardour/master_bus_ui.cc @@ -94,7 +94,7 @@ using namespace ArdourMeter; int MasterBusUI::__meter_width = 6; PBD::Signal1 MasterBusUI::CatchDeletion; -MasterBusUI::MasterBusUI (Session* sess) +MasterBusUI::MasterBusUI (Session* sess, PublicEditor& ed) : WavesUI ("master_ui.xml", *this) , _max_peak (minus_infinity()) , _peak_treshold (xml_property(*xml_tree()->root(), "peaktreshold", -144.4)) // Think about having it in config @@ -106,6 +106,9 @@ MasterBusUI::MasterBusUI (Session* sess) , _global_rec_button (get_waves_button ("global_rec_button")) , _no_peak_display_box (get_event_box("no_peak_display_box") ) , _master_bus_multi_out_mode_icon (get_image("master_bus_multi_out_mode_icon")) + , _master_event_box (WavesUI::root () ) + , _selected(false) + , _editor(ed) { set_attributes (*this, *xml_tree ()->root (), XMLNodeMap ()); _level_meter_home.pack_start (_level_meter, true, true); @@ -113,7 +116,10 @@ MasterBusUI::MasterBusUI (Session* sess) _master_mute_button.unset_flags (Gtk::CAN_FOCUS); _clear_solo_button.unset_flags (Gtk::CAN_FOCUS); _global_rec_button.unset_flags (Gtk::CAN_FOCUS); - + _master_event_box.set_flags (CAN_FOCUS); + + _master_event_box.add_events (Gdk::BUTTON_RELEASE_MASK); + ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &MasterBusUI::reset_peak_display)); ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &MasterBusUI::reset_route_peak_display)); ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &MasterBusUI::reset_group_peak_display)); @@ -122,10 +128,13 @@ MasterBusUI::MasterBusUI (Session* sess) _master_mute_button.signal_clicked.connect (sigc::mem_fun (*this, &MasterBusUI::on_master_mute_button)); _clear_solo_button.signal_clicked.connect (sigc::mem_fun (*this, &MasterBusUI::on_clear_solo_button)); _global_rec_button.signal_clicked.connect (sigc::mem_fun (*this, &MasterBusUI::on_global_rec_button)); + _master_event_box.signal_button_press_event().connect (sigc::mem_fun (*this, &MasterBusUI::on_master_event_box_button_release)); + + _editor.get_selection().TracksChanged.connect (sigc::mem_fun(*this, &MasterBusUI::update_master_bus_selection)); EngineStateController::instance()->OutputConnectionModeChanged.connect (_mode_connection, MISSING_INVALIDATOR, - boost::bind (&MasterBusUI::on_output_connection_mode_changed, this), + boost::bind (&MasterBusUI::update_master_bus_selection, this), gui_context ()); init(sess); } @@ -141,17 +150,21 @@ void MasterBusUI::init(ARDOUR::Session *session) // connect existing tracks to MASTER connect_route_state_signals( *(session->get_tracks().get()) ); + if (!_level_meter.get_parent () ) { + _level_meter_home.pack_start (_level_meter); + } + on_output_connection_mode_changed(); update_master(); - ARDOUR_UI::Blink.connect (sigc::mem_fun (*this, &MasterBusUI::solo_blink)); + //ARDOUR_UI::Blink.connect (sigc::mem_fun (*this, &MasterBusUI::solo_blink)); _level_meter.set_session(session); - _level_meter.ButtonPress.connect_same_thread (_session_connections, boost::bind (&MasterBusUI::on_level_meter_button_press, this, _1) ); } void MasterBusUI::on_output_connection_mode_changed() { + /* if (Config->get_output_auto_connect() & AutoConnectPhysical) { if (_peak_display_button.get_parent ()) { get_box ("peak_display_button_home").remove (_peak_display_button); @@ -184,18 +197,61 @@ void MasterBusUI::on_output_connection_mode_changed() if (!_level_meter.get_parent ()) { _level_meter_home.pack_start (_level_meter); } - } + } */ // update MASTER MUTE route_mute_state_changed(NULL); } -bool -MasterBusUI::on_level_meter_button_press (GdkEventButton *ev) +void +MasterBusUI::update_master_bus_selection () { - // EMIT SIGNAL - MasterMeterClicked (); + TimeAxisView* tv = _editor.axis_view_from_route (_route ); + if (tv && _editor.get_selection().selected(tv) ) { + _selected = true; + } else { + _selected = false; + } + + + if (_selected) { + _master_event_box.set_state (Gtk::STATE_ACTIVE); + } else { + _master_event_box.set_state (Gtk::STATE_NORMAL); + } +} + +bool +MasterBusUI::on_master_event_box_button_release (GdkEventButton *ev) +{ + if (ev->button == 1) { + + switch (ArdourKeyboard::selection_type (ev->state)) { + case Selection::Toggle: + if (_selected) { + TimeAxisView* tv = _editor.axis_view_from_route (_route ); + if (tv) { + _editor.set_selected_track(*tv, Selection::Toggle); + } + _selected = false; + break; + } /*else - just fall down*/ + + case Selection::Set: + if (!_selected) { + TimeAxisView* tv = _editor.axis_view_from_route (_route ); + if (tv) { + _editor.set_selected_track(*tv); + } + _selected = true; + break; + + } + } + } + + update_master_bus_selection(); return true; } diff --git a/gtk2_ardour/master_bus_ui.h b/gtk2_ardour/master_bus_ui.h index 2d588ccf33..268750a509 100644 --- a/gtk2_ardour/master_bus_ui.h +++ b/gtk2_ardour/master_bus_ui.h @@ -46,15 +46,14 @@ class MasterBusUI : public Gtk::EventBox, public WavesUI { public: - MasterBusUI (ARDOUR::Session*); + MasterBusUI (ARDOUR::Session*, PublicEditor&); void init(ARDOUR::Session* session); virtual ~MasterBusUI (); void fast_update (); void set_route (boost::shared_ptr); + void update_master_bus_selection(); static PBD::Signal1 CatchDeletion; - - PBD::Signal0 MasterMeterClicked; private: static int __meter_width; @@ -72,6 +71,7 @@ private: void on_global_rec_button (WavesButton*); void on_output_connection_mode_changed (); bool on_level_meter_button_press (GdkEventButton*); + bool on_master_event_box_button_release (GdkEventButton*); PBD::ScopedConnection _route_meter_connection; @@ -105,6 +105,11 @@ private: WavesButton& _global_rec_button; Gtk::EventBox& _no_peak_display_box; Gtk::Image& _master_bus_multi_out_mode_icon; + Gtk::Container& _master_event_box; + + PublicEditor& _editor; + + bool _selected; }; #endif /* __tracks_master_bus_ui_h__ */ diff --git a/gtk2_ardour/ui/master_ui.xml b/gtk2_ardour/ui/master_ui.xml index 0e2d685e8f..7943b3863c 100644 --- a/gtk2_ardour/ui/master_ui.xml +++ b/gtk2_ardour/ui/master_ui.xml @@ -1,15 +1,16 @@ + bgnormal="#B1B1B1" + ui.orphan="true"/>