From 09783875e44acb5c306ed578999c8c4f2bcce40a Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Tue, 30 Aug 2005 21:57:23 +0000 Subject: [PATCH] FLUD: This fixes the problem that the children of a Widget_Class_Type are positioned with absolute coordintes. The patch adds another button to the FLUID interface named 'Relative' to the right of the widget position. It is only visible if a Widget_Class_Type is selected. If checked, code will be added that creates an Fl_Group at 0, 0 and later repositions it and all its children into the final position. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4554 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- fluid/Fl_Type.h | 8 ++++++++ fluid/Fl_Widget_Type.cxx | 21 +++++++++++++++++++++ fluid/Fl_Window_Type.cxx | 19 ++++++++++++++++++- fluid/widget_panel.cxx | 8 +++++++- fluid/widget_panel.fl | 13 +++++++++---- fluid/widget_panel.h | 3 ++- 6 files changed, 65 insertions(+), 7 deletions(-) diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h index d50ccaf02..9f8f98d2b 100644 --- a/fluid/Fl_Type.h +++ b/fluid/Fl_Type.h @@ -520,8 +520,16 @@ public: class Fl_Widget_Class_Type : private Fl_Window_Type { public: + Fl_Widget_Class_Type() { + write_public_state = 0; + wc_relative = 0; + } // state variables for output: char write_public_state; // true when public: has been printed + char wc_relative; // if true, reposition all child widgets in an Fl_Group + + virtual void write_properties(); + virtual void read_property(const char *); void write_code1(); void write_code2(); diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx index 47d64fa65..f949b64a5 100644 --- a/fluid/Fl_Widget_Type.cxx +++ b/fluid/Fl_Widget_Type.cxx @@ -558,6 +558,27 @@ void h_cb(Fl_Value_Input *i, void *v) { } } +void wc_relative_cb(Fl_Light_Button *i, void *v) { + if (v == LOAD) { + if (!strcmp(current_widget->type_name(), "widget_class")) { + i->show(); + i->value(((Fl_Widget_Class_Type *)current_widget)->wc_relative); + } else { + i->hide(); + } + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && !strcmp(current_widget->type_name(), "widget_class")) { + Fl_Widget_Class_Type *t = (Fl_Widget_Class_Type *)o; + t->wc_relative = i->value(); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + //////////////////////////////////////////////////////////////// // turn number to string or string to number for saving to file: diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx index 52bef08ea..45dc2ea4a 100644 --- a/fluid/Fl_Window_Type.cxx +++ b/fluid/Fl_Window_Type.cxx @@ -1355,10 +1355,23 @@ Fl_Type *Fl_Widget_Class_Type::make() { myo->add(p); myo->modal = 0; myo->non_modal = 0; + myo->wc_relative = 0; return myo; } +void Fl_Widget_Class_Type::write_properties() { + Fl_Window_Type::write_properties(); + if (wc_relative) write_string("position_relative"); +} + +void Fl_Widget_Class_Type::read_property(const char *c) { + if (!strcmp(c,"position_relative")) { + wc_relative = 1; + } else { + Fl_Window_Type::read_property(c); + } +} void Fl_Widget_Class_Type::write_code1() { #if 0 @@ -1399,7 +1412,10 @@ void Fl_Widget_Class_Type::write_code1() { write_h(" %s(int X, int Y, int W, int H, const char *L = 0);\n", name()); write_c("%s::%s(int X, int Y, int W, int H, const char *L)\n", name(), name()); - write_c(" : %s(X, Y, W, H, L) {\n", c); + if (wc_relative) + write_c(" : %s(0, 0, W, H, L) {\n", c); + else + write_c(" : %s(X, Y, W, H, L) {\n", c); } write_c(" %s *o = this;\n", name()); @@ -1409,6 +1425,7 @@ void Fl_Widget_Class_Type::write_code1() { void Fl_Widget_Class_Type::write_code2() { write_extra_code(); + if (wc_relative) write_c("%sposition(X, Y);\n", indent()); if (modal) write_c("%sset_modal();\n", indent()); else if (non_modal) write_c("%sset_non_modal();\n", indent()); if (!((Fl_Window*)o)->border()) write_c("%sclear_border();\n", indent()); diff --git a/fluid/widget_panel.cxx b/fluid/widget_panel.cxx index ce28b56a4..16a4dae9f 100644 --- a/fluid/widget_panel.cxx +++ b/fluid/widget_panel.cxx @@ -241,7 +241,13 @@ Fl_Double_Window* make_widget_panel() { o->callback((Fl_Callback*)h_cb); o->align(FL_ALIGN_TOP_LEFT); } - { Fl_Box* o = new Fl_Box(330, 145, 60, 20); + { Fl_Light_Button* o = new Fl_Light_Button(330, 145, 55, 20, "Relative"); + o->tooltip("If set, widgets inside a widget class of type Fl_Group are repositioned relat\ +ive to the origin at construction time"); + o->labelsize(11); + o->callback((Fl_Callback*)wc_relative_cb); + } + { Fl_Box* o = new Fl_Box(389, 145, 1, 20); Fl_Group::current()->resizable(o); } o->end(); diff --git a/fluid/widget_panel.fl b/fluid/widget_panel.fl index e4772a8a5..aaa6eb69c 100644 --- a/fluid/widget_panel.fl +++ b/fluid/widget_panel.fl @@ -43,7 +43,7 @@ Function {make_widget_panel()} {open } { Fl_Group {} { label GUI - callback propagate_load + callback propagate_load selected xywh {5 25 400 290} labelsize 11 when 0 resizable } { Fl_Group {} { @@ -151,7 +151,7 @@ Function {make_widget_panel()} {open } Fl_Group {} { label {Position:} - callback propagate_load + callback propagate_load open xywh {90 145 300 20} labelfont 1 labelsize 11 align 4 } { Fl_Value_Input widget_x_input { @@ -174,8 +174,13 @@ Function {make_widget_panel()} {open callback h_cb tooltip {The height of the widget.} xywh {270 145 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 } + Fl_Light_Button {} { + label Relative + callback wc_relative_cb + tooltip {If set, widgets inside a widget class of type Fl_Group are repositioned relative to the origin at construction time} xywh {330 145 55 20} labelsize 11 + } Fl_Box {} { - xywh {330 145 60 20} resizable + xywh {389 145 1 20} resizable } } Fl_Group {} { @@ -530,7 +535,7 @@ Function {make_widget_panel()} {open } Fl_Button wLiveMode { label {Live &Mode} - callback live_mode_cb selected + callback live_mode_cb tooltip {Create a live duplicate of the selected widgets to test resizing and menu behavior.} xywh {142 325 84 20} type Toggle labelsize 11 labelcolor 0 } } diff --git a/fluid/widget_panel.h b/fluid/widget_panel.h index da94a50cd..bdb7468c2 100644 --- a/fluid/widget_panel.h +++ b/fluid/widget_panel.h @@ -55,6 +55,8 @@ extern void w_cb(Fl_Value_Input*, void*); extern Fl_Value_Input *widget_w_input; extern void h_cb(Fl_Value_Input*, void*); extern Fl_Value_Input *widget_h_input; +#include +extern void wc_relative_cb(Fl_Light_Button*, void*); extern void slider_size_cb(Fl_Value_Input*, void*); extern void min_cb(Fl_Value_Input*, void*); extern void max_cb(Fl_Value_Input*, void*); @@ -69,7 +71,6 @@ 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*); -#include extern void border_cb(Fl_Light_Button*, void*); extern void modal_cb(Fl_Light_Button*, void*); extern void non_modal_cb(Fl_Light_Button*, void*);