cf74d3aca048ecb3505189c8ed38e0a56976350c
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / bindable_button.h
1 /*
2     Copyright (C) 2004 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 __bindable_button_h__
21 #define __bindable_button_h__
22
23 #include <string>
24
25 #include "pbd/signals.h"
26
27 #include "gtkmm2ext/visibility.h"
28 #include "gtkmm2ext/stateful_button.h"
29 #include "gtkmm2ext/binding_proxy.h"
30
31 namespace PBD {
32         class Controllable;
33 }
34
35 class LIBGTKMM2EXT_API BindableToggleButton : public Gtkmm2ext::StatefulToggleButton
36 {
37    public:
38         BindableToggleButton (const std::string &label)
39                 : Gtkmm2ext::StatefulToggleButton (label) {}
40         BindableToggleButton () {}
41
42         virtual ~BindableToggleButton() {}
43         
44         bool on_button_press_event (GdkEventButton *ev) {
45                 if (!binding_proxy.button_press_handler (ev)) {
46                         StatefulToggleButton::on_button_press_event (ev);
47                         return false;
48                 } else {
49                         return true;
50                 }
51         }
52         
53         boost::shared_ptr<PBD::Controllable> get_controllable() { return binding_proxy.get_controllable(); }
54         void set_controllable (boost::shared_ptr<PBD::Controllable> c);
55         void watch ();
56
57   protected:
58         void controllable_changed ();
59         PBD::ScopedConnection watch_connection;
60
61   private:
62         BindingProxy binding_proxy;
63 };
64
65 class LIBGTKMM2EXT_API BindableButton : public Gtkmm2ext::StatefulButton
66 {
67    public:
68         BindableButton (boost::shared_ptr<PBD::Controllable> c) : binding_proxy (c) {}
69         ~BindableButton() {}
70         
71         bool on_button_press_event (GdkEventButton *ev) {
72                 if (!binding_proxy.button_press_handler (ev)) {
73                         StatefulButton::on_button_press_event (ev);
74                         return false;
75                 } else {
76                         return true;
77                 }
78         }
79
80         boost::shared_ptr<PBD::Controllable> get_controllable() { return binding_proxy.get_controllable(); }
81         void set_controllable (boost::shared_ptr<PBD::Controllable> c) { binding_proxy.set_controllable (c); }
82
83   private:
84         BindingProxy binding_proxy;
85 };
86
87 #endif