Add missing snap-to actions to the main menu so that their keyboard accelerators...
[ardour.git] / gtk2_ardour / processor_box.h
index 9273a750521c044e51054c0b52c51341eaf83e27..bd5f18b947dc432abb3b9b76ac3c0af1f2d75b8d 100644 (file)
 #include <gtkmm/eventbox.h>
 #include <gtkmm/menu.h>
 #include <gtkmm/scrolledwindow.h>
-#include <gtkmm2ext/dndtreeview.h>
-#include <gtkmm2ext/auto_spin.h>
-#include <gtkmm2ext/click_box.h>
-#include <gtkmm2ext/dndvbox.h>
-#include <gtkmm2ext/pixfader.h>
+#include "gtkmm2ext/dndtreeview.h"
+#include "gtkmm2ext/auto_spin.h"
+#include "gtkmm2ext/click_box.h"
+#include "gtkmm2ext/dndvbox.h"
+#include "gtkmm2ext/pixfader.h"
 
 #include "pbd/stateful.h"
 #include "pbd/signals.h"
@@ -83,6 +83,9 @@ public:
        ProcessorWindowProxy (std::string const &, XMLNode const *, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
 
        void show ();
+       bool rc_configured () const {
+               return false;
+       }
 
        boost::weak_ptr<ARDOUR::Processor> processor () const {
                return _processor;
@@ -103,13 +106,28 @@ public:
        Gtk::EventBox& action_widget ();
        Gtk::Widget& widget ();
        std::string drag_text () const;
+       void set_visual_state (Gtk::StateType);
+
+       enum Position {
+               PreFader,
+               Fader,
+               PostFader
+       };
+       
+       void set_position (Position);
        boost::shared_ptr<ARDOUR::Processor> processor () const;
        void set_enum_width (Width);
        virtual void set_pixel_width (int) {}
 
+       /** Hide any widgets that should be hidden */
+       virtual void hide_things () {}
+
 protected:
        
+       virtual void setup_visuals ();
+       
        Gtk::VBox _vbox;
+       Position _position;
        
 private:
 
@@ -117,13 +135,15 @@ private:
        void processor_active_changed ();
        void processor_property_changed (const PBD::PropertyChange&);
        std::string name () const;
-       
+
+       Gtk::Frame _frame;
        Gtk::EventBox _event_box;
        Gtk::Label _name;
        Gtk::HBox _hbox;
        Gtk::CheckButton _active;
        boost::shared_ptr<ARDOUR::Processor> _processor;
        Width _width;
+       Gtk::StateType _visual_state;
        PBD::ScopedConnection active_connection;
        PBD::ScopedConnection name_connection;
 };
@@ -151,6 +171,28 @@ private:
        static Glib::RefPtr<Gdk::Pixbuf> _slider;
 };
 
+class PluginInsertProcessorEntry : public ProcessorEntry
+{
+public:
+       PluginInsertProcessorEntry (boost::shared_ptr<ARDOUR::PluginInsert>, Width);
+
+       void hide_things ();
+       
+private:
+       void setup_visuals ();
+       void plugin_insert_splitting_changed ();
+
+       /* XXX: this seems a little ridiculous just for a simple scaleable icon */
+       class SplittingIcon : public Gtk::DrawingArea {
+       private:
+               bool on_expose_event (GdkEventExpose *);
+       };
+
+       boost::shared_ptr<ARDOUR::PluginInsert> _plugin_insert;
+       SplittingIcon _splitting_icon;
+       PBD::ScopedConnection _splitting_connection;
+};
+
 class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr
 {
   public:
@@ -169,8 +211,10 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void select_all_inserts ();
        void select_all_sends ();
 
+       void hide_things ();
+
        Gtk::Window* get_processor_ui (boost::shared_ptr<ARDOUR::Processor>) const;
-       void edit_processor (boost::shared_ptr<ARDOUR::Processor>);
+       void toggle_edit_processor (boost::shared_ptr<ARDOUR::Processor>);
        
        sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorSelected;
        sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorUnselected;
@@ -186,7 +230,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        MixerStrip*         _parent_strip; // null if in RouteParamsUI
        bool                _owner_is_mixer;
        bool                 ab_direction;
-       PBD::ScopedConnectionList connections;
+       PBD::ScopedConnectionList _mixer_strip_connections;
+       PBD::ScopedConnectionList _route_connections;
 
        boost::function<PluginSelector*()> _get_plugin_selector;
 
@@ -200,8 +245,6 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 
        void selection_changed ();
 
-       Gtk::EventBox          processor_eventbox;
-       Gtk::HBox              processor_hpacker;
        Gtkmm2ext::DnDVBox<ProcessorEntry> processor_display;
        Gtk::ScrolledWindow    processor_scroller;
 
@@ -241,6 +284,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void redisplay_processors ();
        void add_processor_to_display (boost::weak_ptr<ARDOUR::Processor>);
        void reordered ();
+       void report_failed_reorder ();
        void route_processors_changed (ARDOUR::RouteProcessorChange);
 
        void processors_reordered (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator&, int*);
@@ -274,6 +318,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        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;
        void paste_processor_state (const XMLNodeList&, boost::shared_ptr<ARDOUR::Processor>);
 
        void activate_processor (boost::shared_ptr<ARDOUR::Processor>);
@@ -286,6 +331,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void weird_plugin_dialog (ARDOUR::Plugin& p, ARDOUR::Route::ProcessorStreams streams);
        void on_size_allocate (Gtk::Allocation &);
 
+       void setup_entry_positions ();
+       
        static ProcessorBox* _current_processor_box;
 
        static void rb_choose_aux (boost::weak_ptr<ARDOUR::Route>);
@@ -313,6 +360,11 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        std::list<ProcessorWindowProxy*> _processor_window_proxies;
        void set_processor_ui (boost::shared_ptr<ARDOUR::Processor>, Gtk::Window *);
        void maybe_add_processor_to_ui_list (boost::weak_ptr<ARDOUR::Processor>);
+
+       bool one_processor_can_be_edited ();
+       bool processor_can_be_edited (boost::shared_ptr<ARDOUR::Processor>);
+
+       void mixer_strip_delivery_changed (boost::weak_ptr<ARDOUR::Delivery>);
 };
 
 #endif /* __ardour_gtk_processor_box__ */