X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fprocessor_box.h;h=d300f70d5adbd70f90eb63a2482bd7b214608882;hb=f4ed14a83b3dfc0af9b92db5f73f3389c7773a04;hp=a80dce00feac7af3ae9d6b615abd30a478f8b363;hpb=aae367b63c9b619db1e40f27dc334c6987219481;p=ardour.git diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index a80dce00fe..d300f70d5a 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -29,11 +29,12 @@ #include #include #include -#include -#include -#include -#include -#include +#include "gtkmm2ext/dndtreeview.h" +#include "gtkmm2ext/auto_spin.h" +#include "gtkmm2ext/click_box.h" +#include "gtkmm2ext/dndvbox.h" +#include "gtkmm2ext/pixfader.h" +#include "gtkmm2ext/persistent_tooltip.h" #include "pbd/stateful.h" #include "pbd/signals.h" @@ -52,11 +53,13 @@ #include "io_selector.h" #include "send_ui.h" #include "enums.h" +#include "window_proxy.h" +#include "ardour_button.h" class MotionController; class PluginSelector; class PluginUIWindow; -class RouteRedirectSelection; +class RouteProcessorSelection; class MixerStrip; namespace ARDOUR { @@ -67,77 +70,189 @@ namespace ARDOUR { class PluginInsert; class PortInsert; class Route; - class Send; class Session; } +class ProcessorBox; + +/** A WindowProxy for Processor UI windows; it knows how to ask a ProcessorBox + * to create a UI window for a particular processor. + */ +class ProcessorWindowProxy : public WindowProxy +{ +public: + ProcessorWindowProxy (std::string const &, XMLNode const *, ProcessorBox *, boost::weak_ptr); + + void show (); + bool rc_configured () const { + return false; + } + + boost::weak_ptr processor () const { + return _processor; + } + + bool marked; + +private: + ProcessorBox* _processor_box; + boost::weak_ptr _processor; +}; + class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable { public: - ProcessorEntry (boost::shared_ptr, Width); + ProcessorEntry (ProcessorBox *, boost::shared_ptr, Width); + ~ProcessorEntry (); Gtk::EventBox& action_widget (); Gtk::Widget& widget (); std::string drag_text () const; + void set_visual_state (Gtkmm2ext::VisualState, bool); + + enum Position { + PreFader, + Fader, + PostFader + }; + + void set_position (Position); boost::shared_ptr processor () const; void set_enum_width (Width); - virtual void set_pixel_width (int) {} + virtual void set_pixel_width (int); + + /** Hide any widgets that should be hidden */ + virtual void hide_things (); + + void show_all_controls (); + void hide_all_controls (); + void add_control_state (XMLNode *) const; + void set_control_state (XMLNode const *); + std::string state_id () const; + Gtk::Menu* build_controls_menu (); + + static void setup_slider_pix (); protected: - + ArdourButton _button; Gtk::VBox _vbox; - -private: + Position _position; - void active_toggled (); + virtual void setup_visuals (); + + static Glib::RefPtr _slider_pixbuf; + static Glib::RefPtr _slider_pixbuf_desensitised; + +private: + void led_clicked(); void processor_active_changed (); - void processor_name_changed (); - std::string name () const; - - Gtk::EventBox _event_box; - Gtk::Label _name; - Gtk::HBox _hbox; - Gtk::CheckButton _active; + void processor_property_changed (const PBD::PropertyChange&); + std::string name (Width) const; + void setup_tooltip (); + + ProcessorBox* _parent; boost::shared_ptr _processor; Width _width; + Gtk::StateType _visual_state; PBD::ScopedConnection active_connection; PBD::ScopedConnection name_connection; + + class Control : public sigc::trackable { + public: + Control (Glib::RefPtr, Glib::RefPtr, boost::shared_ptr, std::string const &); + + void set_pixel_width (int); + void set_visible (bool); + void add_state (XMLNode *) const; + void set_state (XMLNode const *); + void hide_things (); + void hide_label (); + + bool visible () const { + return _visible; + } + + std::string name () const { + return _name; + } + + Gtk::VBox box; + + private: + void slider_adjusted (); + void button_clicked (); + void control_changed (); + std::string state_id () const; + void set_tooltip (); + + boost::weak_ptr _control; + /* things for a slider */ + Gtk::Adjustment _adjustment; + Gtkmm2ext::HSliderController _slider; + Gtk::Label _label; + Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip; + /* things for a button */ + ArdourButton _button; + bool _ignore_ui_adjustment; + PBD::ScopedConnection _connection; + bool _visible; + std::string _name; + }; + + std::list _controls; + + void toggle_control_visibility (Control *); }; -class SendProcessorEntry : public ProcessorEntry +class BlankProcessorEntry : public ProcessorEntry { -public: - SendProcessorEntry (boost::shared_ptr, Width); + public: + BlankProcessorEntry (ProcessorBox *, Width w); +}; - static void setup_slider_pix (); +class PluginInsertProcessorEntry : public ProcessorEntry +{ +public: + PluginInsertProcessorEntry (ProcessorBox *, boost::shared_ptr, Width); - void set_enum_width (Width, int); - void set_pixel_width (int); + void hide_things (); private: - void show_gain (); - void gain_adjusted (); - - boost::shared_ptr _send; - Gtk::Adjustment _adjustment; - Gtkmm2ext::HSliderController _fader; - bool _ignore_gain_change; - PBD::ScopedConnection send_gain_connection; - - static Glib::RefPtr _slider; + 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 _plugin_insert; + SplittingIcon _splitting_icon; + PBD::ScopedConnection _splitting_connection; }; class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr { public: + enum ProcessorOperation { + ProcessorsCut, + ProcessorsCopy, + ProcessorsPaste, + ProcessorsDelete, + ProcessorsSelectAll, + ProcessorsToggleActive, + ProcessorsAB, + }; + ProcessorBox (ARDOUR::Session*, boost::function get_plugin_selector, - RouteRedirectSelection&, MixerStrip* parent, bool owner_is_mixer = false); + RouteProcessorSelection&, MixerStrip* parent, bool owner_is_mixer = false); ~ProcessorBox (); void set_route (boost::shared_ptr); void set_width (Width); - void update(); + void processor_operation (ProcessorOperation); void select_all_processors (); void deselect_all_processors (); @@ -145,32 +260,45 @@ 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) const; + void toggle_edit_processor (boost::shared_ptr); + void toggle_edit_generic_processor (boost::shared_ptr); + + void update_gui_object_state (ProcessorEntry *); + sigc::signal > ProcessorSelected; sigc::signal > ProcessorUnselected; static void register_actions(); private: + + /* prevent copy construction */ + ProcessorBox (ProcessorBox const &); + boost::shared_ptr _route; 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 _get_plugin_selector; boost::shared_ptr _processor_being_created; - ARDOUR::Placement _placement; + /** Index at which to place a new plugin (based on where the menu was opened), or -1 to + * put at the end of the plugin list. + */ + int _placement; + uint32_t _visible_prefader_processors; - RouteRedirectSelection& _rr_selection; + RouteProcessorSelection& _rr_selection; void route_going_away (); - void selection_changed (); - - Gtk::EventBox processor_eventbox; - Gtk::HBox processor_hpacker; Gtkmm2ext::DnDVBox processor_display; Gtk::ScrolledWindow processor_scroller; @@ -178,17 +306,10 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD Width _width; - Gtk::Menu *send_action_menu; - void build_send_action_menu (); - - void new_send (); - void show_send_controls (); - Gtk::Menu *processor_menu; gint processor_menu_map_handler (GdkEventAny *ev); Gtk::Menu * build_processor_menu (); - void build_processor_tooltip (Gtk::EventBox&, std::string); - void show_processor_menu (gint arg); + void show_processor_menu (int); Gtk::Menu* build_possible_aux_menu(); void choose_aux (boost::weak_ptr); @@ -197,38 +318,33 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD void return_io_finished (IOSelector::Result, boost::weak_ptr, IOSelectorWindow*); void choose_insert (); void choose_plugin (); - void use_plugins (const SelectedPlugins&); + bool use_plugins (const SelectedPlugins&); bool no_processor_redisplay; bool enter_notify (GdkEventCrossing *ev); bool leave_notify (GdkEventCrossing *ev); - bool processor_key_press_event (GdkEventKey *); - bool processor_key_release_event (GdkEventKey *); bool processor_button_press_event (GdkEventButton *, ProcessorEntry *); bool processor_button_release_event (GdkEventButton *, ProcessorEntry *); void redisplay_processors (); void add_processor_to_display (boost::weak_ptr); + void help_count_visible_prefader_processors (boost::weak_ptr, uint32_t*, bool*); void reordered (); + void report_failed_reorder (); void route_processors_changed (ARDOUR::RouteProcessorChange); - - void remove_processor_gui (boost::shared_ptr); + void processor_menu_unmapped (); void processors_reordered (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator&, int*); void compute_processor_sort_keys (); - void all_processors_active(bool state); - void all_plugins_active(bool state); + void all_visible_processors_active(bool state); void ab_plugins (); typedef std::vector > ProcSelection; void cut_processors (const ProcSelection&); - void cut_processors (); void copy_processors (const ProcSelection&); - void copy_processors (); void delete_processors (const ProcSelection&); - void delete_processors (); void paste_processors (); void paste_processors (boost::shared_ptr before); @@ -238,14 +354,17 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD void rename_processors (); void for_selected_processors (void (ProcessorBox::*pmf)(boost::shared_ptr)); - void get_selected_processors (ProcSelection&); + void get_selected_processors (ProcSelection&) const; + bool can_cut() const; + + static Glib::RefPtr cut_action; static Glib::RefPtr paste_action; + static Glib::RefPtr rename_action; + static Glib::RefPtr edit_action; + static Glib::RefPtr edit_generic_action; void paste_processor_state (const XMLNodeList&, boost::shared_ptr); - void activate_processor (boost::shared_ptr); - void deactivate_processor (boost::shared_ptr); - void edit_processor (boost::shared_ptr); void hide_processor_editor (boost::shared_ptr); void rename_processor (boost::shared_ptr); @@ -254,6 +373,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); @@ -274,9 +395,21 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD static void rb_deactivate_all (); static void rb_ab_plugins (); static void rb_edit (); + static void rb_edit_generic (); - void route_name_changed (); + void route_property_changed (const PBD::PropertyChange&); std::string generate_processor_title (boost::shared_ptr pi); + + std::list _processor_window_proxies; + void set_processor_ui (boost::shared_ptr, Gtk::Window *); + void maybe_add_processor_to_ui_list (boost::weak_ptr); + + bool one_processor_can_be_edited (); + bool processor_can_be_edited (boost::shared_ptr); + + void mixer_strip_delivery_changed (boost::weak_ptr); + + XMLNode* entry_gui_object_state (ProcessorEntry *); }; #endif /* __ardour_gtk_processor_box__ */