Fluid: widget classes can resize children on instantiation

This commit is contained in:
Matthias Melcher 2022-11-06 14:40:18 +01:00
parent ec47afb7eb
commit b76152cf6c
6 changed files with 52 additions and 16 deletions

View File

@ -754,7 +754,7 @@ void h_cb(Fluid_Coord_Input *i, void *v) {
}
}
void wc_relative_cb(Fl_Light_Button *i, void *v) {
void wc_relative_cb(Fl_Choice *i, void *v) {
if (v == LOAD) {
if (!strcmp(current_widget->type_name(), "widget_class")) {
i->show();

View File

@ -1608,12 +1608,17 @@ Fl_Type *Fl_Widget_Class_Type::make(Strategy strategy) {
void Fl_Widget_Class_Type::write_properties() {
Fl_Window_Type::write_properties();
if (wc_relative) write_string("position_relative");
if (wc_relative==1)
write_string("position_relative");
else if (wc_relative==2)
write_string("position_relative_rescale");
}
void Fl_Widget_Class_Type::read_property(const char *c) {
if (!strcmp(c,"position_relative")) {
wc_relative = 1;
} else if (!strcmp(c,"position_relative_rescale")) {
wc_relative = 2;
} else {
Fl_Window_Type::read_property(c);
}
@ -1684,8 +1689,10 @@ void Fl_Widget_Class_Type::write_code1() {
write_h("%s%s(int X, int Y, int W, int H, const char *L = 0);\n",
indent(1), trimclassname(name()));
write_c("%s::%s(int X, int Y, int W, int H, const char *L) :\n", name(), trimclassname(name()));
if (wc_relative)
if (wc_relative==1)
write_c("%s%s(0, 0, W, H, L)\n{\n", indent(1), c);
else if (wc_relative==2)
write_c("%s%s(0, 0, %d, %d, L)\n{\n", indent(1), c, o->w(), o->h());
else
write_c("%s%s(X, Y, W, H, L)\n{\n", indent(1), c);
}
@ -1698,7 +1705,10 @@ 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 (wc_relative==1)
write_c("%sposition(X, Y);\n", indent());
else if (wc_relative==2)
write_c("%sresize(X, Y, W, H);\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());

View File

@ -111,7 +111,7 @@ public:
}
// 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
char wc_relative; // if 1, reposition all children, if 2, reposition and resize
virtual void write_properties();
virtual void read_property(const char *);

View File

@ -60,6 +60,13 @@ Fluid_Coord_Input *widget_w_input=(Fluid_Coord_Input *)0;
Fluid_Coord_Input *widget_h_input=(Fluid_Coord_Input *)0;
Fl_Menu_Item menu_Children[] = {
{"Fixed", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"Reposition", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"Resize", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Value_Input *widget_flex_size=(Fl_Value_Input *)0;
Fl_Check_Button *widget_flex_fixed=(Fl_Check_Button *)0;
@ -322,12 +329,17 @@ Fl_Double_Window* make_widget_panel() {
widget_h_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
widget_h_input->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* widget_h_input
{ Fl_Light_Button* o = new Fl_Light_Button(335, 150, 65, 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");
{ Fl_Choice* o = new Fl_Choice(335, 150, 65, 20, "Children:");
o->tooltip("When instantiating a widget class, the children can either be fixed in their \
original position, automatically be repositioned, or both repsositioned and re\
sized to fit the container.");
o->down_box(FL_BORDER_BOX);
o->labelsize(11);
o->textsize(11);
o->callback((Fl_Callback*)wc_relative_cb);
} // Fl_Light_Button* o
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->menu(menu_Children);
} // Fl_Choice* o
{ Fl_Box* o = new Fl_Box(398, 150, 1, 20);
Fl_Group::current()->resizable(o);
} // Fl_Box* o

View File

@ -258,7 +258,7 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 te
}
Fl_Group {} {
label {Position:}
callback position_group_cb open selected
callback position_group_cb open
xywh {95 150 314 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input widget_x_input {
@ -285,10 +285,23 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 te
tooltip {The height of the widget.} xywh {275 150 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
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 {335 150 65 20} labelsize 11
Fl_Choice {} {
label {Children:}
callback wc_relative_cb open selected
tooltip {When instantiating a widget class, the children can either be fixed in their original position, automatically be repositioned, or both repsositioned and resized to fit the container.} xywh {335 150 65 20} down_box BORDER_BOX labelsize 11 align 5 textsize 11
} {
MenuItem {} {
label Fixed
xywh {0 0 31 20} labelsize 11
}
MenuItem {} {
label Reposition
xywh {0 0 31 20} labelsize 11
}
MenuItem {} {
label Resize
xywh {0 0 31 20} labelsize 11
}
}
Fl_Box {} {
xywh {398 150 1 20} resizable

View File

@ -47,8 +47,7 @@ extern void w_cb(Fluid_Coord_Input*, void*);
extern Fluid_Coord_Input *widget_w_input;
extern void h_cb(Fluid_Coord_Input*, void*);
extern Fluid_Coord_Input *widget_h_input;
#include <FL/Fl_Light_Button.H>
extern void wc_relative_cb(Fl_Light_Button*, void*);
extern void wc_relative_cb(Fl_Choice*, void*);
extern void flex_size_group_cb(Fl_Group*, void*);
#include <FL/Fl_Value_Input.H>
extern void flex_size_cb(Fl_Value_Input*, void*);
@ -78,6 +77,7 @@ 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 <FL/Fl_Light_Button.H>
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*);
@ -126,6 +126,7 @@ extern void cancel_cb(Fl_Button*, void*);
Fl_Double_Window* make_widget_panel();
extern Fl_Menu_Item menu_[];
extern Fl_Menu_Item menu_1[];
extern Fl_Menu_Item menu_Children[];
extern Fl_Menu_Item menu_2[];
extern Fl_Menu_Item menu_3[];
#endif