1 /* 2 * Copyright (C) 2005 Paul Davis <paul@linuxaudiosystems.com> 3 * Copyright (C) 2017 Robin Gareus <robin@gareus.org> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 #ifndef _WIDGETS_STATEFUL_BUTTON_H_ 21 #define _WIDGETS_STATEFUL_BUTTON_H_ 22 23 #include <vector> 24 25 #include <gtkmm/togglebutton.h> 26 27 #include "widgets/visibility.h" 28 29 namespace ArdourWidgets { 30 31 class LIBWIDGETS_API StateButton 32 { 33 public: 34 StateButton(); ~StateButton()35 virtual ~StateButton() {} 36 37 void set_visual_state (int); get_visual_state()38 int get_visual_state () { return visual_state; } set_self_managed(bool yn)39 void set_self_managed (bool yn) { _self_managed = yn; } 40 virtual void set_widget_name (const std::string& name) = 0; 41 42 protected: 43 int visual_state; 44 bool _self_managed; 45 bool _is_realized; 46 bool style_changing; 47 Gtk::StateType state_before_prelight; 48 bool is_toggle; 49 50 virtual std::string get_widget_name() const = 0; 51 virtual Gtk::Widget* get_child_widget () = 0; 52 53 void avoid_prelight_on_style_changed (const Glib::RefPtr<Gtk::Style>& style, GtkWidget* widget); 54 void avoid_prelight_on_state_changed (Gtk::StateType old_state, GtkWidget* widget); 55 }; 56 57 58 class LIBWIDGETS_API StatefulToggleButton : public StateButton, public Gtk::ToggleButton 59 { 60 public: 61 StatefulToggleButton(); 62 explicit StatefulToggleButton(const std::string &label); ~StatefulToggleButton()63 ~StatefulToggleButton() {} 64 void set_widget_name (const std::string& name); 65 66 protected: 67 void on_realize (); 68 void on_toggled (); 69 void on_style_changed (const Glib::RefPtr<Gtk::Style>& style); 70 void on_state_changed (Gtk::StateType old_state); 71 72 Gtk::Widget* get_child_widget (); get_widget_name()73 std::string get_widget_name() const { return get_name(); } 74 }; 75 76 class LIBWIDGETS_API StatefulButton : public StateButton, public Gtk::Button 77 { 78 public: 79 StatefulButton(); 80 explicit StatefulButton(const std::string &label); ~StatefulButton()81 virtual ~StatefulButton() {} 82 void set_widget_name (const std::string& name); 83 84 protected: 85 void on_realize (); 86 void on_style_changed (const Glib::RefPtr<Gtk::Style>& style); 87 void on_state_changed (Gtk::StateType old_state); 88 89 Gtk::Widget* get_child_widget (); get_widget_name()90 std::string get_widget_name() const { return get_name(); } 91 }; 92 93 } /* end namespace */ 94 95 #endif 96