cwidget
0.5.16
|
00001 // togglebutton.h -*-c++-*- 00002 // 00003 // I like having a "togglable" button which doesn't force a particular 00004 // policy..it makes radio buttons much easier to do right. 00005 00006 #ifndef TOGGLEBUTTON_H 00007 #define TOGGLEBUTTON_H 00008 00009 #include "button.h" 00010 00011 #include <sigc++/functors/mem_fun.h> 00012 00013 namespace cwidget 00014 { 00015 namespace widgets 00016 { 00017 class togglebutton:public button 00018 { 00019 bool checked; 00020 char bracketl, mark, bracketr; 00021 00022 void paint_check(int row); 00023 00024 protected: 00025 void silent_set_checked(bool _checked); 00026 // to be used mainly to avoid emitting signals (eg, if you're trying to 00027 // coordinate a togglebutton with an underlying option) 00028 00029 togglebutton(char _bracketl, char _mark, char _bracketr, 00030 fragment *_label, bool _checked); 00031 00032 togglebutton(char _bracketl, char _mark, char _bracketr, 00033 const std::string &_label, bool _checked); 00034 00035 public: 00036 static util::ref_ptr<togglebutton> 00037 create(char bracketl, char mark, char bracketr, 00038 fragment *label, bool checked = false) 00039 { 00040 util::ref_ptr<togglebutton> 00041 rval(new togglebutton(bracketl, mark, bracketr, 00042 label, checked)); 00043 rval->decref(); 00044 return rval; 00045 } 00046 00047 static util::ref_ptr<togglebutton> 00048 create(char bracketl, char mark, char bracketr, 00049 const std::string &label, bool checked = false) 00050 { 00051 util::ref_ptr<togglebutton> 00052 rval(new togglebutton(bracketl, mark, bracketr, 00053 label, checked)); 00054 rval->decref(); 00055 return rval; 00056 } 00057 00058 point get_cursorloc(); 00059 00060 void paint(const style &st); 00061 00062 bool get_checked() {return checked;} 00063 void set_checked(bool _checked) 00064 { 00065 if(checked!=_checked) 00066 do_toggle(); 00067 } 00068 00069 // named "do_toggle" to avoid typos wrt "toggled" 00070 void do_toggle(); 00071 00072 sigc::signal0<void> toggled; 00073 }; 00074 00075 class checkbutton:public togglebutton 00076 { 00077 protected: 00078 checkbutton(fragment *_label, bool _checked) 00079 :togglebutton('[', 'X', ']', _label, _checked) 00080 { 00081 pressed.connect(sigc::mem_fun(*this, &togglebutton::do_toggle)); 00082 } 00083 00084 checkbutton(const std::string &_label, bool _checked) 00085 :togglebutton('[', 'X', ']', _label, _checked) 00086 { 00087 pressed.connect(sigc::mem_fun(*this, &togglebutton::do_toggle)); 00088 } 00089 00090 checkbutton(char bracketr, char mark, char bracketl, 00091 fragment *_label, bool _checked) 00092 :togglebutton(bracketr, mark, bracketl, _label, _checked) 00093 { 00094 pressed.connect(sigc::mem_fun(*this, &togglebutton::do_toggle)); 00095 } 00096 00097 checkbutton(char bracketr, char mark, char bracketl, 00098 const std::string &_label, bool _checked) 00099 :togglebutton(bracketr, mark, bracketl, _label, _checked) 00100 { 00101 pressed.connect(sigc::mem_fun(*this, &togglebutton::do_toggle)); 00102 } 00103 00104 public: 00105 static util::ref_ptr<checkbutton> 00106 create(fragment *label, bool checked = false) 00107 { 00108 return new checkbutton(label, checked); 00109 } 00110 00111 static util::ref_ptr<checkbutton> 00112 create(const std::string &label, bool checked = false) 00113 { 00114 return new checkbutton(label, checked); 00115 } 00116 00117 static util::ref_ptr<checkbutton> 00118 create(char bracketr, char mark, char bracketl, 00119 fragment *label, bool checked = false) 00120 { 00121 return new checkbutton(bracketr, mark, bracketl, 00122 label, checked); 00123 } 00124 00125 static util::ref_ptr<checkbutton> 00126 create(char bracketr, char mark, char bracketl, 00127 const std::string &label, bool checked = false) 00128 { 00129 return new checkbutton(bracketr, mark, bracketl, 00130 label, checked); 00131 } 00132 }; 00133 00134 class radiobutton:public togglebutton 00135 { 00136 protected: 00137 radiobutton(fragment *_label, bool _checked) 00138 :togglebutton('(', '*', ')', _label, _checked) 00139 { 00140 } 00141 00142 radiobutton(const std::string &_label, bool _checked) 00143 :togglebutton('(', '*', ')', _label, _checked) 00144 { 00145 } 00146 00147 public: 00148 static util::ref_ptr<radiobutton> 00149 create(fragment *label, bool checked = false) 00150 { 00151 return new radiobutton(label, checked); 00152 } 00153 00154 static util::ref_ptr<radiobutton> 00155 create(const std::string &label, bool checked = false) 00156 { 00157 return new radiobutton(label, checked); 00158 } 00159 }; 00160 00161 typedef util::ref_ptr<togglebutton> togglebutton_ref; 00162 typedef util::ref_ptr<checkbutton> checkbutton_ref; 00163 typedef util::ref_ptr<radiobutton> radiobutton_ref; 00164 } 00165 } 00166 00167 #endif