summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-12-23 14:41:54 +0100
committerRobin Gareus <robin@gareus.org>2015-12-23 14:41:54 +0100
commit7eddc61a3059ae0c54f0f18bfb518859eef72830 (patch)
treef307d342c705469b34c69cdfcebf5c24e549ee7d
parent9cddc7cda09997fd45bd6aae61be94f4337f617e (diff)
monitor section re-layout (processor-box in signal flow)
-rw-r--r--gtk2_ardour/dark.colors1
-rw-r--r--gtk2_ardour/monitor_section.cc132
-rw-r--r--gtk2_ardour/monitor_section.h11
3 files changed, 118 insertions, 26 deletions
diff --git a/gtk2_ardour/dark.colors b/gtk2_ardour/dark.colors
index 38137bb26d..da73afc342 100644
--- a/gtk2_ardour/dark.colors
+++ b/gtk2_ardour/dark.colors
@@ -258,6 +258,7 @@
<ColorAlias name="midi frame base" alias="color 87"/>
<ColorAlias name="midi input button: fill active" alias="color 48"/>
<ColorAlias name="monitor section button: fill active" alias="color 42"/>
+ <ColorAlias name="monitor processors toggle: fill active" alias="color 42"/>
<ColorAlias name="midi input button: led active" alias="color 4"/>
<ColorAlias name="midi meter color0" alias="color 52"/>
<ColorAlias name="midi meter color1" alias="color 53"/>
diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc
index de9e3719e4..d1047271dd 100644
--- a/gtk2_ardour/monitor_section.cc
+++ b/gtk2_ardour/monitor_section.cc
@@ -32,6 +32,7 @@
#include <gtkmm/menu.h>
#include <gtkmm/menuitem.h>
+#include "ardour/amp.h"
#include "ardour/audioengine.h"
#include "ardour/monitor_processor.h"
#include "ardour/port.h"
@@ -81,7 +82,9 @@ MonitorSection::MonitorSection (Session* s)
, pfl_button (_("PFL"), ArdourButton::led_default_elements)
, exclusive_solo_button (ArdourButton::led_default_elements)
, solo_mute_override_button (ArdourButton::led_default_elements)
+ , toggle_processorbox_button (ArdourButton::default_elements)
, _inhibit_solo_model_update (false)
+ , _ui_initialized (false)
{
using namespace Menu_Helpers;
@@ -180,6 +183,14 @@ MonitorSection::MonitorSection (Session* s)
solo_mute_override_button.set_related_action (act);
}
+ /* Processor Box hide/shos */
+ toggle_processorbox_button.set_text (_("Processors"));
+ toggle_processorbox_button.set_name (X_("monitor processors toggle"));
+ set_tooltip (&toggle_processorbox_button, _("Allow to add monitor effect processors"));
+
+ proctoggle = ToggleAction::create ();
+ toggle_processorbox_button.set_related_action (proctoggle);
+ proctoggle->signal_toggled().connect (sigc::mem_fun(*this, &MonitorSection::repack_processor_box), false);
/* Knobs */
Label* solo_boost_label;
@@ -254,7 +265,7 @@ MonitorSection::MonitorSection (Session* s)
// dim button
dim_all_button.set_text (_("Dim"));
dim_all_button.set_name ("monitor section dim");
- dim_all_button.set_size_request (-1, PX_SCALE(30));
+ dim_all_button.set_size_request (-1, PX_SCALE(25));
act = ActionManager::get_action (X_("Monitor"), X_("monitor-dim-all"));
if (act) {
dim_all_button.set_related_action (act);
@@ -263,7 +274,7 @@ MonitorSection::MonitorSection (Session* s)
// mono button
mono_button.set_text (_("Mono"));
mono_button.set_name ("monitor section mono");
- mono_button.set_size_request (-1, PX_SCALE(30));
+ mono_button.set_size_request (-1, PX_SCALE(25));
act = ActionManager::get_action (X_("Monitor"), X_("monitor-mono"));
if (act) {
mono_button.set_related_action (act);
@@ -347,6 +358,9 @@ MonitorSection::MonitorSection (Session* s)
HBox* tbx2 = manage (new HBox);
tbx2->pack_end (solo_mute_override_button, false, false);
+ HBox* tbx3 = manage (new HBox);
+ tbx3->pack_end (toggle_processorbox_button, false, false);
+
HBox* tbx0 = manage (new HBox); // space
// combined solo mode (Sip, AFL, PFL) & solo options
@@ -355,8 +369,9 @@ MonitorSection::MonitorSection (Session* s)
solo_tbl->attach (pfl_button, 0, 1, 1, 2, EXPAND|FILL, SHRINK, 0, 2);
solo_tbl->attach (afl_button, 0, 1, 2, 3, EXPAND|FILL, SHRINK, 0, 2);
solo_tbl->attach (*tbx0, 1, 2, 0, 3, EXPAND|FILL, SHRINK, 2, 2);
- solo_tbl->attach (*tbx1, 2, 3, 1, 2, EXPAND|FILL, SHRINK, 0, 2);
- solo_tbl->attach (*tbx2, 2, 3, 2, 3, EXPAND|FILL, SHRINK, 0, 2);
+ solo_tbl->attach (*tbx1, 2, 3, 0, 1, EXPAND|FILL, SHRINK, 0, 2);
+ solo_tbl->attach (*tbx2, 2, 3, 1, 2, EXPAND|FILL, SHRINK, 0, 2);
+ solo_tbl->attach (*tbx3, 2, 3, 2, 3, EXPAND|FILL, SHRINK, 0, 2);
// boost, cut, dim volume control
Table *level_tbl = manage (new Table);
@@ -391,17 +406,14 @@ MonitorSection::MonitorSection (Session* s)
spin_packer->pack_start (*gain_control, false, false);
spin_packer->pack_start (*gain_display, false, false);
- HBox* master_box = manage (new HBox);
- master_box->pack_start (*spin_packer, true, false);
+ master_packer.pack_start (*spin_packer, true, false);
- // combined gain section (channels, mute, dim, master)
+ // combined gain section (channels, mute, dim)
VBox* lower_packer = manage (new VBox);
- lower_packer->set_spacing (PX_SCALE(8));
- lower_packer->pack_start (channel_table_header, false, false);
- lower_packer->pack_start (channel_table_packer, false, false);
- lower_packer->pack_start (*mono_dim_box, false, false);
- lower_packer->pack_start (cut_all_button, false, false);
- lower_packer->pack_start (*master_box, false, false, PX_SCALE(10));
+ lower_packer->pack_start (channel_table_header, false, false, PX_SCALE(0));
+ lower_packer->pack_start (channel_table_packer, false, false, PX_SCALE(8));
+ lower_packer->pack_start (*mono_dim_box, false, false, PX_SCALE(2));
+ lower_packer->pack_start (cut_all_button, false, false, PX_SCALE(2));
// output port select
VBox* out_packer = manage (new VBox);
@@ -412,18 +424,18 @@ MonitorSection::MonitorSection (Session* s)
/****************************************************************************
* TOP LEVEL LAYOUT
*/
- VBox* vpacker = manage (new VBox);
- vpacker->set_border_width (PX_SCALE(3));
- vpacker->pack_start (*rude_box, false, false, PX_SCALE(3));
- vpacker->pack_start (rude_audition_button, false, false, 0);
- vpacker->pack_start (*solo_tbl, false, false, PX_SCALE(8));
- vpacker->pack_start (*level_tbl, false, false, PX_SCALE(8));
- vpacker->pack_start (*lower_packer, false, false, PX_SCALE(8));
- vpacker->pack_start (*insert_box, true, true, PX_SCALE(8));
- vpacker->pack_end (*out_packer, false, false, PX_SCALE(3));
+ vpacker.set_border_width (PX_SCALE(3));
+ vpacker.pack_start (*rude_box, false, false, PX_SCALE(3));
+ vpacker.pack_start (rude_audition_button, false, false, 0);
+ vpacker.pack_start (*solo_tbl, false, false, PX_SCALE(8));
+ vpacker.pack_start (*insert_box, true, true, PX_SCALE(8));
+ vpacker.pack_start (*level_tbl, false, false, PX_SCALE(8));
+ vpacker.pack_start (*lower_packer, false, false, PX_SCALE(8));
+ vpacker.pack_start (master_packer, false, false, PX_SCALE(10));
+ vpacker.pack_end (*out_packer, false, false, PX_SCALE(3));
hpacker.set_spacing (0);
- hpacker.pack_start (*vpacker, true, true);
+ hpacker.pack_start (vpacker, true, true);
gain_control->show_all ();
gain_display->show_all ();
@@ -434,7 +446,7 @@ MonitorSection::MonitorSection (Session* s)
mono_dim_box->show ();
spin_packer->show ();
- master_box->show ();
+ master_packer.show ();
channel_table.show ();
rude_box->show();
@@ -443,7 +455,7 @@ MonitorSection::MonitorSection (Session* s)
lower_packer->show ();
out_packer->show ();
- vpacker->show ();
+ vpacker.show ();
hpacker.show ();
populate_buttons ();
@@ -464,7 +476,9 @@ MonitorSection::MonitorSection (Session* s)
_tearoff->tearoff_window().set_title (X_("Monitor"));
_tearoff->tearoff_window().signal_key_press_event().connect (sigc::ptr_fun (forward_key_press), false);
- update_output_display();
+ update_output_display ();
+ repack_processor_box ();
+ _ui_initialized = true;
/* catch changes that affect us */
AudioEngine::instance()->PortConnectedOrDisconnected.connect (
@@ -497,6 +511,39 @@ MonitorSection::~MonitorSection ()
_output_selector = 0;
}
+
+void
+MonitorSection::repack_processor_box ()
+{
+ bool show_processor_box = proctoggle->get_active ();
+
+ if (count_processors () > 0) {
+ proctoggle->set_active (true);
+ proctoggle->set_sensitive (false);
+ show_processor_box = true;
+ } else {
+ proctoggle->set_sensitive (true);
+ }
+
+ if (insert_box->is_visible() == show_processor_box) {
+ return;
+ }
+
+ if (show_processor_box) {
+ if (master_packer.get_parent()) {
+ master_packer.get_parent()->remove (master_packer);
+ }
+ insert_box->show();
+ vpacker.pack_start (master_packer, false, false, PX_SCALE(10));
+ } else {
+ if (master_packer.get_parent()) {
+ master_packer.get_parent()->remove (master_packer);
+ }
+ insert_box->hide();
+ vpacker.pack_start (master_packer, true, false, PX_SCALE(10));
+ }
+}
+
void
MonitorSection::set_session (Session* s)
{
@@ -515,6 +562,10 @@ MonitorSection::set_session (Session* s)
boost::bind (&MonitorSection::update_output_display, this),
gui_context());
insert_box->set_route (_route);
+ _route->processors_changed.connect (*this, invalidator (*this), boost::bind (&MonitorSection::processors_changed, this, _1), gui_context());
+ if (_ui_initialized) {
+ repack_processor_box (); // too early
+ }
} else {
/* session with no monitor section */
_output_changed_connection.disconnect();
@@ -1542,3 +1593,32 @@ MonitorSection::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost:
update_output_display ();
}
}
+
+void
+MonitorSection::help_count_processors (boost::weak_ptr<Processor> p, uint32_t* cnt) const
+{
+ boost::shared_ptr<Processor> processor (p.lock ());
+ if (!processor || !processor->display_to_user()) {
+ return;
+ }
+ if (boost::dynamic_pointer_cast<Amp>(processor)) {
+ return;
+ }
+ ++(*cnt);
+}
+
+uint32_t
+MonitorSection::count_processors ()
+{
+ uint32_t processor_count = 0;
+ if (_route) {
+ _route->foreach_processor (sigc::bind (sigc::mem_fun (*this, &MonitorSection::help_count_processors), &processor_count));
+ }
+ return processor_count;
+}
+
+void
+MonitorSection::processors_changed (ARDOUR::RouteProcessorChange)
+{
+ repack_processor_box ();
+}
diff --git a/gtk2_ardour/monitor_section.h b/gtk2_ardour/monitor_section.h
index 5be07eabbf..bca55b7023 100644
--- a/gtk2_ardour/monitor_section.h
+++ b/gtk2_ardour/monitor_section.h
@@ -57,10 +57,12 @@ class MonitorSection : public RouteUI
private:
Gtk::HBox hpacker;
+ Gtk::VBox vpacker;
Gtkmm2ext::TearOff* _tearoff;
Gtk::HBox channel_table_packer;
Gtk::HBox table_hpacker;
+ Gtk::HBox master_packer;
Gtk::Table channel_table;
Gtk::Table channel_table_header;
Gtk::ScrolledWindow channel_table_scroller;
@@ -142,6 +144,7 @@ class MonitorSection : public RouteUI
ArdourButton rude_audition_button;
ArdourButton exclusive_solo_button;
ArdourButton solo_mute_override_button;
+ ArdourButton toggle_processorbox_button;
void do_blink (bool);
void solo_blink (bool);
@@ -163,7 +166,15 @@ class MonitorSection : public RouteUI
void port_connected_or_disconnected (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Port>);
+ void repack_processor_box ();
+
ProcessorBox* insert_box;
PluginSelector* _plugin_selector;
RouteProcessorSelection _rr_selection;
+ void help_count_processors (boost::weak_ptr<ARDOUR::Processor> p, uint32_t* cnt) const;
+ uint32_t count_processors ();
+
+ void processors_changed (ARDOUR::RouteProcessorChange);
+ Glib::RefPtr<Gtk::ToggleAction> proctoggle;
+ bool _ui_initialized;
};