Empirical
Button.h
Go to the documentation of this file.
1 
32 #ifndef EMP_WEB_BUTTON_H
33 #define EMP_WEB_BUTTON_H
34 
35 
36 #include "Widget.h"
37 
38 namespace emp {
39 namespace web {
40 
42  class Button : public internal::WidgetFacet<Button> {
43  friend class ButtonInfo;
44  protected:
45 
46  // Buttons associated with the same DOM element share a single ButtonInfo object.
48  friend Button;
49  protected:
50  std::string label;
51  std::string title;
52 
53  bool autofocus;
54 
55  std::function<void()> callback;
56  uint32_t callback_id;
57  std::string onclick_info;
58 
59  ButtonInfo(const std::string & in_id="") : internal::WidgetInfo(in_id) { ; }
60  ButtonInfo(const ButtonInfo &) = delete; // No copies of INFO allowed
61  ButtonInfo & operator=(const ButtonInfo &) = delete; // No copies of INFO allowed
62  virtual ~ButtonInfo() {
63  if (callback_id) emp::JSDelete(callback_id); // Delete callback wrapper.
64  }
65 
66  std::string TypeName() const override { return "ButtonInfo"; }
67 
68  virtual bool IsButtonInfo() const override { return true; }
69 
70  void DoCallback() {
71  callback();
73  }
74 
75  virtual void GetHTML(std::stringstream & HTML) override {
76  HTML.str(""); // Clear the current text.
77  HTML << "<button"; // Start the button tag.
78  if (title != "") HTML << " title=\"" << title << "\""; // Add a title if there is one.
79  HTML << " id=\"" << id << "\""; // Indicate ID.
80  HTML << " onclick=\"" << onclick_info << "\""; // Indicate action on click.
81  HTML << ">" << label << "</button>"; // Close and label the button.
82  }
83 
84  void UpdateCallback(const std::function<void()> & in_cb) {
85  callback = in_cb;
86  }
87 
88  void UpdateLabel(const std::string & in_label) {
89  label = in_label;
90  if (state == Widget::ACTIVE) ReplaceHTML(); // If node is active, immediately redraw!
91  }
92  void UpdateTitle(const std::string & in_title) {
93  title = in_title;
94  if (state == Widget::ACTIVE) ReplaceHTML(); // If node is active, immediately redraw!
95  }
96  void UpdateAutofocus(bool in_af) {
97  autofocus = in_af;
98  if (state == Widget::ACTIVE) ReplaceHTML(); // If node is active, immediately redraw!
99  }
100  void UpdateDisabled(bool in_dis) {
101  if (in_dis) extras.SetAttr("disabled", "true");
102  else extras.RemoveAttr("disabled");
103  if (state == Widget::ACTIVE) ReplaceHTML(); // If node is active, immediately redraw!
104  }
105 
106  public:
107  virtual std::string GetType() override { return "web::ButtonInfo"; }
108  }; // End of ButtonInfo definition
109 
110 
111  // Get a properly cast version of indo.
112  ButtonInfo * Info() { return (ButtonInfo *) info; }
113  const ButtonInfo * Info() const { return (ButtonInfo *) info; }
114 
115  Button(ButtonInfo * in_info) : WidgetFacet(in_info) { ; }
116 
117  public:
118 
123  Button(const std::function<void()> & in_cb, const std::string & in_label,
124  const std::string & in_id="")
125  : WidgetFacet(in_id)
126  {
127  info = new ButtonInfo(in_id);
128 
129  Info()->label = in_label;
130  Info()->title = "";
131  Info()->autofocus = false;
132 
133  Info()->callback = in_cb;
134  ButtonInfo * b_info = Info();
135  Info()->callback_id = JSWrap( std::function<void()>( [b_info](){b_info->DoCallback();} ) );
136  Info()->onclick_info = emp::to_string("emp.Callback(", Info()->callback_id, ")");
137  }
138 
140  Button(const Button & in) : WidgetFacet(in) { ; }
142  Button() : WidgetFacet("") { info = nullptr; }
143  virtual ~Button() { ; }
144 
146 
148  Button & Callback(const std::function<void()> & in_cb) {
149  Info()->UpdateCallback(in_cb);
150  return *this;
151  }
152 
154  Button & Label(const std::string & in_label) { Info()->UpdateLabel(in_label); return *this; }
155 
157  Button & Title(const std::string & in_t) { Info()->UpdateTitle(in_t); return *this; }
158 
160  Button & Autofocus(bool in_af=true) { Info()->UpdateAutofocus(in_af); return *this; }
161 
163  Button & Disabled(bool in_dis=true) { Info()->UpdateDisabled(in_dis); return *this; }
164 
166  const std::string & GetLabel() const { return Info()->label; }
167 
169  const std::string & GetTitle() const { return Info()->title; }
170 
172  bool HasAutofocus() const { return Info()->autofocus; }
173 
175  bool IsDisabled() const { return Info()->extras.HasAttr("disabled"); }
176  };
177 
178 
179 }
180 }
181 
182 #endif
virtual void GetHTML(std::stringstream &HTML) override
Definition: Button.h:75
Definition: Widget.h:206
virtual void ReplaceHTML()
Definition: Widget.h:319
Button & Disabled(bool in_dis=true)
Setup this button to be disabled (or re-enable it!)
Definition: Button.h:163
const std::string & GetLabel() const
Get the current label on this button.
Definition: Button.h:166
std::string to_string(ALL_TYPES &&...all_values)
Definition: string_utils.h:511
const std::string & GetTitle() const
Get the current tooltip on this button.
Definition: Button.h:169
void UpdateTitle(const std::string &in_title)
Definition: Button.h:92
Definition: Button.h:47
WidgetInfo * info
Information associated with this widget.
Definition: Widget.h:82
WidgetFacet is a template that provides accessors into Widget with a derived return type...
Definition: Widget.h:543
virtual ~Button()
Definition: Button.h:143
std::string TypeName() const override
Debugging helpers...
Definition: Button.h:66
Button & Title(const std::string &in_t)
Create a tooltip for this Button.
Definition: Button.h:157
std::function< void()> callback
Definition: Button.h:55
virtual bool IsButtonInfo() const
Definition: Widget.h:240
void RemoveAttr(const std::string &setting)
Definition: WidgetExtras.h:36
void UpdateCallback(const std::function< void()> &in_cb)
Definition: Button.h:84
Definition: Widget.h:102
ButtonInfo * Info()
Definition: Button.h:112
bool HasAttr(const std::string &setting) const
Definition: WidgetExtras.h:34
WidgetExtras extras
HTML attributes, CSS style, and listeners for web events.
Definition: Widget.h:213
Button(const Widget &in)
Definition: Button.h:141
Widget::ActivityState state
Is this element active in DOM?
Definition: Widget.h:218
std::string title
Definition: Button.h:51
Button(ButtonInfo *in_info)
Definition: Button.h:115
ButtonInfo & operator=(const ButtonInfo &)=delete
void SetAttr(const std::string &s, SET_TYPE v)
Definition: WidgetExtras.h:33
virtual bool IsButtonInfo() const override
Definition: Button.h:68
Button()
Definition: Button.h:142
bool autofocus
Definition: Button.h:53
Widgets maintain individual components on a web page and link to Elements.
Button(const std::function< void()> &in_cb, const std::string &in_label, const std::string &in_id="")
Definition: Button.h:123
std::string onclick_info
Definition: Button.h:57
If we are in emscripten, make sure to include the header.
Definition: array.h:37
Button & Label(const std::string &in_label)
Set a new label to appear on this Button.
Definition: Button.h:154
Button & Autofocus(bool in_af=true)
Setup this button to have autofocus (or remove it!)
Definition: Button.h:160
void UpdateAutofocus(bool in_af)
Definition: Button.h:96
Create or control an HTML Button object that you can manipulate and update as needed.
Definition: Button.h:42
Widget is effectively a smart pointer to a WidgetInfo object, plus some basic accessors.
Definition: Widget.h:78
bool HasAutofocus() const
Determine if this button currently has autofocus.
Definition: Button.h:172
virtual ~ButtonInfo()
Definition: Button.h:62
uint32_t callback_id
Definition: Button.h:56
#define emp_assert(...)
Definition: assert.h:199
virtual std::string GetType() override
Definition: Button.h:107
void UpdateLabel(const std::string &in_label)
Definition: Button.h:88
void DoCallback()
Definition: Button.h:70
void UpdateDisabled(bool in_dis)
Definition: Button.h:100
const ButtonInfo * Info() const
Definition: Button.h:113
Button & Callback(const std::function< void()> &in_cb)
Set a new callback function to trigger when the button is clicked.
Definition: Button.h:148
bool IsDisabled() const
Determine if this button is currently disabled.
Definition: Button.h:175
void UpdateDependants()
Definition: Widget.h:274
Button(const Button &in)
Link to an existing button.
Definition: Button.h:140
std::string label
Definition: Button.h:50
WidgetFacet(const std::string &in_id="")
WidgetFacet cannot be built unless within derived class, so constructors are protected.
Definition: Widget.h:546
ButtonInfo(const std::string &in_id="")
Definition: Button.h:59