Some refactoring. Add port group headers to the port matrix.
[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 <gtkmm/eventbox.h>
24
25 class PortMatrixBody;
26
27 /** One component of the PortMatrix.  This is a cairo-rendered
28  *  Pixmap.
29  */
30 class PortMatrixComponent
31 {
32 public:
33         PortMatrixComponent (PortMatrixBody *);
34         virtual ~PortMatrixComponent ();
35
36         void setup ();
37         GdkPixmap* get_pixmap (GdkDrawable *);
38         std::pair<uint32_t, uint32_t> dimensions ();
39
40         void require_render () {
41                 _render_required = true;
42         }
43         
44         void require_rebuild () {
45                 _dimension_computation_required = true;
46                 _render_required = true;
47         }
48
49         /** @return width of columns in the grid */
50         static uint32_t column_width () {
51                 return 32;
52         }
53
54         /** @return height of rows in the grid */
55         static uint32_t row_height () {
56                 return 32;
57         }
58
59 protected:
60
61         /** @return width of borders drawn around labels */
62         static uint32_t label_border_width () {
63                 return 1;
64         }
65
66         /** @return padding between a name and the nearest line */
67         static uint32_t name_pad () {
68                 return 8;
69         }
70
71         /** @return width of thin lines in the grid */
72         static uint32_t thin_grid_line_width () {
73                 return 1;
74         }
75
76         /** @return width of thick lines in the grid */
77         static uint32_t thick_grid_line_width () {
78                 return 2;
79         }
80
81         /** @return space around the connection indicator */
82         static uint32_t connection_indicator_pad () {
83                 return 8;
84         }
85
86         /** @return angle of column labels, in radians */
87         static double angle () {
88                 return M_PI / 4;
89         }
90
91         /* XXX I guess these colours should come from a theme, or something */
92
93         /** @return background colour */
94         static Gdk::Color background_colour () {
95                 return Gdk::Color ("#000000");
96         }
97
98         /** @return text colour */
99         static Gdk::Color text_colour () {
100                 return Gdk::Color ("#ffffff");
101         }
102
103         /** @return grid line colour */
104         static Gdk::Color grid_colour () {
105                 return Gdk::Color ("#333333");
106         }
107
108         /** @return colour of association blobs */
109         static Gdk::Color association_colour () {
110                 return Gdk::Color ("#00ff00");
111         }
112
113         /** @return colour to paint grid squares when they can't be associated */
114         static Gdk::Color unknown_colour () {
115                 return Gdk::Color ("#cccccc");
116         }
117
118         /* XXX */
119         static Gdk::Color get_a_bundle_colour (int x) {
120                 if ((x % 2) == 0) {
121                         return Gdk::Color ("#547027");
122                 } else {
123                         return Gdk::Color ("#3552a6");
124                 }
125         }
126
127         /* XXX */
128         static Gdk::Color get_a_group_colour (int x) {
129                 if ((x % 2) == 0) {
130                         return Gdk::Color ("#222222");
131                 } else {
132                         return Gdk::Color ("#444444");
133                 }
134         }
135         
136         void set_source_rgb (cairo_t *, Gdk::Color const &);
137         void set_source_rgba (cairo_t *, Gdk::Color const &, double);
138         std::pair<std::string, double> display_port_name (cairo_t*, std::string const &, double) const;
139
140         /** Render the complete component to a cairo context. */
141         virtual void render (cairo_t *) = 0;
142         /** Compute any required dimensions.  This must set up
143          *  _width and _height.
144          */
145         virtual void compute_dimensions () = 0;
146
147         PortMatrixBody* _body; ///< the PortMatrixBody that we're in
148         uint32_t _width; ///< full width of the contents
149         uint32_t _height; ///< full height of the contents
150
151 private:        
152         GdkPixmap* _pixmap; ///< pixmap
153         bool _render_required; ///< true if the rendered pixmap is out of date
154         bool _dimension_computation_required; ///< true if the dimensions are out of date
155 };
156
157 #endif