ardour
panner2d.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002 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_panner_2d_h__
21 #define __ardour_panner_2d_h__
22 
23 #include <sys/types.h>
24 #include <map>
25 #include <vector>
26 
27 #include <glibmm/refptr.h>
28 #include <gtkmm/drawingarea.h>
29 #include <gtkmm/window.h>
30 #include <gtkmm/box.h>
31 #include <gtkmm/button.h>
32 #include <gtkmm/spinbutton.h>
33 #include <gtkmm/adjustment.h>
34 
35 #include "pbd/cartesian.h"
36 
37 #include "ardour_window.h"
38 
39 namespace ARDOUR {
40  class PannerShell;
41 }
42 
43 namespace Gtk {
44  class Menu;
45  class CheckMenuItem;
46 }
47 
48 namespace Pango {
49  class Container;
50 }
51 
52 class Panner2dWindow;
53 
54 class Panner2d : public Gtk::DrawingArea
55 {
56  public:
58  ~Panner2d ();
59 
60  void allow_target_motion (bool);
61 
62  int add_speaker (const PBD::AngularVector&);
63  int add_signal (const char* text, const PBD::AngularVector&);
64  void move_signal (int which, const PBD::AngularVector&);
65  void reset (uint32_t n_inputs);
66  void set_send_drawing_mode (bool);
67 
69 
70  void cart_to_gtk (PBD::CartesianVector&) const;
71  void gtk_to_cart (PBD::CartesianVector&) const;
72 
73  protected:
74  bool on_expose_event (GdkEventExpose *);
75  bool on_button_press_event (GdkEventButton *);
76  bool on_button_release_event (GdkEventButton *);
77  bool on_motion_notify_event (GdkEventMotion *);
78  bool on_scroll_event (GdkEventScroll *);
79  void on_size_allocate (Gtk::Allocation& alloc);
80 
81  private:
82  class Target {
83  public:
85  bool visible;
86  std::string text;
87 
88  Target (const PBD::AngularVector&, const char* txt = 0);
89  ~Target ();
90 
91  void set_text (const char*);
92  void set_selected (bool yn) {
93  _selected = yn;
94  }
95  bool selected() const {
96  return _selected;
97  }
98 
99  private:
100  bool _selected;
101  };
102 
104  Glib::RefPtr<Pango::Layout> layout;
105 
106  typedef std::vector<Target*> Targets;
107  Targets speakers;
108  Targets signals;
110 
112  int width;
113  int height;
114  double radius;
115  double border;
116  double hoffset;
117  double voffset;
118  double last_width;
119  bool did_move;
122 
123  Target *find_closest_object (gdouble x, gdouble y, bool& is_signal);
124 
125  gint handle_motion (gint, gint, GdkModifierType);
126 
127  void toggle_bypass ();
128  void handle_state_change ();
129  void handle_position_change ();
130  void label_signals ();
131 
134 
135  /* cartesian coordinates in GTK units ; adjust to same but on a circle of radius 1.0
136  and centered in the middle of our area
137  */
138  void clamp_to_circle (double& x, double& y);
139  void sphere_project (double& x, double& y, double& z);
140 };
141 
143 {
144  public:
145  Panner2dWindow (boost::shared_ptr<ARDOUR::PannerShell>, int32_t height, uint32_t inputs);
146 
147  void reset (uint32_t n_inputs);
148 
149  private:
151 
152  Gtk::HBox hpacker;
153  Gtk::VBox button_box;
154  Gtk::ToggleButton bypass_button;
155  Gtk::VBox spinner_box;
156  Gtk::VBox left_side;
157 
158  Gtk::Adjustment width_adjustment;
159  Gtk::SpinButton width_spinner;
160 
163  void set_bypassed();
164  void set_width();
165 
166  void pannable_handler ();
167  void bypass_toggled ();
168  void width_changed ();
169  bool on_key_press_event (GdkEventKey*);
170  bool on_key_release_event (GdkEventKey*);
171 };
172 
173 #endif /* __ardour_panner_2d_h__ */
Targets speakers
Definition: panner2d.h:107
bool on_key_press_event(GdkEventKey *)
Definition: panner2d.cc:972
bool on_button_release_event(GdkEventButton *)
Definition: panner2d.cc:678
std::string text
Definition: panner2d.h:86
PBD::ScopedConnectionList panshell_connections
Definition: panner2d.h:161
Gtk::HBox hpacker
Definition: panner2d.h:152
void handle_state_change()
Definition: panner2d.cc:207
void pannable_handler()
Definition: panner2d.cc:935
void set_selected(bool yn)
Definition: panner2d.h:92
double hoffset
Definition: panner2d.h:116
Gtk::SpinButton width_spinner
Definition: panner2d.h:159
Definition: ardour_ui.h:130
void toggle_bypass()
Definition: panner2d.cc:848
void reset(uint32_t n_inputs)
Definition: panner2d.cc:103
void bypass_toggled()
Definition: panner2d.cc:915
void sphere_project(double &x, double &y, double &z)
Definition: panner2d.cc:823
PBD::ScopedConnectionList panvalue_connections
Definition: panner2d.h:162
~Panner2d()
Definition: panner2d.cc:95
std::vector< Target * > Targets
Definition: panner2d.h:106
Target position
Definition: panner2d.h:109
double radius
Definition: panner2d.h:114
int height
Definition: panner2d.h:113
void reset(uint32_t n_inputs)
Definition: panner2d.cc:909
bool did_move
Definition: panner2d.h:119
void set_width()
Definition: panner2d.cc:961
Target * find_closest_object(gdouble x, gdouble y, bool &is_signal)
Definition: panner2d.cc:295
Panner2d(boost::shared_ptr< ARDOUR::PannerShell >, int32_t height)
Definition: panner2d.cc:75
Gtk::Adjustment width_adjustment
Definition: panner2d.h:158
Glib::RefPtr< Pango::Layout > layout
Definition: panner2d.h:104
Targets signals
Definition: panner2d.h:108
PBD::ScopedConnectionList panshell_connections
Definition: panner2d.h:132
PBD::AngularVector position
Definition: panner2d.h:84
int add_signal(const char *text, const PBD::AngularVector &)
Definition: panner2d.cc:186
Target * drag_target
Definition: panner2d.h:111
void set_text(const char *)
Definition: panner2d.cc:70
boost::shared_ptr< ARDOUR::PannerShell > get_panner_shell() const
Definition: panner2d.h:68
void cart_to_gtk(PBD::CartesianVector &) const
Definition: panner2d.cc:794
Definition: amp.h:29
Target(const PBD::AngularVector &, const char *txt=0)
Definition: panner2d.cc:58
Panner2dWindow(boost::shared_ptr< ARDOUR::PannerShell >, int32_t height, uint32_t inputs)
Definition: panner2d.cc:853
void label_signals()
Definition: panner2d.cc:227
Gtk::VBox left_side
Definition: panner2d.h:156
void handle_position_change()
Definition: panner2d.cc:255
Panner2d widget
Definition: panner2d.h:150
int add_speaker(const PBD::AngularVector &)
Definition: panner2d.cc:196
gint handle_motion(gint, gint, GdkModifierType)
Definition: panner2d.cc:717
double border
Definition: panner2d.h:115
bool selected() const
Definition: panner2d.h:95
boost::shared_ptr< ARDOUR::PannerShell > panner_shell
Definition: panner2d.h:103
bool on_button_press_event(GdkEventButton *)
Definition: panner2d.cc:638
bool have_elevation
Definition: panner2d.h:120
bool on_expose_event(GdkEventExpose *)
Definition: panner2d.cc:417
void set_send_drawing_mode(bool)
Definition: panner2d.cc:387
void width_changed()
Definition: panner2d.cc:925
Definition: panner2d.h:48
Gtk::ToggleButton bypass_button
Definition: panner2d.h:154
void gtk_to_cart(PBD::CartesianVector &) const
Definition: panner2d.cc:815
bool _send_mode
Definition: panner2d.h:121
bool on_motion_notify_event(GdkEventMotion *)
Definition: panner2d.cc:396
void on_size_allocate(Gtk::Allocation &alloc)
Definition: panner2d.cc:160
void set_bypassed()
Definition: panner2d.cc:943
bool on_key_release_event(GdkEventKey *)
Definition: panner2d.cc:978
double last_width
Definition: panner2d.h:118
void move_signal(int which, const PBD::AngularVector &)
Definition: panner2d.cc:284
PBD::ScopedConnectionList panner_connections
Definition: panner2d.h:133
void allow_target_motion(bool)
double voffset
Definition: panner2d.h:117
Gtk::VBox spinner_box
Definition: panner2d.h:155
Gtk::VBox button_box
Definition: panner2d.h:153
int width
Definition: panner2d.h:112
bool on_scroll_event(GdkEventScroll *)
Definition: panner2d.cc:777
void clamp_to_circle(double &x, double &y)
Definition: panner2d.cc:838