summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2023-11-18 18:43:54 +0100
committerAlbrecht Schlosser <albrechts.fltk@online.de>2023-11-18 18:43:54 +0100
commitf19f94d28480c28c830a38796016725585ba5ddf (patch)
treea8ca3a435f5bd27628fd4a0182bca2ff02b0f568
parentefe3ea711529c1eef820fb598de313e97da65c72 (diff)
Add Fl_Grid based dialog demo program - part 2
Add forgotten source file.
-rw-r--r--test/grid_dialog.cxx150
1 files changed, 150 insertions, 0 deletions
diff --git a/test/grid_dialog.cxx b/test/grid_dialog.cxx
new file mode 100644
index 000000000..fa34d7713
--- /dev/null
+++ b/test/grid_dialog.cxx
@@ -0,0 +1,150 @@
+//
+// Fl_Grid based dialog window for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 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 demo program builds a flexible layout of a dialog similar
+// to fl_ask(), fl_choice(), and others.
+//
+// For <N> buttons we use an Fl_Grid with 2 rows and <N+2> columns:
+// - Cell (0, 0) (III) holds an icon (top left cell)
+// - Cell (0, 1) holds the message text; spans <N+1> columns
+// - Cell (1, n) holds buttons (2 <= n <= <N+1>)
+// - Column 1 (XX) is the resizable column; not used for buttons
+// - Column 2+ is used for buttons
+// _________________________________________________
+// | |
+// | III Some message text ... ... ... ... ... ... |
+// | III more message text ... ... ... ... ... ... |
+// | III more message text ... ... ... ... ... ... |
+// | more message text ... ... ... ... ... ... |
+// | more message text ... ... ... ... ... ... |
+// | XX +––––––––+ +––––+ |
+// | XX [more buttons ...] | Cancel | | OK | |
+// | XX +––––––––+ +––––+ |
+// |_________________________________________________|
+
+#include <FL/Fl.H>
+#include <FL/Fl_Double_Window.H>
+#include <FL/Fl_Grid.H>
+#include <FL/Fl_Button.H>
+#include <FL/Fl_Box.H>
+
+static const int ROWS = 2;
+static const int BUTTONS = 4; // default = 4, use 1 to 5 to test
+static const int COLS = BUTTONS + 2;
+static const int BUTTON_H = 25;
+static const int ICON_W = 60;
+static const int ICON_H = 70;
+static const int MARGIN = 10;
+static const int GAP = 8;
+
+// Button labels (left to right)
+static const char *labels[5] = {
+ "Quit", "Copy", "Cancel", "OK", "More ..." };
+
+// button widths (left to right) to avoid font calculations
+static const int button_w[5] = { 50, 50, 70, 40, 100};
+
+static int col_weights[] = { 0, 100, 0, 0, 0, 0, 0 };
+static int row_weights[] = { 100, 0, 0, 0, 0, 0, 0 };
+
+static const char *message_text =
+ "This is a long message in an Fl_Grid based dialog "
+ "that may wrap over more than one line. "
+ "Resize the window to see how it (un)wraps.\n";
+
+Fl_Box *message_box = 0;
+
+// Common button callback
+
+void button_cb(Fl_Widget *w, void *v) {
+ int val = fl_int(v);
+ printf("Button %d: '%s'\n", val, w->label());
+ switch(val) {
+ case 0: // Quit
+ w->window()->hide();
+ break;
+ case 1: { // Copy
+ const char *text = message_box->label();
+ const int len = strlen(text);
+ Fl::copy(text, len, 1);
+ }
+ printf("Message copied to clipboard.\n");
+ break;
+ default:
+ break;
+ }
+ fflush(stdout);
+}
+
+int main(int argc, char **argv) {
+
+ int min_w = ICON_W + 2 * MARGIN + (BUTTONS + 1) * GAP;
+ int min_h = ICON_H + 10 + 2 * MARGIN + GAP + BUTTON_H;
+
+ for (int i = 0; i < BUTTONS; i++) {
+ min_w += button_w[i];
+ }
+
+ Fl_Double_Window *win = new Fl_Double_Window(min_w, min_h, "Fl_Grid Based Dialog");
+
+ Fl_Grid *grid = new Fl_Grid(0, 0, win->w(), win->h());
+ grid->layout(ROWS, COLS, 10, 6);
+ grid->color(FL_WHITE);
+
+ // Child 0: Fl_Box for the "icon" or image (fixed size)
+
+ Fl_Box *icon = new Fl_Box(0, 0, ICON_W, ICON_H, "ICON");
+ icon->box(FL_THIN_UP_BOX);
+ icon->color(0xddffff00);
+ icon->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE|FL_ALIGN_CLIP);
+ grid->widget(icon, 0, 0, 1, 1, FL_GRID_TOP);
+
+ // Child 1: the message box
+
+ message_box = new Fl_Box(0, 0, 0, 0);
+ message_box->label(message_text);
+ message_box->align(FL_ALIGN_TOP|FL_ALIGN_INSIDE|FL_ALIGN_WRAP);
+ grid->widget(message_box, 0, 1, 1, BUTTONS + 1, FL_GRID_FILL);
+
+ // Children 2++: the buttons (left to right for tab nav. order)
+
+ for (int i = 0; i < BUTTONS; i++) {
+ Fl_Button *b = new Fl_Button(0, 0, button_w[i], BUTTON_H, labels[i]);
+ grid->widget(b, 1, i + 2);
+ b->callback(button_cb, fl_voidptr(i));
+ if (i == 1)
+ b->tooltip("Copy message text to clipboard.");
+ }
+
+ grid->end();
+
+ // set row and column weights for resizing
+
+ grid->row_weight(row_weights, ROWS);
+ grid->col_weight(col_weights, COLS);
+
+ // Set environment variable "FLTK_GRID_DEBUG=1" or uncomment this line:
+ // grid->show_grid(1); // enable to display grid helper lines
+
+ win->end();
+ win->resizable(grid);
+ win->size_range(min_w, min_h, 3 * min_w, min_h + 50);
+ win->show(argc, argv);
+
+ int ret = Fl::run();
+ delete win; // not necessary but useful to test for memory leaks
+ return ret;
+}