summaryrefslogtreecommitdiff
path: root/FL/Fl_Spinner.H
diff options
context:
space:
mode:
authorAaron M. Ucko <ucko@debian.org>2007-05-20 01:20:30 +0000
committerAaron M. Ucko <ucko@debian.org>2007-05-20 01:20:30 +0000
commitda5f6f8dd1f87d32cea2f882d251ebaecc3c7629 (patch)
tree5772cc71ce588e5cbdbb7e458e2c5876dcbc8fcc /FL/Fl_Spinner.H
parentee19f9cc1847049ccb983313bb11df47d253df16 (diff)
parent9b5d5801c27165ad47245acb580f30b8ce2d20b4 (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.H62
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(); }
};