diff options
-rw-r--r-- | dw/fltkplatform.cc | 6 | ||||
-rw-r--r-- | dw/fltkplatform.hh | 3 | ||||
-rw-r--r-- | dw/fltkui.cc | 131 | ||||
-rw-r--r-- | dw/fltkui.hh | 3 | ||||
-rw-r--r-- | dw/ui.hh | 3 | ||||
-rw-r--r-- | src/form.cc | 14 | ||||
-rw-r--r-- | test/dw_ui_test.cc | 5 |
7 files changed, 141 insertions, 24 deletions
diff --git a/dw/fltkplatform.cc b/dw/fltkplatform.cc index 2fc7ff41..67b04688 100644 --- a/dw/fltkplatform.cc +++ b/dw/fltkplatform.cc @@ -413,9 +413,11 @@ FltkPlatform::FltkResourceFactory::createOptionMenuResource () core::ui::EntryResource * FltkPlatform::FltkResourceFactory::createEntryResource (int size, bool password, - const char *label) + const char *label, + const char *placeholder) { - return new ui::FltkEntryResource (platform, size, password, label); + return new ui::FltkEntryResource (platform, size, password, label, + placeholder); } core::ui::MultiLineTextResource * diff --git a/dw/fltkplatform.hh b/dw/fltkplatform.hh index cbf3c6f9..5aa86e62 100644 --- a/dw/fltkplatform.hh +++ b/dw/fltkplatform.hh @@ -110,7 +110,8 @@ private: int rows); core::ui::OptionMenuResource *createOptionMenuResource (); core::ui::EntryResource *createEntryResource (int size, bool password, - const char *label); + const char *label, + const char *placeholder); core::ui::MultiLineTextResource *createMultiLineTextResource (int cols, int rows); core::ui::CheckButtonResource *createCheckButtonResource (bool diff --git a/dw/fltkui.cc b/dw/fltkui.cc index 29008055..80dbb7d5 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -42,18 +42,108 @@ */ /* - * Used to enable CTRL+{a,e,d,k} in form inputs (for start,end,del,cut) + * Used to show optional placeholder text and to enable CTRL+{a,e,d,k} in + * form inputs (for start,end,del,cut) */ class CustInput2 : public Fl_Input { public: CustInput2 (int x, int y, int w, int h, const char* l=0) : - Fl_Input(x,y,w,h,l) {}; + Fl_Input(x,y,w,h,l) { placeholder = NULL; showing_placeholder = false; }; + ~CustInput2 () { if (placeholder) free(placeholder); }; + void set_placeholder(const char *str); + int show_placeholder(); + int show_normal(const char *str); + void textcolor(Fl_Color c); + void input_type(int t); + int value(const char* str); + const char* value(); int handle(int e); +private: + Fl_Color dimmed(Fl_Color c) {return fl_color_average(c, color(), .33f); }; + char *placeholder; + bool showing_placeholder; + Fl_Color usual_color; + int usual_type; }; +/* + * Show normal text. + */ +int CustInput2::show_normal(const char *str) +{ + showing_placeholder = false; + Fl_Input::textcolor(usual_color); + Fl_Input::input_type(usual_type); + return Fl_Input::value(str); +} + +/* + * Show the placeholder text. + */ +int CustInput2::show_placeholder() +{ + showing_placeholder = true; + Fl_Input::textcolor(dimmed(usual_color)); + Fl_Input::input_type(FL_NORMAL_INPUT); + return Fl_Input::value(placeholder); +} + +/* + * Set the placeholder text. + */ +void CustInput2::set_placeholder(const char *str) +{ + if (placeholder) + free(placeholder); + placeholder = strdup(str); + + if ((Fl::focus() != this) && !*value()) { + show_placeholder(); + } +} + +/* + * Set the text color. + */ +void CustInput2::textcolor(Fl_Color c) +{ + usual_color = c; + if (showing_placeholder) + c = dimmed(c); + Fl_Input::textcolor(c); +} + +/* + * Set the input type (normal, password, etc.) + */ +void CustInput2::input_type(int t) +{ + usual_type = t; + Fl_Input::input_type(t); +} + +/* + * Set the value of the input. + * NOTE that we're not being very careful with the return value, which is + * supposed to be nonzero iff the value was changed. + */ +int CustInput2::value(const char *str) +{ + return (placeholder && (!str || !*str) && Fl::focus() != this) + ? show_placeholder() : show_normal(str); +} + +/* + * Return the value (text) of the input. + */ +const char* CustInput2::value() +{ + return showing_placeholder ? "" : Fl_Input::value(); +} + int CustInput2::handle(int e) { - int k = Fl::event_key(); + int rc, k = Fl::event_key(); _MSG("CustInput2::handle event=%d\n", e); @@ -82,8 +172,20 @@ int CustInput2::handle(int e) return 0; } } + } else if (e == FL_UNFOCUS) { + if (placeholder && !value()[0]) { + show_placeholder(); + } + } + + rc = Fl_Input::handle(e); + + if (rc && e == FL_FOCUS) { + // Nonzero return from handle() should mean that focus was accepted. + if (showing_placeholder) + show_normal(""); } - return Fl_Input::handle(e); + return rc; } @@ -604,13 +706,15 @@ Fl_Widget *FltkComplexButtonResource::createNewWidget (core::Allocation // ---------------------------------------------------------------------- FltkEntryResource::FltkEntryResource (FltkPlatform *platform, int size, - bool password, const char *label): + bool password, const char *label, + const char *placeholder): FltkSpecificResource <dw::core::ui::EntryResource> (platform) { this->size = size; this->password = password; this->label = label ? strdup(label) : NULL; this->label_w = 0; + this->placeholder = placeholder ? strdup(placeholder) : NULL; initText = NULL; editable = false; @@ -624,16 +728,17 @@ FltkEntryResource::~FltkEntryResource () free((char *)initText); if (label) free(label); + if (placeholder) + free(placeholder); } Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation *allocation) { - Fl_Input *input = + CustInput2 *input = new CustInput2(allocation->x, allocation->y, allocation->width, allocation->ascent + allocation->descent); - if (password) - input->type(FL_SECRET_INPUT); + input->input_type(password ? FL_SECRET_INPUT : FL_NORMAL_INPUT); input->callback (widgetCallback, this); input->when (FL_WHEN_ENTER_KEY_ALWAYS); @@ -643,6 +748,8 @@ Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation } if (initText) input->value (initText); + if (placeholder) + input->set_placeholder(placeholder); return input; } @@ -650,12 +757,12 @@ Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation void FltkEntryResource::setWidgetStyle (Fl_Widget *widget, core::style::Style *style) { - Fl_Input *in = (Fl_Input *)widget; + CustInput2 *in = (CustInput2 *)widget; FltkResource::setWidgetStyle(widget, style); in->textcolor(widget->labelcolor()); - in->cursor_color(in->textcolor()); + in->cursor_color(widget->labelcolor()); in->textsize(in->labelsize()); in->textfont(in->labelfont()); @@ -726,7 +833,7 @@ void FltkEntryResource::widgetCallback (Fl_Widget *widget, void *data) const char *FltkEntryResource::getText () { - return ((Fl_Input*)widget)->value (); + return ((CustInput2*)widget)->value (); } void FltkEntryResource::setText (const char *text) @@ -735,7 +842,7 @@ void FltkEntryResource::setText (const char *text) free((char *)initText); initText = strdup (text); - ((Fl_Input*)widget)->value (initText); + ((CustInput2*)widget)->value (initText); } bool FltkEntryResource::isEditable () diff --git a/dw/fltkui.hh b/dw/fltkui.hh index a0d2d7b7..0ceef003 100644 --- a/dw/fltkui.hh +++ b/dw/fltkui.hh @@ -301,6 +301,7 @@ private: const char *initText; char *label; int label_w; + char *placeholder; bool editable; static void widgetCallback (Fl_Widget *widget, void *data); @@ -312,7 +313,7 @@ protected: public: FltkEntryResource (FltkPlatform *platform, int size, bool password, - const char *label); + const char *label, const char *placeholder); ~FltkEntryResource (); void sizeRequest (core::Requisition *requisition); @@ -580,7 +580,8 @@ public: selectionMode, int rows) = 0; virtual OptionMenuResource *createOptionMenuResource () = 0; virtual EntryResource *createEntryResource (int size, bool password, - const char *label) = 0; + const char *label, + const char *placeholder) = 0; virtual MultiLineTextResource *createMultiLineTextResource (int cols, int rows) = 0; virtual CheckButtonResource *createCheckButtonResource (bool activated) = 0; diff --git a/src/form.cc b/src/form.cc index 9e7dc4f6..f98002d6 100644 --- a/src/form.cc +++ b/src/form.cc @@ -431,7 +431,7 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize) DilloHtmlInputType inp_type; Resource *resource = NULL; Embed *embed = NULL; - char *value, *name, *type, *init_str; + char *value, *name, *type, *init_str, *placeholder = NULL; const char *attrbuf, *label; bool init_val = false; ResourceFactory *factory; @@ -456,9 +456,10 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize) inp_type = DILLO_HTML_INPUT_UNKNOWN; if (!dStrAsciiCasecmp(type, "password")) { inp_type = DILLO_HTML_INPUT_PASSWORD; + placeholder = a_Html_get_attr_wdef(html, tag,tagsize,"placeholder",NULL); attrbuf = a_Html_get_attr(html, tag, tagsize, "size"); int size = Html_input_get_size(html, attrbuf); - resource = factory->createEntryResource (size, true, NULL); + resource = factory->createEntryResource (size, true, NULL, placeholder); init_str = value; } else if (!dStrAsciiCasecmp(type, "checkbox")) { inp_type = DILLO_HTML_INPUT_CHECKBOX; @@ -478,7 +479,7 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize) inp_type = DILLO_HTML_INPUT_HIDDEN; init_str = value; int size = Html_input_get_size(html, NULL); - resource = factory->createEntryResource(size, false, name); + resource = factory->createEntryResource(size, false, name, NULL); } else if (!dStrAsciiCasecmp(type, "submit")) { inp_type = DILLO_HTML_INPUT_SUBMIT; init_str = (value) ? value : dStrdup("submit"); @@ -531,9 +532,10 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize) } else { /* Text input, which also is the default */ inp_type = DILLO_HTML_INPUT_TEXT; + placeholder = a_Html_get_attr_wdef(html, tag,tagsize,"placeholder",NULL); attrbuf = a_Html_get_attr(html, tag, tagsize, "size"); int size = Html_input_get_size(html, attrbuf); - resource = factory->createEntryResource(size, false, NULL); + resource = factory->createEntryResource(size, false, NULL, placeholder); init_str = value; } if (resource) @@ -573,6 +575,7 @@ void Html_tag_open_input(DilloHtml *html, const char *tag, int tagsize) dFree(name); if (init_str != value) dFree(init_str); + dFree(placeholder); dFree(value); } @@ -606,7 +609,8 @@ void Html_tag_open_isindex(DilloHtml *html, const char *tag, int tagsize) HT2TB(html)->addText(attrbuf, html->wordStyle ()); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); - EntryResource *entryResource = factory->createEntryResource (20,false,NULL); + EntryResource *entryResource = factory->createEntryResource (20, false, + NULL, NULL); embed = new Embed (entryResource); Html_add_input(html, DILLO_HTML_INPUT_INDEX, embed, NULL, NULL, FALSE); diff --git a/test/dw_ui_test.cc b/test/dw_ui_test.cc index 086a4976..b70349ca 100644 --- a/test/dw_ui_test.cc +++ b/test/dw_ui_test.cc @@ -81,10 +81,11 @@ int main(int argc, char **argv) // First of all, the resources. Later, they are embedded into the // widget tree. EntryResource *entryres1 = - layout->getResourceFactory()->createEntryResource (10, false, NULL); + layout->getResourceFactory()->createEntryResource (10, false, NULL,NULL); entryres1->setText ("Hi!"); EntryResource *entryres2 = - layout->getResourceFactory()->createEntryResource (10, true, NULL); + layout->getResourceFactory()->createEntryResource (10, true, NULL, + "password field!"); MultiLineTextResource *textres = layout->getResourceFactory()->createMultiLineTextResource (15,3); RadioButtonResource *radiores1 = |