rework processor box: handle n/a plugins
authorRobin Gareus <robin@gareus.org>
Sat, 15 Aug 2015 19:29:19 +0000 (21:29 +0200)
committerRobin Gareus <robin@gareus.org>
Sat, 15 Aug 2015 22:03:39 +0000 (00:03 +0200)
gtk2_ardour/actions.cc
gtk2_ardour/actions.h
gtk2_ardour/dark.colors
gtk2_ardour/processor_box.cc
gtk2_ardour/processor_box.h

index 43d2eb83c9cd84fe2c2c22664b912171bffc0525..7f11d053e8fbd42c1b43813116874a2fbf1698c2 100644 (file)
@@ -49,7 +49,6 @@ using namespace ARDOUR;
 vector<RefPtr<Gtk::Action> > ActionManager::session_sensitive_actions;
 vector<RefPtr<Gtk::Action> > ActionManager::write_sensitive_actions;
 vector<RefPtr<Gtk::Action> > ActionManager::region_list_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::plugin_selection_sensitive_actions;
 vector<RefPtr<Gtk::Action> > ActionManager::track_selection_sensitive_actions;
 vector<RefPtr<Gtk::Action> > ActionManager::point_selection_sensitive_actions;
 vector<RefPtr<Gtk::Action> > ActionManager::time_selection_sensitive_actions;
index 6900e8392a74cf79b9d54470146a14b469cadcb8..13358349ca7a2fac683c2550c340ee5e1170572d 100644 (file)
@@ -37,7 +37,6 @@ namespace ActionManager {
        extern std::vector<Glib::RefPtr<Gtk::Action> > session_sensitive_actions;
        extern std::vector<Glib::RefPtr<Gtk::Action> > write_sensitive_actions;
        extern std::vector<Glib::RefPtr<Gtk::Action> > region_list_selection_sensitive_actions;
-       extern std::vector<Glib::RefPtr<Gtk::Action> > plugin_selection_sensitive_actions;
 
        extern std::vector<Glib::RefPtr<Gtk::Action> > track_selection_sensitive_actions;
        extern std::vector<Glib::RefPtr<Gtk::Action> > point_selection_sensitive_actions;
index 13151ae5b4045a0cfb0cbfd997918a2fac85cf4b..648b21b0313a1369594b091c699fb9df21d50d40 100644 (file)
     <ColorAlias name="processor prefader: fill" alias="color 40"/>
     <ColorAlias name="processor prefader: fill active" alias="color 80"/>
     <ColorAlias name="processor prefader: led active" alias="color 37"/>
+    <ColorAlias name="processor stub: fill" alias="color 46"/>
+    <ColorAlias name="processor stub: fill active" alias="color 46"/>
     <ColorAlias name="punch button: fill" alias="color 20"/>
     <ColorAlias name="punch button: fill active" alias="color 9"/>
     <ColorAlias name="punch button: led active" alias="color 4"/>
index 32140a8a54cc45234d84d39431a45b8ca19604bf..536d5f26f91cf9fd5448541cd86c557407df3579 100644 (file)
@@ -91,7 +91,9 @@ using namespace Gtkmm2ext;
 ProcessorBox* ProcessorBox::_current_processor_box = 0;
 RefPtr<Action> ProcessorBox::paste_action;
 RefPtr<Action> ProcessorBox::cut_action;
+RefPtr<Action> ProcessorBox::copy_action;
 RefPtr<Action> ProcessorBox::rename_action;
+RefPtr<Action> ProcessorBox::delete_action;
 RefPtr<Action> ProcessorBox::edit_action;
 RefPtr<Action> ProcessorBox::edit_generic_action;
 
@@ -103,6 +105,7 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
        , _position (PreFader)
        , _position_num(0)
        , _selectable(true)
+       , _unknown_processor(false)
        , _parent (parent)
        , _processor (p)
        , _width (w)
@@ -122,6 +125,7 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
        }
        if (boost::dynamic_pointer_cast<UnknownProcessor> (_processor)) {
                _button.set_elements(ArdourButton::Element(_button.elements() & ~ArdourButton::Indicator));
+               _unknown_processor = true;
        }
        if (_processor) {
 
@@ -231,6 +235,11 @@ ProcessorEntry::set_visual_state (Gtkmm2ext::VisualState s, bool yn)
 void
 ProcessorEntry::setup_visuals ()
 {
+       if (_unknown_processor) {
+               _button.set_name ("processor stub");
+               return;
+       }
+
        switch (_position) {
        case PreFader:
                _button.set_name ("processor prefader");
@@ -321,6 +330,11 @@ ProcessorEntry::setup_tooltip ()
                        }
                        return;
                }
+               if(boost::dynamic_pointer_cast<UnknownProcessor> (_processor)) {
+                       ARDOUR_UI::instance()->set_tip (_button,
+                                       string_compose (_("<b>%1</b>\nThe Plugin is not available on this system\nand has been replaced by a stub."), name (Wide)));
+                       return;
+               }
        }
        ARDOUR_UI::instance()->set_tip (_button, string_compose ("<b>%1</b>", name (Wide)));
 }
@@ -1096,6 +1110,9 @@ ProcessorBox::object_drop(DnDVBox<ProcessorEntry>* source, ProcessorEntry* posit
        list<boost::shared_ptr<Processor> > procs;
        for (list<ProcessorEntry*>::const_iterator i = children.begin(); i != children.end(); ++i) {
                if ((*i)->processor ()) {
+                       if (boost::dynamic_pointer_cast<UnknownProcessor> ((*i)->processor())) {
+                               continue;
+                       }
                        procs.push_back ((*i)->processor ());
                }
        }
@@ -1234,11 +1251,14 @@ ProcessorBox::show_processor_menu (int arg)
 
        /* Sensitise actions as approprioate */
 
-        cut_action->set_sensitive (can_cut());
+
+       const bool sensitive = !processor_display.selection().empty() && ! stub_processor_selected ();
+
        paste_action->set_sensitive (!_rr_selection.processors.empty());
+       cut_action->set_sensitive (sensitive && can_cut ());
+       copy_action->set_sensitive (sensitive);
+       delete_action->set_sensitive (sensitive || stub_processor_selected ());
 
-       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 ());
        edit_generic_action->set_sensitive (one_processor_can_be_edited ());
 
@@ -1251,7 +1271,10 @@ ProcessorBox::show_processor_menu (int arg)
        edit_action->set_sensitive (pi && pi->plugin()->has_editor ());
 
        /* disallow rename for multiple selections, for plugin inserts and for the fader */
-       rename_action->set_sensitive (single_selection && !pi && !boost::dynamic_pointer_cast<Amp> (single_selection->processor ()));
+       rename_action->set_sensitive (single_selection
+                       && !pi
+                       && !boost::dynamic_pointer_cast<Amp> (single_selection->processor ())
+                       && !boost::dynamic_pointer_cast<UnknownProcessor> (single_selection->processor ()));
 
        processor_menu->popup (1, arg);
 
@@ -1781,9 +1804,10 @@ ProcessorBox::add_processor_to_display (boost::weak_ptr<Processor> p)
 
        boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
        boost::shared_ptr<PortInsert> ext = boost::dynamic_pointer_cast<PortInsert> (processor);
+       boost::shared_ptr<UnknownProcessor> stub = boost::dynamic_pointer_cast<UnknownProcessor> (processor);
        
        //faders and meters are not deletable, copy/paste-able, so they shouldn't be selectable
-       if (!send && !plugin_insert && !ext)
+       if (!send && !plugin_insert && !ext && !stub)
                e->set_selectable(false);
 
        bool mark_send_visible = false;
@@ -1908,22 +1932,38 @@ ProcessorBox::rename_processors ()
 bool
 ProcessorBox::can_cut () const
 {
-        vector<boost::shared_ptr<Processor> > sel;
+       vector<boost::shared_ptr<Processor> > sel;
 
-        get_selected_processors (sel);
+       get_selected_processors (sel);
 
-        /* cut_processors () does not cut inserts */
+       /* cut_processors () does not cut inserts */
 
-        for (vector<boost::shared_ptr<Processor> >::const_iterator i = sel.begin (); i != sel.end (); ++i) {
+       for (vector<boost::shared_ptr<Processor> >::const_iterator i = sel.begin (); i != sel.end (); ++i) {
 
                if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0 ||
                    (boost::dynamic_pointer_cast<Send>((*i)) != 0) ||
                    (boost::dynamic_pointer_cast<Return>((*i)) != 0)) {
-                        return true;
-                }
-        }
+                       return true;
+               }
+       }
 
-        return false;
+       return false;
+}
+
+bool
+ProcessorBox::stub_processor_selected () const
+{
+       vector<boost::shared_ptr<Processor> > sel;
+
+       get_selected_processors (sel);
+
+       for (vector<boost::shared_ptr<Processor> >::const_iterator i = sel.begin (); i != sel.end (); ++i) {
+               if (boost::dynamic_pointer_cast<UnknownProcessor>((*i)) != 0) {
+                       return true;
+               }
+       }
+
+       return false;
 }
 
 void
@@ -2520,14 +2560,10 @@ ProcessorBox::register_actions ()
        /* standard editing stuff */
        cut_action = ActionManager::register_action (popup_act_grp, X_("cut"), _("Cut"),
                                                      sigc::ptr_fun (ProcessorBox::rb_cut));
-       ActionManager::plugin_selection_sensitive_actions.push_back(cut_action);
-       act = ActionManager::register_action (popup_act_grp, X_("copy"), _("Copy"),
+       copy_action = ActionManager::register_action (popup_act_grp, X_("copy"), _("Copy"),
                        sigc::ptr_fun (ProcessorBox::rb_copy));
-       ActionManager::plugin_selection_sensitive_actions.push_back(act);
-
-       act = ActionManager::register_action (popup_act_grp, X_("delete"), _("Delete"),
+       delete_action = ActionManager::register_action (popup_act_grp, X_("delete"), _("Delete"),
                        sigc::ptr_fun (ProcessorBox::rb_delete));
-       ActionManager::plugin_selection_sensitive_actions.push_back(act); // ??
 
        paste_action = ActionManager::register_action (popup_act_grp, X_("paste"), _("Paste"),
                        sigc::ptr_fun (ProcessorBox::rb_paste));
index 0776feb2b99509b2c805117dbabac9850de0ef53..a76970b72136721f3d23468f6e83064f4005252d 100644 (file)
@@ -126,6 +126,7 @@ public:
        };
 
        void set_position (Position, uint32_t);
+       bool unknown_processor () const { return _unknown_processor; } ;
        boost::shared_ptr<ARDOUR::Processor> processor () const;
        void set_enum_width (Width);
 
@@ -150,6 +151,7 @@ protected:
 
 private:
        bool _selectable;
+       bool _unknown_processor;
        void led_clicked();
        void processor_active_changed ();
        void processor_property_changed (const PBD::PropertyChange&);
@@ -394,10 +396,13 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void get_selected_processors (ProcSelection&) const;
 
        bool can_cut() const;
+       bool stub_processor_selected() const;
 
        static Glib::RefPtr<Gtk::Action> cut_action;
+       static Glib::RefPtr<Gtk::Action> copy_action;
        static Glib::RefPtr<Gtk::Action> paste_action;
        static Glib::RefPtr<Gtk::Action> rename_action;
+       static Glib::RefPtr<Gtk::Action> delete_action;
        static Glib::RefPtr<Gtk::Action> edit_action;
        static Glib::RefPtr<Gtk::Action> edit_generic_action;
        void paste_processor_state (const XMLNodeList&, boost::shared_ptr<ARDOUR::Processor>);