togglebutton.h

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

Generated on Wed Jan 28 07:23:52 2009 for cwidget by  doxygen 1.5.6