extend filtering to VST + AU, tweak details, add filter-by-creator and by library
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 31 Jul 2007 16:03:53 +0000 (16:03 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 31 Jul 2007 16:03:53 +0000 (16:03 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2200 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/plugin_selector.cc
gtk2_ardour/plugin_selector.h
libs/ardour/ardour/plugin.h
libs/ardour/plugin_manager.cc

index e0f0be6e0cfa4ef9843ff67282a51b811c052017..6a2b334013bf278f192d61a66c94e0f87f0f5d14 100644 (file)
@@ -47,15 +47,16 @@ using namespace Gtk;
 using namespace std;
 
 static const char* _filter_mode_strings[] = {
-       N_("Plugin name"),
-       N_("Plugin type"),
-       N_("Plugin creator"),
+       N_("Name contains"),
+       N_("Type contains"),
+       N_("Author contains"),
+       N_("Library contains"),
        0
 };
 
 PluginSelector::PluginSelector (PluginManager *mgr)
        : ArdourDialog (_("ardour: plugins"), true, false),
-         filter_button (_("Clear"))
+         filter_button (Stock::CLEAR)
 {
        set_position (Gtk::WIN_POS_MOUSE);
        set_name ("PluginSelectorWindow");
@@ -81,7 +82,7 @@ PluginSelector::PluginSelector (PluginManager *mgr)
 
        amodel = Gtk::ListStore::create(acols);
        added_list.set_model (amodel);
-       added_list.append_column (_("Plugins to be Connected to Insert"), acols.text);
+       added_list.append_column (_("Plugins to be connected"), acols.text);
        added_list.set_headers_visible (true);
        added_list.set_reorderable (false);
 
@@ -170,7 +171,7 @@ PluginSelector::PluginSelector (PluginManager *mgr)
 
        table->attach(*btn_add, 1, 2, 6, 7, FILL, FILL, 5, 5);
        table->attach(*btn_remove, 3, 4, 6, 7, FILL, FILL, 5, 5);
-       table->attach(*btn_update, 5, 6, 7, 8, FILL, FILL, 5, 5);
+       table->attach(*btn_update, 5, 6, 6, 7, FILL, FILL, 5, 5);
 
        table->attach(ascroller, 0, 7, 8, 10);
 
@@ -288,6 +289,44 @@ PluginSelector::set_session (Session* s)
        }
 }
 
+bool
+PluginSelector::show_this_plugin (PluginInfoPtr& info, const std::string& filterstr)
+{
+       std::string compstr;
+       std::string mode = filter_mode.get_active_text ();
+
+       if (!filterstr.empty()) {
+               
+               if (mode == _("Name contains")) {
+                       compstr = info->name;
+               } else if (mode == _("Type contains")) {
+                       compstr = info->category;
+               } else if (mode == _("Author contains")) {
+                       compstr = info->creator;
+               } else if (mode == _("Library contains")) {
+                       compstr = info->path;
+               }
+               
+               transform (compstr.begin(), compstr.end(), compstr.begin(), ::toupper);
+
+               if (compstr.find (filterstr) != string::npos) {
+                       return true;
+               } else {
+                       return false;
+               }
+               
+       }
+
+       return true;
+}
+
+void
+PluginSelector::setup_filter_string (string& filterstr)
+{
+       filterstr = filter_entry.get_text ();
+       transform (filterstr.begin(), filterstr.end(), filterstr.begin(), ::toupper);
+}      
+
 void
 PluginSelector::ladspa_refiller ()
 {
@@ -298,44 +337,15 @@ PluginSelector::ladspa_refiller ()
 
        lmodel->clear();
        
-       string mode = filter_mode.get_active_text ();
-       std::string compstr;
-       std::string filterstr = filter_entry.get_text ();
-
-       transform (filterstr.begin(), filterstr.end(), filterstr.begin(), ::toupper);
-
-       // Insert into GTK list
+       std::string filterstr;
+       setup_filter_string (filterstr);
 
        for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) {
-               snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
-               snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);         
 
-               bool add;
-
-               add = false;
-
-               if (!filterstr.empty()) {
-               
-                       if (mode == _("Plugin name")) {
-                               compstr = (*i)->name;
-                       } else if (mode == _("Plugin type")) {
-                               compstr = (*i)->category;
-                       } else if (mode == _("Plugin creator")) {
-                               compstr == "foo";
-                       }
-                       
-                       transform (compstr.begin(), compstr.end(), compstr.begin(), ::toupper);
-
-                       if (compstr.find (filterstr) != string::npos) {
-                               add = true;
-                       }
-
-               } else {
-                       add = true;
-               }
-
-               if (add) {
+               if (show_this_plugin (*i, filterstr)) {
 
+                       snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
+                       snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);         
                        TreeModel::Row newrow = *(lmodel->append());
                        newrow[lcols.name] = (*i)->name.c_str();
                        newrow[lcols.type] = (*i)->category.c_str();
@@ -350,12 +360,6 @@ PluginSelector::ladspa_refiller ()
 
 #ifdef VST_SUPPORT
 
-void
-PluginSelector::_vst_refiller (void *arg)
-{
-       ((PluginSelector *) arg)->vst_refiller ();
-}
-
 void
 PluginSelector::vst_refiller ()
 {
@@ -365,17 +369,21 @@ PluginSelector::vst_refiller ()
        char ibuf[16], obuf[16];
        vmodel->clear();
        
-       // Insert into GTK list
+       std::string filterstr;
+       setup_filter_string (filterstr);
+       
        for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) {
 
-               snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
-               snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);         
-               
-               TreeModel::Row newrow = *(vmodel->append());
-               newrow[vcols.name] = (*i)->name.c_str();
-               newrow[vcols.ins] = ibuf;
-               newrow[vcols.outs] = obuf;
-               newrow[vcols.plugin] = *i;
+               if (show_this_plugin (*i, filterstr)) {
+                       snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
+                       snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);         
+                       
+                       TreeModel::Row newrow = *(vmodel->append());
+                       newrow[vcols.name] = (*i)->name.c_str();
+                       newrow[vcols.ins] = ibuf;
+                       newrow[vcols.outs] = obuf;
+                       newrow[vcols.plugin] = *i;
+               }
        }
        vmodel->set_sort_column (0, SORT_ASCENDING);
 }
@@ -396,12 +404,6 @@ PluginSelector::vst_display_selection_changed()
 
 #ifdef HAVE_AUDIOUNIT
 
-void
-PluginSelector::_au_refiller (void *arg)
-{
-       ((PluginSelector *) arg)->au_refiller ();
-}
-
 void
 PluginSelector::au_refiller ()
 {
@@ -411,18 +413,24 @@ PluginSelector::au_refiller ()
        char ibuf[16], obuf[16];
        aumodel->clear();
        
-       // Insert into GTK list
+       std::string filterstr;
+       setup_filter_string (filterstr);
+       
        for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) {
 
-               snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
-               snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);         
-               
-               TreeModel::Row newrow = *(aumodel->append());
-               newrow[aucols.name] = (*i)->name.c_str();
-               newrow[aucols.ins] = ibuf;
-               newrow[aucols.outs] = obuf;
-               newrow[aucols.plugin] = *i;
+               if (show_this_plugin (*i, filterstr)) {
+
+                       snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
+                       snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);         
+                       
+                       TreeModel::Row newrow = *(aumodel->append());
+                       newrow[aucols.name] = (*i)->name.c_str();
+                       newrow[aucols.ins] = ibuf;
+                       newrow[aucols.outs] = obuf;
+                       newrow[aucols.plugin] = *i;
+               }
        }
+
        aumodel->set_sort_column (0, SORT_ASCENDING);
 }
 
index 54b4b006a40fd0110c4bdabb166bbb7269b6befd..5994e7b3efc7f82979795d45469ea2fa6b57b286 100644 (file)
@@ -113,7 +113,6 @@ class PluginSelector : public ArdourDialog
        Glib::RefPtr<Gtk::ListStore> vmodel;
        Glib::RefPtr<Gtk::TreeSelection> vselection;
        Gtk::TreeView vst_display;
-       static void _vst_refiller (void *);
        void vst_refiller ();
        void vst_display_selection_changed();
 #endif // VST_SUPPORT
@@ -136,7 +135,6 @@ class PluginSelector : public ArdourDialog
        Glib::RefPtr<Gtk::ListStore> aumodel;
        Glib::RefPtr<Gtk::TreeSelection> auselection;
        Gtk::TreeView au_display;
-       static void _au_refiller (void *);
        void au_refiller ();
        void au_display_selection_changed();
 #endif //HAVE_AUDIOUNIT
@@ -156,6 +154,8 @@ class PluginSelector : public ArdourDialog
        void use_plugin (ARDOUR::PluginInfoPtr);
        void cleanup ();
        void refill ();
+       bool show_this_plugin (ARDOUR::PluginInfoPtr&, const std::string&);
+       void setup_filter_string (std::string&);
 
        void set_correct_focus();
 };
index c7708e3690df8e9ad076259cf332539b8b89e517..256549526e1cf662bbbb582f242490bc783e9aa5 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <boost/shared_ptr.hpp>
 #include <sigc++/signal.h>
+#include <glibmm/ustring.h>
 
 #include <pbd/statefuldestructible.h> 
 #include <pbd/controllable.h>
@@ -53,11 +54,13 @@ class PluginInfo {
        PluginInfo () { }
        PluginInfo (const PluginInfo &o)
                : name(o.name), n_inputs(o.n_inputs), n_outputs(o.n_outputs),
-               unique_id(o.unique_id), path (o.path), index(o.index) {}
+               path (o.path), unique_id(o.unique_id), index(o.index) {}
        virtual ~PluginInfo () { }
 
        string name;
        string category;
+       Glib::ustring creator;
+       Glib::ustring path;
        uint32_t n_inputs;
        uint32_t n_outputs;
        ARDOUR::PluginType type;
@@ -68,7 +71,6 @@ class PluginInfo {
 
   protected:
        friend class PluginManager;
-       string path;
        uint32_t index;
 };
 
index 5fa04c41f1c809cc6bd09a7c4a5bac4b9eb6bd29..bfb92cec2bb704117f127dec7df5f8948633980f 100644 (file)
@@ -248,6 +248,7 @@ PluginManager::ladspa_discover (string path)
                PluginInfoPtr info(new LadspaPluginInfo);
                info->name = descriptor->Name;
                info->category = get_ladspa_category(descriptor->UniqueID);
+               info->creator = descriptor->Maker;
                info->path = path;
                info->index = i;
                info->n_inputs = 0;
@@ -393,6 +394,7 @@ PluginManager::vst_discover (string path)
 
        info->category = "VST";
        info->path = path;
+       // need to set info->creator but FST doesn't provide it
        info->index = 0;
        info->n_inputs = finfo->numInputs;
        info->n_outputs = finfo->numOutputs;