The matrix used to highlight connections on click-hold on a row or column label;...
[ardour.git] / gtk2_ardour / port_matrix_component.h
1 /*
2     Copyright (C) 2002-2009 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 __gtk_ardour_port_matrix_component_h__
21 #define __gtk_ardour_port_matrix_component_h__
22
23 #include <stdint.h>
24 #include <gtkmm/eventbox.h>
25 #include <boost/shared_ptr.hpp>
26
27 class PortMatrix;
28 class PortMatrixBody;
29 class PortMatrixNode;
30 class PortGroup;
31 class PortGroupList;
32
33 namespace ARDOUR {
34         class BundleChannel;
35 }
36
37 /** One component of the PortMatrix.  This is a cairo-rendered
38  *  Pixmap.
39  */
40 class PortMatrixComponent
41 {
42 public:
43         PortMatrixComponent (PortMatrix *, PortMatrixBody *);
44         virtual ~PortMatrixComponent ();
45
46         virtual double component_to_parent_x (double x) const = 0;
47         virtual double parent_to_component_x (double x) const = 0;
48         virtual double component_to_parent_y (double y) const = 0;
49         virtual double parent_to_component_y (double y) const = 0;
50         virtual void mouseover_changed (std::list<PortMatrixNode> const &) = 0;
51         virtual void draw_extra (cairo_t *) = 0;
52         virtual void button_press (double, double, int, uint32_t) {}
53         virtual void motion (double, double) {}
54
55         void set_show_ports (bool);
56         void setup ();
57         GdkPixmap* get_pixmap (GdkDrawable *);
58         std::pair<uint32_t, uint32_t> dimensions ();
59
60         void require_render () {
61                 _render_required = true;
62         }
63
64         void require_rebuild () {
65                 _dimension_computation_required = true;
66                 _render_required = true;
67         }
68
69         void set_parent_rectangle (Gdk::Rectangle const & r) {
70                 _parent_rectangle = r;
71         }
72
73         Gdk::Rectangle parent_rectangle () const {
74                 return _parent_rectangle;
75         }
76
77         /** @return grid spacing */
78         static uint32_t grid_spacing () {
79                 return 24;
80         }
81
82 protected:
83
84         /** @return width of borders drawn around labels */
85         static uint32_t label_border_width () {
86                 return 1;
87         }
88
89         /** @return padding between a name and the nearest line */
90         static uint32_t name_pad () {
91                 return 8;
92         }
93
94         /** @return width of thin lines in the grid */
95         static double thin_grid_line_width () {
96                 return 0.5;
97         }
98
99         /** @return width of thick lines in the grid */
100         static double thick_grid_line_width () {
101                 return 1;
102         }
103
104         /** @return space around the connection indicator */
105         static uint32_t connection_indicator_pad () {
106                 return 6;
107         }
108
109         static uint32_t mouseover_line_width () {
110                 return 4;
111         }
112
113         /** @return angle of column labels, in radians */
114         static double angle () {
115                 return M_PI / 4;
116         }
117
118         /** @return background colour */
119         Gdk::Color background_colour ();
120
121         /* XXX I guess these colours should come from a theme, or something */
122
123         /** @return text colour */
124         static Gdk::Color text_colour () {
125                 return Gdk::Color ("#ffffff");
126         }
127
128         /** @return grid line colour */
129         static Gdk::Color grid_colour () {
130                 return Gdk::Color ("#000000");
131         }
132
133         /** @return colour of association blobs */
134         static Gdk::Color association_colour () {
135                 return Gdk::Color ("#00ff00");
136         }
137
138         /** @return colour to paint grid squares when they can't be associated */
139         static Gdk::Color unknown_colour () {
140                 return Gdk::Color ("#cccccc");
141         }
142
143         /** @return colour to paint mouseover lines */
144         static Gdk::Color mouseover_line_colour () {
145                 return Gdk::Color ("#ff0000");
146         }
147
148         /** @return colour to paint channel highlights */
149         static Gdk::Color highlighted_channel_colour () {
150                 return Gdk::Color ("#777777");
151         }
152
153         /* XXX */
154         static Gdk::Color get_a_bundle_colour (int x) {
155                 if ((x % 2) == 0) {
156                         return Gdk::Color ("#547027");
157                 } else {
158                         return Gdk::Color ("#3552a6");
159                 }
160         }
161
162         /* XXX */
163         static Gdk::Color get_a_group_colour (int x) {
164                 if ((x % 2) == 0) {
165                         return Gdk::Color ("#222222");
166                 } else {
167                         return Gdk::Color ("#444444");
168                 }
169         }
170
171         void set_source_rgb (cairo_t *, Gdk::Color const &);
172         void set_source_rgba (cairo_t *, Gdk::Color const &, double);
173         uint32_t group_size (boost::shared_ptr<const PortGroup>) const;
174         uint32_t channel_to_position (ARDOUR::BundleChannel, PortGroupList const *) const;
175         virtual std::pair<boost::shared_ptr<PortGroup>, ARDOUR::BundleChannel> position_to_group_and_channel (double, double, PortGroupList const *) const;
176
177         /** Render the complete component to a cairo context. */
178         virtual void render (cairo_t *) = 0;
179         /** Compute any required dimensions.  This must set up
180          *  _width and _height.
181          */
182         virtual void compute_dimensions () = 0;
183
184         PortMatrix* _matrix;
185         PortMatrixBody* _body; ///< the PortMatrixBody that we're in
186         uint32_t _width; ///< full width of the contents
187         uint32_t _height; ///< full height of the contents
188         Gdk::Rectangle _parent_rectangle;
189
190 private:
191         GdkPixmap* _pixmap; ///< pixmap
192         bool _render_required; ///< true if the rendered pixmap is out of date
193         bool _dimension_computation_required; ///< true if the dimensions are out of date
194 };
195
196 #endif