fltk/fluid/Fd_Snap_Action.h
2023-07-14 18:10:17 +02:00

197 lines
6.4 KiB
C++

//
// 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;
extern Fl_Menu_Item main_layout_submenu_[];
/**
Indicate the storage location for a layout suite.
*/
enum {
FD_STORE_INTERNAL, ///< stored inside FLUID app
FD_STORE_USER, ///< suite is stored in the user wide FLUID settings
FD_STORE_PROJECT, ///< suite is stored within the current .fl project file
FD_STORE_FILE ///< store suite in external file
};
/**
\brief Collection of layout settings.
Presets contain default fonts and font sizes for labels and text. They
can be used to guide widget positions using margins, grids, and gap sizes.
There are three Presets available in one Suite, marked "application",
"dialog", and "toolbox".
*/
class Fd_Layout_Preset {
public:
int left_window_margin; ///< gap between the window border and the widget
int right_window_margin;
int top_window_margin;
int bottom_window_margin;
int window_grid_x; ///< a regular grid across the window with its origin in the top left window corner
int window_grid_y;
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;
int group_grid_x; ///< a regular grid across the group with its origin in the top left group corner
int group_grid_y;
int top_tabs_margin; ///< preferred top edge tab size inside Fl_Tabs
int bottom_tabs_margin; ///< preferred bottom edge tab size inside Fl_Tabs
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;
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*);
};
extern Fd_Layout_Preset *layout;
/**
\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:
char *name_; ///< name of the suite
char *menu_label; ///< label text used in pulldown menu
Fd_Layout_Preset *layout[3]; ///< presetes for application, dialog, and toolbox windows
int 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(int s) { storage_ = s; update_label(); }
void name(const char *n);
void init();
~Fd_Layout_Suite();
public:
};
/**
\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
as a user preference, as part of an .fl project file, or in a seperate file
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_;
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