summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/ardour.menus.in1
-rw-r--r--gtk2_ardour/generic_pluginui.cc15
-rw-r--r--gtk2_ardour/plugin_ui.cc73
-rw-r--r--gtk2_ardour/plugin_ui.h7
-rw-r--r--gtk2_ardour/processor_box.cc85
-rw-r--r--gtk2_ardour/processor_box.h5
-rw-r--r--libs/ardour/ardour/plugin_insert.h8
7 files changed, 127 insertions, 67 deletions
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in
index e6e4d1328f..5fad03a1c1 100644
--- a/gtk2_ardour/ardour.menus.in
+++ b/gtk2_ardour/ardour.menus.in
@@ -537,6 +537,7 @@
<menuitem action='ab_plugins'/>
<separator/>
<menuitem action='edit'/>
+ <menuitem action='controls'/>
</popup>
<popup name='ShuttleUnitPopup'>
diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc
index 3ed9352755..e7ba8d70bd 100644
--- a/gtk2_ardour/generic_pluginui.cc
+++ b/gtk2_ardour/generic_pluginui.cc
@@ -74,7 +74,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
set_border_width (10);
//set_homogeneous (false);
- pack_start (main_contents, false, false);
+ pack_start (main_contents, true, true);
settings_box.set_homogeneous (false);
HBox* constraint_hbox = manage (new HBox);
@@ -99,7 +99,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
VBox* v1_box = manage (new VBox);
VBox* v2_box = manage (new VBox);
- pack_end (plugin_analysis_expander, true, true);
+ pack_end (plugin_analysis_expander, false, false);
v1_box->pack_start (*smaller_hbox, false, true);
v2_box->pack_start (focus_button, false, true);
@@ -111,7 +111,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
main_contents.pack_start (*constraint_hbox, false, false);
- if ( is_scrollable ) {
+ if (is_scrollable ) {
scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
scroller.set_name ("PluginEditor");
scroller_view.set_name("PluginEditor");
@@ -120,8 +120,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
main_contents.pack_start (scroller, true, true);
- }
- else {
+ } else {
main_contents.pack_start (hpacker, false, false);
}
@@ -216,7 +215,7 @@ GenericPluginUI::build ()
box->set_spacing (1);
frame->add (*box);
- hpacker.pack_start(*frame,true,true);
+ hpacker.pack_start(*frame, true, true);
x = 1;
}
@@ -650,7 +649,7 @@ GenericPluginUI::update_control_display (ControlUI* cui)
cui->ignore_change++;
- if (cui->combo) {
+ if (cui->combo && cui->combo_map) {
std::map<string,float>::iterator it;
for (it = cui->combo_map->begin(); it != cui->combo_map->end(); ++it) {
if (it->second == val) {
@@ -694,7 +693,7 @@ GenericPluginUI::control_port_toggled (ControlUI* cui)
void
GenericPluginUI::control_combo_changed (ControlUI* cui)
{
- if (!cui->ignore_change) {
+ if (!cui->ignore_change && cui->combo_map) {
string value = cui->combo->get_active_text();
std::map<string,float> mapping = *cui->combo_map;
insert->automation_control(cui->parameter())->set_value(mapping[value]);
diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc
index 76764f8a5c..1e54344a83 100644
--- a/gtk2_ardour/plugin_ui.cc
+++ b/gtk2_ardour/plugin_ui.cc
@@ -77,17 +77,23 @@ using namespace PBD;
using namespace Gtkmm2ext;
using namespace Gtk;
-PluginUIWindow::PluginUIWindow (Gtk::Window* win, boost::shared_ptr<PluginInsert> insert, bool scrollable)
+PluginUIWindow::PluginUIWindow (
+ Gtk::Window* win,
+ boost::shared_ptr<PluginInsert> insert,
+ bool scrollable,
+ bool editor)
: parent (win)
- , was_visible (false)
- , _keyboard_focused (false)
+ , was_visible (false)
+ , _keyboard_focused (false)
{
bool have_gui = false;
Label* label = manage (new Label());
label->set_markup ("<b>THIS IS THE PLUGIN UI</b>");
- if (insert->plugin()->has_editor()) {
+ std::cout << "SHOW UI " << insert->plugin()->unique_id()
+ << " editor: " << editor << std::endl;
+ if (editor && insert->plugin()->has_editor()) {
switch (insert->type()) {
case ARDOUR::VST:
have_gui = create_vst_editor (insert);
@@ -119,8 +125,7 @@ PluginUIWindow::PluginUIWindow (Gtk::Window* win, boost::shared_ptr<PluginInsert
}
if (!have_gui) {
-
- GenericPluginUI* pu = new GenericPluginUI (insert, scrollable);
+ GenericPluginUI* pu = new GenericPluginUI (insert, scrollable);
_pluginui = pu;
_pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
@@ -281,7 +286,7 @@ PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PluginInsert>)
#else
VBox* box;
_pluginui = create_au_gui (insert, &box);
- _pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
+ _pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
add (*box);
Application::instance()->ActivationChanged.connect (mem_fun (*this, &PluginUIWindow::app_activated));
@@ -347,32 +352,32 @@ PluginUIWindow::on_key_press_event (GdkEventKey* event)
{
if (_keyboard_focused) {
if (_pluginui) {
- if (_pluginui->non_gtk_gui()) {
- _pluginui->forward_key_event (event);
- } else {
- return relay_key_press (event, this);
- }
+ if (_pluginui->non_gtk_gui()) {
+ _pluginui->forward_key_event (event);
+ } else {
+ return relay_key_press (event, this);
+ }
}
return true;
} else {
- /* for us to be getting key press events, there really
- MUST be a _pluginui, but just to be safe, check ...
- */
-
- if (_pluginui) {
- if (_pluginui->non_gtk_gui()) {
- /* pass editor window as the window for the event
- to be handled in, not this one, because there are
- no widgets in this window that we want to have
- key focus.
- */
- return relay_key_press (event, &PublicEditor::instance());
- } else {
- return relay_key_press (event, this);
- }
- } else {
- return false;
- }
+ /* for us to be getting key press events, there really
+ MUST be a _pluginui, but just to be safe, check ...
+ */
+
+ if (_pluginui) {
+ if (_pluginui->non_gtk_gui()) {
+ /* pass editor window as the window for the event
+ to be handled in, not this one, because there are
+ no widgets in this window that we want to have
+ key focus.
+ */
+ return relay_key_press (event, &PublicEditor::instance());
+ } else {
+ return relay_key_press (event, this);
+ }
+ } else {
+ return false;
+ }
}
}
@@ -381,10 +386,10 @@ PluginUIWindow::on_key_release_event (GdkEventKey *event)
{
if (_keyboard_focused) {
if (_pluginui) {
- if (_pluginui->non_gtk_gui()) {
- _pluginui->forward_key_event (event);
- }
- return true;
+ if (_pluginui->non_gtk_gui()) {
+ _pluginui->forward_key_event (event);
+ }
+ return true;
}
return false;
} else {
diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h
index 3176e4a14d..743234f16a 100644
--- a/gtk2_ardour/plugin_ui.h
+++ b/gtk2_ardour/plugin_ui.h
@@ -211,7 +211,7 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
/* input */
- Gtk::ComboBoxText* combo;
+ Gtk::ComboBoxText* combo;
std::map<std::string, float>* combo_map;
Gtk::ToggleButton* button;
boost::shared_ptr<AutomationController> controller;
@@ -261,7 +261,10 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
class PluginUIWindow : public Gtk::Window
{
public:
- PluginUIWindow (Gtk::Window*, boost::shared_ptr<ARDOUR::PluginInsert> insert, bool scrollable=false);
+ PluginUIWindow (Gtk::Window*,
+ boost::shared_ptr<ARDOUR::PluginInsert> insert,
+ bool scrollable=false,
+ bool editor=true);
~PluginUIWindow ();
PlugUIBase& pluginui() { return *_pluginui; }
diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc
index ff1c05e18a..7ae9ddf16f 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -92,6 +92,7 @@ RefPtr<Action> ProcessorBox::paste_action;
RefPtr<Action> ProcessorBox::cut_action;
RefPtr<Action> ProcessorBox::rename_action;
RefPtr<Action> ProcessorBox::edit_action;
+RefPtr<Action> ProcessorBox::controls_action;
Glib::RefPtr<Gdk::Pixbuf> SendProcessorEntry::_slider;
ProcessorEntry::ProcessorEntry (boost::shared_ptr<Processor> p, Width w)
@@ -883,14 +884,24 @@ ProcessorBox::build_processor_menu ()
void
ProcessorBox::selection_changed ()
{
- bool const sensitive = (processor_display.selection().empty()) ? false : true;
- ActionManager::set_sensitive (ActionManager::plugin_selection_sensitive_actions, sensitive);
- edit_action->set_sensitive (one_processor_can_be_edited ());
+ const bool sensitive = !processor_display.selection().empty();
+ ActionManager::set_sensitive(ActionManager::plugin_selection_sensitive_actions,
+ sensitive);
+ edit_action->set_sensitive(one_processor_can_be_edited());
+
+ const bool single_selection = (processor_display.selection().size() == 1);
+
+ boost::shared_ptr<PluginInsert> pi;
+ if (single_selection) {
+ pi = boost::dynamic_pointer_cast<PluginInsert>(
+ processor_display.selection().front()->processor());
+ }
+
+ /* enable gui for plugin inserts with editors */
+ controls_action->set_sensitive(pi && pi->plugin()->has_editor());
/* disallow rename for multiple selections and for plugin inserts */
- rename_action->set_sensitive (
- processor_display.selection().size() == 1 && boost::dynamic_pointer_cast<PluginInsert> (processor_display.selection().front()->processor()) == 0
- );
+ rename_action->set_sensitive(single_selection && pi);
}
void
@@ -1838,10 +1849,10 @@ ProcessorBox::toggle_edit_processor (boost::shared_ptr<Processor> processor)
} else if ((retrn = boost::dynamic_pointer_cast<Return> (processor)) != 0) {
- if (boost::dynamic_pointer_cast<InternalReturn> (retrn)) {
- /* no GUI for these */
- return;
- }
+ if (boost::dynamic_pointer_cast<InternalReturn> (retrn)) {
+ /* no GUI for these */
+ return;
+ }
if (!_session->engine().connected()) {
return;
@@ -1922,6 +1933,28 @@ ProcessorBox::toggle_edit_processor (boost::shared_ptr<Processor> processor)
}
void
+ProcessorBox::toggle_processor_controls (boost::shared_ptr<Processor> processor)
+{
+ boost::shared_ptr<PluginInsert> plugin_insert
+ = boost::dynamic_pointer_cast<PluginInsert>(processor);
+ if (!plugin_insert) {
+ return;
+ }
+
+ Container* toplevel = get_toplevel();
+ Window* win = dynamic_cast<Gtk::Window*>(toplevel);
+ PluginUIWindow* plugin_ui = new PluginUIWindow(win, plugin_insert, true, false);
+ plugin_ui->set_title(generate_processor_title (plugin_insert));
+
+ if (plugin_ui->is_visible()) {
+ plugin_ui->hide();
+ } else {
+ plugin_ui->show_all();
+ plugin_ui->present();
+ }
+}
+
+void
ProcessorBox::register_actions ()
{
Glib::RefPtr<Gtk::ActionGroup> popup_act_grp = Gtk::ActionGroup::create(X_("ProcessorMenu"));
@@ -1971,15 +2004,21 @@ ProcessorBox::register_actions ()
/* activation etc. */
ActionManager::register_action (popup_act_grp, X_("activate_all"), _("Activate all"),
- sigc::ptr_fun (ProcessorBox::rb_activate_all));
+ sigc::ptr_fun (ProcessorBox::rb_activate_all));
ActionManager::register_action (popup_act_grp, X_("deactivate_all"), _("Deactivate all"),
- sigc::ptr_fun (ProcessorBox::rb_deactivate_all));
+ sigc::ptr_fun (ProcessorBox::rb_deactivate_all));
ActionManager::register_action (popup_act_grp, X_("ab_plugins"), _("A/B Plugins"),
- sigc::ptr_fun (ProcessorBox::rb_ab_plugins));
+ sigc::ptr_fun (ProcessorBox::rb_ab_plugins));
/* show editors */
- edit_action = ActionManager::register_action (popup_act_grp, X_("edit"), _("Edit..."),
- sigc::ptr_fun (ProcessorBox::rb_edit));
+ edit_action = ActionManager::register_action (
+ popup_act_grp, X_("edit"), _("Edit..."),
+ sigc::ptr_fun (ProcessorBox::rb_edit));
+
+ /* show plugin GUI */
+ controls_action = ActionManager::register_action (
+ popup_act_grp, X_("controls"), _("Controls..."),
+ sigc::ptr_fun (ProcessorBox::rb_controls));
ActionManager::add_action_group (popup_act_grp);
}
@@ -2161,6 +2200,16 @@ ProcessorBox::rb_edit ()
}
void
+ProcessorBox::rb_controls ()
+{
+ if (_current_processor_box == 0) {
+ return;
+ }
+
+ _current_processor_box->for_selected_processors (&ProcessorBox::toggle_processor_controls);
+}
+
+void
ProcessorBox::route_property_changed (const PropertyChange& what_changed)
{
if (!what_changed.contains (ARDOUR::Properties::name)) {
@@ -2255,9 +2304,9 @@ void
ProcessorBox::set_processor_ui (boost::shared_ptr<Processor> p, Gtk::Window* w)
{
list<ProcessorWindowProxy*>::iterator i = _processor_window_proxies.begin ();
-
- p->set_ui (w);
-
+
+ p->set_ui (w);
+
while (i != _processor_window_proxies.end()) {
boost::shared_ptr<Processor> t = (*i)->processor().lock ();
if (t && t == p) {
diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h
index bd5f18b947..559945e0fe 100644
--- a/gtk2_ardour/processor_box.h
+++ b/gtk2_ardour/processor_box.h
@@ -215,6 +215,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
Gtk::Window* get_processor_ui (boost::shared_ptr<ARDOUR::Processor>) const;
void toggle_edit_processor (boost::shared_ptr<ARDOUR::Processor>);
+ void toggle_processor_controls (boost::shared_ptr<ARDOUR::Processor>);
sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorSelected;
sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorUnselected;
@@ -313,12 +314,13 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
void for_selected_processors (void (ProcessorBox::*pmf)(boost::shared_ptr<ARDOUR::Processor>));
void get_selected_processors (ProcSelection&) const;
- bool can_cut() const;
+ bool can_cut() const;
static Glib::RefPtr<Gtk::Action> cut_action;
static Glib::RefPtr<Gtk::Action> paste_action;
static Glib::RefPtr<Gtk::Action> rename_action;
static Glib::RefPtr<Gtk::Action> edit_action;
+ static Glib::RefPtr<Gtk::Action> controls_action;
void paste_processor_state (const XMLNodeList&, boost::shared_ptr<ARDOUR::Processor>);
void activate_processor (boost::shared_ptr<ARDOUR::Processor>);
@@ -353,6 +355,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
static void rb_deactivate_all ();
static void rb_ab_plugins ();
static void rb_edit ();
+ static void rb_controls ();
void route_property_changed (const PBD::PropertyChange&);
std::string generate_processor_title (boost::shared_ptr<ARDOUR::PluginInsert> pi);
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index a0e2e19a13..feab43bac7 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -57,7 +57,7 @@ class PluginInsert : public Processor
void activate ();
void deactivate ();
- void flush ();
+ void flush ();
int set_block_size (pframes_t nframes);
@@ -83,13 +83,13 @@ class PluginInsert : public Processor
void set_value (double val);
double get_value (void) const;
- XMLNode& get_state();
+ XMLNode& get_state();
double user_to_ui (double) const;
double ui_to_user (double) const;
double plugin_to_ui (double) const;
double plugin_to_user (double) const;
-
+
private:
double user_to_plugin (double) const;
@@ -158,7 +158,7 @@ class PluginInsert : public Processor
void set_automatable ();
void control_list_automation_state_changed (Evoral::Parameter, AutoState);
void set_parameter_state_2X (const XMLNode& node, int version);
- void set_control_ids (const XMLNode&, int version);
+ void set_control_ids (const XMLNode&, int version);
int32_t count_for_configuration (ChanCount in, ChanCount out) const;