fixes for new button code; don't even make destructible sources non-writable; add...
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / stateful_button.h
1 /*
2     Copyright (C) 2005 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     $Id$
19 */
20
21 #ifndef __pbd_gtkmm_abutton_h__
22 #define __pbd_gtkmm_abutton_h__
23
24 #include <vector>
25
26 #include <gtkmm/togglebutton.h>
27
28 namespace Gtkmm2ext {
29
30 class StateButton 
31 {
32    public:
33         StateButton();
34         virtual ~StateButton() {}
35
36         void set_colors (const std::vector<Gdk::Color>& colors);
37         void set_visual_state (int);
38         int  get_visual_state () { return visual_state; }
39
40   protected:
41         std::vector<Gdk::Color> colors;
42         int  visual_state;
43         Gdk::Color saved_bg;
44         bool have_saved_bg;
45         
46         virtual void bg_modify (Gtk::StateType, Gdk::Color) = 0;
47 };
48
49
50 class StatefulToggleButton : public StateButton, public Gtk::ToggleButton
51 {
52    public:
53         StatefulToggleButton() {}
54         explicit StatefulToggleButton(const std::string &label) : Gtk::ToggleButton (label) {}
55         ~StatefulToggleButton() {}
56
57   protected:
58         void on_realize ();
59         void on_toggled ();
60
61         void bg_modify (Gtk::StateType state, Gdk::Color col) { 
62                 modify_bg (state, col);
63         }
64 };
65
66 class StatefulButton : public StateButton, public Gtk::Button
67 {
68    public:
69         StatefulButton() {}
70         explicit StatefulButton(const std::string &label) : Gtk::Button (label) {}
71         virtual ~StatefulButton() {}
72
73   protected:
74         void on_realize ();
75
76         void bg_modify (Gtk::StateType state, Gdk::Color col) { 
77                 modify_bg (state, col);
78         }
79 };
80
81 };
82
83 #endif