redesign plugin selection process to fix multiple-addition problem
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 29 May 2008 12:32:14 +0000 (12:32 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 29 May 2008 12:32:14 +0000 (12:32 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3420 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/plugin_selector.cc
gtk2_ardour/plugin_selector.h
gtk2_ardour/redirect_box.cc
gtk2_ardour/redirect_box.h

index b17d9c6079b4d7dccdb3d41aa474a053d8169b25..09b3a324083d7d30480ff998fdc7a65e56389902 100644 (file)
@@ -327,18 +327,14 @@ PluginSelector::au_refiller (const std::string& filterstr)
 #endif
 }
 
-void
-PluginSelector::use_plugin (PluginInfoPtr pi)
+PluginPtr
+PluginSelector::load_plugin (PluginInfoPtr pi)
 {
        if (session == 0) {
-               return;
+               return PluginPtr();
        }
 
-       PluginPtr plugin = pi->load (*session);
-
-       if (plugin) {
-               PluginCreated (plugin);
-       }
+       return pi->load (*session);
 }
 
 void
@@ -404,6 +400,7 @@ PluginSelector::run ()
 {
        ResponseType r;
        TreeModel::Children::iterator i;
+       SelectedPlugins plugins;
 
        r = (ResponseType) Dialog::run ();
 
@@ -411,24 +408,26 @@ PluginSelector::run ()
        case RESPONSE_APPLY:
                for (i = amodel->children().begin(); i != amodel->children().end(); ++i) {
                        PluginInfoPtr pp = (*i)[acols.plugin];
-                       use_plugin (pp);
+                       PluginPtr p = load_plugin (pp);
+                       if (p) {
+                               plugins.push_back (p);
+                       }
+               }
+               if (interested_object && !plugins.empty()) {
+                       interested_object->use_plugins (plugins);
                }
+               
                break;
 
        default:
                break;
        }
 
-       cleanup ();
-
-       return (int) r;
-}
-
-void
-PluginSelector::cleanup ()
-{
        hide();
        amodel->clear();
+       interested_object = 0;
+
+       return (int) r;
 }
 
 void
@@ -551,7 +550,15 @@ PluginSelector::plugin_menu()
 void
 PluginSelector::plugin_chosen_from_menu (const PluginInfoPtr& pi)
 {
-       use_plugin (pi);
+       PluginPtr p = load_plugin (pi);
+
+       if (p && interested_object) {
+               SelectedPlugins plugins;
+               plugins.push_back (p);
+               interested_object->use_plugins (plugins);
+       }
+
+       interested_object = 0;
 }
 
 void 
@@ -596,3 +603,9 @@ PluginSelector::show_manager ()
        show_all();
        run ();
 }
+
+void
+PluginSelector::set_interested_object (PluginInterestedObject& obj)
+{
+       interested_object = &obj;
+}
index 77d8c462a6552ac08bd4cae8698b88872aace74e..c2f657679fea90a0f9d6c8c8851b2d80af05ed9b 100644 (file)
@@ -26,6 +26,7 @@
 #include <gtkmm2ext/selector.h>
 
 #include <ardour/plugin.h>
+#include "plugin_interest.h"
 
 namespace ARDOUR {
        class Session;
@@ -36,8 +37,9 @@ class PluginSelector : public ArdourDialog
 {
   public:
        PluginSelector (ARDOUR::PluginManager *);
-       sigc::signal<void,boost::shared_ptr<ARDOUR::Plugin> > PluginCreated;
 
+       void set_interested_object (PluginInterestedObject&);
+       
        int run (); // XXX should we try not to overload the non-virtual Gtk::Dialog::run() ?
 
        void set_session (ARDOUR::Session*);
@@ -46,8 +48,10 @@ class PluginSelector : public ArdourDialog
        Gtk::Menu& plugin_menu ();
 
   private:
+       PluginInterestedObject* interested_object;
+
        ARDOUR::Session* session;
-       Gtk::ScrolledWindow scroller;  // Available plugins
+       Gtk::ScrolledWindow scroller;   // Available plugins
        Gtk::ScrolledWindow ascroller;  // Added plugins
 
        Gtk::ComboBoxText filter_mode;
@@ -112,8 +116,7 @@ class PluginSelector : public ArdourDialog
        void added_list_selection_changed();
        void display_selection_changed();
        void btn_apply_clicked();
-       void use_plugin (ARDOUR::PluginInfoPtr);
-       void cleanup ();
+       ARDOUR::PluginPtr load_plugin (ARDOUR::PluginInfoPtr);
        bool show_this_plugin (const ARDOUR::PluginInfoPtr&, const std::string&);
        void setup_filter_string (std::string&);
 
index c2ffaf0e0c02405734ef897bba97a7fa551d3af3..e99d74e2f037d1513026c3743e3d19ad3dab388b 100644 (file)
@@ -147,10 +147,6 @@ RedirectBox::RedirectBox (Placement pcmnt, Session& sess, boost::shared_ptr<Rout
        redirect_display.signal_button_press_event().connect (mem_fun(*this, &RedirectBox::redirect_button_press_event), false);
        redirect_display.signal_button_release_event().connect (mem_fun(*this, &RedirectBox::redirect_button_release_event));
 
-       using_plugin_selector = false;
-       _plugin_selector.signal_hide().connect (mem_fun (*this, &RedirectBox::plugin_selector_hidden));
-       _plugin_selector.signal_show().connect (mem_fun (*this, &RedirectBox::plugin_selector_shown));
-
        /* start off as a passthru strip. we'll correct this, if necessary,
           in update_diskstream_display().
        */
@@ -395,33 +391,28 @@ RedirectBox::deselect_all_redirects ()
 void
 RedirectBox::choose_plugin ()
 {
-       newplug_connection = _plugin_selector.PluginCreated.connect (mem_fun(*this,&RedirectBox::insert_plugin_chosen));
-       // Gtk::Menu& m = _plugin_selector.plugin_menu();
-       // m.popup (1, 0);
+       _plugin_selector.set_interested_object (*this);
 }
 
 void
-RedirectBox::insert_plugin_chosen (boost::shared_ptr<Plugin> plugin)
+RedirectBox::use_plugins (const SelectedPlugins& plugins)
 {
-       if (plugin) {
+       for (SelectedPlugins::const_iterator p = plugins.begin(); p != plugins.end(); ++p) {
 
-               boost::shared_ptr<Redirect> redirect (new PluginInsert (_session, plugin, _placement));
-               
-               uint32_t err_streams;
+               boost::shared_ptr<Redirect> redirect (new PluginInsert (_session, *p, _placement));
 
+               uint32_t err_streams;
+               
                if (_route->add_redirect (redirect, this, &err_streams)) {
-                       weird_plugin_dialog (*plugin, err_streams, _route);
+                       weird_plugin_dialog (**p, err_streams, _route);
                } else {
+                       
                        if (Profile->get_sae()) {
                                redirect->set_active (true, 0);
                        }
                        redirect->active_changed.connect (bind (mem_fun (*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr<Redirect>(redirect)));
                }
        }
-
-       if (!using_plugin_selector) {
-               newplug_connection.disconnect();
-       }
 }
 
 void
@@ -1413,15 +1404,3 @@ RedirectBox::generate_redirect_title (boost::shared_ptr<PluginInsert> pi)
        return string_compose(_("%1: %2 (by %3)"), _route->name(), pi->name(), maker);  
 }
 
-void
-RedirectBox::plugin_selector_hidden ()
-{
-       newplug_connection.disconnect();
-       using_plugin_selector = false;
-}
-
-void
-RedirectBox::plugin_selector_shown ()
-{
-       using_plugin_selector = true;
-}
index 5c4c566f93b774ab63e9679855e5dd1c298ffb38..74a08321520b97dfd5560dc5e2e163cebb7cdd1b 100644 (file)
@@ -42,6 +42,7 @@
 
 #include <pbd/fastlog.h>
 
+#include "plugin_interest.h"
 #include "route_ui.h"
 #include "io_selector.h"
 #include "enums.h"
@@ -62,7 +63,7 @@ namespace ARDOUR {
        class Session;
 }
 
-class RedirectBox : public Gtk::HBox
+class RedirectBox : public Gtk::HBox, public PluginInterestedObject
 {
   public:
        RedirectBox (ARDOUR::Placement, ARDOUR::Session&, 
@@ -144,11 +145,7 @@ class RedirectBox : public Gtk::HBox
        void send_io_finished (IOSelector::Result, boost::weak_ptr<ARDOUR::Redirect>, IOSelectorWindow*);
        void choose_insert ();
        void choose_plugin ();
-       void insert_plugin_chosen (boost::shared_ptr<ARDOUR::Plugin>);
-       sigc::connection newplug_connection;
-       bool using_plugin_selector;
-       void plugin_selector_hidden ();
-       void plugin_selector_shown ();
+       void use_plugins (const SelectedPlugins&);
 
        bool no_redirect_redisplay;
        bool ignore_delete;