summaryrefslogtreecommitdiff
path: root/FL
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 /FL
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 'FL')
-rw-r--r--FL/Fl_Flex.H161
1 files changed, 161 insertions, 0 deletions
diff --git a/FL/Fl_Flex.H b/FL/Fl_Flex.H
new file mode 100644
index 000000000..3d3784492
--- /dev/null
+++ b/FL/Fl_Flex.H
@@ -0,0 +1,161 @@
+//
+// Fl_Flex widget header file 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
+//
+
+#ifndef Fl_Flex_H
+#define Fl_Flex_H
+
+#include <FL/Fl_Group.H>
+
+class FL_EXPORT Fl_Flex : public Fl_Group {
+
+ int margin_;
+ int gap_;
+ int set_size_size_;
+ int set_size_alloc_;
+ Fl_Widget **set_size_;
+
+public:
+
+ enum { // values for type(int)
+ VERTICAL = 0, ///< vertical layout (one column)
+ HORIZONTAL = 1, ///< horizontal layout (one row)
+ COLUMN = 0, ///< alias for VERTICAL
+ ROW = 1 ///< alias for HORIZONTAL
+ };
+
+ // FLTK standard constructor
+ Fl_Flex(int X, int Y, int W, int H, const char *L = 0);
+
+ // original Fl_Flex constructors:
+ // backwards compatible if direction *names* { ROW | COLUMN } are used
+
+ Fl_Flex(int direction);
+ Fl_Flex(int w, int h, int direction);
+ Fl_Flex(int x, int y, int w, int h, int direction);
+
+ virtual ~Fl_Flex();
+
+ virtual void end();
+ virtual void resize(int x, int y, int w, int h);
+
+ void set_size(Fl_Widget *w, int size);
+ int set_size(Fl_Widget *w);
+
+protected:
+
+ void init(int t = VERTICAL);
+
+ int alloc_size(int size);
+
+public:
+
+ /** Return the margin size of the widget.
+ \return margin size.
+ */
+ int margin() { return margin_; }
+
+ /** Set the margin and optionally the gap size of the widget.
+ This method can be used to set both the margin and the gap size.
+
+ If you don't use the second parameter \p g or supply a negative value
+ the gap size is not changed.
+
+ The margin is some free space inside the widget border \b around all child
+ widgets. It has the same size at all four edges of the Fl_Flex widget.
+
+ The gap size \p g is some free space \b between child widgets.
+
+ \param[in] m margin size, must be \>= 0
+ \param[in] g gap size, must be \>= 0, or will be ignored (if negative)
+
+ \see gap(int)
+ */
+
+ void margin(int m, int g = -1) {
+ margin_ = m < 0 ? 0 : m;
+ if (g >= 0)
+ gap_ = g;
+ }
+
+ /** Return the gap size of the widget.
+ \return gap size between all child widgets.
+ */
+ int gap() { return gap_; }
+
+ /**
+ Set the gap size of the widget.
+
+ The gap size is some free space \b between child widgets.
+ The size must be \>= 0. Negative values are clamped to 0.
+
+ \param[in] g gap size
+ */
+ void gap(int g) {
+ gap_ = g < 0 ? 0 : g;
+ }
+
+ /** Returns non-zero (true) if Fl_Flex alignment is horizontal (row mode).
+
+ \returns non-zero if Fl_Flex alignment is horizontal
+ \retval 1 if type() == Fl_Flex::HORIZONTAL
+ \retval 0 if type() == Fl_Flex::VERTICAL
+
+ See class Fl_Flex documentation for details.
+ */
+ int horizontal() const {
+ return type() == Fl_Flex::HORIZONTAL ? 1 : 0;
+ }
+
+ /**
+ Calculates the layout of the widget and redraws it.
+
+ If you change widgets in the Fl_Flex container you should call this method
+ to force recalculation of child widget sizes and positions. This can be
+ useful (necessary) if you hide(), show(), add() or remove() children.
+
+ This method also calls redraw() on the Fl_Flex widget.
+ */
+ void layout() {
+ resize(x(), y(), w(), h());
+ redraw();
+ }
+
+#if (1)
+
+ // Additional methods for backwards compatibility with "original" Fl_Flex widget
+
+ /**
+ Deprecated.
+ \deprecated Please use set_size(Fl_Widget *) instead.
+ */
+ bool isSetSize(Fl_Widget *w) {
+ return (bool)set_size(w);
+ }
+
+ /**
+ Set the horizontal or vertical size of a child widget.
+ \deprecated Please use set_size(Fl_Widget *, int) instead.
+ */
+ void setSize(Fl_Widget *w, int size) {
+ set_size(w, size);
+ }
+
+#endif
+
+};
+
+#endif // Fl_Flex_H