FLUID: adding a subset of Fl_Grid child parameters.

This commit is contained in:
Matthias Melcher 2023-10-21 13:18:50 +02:00
parent 7a434575ac
commit f8d7ee6f5c
10 changed files with 690 additions and 17 deletions

View File

@ -172,6 +172,9 @@ public:
~Cell() {}
short row() const { return row_; }
short col() const { return col_; }
Fl_Widget *widget() { return widget_; }
void align(Fl_Grid_Align align) {
align_ = align;

View File

@ -90,6 +90,49 @@ void Fl_Grid_Type::read_property(Fd_Project_Reader &f, const char *c)
}
}
void Fl_Grid_Type::write_parent_properties(Fd_Project_Writer &f, Fl_Type *child, bool encapsulate) {
Fl_Grid *grid;
Fl_Widget *child_widget;
Fl_Grid::Cell *cell;
if (!child->is_true_widget()) goto err;
grid = (Fl_Grid*)o;
child_widget = ((Fl_Widget_Type*)child)->o;
cell = grid->cell(child_widget);
if (!cell) goto err;
if (encapsulate) {
f.write_indent(level+2);
f.write_string("parent_properties {");
}
f.write_indent(level+3);
f.write_string("location {%d %d}", cell->row(), cell->col());
super::write_parent_properties(f, child, false);
if (encapsulate) {
f.write_indent(level+2);
f.write_string("}");
}
return;
err:
super::write_parent_properties(f, child, true);
}
void Fl_Grid_Type::read_parent_properties(Fd_Project_Reader &f, Fl_Type *child, const char *property) {
if (!child->is_true_widget()) {
super::read_parent_properties(f, child, property);
return;
}
Fl_Grid *grid = (Fl_Grid*)o;
Fl_Widget *child_widget = ((Fl_Widget_Type*)child)->o;
int row = -1, col = -1, rowspan = 1, colspan = 1;
Fl_Grid_Align align = FL_GRID_FILL;
if (!strcmp(property, "location")) {
const char *value = f.read_word();
sscanf(value, "%d %d", &row, &col);
property = f.read_word();
}
if (row>=0 && col>=0) grid->widget(child_widget, row, col, rowspan, colspan, (Fl_Grid_Align)align);
super::read_parent_properties(f, child, property);
}
void Fl_Grid_Type::write_code1(Fd_Code_Writer& f) {
const char *var = name() ? name() : "o";
Fl_Grid* grid = (Fl_Grid*)o;
@ -106,6 +149,15 @@ void Fl_Grid_Type::write_code1(Fd_Code_Writer& f) {
}
void Fl_Grid_Type::write_code2(Fd_Code_Writer& f) {
const char *var = name() ? name() : "o";
Fl_Grid* grid = (Fl_Grid*)o;
for (int i=0; i<grid->children(); i++) {
Fl_Widget *c = grid->child(i);
Fl_Grid::Cell *cell = grid->cell(c);
if (cell) {
f.write_c("%s%s->widget(%s->child(%d), %d, %d);\n", f.indent(), var, var, i, cell->row(), cell->col());
}
}
super::write_code2(f);
}
@ -189,7 +241,7 @@ void grid_col_gap_cb(Fl_Value_Input* i, void* v) {
void grid_cb(Fluid_Coord_Input* i, void* v, int what) {
if (v == LOAD) {
if (current_widget->is_a(ID_Grid)) {
int v;
int v = 0;
Fl_Grid *g = ((Fl_Grid*)current_widget->o);
switch (what) {
case 6: v = g->rows(); break;
@ -228,3 +280,57 @@ void grid_cols_cb(Fluid_Coord_Input* i, void* v) {
grid_cb(i, v, 7);
}
void grid_child_cb(Fluid_Coord_Input* i, void* v, int what) {
if ( !current_widget
|| !current_widget->parent
|| !current_widget->parent->is_a(ID_Grid))
{
return;
}
Fl_Grid *g = ((Fl_Grid*)((Fl_Widget_Type*)current_widget->parent)->o);
if (v == LOAD) {
int v = -1;
Fl_Grid::Cell *cell = g->cell(current_widget->o);
if (cell) {
switch (what) {
case 8: v = cell->row(); break;
case 9: v = cell->col(); break;
}
}
i->value(v);
} else {
int mod = 0;
int v2 = 0, old_v = -1, v = (int)i->value();
Fl_Grid::Cell *cell = g->cell(current_widget->o);
if (cell) {
switch (what) {
case 8: old_v = cell->row(); v2 = cell->col(); break;
case 9: old_v = cell->col(); v2 = cell->row(); break;
}
}
if (old_v != v) {
switch (what) {
case 8: g->widget(current_widget->o, v, v2); break;
case 9: g->widget(current_widget->o, v2, v); break;
}
g->need_layout(true);
g->redraw();
mod = 1;
if (mod) set_modflag(1);
}
}
}
void grid_set_row_cb(Fluid_Coord_Input* i, void* v) {
grid_child_cb(i, v, 8);
}
void grid_set_col_cb(Fluid_Coord_Input* i, void* v) {
grid_child_cb(i, v, 9);
}
void grid_set_colspan_cb(Fluid_Coord_Input* i, void* v) {
grid_child_cb(i, v, 10);
}
void grid_set_rowspan_cb(Fluid_Coord_Input* i, void* v) {
grid_child_cb(i, v, 11);
}
void grid_align_cb(Fl_Choice* i, void* v) {
}

View File

@ -36,6 +36,8 @@ public:
bool is_a(ID inID) const FL_OVERRIDE { return (inID==ID_Grid) ? true : super::is_a(inID); }
void write_properties(Fd_Project_Writer &f) FL_OVERRIDE;
void read_property(Fd_Project_Reader &f, const char *) FL_OVERRIDE;
void write_parent_properties(Fd_Project_Writer &f, Fl_Type *child, bool encapsulate) FL_OVERRIDE;
void read_parent_properties(Fd_Project_Reader &f, Fl_Type *child, const char *property) FL_OVERRIDE;
void copy_properties() FL_OVERRIDE;
void write_code1(Fd_Code_Writer& f) FL_OVERRIDE;
void write_code2(Fd_Code_Writer& f) FL_OVERRIDE;

View File

@ -681,6 +681,7 @@ void Fl_Type::write(Fd_Project_Writer &f) {
f.write_word(name());
f.write_open(level);
write_properties(f);
if (parent) parent->write_parent_properties(f, this, true);
f.write_close(level);
if (!is_parent()) return;
// now do children:
@ -736,10 +737,98 @@ void Fl_Type::read_property(Fd_Project_Reader &f, const char *c) {
open_ = 1;
else if (!strcmp(c,"selected"))
select(this,1);
else if (!strcmp(c,"parent_properties"))
if (parent) {
const char *cc = f.read_word(1);
if (strcmp(cc, "{")==0) {
cc = f.read_word();
parent->read_parent_properties(f, this, cc);
} else {
f.read_error("'parent_properties' must be followed by '{'");
}
} else {
f.read_error("Types using 'parent_properties' must have a parent");
f.read_word(); // skip the entire block (this should generate a warning)
}
else
f.read_error("Unknown property \"%s\"", c);
}
/** Write parent properties into the child property list.
Some widgets store information for every child they manage. For example,
Fl_Grid stores the row and column position of every child. This method stores
this information with the child, but it is read and written by the parent.
Parent properties solve several issues. A child will keep parent properties
if copied from on grid into another. The parent does not have to keep lists
of properties that may diverge from the actual order or number of children.
And lastly, properties are read when they are actually needed and don't have
to be stored in some temporary array.
Parent properties are written as their own block at the end of the child's
property list. The block starts with the `parent_properties` keyword, followed
by a list of property/value pairs. The order of properties is significant,
however individual properties can be left out.
To avoid writing the `parent_properties` block unnecessarily, this method
should only generate it if `encapsulate` is set *and* the contained
properties are not at their default.
Lastly, this method should call the super class to give it a chance to append
its own properties.
\see Fl_Grid_Type::write_parent_properties(Fd_Project_Writer &f, Fl_Type *child, bool encapsulate)
\param[in] f the project file writer
\param[in] child write properties for this child, make sure it has the correct type
\param[in] encapsulate write the `parent_properties {}` block if true before writing any properties
*/
void Fl_Type::write_parent_properties(Fd_Project_Writer &f, Fl_Type *child, bool encapsulate) {
(void)f; (void)child; (void)encapsulate;
// nothing to do here
// put the following code into your implementation of write_parent_properties
// if there are actual non-default properties to write
// if (encapsulate) {
// f.write_indent(level+2);
// f.write_string("parent_properties {");
// }
// now write your properties as name/value pairs
// f.write_indent(level+3);
// f.write_string("location {%d %d}", cell->row(), cell->col());
// give the super class a chance to write its properties as well
// super::write_parent_properties(f, child, false);
// close the encapsulation
// if (encapsulate) {
// f.write_indent(level+2);
// f.write_string("}");
// }
}
/** Read parent per-child properties.
A parent widget can store properties for every child that it manages. This
method reads back those properties. The order of properties is significant,
but individual properties can be omitted.
\see Fl_Type::write_parent_properties(Fd_Project_Writer &f, Fl_Type *child, bool encapsulate)
\see Fl_Grid_Type::read_parent_properties(Fd_Project_Reader &f, Fl_Type *child, const char *property)
\param[in] f the project file writer
\param[in] child read properties for this child
\param[in] property the name of a property, or "}" when we reach the end of the list
*/
void Fl_Type::read_parent_properties(Fd_Project_Reader &f, Fl_Type *child, const char *property) {
(void)child;
for (;;) {
if (strcmp(property, "}")==0) break;
f.read_error("Unknown parent property \"%s\"", property);
f.read_word(); // ignore property value
property = f.read_word(); // read next property name
}
}
int Fl_Type::read_fdesign(const char*, const char*) {return 0;}
/**

View File

@ -195,6 +195,8 @@ public:
virtual void write(Fd_Project_Writer &f);
virtual void write_properties(Fd_Project_Writer &f);
virtual void read_property(Fd_Project_Reader &f, const char *);
virtual void write_parent_properties(Fd_Project_Writer &f, Fl_Type *child, bool encapsulate);
virtual void read_parent_properties(Fd_Project_Reader &f, Fl_Type *child, const char *property);
virtual int read_fdesign(const char*, const char*);
virtual void postprocess_read() { }

View File

@ -2658,6 +2658,14 @@ static void load_panel() {
}
}
}
if (current_widget && current_widget->parent->is_a(ID_Grid)) {
if (widget_tab_grid->parent()!=widget_tabs)
widget_tabs->add(widget_tab_grid);
} else {
if (widget_tab_grid->parent()==widget_tabs) {
widget_tabs_repo->add(widget_tab_grid);
}
}
if (numselected)
propagate_load(the_panel, LOAD);
else

View File

@ -18,8 +18,11 @@
#include "widget_panel.h"
#include "Fl_Widget_Type.h"
#include <FL/Fl_Grid.H>
static void cb_(Fl_Tabs* o, void* v) {
Fl_Tabs *widget_tabs=(Fl_Tabs *)0;
static void cb_widget_tabs(Fl_Tabs* o, void* v) {
propagate_load((Fl_Group *)o,v);
}
@ -94,7 +97,7 @@ Fl_Menu_Item menu_3[] = {
Fl_Input *v_input[4]={(Fl_Input *)0};
static void cb_1(Fl_Tile*, void* v) {
static void cb_(Fl_Tile*, void* v) {
wComment->do_callback(wComment, v);
wCallback->do_callback(wCallback, v);
}
@ -111,6 +114,27 @@ Fl_Menu_Item menu_4[] = {
Fl_Box *w_when_box=(Fl_Box *)0;
Fl_Tabs *widget_tabs_repo=(Fl_Tabs *)0;
Fl_Group *widget_tab_grid=(Fl_Group *)0;
Fl_Menu_Item menu_Align[] = {
{"GRID_CENTER", 0, 0, (void*)(FL_GRID_CENTER), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_FILL", 0, 0, (void*)(FL_GRID_FILL), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_PROPORTIONAL", 0, 0, (void*)(FL_GRID_PROPORTIONAL), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_HORIZONTAL", 0, 0, (void*)(FL_GRID_HORIZONTAL), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_VERTICAL", 0, 0, (void*)(FL_GRID_VERTICAL), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_LEFT", 0, 0, (void*)(FL_GRID_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_TOP_LEFT", 0, 0, (void*)(FL_GRID_TOP_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_TOP", 0, 0, (void*)(FL_GRID_TOP), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_TOP_RIGHT", 0, 0, (void*)(FL_GRID_TOP_RIGHT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_RIGHT", 0, 0, (void*)(FL_GRID_RIGHT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_BOTTOM_LEFT", 0, 0, (void*)(FL_GRID_BOTTOM_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_BOTTOM", 0, 0, (void*)(FL_GRID_BOTTOM), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{"GRID_BOTTOM_RIGHT", 0, 0, (void*)(FL_GRID_BOTTOM_RIGHT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Button *wLiveMode=(Fl_Button *)0;
Fl_Button *overlay_button=(Fl_Button *)0;
@ -126,12 +150,12 @@ Fl_Double_Window* make_widget_panel() {
o->labelsize(11);
o->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
o->hotspot(o);
{ Fl_Tabs* o = new Fl_Tabs(10, 10, 400, 350);
o->selection_color((Fl_Color)12);
o->labelsize(11);
o->labelcolor(FL_BACKGROUND2_COLOR);
o->callback((Fl_Callback*)cb_);
o->when(FL_WHEN_NEVER);
{ Fl_Tabs* o = widget_tabs = new Fl_Tabs(10, 10, 400, 350);
widget_tabs->selection_color((Fl_Color)12);
widget_tabs->labelsize(11);
widget_tabs->labelcolor(FL_BACKGROUND2_COLOR);
widget_tabs->callback((Fl_Callback*)cb_widget_tabs);
widget_tabs->when(FL_WHEN_NEVER);
{ Fl_Group* o = new Fl_Group(10, 30, 400, 330, "GUI");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
@ -1004,7 +1028,7 @@ sized to fit the container.");
v_input[3]->callback((Fl_Callback*)v_input_cb, (void*)(3));
} // Fl_Input* v_input[3]
{ Fl_Tile* o = new Fl_Tile(95, 175, 310, 130);
o->callback((Fl_Callback*)cb_1);
o->callback((Fl_Callback*)cb_);
{ Fl_Group* o = new Fl_Group(95, 175, 310, 48);
o->box(FL_FLAT_BOX);
{ wComment = new Fl_Text_Editor(95, 175, 310, 45, "Comment:");
@ -1100,9 +1124,240 @@ access the Widget pointer and \'v\' to access the user value.");
} // Fl_Group* o
o->end();
} // Fl_Group* o
o->end();
Fl_Group::current()->resizable(o);
} // Fl_Tabs* o
o->show();
widget_tabs->end();
Fl_Group::current()->resizable(widget_tabs);
} // Fl_Tabs* widget_tabs
{ Fl_Tabs* o = widget_tabs_repo = new Fl_Tabs(10, 10, 400, 350);
widget_tabs_repo->hide();
{ Fl_Group* o = new Fl_Group(10, 30, 400, 330);
o->hide();
o->end();
Fl_Group::current()->resizable(o);
} // Fl_Group* o
{ widget_tab_grid = new Fl_Group(10, 30, 400, 330, "Grid");
widget_tab_grid->labelsize(11);
widget_tab_grid->callback((Fl_Callback*)propagate_load);
{ Fl_Group* o = new Fl_Group(96, 110, 314, 20, "Location:");
o->labelfont(1);
o->labelsize(11);
o->callback((Fl_Callback*)position_group_cb);
o->align(Fl_Align(FL_ALIGN_LEFT));
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(96, 110, 55, 20, "Row:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->callback((Fl_Callback*)grid_set_row_cb);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(156, 110, 55, 20, "Column:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->callback((Fl_Callback*)grid_set_col_cb);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fl_Choice* o = new Fl_Choice(215, 110, 185, 20, "Align:");
o->down_box(FL_BORDER_BOX);
o->labelsize(11);
o->textsize(11);
o->callback((Fl_Callback*)grid_align_cb);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->menu(menu_Align);
} // Fl_Choice* o
{ Fl_Box* o = new Fl_Box(400, 110, 1, 20);
o->hide();
Fl_Group::current()->resizable(o);
} // Fl_Box* o
o->end();
} // Fl_Group* o
{ Fl_Box* o = new Fl_Box(96, 74, 155, 20, "-- Widget --");
o->labelfont(1);
o->labelsize(12);
o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
} // Fl_Box* o
{ Fl_Group* o = new Fl_Group(96, 145, 314, 20, "Size:");
o->labelfont(1);
o->labelsize(11);
o->callback((Fl_Callback*)position_group_cb);
o->align(Fl_Align(FL_ALIGN_LEFT));
{ Fl_Box* o = new Fl_Box(400, 145, 1, 20);
o->hide();
Fl_Group::current()->resizable(o);
} // Fl_Box* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(96, 145, 55, 20, "Row Span:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->callback((Fl_Callback*)grid_set_rowspan_cb);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(156, 145, 55, 20, "Col Span:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->callback((Fl_Callback*)grid_set_colspan_cb);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
o->end();
} // Fl_Group* o
{ Fl_Box* o = new Fl_Box(96, 179, 155, 20, "-- Grid --");
o->labelfont(1);
o->labelsize(12);
o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
} // Fl_Box* o
{ Fl_Group* o = new Fl_Group(96, 215, 314, 20, "Row:");
o->labelfont(1);
o->labelsize(11);
o->align(Fl_Align(FL_ALIGN_LEFT));
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(96, 215, 55, 20, "Index");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
o->deactivate();
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(156, 215, 55, 20, "Height:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(216, 215, 55, 20, "Weight:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(276, 215, 55, 20, "Gap:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fl_Box* o = new Fl_Box(400, 215, 1, 20);
o->hide();
Fl_Group::current()->resizable(o);
} // Fl_Box* o
o->end();
} // Fl_Group* o
{ Fl_Group* o = new Fl_Group(96, 250, 314, 20, "Column:");
o->labelfont(1);
o->labelsize(11);
o->align(Fl_Align(FL_ALIGN_LEFT));
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(96, 250, 55, 20, "Index");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
o->deactivate();
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(156, 250, 55, 20, "Width:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(216, 250, 55, 20, "Weight:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fluid_Coord_Input* o = new Fluid_Coord_Input(276, 250, 55, 20, "Gap:");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
o->selection_color(FL_SELECTION_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(11);
o->labelcolor(FL_FOREGROUND_COLOR);
o->textsize(11);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
o->when(FL_WHEN_RELEASE);
} // Fluid_Coord_Input* o
{ Fl_Box* o = new Fl_Box(400, 250, 1, 20);
o->hide();
Fl_Group::current()->resizable(o);
} // Fl_Box* o
o->end();
} // Fl_Group* o
{ Fl_Box* o = new Fl_Box(25, 43, 370, 28, "The Fl_Grid implementation in FLUID is still experimental!");
o->labelfont(1);
o->labelsize(11);
o->labelcolor((Fl_Color)1);
} // Fl_Box* o
widget_tab_grid->end();
} // Fl_Group* widget_tab_grid
o->hide();
widget_tabs_repo->end();
} // Fl_Tabs* widget_tabs_repo
{ Fl_Group* o = new Fl_Group(10, 370, 400, 20);
o->labelsize(11);
{ wLiveMode = new Fl_Button(10, 370, 80, 20, "Live &Resize");

View File

@ -23,6 +23,9 @@ comment {//
decl {\#include "Fl_Widget_Type.h"} {private global
}
decl {\#include <FL/Fl_Grid.H>} {selected private global
}
decl {\#include "custom_widgets.h"} {public global
}
@ -34,13 +37,14 @@ Function {make_widget_panel()} {
xywh {566 244 420 400} type Double labelsize 11 align 80 resizable hotspot
code0 {o->size_range(o->w(), o->h());} size_range {420 400 0 0} visible
} {
Fl_Tabs {} {
callback {propagate_load((Fl_Group *)o,v);} open
Fl_Tabs widget_tabs {
callback {propagate_load((Fl_Group *)o,v);}
xywh {10 10 400 350} selection_color 12 labelsize 11 labelcolor 7 when 0 resizable
code0 {o->show();}
} {
Fl_Group {} {
label GUI
callback propagate_load open selected
callback propagate_load open
xywh {10 30 400 330} labelsize 11 when 0 resizable
} {
Fl_Group {} {
@ -870,6 +874,201 @@ wCallback->do_callback(wCallback, v);} open
}
}
}
Fl_Tabs widget_tabs_repo {
xywh {10 10 400 350} hide
code0 {o->hide();}
} {
Fl_Group {} {open
xywh {10 30 400 330} hide resizable
} {}
Fl_Group widget_tab_grid {
label Grid
callback propagate_load open
xywh {10 30 400 330} labelsize 11
} {
Fl_Group {} {
label {Location:}
callback position_group_cb open
xywh {96 110 314 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input {} {
label {Row:}
callback grid_set_row_cb
xywh {96 110 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Input {} {
label {Column:}
callback grid_set_col_cb
xywh {156 110 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Choice {} {
label {Align:}
callback grid_align_cb
xywh {215 110 185 20} down_box BORDER_BOX labelsize 11 align 5 textsize 11
} {
MenuItem {} {
label GRID_CENTER
user_data FL_GRID_CENTER user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_FILL
user_data FL_GRID_FILL user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_PROPORTIONAL
user_data FL_GRID_PROPORTIONAL user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_HORIZONTAL
user_data FL_GRID_HORIZONTAL user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_VERTICAL
user_data FL_GRID_VERTICAL user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_LEFT
user_data FL_GRID_LEFT user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_TOP_LEFT
user_data FL_GRID_TOP_LEFT user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_TOP
user_data FL_GRID_TOP user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_TOP_RIGHT
user_data FL_GRID_TOP_RIGHT user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_RIGHT
user_data FL_GRID_RIGHT user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_BOTTOM_LEFT
user_data FL_GRID_BOTTOM_LEFT user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_BOTTOM
user_data FL_GRID_BOTTOM user_data_type long
xywh {10 10 31 20} labelsize 11
}
MenuItem {} {
label GRID_BOTTOM_RIGHT
user_data FL_GRID_BOTTOM_RIGHT user_data_type long
xywh {10 10 31 20} labelsize 11
}
}
Fl_Box {} {
xywh {400 110 1 20} hide resizable
}
}
Fl_Box {} {
label {-- Widget --}
xywh {96 74 155 20} labelfont 1 labelsize 12 align 20
}
Fl_Group {} {
label {Size:}
callback position_group_cb open
xywh {96 145 314 20} labelfont 1 labelsize 11 align 4
} {
Fl_Box {} {
xywh {400 145 1 20} hide resizable
}
Fl_Input {} {
label {Row Span:}
callback grid_set_rowspan_cb
xywh {96 145 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Input {} {
label {Col Span:}
callback grid_set_colspan_cb
xywh {156 145 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
}
Fl_Box {} {
label {-- Grid --}
xywh {96 179 155 20} labelfont 1 labelsize 12 align 20
}
Fl_Group {} {
label {Row:} open
xywh {96 215 314 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input {} {
label Index
xywh {96 215 55 20} labelsize 11 align 5 textsize 11 deactivate
class Fluid_Coord_Input
}
Fl_Input {} {
label {Height:}
xywh {156 215 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Input {} {
label {Weight:}
xywh {216 215 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Input {} {
label {Gap:}
xywh {276 215 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Box {} {
xywh {400 215 1 20} hide resizable
}
}
Fl_Group {} {
label {Column:} open
xywh {96 250 314 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input {} {
label Index
xywh {96 250 55 20} labelsize 11 align 5 textsize 11 deactivate
class Fluid_Coord_Input
}
Fl_Input {} {
label {Width:}
xywh {156 250 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Input {} {
label {Weight:}
xywh {216 250 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Input {} {
label {Gap:}
xywh {276 250 55 20} labelsize 11 align 5 textsize 11
class Fluid_Coord_Input
}
Fl_Box {} {
xywh {400 250 1 20} hide resizable
}
}
Fl_Box {} {
label {The Fl_Grid implementation in FLUID is still experimental!}
xywh {25 43 370 28} labelfont 1 labelsize 11 labelcolor 1
}
}
}
Fl_Group {} {open
xywh {10 370 400 20} labelsize 11
} {

View File

@ -22,6 +22,7 @@
#include "custom_widgets.h"
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Tabs.H>
extern Fl_Tabs *widget_tabs;
#include <FL/Fl_Group.H>
extern void propagate_load(Fl_Group*, void*);
#include <FL/Fl_Input.H>
@ -142,6 +143,13 @@ extern void when_cb(Fl_Menu_Button*, void*);
#include <FL/Fl_Input_Choice.H>
extern void user_data_type_cb(Fl_Input_Choice*, void*);
extern Fl_Box *w_when_box;
extern Fl_Tabs *widget_tabs_repo;
extern Fl_Group *widget_tab_grid;
extern void grid_set_row_cb(Fluid_Coord_Input*, void*);
extern void grid_set_col_cb(Fluid_Coord_Input*, void*);
extern void grid_align_cb(Fl_Choice*, void*);
extern void grid_set_rowspan_cb(Fluid_Coord_Input*, void*);
extern void grid_set_colspan_cb(Fluid_Coord_Input*, void*);
extern void live_mode_cb(Fl_Button*, void*);
extern Fl_Button *wLiveMode;
extern void overlay_cb(Fl_Button*, void*);
@ -155,4 +163,5 @@ extern Fl_Menu_Item menu_Children[];
extern Fl_Menu_Item menu_2[];
extern Fl_Menu_Item menu_3[];
extern Fl_Menu_Item menu_4[];
extern Fl_Menu_Item menu_Align[];
#endif

View File

@ -322,7 +322,7 @@ void Fl_Grid::draw() {
This is called automatically when the Fl_Grid is resized. You need to
call it once after you added widgets or moved widgets between cells.
Calling it once after all modfications are completed is enough.
Calling it once after all modifications are completed is enough.
\todo Document when and why to call layout() w/o args. See Fl_Flex::layout()