fltk/fluid/Fd_Snap_Action.h

194 lines
6.3 KiB
C
Raw Normal View History

//
// 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 "fluid.h"
#include "Fl_Window_Type.h"
#include "../src/Fl_String.H"
2023-08-26 18:58:10 +03:00
struct Fl_Menu_Item;
extern Fl_Menu_Item main_layout_submenu_[];
2023-07-12 16:27:36 +03:00
/**
\brief Collection of layout settings.
Presets contain default fonts and font sizes for labels and text. They
2023-07-14 19:10:09 +03:00
can be used to guide widget positions using margins, grids, and gap sizes.
2023-07-12 16:27:36 +03:00
There are three Presets available in one Suite, marked "application",
"dialog", and "toolbox".
*/
class Fd_Layout_Preset {
public:
2023-07-12 16:27:36 +03:00
int left_window_margin; ///< gap between the window border and the widget
int right_window_margin;
int top_window_margin;
int bottom_window_margin;
2023-07-12 16:27:36 +03:00
int window_grid_x; ///< a regular grid across the window with its origin in the top left window corner
int window_grid_y;
2023-07-12 16:27:36 +03:00
int left_group_margin; ///< gap between the border of a widget and its parent group
int right_group_margin;
int top_group_margin;
int bottom_group_margin;
2023-07-12 16:27:36 +03:00
int group_grid_x; ///< a regular grid across the group with its origin in the top left group corner
int group_grid_y;
2023-07-12 16:27:36 +03:00
int top_tabs_margin; ///< preferred top edge tab size inside Fl_Tabs
int bottom_tabs_margin; ///< preferred bottom edge tab size inside Fl_Tabs
2023-07-12 16:27:36 +03:00
int widget_min_w; ///< minimum widget width
int widget_inc_w; ///< widget width increments starting from widget_min_w
int widget_gap_x; ///< preferred horizontal gap between widgets
int widget_min_h;
int widget_inc_h;
int widget_gap_y;
2023-07-12 16:27:36 +03:00
int labelfont; ///< preferred font for labels
int labelsize; ///< preferred size for labels
int textfont; ///< preferred font for text elements
int textsize; ///< preferred size for text elements
void write(Fl_Preferences &prefs);
void read(Fl_Preferences &prefs);
void write(Fd_Project_Writer*);
void read(Fd_Project_Reader*);
int textsize_not_null();
};
extern Fd_Layout_Preset *layout;
2023-07-12 16:27:36 +03:00
/**
\brief A collection of layout presets.
A suite of layout presets is designed to cover various use cases when
designing UI layouts for applications.
There are three Presets available in one Suite, marked "application",
"dialog", and "toolbox".
*/
class Fd_Layout_Suite {
public:
2023-07-12 16:27:36 +03:00
char *name_; ///< name of the suite
char *menu_label; ///< label text used in pulldown menu
2023-08-26 16:17:28 +03:00
Fd_Layout_Preset *layout[3]; ///< presets for application, dialog, and toolbox windows
2024-03-03 00:58:52 +03:00
Fd_Tool_Store storage_; ///< storage location (see FD_STORE_INTERNAL, etc.)
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(Fd_Tool_Store s) { storage_ = s; update_label(); }
void name(const char *n);
void init();
~Fd_Layout_Suite();
public:
};
2023-07-12 16:27:36 +03:00
/**
\brief Manage all layout suites that are available to the user.
FLUID has two built-in suites. More suites can be cloned or added and stored
2023-08-26 16:17:28 +03:00
as a user preference, as part of an .fl project file, or in a separate file
2023-07-12 16:27:36 +03:00
for import/export and sharing.
*/
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_;
2023-08-26 18:58:10 +03:00
Fl_String 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);
2023-08-26 18:58:10 +03:00
int load(const Fl_String &filename);
int save(const Fl_String &filename);
void write(Fl_Preferences &prefs, Fd_Tool_Store storage);
void read(Fl_Preferences &prefs, Fd_Tool_Store storage);
void write(Fd_Project_Writer*);
void read(Fd_Project_Reader*);
int add(Fd_Layout_Suite*);
void remove(int index);
void remove_all(Fd_Tool_Store 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) { }
2023-12-01 17:25:07 +03:00
virtual ~Fd_Snap_Action() { }
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);
static void better_size(int &w, int &h);
};
#endif // _FLUID_FD_SNAP_ACTION_H