2 Copyright (C) 2012 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.
24 #include <gtkmm/toggleaction.h>
26 #include "pbd/compose.h"
27 #include "gtkmm2ext/utils.h"
28 #include "gtkmm2ext/rgb_macros.h"
30 #include "button_joiner.h"
32 #include "ui_config.h"
35 using namespace ARDOUR_UI_UTILS;
37 ButtonJoiner::ButtonJoiner (const std::string& str, Gtk::Widget& lw, Gtk::Widget& rw, bool central_joiner)
41 , active_fill_pattern (0)
42 , inactive_fill_pattern (0)
43 , central_link (central_joiner)
45 packer.set_homogeneous (true);
48 packer.set_spacing (20);
51 packer.pack_start (left);
52 packer.pack_start (right);
55 /* this alignment is how we position the box that holds the two widgets
56 within our allocation, and how we request more space around them.
63 align.set_padding (9, 0, 9, 9);
66 align.set_padding (1, 1, 1, 1);
73 add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|
74 Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
76 uint32_t border_color;
79 border_color = UIConfiguration::instance().color (string_compose ("%1: border end", name));
80 UINT_TO_RGBA (border_color, &r, &g, &b, &a);
86 /* child cairo widgets need the color of the inner edge as their
91 col.set_rgb_p (border_r, border_g, border_b);
92 provide_background_for_cairo_widget (*this, col);
95 ButtonJoiner::~ButtonJoiner ()
97 if (active_fill_pattern) {
98 cairo_pattern_destroy (active_fill_pattern);
99 cairo_pattern_destroy (inactive_fill_pattern);
104 ButtonJoiner::render (cairo_t* cr, cairo_rectangle_t*)
106 double h = get_height();
109 cairo_set_source (cr, inactive_fill_pattern);
111 cairo_set_source (cr, active_fill_pattern);
117 Gtkmm2ext::rounded_top_rectangle (cr, 0, 0, get_width(), h, 8);
118 cairo_fill_preserve (cr);
122 cairo_set_line_width (cr, 1.5);
123 cairo_set_source_rgb (cr, border_r, border_g, border_b);
128 Gtkmm2ext::rounded_top_rectangle (cr, 8, 8, get_width() - 16, h - 8, 6);
132 Gtkmm2ext::rounded_top_rectangle (cr, 0, 0, (get_width() - 20.0)/2.0 , h, 8);
133 cairo_fill_preserve (cr);
135 Gtkmm2ext::rounded_top_rectangle (cr, (get_width() - 20.)/2.0 + 20.0, 0.0,
136 (get_width() - 20.0)/2.0 , h, 8);
137 cairo_fill_preserve (cr);
139 cairo_move_to (cr, get_width()/2.0 - 10.0, h/2.0);
140 cairo_set_line_width (cr, 1.5);
141 cairo_rel_line_to (cr, 20.0, 0.0);
142 cairo_set_source (cr, active_fill_pattern);
145 cairo_arc (cr, get_width()/2.0, h/2.0, 6.0, 0, M_PI*2.0);
146 cairo_set_line_width (cr, 1.5);
147 cairo_fill_preserve (cr);
148 cairo_set_source_rgb (cr, border_r, border_g, border_b);
155 ButtonJoiner::on_size_allocate (Allocation& alloc)
157 CairoWidget::on_size_allocate (alloc);
162 ButtonJoiner::on_button_release_event (GdkEventButton*)
165 _action->activate ();
172 ButtonJoiner::on_size_request (Gtk::Requisition* r)
174 CairoWidget::on_size_request (r);
178 ButtonJoiner::set_related_action (Glib::RefPtr<Action> act)
180 Gtkmm2ext::Activatable::set_related_action (act);
184 action_tooltip_changed ();
186 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (_action);
189 tact->signal_toggled().connect (sigc::mem_fun (*this, &ButtonJoiner::action_toggled));
192 _action->connect_property_changed ("sensitive", sigc::mem_fun (*this, &ButtonJoiner::action_sensitivity_changed));
193 _action->connect_property_changed ("visible", sigc::mem_fun (*this, &ButtonJoiner::action_visibility_changed));
194 _action->connect_property_changed ("tooltip", sigc::mem_fun (*this, &ButtonJoiner::action_tooltip_changed));
199 ButtonJoiner::action_sensitivity_changed ()
201 if (_action->property_sensitive ()) {
202 set_visual_state (Gtkmm2ext::VisualState (visual_state() & ~Gtkmm2ext::Insensitive));
204 set_visual_state (Gtkmm2ext::VisualState (visual_state() | Gtkmm2ext::Insensitive));
210 ButtonJoiner::action_visibility_changed ()
212 if (_action->property_visible ()) {
220 ButtonJoiner::action_tooltip_changed ()
222 std::string str = _action->property_tooltip().get_value();
223 set_tooltip (*this, str);
227 ButtonJoiner::action_toggled ()
229 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (_action);
232 set_active (tact->get_active());
237 ButtonJoiner::set_active_state (Gtkmm2ext::ActiveState s)
239 bool changed = (_active_state != s);
240 CairoWidget::set_active_state (s);
247 ButtonJoiner::set_colors ()
249 uint32_t start_color;
253 if (active_fill_pattern) {
254 cairo_pattern_destroy (active_fill_pattern);
255 cairo_pattern_destroy (inactive_fill_pattern);
258 active_fill_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height());
259 inactive_fill_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height());
261 start_color = UIConfiguration::instance().color (string_compose ("%1: fill start", name));
262 end_color = UIConfiguration::instance().color (string_compose ("%1: fill end", name));
263 UINT_TO_RGBA (start_color, &r, &g, &b, &a);
264 cairo_pattern_add_color_stop_rgba (inactive_fill_pattern, 0, r/255.0,g/255.0,b/255.0, a/255.0);
265 UINT_TO_RGBA (end_color, &r, &g, &b, &a);
266 cairo_pattern_add_color_stop_rgba (inactive_fill_pattern, 1, r/255.0,g/255.0,b/255.0, a/255.0);
268 start_color = UIConfiguration::instance().color (string_compose ("%1: fill start active", name));
269 end_color = UIConfiguration::instance().color (string_compose ("%1: fill end active", name));
270 UINT_TO_RGBA (start_color, &r, &g, &b, &a);
271 cairo_pattern_add_color_stop_rgba (active_fill_pattern, 0, r/255.0,g/255.0,b/255.0, a/255.0);
272 UINT_TO_RGBA (end_color, &r, &g, &b, &a);
273 cairo_pattern_add_color_stop_rgba (active_fill_pattern, 1, r/255.0,g/255.0,b/255.0, a/255.0);