summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rw-r--r--fluid/Fl_Type.h4
-rw-r--r--fluid/Fl_Widget_Type.cxx95
-rw-r--r--fluid/Fl_Window_Type.cxx12
-rw-r--r--fluid/widget_panel.cxx61
-rw-r--r--fluid/widget_panel.fl55
-rw-r--r--fluid/widget_panel.h6
7 files changed, 221 insertions, 13 deletions
diff --git a/CHANGES b/CHANGES
index d69d9a34a..9e5443313 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,7 @@ CHANGES IN FLTK 1.1.7
- Documentation fixes (STR #571, STR #648, STR #692, STR
#730, STR #744, STR #745, STR #931, STR #942, STR #960,
STR #969)
+ - FLUID now supports 'size_range()' (STR #851)
- FLUID selection boxes now synchronised (STR #964)
- fl_filename_list now recognizes pathnames without trailing
slash as directions (STR #854)
diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h
index 8220273bb..eaacb3a29 100644
--- a/fluid/Fl_Type.h
+++ b/fluid/Fl_Type.h
@@ -485,7 +485,7 @@ protected:
public:
- Fl_Window_Type() { drag = dx = dy = 0; }
+ Fl_Window_Type() { drag = dx = dy = 0; sr_min_w = sr_min_h = sr_max_w = sr_max_h = 0; }
uchar modal, non_modal;
Fl_Type *make();
@@ -511,6 +511,8 @@ public:
Fl_Widget *enter_live_mode(int top=0);
void leave_live_mode();
void copy_properties();
+
+ int sr_min_w, sr_min_h, sr_max_w, sr_max_h;
};
class Fl_Widget_Class_Type : private Fl_Window_Type {
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index 170b0fd1d..f0ba996bf 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -1284,8 +1284,94 @@ void textcolor_cb(Fl_Button* i, void* v) {
////////////////////////////////////////////////////////////////
// Kludges to the panel for subclasses:
+void min_w_cb(Fl_Value_Input* i, void* v) {
+ if (v == LOAD) {
+ if (!current_widget->is_window()) {i->parent()->hide(); return;}
+ i->parent()->show();
+ i->value(((Fl_Window_Type*)current_widget)->sr_min_w);
+ } else {
+ int n = i->value();
+ for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
+ if (o->selected && o->is_window()) {
+ ((Fl_Window_Type*)current_widget)->sr_min_w = n;
+ }
+ }
+ }
+}
+
+void min_h_cb(Fl_Value_Input* i, void* v) {
+ if (v == LOAD) {
+ i->value(((Fl_Window_Type*)current_widget)->sr_min_h);
+ } else {
+ int n = i->value();
+ for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
+ if (o->selected && o->is_window()) {
+ ((Fl_Window_Type*)current_widget)->sr_min_h = n;
+ }
+ }
+ }
+}
+
+void max_w_cb(Fl_Value_Input* i, void* v) {
+ if (v == LOAD) {
+ i->value(((Fl_Window_Type*)current_widget)->sr_max_w);
+ } else {
+ int n = i->value();
+ for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
+ if (o->selected && o->is_window()) {
+ ((Fl_Window_Type*)current_widget)->sr_max_w = n;
+ }
+ }
+ }
+}
+
+void max_h_cb(Fl_Value_Input* i, void* v) {
+ if (v == LOAD) {
+ i->value(((Fl_Window_Type*)current_widget)->sr_max_h);
+ } else {
+ int n = i->value();
+ for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
+ if (o->selected && o->is_window()) {
+ ((Fl_Window_Type*)current_widget)->sr_max_h = n;
+ }
+ }
+ }
+}
+
+void set_min_size_cb(Fl_Button*, void* v) {
+ if (v == LOAD) {
+ } else {
+ for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
+ if (o->selected && o->is_window()) {
+ Fl_Window_Type *win = (Fl_Window_Type*)current_widget;
+ win->sr_min_w = win->o->w();
+ win->sr_min_h = win->o->h();
+ }
+ }
+ propagate_load(the_panel, LOAD);
+ }
+}
+
+void set_max_size_cb(Fl_Button*, void* v) {
+ if (v == LOAD) {
+ } else {
+ for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
+ if (o->selected && o->is_window()) {
+ Fl_Window_Type *win = (Fl_Window_Type*)current_widget;
+ win->sr_max_w = win->o->w();
+ win->sr_max_h = win->o->h();
+ }
+ }
+ propagate_load(the_panel, LOAD);
+ }
+}
+
void slider_size_cb(Fl_Value_Input* i, void* v) {
if (v == LOAD) {
+ if (current_widget->is_window())
+ i->parent()->hide();
+ else
+ i->parent()->show();
if (current_widget->is_valuator()!=2) {i->deactivate(); return;}
i->activate();
i->value(((Fl_Slider*)(current_widget->o))->slider_size());
@@ -1523,6 +1609,15 @@ void live_mode_cb(Fl_Button*o,void *v) {
live_window->resizable(live_widget);
live_window->set_modal(); // block all other UI
live_window->callback(leave_live_mode_cb);
+ if (current_widget->is_window()) {
+ Fl_Window_Type *w = (Fl_Window_Type*)current_widget;
+ int mw = w->sr_min_w; if (mw>0) mw += 20;
+ int mh = w->sr_min_h; if (mh>0) mh += 55;
+ int MW = w->sr_max_w; if (MW>0) MW += 20;
+ int MH = w->sr_max_h; if (MH>2) MH += 55;
+ if (mw || mh || MW || MH)
+ live_window->size_range(mw, mh, MW, MH);
+ }
live_window->show();
} else o->value(0);
} else o->value(0);
diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx
index 9223ae918..6ded1196f 100644
--- a/fluid/Fl_Window_Type.cxx
+++ b/fluid/Fl_Window_Type.cxx
@@ -1251,6 +1251,11 @@ void Fl_Window_Type::write_code2() {
write_cstring(xclass);
write_c(");\n");
}
+ if (sr_max_w || sr_max_h) {
+ write_c("%so->size_range(%d, %d, %d, %d);\n", indent(), sr_min_w, sr_min_h, sr_max_w, sr_max_h);
+ } else if (sr_min_w || sr_min_h) {
+ write_c("%so->size_range(%d, %d);\n", indent(), sr_min_w, sr_min_h);
+ }
write_c("%so->end();\n", indent());
if (((Fl_Window*)o)->resizable() == o)
write_c("%so->resizable(o);\n", indent());
@@ -1263,6 +1268,8 @@ void Fl_Window_Type::write_properties() {
else if (non_modal) write_string("non_modal");
if (!((Fl_Window*)o)->border()) write_string("noborder");
if (xclass) {write_string("xclass"); write_word(xclass);}
+ if (sr_min_w || sr_min_h || sr_max_w || sr_max_h)
+ write_string("size_range {%d %d %d %d}", sr_min_w, sr_min_h, sr_max_w, sr_max_h);
if (o->visible()) write_string("visible");
}
@@ -1279,6 +1286,11 @@ void Fl_Window_Type::read_property(const char *c) {
} else if (!strcmp(c,"xclass")) {
storestring(read_word(),xclass);
((Fl_Window*)o)->xclass(xclass);
+ } else if (!strcmp(c,"size_range")) {
+ int mw, mh, MW, MH;
+ if (sscanf(read_word(),"%d %d %d %d",&mw,&mh,&MW,&MH) == 4) {
+ sr_min_w = mw; sr_min_h = mh; sr_max_w = MW; sr_max_h = MH;
+ }
} else if (!strcmp(c,"xywh")) {
Fl_Widget_Type::read_property(c);
pasteoffset = 0; // make it not apply to contents
diff --git a/fluid/widget_panel.cxx b/fluid/widget_panel.cxx
index 2b16e36fa..270b33e7b 100644
--- a/fluid/widget_panel.cxx
+++ b/fluid/widget_panel.cxx
@@ -51,12 +51,12 @@ Fl_Double_Window* make_widget_panel() {
w = o;
o->labelsize(11);
w->hotspot(o);
- { Fl_Tabs* o = new Fl_Tabs(5, 5, 400, 310);
+ { Fl_Tabs* o = new Fl_Tabs(3, 5, 402, 310);
o->selection_color((Fl_Color)4);
o->labelsize(11);
o->callback((Fl_Callback*)cb_);
o->when(FL_WHEN_NEVER);
- { Fl_Group* o = new Fl_Group(5, 25, 400, 290, "GUI");
+ { Fl_Group* o = new Fl_Group(3, 25, 402, 290, "GUI");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->when(FL_WHEN_NEVER);
@@ -288,6 +288,61 @@ Fl_Double_Window* make_widget_panel() {
}
o->end();
}
+ { Fl_Group* o = new Fl_Group(90, 180, 300, 20, "Size Range:");
+ o->labelfont(1);
+ o->labelsize(11);
+ o->callback((Fl_Callback*)propagate_load);
+ o->align(FL_ALIGN_LEFT);
+ o->hide();
+ { Fl_Value_Input* o = new Fl_Value_Input(90, 180, 55, 20, "Minimum Size:");
+ o->tooltip("The size of the slider.");
+ o->labelsize(11);
+ o->maximum(2048);
+ o->step(1);
+ o->textsize(11);
+ o->callback((Fl_Callback*)min_w_cb);
+ o->align(FL_ALIGN_TOP_LEFT);
+ }
+ { Fl_Value_Input* o = new Fl_Value_Input(150, 180, 55, 20);
+ o->tooltip("The minimum value of the widget.");
+ o->labelsize(11);
+ o->maximum(2048);
+ o->step(1);
+ o->textsize(11);
+ o->callback((Fl_Callback*)min_h_cb);
+ o->align(FL_ALIGN_TOP_LEFT);
+ }
+ { Fl_Button* o = new Fl_Button(210, 180, 25, 20, "set");
+ o->labelsize(11);
+ o->callback((Fl_Callback*)set_min_size_cb);
+ }
+ { Fl_Value_Input* o = new Fl_Value_Input(240, 180, 55, 20, "Maximum Size:");
+ o->tooltip("The maximum value of the widget.");
+ o->labelsize(11);
+ o->maximum(2048);
+ o->step(1);
+ o->textsize(11);
+ o->callback((Fl_Callback*)max_w_cb);
+ o->align(FL_ALIGN_TOP_LEFT);
+ }
+ { Fl_Value_Input* o = new Fl_Value_Input(300, 180, 55, 20);
+ o->tooltip("The resolution of the widget value.");
+ o->labelsize(11);
+ o->maximum(2048);
+ o->step(1);
+ o->textsize(11);
+ o->callback((Fl_Callback*)max_h_cb);
+ o->align(FL_ALIGN_TOP_LEFT);
+ }
+ { Fl_Button* o = new Fl_Button(360, 180, 25, 20, "set");
+ o->labelsize(11);
+ o->callback((Fl_Callback*)set_max_size_cb);
+ }
+ { Fl_Box* o = new Fl_Box(390, 180, 0, 20);
+ Fl_Group::current()->resizable(o);
+ }
+ o->end();
+ }
{ Shortcut_Button* o = new Shortcut_Button(90, 205, 300, 20, "Shortcut:");
o->tooltip("The shortcut key for the widget.");
o->box(FL_DOWN_BOX);
@@ -387,7 +442,7 @@ Fl_Double_Window* make_widget_panel() {
o->end();
Fl_Group::current()->resizable(o);
}
- { Fl_Group* o = new Fl_Group(5, 25, 400, 290, "Style");
+ { Fl_Group* o = new Fl_Group(3, 25, 402, 290, "Style");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->when(FL_WHEN_NEVER);
diff --git a/fluid/widget_panel.fl b/fluid/widget_panel.fl
index fc3ed02c1..dde48e1a4 100644
--- a/fluid/widget_panel.fl
+++ b/fluid/widget_panel.fl
@@ -34,20 +34,20 @@ comment {//
Function {make_widget_panel()} {open
} {
Fl_Window {} {open
- xywh {353 184 410 355} type Double labelsize 11 hide resizable hotspot
- code0 {o->size_range(o->w(), o->h());}
+ xywh {353 184 410 355} type Double labelsize 11 resizable hotspot
+ code0 {o->size_range(o->w(), o->h());} visible
} {
Fl_Tabs {} {
callback {propagate_load((Fl_Group *)o,v);} open
- xywh {5 5 400 310} selection_color 4 labelsize 11 when 0 resizable
+ xywh {3 5 402 310} selection_color 4 labelsize 11 when 0 resizable
} {
Fl_Group {} {
label GUI
- callback propagate_load
- xywh {5 25 400 290} labelsize 11 when 0 resizable
+ callback propagate_load open
+ xywh {3 25 402 290} labelsize 11 when 0 resizable
} {
Fl_Group {} {
- callback propagate_load
+ callback propagate_load open
xywh {3 25 396 285} labelsize 11 resizable
} {
Fl_Group {} {
@@ -184,7 +184,7 @@ Function {make_widget_panel()} {open
}
Fl_Group {} {
label {Values:}
- callback propagate_load
+ callback propagate_load selected
xywh {90 180 300 20} labelfont 1 labelsize 11 align 4
} {
Fl_Value_Input {} {
@@ -216,6 +216,43 @@ Function {make_widget_panel()} {open
xywh {390 180 0 20} resizable
}
}
+ Fl_Group {} {
+ label {Size Range:}
+ callback propagate_load
+ xywh {90 180 300 20} labelfont 1 labelsize 11 align 4 hide
+ } {
+ Fl_Value_Input {} {
+ label {Minimum Size:}
+ callback min_w_cb
+ tooltip {The size of the slider.} xywh {90 180 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11
+ }
+ Fl_Value_Input {} {
+ callback min_h_cb
+ tooltip {The minimum value of the widget.} xywh {150 180 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11
+ }
+ Fl_Button {} {
+ label set
+ callback set_min_size_cb
+ xywh {210 180 25 20} labelsize 11
+ }
+ Fl_Value_Input {} {
+ label {Maximum Size:}
+ callback max_w_cb
+ tooltip {The maximum value of the widget.} xywh {240 180 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11
+ }
+ Fl_Value_Input {} {
+ callback max_h_cb
+ tooltip {The resolution of the widget value.} xywh {300 180 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11
+ }
+ Fl_Button {} {
+ label set
+ callback set_max_size_cb
+ xywh {360 180 25 20} labelsize 11
+ }
+ Fl_Box {} {
+ xywh {390 180 0 20} resizable
+ }
+ }
Fl_Button {} {
label {Shortcut:}
callback shortcut_in_cb
@@ -290,7 +327,7 @@ Function {make_widget_panel()} {open
Fl_Group {} {
label Style
callback propagate_load
- xywh {5 25 400 290} labelsize 11 when 0 hide
+ xywh {3 25 402 290} labelsize 11 when 0 hide
} {
Fl_Group {} {
callback propagate_load
@@ -489,7 +526,7 @@ Function {make_widget_panel()} {open
}
}
}
- Fl_Group {} {selected
+ Fl_Group {} {
xywh {8 321 391 24} labelsize 11
} {
Fl_Box {} {
diff --git a/fluid/widget_panel.h b/fluid/widget_panel.h
index 55e4524a5..da94a50cd 100644
--- a/fluid/widget_panel.h
+++ b/fluid/widget_panel.h
@@ -60,6 +60,12 @@ extern void min_cb(Fl_Value_Input*, void*);
extern void max_cb(Fl_Value_Input*, void*);
extern void step_cb(Fl_Value_Input*, void*);
extern void value_cb(Fl_Value_Input*, void*);
+extern void min_w_cb(Fl_Value_Input*, void*);
+extern void min_h_cb(Fl_Value_Input*, void*);
+extern void set_min_size_cb(Fl_Button*, void*);
+extern void max_w_cb(Fl_Value_Input*, void*);
+extern void max_h_cb(Fl_Value_Input*, void*);
+extern void set_max_size_cb(Fl_Button*, void*);
#include "Shortcut_Button.h"
extern void shortcut_in_cb(Shortcut_Button*, void*);
extern void xclass_cb(Fl_Input*, void*);