diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2022-07-28 18:26:07 +0200 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2022-08-01 15:33:20 +0200 |
| commit | f37aca15e9786a7192e36ea4b0295ab4dc12819f (patch) | |
| tree | 549680fc1da3b72de9a38ed24d9ce1521b97cf71 /test | |
| parent | de8e6de25b33a3bf6c00da603d1332042ae51cf2 (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/.gitignore | 2 | ||||
| -rw-r--r-- | test/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | test/Makefile | 8 | ||||
| -rw-r--r-- | test/flex_demo.cxx | 168 | ||||
| -rw-r--r-- | test/flex_login.cxx | 131 | ||||
| -rw-r--r-- | test/makedepend | 40 |
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 |
