ardour
processor_box.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2004 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #ifndef __ardour_gtk_processor_box__
21 #define __ardour_gtk_processor_box__
22 
23 #include <cmath>
24 #include <vector>
25 
26 #include <boost/function.hpp>
27 
28 #include <gtkmm/box.h>
29 #include <gtkmm/eventbox.h>
30 #include <gtkmm/menu.h>
31 #include <gtkmm/scrolledwindow.h>
32 #include "gtkmm2ext/dndtreeview.h"
33 #include "gtkmm2ext/auto_spin.h"
34 #include "gtkmm2ext/click_box.h"
35 #include "gtkmm2ext/dndvbox.h"
36 #include "gtkmm2ext/pixfader.h"
38 
39 #include "pbd/stateful.h"
40 #include "pbd/signals.h"
41 
42 #include "ardour/types.h"
43 #include "ardour/ardour.h"
44 #include "ardour/plugin_insert.h"
45 #include "ardour/port_insert.h"
46 #include "ardour/processor.h"
47 #include "ardour/route.h"
48 #include "ardour/session_handle.h"
49 
50 #include "pbd/fastlog.h"
51 
52 #include "plugin_interest.h"
53 #include "io_selector.h"
54 #include "send_ui.h"
55 #include "enums.h"
56 #include "ardour_button.h"
57 #include "window_manager.h"
58 
59 class MotionController;
60 class PluginSelector;
61 class PluginUIWindow;
63 class MixerStrip;
64 
65 namespace ARDOUR {
66  class Connection;
67  class IO;
68  class Insert;
69  class Plugin;
70  class PluginInsert;
71  class PortInsert;
72  class Route;
73  class Session;
74 }
75 
76 class ProcessorBox;
77 
79 {
80  public:
83 
84  Gtk::Window* get (bool create = false);
85 
87  return _processor;
88  }
89 
91  void toggle();
92  void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
93 
94  void set_state (const XMLNode&);
95  XMLNode& get_state () const;
96 
97  private:
100  bool is_custom;
102  bool _valid;
103 
104  void processor_going_away ();
106 };
107 
108 class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable
109 {
110 public:
112  ~ProcessorEntry ();
113 
114  Gtk::EventBox& action_widget ();
115  Gtk::Widget& widget ();
116  std::string drag_text () const;
117  void set_visual_state (Gtkmm2ext::VisualState, bool);
118 
119  bool is_selectable() const {return _selectable;}
120  void set_selectable(bool s) { _selectable = s; }
121 
122  enum Position {
126  };
127 
128  void set_position (Position, uint32_t);
130  void set_enum_width (Width);
131 
133  virtual void hide_things ();
134 
135  void show_all_controls ();
136  void hide_all_controls ();
137  void add_control_state (XMLNode *) const;
138  void set_control_state (XMLNode const *);
139  std::string state_id () const;
140  Gtk::Menu* build_controls_menu ();
141  Gtk::Menu* build_send_options_menu ();
142 
143 protected:
145  Gtk::VBox _vbox;
147  uint32_t _position_num;
148 
149  virtual void setup_visuals ();
150 
151 private:
153  void led_clicked();
154  void processor_active_changed ();
157  std::string name (Width) const;
158  void setup_tooltip ();
159 
166 
167  class Control : public sigc::trackable {
168  public:
170 
171  void set_visible (bool);
172  void add_state (XMLNode *) const;
173  void set_state (XMLNode const *);
174  void hide_things ();
175 
176  bool visible () const {
177  return _visible;
178  }
179 
180  std::string name () const {
181  return _name;
182  }
183 
184  Gtk::Alignment box;
185 
186  private:
187  void slider_adjusted ();
188  void button_clicked ();
189  void control_changed ();
190  std::string state_id () const;
191  void set_tooltip ();
192 
194  /* things for a slider */
195  Gtk::Adjustment _adjustment;
198  /* things for a button */
202  bool _visible;
203  std::string _name;
204  };
205 
206  std::list<Control*> _controls;
207 
209  void toggle_panner_link ();
210 
211  class PortIcon : public Gtk::DrawingArea {
212  public:
213  PortIcon(bool input);
214  void set_ports(ARDOUR::ChanCount const ports) { _ports = ports; }
215  private:
216  bool on_expose_event (GdkEventExpose *);
217  bool _input;
219  };
220 
221  class RoutingIcon : public Gtk::DrawingArea {
222  public:
226  _splitting = false;
227  set_size_request (-1, 4);
228  }
229  void set_sources(ARDOUR::ChanCount const sources) { _sources = sources; }
230  void set_sinks(ARDOUR::ChanCount const sinks) { _sinks = sinks; }
231  void set_splitting(const bool splitting) { _splitting = splitting; }
232  private:
233  bool on_expose_event (GdkEventExpose *);
234  ARDOUR::ChanCount _sources; // signals available to feed into the processor(s)
235  ARDOUR::ChanCount _sinks; // combined number of outputs of the processor
237  };
238 
239 protected:
243 };
244 
246 {
247 public:
249 
250  void hide_things ();
251 
252 private:
255 
257 };
258 
259 class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr
260 {
261  public:
271  };
272 
273  ProcessorBox (ARDOUR::Session*, boost::function<PluginSelector*()> get_plugin_selector,
274  RouteProcessorSelection&, MixerStrip* parent, bool owner_is_mixer = false);
275  ~ProcessorBox ();
276 
278  void set_width (Width);
279 
281 
282  void select_all_processors ();
283  void deselect_all_processors ();
284  void select_all_plugins ();
285  void select_all_inserts ();
286  void select_all_sends ();
287 
288  void hide_things ();
289 
291 
292  /* Everything except a WindowProxy object should use this to get the window */
294 
295  /* a WindowProxy object can use this */
298 
301 
303 
304  sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorSelected;
305  sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorUnselected;
306 
307  static void register_actions();
308 
309  private:
310 
311  /* prevent copy construction */
312  ProcessorBox (ProcessorBox const &);
313 
315  MixerStrip* _parent_strip; // null if in RouteParamsUI
320 
321  boost::function<PluginSelector*()> _get_plugin_selector;
322 
324 
330 
332 
333  void route_going_away ();
334 
335  bool is_editor_mixer_strip() const;
336 
338  Gtk::ScrolledWindow processor_scroller;
339 
340  void object_drop (Gtkmm2ext::DnDVBox<ProcessorEntry> *, ProcessorEntry *, Glib::RefPtr<Gdk::DragContext> const &);
341 
344 
345  Gtk::Menu *processor_menu;
346  gint processor_menu_map_handler (GdkEventAny *ev);
347  Gtk::Menu * build_processor_menu ();
348  void show_processor_menu (int);
349  Gtk::Menu* build_possible_aux_menu();
350 
352  void choose_send ();
355  void choose_insert ();
356  void choose_plugin ();
357  bool use_plugins (const SelectedPlugins&);
358 
360 
361  bool enter_notify (GdkEventCrossing *ev);
362  bool leave_notify (GdkEventCrossing *ev);
363  bool processor_button_press_event (GdkEventButton *, ProcessorEntry *);
364  bool processor_button_release_event (GdkEventButton *, ProcessorEntry *);
365  void redisplay_processors ();
368  void reordered ();
369  void report_failed_reorder ();
371  void processor_menu_unmapped ();
372 
373  void processors_reordered (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator&, int*);
375 
376  void all_visible_processors_active(bool state);
377  void ab_plugins ();
378 
379  typedef std::vector<boost::shared_ptr<ARDOUR::Processor> > ProcSelection;
380 
381  void cut_processors (const ProcSelection&);
382  void copy_processors (const ProcSelection&);
383  void delete_processors (const ProcSelection&);
384  void paste_processors ();
386 
388  void clear_processors ();
390  void rename_processors ();
391 
393  void get_selected_processors (ProcSelection&) const;
394 
395  bool can_cut() const;
396 
397  static Glib::RefPtr<Gtk::Action> cut_action;
398  static Glib::RefPtr<Gtk::Action> paste_action;
399  static Glib::RefPtr<Gtk::Action> rename_action;
400  static Glib::RefPtr<Gtk::Action> edit_action;
401  static Glib::RefPtr<Gtk::Action> edit_generic_action;
403 
406 
408 
410 
411  void setup_entry_positions ();
412 
414 
416  static void rb_choose_plugin ();
417  static void rb_choose_insert ();
418  static void rb_choose_send ();
419  static void rb_clear ();
420  static void rb_clear_pre ();
421  static void rb_clear_post ();
422  static void rb_cut ();
423  static void rb_copy ();
424  static void rb_paste ();
425  static void rb_delete ();
426  static void rb_rename ();
427  static void rb_select_all ();
428  static void rb_deselect_all ();
429  static void rb_activate_all ();
430  static void rb_deactivate_all ();
431  static void rb_ab_plugins ();
432  static void rb_edit ();
433  static void rb_edit_generic ();
434 
437 
438  //typedef std::list<ProcessorWindowProxy*> ProcessorWindowProxies;
439  //ProcessorWindowProxies _processor_window_info;
440 
442 
445 
448 
450 
453 };
454 
455 #endif /* __ardour_gtk_processor_box__ */
bool processor_button_press_event(GdkEventButton *, ProcessorEntry *)
void set_control_state(XMLNode const *)
void compute_processor_sort_keys()
void show_all_controls()
static void rb_choose_insert()
void add_processor_to_display(boost::weak_ptr< ARDOUR::Processor >)
boost::shared_ptr< ARDOUR::Route > _route
void set_ports(ARDOUR::ChanCount const ports)
bool use_plugins(const SelectedPlugins &)
void object_drop(Gtkmm2ext::DnDVBox< ProcessorEntry > *, ProcessorEntry *, Glib::RefPtr< Gdk::DragContext > const &)
bool one_processor_can_be_edited()
void select_all_plugins()
void show_processor_menu(int)
PBD::ScopedConnection _splitting_connection
std::string name(Width) const
void select_all_inserts()
PBD::ScopedConnection going_away_connection
void all_visible_processors_active(bool state)
bool _redisplay_pending
PBD::ScopedConnection amp_config_connection
void processors_reordered(const Gtk::TreeModel::Path &, const Gtk::TreeModel::iterator &, int *)
PBD::ScopedConnectionList _mixer_strip_connections
void processor_configuration_changed(const ARDOUR::ChanCount in, const ARDOUR::ChanCount out)
gint idle_delete_processor(boost::weak_ptr< ARDOUR::Processor >)
bool processor_operation(ProcessorOperation)
void processor_active_changed()
void weird_plugin_dialog(ARDOUR::Plugin &p, ARDOUR::Route::ProcessorStreams streams)
static Glib::RefPtr< Gtk::Action > edit_action
bool edit_aux_send(boost::shared_ptr< ARDOUR::Processor >)
boost::shared_ptr< ARDOUR::Processor > _processor_being_created
PluginInsertProcessorEntry(ProcessorBox *, boost::shared_ptr< ARDOUR::PluginInsert >, Width)
PBD::ScopedConnectionList _route_connections
void send_io_finished(IOSelector::Result, boost::weak_ptr< ARDOUR::Processor >, IOSelectorWindow *)
static Glib::RefPtr< Gtk::Action > edit_generic_action
ArdourButton _button
static void rb_copy()
bool is_selectable() const
static void rb_choose_plugin()
Gtk::Menu * build_processor_menu()
void clear_processors()
static void rb_select_all()
void edit_processor(boost::shared_ptr< ARDOUR::Processor >)
static Glib::RefPtr< Gtk::Action > cut_action
static void rb_choose_aux(boost::weak_ptr< ARDOUR::Route >)
void delete_dragged_processors(const std::list< boost::shared_ptr< ARDOUR::Processor > > &)
void route_processors_changed(ARDOUR::RouteProcessorChange)
ProcessorBox * _processor_box
Definition: processor_box.h:98
Gtk::Window * get_generic_editor_window(boost::shared_ptr< ARDOUR::Processor >)
void processor_menu_unmapped()
PBD::ScopedConnection active_connection
void set_width(Width)
static void rb_cut()
void set_selectable(bool s)
void hide_processor_editor(boost::shared_ptr< ARDOUR::Processor >)
void set_route(boost::shared_ptr< ARDOUR::Route >)
void set_visual_state(Gtkmm2ext::VisualState, bool)
void setup_entry_positions()
void set_enum_width(Width)
ARDOUR::ChanCount _sinks
ProcessorEntry(ProcessorBox *, boost::shared_ptr< ARDOUR::Processor >, Width)
static void rb_deselect_all()
Gtk::Menu * build_controls_menu()
uint32_t _visible_prefader_processors
void redisplay_processors()
void mixer_strip_delivery_changed(boost::weak_ptr< ARDOUR::Delivery >)
void update_gui_object_state(ProcessorEntry *)
static void rb_clear_pre()
std::string state_id() const
void get_selected_processors(ProcSelection &) const
std::list< XMLNode * > XMLNodeList
Definition: xml++.h:44
void maybe_add_processor_to_ui_list(boost::weak_ptr< ARDOUR::Processor >)
sigc::signal< void, boost::shared_ptr< ARDOUR::Processor > > ProcessorSelected
std::vector< ARDOUR::PluginPtr > SelectedPlugins
Gtk::Menu * processor_menu
void set_position(Position, uint32_t)
XMLNode * entry_gui_object_state(ProcessorEntry *)
static void rb_clear()
void rename_processors()
void processor_property_changed(const PBD::PropertyChange &)
Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip
PortIcon _output_icon
boost::function< PluginSelector *()> _get_plugin_selector
boost::weak_ptr< ARDOUR::AutomationControl > _control
ProcessorBox(ARDOUR::Session *, boost::function< PluginSelector *()> get_plugin_selector, RouteProcessorSelection &, MixerStrip *parent, bool owner_is_mixer=false)
void return_io_finished(IOSelector::Result, boost::weak_ptr< ARDOUR::Processor >, IOSelectorWindow *)
static void rb_ab_plugins()
void route_property_changed(const PBD::PropertyChange &)
bool on_expose_event(GdkEventExpose *)
void set_sinks(ARDOUR::ChanCount const sinks)
void set_sources(ARDOUR::ChanCount const sources)
static void rb_rename()
std::vector< boost::shared_ptr< ARDOUR::Processor > > ProcSelection
XMLNode & get_state() const
bool on_expose_event(GdkEventExpose *)
PortIcon _input_icon
Definition: amp.h:29
bool processor_can_be_edited(boost::shared_ptr< ARDOUR::Processor >)
void hide_all_controls()
boost::shared_ptr< ARDOUR::PluginInsert > _plugin_insert
void choose_plugin()
Gtk::Menu * build_send_options_menu()
ARDOUR::SessionHandlePtr * session_handle()
ProcessorBox * _parent
static void rb_choose_send()
RouteProcessorSelection & _rr_selection
Control(boost::shared_ptr< ARDOUR::AutomationControl >, std::string const &)
PBD::ScopedConnection name_connection
void generic_edit_processor(boost::shared_ptr< ARDOUR::Processor >)
bool leave_notify(GdkEventCrossing *ev)
void toggle_panner_link()
static void rb_clear_post()
std::string name() const
virtual void setup_visuals()
void choose_aux(boost::weak_ptr< ARDOUR::Route >)
void paste_processor_state(const XMLNodeList &, boost::shared_ptr< ARDOUR::Processor >)
static Glib::RefPtr< Gtk::Action > rename_action
static ProcessorBox * _current_processor_box
void deselect_all_processors()
std::string generate_processor_title(boost::shared_ptr< ARDOUR::PluginInsert > pi)
Gtk::VBox _vbox
class LIBPBD_API Connection
Definition: signals.h:53
static void rb_delete()
void route_going_away()
void delete_processors(const ProcSelection &)
void toggle_control_visibility(Control *)
uint32_t _position_num
Gtk::Window * get_editor_window(boost::shared_ptr< ARDOUR::Processor >, bool)
void help_count_visible_prefader_processors(boost::weak_ptr< ARDOUR::Processor >, uint32_t *, bool *)
MixerStrip * _parent_strip
bool processor_button_release_event(GdkEventButton *, ProcessorEntry *)
void set_custom_ui_mode(bool use_custom)
Definition: processor_box.h:92
void cut_processors(const ProcSelection &)
bool _owner_is_mixer
boost::weak_ptr< ARDOUR::Processor > processor() const
Definition: processor_box.h:86
static Glib::RefPtr< Gtk::Action > paste_action
void for_selected_processors(void(ProcessorBox::*pmf)(boost::shared_ptr< ARDOUR::Processor >))
bool no_processor_redisplay
void copy_processors(const ProcSelection &)
PBD::ScopedConnection config_connection
std::list< Control * > _controls
void set_state(const XMLNode &)
Gtk::Adjustment _adjustment
ProcessorWindowProxy * find_window_proxy(boost::shared_ptr< ARDOUR::Processor >) const
Definition: xml++.h:95
Width
Definition: enums.h:25
static void rb_edit_generic()
void set_processor_ui(boost::shared_ptr< ARDOUR::Processor >, Gtk::Window *)
void choose_insert()
Gtk::EventBox & action_widget()
boost::weak_ptr< ARDOUR::Processor > _processor
Definition: processor_box.h:99
bool can_cut() const
boost::shared_ptr< ARDOUR::Processor > processor() const
static void rb_activate_all()
ARDOUR::ChanCount _ports
ARDOUR::ChanCount _sources
PBD::ScopedConnection _connection
void select_all_processors()
void set_splitting(const bool splitting)
static void rb_paste()
void rename_processor(boost::shared_ptr< ARDOUR::Processor >)
void add_state(XMLNode *) const
gint processor_menu_map_handler(GdkEventAny *ev)
static void rb_edit()
Position _position
void paste_processors()
Gtk::Widget & widget()
static void register_actions()
Gtkmm2ext::DnDVBox< ProcessorEntry > processor_display
std::string state_id() const
Gtk::ScrolledWindow processor_scroller
boost::shared_ptr< ARDOUR::Processor > _processor
RoutingIcon _routing_icon
void select_all_sends()
sigc::signal< void, boost::shared_ptr< ARDOUR::Processor > > ProcessorUnselected
ProcessorWindowProxy(std::string const &, ProcessorBox *, boost::weak_ptr< ARDOUR::Processor >)
Placement
Definition: types.h:375
void add_control_state(XMLNode *) const
static void rb_deactivate_all()
virtual void hide_things()
bool is_editor_mixer_strip() const
std::string drag_text() const
Gtk::Window * get_processor_ui(boost::shared_ptr< ARDOUR::Processor >) const
Gtk::Menu * build_possible_aux_menu()
void report_failed_reorder()
Gtkmm2ext::HSliderController _slider
void set_state(XMLNode const *)
bool enter_notify(GdkEventCrossing *ev)