diff options
author | Aaron M. Ucko <ucko@debian.org> | 2007-05-20 01:20:30 +0000 |
---|---|---|
committer | Aaron M. Ucko <ucko@debian.org> | 2007-05-20 01:20:30 +0000 |
commit | da5f6f8dd1f87d32cea2f882d251ebaecc3c7629 (patch) | |
tree | 5772cc71ce588e5cbdbb7e458e2c5876dcbc8fcc /FL/Fl_Spinner.H | |
parent | ee19f9cc1847049ccb983313bb11df47d253df16 (diff) | |
parent | 9b5d5801c27165ad47245acb580f30b8ce2d20b4 (diff) |
Merge new upstream snapshot / release candidate (1.1.8~r5840) into trunk.
Diffstat (limited to 'FL/Fl_Spinner.H')
-rw-r--r-- | FL/Fl_Spinner.H | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/FL/Fl_Spinner.H b/FL/Fl_Spinner.H index 2a6c0bc..9f76ad7 100644 --- a/FL/Fl_Spinner.H +++ b/FL/Fl_Spinner.H @@ -32,6 +32,7 @@ // Include necessary headers... // +# include <FL/Enumerations.H> # include <FL/Fl_Group.H> # include <FL/Fl_Input.H> # include <FL/Fl_Repeat_Button.H> @@ -56,6 +57,7 @@ class Fl_Spinner : public Fl_Group up_button_, // Up button down_button_; // Down button + static void sb_cb(Fl_Widget *w, Fl_Spinner *sb) { double v; // New value @@ -93,7 +95,20 @@ class Fl_Spinner : public Fl_Group void update() { char s[255]; // Value string - sprintf(s, format_, value_); + if (format_[0]=='%'&&format_[1]=='.'&&format_[2]=='*') { // precision argument + // this code block is a simplified version of + // Fl_Valuator::format() and works well (but looks ugly) + int c = 0; + char temp[64], *sp = temp; + sprintf(temp, "%.12f", step_); + while (*sp) sp++; + sp--; + while (sp>temp && *sp=='0') sp--; + while (sp>temp && (*sp>='0' && *sp<='9')) { sp--; c++; } + sprintf(s, format_, c, value_); + } else { + sprintf(s, format_, value_); + } input_.value(s); } @@ -102,22 +117,22 @@ class Fl_Spinner : public Fl_Group Fl_Spinner(int X, int Y, int W, int H, const char *L = 0) : Fl_Group(X, Y, W, H, L), input_(X, Y, W - H / 2 - 2, H), - up_button_(X + W - H / 2 - 2, Y, H / 2 + 2, H / 2, "@-22<"), + up_button_(X + W - H / 2 - 2, Y, H / 2 + 2, H / 2, "@-42<"), down_button_(X + W - H / 2 - 2, Y + H - H / 2, - H / 2 + 2, H / 2, "@-22>") { + H / 2 + 2, H / 2, "@-42>") { end(); value_ = 1.0; minimum_ = 1.0; maximum_ = 100.0; step_ = 1.0; - format_ = "%.0f"; + format_ = "%g"; align(FL_ALIGN_LEFT); input_.value("1"); input_.type(FL_INT_INPUT); - input_.when(FL_WHEN_CHANGED); + input_.when(FL_WHEN_ENTER_KEY | FL_WHEN_RELEASE); input_.callback((Fl_Callback *)sb_cb, this); up_button_.callback((Fl_Callback *)sb_cb, this); @@ -127,6 +142,27 @@ class Fl_Spinner : public Fl_Group const char *format() { return (format_); } void format(const char *f) { format_ = f; update(); } + + int handle(int event) { + switch (event) { + case FL_KEYDOWN : + case FL_SHORTCUT : + if (Fl::event_key() == FL_Up) { + up_button_.do_callback(); + return 1; + } else if (Fl::event_key() == FL_Down) { + down_button_.do_callback(); + return 1; + } else return 0; + + case FL_FOCUS : + if (input_.take_focus()) return 1; + else return 0; + } + + return Fl_Group::handle(event); + } + // Speling mistaks retained for source compatibility... double maxinum() const { return (maximum_); } double maximum() const { return (maximum_); } @@ -144,7 +180,12 @@ class Fl_Spinner : public Fl_Group H / 2 + 2, H / 2); } double step() const { return (step_); } - void step(double s) { step_ = s; } + void step(double s) { + step_ = s; + if (step_ != (int)step_) input_.type(FL_FLOAT_INPUT); + else input_.type(FL_INT_INPUT); + update(); + } Fl_Color textcolor() const { return (input_.textcolor()); } @@ -163,6 +204,15 @@ class Fl_Spinner : public Fl_Group void textsize(uchar s) { input_.textsize(s); } + uchar type() const { return (input_.type()); } + void type(uchar v) { + if (v==FL_FLOAT_INPUT) { + format("%.*f"); + } else { + format("%.0f"); + } + input_.type(v); + } double value() const { return (value_); } void value(double v) { value_ = v; update(); } }; |