#ifndef GUIBUTTON_HEADER #define GUIBUTTON_HEADER 1 ///////////////////////////////////////////////// //! docentry="GUI.Widget" //! rcsid="$Id: Button.hh,v 1.11 2001/03/07 18:30:39 ees1cg Exp $" //! file="amma/GUI/GTK/Button.hh" //! lib=GUI //! author="Charles Galambos" //! example=exButton.cc //! date="23/03/99" #include "amma/GUI/Render.hh" #include "amma/GUI/GTKTypes.hh" #include "amma/GUI/Widget.hh" #include "amma/GUI/Pixmap.hh" #include "amma/DP/Signal1.hh" #include "amma/DP/Signal2.hh" class GUIButtonC; //! userlevel=Develop //: Button body. class GUIButtonBodyC : public GUIWidgetBodyC { public: GUIButtonBodyC(const char *label = 0,const char *tooltip = 0); //: Constructor. GUIButtonBodyC(const char *nlabel,const GUIPixmapC &pixm); //: Constructor. virtual BooleanT Create(); //: Create the widget. protected: virtual GtkWidget *BuildWidget(const char *lab = 0); //: Create the actual widget. // This allows different types of buttons to // be created easily. BooleanT state; GUIPixmapC pix; const char *label; // 0 == none. friend class GUIButtonC; }; //! userlevel=Normal //: Button handle. class GUIButtonC : public GUIWidgetC { public: GUIButtonC(const char *label = 0,const char *tooltip = 0); //: Create a button. GUIButtonC(const GUIPixmapC &pixm,const char *label = 0) : DPEntityC(*new GUIButtonBodyC(label,pixm)) {} //: Create a button. // If label is set to 0 none will be used. GUIButtonC(GUIButtonBodyC &bod) : DPEntityC(bod) {} //: Body constructor. protected: GUIButtonBodyC &Body() { return dynamic_cast(DPEntityC::Body()); } //: Access body. const GUIButtonBodyC &Body() const { return dynamic_cast(DPEntityC::Body()); } //: Access body. public: Signal0C SigClicked() { return Body().Signal("clicked"); } //: Short cut clicked signal. friend class GUIButtonBodyC; }; namespace StdGUI { inline GUIButtonC Button(const char *label,const char *tooltip = 0) { GUIButtonC ret; if(tooltip != 0) ret = GUIButtonC(label,tooltip); else ret = GUIButtonC(label); return ret; } //: Create a button with no function attached. // here just for consistancy. template GUIButtonC Button(const char *label,void (*func)(GUIButtonC &, DataT &ref),const DataT &dat = DataT()) { GUIButtonC ret = GUIButtonC(label); StdDP::Connect(ret.Signal("clicked"),func,ret,dat); return ret; } template GUIButtonC Button(const char *label,const char *tooltip,void (*func)(GUIButtonC &, DataT &ref),const DataT &dat = DataT()) { GUIButtonC ret = GUIButtonC(label,tooltip); StdDP::Connect(ret.Signal("clicked"),func,ret,dat); return ret; } template GUIButtonC Button(const GUIPixmapC &pix,void (*func)(GUIButtonC &, DataT &ref),const DataT &dat = DataT()) { GUIButtonC ret = GUIButtonC(pix,0); StdDP::Connect(ret.Signal("clicked"),func,ret,dat); return ret; } template GUIButtonC Button(const GUIPixmapC &pix,const char *label,void (*func)(GUIButtonC &, DataT &ref),const DataT &dat = DataT()) { GUIButtonC ret = GUIButtonC(pix,label); StdDP::Connect(ret.Signal("clicked"),func,ret,dat); return ret; } template GUIButtonC Button(const char *label,const ObjT &obj,void (ObjT::*func)(DataT &dat),const DataT &dat = DataT()) { GUIButtonC ret = GUIButtonC(label); StdDP::Connect(ret.Signal("clicked"),obj,func,dat); return ret; } template GUIButtonC ButtonR(const char *label,ObjT &obj,void (ObjT::*func)(DataT &dat),const DataT &dat = DataT()) { GUIButtonC ret = GUIButtonC(label); StdDP::ConnectRef(ret.Signal("clicked"),obj,func,dat); return ret; } //: Create button that calls a function. // This does NOT make a refrence to obj. template GUIButtonC Button(const char *label,const char *tooltip,const ObjT &obj,void (ObjT::*func)(DataT &dat),const DataT &dat = DataT()) { GUIButtonC ret = GUIButtonC(label,tooltip); StdDP::Connect(ret.Signal("clicked"),obj,func,dat); return ret; } template GUIButtonC Button(const char *label,const ObjT &obj,void (ObjT::*func)()) { GUIButtonC ret = GUIButtonC(label); StdDP::Connect(ret.Signal("clicked"),obj,func); return ret; } //: Create button that calls a function. template GUIButtonC ButtonR(const char *label,ObjT &obj,void (ObjT::*func)()) { GUIButtonC ret = GUIButtonC(label); StdDP::ConnectRef(ret.Signal("clicked"),obj,func); return ret; } //: Create button that calls a function. // This does NOT make a refrence to obj. template GUIButtonC Button(const char *label,const char *tooltip,const ObjT &obj,void (ObjT::*func)()) { GUIButtonC ret = GUIButtonC(label,tooltip); StdDP::Connect(ret.Signal("clicked"),obj,func); return ret; } template GUIButtonC Button(const GUIPixmapC &pix,const ObjT &obj,void (ObjT::*func)()) { GUIButtonC ret = GUIButtonC(pix,0); StdDP::Connect(ret.Signal("clicked"),obj,func); return ret; } } #endif