summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/mixer_ui.cc86
-rw-r--r--gtk2_ardour/mixer_ui.h23
2 files changed, 108 insertions, 1 deletions
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index 7621a3a9cd..b86b7baadd 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -193,10 +193,31 @@ Mixer_UI::Mixer_UI ()
group_display_frame.set_shadow_type (Gtk::SHADOW_IN);
group_display_frame.add (group_display_vbox);
+ favorite_plugins_model = ListStore::create (favorite_plugins_columns);
+ favorite_plugins_display.set_model (favorite_plugins_model);
+ favorite_plugins_display.append_column (_("Favorite Plugins"), favorite_plugins_columns.name);
+ favorite_plugins_display.set_name ("EditGroupList");
+ favorite_plugins_display.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE); // XXX needs focus/keyboard
+ favorite_plugins_display.set_reorderable (false); // ?!
+ favorite_plugins_display.set_headers_visible (true);
+ favorite_plugins_display.set_rules_hint (true);
+ favorite_plugins_display.set_can_focus (false);
+ favorite_plugins_display.add_object_drag (favorite_plugins_columns.plugin.index(), "PluginInfoPtr");
+
+ favorite_plugins_scroller.add (favorite_plugins_display);
+ favorite_plugins_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+
+ favorite_plugins_frame.set_name ("BaseFrame");
+ favorite_plugins_frame.set_shadow_type (Gtk::SHADOW_IN);
+ favorite_plugins_frame.add (favorite_plugins_scroller);
+
rhs_pane1.pack1 (track_display_frame);
rhs_pane1.pack2 (group_display_frame);
- list_vpacker.pack_start (rhs_pane1, true, true);
+ rhs_pane2.pack1 (rhs_pane1);
+ rhs_pane2.pack2 (favorite_plugins_frame);
+
+ list_vpacker.pack_start (rhs_pane2, true, true);
global_hpacker.pack_start (scroller, true, true);
global_hpacker.pack_start (out_packer, false, false, 0);
@@ -206,6 +227,8 @@ Mixer_UI::Mixer_UI ()
rhs_pane1.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
static_cast<Gtk::Paned*> (&rhs_pane1)));
+ rhs_pane2.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
+ static_cast<Gtk::Paned*> (&rhs_pane2)));
list_hpane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
static_cast<Gtk::Paned*> (&list_hpane)));
@@ -237,19 +260,28 @@ Mixer_UI::Mixer_UI ()
group_display_button_label.show();
group_display_button.show();
group_display_scroller.show();
+ favorite_plugins_scroller.show();
group_display_vbox.show();
group_display_frame.show();
+ favorite_plugins_frame.show();
rhs_pane1.show();
+ rhs_pane2.show();
strip_packer.show();
out_packer.show();
list_hpane.show();
group_display.show();
+ favorite_plugins_display.show();
MixerStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::remove_strip, this, _1), gui_context());
#ifndef DEFER_PLUGIN_SELECTOR_LOAD
_plugin_selector = new PluginSelector (PluginManager::instance ());
+#else
+#error implement deferred Plugin-Favorite list
#endif
+ PluginManager::instance ().PluginListChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::refill_favorite_plugins, this), gui_context());
+ PluginManager::instance ().PluginStatusesChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::refill_favorite_plugins, this), gui_context());
+ refill_favorite_plugins();
}
Mixer_UI::~Mixer_UI ()
@@ -1722,6 +1754,8 @@ Mixer_UI::get_state (void)
snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&rhs_pane1)->gobj()));
geometry->add_property(X_("mixer_rhs_pane1_pos"), string(buf));
+ snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&rhs_pane2)->gobj()));
+ geometry->add_property(X_("mixer_rhs_pane2_pos"), string(buf));
snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&list_hpane)->gobj()));
geometry->add_property(X_("mixer_list_hpane_pos"), string(buf));
@@ -1780,6 +1814,21 @@ Mixer_UI::pane_allocation_handler (Allocation&, Gtk::Paned* which)
rhs_pane1.set_position (pos);
}
+ } else if (which == static_cast<Gtk::Paned*> (&rhs_pane2)) {
+ if (done[1]) {
+ return;
+ }
+
+ if (!geometry || (prop = geometry->property("mixer-rhs-pane2-pos")) == 0) {
+ pos = 2 * height / 3;
+ snprintf (buf, sizeof(buf), "%d", pos);
+ } else {
+ pos = atoi (prop->value());
+ }
+
+ if ((done[1] = GTK_WIDGET(rhs_pane2.gobj())->allocation.height > pos)) {
+ rhs_pane2.set_position (pos);
+ }
} else if (which == static_cast<Gtk::Paned*> (&list_hpane)) {
if (done[2]) {
@@ -2117,3 +2166,38 @@ Mixer_UI::monitor_section_detached ()
Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
act->set_sensitive (false);
}
+
+
+void
+Mixer_UI::refiller (PluginManager& manager, const PluginInfoList& plugs)
+{
+ for (PluginInfoList::const_iterator i = plugs.begin(); i != plugs.end(); ++i) {
+ if (manager.get_status (*i) != PluginManager::Favorite) {
+ continue;
+ }
+ TreeModel::Row newrow = *(favorite_plugins_model->append());
+ newrow[favorite_plugins_columns.name] = (*i)->name;
+ newrow[favorite_plugins_columns.plugin] = *i;
+ }
+}
+
+void
+Mixer_UI::refill_favorite_plugins ()
+{
+ PluginManager& mgr (PluginManager::instance());
+ favorite_plugins_model->clear ();
+
+#ifdef LV2_SUPPORT
+ refiller (mgr, mgr.lv2_plugin_info ());
+#endif
+#ifdef WINDOWS_VST_SUPPORT
+ refiller (mgr, mgr.windows_vst_plugin_info ());
+#endif
+#ifdef LXVST_SUPPORT
+ refiller (mgr, mgr.lxvst_plugin_info ());
+#endif
+#ifdef AUDIOUNIT_SUPPORT
+ refiller (mgr, mgr.au_plugin_info ());
+#endif
+ refiller (mgr, mgr.ladspa_plugin_info ());
+}
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index 68ea0ca2d9..7431c030b6 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -39,8 +39,12 @@
#include "ardour/ardour.h"
#include "ardour/types.h"
#include "ardour/session_handle.h"
+#include "ardour/plugin.h"
+#include "ardour/plugin_manager.h"
#include "gtkmm2ext/visibility_tracker.h"
+#include "gtkmm2ext/dndtreeview.h"
+#include "gtkmm2ext/treeutils.h"
#include "enums.h"
#include "mixer_actor.h"
@@ -115,10 +119,13 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
Gtk::Button group_display_button;
Gtk::ScrolledWindow track_display_scroller;
Gtk::ScrolledWindow group_display_scroller;
+ Gtk::ScrolledWindow favorite_plugins_scroller;
Gtk::VBox group_display_vbox;
Gtk::Frame track_display_frame;
Gtk::Frame group_display_frame;
+ Gtk::Frame favorite_plugins_frame;
Gtk::VPaned rhs_pane1;
+ Gtk::VPaned rhs_pane2;
Gtk::HBox strip_packer;
Gtk::HBox out_packer;
Gtk::HPaned list_hpane;
@@ -246,14 +253,27 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
Gtk::TreeModelColumn<ARDOUR::RouteGroup*> group;
};
+ struct PluginsDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
+ PluginsDisplayModelColumns() {
+ add (name);
+ add (plugin);
+ }
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<ARDOUR::PluginInfoPtr> plugin;
+ };
+
+
TrackDisplayModelColumns track_columns;
GroupDisplayModelColumns group_columns;
+ PluginsDisplayModelColumns favorite_plugins_columns;
Gtk::TreeView track_display;
Gtk::TreeView group_display;
+ Gtkmm2ext::DnDTreeView<ARDOUR::PluginInfoPtr> favorite_plugins_display;
Glib::RefPtr<Gtk::ListStore> track_model;
Glib::RefPtr<Gtk::ListStore> group_model;
+ Glib::RefPtr<Gtk::ListStore> favorite_plugins_model;
bool group_display_button_press (GdkEventButton*);
void group_display_selection_changed ();
@@ -297,6 +317,9 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
void monitor_section_attached ();
void monitor_section_detached ();
+ void refiller (ARDOUR::PluginManager& manager, const ARDOUR::PluginInfoList& plugs);
+ void refill_favorite_plugins ();
+
/// true if we are in fullscreen mode
bool _maximised;