mirror of
https://github.com/fltk/fltk.git
synced 2026-06-04 15:32:12 +08:00
Separated Fl_Spinner.H and Fl_Spinner.cxx (STR #2776).
Also removed deprecated (misspelled) method names mininum() and maxinum(). git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12189 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
@@ -45,8 +45,9 @@ Changes in FLTK 1.4.0 Released: ??? ?? 2017
|
|||||||
Other Improvements
|
Other Improvements
|
||||||
|
|
||||||
- (add new items here)
|
- (add new items here)
|
||||||
- Renamed test/help demo program to test/help_dialog to avoid name
|
- Separated Fl_Spinner.H and Fl_Spinner.cxx (STR #2776).
|
||||||
conflict with CMake auto-generated target 'help'.
|
- Renamed test/help.cxx demo program to test/help_dialog.cxx to avoid
|
||||||
|
name conflict with CMake auto-generated target 'help'.
|
||||||
- Many documentation fixes, clarifications, and enhancements.
|
- Many documentation fixes, clarifications, and enhancements.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+85
-179
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// Spinner widget for the Fast Light Tool Kit (FLTK).
|
// Spinner widget for the Fast Light Tool Kit (FLTK).
|
||||||
//
|
//
|
||||||
// Copyright 1998-2016 by Bill Spitzak and others.
|
// Copyright 1998-2017 by Bill Spitzak and others.
|
||||||
//
|
//
|
||||||
// This library is free software. Distribution and use rights are outlined in
|
// This library is free software. Distribution and use rights are outlined in
|
||||||
// the file "COPYING" which should have been included with this file. If this
|
// the file "COPYING" which should have been included with this file. If this
|
||||||
@@ -20,237 +20,143 @@
|
|||||||
Fl_Spinner widget . */
|
Fl_Spinner widget . */
|
||||||
|
|
||||||
#ifndef Fl_Spinner_H
|
#ifndef Fl_Spinner_H
|
||||||
# define Fl_Spinner_H
|
#define Fl_Spinner_H
|
||||||
|
|
||||||
//
|
|
||||||
// Include necessary headers...
|
|
||||||
//
|
|
||||||
|
|
||||||
# include <FL/Enumerations.H>
|
|
||||||
# include <FL/Fl_Group.H>
|
|
||||||
# include <FL/Fl_Input.H>
|
|
||||||
# include <FL/Fl_Repeat_Button.H>
|
|
||||||
# include <stdio.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
|
|
||||||
|
#include <FL/Enumerations.H>
|
||||||
|
#include <FL/Fl_Group.H>
|
||||||
|
#include <FL/Fl_Input.H>
|
||||||
|
#include <FL/Fl_Repeat_Button.H>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This widget is a combination of the input
|
This widget is a combination of a numerical input widget and repeat buttons.
|
||||||
widget and repeat buttons. The user can either type into the
|
|
||||||
input area or use the buttons to change the value.
|
The user can either type into the input area or use the buttons to
|
||||||
|
change the value.
|
||||||
|
|
||||||
\image html Fl_Spinner.png "Fl_Spinner widget"
|
\image html Fl_Spinner.png "Fl_Spinner widget"
|
||||||
\image latex Fl_Spinner.png "Fl_Spinner widget" width=6cm
|
\image latex Fl_Spinner.png "Fl_Spinner widget" width=6cm
|
||||||
*/
|
*/
|
||||||
class FL_EXPORT Fl_Spinner : public Fl_Group {
|
class FL_EXPORT Fl_Spinner : public Fl_Group {
|
||||||
|
|
||||||
double value_; // Current value
|
double value_; // Current value
|
||||||
double minimum_; // Minimum value
|
double minimum_; // Minimum value
|
||||||
double maximum_; // Maximum value
|
double maximum_; // Maximum value
|
||||||
double step_; // Amount to add/subtract for up/down
|
double step_; // Amount to add/subtract for up/down
|
||||||
const char *format_; // Format string
|
const char *format_; // Format string for input field
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
static void sb_cb(Fl_Widget *w, Fl_Spinner *sb); // internal callback
|
||||||
|
void update(); // update input field
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
Fl_Input input_; // Input field for the value
|
Fl_Input input_; // Input field for the value
|
||||||
Fl_Repeat_Button
|
Fl_Repeat_Button
|
||||||
up_button_, // Up button
|
up_button_, // Up button
|
||||||
down_button_; // Down button
|
down_button_; // Down button
|
||||||
|
|
||||||
private:
|
public:
|
||||||
static void sb_cb(Fl_Widget *w, Fl_Spinner *sb) {
|
|
||||||
double v; // New value
|
|
||||||
|
|
||||||
if (w == &(sb->input_)) {
|
// Constructor
|
||||||
// Something changed in the input field...
|
|
||||||
v = atof(sb->input_.value());
|
|
||||||
|
|
||||||
if (v < sb->minimum_) {
|
|
||||||
sb->value_ = sb->minimum_;
|
|
||||||
sb->update();
|
|
||||||
} else if (v > sb->maximum_) {
|
|
||||||
sb->value_ = sb->maximum_;
|
|
||||||
sb->update();
|
|
||||||
} else sb->value_ = v;
|
|
||||||
} else if (w == &(sb->up_button_)) {
|
|
||||||
// Up button pressed...
|
|
||||||
v = sb->value_ + sb->step_;
|
|
||||||
|
|
||||||
if (v > sb->maximum_) sb->value_ = sb->minimum_;
|
|
||||||
else sb->value_ = v;
|
|
||||||
|
|
||||||
sb->update();
|
|
||||||
} else if (w == &(sb->down_button_)) {
|
|
||||||
// Down button pressed...
|
|
||||||
v = sb->value_ - sb->step_;
|
|
||||||
|
|
||||||
if (v < sb->minimum_) sb->value_ = sb->maximum_;
|
|
||||||
else sb->value_ = v;
|
|
||||||
|
|
||||||
sb->update();
|
|
||||||
}
|
|
||||||
|
|
||||||
sb->set_changed();
|
|
||||||
sb->do_callback();
|
|
||||||
}
|
|
||||||
void update() {
|
|
||||||
char s[255]; // Value string
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
Creates a new Fl_Spinner widget using the given position, size,
|
|
||||||
and label string.
|
|
||||||
<P>Inherited destructor Destroys the widget and any value associated with it.
|
|
||||||
*/
|
|
||||||
Fl_Spinner(int X, int Y, int W, int H, const char *L = 0);
|
Fl_Spinner(int X, int Y, int W, int H, const char *L = 0);
|
||||||
|
// Event handling
|
||||||
|
int handle(int event);
|
||||||
|
// Resize group and subwidgets
|
||||||
|
void resize(int X, int Y, int W, int H);
|
||||||
|
|
||||||
/** Sets or returns the format string for the value. */
|
/** Returns the format string for the value. */
|
||||||
const char *format() { return (format_); }
|
const char *format() const { return (format_); }
|
||||||
/** Sets or returns the format string for the value. */
|
|
||||||
void format(const char *f) { format_ = f; update(); }
|
|
||||||
|
|
||||||
int handle(int event) {
|
/** Sets the format string for the value. */
|
||||||
switch (event) {
|
void format(const char *f) { format_ = f; update(); }
|
||||||
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 mistakes retained for source compatibility \deprecated */
|
|
||||||
double maxinum() const { return (maximum_); }
|
|
||||||
/** Gets the maximum value of the widget. */
|
/** Gets the maximum value of the widget. */
|
||||||
double maximum() const { return (maximum_); }
|
double maximum() const { return (maximum_); }
|
||||||
/** Sets the maximum value of the widget. */
|
|
||||||
void maximum(double m) { maximum_ = m; }
|
/** Sets the maximum value of the widget. */
|
||||||
/** Speling mistakes retained for source compatibility \deprecated */
|
void maximum(double m) { maximum_ = m; }
|
||||||
double mininum() const { return (minimum_); }
|
|
||||||
/** Gets the minimum value of the widget. */
|
/** Gets the minimum value of the widget. */
|
||||||
double minimum() const { return (minimum_); }
|
double minimum() const { return (minimum_); }
|
||||||
/** Sets the minimum value of the widget. */
|
|
||||||
void minimum(double m) { minimum_ = m; }
|
/** Sets the minimum value of the widget. */
|
||||||
/** Sets the minimum and maximum values for the widget. */
|
void minimum(double m) { minimum_ = m; }
|
||||||
void range(double a, double b) { minimum_ = a; maximum_ = b; }
|
|
||||||
void resize(int X, int Y, int W, int H) {
|
/** Sets the minimum and maximum values for the widget. */
|
||||||
Fl_Group::resize(X,Y,W,H);
|
void range(double a, double b) { minimum_ = a; maximum_ = b; }
|
||||||
|
|
||||||
|
// Sets the amount to change the value when the user clicks a button.
|
||||||
|
// Docs in src/Fl_Spinner.cxx
|
||||||
|
void step(double s);
|
||||||
|
|
||||||
input_.resize(X, Y, W - H / 2 - 2, H);
|
|
||||||
up_button_.resize(X + W - H / 2 - 2, Y, H / 2 + 2, H / 2);
|
|
||||||
down_button_.resize(X + W - H / 2 - 2, Y + H - H / 2,
|
|
||||||
H / 2 + 2, H / 2);
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
Sets or returns the amount to change the value when the user clicks a button.
|
Gets the amount to change the value when the user clicks a button.
|
||||||
Before setting step to a non-integer value, the spinner
|
\see Fl_Spinner::step(double)
|
||||||
type() should be changed to floating point.
|
|
||||||
*/
|
*/
|
||||||
double step() const { return (step_); }
|
double step() const { return (step_); }
|
||||||
/** See double Fl_Spinner::step() const */
|
|
||||||
void step(double s) {
|
|
||||||
step_ = s;
|
|
||||||
if (step_ != (int)step_) input_.type(FL_FLOAT_INPUT);
|
|
||||||
else input_.type(FL_INT_INPUT);
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
/** Gets the color of the text in the input field. */
|
/** Gets the color of the text in the input field. */
|
||||||
Fl_Color textcolor() const {
|
Fl_Color textcolor() const { return (input_.textcolor()); }
|
||||||
return (input_.textcolor());
|
|
||||||
}
|
|
||||||
/** Sets the color of the text in the input field. */
|
/** Sets the color of the text in the input field. */
|
||||||
void textcolor(Fl_Color c) {
|
void textcolor(Fl_Color c) { input_.textcolor(c); }
|
||||||
input_.textcolor(c);
|
|
||||||
}
|
|
||||||
/** Gets the font of the text in the input field. */
|
/** Gets the font of the text in the input field. */
|
||||||
Fl_Font textfont() const {
|
Fl_Font textfont() const { return (input_.textfont()); }
|
||||||
return (input_.textfont());
|
|
||||||
}
|
|
||||||
/** Sets the font of the text in the input field. */
|
/** Sets the font of the text in the input field. */
|
||||||
void textfont(Fl_Font f) {
|
void textfont(Fl_Font f) { input_.textfont(f); }
|
||||||
input_.textfont(f);
|
|
||||||
}
|
|
||||||
/** Gets the size of the text in the input field. */
|
/** Gets the size of the text in the input field. */
|
||||||
Fl_Fontsize textsize() const {
|
Fl_Fontsize textsize() const { return (input_.textsize()); }
|
||||||
return (input_.textsize());
|
|
||||||
}
|
|
||||||
/** Sets the size of the text in the input field. */
|
/** Sets the size of the text in the input field. */
|
||||||
void textsize(Fl_Fontsize s) {
|
void textsize(Fl_Fontsize s) { input_.textsize(s); }
|
||||||
input_.textsize(s);
|
|
||||||
}
|
// Sets the numeric representation in the input field.
|
||||||
|
// Docs see src/Fl_Spinner.cxx
|
||||||
|
void type(uchar v);
|
||||||
|
|
||||||
/** Gets the numeric representation in the input field.
|
/** Gets the numeric representation in the input field.
|
||||||
\see Fl_Spinner::type(uchar)
|
\see Fl_Spinner::type(uchar)
|
||||||
*/
|
*/
|
||||||
uchar type() const { return (input_.type()); }
|
uchar type() const { return (input_.type()); }
|
||||||
/** Sets the numeric representation in the input field.
|
|
||||||
Valid values are FL_INT_INPUT and FL_FLOAT_INPUT.
|
|
||||||
Also changes the format() template.
|
|
||||||
Setting a new spinner type via a superclass pointer will not work.
|
|
||||||
\note type is not a virtual function.
|
|
||||||
*/
|
|
||||||
void type(uchar v) {
|
|
||||||
if (v==FL_FLOAT_INPUT) {
|
|
||||||
format("%.*f");
|
|
||||||
} else {
|
|
||||||
format("%.0f");
|
|
||||||
}
|
|
||||||
input_.type(v);
|
|
||||||
}
|
|
||||||
/** Gets the current value of the widget. */
|
/** Gets the current value of the widget. */
|
||||||
double value() const { return (value_); }
|
double value() const { return (value_); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the current value of the widget.
|
Sets the current value of the input widget.
|
||||||
Before setting value to a non-integer value, the spinner
|
Before setting value to a non-integer value, the spinner
|
||||||
type() should be changed to floating point.
|
type() should be changed to floating point.
|
||||||
*/
|
*/
|
||||||
void value(double v) { value_ = v; update(); }
|
void value(double v) { value_ = v; update(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Change the background color of the spinner widget's input field.
|
Sets the background color of the spinner widget's input field.
|
||||||
*/
|
*/
|
||||||
void color(Fl_Color v) { input_.color(v); }
|
void color(Fl_Color v) { input_.color(v); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Return the background color of the spinner widget's input field.
|
Returns the background color of the spinner widget's input field.
|
||||||
*/
|
*/
|
||||||
Fl_Color color() const { return(input_.color()); }
|
Fl_Color color() const { return(input_.color()); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Change the selection color of the spinner widget's input field.
|
Sets the selection color of the spinner widget's input field.
|
||||||
*/
|
*/
|
||||||
void selection_color(Fl_Color val) { input_.selection_color(val); }
|
void selection_color(Fl_Color val) { input_.selection_color(val); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Return the selection color of the spinner widget's input field.
|
Returns the selection color of the spinner widget's input field.
|
||||||
*/
|
*/
|
||||||
Fl_Color selection_color() const { return input_.selection_color(); }
|
Fl_Color selection_color() const { return input_.selection_color(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !Fl_Spinner_H
|
#endif // !Fl_Spinner_H
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// End of "$Id$".
|
// End of "$Id$".
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ set (CPPFILES
|
|||||||
Fl_Shared_Image.cxx
|
Fl_Shared_Image.cxx
|
||||||
Fl_Single_Window.cxx
|
Fl_Single_Window.cxx
|
||||||
Fl_Slider.cxx
|
Fl_Slider.cxx
|
||||||
|
Fl_Spinner.cxx
|
||||||
Fl_System_Driver.cxx
|
Fl_System_Driver.cxx
|
||||||
Fl_Table.cxx
|
Fl_Table.cxx
|
||||||
Fl_Table_Row.cxx
|
Fl_Table_Row.cxx
|
||||||
|
|||||||
@@ -852,34 +852,6 @@ Fl_Input_Choice::Fl_Input_Choice (int X,int Y,int W,int H,const char*L)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Fl_Spinner::Fl_Spinner(int X, int Y, int W, int H, const char *L)
|
|
||||||
: 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, "@-42<"),
|
|
||||||
down_button_(X + W - H / 2 - 2, Y + H - H / 2,
|
|
||||||
H / 2 + 2, H / 2, "@-42>")
|
|
||||||
{
|
|
||||||
end();
|
|
||||||
|
|
||||||
value_ = 1.0;
|
|
||||||
minimum_ = 1.0;
|
|
||||||
maximum_ = 100.0;
|
|
||||||
step_ = 1.0;
|
|
||||||
format_ = "%g";
|
|
||||||
|
|
||||||
align(FL_ALIGN_LEFT);
|
|
||||||
|
|
||||||
input_.value("1");
|
|
||||||
input_.type(FL_INT_INPUT);
|
|
||||||
input_.when(FL_WHEN_ENTER_KEY | FL_WHEN_RELEASE);
|
|
||||||
input_.callback((Fl_Callback *)sb_cb, this);
|
|
||||||
|
|
||||||
up_button_.callback((Fl_Callback *)sb_cb, this);
|
|
||||||
|
|
||||||
down_button_.callback((Fl_Callback *)sb_cb, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// End of "$Id$".
|
// End of "$Id$".
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -0,0 +1,194 @@
|
|||||||
|
//
|
||||||
|
// "$Id$"
|
||||||
|
//
|
||||||
|
// Spinner widget for the Fast Light Tool Kit (FLTK).
|
||||||
|
//
|
||||||
|
// Copyright 1998-2017 by Bill Spitzak and others.
|
||||||
|
//
|
||||||
|
// This library is free software. Distribution and use rights are outlined in
|
||||||
|
// the file "COPYING" which should have been included with this file. If this
|
||||||
|
// file is missing or damaged, see the license at:
|
||||||
|
//
|
||||||
|
// http://www.fltk.org/COPYING.php
|
||||||
|
//
|
||||||
|
// Please report all bugs and problems on the following page:
|
||||||
|
//
|
||||||
|
// http://www.fltk.org/str.php
|
||||||
|
//
|
||||||
|
|
||||||
|
/* \file
|
||||||
|
Fl_Spinner widget . */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <FL/Fl_Spinner.H>
|
||||||
|
|
||||||
|
/*
|
||||||
|
This widget is a combination of the input widget and repeat buttons.
|
||||||
|
|
||||||
|
The user can either type into the input area or use the buttons to
|
||||||
|
change the value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void Fl_Spinner::sb_cb(Fl_Widget *w, Fl_Spinner *sb) {
|
||||||
|
double v; // New value
|
||||||
|
|
||||||
|
if (w == &(sb->input_)) {
|
||||||
|
// Something changed in the input field...
|
||||||
|
v = atof(sb->input_.value());
|
||||||
|
|
||||||
|
if (v < sb->minimum_) {
|
||||||
|
sb->value_ = sb->minimum_;
|
||||||
|
sb->update();
|
||||||
|
} else if (v > sb->maximum_) {
|
||||||
|
sb->value_ = sb->maximum_;
|
||||||
|
sb->update();
|
||||||
|
} else sb->value_ = v;
|
||||||
|
} else if (w == &(sb->up_button_)) {
|
||||||
|
// Up button pressed...
|
||||||
|
v = sb->value_ + sb->step_;
|
||||||
|
|
||||||
|
if (v > sb->maximum_) sb->value_ = sb->minimum_;
|
||||||
|
else sb->value_ = v;
|
||||||
|
|
||||||
|
sb->update();
|
||||||
|
} else if (w == &(sb->down_button_)) {
|
||||||
|
// Down button pressed...
|
||||||
|
v = sb->value_ - sb->step_;
|
||||||
|
|
||||||
|
if (v < sb->minimum_) sb->value_ = sb->maximum_;
|
||||||
|
else sb->value_ = v;
|
||||||
|
|
||||||
|
sb->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
sb->set_changed();
|
||||||
|
sb->do_callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fl_Spinner::update() {
|
||||||
|
char s[255]; // Value string
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FL_UP_ARROW_TX "@-42<"
|
||||||
|
#define FL_DOWN_ARROW_TX "@-42>"
|
||||||
|
|
||||||
|
/**
|
||||||
|
Creates a new Fl_Spinner widget using the given position, size,
|
||||||
|
and label string.
|
||||||
|
|
||||||
|
The inherited destructor destroys the widget and any value associated with it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fl_Spinner::Fl_Spinner(int X, int Y, int W, int H, const char *L)
|
||||||
|
: 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, FL_UP_ARROW_TX),
|
||||||
|
down_button_(X + W - H / 2 - 2, Y + H - H / 2,
|
||||||
|
H / 2 + 2, H / 2, FL_DOWN_ARROW_TX)
|
||||||
|
{
|
||||||
|
end();
|
||||||
|
|
||||||
|
value_ = 1.0;
|
||||||
|
minimum_ = 1.0;
|
||||||
|
maximum_ = 100.0;
|
||||||
|
step_ = 1.0;
|
||||||
|
format_ = "%g";
|
||||||
|
|
||||||
|
align(FL_ALIGN_LEFT);
|
||||||
|
|
||||||
|
input_.value("1");
|
||||||
|
input_.type(FL_INT_INPUT);
|
||||||
|
input_.when(FL_WHEN_ENTER_KEY | FL_WHEN_RELEASE);
|
||||||
|
input_.callback((Fl_Callback *)sb_cb, this);
|
||||||
|
|
||||||
|
up_button_.callback((Fl_Callback *)sb_cb, this);
|
||||||
|
|
||||||
|
down_button_.callback((Fl_Callback *)sb_cb, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Fl_Spinner::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;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case FL_FOCUS:
|
||||||
|
if (input_.take_focus()) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Fl_Group::handle(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fl_Spinner::resize(int X, int Y, int W, int H) {
|
||||||
|
Fl_Group::resize(X,Y,W,H);
|
||||||
|
|
||||||
|
input_.resize(X, Y, W - H / 2 - 2, H);
|
||||||
|
up_button_.resize(X + W - H / 2 - 2, Y, H / 2 + 2, H / 2);
|
||||||
|
down_button_.resize(X + W - H / 2 - 2, Y + H - H / 2,
|
||||||
|
H / 2 + 2, H / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets or returns the amount to change the value when the user clicks a button.
|
||||||
|
Before setting step to a non-integer value, the spinner
|
||||||
|
type() should be changed to floating point.
|
||||||
|
|
||||||
|
\see double Fl_Spinner::step() const
|
||||||
|
*/
|
||||||
|
|
||||||
|
void Fl_Spinner::step(double s) {
|
||||||
|
step_ = s;
|
||||||
|
if (step_ != (int)step_) input_.type(FL_FLOAT_INPUT);
|
||||||
|
else input_.type(FL_INT_INPUT);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets the numeric representation in the input field.
|
||||||
|
|
||||||
|
Valid values are FL_INT_INPUT and FL_FLOAT_INPUT.
|
||||||
|
Also changes the format() template.
|
||||||
|
Setting a new spinner type via a superclass pointer will not work.
|
||||||
|
\note type() is not a virtual function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void Fl_Spinner::type(uchar v) {
|
||||||
|
if (v == FL_FLOAT_INPUT) {
|
||||||
|
format("%.*f");
|
||||||
|
} else {
|
||||||
|
format("%.0f");
|
||||||
|
}
|
||||||
|
input_.type(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// End of "$Id$".
|
||||||
|
//
|
||||||
+2
-1
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# Library Makefile for the Fast Light Tool Kit (FLTK).
|
# Library Makefile for the Fast Light Tool Kit (FLTK).
|
||||||
#
|
#
|
||||||
# Copyright 1998-2016 by Bill Spitzak and others.
|
# Copyright 1998-2017 by Bill Spitzak and others.
|
||||||
#
|
#
|
||||||
# This library is free software. Distribution and use rights are outlined in
|
# This library is free software. Distribution and use rights are outlined in
|
||||||
# the file "COPYING" which should have been included with this file. If this
|
# the file "COPYING" which should have been included with this file. If this
|
||||||
@@ -79,6 +79,7 @@ CPPFILES = \
|
|||||||
Fl_Shared_Image.cxx \
|
Fl_Shared_Image.cxx \
|
||||||
Fl_Single_Window.cxx \
|
Fl_Single_Window.cxx \
|
||||||
Fl_Slider.cxx \
|
Fl_Slider.cxx \
|
||||||
|
Fl_Spinner.cxx \
|
||||||
Fl_System_Driver.cxx \
|
Fl_System_Driver.cxx \
|
||||||
Fl_Table.cxx \
|
Fl_Table.cxx \
|
||||||
Fl_Table_Row.cxx \
|
Fl_Table_Row.cxx \
|
||||||
|
|||||||
Reference in New Issue
Block a user