summaryrefslogtreecommitdiff
path: root/test/grid_alignment.cxx
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2023-10-16 22:11:33 +0200
committerAlbrecht Schlosser <albrechts.fltk@online.de>2023-10-16 22:18:24 +0200
commit38871c5b3192bccd508f3686413d4e56041ab091 (patch)
tree26db3ef4a73e93f23a1d1bcb037652aafc26dbed /test/grid_alignment.cxx
parente7b790ae31b3c5d5e819f35f5fa8bd3619f7103f (diff)
Add Fl_Grid widget and test and demo programs
- FL/Fl_Grid.H: header file - src/Fl_Grid.cxx: implementation - examples/grid-simple.cxx: simple example program - test/cube.cxx: use Fl_Grid for layout - test/grid_alignment.cxx: test cell alignment and other functions - test/grid_buttons.cxx: demo program as discussed in fltk.general - test/grid_login.cxx: like test/flex_login.cxx but with Fl_Grid - test/flex_login.cxx: modified to match test/grid_login.cxx
Diffstat (limited to 'test/grid_alignment.cxx')
-rw-r--r--test/grid_alignment.cxx203
1 files changed, 203 insertions, 0 deletions
diff --git a/test/grid_alignment.cxx b/test/grid_alignment.cxx
new file mode 100644
index 000000000..59a5368c3
--- /dev/null
+++ b/test/grid_alignment.cxx
@@ -0,0 +1,203 @@
+//
+// Fl_Grid demo program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2021 by Albrecht Schlosser
+// Copyright 2022-2023 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// https://www.fltk.org/COPYING.php
+//
+// Please see the following page on how to report bugs and issues:
+//
+// https://www.fltk.org/bugs.php
+//
+
+//
+// This program tests several different alignment features of Fl_Grid.
+//
+
+#include <FL/Fl.H>
+#include <FL/Fl_Double_Window.H>
+#include <FL/Fl_Grid.H>
+#include <FL/Fl_Button.H>
+#include <FL/Fl_Input.H>
+#include <FL/Fl_Box.H>
+
+// Test function to change the layout (executed by timer callback)
+
+#define TEST_RELAYOUT (0)
+#define TEST_REMOVE_NOTIFY (0)
+
+#if (TEST_RELAYOUT)
+void relayout_cb(void *v) {
+ Fl_Grid *grid = (Fl_Grid *)v;
+ grid->layout(5, 5, 8, 4);
+ grid->margin(10, 20, 30, 40);
+ grid->layout();
+ grid->redraw();
+}
+#endif
+
+#if TEST_REMOVE_NOTIFY
+
+void remove_cb(void *v) {
+ static int n = 10;
+ n--;
+ Fl_Grid *grid = (Fl_Grid *)v;
+#if (0) // test 1: remove() the widget -- leaks memory (!)
+ grid->remove(n);
+#else // test 2: delete the widget -- no leak
+ delete grid->child(0);
+#endif
+ if (n > 0)
+ Fl::repeat_timeout(0.3, remove_cb, v);
+}
+
+#endif
+
+int main(int argc, char **argv) {
+ Fl_Grid::Cell *c;
+ Fl_Box *b;
+ Fl_Double_Window *win = new Fl_Double_Window(440, 350, "FLTK 1.4.0 - Fl_Grid Alignment Test");
+ Fl_Grid *grid = new Fl_Grid(10, 10, 420, 330);
+ grid->layout(7, 7, 8, 4); // cols, rows, margin, gap
+ grid->box(FL_FLAT_BOX);
+ grid->color(FL_WHITE);
+
+ // add boxes (top and bottom rows)
+
+ for (int col = 0; col < 7; col++) {
+ grid->col_width(col, 50);
+ b = new Fl_Box(0, 0, 20, 20); // variable size
+ if (col == 5) {
+ b->size(4, 20); // reduce width
+ grid->col_width(col, 4); // new min. width
+ grid->col_weight(col, 0); // no hor. resizing
+ }
+ b->box(FL_FLAT_BOX);
+ b->color(FL_BLUE);
+ grid->widget(b, 0, col);
+
+ if (col == 5)
+ b = new Fl_Box(0, 0, 4, 20); // variable size
+ else
+ b = new Fl_Box(0, 0, 20, 20); // variable size
+ b->box(FL_FLAT_BOX);
+ b->color(FL_RED);
+ grid->widget(b, 6, col);
+ }
+
+ // add boxes (left and right columns)
+
+ grid->row_height(0, 40);
+ grid->row_height(6, 40);
+
+ for (int row = 1; row < 6; row++) {
+ grid->row_height(row, 40);
+ b = new Fl_Box(0, 0, 20, 20); // fixed size, see alignment below
+ b->box(FL_FLAT_BOX);
+ b->color(FL_RED);
+ switch(row) {
+ case 1: grid->widget(b, row, 0, FL_GRID_FILL); break;
+ case 2: grid->widget(b, row, 0, FL_ALIGN_CENTER); break;
+ case 3: grid->widget(b, row, 0, FL_ALIGN_BOTTOM_RIGHT); break;
+ case 4: grid->widget(b, row, 0, FL_ALIGN_BOTTOM_RIGHT); break;
+ case 5: grid->widget(b, row, 0, FL_ALIGN_TOP_RIGHT); break;
+ default: break;
+ }
+
+ b = new Fl_Box(0, 0, 20, 20);
+ b->box(FL_FLAT_BOX);
+ b->color(FL_GREEN);
+ c = grid->widget(b, row, 6, FL_ALIGN_CENTER);
+ }
+
+ // two more boxes to demonstrate widget alignment inside the cell
+
+ for (int row = 4; row < 6; row++) {
+ b = new Fl_Box(0, 0, 20, 20); // fixed size, see alignment below
+ b->box(FL_FLAT_BOX);
+ b->color(FL_MAGENTA);
+ c = grid->widget(b, row, 1); // default alignment: FL_GRID_FILL
+ if (row == 4)
+ c->align(FL_ALIGN_BOTTOM_LEFT); // alignment uses widget size
+ if (row == 5)
+ c->align(FL_ALIGN_TOP_LEFT); // alignment uses widget size
+ }
+
+ // one vertical box (line), spanning 5 rows
+
+ b = new Fl_Box(0, 0, 2, 2); // extends vertically
+ b->box(FL_FLAT_BOX);
+ b->color(FL_BLACK);
+ grid->widget(b, 1, 5, 5, 1, FL_GRID_VERTICAL | FL_ALIGN_RIGHT);
+
+ // add a textbox with label or title, spanning 5 cells, centered
+
+ b = new Fl_Box(0, 0, 1, 1); // variable size
+ b->label("Hello, Fl_Grid !");
+ b->labelfont(FL_BOLD + FL_ITALIC);
+ b->labelsize(30);
+ b->labeltype(FL_SHADOW_LABEL);
+ grid->widget(b, 1, 1, 1, 5); // rowspan = 1, colspan = 5
+
+ // add a footer textbox, spanning 3 cells, right aligned
+
+ b = new Fl_Box(0, 0, 1, 10); // variable size
+ b->label("FLTK/test/grid_alignment.cxx");
+ b->labelfont(FL_COURIER);
+ b->labelsize(11);
+ b->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT);
+ grid->widget(b, 5, 2, 1, 3, FL_GRID_HORIZONTAL | FL_ALIGN_BOTTOM);
+
+ // input widgets with fixed size and alignment inside the cell
+
+ Fl_Input *i1 = new Fl_Input(0, 0, 100, 30, "Username:");
+ c = grid->widget(i1, 2, 3, 1, 2); // widget, col, row, colspan, rowspan
+ c->align(FL_GRID_HORIZONTAL); // widget alignment in cell
+
+ Fl_Input *i2 = new Fl_Input(0, 0, 100, 30, "Password:");
+ c = grid->widget(i2, 3, 3, 1, 2); // widget, col, row, colspan, rowspan
+ c->align(FL_GRID_HORIZONTAL); // widget alignment in cell
+
+ // the login button spans 2 columns
+
+ Fl_Button *bt = new Fl_Button(0, 0, 10, 30, "Login");
+ grid->widget(bt, 4, 3, 1, 2, FL_GRID_HORIZONTAL); // widget, col, row, colspan, rowspan, alignment
+
+ grid->row_weight(1, 90);
+ grid->row_weight(2, 0);
+ grid->row_weight(3, 0);
+ grid->row_weight(4, 0);
+
+ grid->col_weight(0, 30);
+ grid->col_weight(4, 90);
+
+ grid->row_gap(5, 12);
+
+ grid->end();
+ grid->layout();
+ grid->debug(0);
+ // grid->show_grid(1); // enable to display grid helper lines
+ win->end();
+ win->resizable(grid);
+ win->size_range(440, 350);
+ win->show(argc, argv);
+
+#if (TEST_RELAYOUT)
+ Fl::add_timeout(5.0, relayout_cb, grid);
+#endif
+
+#if (TEST_REMOVE_NOTIFY)
+ Fl::add_timeout(3.0, remove_cb, grid);
+#endif
+
+ // return Fl::run();
+ int ret = Fl::run();
+ grid->clear_layout();
+ delete win;
+ return ret;
+}