diff options
Diffstat (limited to 'dw')
-rw-r--r-- | dw/fltkplatform.cc | 6 | ||||
-rw-r--r-- | dw/fltkplatform.hh | 3 | ||||
-rw-r--r-- | dw/fltkui.cc | 140 | ||||
-rw-r--r-- | dw/fltkui.hh | 3 | ||||
-rw-r--r-- | dw/textblock.cc | 4 | ||||
-rw-r--r-- | dw/ui.hh | 3 |
6 files changed, 140 insertions, 19 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 6099fd69..a648638d 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -42,18 +42,115 @@ */ /* - * 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) {}; + CustInput2 (int x, int y, int w, int h, const char* l=0); + ~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; }; +CustInput2::CustInput2 (int x, int y, int w, int h, const char* l) : + Fl_Input(x,y,w,h,l) +{ + placeholder = NULL; + showing_placeholder = false; + usual_color = FL_BLACK; /* just init until widget style is set */ +}; + +/* + * 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 +179,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; } @@ -607,13 +716,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; @@ -627,16 +738,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); @@ -646,6 +758,8 @@ Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation } if (initText) input->value (initText); + if (placeholder) + input->set_placeholder(placeholder); return input; } @@ -653,12 +767,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()); @@ -729,7 +843,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) @@ -738,7 +852,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 6ff024ca..fc22defd 100644 --- a/dw/fltkui.hh +++ b/dw/fltkui.hh @@ -303,6 +303,7 @@ private: const char *initText; char *label; int label_w; + char *placeholder; bool editable; static void widgetCallback (Fl_Widget *widget, void *data); @@ -314,7 +315,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); diff --git a/dw/textblock.cc b/dw/textblock.cc index e4bc72ab..40eb4014 100644 --- a/dw/textblock.cc +++ b/dw/textblock.cc @@ -577,7 +577,9 @@ void Textblock::sizeAllocateImpl (core::Allocation *allocation) core::Allocation childAllocation; core::Allocation *oldChildAllocation; - if (allocation->width != this->allocation.width) { + if (allocation->x != this->allocation.x || + allocation->y != this->allocation.y || + allocation->width != this->allocation.width) { redrawY = 0; DBG_OBJ_SET_NUM ("redrawY", redrawY); } @@ -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; |