summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rw-r--r--fluid/Fl_Type.cxx1
-rw-r--r--fluid/Fl_Type.h1
-rw-r--r--fluid/Fl_Widget_Type.cxx115
-rw-r--r--fluid/factory.cxx1
5 files changed, 98 insertions, 21 deletions
diff --git a/CHANGES b/CHANGES
index ce8822f7a..9a96a1a56 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,6 @@
CHANGES IN FLTK 1.1.8
+ - Fl_Spinner is now fully supported by Fluid (STR #1158)
- Fixed usage of deleted object after menu pulldown
(STR #1162)
- Calling fl_font(0, 0) under Xft would access a NULL
diff --git a/fluid/Fl_Type.cxx b/fluid/Fl_Type.cxx
index 92e1c807c..278cdff95 100644
--- a/fluid/Fl_Type.cxx
+++ b/fluid/Fl_Type.cxx
@@ -622,6 +622,7 @@ Fl_Type::~Fl_Type() {
int Fl_Type::is_parent() const {return 0;}
int Fl_Type::is_widget() const {return 0;}
int Fl_Type::is_valuator() const {return 0;}
+int Fl_Type::is_spinner() const {return 0;}
int Fl_Type::is_button() const {return 0;}
int Fl_Type::is_menu_item() const {return 0;}
int Fl_Type::is_menu_button() const {return 0;}
diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h
index fe9d65351..728cae7a8 100644
--- a/fluid/Fl_Type.h
+++ b/fluid/Fl_Type.h
@@ -131,6 +131,7 @@ public:
virtual int is_widget() const;
virtual int is_button() const;
virtual int is_valuator() const;
+ virtual int is_spinner() const;
virtual int is_menu_item() const;
virtual int is_menu_button() const;
virtual int is_group() const;
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index 3cd8e1a34..ed55f1dd0 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -1443,9 +1443,16 @@ void slider_size_cb(Fl_Value_Input* i, void* v) {
void min_cb(Fl_Value_Input* i, void* v) {
if (v == LOAD) {
- if (!current_widget->is_valuator()) {i->deactivate(); return;}
- i->activate();
- i->value(((Fl_Valuator*)(current_widget->o))->minimum());
+ if (current_widget->is_valuator()) {
+ i->activate();
+ i->value(((Fl_Valuator*)(current_widget->o))->minimum());
+ } else if (current_widget->is_spinner()) {
+ i->activate();
+ i->value(((Fl_Spinner*)(current_widget->o))->minimum());
+ } else {
+ i->deactivate();
+ return;
+ }
} else {
int mod = 0;
double n = i->value();
@@ -1456,7 +1463,11 @@ void min_cb(Fl_Value_Input* i, void* v) {
((Fl_Valuator*)(q->o))->minimum(n);
q->o->redraw();
mod = 1;
- }
+ } else if (q->is_spinner()) {
+ ((Fl_Spinner*)(q->o))->minimum(n);
+ q->o->redraw();
+ mod = 1;
+ }
}
}
if (mod) set_modflag(1);
@@ -1465,9 +1476,16 @@ void min_cb(Fl_Value_Input* i, void* v) {
void max_cb(Fl_Value_Input* i, void* v) {
if (v == LOAD) {
- if (!current_widget->is_valuator()) {i->deactivate(); return;}
- i->activate();
- i->value(((Fl_Valuator*)(current_widget->o))->maximum());
+ if (current_widget->is_valuator()) {
+ i->activate();
+ i->value(((Fl_Valuator*)(current_widget->o))->maximum());
+ } else if (current_widget->is_spinner()) {
+ i->activate();
+ i->value(((Fl_Spinner*)(current_widget->o))->maximum());
+ } else {
+ i->deactivate();
+ return;
+ }
} else {
int mod = 0;
double n = i->value();
@@ -1478,6 +1496,10 @@ void max_cb(Fl_Value_Input* i, void* v) {
((Fl_Valuator*)(q->o))->maximum(n);
q->o->redraw();
mod = 1;
+ } else if (q->is_spinner()) {
+ ((Fl_Spinner*)(q->o))->maximum(n);
+ q->o->redraw();
+ mod = 1;
}
}
}
@@ -1487,9 +1509,16 @@ void max_cb(Fl_Value_Input* i, void* v) {
void step_cb(Fl_Value_Input* i, void* v) {
if (v == LOAD) {
- if (!current_widget->is_valuator()) {i->deactivate(); return;}
- i->activate();
- i->value(((Fl_Valuator*)(current_widget->o))->step());
+ if (current_widget->is_valuator()) {
+ i->activate();
+ i->value(((Fl_Valuator*)(current_widget->o))->step());
+ } else if (current_widget->is_spinner()) {
+ i->activate();
+ i->value(((Fl_Spinner*)(current_widget->o))->step());
+ } else {
+ i->deactivate();
+ return;
+ }
} else {
int mod = 0;
double n = i->value();
@@ -1497,9 +1526,13 @@ void step_cb(Fl_Value_Input* i, void* v) {
if (o->selected && o->is_widget()) {
Fl_Widget_Type* q = (Fl_Widget_Type*)o;
if (q->is_valuator()) {
- ((Fl_Valuator*)(q->o))->step(n);
- q->o->redraw();
- mod = 1;
+ ((Fl_Valuator*)(q->o))->step(n);
+ q->o->redraw();
+ mod = 1;
+ } else if (q->is_spinner()) {
+ ((Fl_Spinner*)(q->o))->step(n);
+ q->o->redraw();
+ mod = 1;
}
}
}
@@ -1515,6 +1548,9 @@ void value_cb(Fl_Value_Input* i, void* v) {
} else if (current_widget->is_button()) {
i->activate();
i->value(((Fl_Button*)(current_widget->o))->value());
+ } else if (current_widget->is_spinner()) {
+ i->activate();
+ i->value(((Fl_Spinner*)(current_widget->o))->value());
} else
i->deactivate();
} else {
@@ -1530,6 +1566,9 @@ void value_cb(Fl_Value_Input* i, void* v) {
((Fl_Button*)(q->o))->value(n != 0);
if (q->is_menu_item()) q->redraw();
mod = 1;
+ } else if (q->is_spinner()) {
+ ((Fl_Spinner*)(q->o))->value(n);
+ mod = 1;
}
}
}
@@ -2074,6 +2113,19 @@ void Fl_Widget_Type::write_widget_code() {
if (x != y) write_c("%so->slider_size(%g);\n", indent(), x);
}
}
+ if (is_spinner()) {
+ Fl_Spinner* v = (Fl_Spinner*)o;
+ Fl_Spinner* f = (Fl_Spinner*)(tplate);
+ if (v->minimum()!=f->minimum())
+ write_c("%so->minimum(%g);\n", indent(), v->minimum());
+ if (v->maximum()!=f->maximum())
+ write_c("%so->maximum(%g);\n", indent(), v->maximum());
+ if (v->step()!=f->step())
+ write_c("%so->step(%g);\n", indent(), v->step());
+ if (v->value())
+ write_c("%so->value(%g);\n", indent(), v->value());
+ }
+
{Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) {
Fl_Font f; int s; Fl_Color c; textstuff(0,f,s,c);
if (f != ff) write_c("%so->textfont(%d);\n", indent(), f);
@@ -2198,6 +2250,14 @@ void Fl_Widget_Type::write_properties() {
if (x != y) write_string("slider_size %g", x);
}
}
+ if (is_spinner()) {
+ Fl_Spinner* v = (Fl_Spinner*)o;
+ Fl_Spinner* f = (Fl_Spinner*)(tplate);
+ if (v->minimum()!=f->minimum()) write_string("minimum %g",v->minimum());
+ if (v->maximum()!=f->maximum()) write_string("maximum %g",v->maximum());
+ if (v->step()!=f->step()) write_string("step %g",v->step());
+ if (v->value()!=0.0) write_string("value %g",v->value());
+ }
{Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) {
Fl_Font f; int s; Fl_Color c; textstuff(0,f,s,c);
if (f != ff) write_string("textfont %d", f);
@@ -2298,14 +2358,18 @@ void Fl_Widget_Type::read_property(const char *c) {
if (sscanf(read_word(),"%d",&x) == 1) o->align(x);
} else if (!strcmp(c,"when")) {
if (sscanf(read_word(),"%d",&x) == 1) o->when(x);
- } else if (!strcmp(c,"minimum") && is_valuator()) {
- ((Fl_Valuator*)o)->minimum(strtod(read_word(),0));
- } else if (!strcmp(c,"maximum") && is_valuator()) {
- ((Fl_Valuator*)o)->maximum(strtod(read_word(),0));
- } else if (!strcmp(c,"step") && is_valuator()) {
- ((Fl_Valuator*)o)->step(strtod(read_word(),0));
- } else if (!strcmp(c,"value") && is_valuator()) {
- ((Fl_Valuator*)o)->value(strtod(read_word(),0));
+ } else if (!strcmp(c,"minimum")) {
+ if (is_valuator()) ((Fl_Valuator*)o)->minimum(strtod(read_word(),0));
+ if (is_spinner()) ((Fl_Spinner*)o)->minimum(strtod(read_word(),0));
+ } else if (!strcmp(c,"maximum")) {
+ if (is_valuator()) ((Fl_Valuator*)o)->maximum(strtod(read_word(),0));
+ if (is_spinner()) ((Fl_Spinner*)o)->maximum(strtod(read_word(),0));
+ } else if (!strcmp(c,"step")) {
+ if (is_valuator()) ((Fl_Valuator*)o)->step(strtod(read_word(),0));
+ if (is_spinner()) ((Fl_Spinner*)o)->step(strtod(read_word(),0));
+ } else if (!strcmp(c,"value")) {
+ if (is_valuator()) ((Fl_Valuator*)o)->value(strtod(read_word(),0));
+ if (is_spinner()) ((Fl_Spinner*)o)->value(strtod(read_word(),0));
} else if ((!strcmp(c,"slider_size")||!strcmp(c,"size"))&&is_valuator()==2) {
((Fl_Slider*)o)->slider_size(strtod(read_word(),0));
} else if (!strcmp(c,"textfont")) {
@@ -2508,6 +2572,15 @@ void Fl_Widget_Type::copy_properties() {
d->slider_size(s->slider_size());
}
}
+
+ // copy all attributes specific to Fl_Spinner and derived classes
+ if (is_spinner()) {
+ Fl_Spinner* d = (Fl_Spinner*)live_widget, *s = (Fl_Spinner*)o;
+ d->minimum(s->minimum());
+ d->maximum(s->maximum());
+ d->step(s->step());
+ d->value(s->value());
+ }
/* TODO: implement this
{Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) {
diff --git a/fluid/factory.cxx b/fluid/factory.cxx
index 7eaf5dc87..27b9a5cba 100644
--- a/fluid/factory.cxx
+++ b/fluid/factory.cxx
@@ -394,6 +394,7 @@ public:
if (w < 40) w = 40 ;
}
virtual const char *type_name() {return "Fl_Spinner";}
+ int is_spinner() const { return 1; }
Fl_Widget *widget(int x,int y,int w,int h) {
return new Fl_Spinner(x,y,w,h,"spinner:");}
Fl_Widget_Type *_make() {return new Fl_Spinner_Type();}