summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2022-07-28 18:26:07 +0200
committerAlbrecht Schlosser <albrechts.fltk@online.de>2022-08-01 15:33:20 +0200
commitf37aca15e9786a7192e36ea4b0295ab4dc12819f (patch)
tree549680fc1da3b72de9a38ed24d9ce1521b97cf71 /test
parentde8e6de25b33a3bf6c00da603d1332042ae51cf2 (diff)
Add Fl_Flex widget from Karsten Pedersen (issue #255)
This work is based on the repository and latest commit: https://github.com/osen/FL_Flex.git commit 36e4ed75a00daac825b87e81295818b4650991f5 Author: Karsten Pedersen <...> Date: Fri Apr 23 12:06:16 2021 +0000 Added Fltk (LGPL) license. This widget is similar to Fl_Pack and supports either one row or one column of widgets but has some more features. Test and demo programs are included: test/flex_login.cxx: simple "login window" demo program test/flex_demo.cxx: slightly more complex demo program The original demo programs can still be compiled and built with the new widget provided you '#include <FL/Fl_Flex.H>'. Backwards compatible methods are included (except debug()). The original widget has been modified to match FLTK standards and enhanced in several ways, including: - support box frames - add HORIZONTAL and VERTICAL enum values (as in Fl_Pack) - add horizontal() method (as in Fl_Pack) - use type() rather than internal 'direction' variable - add standard widget constructor (x, y, w, h, label) - add margin and gap accessors rather than hard coding constants - improve test and demo programs - add documentation - replace <vector> with array as required by FLTK CMP - rename camelCase method names, keeping old names for compatibility: - change 'setSize(Fl_Widget*, int)' to 'set_size(Fl_Widget*, int)' - change 'bool isSetSize(Fl_Widget*)' to 'int set_size(Fl_Widget*)' - remove debug() method - add a way to "unset" fixed size: set_size(Fl_Widget *, 0) - add layout() method to force recalculation of children - unify resizeRow() and resizeCol() methods to avoid code duplication - improve widget size calculation.
Diffstat (limited to 'test')
-rw-r--r--test/.gitignore2
-rw-r--r--test/CMakeLists.txt2
-rw-r--r--test/Makefile8
-rw-r--r--test/flex_demo.cxx168
-rw-r--r--test/flex_login.cxx131
-rw-r--r--test/makedepend40
6 files changed, 351 insertions, 0 deletions
diff --git a/test/.gitignore b/test/.gitignore
index 6947a6d0c..49b1817e0 100644
--- a/test/.gitignore
+++ b/test/.gitignore
@@ -41,6 +41,8 @@ doublebuffer
editor
fast_slow
file_chooser
+flex_demo
+flex_login
fltk-versions
fonts
forms
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 7e295e879..cfc189168 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -81,6 +81,8 @@ CREATE_EXAMPLE (doublebuffer doublebuffer.cxx fltk)
CREATE_EXAMPLE (editor "editor.cxx;editor.plist" fltk)
CREATE_EXAMPLE (fast_slow fast_slow.fl fltk)
CREATE_EXAMPLE (file_chooser file_chooser.cxx "fltk_images;fltk")
+CREATE_EXAMPLE (flex_demo flex_demo.cxx fltk)
+CREATE_EXAMPLE (flex_login flex_login.cxx fltk)
CREATE_EXAMPLE (fltk-versions fltk-versions.cxx fltk)
CREATE_EXAMPLE (fonts fonts.cxx fltk)
CREATE_EXAMPLE (forms forms.cxx "fltk_forms;fltk")
diff --git a/test/Makefile b/test/Makefile
index 49d56e7be..4b4f5691e 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -74,6 +74,8 @@ CPPFILES =\
editor.cxx \
fast_slow.cxx \
file_chooser.cxx \
+ flex_demo.cxx \
+ flex_login.cxx \
fltk-versions.cxx \
fonts.cxx \
forms.cxx \
@@ -163,6 +165,8 @@ ALL = \
editor$(EXEEXT) \
fast_slow$(EXEEXT) \
file_chooser$(EXEEXT) \
+ flex_demo$(EXEEXT) \
+ flex_login$(EXEEXT) \
fltk-versions$(EXEEXT) \
fonts$(EXEEXT) \
forms$(EXEEXT) \
@@ -420,6 +424,10 @@ file_chooser$(EXEEXT): file_chooser.o $(IMGLIBNAME)
$(CXX) $(ARCHFLAGS) $(CXXFLAGS) $(LDFLAGS) file_chooser.o -o $@ $(LINKFLTKIMG) $(LDLIBS)
$(OSX_ONLY) ../fltk-config --post $@
+flex_demo$(EXEEXT): flex_demo.o
+
+flex_login$(EXEEXT): flex_login.o
+
fltk-versions$(EXEEXT): fltk-versions.o
fonts$(EXEEXT): fonts.o
diff --git a/test/flex_demo.cxx b/test/flex_demo.cxx
new file mode 100644
index 000000000..fb2b73cef
--- /dev/null
+++ b/test/flex_demo.cxx
@@ -0,0 +1,168 @@
+//
+// Fl_Flex demo program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2020 by Karsten Pedersen
+// Copyright 2022 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
+//
+
+#include <FL/Fl.H>
+#include <FL/Fl_Double_Window.H>
+#include <FL/Fl_Flex.H>
+#include <FL/Fl_Box.H>
+#include <FL/Fl_Button.H>
+#include <FL/Fl_Input.H>
+
+#define DEBUG_GROUP (0)
+
+void debug_group(Fl_Group *g) {
+#if (DEBUG_GROUP)
+ printf("\nFl_Group (%p) has %d children:\n", g, g->children());
+ for (int i = 0; i < g->children(); i++) {
+ Fl_Widget *c = g->child(i);
+ printf(" child %2d: hidden = %-5s, (x,y,w,h) = (%3d, %3d, %3d, %3d), label = '%s'\n",
+ i, c->visible() ? "false" : "true", c->x(), c->y(), c->w(), c->h(),
+ c->label() ? c->label() : "(null)");
+ }
+#endif
+} // debug_group
+
+Fl_Button *createButton(const char *caption) {
+ Fl_Button *rtn = new Fl_Button(0, 0, 120, 30, caption);
+ rtn->color(fl_rgb_color(225, 225, 225));
+ return rtn;
+}
+
+void toggle_cb(Fl_Widget *w, void *v) {
+ static Fl_Box *b = 0;
+ Fl_Widget *o = (Fl_Widget *)v;
+ Fl_Flex *flex = (Fl_Flex *)o->parent();
+ if (o->visible()) {
+ o->hide();
+ w->label("show OK button");
+ flex->child(1)->hide(); // hide Box
+ } else {
+ o->show();
+ w->label("hide OK button");
+ flex->child(1)->show(); // show Box
+ }
+ flex->layout();
+
+ debug_group(flex);
+
+ // Yet another test: modify the first (top) Fl_Flex widget
+
+ flex = (Fl_Flex *)(flex->parent()->child(0));
+ Fl_Group::current(0);
+ if (!b) {
+ b = new Fl_Box(0, 0, 0, 0, "Box3");
+ flex->insert(*b, flex->children() - 1);
+ } else {
+ delete b;
+ b = 0;
+ }
+ flex->layout();
+ debug_group(flex);
+}
+
+Fl_Flex *createRow() {
+ Fl_Flex *row = new Fl_Flex(Fl_Flex::ROW);
+ {
+ Fl_Button *toggle = createButton("hide OK button");
+ toggle->tooltip("hide() or show() OK button");
+ Fl_Box *box2 = new Fl_Box(0, 0, 120, 10, "Box2");
+ Fl_Button * okay = createButton("OK");
+ new Fl_Input(0, 0, 120, 10, "");
+
+ toggle->callback(toggle_cb, okay);
+
+ Fl_Flex *col2 = new Fl_Flex(Fl_Flex::COLUMN);
+ {
+ createButton("Top2");
+ createButton("Bottom2");
+ col2->end();
+ col2->margin(0, 5);
+ col2->box(FL_FLAT_BOX);
+ col2->color(fl_rgb_color(255, 128, 128));
+ }
+
+ row->set_size(box2, 50);
+ row->set_size(col2, 100);
+ row->end();
+
+ // TEST
+ row->box(FL_DOWN_BOX);
+ row->color(FL_GREEN);
+ }
+
+ return row;
+}
+
+int main(int argc, char **argv) {
+
+ Fl_Window *window = new Fl_Double_Window(100, 100, "Simple GUI Example");
+ {
+ Fl_Flex *col = new Fl_Flex(5, 5, 90, 90, Fl_Flex::COLUMN);
+ {
+ Fl_Flex *row = new Fl_Flex(Fl_Flex::ROW);
+ row->color(FL_YELLOW);
+ row->box(FL_FLAT_BOX);
+ {
+ createButton("Cancel");
+ new Fl_Box(0, 0, 120, 10, "Box1");
+ createButton("OK");
+ new Fl_Input(0, 0, 120, 10, "");
+
+ Fl_Flex *col1 = new Fl_Flex(Fl_Flex::COLUMN);
+ {
+ createButton("Top1");
+ createButton("Bottom1");
+ col1->end();
+ col1->box(FL_FLAT_BOX);
+ col1->color(fl_rgb_color(255, 128, 128));
+ col1->margin(5, 5);
+ }
+
+ row->end();
+ }
+ col->set_size(createRow(), 90);
+ createButton("Something1");
+ row = new Fl_Flex(Fl_Flex::ROW);
+ {
+ Fl_Button *cancel = createButton("Cancel");
+ Fl_Button *ok = createButton("OK");
+ new Fl_Input(0, 0, 120, 10, "");
+
+ row->set_size(cancel, 100);
+ row->set_size(ok, 100);
+ row->end();
+ }
+ createButton("Something2");
+
+ col->set_size(row, 30);
+ col->margin(0, 6);
+ col->end();
+ }
+ window->resizable(col);
+ window->color(fl_rgb_color(160, 180, 240));
+ window->box(FL_FLAT_BOX);
+ window->end();
+ }
+
+ window->size_range(550, 330);
+ window->resize(0, 0, 640, 480);
+ window->show(argc, argv);
+
+ int ret = Fl::run();
+ delete window;
+ return ret;
+}
diff --git a/test/flex_login.cxx b/test/flex_login.cxx
new file mode 100644
index 000000000..3923bcde3
--- /dev/null
+++ b/test/flex_login.cxx
@@ -0,0 +1,131 @@
+//
+// Fl_Flex demo program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2020 by Karsten Pedersen
+// Copyright 2022 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
+//
+
+#include <FL/Fl.H>
+#include <FL/Fl_Double_Window.H>
+#include <FL/Fl_Flex.H>
+#include <FL/Fl_Box.H>
+#include <FL/Fl_Button.H>
+#include <FL/Fl_Input.H>
+
+Fl_Button *createButton(const char *caption) {
+ Fl_Button *rtn = new Fl_Button(0, 0, 100, 25, caption);
+ rtn->color(fl_rgb_color(225, 225, 225));
+ return rtn;
+}
+
+void buttonsPanel(Fl_Flex *parent) {
+ new Fl_Box(0, 0, 0, 0, "");
+ Fl_Box *w = new Fl_Box(0, 0, 0, 0, "Welcome to Flex Login");
+
+ Fl_Flex *urow = new Fl_Flex(Fl_Flex::ROW);
+ {
+ Fl_Box *b = new Fl_Box(0, 0, 0, 0, "Username:");
+ b->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT);
+ Fl_Input *username = new Fl_Input(0, 0, 0, 0, "");
+
+ urow->set_size(username, 180);
+ urow->end();
+ }
+
+ Fl_Flex *prow = new Fl_Flex(Fl_Flex::ROW);
+ {
+ Fl_Box *b = new Fl_Box(0, 0, 0, 0, "Password:");
+ b->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT);
+ Fl_Input *password = new Fl_Input(0, 0, 0, 0, "");
+
+ prow->set_size(password, 180);
+ prow->end();
+ }
+
+ Fl_Box *pad = new Fl_Box(0, 0, 0, 0, "");
+
+ Fl_Flex *brow = new Fl_Flex(Fl_Flex::ROW);
+ {
+ new Fl_Box(0, 0, 0, 0, "");
+ Fl_Button *reg = createButton("Register");
+ Fl_Button *login = createButton("Login");
+
+ brow->set_size(reg, 80);
+ brow->set_size(login, 80);
+ brow->gap(20);
+
+ brow->end();
+ }
+
+ Fl_Box *b = new Fl_Box(0, 0, 0, 0, "");
+
+ parent->set_size(w, 60);
+ parent->set_size(urow, 30);
+ parent->set_size(prow, 30);
+ parent->set_size(pad, 1);
+ parent->set_size(brow, 30);
+ parent->set_size(b, 30);
+}
+
+void middlePanel(Fl_Flex *parent) {
+ new Fl_Box(0, 0, 0, 0, "");
+
+ Fl_Box *box = new Fl_Box(0, 0, 0, 0, "Image");
+ box->box(FL_BORDER_BOX);
+ box->color(fl_rgb_color(0, 200, 0));
+ Fl_Box *spacer = new Fl_Box(0, 0, 0, 0, "");
+
+ Fl_Flex *bp = new Fl_Flex(Fl_Flex::COLUMN);
+ buttonsPanel(bp);
+ bp->end();
+
+ new Fl_Box(0, 0, 0, 0, "");
+
+ parent->set_size(box, 200);
+ parent->set_size(spacer, 10);
+ parent->set_size(bp, 300);
+}
+
+void mainPanel(Fl_Flex *parent) {
+ new Fl_Box(0, 0, 0, 0, "");
+
+ Fl_Flex *mp = new Fl_Flex(Fl_Flex::ROW);
+ middlePanel(mp);
+ mp->end();
+
+ new Fl_Box(0, 0, 0, 0, "");
+
+ parent->set_size(mp, 200);
+}
+
+int main(int argc, char **argv) {
+
+ Fl_Window *window = new Fl_Double_Window(100, 100, "Simple GUI Example");
+ {
+ Fl_Flex *col = new Fl_Flex(5, 5, 90, 90, Fl_Flex::COLUMN);
+ mainPanel(col);
+ col->end();
+
+ window->resizable(col);
+ window->color(fl_rgb_color(250, 250, 250));
+ window->end();
+ }
+
+ window->resize(0, 0, 640, 480);
+ window->size_range(550, 250);
+ window->show(argc, argv);
+
+ int ret = Fl::run();
+ delete window;
+ return ret;
+}
diff --git a/test/makedepend b/test/makedepend
index 3fbcd2262..a3e88fdd3 100644
--- a/test/makedepend
+++ b/test/makedepend
@@ -857,6 +857,46 @@ file_chooser.o: ../FL/Fl_Valuator.H
file_chooser.o: ../FL/Fl_Widget.H
file_chooser.o: ../FL/Fl_Window.H
file_chooser.o: ../FL/platform_types.h
+flex_demo.o: ../FL/Enumerations.H
+flex_demo.o: ../FL/Fl.H
+flex_demo.o: ../FL/Fl_Bitmap.H
+flex_demo.o: ../FL/Fl_Box.H
+flex_demo.o: ../FL/Fl_Button.H
+flex_demo.o: ../FL/Fl_Cairo.H
+flex_demo.o: ../FL/fl_casts.H
+flex_demo.o: ../FL/fl_config.h
+flex_demo.o: ../FL/Fl_Double_Window.H
+flex_demo.o: ../FL/Fl_Export.H
+flex_demo.o: ../FL/Fl_Flex.H
+flex_demo.o: ../FL/Fl_Group.H
+flex_demo.o: ../FL/Fl_Image.H
+flex_demo.o: ../FL/Fl_Input.H
+flex_demo.o: ../FL/Fl_Input_.H
+flex_demo.o: ../FL/fl_types.h
+flex_demo.o: ../FL/fl_utf8.h
+flex_demo.o: ../FL/Fl_Widget.H
+flex_demo.o: ../FL/Fl_Window.H
+flex_demo.o: ../FL/platform_types.h
+flex_login.o: ../FL/Enumerations.H
+flex_login.o: ../FL/Fl.H
+flex_login.o: ../FL/Fl_Bitmap.H
+flex_login.o: ../FL/Fl_Box.H
+flex_login.o: ../FL/Fl_Button.H
+flex_login.o: ../FL/Fl_Cairo.H
+flex_login.o: ../FL/fl_casts.H
+flex_login.o: ../FL/fl_config.h
+flex_login.o: ../FL/Fl_Double_Window.H
+flex_login.o: ../FL/Fl_Export.H
+flex_login.o: ../FL/Fl_Flex.H
+flex_login.o: ../FL/Fl_Group.H
+flex_login.o: ../FL/Fl_Image.H
+flex_login.o: ../FL/Fl_Input.H
+flex_login.o: ../FL/Fl_Input_.H
+flex_login.o: ../FL/fl_types.h
+flex_login.o: ../FL/fl_utf8.h
+flex_login.o: ../FL/Fl_Widget.H
+flex_login.o: ../FL/Fl_Window.H
+flex_login.o: ../FL/platform_types.h
fltk-versions.o: ../FL/Enumerations.H
fltk-versions.o: ../FL/Fl.H
fltk-versions.o: ../FL/fl_ask.H