Ardour  9.2-266-g5d535d4cb7
panner2d.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2014 Paul Davis <paul@linuxaudiosystems.com>
3  * Copyright (C) 2005 Taybin Rutkin <taybin@taybin.com>
4  * Copyright (C) 2009-2011 Carl Hetherington <carl@carlh.net>
5  * Copyright (C) 2009-2011 David Robillard <d@drobilla.net>
6  * Copyright (C) 2014-2015 Robin Gareus <robin@gareus.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #ifndef __ardour_panner_2d_h__
24 #define __ardour_panner_2d_h__
25 
26 #include <sys/types.h>
27 #include <map>
28 #include <vector>
29 
30 #include <glibmm/refptr.h>
31 #include <ytkmm/drawingarea.h>
32 #include <ytkmm/window.h>
33 #include <ytkmm/box.h>
34 #include <ytkmm/button.h>
35 #include <ytkmm/spinbutton.h>
36 #include <ytkmm/adjustment.h>
37 
38 #include "pbd/cartesian.h"
39 
40 #include "ardour_window.h"
41 
42 namespace ARDOUR {
43  class PannerShell;
44 }
45 
46 namespace Gtk {
47  class Menu;
48  class CheckMenuItem;
49 }
50 
51 class Panner2dWindow;
52 
53 class Panner2d : public Gtk::DrawingArea
54 {
55  public:
56  Panner2d (std::shared_ptr<ARDOUR::PannerShell>, int32_t height);
58 
59  void allow_target_motion (bool);
60 
62  int add_signal (const char* text, const PBD::AngularVector&);
63  void move_signal (int which, const PBD::AngularVector&);
64  void reset (uint32_t n_inputs);
65  void set_send_drawing_mode (bool);
66  void set_sensitive (bool);
67 
68  std::shared_ptr<ARDOUR::PannerShell> get_panner_shell() const { return panner_shell; }
69 
72 
73  protected:
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 
103  struct ColorScheme {
104  uint32_t background;
105  uint32_t crosshairs;
107  uint32_t signalcircle;
108  uint32_t diffusion;
109  uint32_t diffusion_inv;
110  uint32_t pos_outline;
111  uint32_t pos_fill;
112  uint32_t signal_outline;
113  uint32_t signal_fill;
114  uint32_t speaker_fill;
115  uint32_t text;
116  uint32_t send_bg;
117  uint32_t send_pan;
118  };
119 
121  static void set_colors ();
122  static bool have_colors;
123  void color_handler ();
124 
125  std::shared_ptr<ARDOUR::PannerShell> panner_shell;
126  Glib::RefPtr<Pango::Layout> layout;
127 
128  typedef std::vector<Target*> Targets;
132 
134  int width;
135  int height;
136  double radius;
137  double border;
138  double hoffset;
139  double voffset;
140  double last_width;
141  bool did_move;
145 
146  Target *find_closest_object (gdouble x, gdouble y, bool& is_signal);
147 
148  gint handle_motion (gint, gint, GdkModifierType);
149 
150  void toggle_bypass ();
153  void label_signals ();
154 
157 
158  /* cartesian coordinates in GTK units ; adjust to same but on a circle of radius 1.0
159  and centered in the middle of our area
160  */
161  void clamp_to_circle (double& x, double& y);
162  void sphere_project (double& x, double& y, double& z);
163 };
164 
166 {
167  public:
168  Panner2dWindow (std::shared_ptr<ARDOUR::PannerShell>, int32_t height, uint32_t inputs);
169 
170  void reset (uint32_t n_inputs);
171  void set_sensitive (bool);
172 
173  private:
175 
181 
184 
187  void set_bypassed();
188  void set_width();
189 
191  void bypass_toggled ();
192  void width_changed ();
195 };
196 
197 #endif /* __ardour_panner_2d_h__ */
Gtk::Adjustment width_adjustment
Definition: panner2d.h:182
Gtk::VBox spinner_box
Definition: panner2d.h:179
void width_changed()
void bypass_toggled()
Gtk::VBox button_box
Definition: panner2d.h:177
Panner2d widget
Definition: panner2d.h:174
PBD::ScopedConnectionList panshell_connections
Definition: panner2d.h:185
Gtk::SpinButton width_spinner
Definition: panner2d.h:183
void set_sensitive(bool)
bool on_key_release_event(GdkEventKey *)
This is a default handler for the signal signal_key_release_event().
Gtk::ToggleButton bypass_button
Definition: panner2d.h:178
void pannable_handler()
PBD::ScopedConnectionList panvalue_connections
Definition: panner2d.h:186
bool on_key_press_event(GdkEventKey *)
This is a default handler for the signal signal_key_press_event().
Panner2dWindow(std::shared_ptr< ARDOUR::PannerShell >, int32_t height, uint32_t inputs)
void set_bypassed()
Gtk::HBox hpacker
Definition: panner2d.h:176
void reset(uint32_t n_inputs)
Gtk::VBox left_side
Definition: panner2d.h:180
PBD::AngularVector position
Definition: panner2d.h:84
bool selected() const
Definition: panner2d.h:95
Target(const PBD::AngularVector &, const char *txt=0)
std::string text
Definition: panner2d.h:86
void set_selected(bool yn)
Definition: panner2d.h:92
void set_text(const char *)
double last_width
Definition: panner2d.h:140
bool on_expose_event(GdkEventExpose *)
This is a default handler for the signal signal_expose_event().
static ColorScheme colors
Definition: panner2d.h:120
PBD::ScopedConnectionList panshell_connections
Definition: panner2d.h:155
Panner2d(std::shared_ptr< ARDOUR::PannerShell >, int32_t height)
Targets signals
Definition: panner2d.h:130
std::shared_ptr< ARDOUR::PannerShell > panner_shell
Definition: panner2d.h:125
bool on_button_press_event(GdkEventButton *)
This is a default handler for the signal signal_button_press_event().
std::shared_ptr< ARDOUR::PannerShell > get_panner_shell() const
Definition: panner2d.h:68
void toggle_bypass()
void on_size_allocate(Gtk::Allocation &alloc)
This is a default handler for the signal signal_size_allocate().
void cart_to_gtk(PBD::CartesianVector &) const
bool _sensitive
Definition: panner2d.h:144
gint handle_motion(gint, gint, GdkModifierType)
bool _send_mode
Definition: panner2d.h:143
void handle_state_change()
int add_signal(const char *text, const PBD::AngularVector &)
int add_speaker(const PBD::AngularVector &)
static void set_colors()
int height
Definition: panner2d.h:135
bool have_elevation
Definition: panner2d.h:142
int width
Definition: panner2d.h:134
double voffset
Definition: panner2d.h:139
bool on_button_release_event(GdkEventButton *)
This is a default handler for the signal signal_button_release_event().
double border
Definition: panner2d.h:137
bool did_move
Definition: panner2d.h:141
void allow_target_motion(bool)
bool on_scroll_event(GdkEventScroll *)
This is a default handler for the signal signal_scroll_event().
void reset(uint32_t n_inputs)
void label_signals()
Target * find_closest_object(gdouble x, gdouble y, bool &is_signal)
Targets speakers
Definition: panner2d.h:129
void handle_position_change()
void move_signal(int which, const PBD::AngularVector &)
void color_handler()
bool on_motion_notify_event(GdkEventMotion *)
This is a default handler for the signal signal_motion_notify_event().
Glib::RefPtr< Pango::Layout > layout
Definition: panner2d.h:126
double hoffset
Definition: panner2d.h:138
static bool have_colors
Definition: panner2d.h:122
Target position
Definition: panner2d.h:131
double radius
Definition: panner2d.h:136
void gtk_to_cart(PBD::CartesianVector &) const
void set_send_drawing_mode(bool)
PBD::ScopedConnectionList panner_connections
Definition: panner2d.h:156
void sphere_project(double &x, double &y, double &z)
Target * drag_target
Definition: panner2d.h:133
std::vector< Target * > Targets
Definition: panner2d.h:128
void set_sensitive(bool)
void clamp_to_circle(double &x, double &y)
GdkModifierType
Definition: gdktypes.h:127
Definition: ardour_ui.h:182
uint32_t speaker_fill
Definition: panner2d.h:114
uint32_t signal_outline
Definition: panner2d.h:112
uint32_t diffusion_inv
Definition: panner2d.h:109
uint32_t signalcircle
Definition: panner2d.h:107
uint32_t pos_outline
Definition: panner2d.h:110
uint32_t signal_fill
Definition: panner2d.h:113
uint32_t signalcircle_border
Definition: panner2d.h:106
gint height
Definition: xcursors.h:1