X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fprocessor_box.h;h=a17903c323d65268f8f5ae8afa0a7ebc673c0c87;hb=4770fea0a2b9b71850de9764868b53f85bfd594c;hp=37c442d2833ea530b12a798c83633dd042868fc8;hpb=2c231282baa596219506c1ee4632708977cc0714;p=ardour.git diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index 37c442d283..a17903c323 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -20,38 +20,46 @@ #ifndef __ardour_gtk_processor_box__ #define __ardour_gtk_processor_box__ +#include #include -#include +#include + #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 "pbd/stateful.h" +#include "pbd/signals.h" #include "ardour/types.h" #include "ardour/ardour.h" #include "ardour/plugin_insert.h" #include "ardour/port_insert.h" #include "ardour/processor.h" +#include "ardour/route.h" +#include "ardour/session_handle.h" #include "pbd/fastlog.h" #include "plugin_interest.h" -#include "route_ui.h" #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 MixerStrip; namespace ARDOUR { class Connection; @@ -65,10 +73,139 @@ namespace ARDOUR { class Session; } -class ProcessorBox : public Gtk::HBox, public PluginInterestedObject +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); + + 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) {} + + /** Hide any widgets that should be hidden */ + virtual void hide_things () {} + +protected: + ArdourButton _button; + Gtk::VBox _vbox; + Position _position; + + virtual void setup_visuals (); + +private: + void led_clicked(); + void processor_active_changed (); + void processor_property_changed (const PBD::PropertyChange&); + std::string name (Width) const; + void setup_tooltip (); + + boost::shared_ptr _processor; + Width _width; + Gtk::StateType _visual_state; + PBD::ScopedConnection active_connection; + PBD::ScopedConnection name_connection; +}; + +class SendProcessorEntry : public ProcessorEntry +{ +public: + SendProcessorEntry (boost::shared_ptr, Width); + + static void setup_slider_pix (); + + void set_enum_width (Width, int); + void set_pixel_width (int); + +private: + void show_gain (); + void gain_adjusted (); + void setup_gain_adjustment (); + + boost::shared_ptr _send; + Gtk::Adjustment _adjustment; + Gtkmm2ext::HSliderController _fader; + bool _ignore_gain_change; + PBD::ScopedConnectionList _send_connections; + ARDOUR::DataType _data_type; + + static Glib::RefPtr _slider; +}; + +class PluginInsertProcessorEntry : public ProcessorEntry +{ +public: + PluginInsertProcessorEntry (boost::shared_ptr, 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 _plugin_insert; + SplittingIcon _splitting_icon; + PBD::ScopedConnection _splitting_connection; +}; + +class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr { public: - ProcessorBox (ARDOUR::Placement, ARDOUR::Session&, PluginSelector &, RouteRedirectSelection &, bool owner_is_mixer = false); + 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); ~ProcessorBox (); void set_route (boost::shared_ptr); @@ -76,62 +213,57 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject void update(); + void processor_operation (ProcessorOperation); + void select_all_processors (); void deselect_all_processors (); void select_all_plugins (); 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_processor_controls (boost::shared_ptr); + sigc::signal > ProcessorSelected; sigc::signal > ProcessorUnselected; - + static void register_actions(); private: + + /* prevent copy construction */ + ProcessorBox (ProcessorBox const &); + boost::shared_ptr _route; - ARDOUR::Session & _session; + MixerStrip* _parent_strip; // null if in RouteParamsUI bool _owner_is_mixer; bool ab_direction; - std::vector 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; - PluginSelector & _plugin_selector; - RouteRedirectSelection & _rr_selection; + RouteRedirectSelection& _rr_selection; void route_going_away (); - struct ModelColumns : public Gtk::TreeModel::ColumnRecord { - ModelColumns () { - add (text); - add (processor); - add (color); - } - Gtk::TreeModelColumn text; - Gtk::TreeModelColumn > processor; - Gtk::TreeModelColumn color; - }; - - ModelColumns columns; - Glib::RefPtr model; - - void selection_changed (); - - static bool get_colors; - static Gdk::Color* active_processor_color; - static Gdk::Color* inactive_processor_color; - - Gtk::EventBox processor_eventbox; - Gtk::HBox processor_hpacker; - Gtkmm2ext::DnDTreeView > processor_display; + Gtkmm2ext::DnDVBox processor_display; Gtk::ScrolledWindow processor_scroller; - void object_drop (const std::list >&); + void object_drop (Gtkmm2ext::DnDVBox *, ProcessorEntry *, Glib::RefPtr const &); Width _width; - + Gtk::Menu *send_action_menu; void build_send_action_menu (); @@ -141,77 +273,86 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject Gtk::Menu *processor_menu; gint processor_menu_map_handler (GdkEventAny *ev); Gtk::Menu * build_processor_menu (); - void build_processor_tooltip (Gtk::EventBox&, string); - void show_processor_menu (gint arg); + void build_processor_tooltip (Gtk::EventBox&, std::string); + void show_processor_menu (int); + Gtk::Menu* build_possible_aux_menu(); + void choose_aux (boost::weak_ptr); void choose_send (); void send_io_finished (IOSelector::Result, boost::weak_ptr, IOSelectorWindow*); - void choose_return (); 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 ignore_delete; - bool processor_button_press_event (GdkEventButton *); - bool processor_button_release_event (GdkEventButton *); + bool enter_notify (GdkEventCrossing *ev); + bool leave_notify (GdkEventCrossing *ev); + 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 row_deleted (const Gtk::TreeModel::Path& path); - void show_processor_active (boost::weak_ptr); - void show_processor_name (boost::weak_ptr); - string processor_name (boost::weak_ptr); - - void remove_processor_gui (boost::shared_ptr); + void reordered (); + void report_failed_reorder (); + void route_processors_changed (ARDOUR::RouteProcessorChange); + void processor_menu_unmapped (); void processors_reordered (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator&, int*); void compute_processor_sort_keys (); - std::vector processor_active_connections; - std::vector processor_name_connections; - - bool processor_drag_in_progress; - void processor_drag_begin (GdkDragContext*); - void processor_drag_end (GdkDragContext*); + void all_processors_active(bool state); void all_plugins_active(bool state); void ab_plugins (); - void cut_processors (); - void copy_processors (); + typedef std::vector > ProcSelection; + + void cut_processors (const ProcSelection&); + void copy_processors (const ProcSelection&); + void delete_processors (const ProcSelection&); void paste_processors (); - void delete_processors (); + void paste_processors (boost::shared_ptr before); + void processors_up (); + void processors_down (); + + void delete_dragged_processors (const std::list >&); void clear_processors (); + void clear_processors (ARDOUR::Placement); void rename_processors (); - typedef vector > ProcSelection; - 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; - void paste_processor_state (const XMLNodeList&); - + static Glib::RefPtr rename_action; + static Glib::RefPtr edit_action; + static Glib::RefPtr controls_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); gint idle_delete_processor (boost::weak_ptr); - void weird_plugin_dialog (ARDOUR::Plugin& p, ARDOUR::Route::ProcessorStreams streams, boost::shared_ptr io); + 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 bool enter_box (GdkEventCrossing*, ProcessorBox*); - static bool leave_box (GdkEventCrossing*, ProcessorBox*); + static void rb_choose_aux (boost::weak_ptr); static void rb_choose_plugin (); static void rb_choose_insert (); static void rb_choose_send (); - static void rb_choose_return (); static void rb_clear (); + static void rb_clear_pre (); + static void rb_clear_post (); static void rb_cut (); static void rb_copy (); static void rb_paste (); @@ -219,15 +360,23 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject static void rb_rename (); static void rb_select_all (); static void rb_deselect_all (); - static void rb_activate (); - static void rb_deactivate (); static void rb_activate_all (); static void rb_deactivate_all (); static void rb_ab_plugins (); static void rb_edit (); - - void route_name_changed (); + static void rb_controls (); + + 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); }; #endif /* __ardour_gtk_processor_box__ */