Some small-ish port matrix rendering improvements.
[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         /* XXX */
114         static Gdk::Color get_a_bundle_colour (int x) {
115                 if ((x % 2) == 0) {
116                         return Gdk::Color ("#547027");
117                 } else {
118                         return Gdk::Color ("#3552a6");
119                 }
120         }
121
122         void set_source_rgb (cairo_t *, Gdk::Color const &);
123         void set_source_rgba (cairo_t *, Gdk::Color const &, double);
124
125         /** Render the complete component to a cairo context. */
126         virtual void render (cairo_t *) = 0;
127         /** Compute any required dimensions.  This must set up
128          *  _width and _height.
129          */
130         virtual void compute_dimensions () = 0;
131
132         PortMatrixBody* _body; ///< the PortMatrixBody that we're in
133         uint32_t _width; ///< full width of the contents
134         uint32_t _height; ///< full height of the contents
135
136 private:        
137         GdkPixmap* _pixmap; ///< pixmap
138         bool _render_required; ///< true if the rendered pixmap is out of date
139         bool _dimension_computation_required; ///< true if the dimensions are out of date
140 };
141
142 #endif