Fix and update alignment #346 (#701)

* interactive layout alignment rewritten
* interface for new alignment rules
* new alignment dialog box
* user defined layout rules added
* layout rules can be stored in projects, settings, and external files
* Valgrind verification
This commit is contained in:
Matthias Melcher
2023-03-18 17:33:27 +01:00
committed by GitHub
parent a9fb6a979f
commit 5c482f9d9b
35 changed files with 3207 additions and 888 deletions
+2 -1
View File
@@ -207,7 +207,8 @@ public:
void make_overlay_current();
// Note: Doxygen docs in Fl_Widget.H to avoid redundancy.
Fl_Gl_Window* as_gl_window() FL_OVERRIDE {return this;}
Fl_Gl_Window* as_gl_window() FL_OVERRIDE { return this; }
Fl_Gl_Window const* as_gl_window() const FL_OVERRIDE { return this; }
float pixels_per_unit();
/** Gives the window width in OpenGL pixels.
+1
View File
@@ -228,6 +228,7 @@ public:
// Note: Doxygen docs in Fl_Widget.H to avoid redundancy.
Fl_Group* as_group() FL_OVERRIDE { return this; }
Fl_Group const* as_group() const FL_OVERRIDE { return this; }
// back compatibility functions:
+5 -1
View File
@@ -317,6 +317,10 @@ struct FL_EXPORT Fl_Menu_Item {
before FLTK 1.4.0.
*/
int value() const {return (flags & FL_MENU_VALUE) ? 1 : 0;}
/** Sets the current value of the check or radio item. */
void value(int v) { v ? set() : clear(); }
/**
Turns the check or radio item "on" for the menu item. Note that this
does not turn off any adjacent radio items like setonly() does.
@@ -326,7 +330,7 @@ struct FL_EXPORT Fl_Menu_Item {
/** Turns the check or radio item "off" for the menu item. */
void clear() {flags &= ~FL_MENU_VALUE;}
void setonly();
void setonly(Fl_Menu_Item const* first = NULL);
/** Gets the visibility of an item. */
int visible() const {return !(flags&FL_MENU_INVISIBLE);}
+6 -3
View File
@@ -1091,7 +1091,8 @@ public:
\note This method is provided to avoid dynamic_cast.
\see Fl_Widget::as_window(), Fl_Widget::as_gl_window()
*/
virtual Fl_Group* as_group() {return 0;}
virtual Fl_Group* as_group() { return NULL; }
virtual Fl_Group const* as_group() const { return NULL; }
/** Returns an Fl_Window pointer if this widget is an Fl_Window.
@@ -1105,7 +1106,8 @@ public:
\note This method is provided to avoid dynamic_cast.
\see Fl_Widget::as_group(), Fl_Widget::as_gl_window()
*/
virtual Fl_Window* as_window() {return 0;}
virtual Fl_Window* as_window() { return 0; }
virtual Fl_Window const* as_window() const { return NULL; }
/** Returns an Fl_Gl_Window pointer if this widget is an Fl_Gl_Window.
@@ -1117,7 +1119,8 @@ public:
\note This method is provided to avoid dynamic_cast.
\see Fl_Widget::as_group(), Fl_Widget::as_window()
*/
virtual class Fl_Gl_Window* as_gl_window() {return 0;}
virtual class Fl_Gl_Window* as_gl_window() { return NULL; }
virtual class Fl_Gl_Window const* as_gl_window() const { return NULL; }
/** Returns non zero if MAC_USE_ACCENTS_MENU flag is set, 0 otherwise.
*/
+1
View File
@@ -560,6 +560,7 @@ public:
// Note: Doxygen docs in Fl_Widget.H to avoid redundancy.
Fl_Window* as_window() FL_OVERRIDE { return this; }
Fl_Window const* as_window() const FL_OVERRIDE { return this; }
/**
Return non-null if this is an Fl_Overlay_Window object.
+2
View File
@@ -17,6 +17,7 @@
set (CPPFILES
CodeEditor.cxx
StyleParse.cxx
Fd_Snap_Action.cxx
Fl_Function_Type.cxx
Fl_Group_Type.cxx
Fl_Menu_Type.cxx
@@ -45,6 +46,7 @@ set (CPPFILES
set (HEADERFILES
CodeEditor.h
Fd_Snap_Action.h
Fl_Function_Type.h
Fl_Group_Type.h
Fl_Menu_Type.h
File diff suppressed because it is too large Load Diff
+168
View File
@@ -0,0 +1,168 @@
//
// Snap action header file 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
//
#ifndef _FLUID_FD_SNAP_ACTION_H
#define _FLUID_FD_SNAP_ACTION_H
#include "Fl_Window_Type.h"
struct Fl_Menu_Item;
enum {
FD_STORE_INTERNAL,
FD_STORE_USER,
FD_STORE_PROJECT,
FD_STORE_FILE,
};
class Fd_Layout_Preset {
public:
int left_window_margin;
int right_window_margin;
int top_window_margin;
int bottom_window_margin;
int window_grid_x;
int window_grid_y;
int left_group_margin;
int right_group_margin;
int top_group_margin;
int bottom_group_margin;
int group_grid_x;
int group_grid_y;
int top_tabs_margin;
int bottom_tabs_margin;
int widget_min_w;
int widget_inc_w;
int widget_gap_x;
int widget_min_h;
int widget_inc_h;
int widget_gap_y;
int labelfont;
int labelsize;
int textfont;
int textsize;
void write(Fl_Preferences &prefs);
void read(Fl_Preferences &prefs);
void write(Fd_Project_Writer*);
void read(Fd_Project_Reader*);
};
extern Fd_Layout_Preset *layout;
class Fd_Layout_Suite {
public:
char *name_;
char *menu_label;
Fd_Layout_Preset *layout[3]; // application, dialog, toolbox;
int storage_;
void write(Fl_Preferences &prefs);
void read(Fl_Preferences &prefs);
void write(Fd_Project_Writer*);
void read(Fd_Project_Reader*);
void update_label();
void storage(int s) { storage_ = s; update_label(); }
void name(const char *n);
void init();
~Fd_Layout_Suite();
public:
};
class Fd_Layout_List {
public:
Fl_Menu_Item *main_menu_;
Fl_Menu_Item *choice_menu_;
Fd_Layout_Suite *list_;
int list_size_;
int list_capacity_;
bool list_is_static_;
int current_suite_;
int current_preset_;
char *filename_;
public:
Fd_Layout_List();
~Fd_Layout_List();
void update_dialogs();
void update_menu_labels();
int current_suite() const { return current_suite_; }
void current_suite(int ix);
void current_suite(Fl_String);
int current_preset() const { return current_preset_; }
void current_preset(int ix);
Fd_Layout_Suite &operator[](int ix) { return list_[ix]; }
int add(const char *name);
void rename(const char *name);
void capacity(int);
int load(const char *filename);
int save(const char *filename);
void write(Fl_Preferences &prefs, int storage);
void read(Fl_Preferences &prefs, int storage);
void write(Fd_Project_Writer*);
void read(Fd_Project_Reader*);
int add(Fd_Layout_Suite*);
void remove(int index);
void remove_all(int storage);
Fd_Layout_Preset *at(int);
int size();
};
extern Fd_Layout_List g_layout_list;
/**
\brief Structure holding all the data to perform interactive alignment operations.
*/
typedef struct Fd_Snap_Data {
int dx, dy; ///< distance of the mouse from its initial PUSH event
int bx, by, br, bt; ///< bounding box of the original push event or current bounding box when drawing
int drag; ///< drag event mask
int x_dist, y_dist; ///< current closest snapping distance in x and y
int dx_out, dy_out; ///< current closest snapping point as a delta
Fl_Widget_Type *wgt; ///< first selected widget
Fl_Window_Type *win; ///< window that handles the drag action
int ex_out, ey_out; ///< chosen snap position
} Fd_Snap_Data;
/**
\brief Find points of interest when moving the bounding box of all selected widgets.
*/
class Fd_Snap_Action {
protected:
int check_x_(Fd_Snap_Data &d, int x_ref, int x_snap);
int check_y_(Fd_Snap_Data &d, int y_ref, int y_snap);
void check_x_y_(Fd_Snap_Data &d, int x_ref, int x_snap, int y_ref, int y_snap);
void clr() { ex = dx = 0x7fff; }
public:
int ex, ey, dx, dy, type, mask;
Fd_Snap_Action() : ex(0x7fff), ey(0x7fff), dx(128), dy(128), type(0), mask(0) { }
virtual void check(Fd_Snap_Data &d) = 0;
virtual void draw(Fd_Snap_Data &d) { }
virtual bool matches(Fd_Snap_Data &d);
public:
static int eex, eey;
static Fd_Snap_Action *list[];
static void check_all(Fd_Snap_Data &d);
static void draw_all(Fd_Snap_Data &d);
static void get_resize_stepsize(int &x_step, int &y_step);
static void get_move_stepsize(int &x_step, int &y_step);
};
#endif // _FLUID_FD_SNAP_ACTION_H
+1 -5
View File
@@ -137,11 +137,6 @@ public:
class Fl_Tabs_Type : public Fl_Group_Type {
public:
void ideal_spacing(int &x, int &y) FL_OVERRIDE {
x = 10;
fl_font(o->labelfont(), o->labelsize());
y = fl_height() + o->labelsize() - 6;
}
const char *type_name() FL_OVERRIDE {return tabs_type_name;}
const char *alt_type_name() FL_OVERRIDE {return "fltk::TabGroup";}
Fl_Widget *widget(int X,int Y,int W,int H) FL_OVERRIDE {
@@ -152,6 +147,7 @@ public:
void remove_child(Fl_Type*) FL_OVERRIDE;
int pixmapID() FL_OVERRIDE { return 13; }
Fl_Widget *enter_live_mode(int top=0) FL_OVERRIDE;
int is_tabs() const FL_OVERRIDE {return 1;}
};
// ---- Fl_Scroll_Type ------------------------------------------------- MARK: -
+2 -1
View File
@@ -164,7 +164,8 @@ Fl_Type *Fl_Menu_Item_Type::make(Strategy strategy) {
}
if (!o) {
o = new Fl_Button(0,0,100,20); // create template widget
o->labelsize(Fl_Widget_Type::default_size);
o->labelsize(layout->labelsize);
o->labelfont(layout->labelfont);
}
Fl_Menu_Item_Type* t = submenuflag ? new Fl_Submenu_Type() : new Fl_Menu_Item_Type();
+3
View File
@@ -34,6 +34,7 @@ copied or otherwise examined.
#include "Fl_Type.h"
#include "fluid.h"
#include "Fd_Snap_Action.h"
#include "Fl_Function_Type.h"
#include "Fl_Widget_Type.h"
#include "Fl_Window_Type.h"
@@ -193,6 +194,8 @@ void delete_all(int selected_only) {
shell_settings_write();
widget_browser->hposition(0);
widget_browser->vposition(0);
g_layout_list.remove_all(FD_STORE_PROJECT);
g_layout_list.update_dialogs();
}
selection_changed(0);
widget_browser->redraw();
+1
View File
@@ -160,6 +160,7 @@ public:
virtual int is_menu_item() const {return 0;}
virtual int is_menu_button() const {return 0;}
virtual int is_group() const {return 0;}
virtual int is_tabs() const {return 0;}
virtual int is_flex() const {return 0;}
virtual int is_window() const {return 0;}
virtual int is_code() const {return 0;}
+29 -28
View File
@@ -1,7 +1,7 @@
//
// Widget type code for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2021 by Bill Spitzak and others.
// Copyright 1998-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
@@ -49,8 +49,6 @@
// instance, sets the widget pointers, and makes all the display
// update correctly...
int Fl_Widget_Type::default_size = FL_NORMAL_SIZE;
int Fl_Widget_Type::is_widget() const {return 1;}
int Fl_Widget_Type::is_public() const {return public_;}
@@ -82,17 +80,6 @@ Fl_Widget_Type::ideal_size(int &w, int &h) {
if (h < 15) h = 15;
}
// Return the ideal widget spacing...
void
Fl_Widget_Type::ideal_spacing(int &x, int &y) {
if (o->labelsize() < 10)
x = y = 0;
else if (o->labelsize() < 14)
x = y = 5;
else
x = y = 10;
}
/**
Make a new Widget node.
\param[in] strategy is kAddAsLastChild or kAddAfterCurrent
@@ -146,16 +133,6 @@ Fl_Type *Fl_Widget_Type::make(Strategy strategy) {
W = H = B;
}
// satisfy the grid requirements (otherwise it edits really strangely):
if (gridx>1) {
X = (X/gridx)*gridx;
W = ((W-1)/gridx+1)*gridx;
}
if (gridy>1) {
Y = (Y/gridy)*gridy;
H = ((H-1)/gridy+1)*gridy;
}
// Construct the Fl_Type:
Fl_Widget_Type *t = _make();
if (!o) o = widget(0,0,100,100); // create template widget
@@ -1366,6 +1343,7 @@ void labelfont_cb(Fl_Choice* i, void *v) {
} else {
int mod = 0;
int n = i->value();
if (n <= 0) n = layout->labelfont;
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected && o->is_widget()) {
Fl_Widget_Type* q = (Fl_Widget_Type*)o;
@@ -1385,7 +1363,7 @@ void labelsize_cb(Fl_Value_Input* i, void *v) {
} else {
int mod = 0;
n = int(i->value());
if (n <= 0) n = Fl_Widget_Type::default_size;
if (n <= 0) n = layout->labelsize;
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected && o->is_widget()) {
Fl_Widget_Type* q = (Fl_Widget_Type*)o;
@@ -1842,6 +1820,7 @@ void textfont_cb(Fl_Choice* i, void* v) {
} else {
int mod = 0;
n = (Fl_Font)i->value();
if (n <= 0) n = layout->textfont;
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected && o->is_widget()) {
Fl_Widget_Type* q = (Fl_Widget_Type*)o;
@@ -1862,7 +1841,7 @@ void textsize_cb(Fl_Value_Input* i, void* v) {
} else {
int mod = 0;
s = int(i->value());
if (s <= 0) s = Fl_Widget_Type::default_size;
if (s <= 0) s = layout->textsize;
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected && o->is_widget()) {
Fl_Widget_Type* q = (Fl_Widget_Type*)o;
@@ -2635,11 +2614,33 @@ static void load_panel() {
the_panel->hide();
}
extern Fl_Window *widgetbin_panel;
// This is called when user double-clicks an item, open or update the panel:
void Fl_Widget_Type::open() {
if (!the_panel) the_panel = make_widget_panel();
bool adjust_position = false;
if (!the_panel) {
the_panel = make_widget_panel();
adjust_position = true;
}
load_panel();
if (numselected) the_panel->show();
if (numselected) {
the_panel->show();
if (adjust_position) {
if (widgetbin_panel && widgetbin_panel->visible()) {
if ( (the_panel->x()+the_panel->w() > widgetbin_panel->x())
&& (the_panel->x() < widgetbin_panel->x()+widgetbin_panel->w())
&& (the_panel->y()+the_panel->h() > widgetbin_panel->y())
&& (the_panel->y() < widgetbin_panel->y()+widgetbin_panel->h()) )
{
if (widgetbin_panel->y()+widgetbin_panel->h()+the_panel->h() > Fl::h())
the_panel->position(the_panel->x(), widgetbin_panel->y()-the_panel->h()-30);
else
the_panel->position(the_panel->x(), widgetbin_panel->y()+widgetbin_panel->h()+30);
}
}
}
}
}
extern void redraw_overlays();
-3
View File
@@ -61,8 +61,6 @@ protected:
Fl_Widget *live_widget;
public:
static int default_size;
const char *xclass; // junk string, used for shortcut
Fl_Widget *o;
int public_;
@@ -111,7 +109,6 @@ public:
void copy_properties() FL_OVERRIDE;
virtual void ideal_size(int &w, int &h);
virtual void ideal_spacing(int &x, int &y);
~Fl_Widget_Type();
void redraw();
+85 -526
View File
File diff suppressed because it is too large Load Diff
+11 -2
View File
@@ -5,7 +5,7 @@
// This should have the widget pointer in it, but it is still in the
// Fl_Type base class.
//
// Copyright 1998-2010 by Bill Spitzak and others.
// Copyright 1998-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
@@ -28,10 +28,20 @@ class Fl_Widget_Class_Type;
extern Fl_Menu_Item window_type_menu[];
extern Fl_Widget_Class_Type *current_widget_class;
void toggle_overlays(Fl_Widget *,void *);
void toggle_guides(Fl_Widget *,void *);
void show_project_cb(Fl_Widget *, void *);
void show_grid_cb(Fl_Widget *, void *);
void show_settings_cb(Fl_Widget *, void *);
enum {
FD_LEFT = 1, // user drags the left side of the selection box
FD_RIGHT = 2,
FD_BOTTOM = 4,
FD_TOP = 8,
FD_DRAG = 16, // user drags the entire selection
FD_BOX = 32 // user creates a new selection box
};
class Fl_Window_Type : public Fl_Widget_Type {
protected:
@@ -45,7 +55,6 @@ protected:
int dx,dy;
int drag; // which parts of bbox are being moved
int numselected; // number of children selected
enum {LEFT=1,RIGHT=2,BOTTOM=4,TOP=8,DRAG=16,BOX=32};
void draw_overlay();
void newdx();
void newposition(Fl_Widget_Type *,int &x,int &y,int &w,int &h);
+1
View File
@@ -19,6 +19,7 @@ include ../makeinclude
CPPFILES = \
CodeEditor.cxx \
StyleParse.cxx \
Fd_Snap_Action.cxx \
Fl_Function_Type.cxx \
Fl_Group_Type.cxx \
Fl_Menu_Type.cxx \
-28
View File
@@ -477,31 +477,3 @@ void align_widget_cb(Fl_Widget*, long how)
if (changed)
set_modflag(1);
}
// Set sizes of selected widgets...
void widget_size_cb(Fl_Widget *, long size) {
// Update any selected widgets...
int changed = 0;
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected && o->is_widget()) {
if (!changed) {
changed = 1;
undo_checkpoint();
}
Fl_Widget *w = ((Fl_Widget_Type *)o)->o;
w->labelsize((Fl_Font)size);
Fl_Font f;
int s = (int)size;
Fl_Color c;
((Fl_Widget_Type *)o)->textstuff(2, f, s, c);
w->redraw();
// since this may be a major change, the whole window should be redrawn
if (w->window()) w->window()->redraw();
}
}
if (changed)
set_modflag(1);
}
-1
View File
@@ -20,6 +20,5 @@
class Fl_Widget;
void align_widget_cb(Fl_Widget *, long);
void widget_size_cb(Fl_Widget *, long);
#endif // _FLUID_ALIGN_WIDGET_H
+664 -107
View File
File diff suppressed because it is too large Load Diff
+491 -96
View File
File diff suppressed because it is too large Load Diff
+19 -10
View File
@@ -1,7 +1,7 @@
//
// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2020 by Bill Spitzak and others.
// Copyright 1998-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
@@ -21,10 +21,12 @@
#include <FL/Fl.H>
#include "fluid.h"
#include "widget_browser.h"
#include "Fd_Snap_Action.h"
#include "shell_command.h"
#include <FL/Fl_Text_Buffer.H>
#include <FL/Fl_Text_Display.H>
#include <FL/filename.H>
#include <FL/fl_string_functions.h>
#include <FL/Fl_Scheme_Choice.H>
/**
// initialize the scheme from preferences
@@ -95,14 +97,21 @@ extern Fl_Simple_Terminal *shell_run_terminal;
extern Fl_Return_Button *shell_run_button;
Fl_Double_Window* make_shell_window();
extern Fl_Double_Window *grid_window;
extern void grid_cb(Fl_Int_Input*, long);
extern Fl_Int_Input *horizontal_input;
extern Fl_Int_Input *vertical_input;
extern Fl_Int_Input *snap_input;
extern void guides_cb(Fl_Check_Button*, long);
extern Fl_Check_Button *guides_toggle;
#include <FL/Fl_Round_Button.H>
extern void default_widget_size_cb(Fl_Round_Button*, long);
extern Fl_Round_Button *def_widget_size[6];
extern Fl_Choice *layout_choice;
#include <FL/Fl_Menu_Button.H>
extern Fl_Menu_Button *w_layout_menu;
#include <FL/Fl_Native_File_Chooser.H>
extern void propagate_load(Fl_Group*, void*);
extern void edit_layout_preset_cb(Fl_Button*, long);
extern Fl_Button *preset_choice[3];
#include <FL/Fl_Value_Input.H>
extern Fl_Menu_Item fontmenu[];
Fl_Double_Window* make_layout_window();
extern Fl_Menu_Item menu_layout_choice[];
extern Fl_Menu_Item menu_w_layout_menu[];
#define w_layout_menu_rename (menu_w_layout_menu+0)
extern Fl_Menu_Item *w_layout_menu_storage[4];
#define w_layout_menu_load (menu_w_layout_menu+5)
#define w_layout_menu_save (menu_w_layout_menu+6)
#define w_layout_menu_delete (menu_w_layout_menu+7)
#endif
+6 -3
View File
@@ -27,6 +27,7 @@
#include "fluid.h"
#include "Fl_Window_Type.h"
#include "Fl_Group_Type.h"
#include "Fd_Snap_Action.h"
#include "pixmaps.h"
#include "undo.h"
@@ -1064,12 +1065,14 @@ Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy) {
Fl_Widget_Type *wt = (Fl_Widget_Type *)t;
// Set font sizes...
wt->o->labelsize(Fl_Widget_Type::default_size);
wt->o->labelsize(layout->labelsize);
wt->o->labelfont(layout->labelfont);
Fl_Font f;
int s = Fl_Widget_Type::default_size;
Fl_Font f = layout->textfont;
int s = layout->textsize;
Fl_Color c;
wt->textstuff(1, f, s, c);
wt->textstuff(2, f, s, c);
// Resize and/or reposition new widget...
+20 -2
View File
@@ -159,6 +159,10 @@ int Fd_Project_Reader::close_read() {
return 1;
}
const char *Fd_Project_Reader::filename_name() {
return fl_filename_name(fname);
}
/**
Convert an ASCII sequence form the \.fl file that starts with a \\ into a single character.
Conversion includes the common C style \\ characters like \\n, \\x## hex
@@ -309,7 +313,12 @@ void Fd_Project_Reader::read_children(Fl_Type *p, int paste, Strategy strategy,
goto CONTINUE;
}
if (!strcmp(c, "snap") || !strcmp(c, "gridx") || !strcmp(c, "gridy")) {
if (!strcmp(c, "snap")) {
g_layout_list.read(this);
goto CONTINUE;
}
if (!strcmp(c, "gridx") || !strcmp(c, "gridy")) {
// grid settings are now global
read_word();
goto CONTINUE;
@@ -523,6 +532,15 @@ const char *Fd_Project_Reader::read_word(int wantbrace) {
}
}
int Fd_Project_Reader::read_int() {
const char *word = read_word();
if (word) {
return atoi(word);
} else {
return 0;
}
}
int Fd_Project_Reader::read_fdesign_line(const char*& name, const char*& value) {
int length = 0;
int x;
@@ -791,7 +809,7 @@ int Fd_Project_Writer::write_project(const char *filename, int selected_only) {
if (!selected_only) {
write_string("\nheader_name"); write_word(g_project.header_file_name.c_str());
write_string("\ncode_name"); write_word(g_project.code_file_name.c_str());
g_layout_list.write(this);
#if 0
// https://github.com/fltk/fltk/issues/328
// Project wide settings require a redesign.
+2
View File
@@ -46,11 +46,13 @@ public:
~Fd_Project_Reader();
int open_read(const char *s);
int close_read();
const char *filename_name();
int read_quoted();
void read_children(Fl_Type *p, int paste, Strategy strategy, char skip_options=0);
int read_project(const char *, int merge, Strategy strategy=kAddAsLastChild);
void read_error(const char *format, ...);
const char *read_word(int wantbrace = 0);
int read_int();
int read_fdesign_line(const char*& name, const char*& value);
void read_fdesign();
};
+19 -33
View File
@@ -1,7 +1,7 @@
//
// FLUID main entry for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2022 by Bill Spitzak and others.
// Copyright 1998-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
@@ -72,16 +72,7 @@ Fl_Menu_Bar *main_menubar = NULL;
Fl_Window *main_window;
/// Fluid application preferences, allways accessible, will be flushed when app closes.
Fl_Preferences fluid_prefs(Fl_Preferences::USER_L, "fltk.org", "fluid");
/// Align widget position and size when designing, saved in app preferences and project file.
int gridx = 5;
/// Align widget position and size when designing, saved in app preferences and project file.
int gridy = 5;
/// Activate snapping to grid, saved in app preferences and project file.
int snap = 1;
Fl_Preferences fluid_prefs(Fl_Preferences::USER_L, "fltk.org", "fluid");
/// Show guides in the design window when positioning widgets, saved in app preferences.
int show_guides = 1;
@@ -132,6 +123,9 @@ Fl_Menu_Item *sourceview_item = NULL;
/// Menuitem to show or hide the editing overlay, label will change if overlay visibility changes.
Fl_Menu_Item *overlay_item = NULL;
/// Menuitem to show or hide the editing guides, label will change if overlay visibility changes.
Fl_Menu_Item *guides_item = NULL;
////////////////////////////////////////////////////////////////
/// Filename of the current .fl design file
@@ -285,7 +279,6 @@ void Fluid_Project::reset() {
code_file_set = 0;
header_file_name = ".h";
code_file_name = ".cxx";
}
// ---- Sourceview definition
@@ -693,6 +686,8 @@ void exit_cb(Fl_Widget *,void *) {
if (help_dialog)
delete help_dialog;
g_layout_list.write(fluid_prefs, FD_STORE_USER);
undo_clear();
// Destroy tree
@@ -1144,10 +1139,6 @@ void delete_cb(Fl_Widget *, void *) {
void paste_cb(Fl_Widget*, void*) {
//if (ipasteoffset) force_parent = 1;
pasteoffset = ipasteoffset;
// TODO: make the paste offset more predictable, if any at all.
// TODO: Don't use the grid if the user switched it off.
if (gridx>1) pasteoffset = ((pasteoffset-1)/gridx+1)*gridx;
if (gridy>1) pasteoffset = ((pasteoffset-1)/gridy+1)*gridy;
undo_checkpoint();
undo_suspend();
Strategy strategy = kAddAfterCurrent;
@@ -1370,6 +1361,9 @@ void print_menu_cb(Fl_Widget *, void *) {
// ---- Main menu bar
extern void select_layout_preset_cb(Fl_Widget *, void *user_data);
extern void layout_suite_marker(Fl_Widget *, void *user_data);
/**
This is the main Fluid menu.
@@ -1428,6 +1422,7 @@ Fl_Menu_Item Main_Menu[] = {
{"&Group", FL_F+7, group_cb},
{"Ung&roup", FL_F+8, ungroup_cb,0, FL_MENU_DIVIDER},
{"Hide O&verlays",FL_COMMAND+FL_SHIFT+'o',toggle_overlays},
{"Hide Guides",FL_COMMAND+FL_SHIFT+'g',toggle_guides},
{"Show Widget &Bin...",FL_ALT+'b',toggle_widgetbin_cb},
{"Show Source Code...",FL_ALT+FL_SHIFT+'s', (Fl_Callback*)toggle_sourceview_cb, 0, FL_MENU_DIVIDER},
{"Pro&ject Settings...",FL_ALT+'p',show_project_cb},
@@ -1452,19 +1447,15 @@ Fl_Menu_Item Main_Menu[] = {
{"&Height",0,(Fl_Callback *)align_widget_cb,(void*)31},
{"&Both",0,(Fl_Callback *)align_widget_cb,(void*)32},
{0},
{"&Center In Group",0,0,0,FL_SUBMENU},
{"&Center In Group",0,0,0,FL_SUBMENU|FL_MENU_DIVIDER},
{"&Horizontal",0,(Fl_Callback *)align_widget_cb,(void*)40},
{"&Vertical",0,(Fl_Callback *)align_widget_cb,(void*)41},
{0},
{"Set &Widget Size",0,0,0,FL_SUBMENU|FL_MENU_DIVIDER},
{"&Tiny",FL_ALT+'1',(Fl_Callback *)widget_size_cb,(void*)8,0,FL_NORMAL_LABEL,FL_HELVETICA,8},
{"&Small",FL_ALT+'2',(Fl_Callback *)widget_size_cb,(void*)11,0,FL_NORMAL_LABEL,FL_HELVETICA,11},
{"&Normal",FL_ALT+'3',(Fl_Callback *)widget_size_cb,(void*)14,0,FL_NORMAL_LABEL,FL_HELVETICA,14},
{"&Medium",FL_ALT+'4',(Fl_Callback *)widget_size_cb,(void*)18,0,FL_NORMAL_LABEL,FL_HELVETICA,18},
{"&Large",FL_ALT+'5',(Fl_Callback *)widget_size_cb,(void*)24,0,FL_NORMAL_LABEL,FL_HELVETICA,24},
{"&Huge",FL_ALT+'6',(Fl_Callback *)widget_size_cb,(void*)32,0,FL_NORMAL_LABEL,FL_HELVETICA,32},
{0},
{"&Grid and Size Settings...",FL_COMMAND+'g',show_grid_cb},
{"&Grid and Size Settings...",FL_COMMAND+'g',show_grid_cb, NULL, FL_MENU_DIVIDER},
{"Presets", 0, layout_suite_marker, (void*)g_layout_list.main_menu_, FL_SUBMENU_POINTER },
{"Application", 0, select_layout_preset_cb, (void*)0, FL_MENU_RADIO|FL_MENU_VALUE },
{"Dialog", 0, select_layout_preset_cb, (void*)1, FL_MENU_RADIO },
{"Toolbox", 0, select_layout_preset_cb, (void*)2, FL_MENU_RADIO },
{0},
{"&Shell",0,0,0,FL_SUBMENU},
{"Execute &Command...",FL_ALT+'x',(Fl_Callback *)show_shell_window},
@@ -1618,11 +1609,7 @@ void toggle_sourceview_b_cb(Fl_Button*, void *) {
*/
void make_main_window() {
if (!batch_mode) {
fluid_prefs.get("snap", snap, 1);
fluid_prefs.get("gridx", gridx, 5);
fluid_prefs.get("gridy", gridy, 5);
fluid_prefs.get("show_guides", show_guides, 0);
fluid_prefs.get("widget_size", Fl_Widget_Type::default_size, 14);
fluid_prefs.get("show_comments", show_comments, 1);
shell_prefs_get();
make_layout_window();
@@ -1646,6 +1633,7 @@ void make_main_window() {
widgetbin_item = (Fl_Menu_Item*)main_menubar->find_item(toggle_widgetbin_cb);
sourceview_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_sourceview_cb);
overlay_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_overlays);
guides_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_guides);
main_menubar->global();
fill_in_New_Menu();
main_window->end();
@@ -2091,6 +2079,7 @@ int main(int argc,char **argv) {
main_window->show(argc,argv);
toggle_widgetbin_cb(0,0);
toggle_sourceview_cb(0,0);
g_layout_list.read(fluid_prefs, FD_STORE_USER);
if (!c && openlast_button->value() && absolute_history[0][0]) {
// Open previous file when no file specified...
open_history_cb(0, absolute_history[0]);
@@ -2137,13 +2126,10 @@ int main(int argc,char **argv) {
// Set (but do not start) timer callback for external editor updates
ExternalCodeEditor::set_update_timer_callback(external_editor_timer);
grid_cb(horizontal_input, 0); // Makes sure that windows get snap params...
#ifdef _WIN32
Fl::run();
#else
while (!quit_flag) Fl::wait();
if (quit_flag) exit_cb(0,0);
#endif // _WIN32
+8 -5
View File
@@ -1,7 +1,7 @@
//
// FLUID main entry for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2021 by Bill Spitzak and others.
// Copyright 1998-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
@@ -42,9 +42,6 @@ extern Fl_Menu_Item Main_Menu[];
extern Fl_Menu_Bar *main_menubar;
extern Fl_Window *main_window;
extern int gridx;
extern int gridy;
extern int snap;
extern int show_guides;
extern int show_comments;
@@ -65,6 +62,9 @@ extern Fl_Menu_Item *history_item;
extern Fl_Menu_Item *widgetbin_item;
extern Fl_Menu_Item *sourceview_item;
extern Fl_Menu_Item *overlay_item;
extern Fl_Button *overlay_button;
extern Fl_Menu_Item *guides_item;
extern Fl_Button *guides_button;
extern int modflag;
@@ -76,6 +76,7 @@ extern int compile_file; // fluid -c
extern int compile_strings; // fluic -cs
extern int batch_mode;
extern int pasteoffset;
extern int pasteoffset;
// ---- project settings
@@ -133,7 +134,9 @@ extern void new_from_template_cb(Fl_Widget *w, void *v);
extern int write_code_files();
extern void write_strings_cb(Fl_Widget *, void *);
extern void align_widget_cb(Fl_Widget *, long);
extern void widget_size_cb(Fl_Widget *, long);
extern void toggle_widgetbin_cb(Fl_Widget *, void *);
inline int fd_min(int a, int b) { return (a < b ? a : b); }
inline int fd_min(int a, int b, int c) { return fd_min(a, fd_min(b, c)); }
#endif // _FLUID_FLUID_H
+1 -1
View File
@@ -1,7 +1,7 @@
//
// Widget Browser code for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2021 by Bill Spitzak and others.
// Copyright 1998-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
+22 -14
View File
@@ -113,6 +113,10 @@ Fl_Box *w_when_box=(Fl_Box *)0;
Fl_Button *wLiveMode=(Fl_Button *)0;
Fl_Button *overlay_button=(Fl_Button *)0;
Fl_Button *guides_button=(Fl_Button *)0;
/**
Create a panel that can be used with all known widgets
*/
@@ -969,7 +973,7 @@ access the Widget pointer and \'v\' to access the user value.");
} // Fl_Menu_Button* o
o->end();
} // Fl_Group* o
{ Fl_Group* o = new Fl_Group(95, 335, 310, 20, "Type:");
{ Fl_Group* o = new Fl_Group(95, 332, 310, 26, "Type:");
o->labelfont(1);
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
@@ -999,26 +1003,30 @@ access the Widget pointer and \'v\' to access the user value.");
} // Fl_Tabs* o
{ Fl_Group* o = new Fl_Group(10, 370, 400, 20);
o->labelsize(11);
{ // Hidden resizable box
Fl_Box* o = new Fl_Box(10, 370, 75, 20);
o->labelsize(11);
o->hide();
Fl_Group::current()->resizable(o);
} // Fl_Box* o
{ wLiveMode = new Fl_Button(155, 370, 80, 20, "Live &Resize");
{ wLiveMode = new Fl_Button(10, 370, 80, 20, "Live &Resize");
wLiveMode->tooltip("Create a live duplicate of the selected widgets to test resizing and menu beh\
avior.");
wLiveMode->type(1);
wLiveMode->labelsize(11);
wLiveMode->callback((Fl_Callback*)live_mode_cb);
} // Fl_Button* wLiveMode
{ Fl_Button* o = new Fl_Button(240, 370, 100, 20, "Hide &Overlays");
o->tooltip("Hide the widget overlay box.");
{ overlay_button = new Fl_Button(94, 370, 80, 20, "Hide &Overlays");
overlay_button->tooltip("Hide the widget overlay box.");
overlay_button->labelsize(11);
overlay_button->callback((Fl_Callback*)overlay_cb);
} // Fl_Button* overlay_button
{ guides_button = new Fl_Button(178, 370, 80, 20, "Hide &Guides");
guides_button->tooltip("Hide alignment guides.");
guides_button->labelsize(11);
guides_button->callback((Fl_Callback*)guides_cb);
} // Fl_Button* guides_button
{ // Hidden resizable box
Fl_Box* o = new Fl_Box(258, 370, 72, 20);
o->labelsize(11);
o->labelcolor((Fl_Color)1);
o->callback((Fl_Callback*)overlay_cb);
} // Fl_Button* o
{ Fl_Return_Button* o = new Fl_Return_Button(345, 370, 65, 20, "Close");
o->hide();
Fl_Group::current()->resizable(o);
} // Fl_Box* o
{ Fl_Return_Button* o = new Fl_Return_Button(330, 370, 80, 20, "Close");
o->labelsize(11);
o->callback((Fl_Callback*)ok_cb);
} // Fl_Return_Button* o
+16 -11
View File
@@ -30,7 +30,7 @@ Function {make_widget_panel()} {
comment {Create a panel that can be used with all known widgets} open
} {
Fl_Window {} {
comment {Use a Double Window to avoid flickering.} open
comment {Use a Double Window to avoid flickering.} open selected
xywh {566 244 420 400} type Double labelsize 11 align 80 resizable hotspot
code0 {o->size_range(o->w(), o->h());} size_range {420 400 0 0} visible
} {
@@ -40,7 +40,7 @@ Function {make_widget_panel()} {
} {
Fl_Group {} {
label GUI
callback propagate_load open selected
callback propagate_load open
xywh {10 30 400 330} labelsize 11 when 0 resizable
} {
Fl_Group {} {
@@ -784,7 +784,7 @@ wCallback->do_callback(wCallback, v);} open
Fl_Group {} {
label {Type:}
callback propagate_load open
xywh {95 335 310 20} labelfont 1 labelsize 11 align 4
xywh {95 332 310 26} labelfont 1 labelsize 11 align 4
} {
Fl_Input_Choice {} {
callback user_data_type_cb open
@@ -809,24 +809,29 @@ wCallback->do_callback(wCallback, v);} open
Fl_Group {} {open
xywh {10 370 400 20} labelsize 11
} {
Fl_Box {} {
comment {Hidden resizable box}
xywh {10 370 75 20} labelsize 11 hide resizable
}
Fl_Button wLiveMode {
label {Live &Resize}
callback live_mode_cb
tooltip {Create a live duplicate of the selected widgets to test resizing and menu behavior.} xywh {155 370 80 20} type Toggle labelsize 11
tooltip {Create a live duplicate of the selected widgets to test resizing and menu behavior.} xywh {10 370 80 20} type Toggle labelsize 11
}
Fl_Button {} {
Fl_Button overlay_button {
label {Hide &Overlays}
callback overlay_cb
tooltip {Hide the widget overlay box.} xywh {240 370 100 20} labelsize 11 labelcolor 1
tooltip {Hide the widget overlay box.} xywh {94 370 80 20} labelsize 11
}
Fl_Button guides_button {
label {Hide &Guides}
callback guides_cb
tooltip {Hide alignment guides.} xywh {178 370 80 20} labelsize 11
}
Fl_Box {} {
comment {Hidden resizable box}
xywh {258 370 72 20} labelsize 11 hide resizable
}
Fl_Return_Button {} {
label Close
callback ok_cb
xywh {345 370 65 20} labelsize 11
xywh {330 370 80 20} labelsize 11
}
}
}
+3
View File
@@ -135,6 +135,9 @@ extern Fl_Box *w_when_box;
extern void live_mode_cb(Fl_Button*, void*);
extern Fl_Button *wLiveMode;
extern void overlay_cb(Fl_Button*, void*);
extern Fl_Button *overlay_button;
extern void guides_cb(Fl_Button*, void*);
extern Fl_Button *guides_button;
#include <FL/Fl_Return_Button.H>
extern void ok_cb(Fl_Return_Button*, void*);
Fl_Double_Window* make_widget_panel();
+6 -4
View File
@@ -359,10 +359,11 @@ void Fl_Menu_::setonly(Fl_Menu_Item* item) {
}
/** Turns the radio item "on" for the menu item and turns "off" adjacent radio items set.
\deprecated This method is dangerous if radio items are first in the menu.
Use Fl_Menu_::setonly(Fl_Menu_Item*) instead.
\note This method is dangerous if radio items are first in the menu.
Make sure that \p first is set ciorrectly or use Fl_Menu_::setonly(Fl_Menu_Item*) instead.
\param[in] first start of menu array or NULL (default) if the radio group is not the first item
*/
void Fl_Menu_Item::setonly() {
void Fl_Menu_Item::setonly(Fl_Menu_Item const* first) {
flags |= FL_MENU_RADIO | FL_MENU_VALUE;
Fl_Menu_Item* j;
for (j = this; ; ) { // go down
@@ -371,9 +372,10 @@ void Fl_Menu_Item::setonly() {
if (!j->text || !j->radio()) break; // stop after group
j->clear();
}
for (j = this-1; ; j--) { // go up
if (this != first) for (j = this-1; ; j--) { // go up
if (!j->text || (j->flags&FL_MENU_DIVIDER) || !j->radio()) break;
j->clear();
if (j == first) break;
}
}
+4 -2
View File
@@ -43,15 +43,17 @@ static char* underline_at;
*/
static const char* expand_text_(const char* from, char*& buf, int maxbuf, double maxw, int& n,
double &width, int wrap, int draw_symbols) {
char* e = buf+(maxbuf-4);
underline_at = 0;
double w = 0;
static int l_local_buff = 500;
static char *local_buf = (char*)malloc(l_local_buff); // initial buffer allocation
char* e;
if (maxbuf == 0) {
buf = local_buf;
e = buf + l_local_buff - 4;
}
} else {
e = buf+(maxbuf-4);
}
char* o = buf;
char* word_end = o;
const char* word_start = from;
+40
View File
@@ -655,6 +655,43 @@ static void draw_redo(Fl_Color c) {
fl_scale(-1.0, 1.0);
}
static void draw_open_box(Fl_Color col) {
fl_color(col);
BCP;
vv(-1.0, -1.0); vv(-0.4, -1.0); vv(-0.4, -0.75); vv(-0.75, -0.75);
vv(-0.75, 0.75); vv(0.75, 0.75); vv(0.75, 0.4); vv(1.0, 0.4); vv(1.0, 1.0);
vv(-1.0, 1.0);
ECP;
set_outline_color(col);
BC;
vv(-1.0, -1.0); vv(-0.4, -1.0); vv(-0.4, -0.75); vv(-0.75, -0.75);
vv(-0.75, 0.75); vv(0.75, 0.75); vv(0.75, 0.4); vv(1.0, 0.4); vv(1.0, 1.0);
vv(-1.0, 1.0);
EC;
}
static void draw_import(Fl_Color col)
{
fl_push_matrix();
fl_scale(-1.0, 1.0);
draw_open_box(col);
fl_scale(-1.0, 1.0);
fl_translate(-0.8, -0.3);
fl_rotate(45.0+90);
draw_round_arrow(col, 3);
fl_pop_matrix();
}
static void draw_export(Fl_Color col)
{
draw_open_box(col);
fl_push_matrix();
fl_translate(0.7, 0.1);
fl_rotate(225.0);
draw_round_arrow(col, 3);
fl_pop_matrix();
}
static void fl_init_symbols(void) {
static char beenhere;
if (beenhere) return;
@@ -702,5 +739,8 @@ static void fl_init_symbols(void) {
fl_add_symbol("undo", draw_undo, 1);
fl_add_symbol("redo", draw_redo, 1);
fl_add_symbol("import", draw_import, 1);
fl_add_symbol("export", draw_export, 1);
// fl_add_symbol("file", draw_file, 1);
}
+3 -1
View File
@@ -28,7 +28,7 @@ int N = 0;
#define W 70
#define H 70
#define ROWS 6
#define COLS 6
#define COLS 7
Fl_Double_Window *window;
Fl_Value_Slider *orientation;
@@ -119,6 +119,8 @@ bt("@refresh");
bt("@reload");
bt("@undo");
bt("@redo");
bt("@import");
bt("@export");
orientation = new Fl_Value_Slider(
(int)(window->w()*.05+.5), window->h()-40,