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__
24 #include <gtkmm/eventbox.h>
25 #include <boost/shared_ptr.hpp>
38 /** One component of the PortMatrix. This is a cairo-rendered
41 class PortMatrixComponent
44 PortMatrixComponent (PortMatrix
*, PortMatrixBody
*);
45 virtual ~PortMatrixComponent ();
47 virtual double component_to_parent_x (double x
) const = 0;
48 virtual double parent_to_component_x (double x
) const = 0;
49 virtual double component_to_parent_y (double y
) const = 0;
50 virtual double parent_to_component_y (double y
) const = 0;
51 virtual void mouseover_changed (std::list
<PortMatrixNode
> const &) = 0;
52 virtual void draw_extra (cairo_t
*) = 0;
53 virtual void button_press (double, double, int, uint32_t, guint
) {}
54 virtual void button_release (double, double, int, uint32_t, guint
) {}
55 virtual void motion (double, double) {}
57 void set_show_ports (bool);
59 GdkPixmap
* get_pixmap (GdkDrawable
*);
60 std::pair
<uint32_t, uint32_t> dimensions ();
62 void require_render () {
63 _render_required
= true;
66 void require_rebuild () {
67 _dimension_computation_required
= true;
68 _render_required
= true;
71 void set_parent_rectangle (Gdk::Rectangle
const & r
) {
72 _parent_rectangle
= r
;
75 Gdk::Rectangle
parent_rectangle () const {
76 return _parent_rectangle
;
79 /** @return grid spacing */
80 static uint32_t grid_spacing () {
86 /** @return width of borders drawn around labels */
87 static uint32_t label_border_width () {
91 /** @return padding between a name and the nearest line */
92 static uint32_t name_pad () {
96 /** @return width of thin lines in the grid */
97 static double thin_grid_line_width () {
101 /** @return width of thick lines in the grid */
102 static double thick_grid_line_width () {
106 /** @return space around the connection indicator */
107 static uint32_t connection_indicator_pad () {
111 static uint32_t mouseover_line_width () {
115 /** @return angle of column labels, in radians */
116 static double angle () {
120 /** @return background colour */
121 Gdk::Color
background_colour ();
123 /* XXX I guess these colours should come from a theme, or something */
125 /** @return text colour */
126 static Gdk::Color
text_colour () {
127 return Gdk::Color ("#ffffff");
130 /** @return grid line colour */
131 static Gdk::Color
grid_colour () {
132 return Gdk::Color ("#000000");
135 /** @return colour of association blobs */
136 static Gdk::Color
association_colour () {
137 return Gdk::Color ("#00ff00");
140 /** @return colour to paint grid squares when they can't be associated */
141 static Gdk::Color
non_connectable_colour () {
142 return Gdk::Color ("#cccccc");
145 /** @return colour to paint mouseover lines */
146 static Gdk::Color
mouseover_line_colour () {
147 return Gdk::Color ("#ff0000");
150 /** @return colour to paint channel highlights */
151 static Gdk::Color
highlighted_channel_colour () {
152 return Gdk::Color ("#777777");
156 static Gdk::Color
get_a_bundle_colour (int x
) {
158 return Gdk::Color ("#547027");
160 return Gdk::Color ("#3552a6");
165 static Gdk::Color
get_a_group_colour (int x
) {
167 return Gdk::Color ("#222222");
169 return Gdk::Color ("#444444");
173 void set_source_rgb (cairo_t
*, Gdk::Color
const &);
174 void set_source_rgba (cairo_t
*, Gdk::Color
const &, double);
175 uint32_t group_size (boost::shared_ptr
<const PortGroup
>) const;
176 uint32_t channel_to_position (ARDOUR::BundleChannel
, boost::shared_ptr
<const PortGroup
>) const;
177 virtual ARDOUR::BundleChannel
position_to_channel (double, double, boost::shared_ptr
<const PortGroup
>) const;
179 /** Render the complete component to a cairo context. */
180 virtual void render (cairo_t
*) = 0;
181 /** Compute any required dimensions. This must set up
182 * _width and _height.
184 virtual void compute_dimensions () = 0;
187 PortMatrixBody
* _body
; ///< the PortMatrixBody that we're in
188 uint32_t _width
; ///< full width of the contents
189 uint32_t _height
; ///< full height of the contents
190 Gdk::Rectangle _parent_rectangle
;
193 GdkPixmap
* _pixmap
; ///< pixmap
194 bool _render_required
; ///< true if the rendered pixmap is out of date
195 bool _dimension_computation_required
; ///< true if the dimensions are out of date