2 Copyright (C) 2002-2009 Paul Davis
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.
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.
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.
20 #ifndef __gtk_ardour_port_matrix_component_h__
21 #define __gtk_ardour_port_matrix_component_h__
23 #include <gtkmm/eventbox.h>
29 /** One component of the PortMatrix. This is a cairo-rendered
32 class PortMatrixComponent
35 PortMatrixComponent (PortMatrix *, PortMatrixBody *);
36 virtual ~PortMatrixComponent ();
38 virtual double component_to_parent_x (double x) const = 0;
39 virtual double parent_to_component_x (double x) const = 0;
40 virtual double component_to_parent_y (double y) const = 0;
41 virtual double parent_to_component_y (double y) const = 0;
42 virtual void mouseover_changed (PortMatrixNode const &) = 0;
43 virtual void draw_extra (cairo_t *) = 0;
46 GdkPixmap* get_pixmap (GdkDrawable *);
47 std::pair<uint32_t, uint32_t> dimensions ();
49 void require_render () {
50 _render_required = true;
53 void require_rebuild () {
54 _dimension_computation_required = true;
55 _render_required = true;
58 void set_parent_rectangle (Gdk::Rectangle const & r) {
59 _parent_rectangle = r;
62 Gdk::Rectangle parent_rectangle () const {
63 return _parent_rectangle;
66 /** @return width of columns in the grid */
67 static uint32_t column_width () {
71 /** @return height of rows in the grid */
72 static uint32_t row_height () {
78 /** @return width of borders drawn around labels */
79 static uint32_t label_border_width () {
83 /** @return padding between a name and the nearest line */
84 static uint32_t name_pad () {
88 /** @return width of thin lines in the grid */
89 static uint32_t thin_grid_line_width () {
93 /** @return width of thick lines in the grid */
94 static uint32_t thick_grid_line_width () {
98 /** @return space around the connection indicator */
99 static uint32_t connection_indicator_pad () {
103 static uint32_t mouseover_line_width () {
107 /** @return angle of column labels, in radians */
108 static double angle () {
112 /* XXX I guess these colours should come from a theme, or something */
114 /** @return background colour */
115 static Gdk::Color background_colour () {
116 return Gdk::Color ("#000000");
119 /** @return text colour */
120 static Gdk::Color text_colour () {
121 return Gdk::Color ("#ffffff");
124 /** @return grid line colour */
125 static Gdk::Color grid_colour () {
126 return Gdk::Color ("#333333");
129 /** @return colour of association blobs */
130 static Gdk::Color association_colour () {
131 return Gdk::Color ("#00ff00");
134 /** @return colour to paint grid squares when they can't be associated */
135 static Gdk::Color unknown_colour () {
136 return Gdk::Color ("#cccccc");
139 /** @return colour to paint mouseover lines */
140 static Gdk::Color mouseover_line_colour () {
141 return Gdk::Color ("#ff0000");
144 /** @return colour to paint mouseover lines */
145 static Gdk::Color mouseover_port_colour () {
146 return Gdk::Color ("#777777");
150 static Gdk::Color get_a_bundle_colour (int x) {
152 return Gdk::Color ("#547027");
154 return Gdk::Color ("#3552a6");
159 static Gdk::Color get_a_group_colour (int x) {
161 return Gdk::Color ("#222222");
163 return Gdk::Color ("#444444");
167 void set_source_rgb (cairo_t *, Gdk::Color const &);
168 void set_source_rgba (cairo_t *, Gdk::Color const &, double);
169 std::pair<std::string, double> display_port_name (cairo_t*, std::string const &, double) const;
171 /** Render the complete component to a cairo context. */
172 virtual void render (cairo_t *) = 0;
173 /** Compute any required dimensions. This must set up
174 * _width and _height.
176 virtual void compute_dimensions () = 0;
179 PortMatrixBody* _body; ///< the PortMatrixBody that we're in
180 uint32_t _width; ///< full width of the contents
181 uint32_t _height; ///< full height of the contents
182 Gdk::Rectangle _parent_rectangle;
185 GdkPixmap* _pixmap; ///< pixmap
186 bool _render_required; ///< true if the rendered pixmap is out of date
187 bool _dimension_computation_required; ///< true if the dimensions are out of date