summaryrefslogtreecommitdiff
path: root/fluid/app/Snap_Action.h
blob: 6bbe07bb8d51888ad07157c821c00c07a63fac52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
//
// Snap action header file for the Fast Light Tool Kit (FLTK).
//
// Copyright 2023-2025 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 "../fld_tool_store.h"
#include <string>

class Window_Node;
class Widget_Node;
struct Fl_Menu_Item;
class Fl_Preferences;

extern Fl_Menu_Item main_layout_submenu_[];

namespace fld {
namespace io {
class Project_Reader; // fld::io::
class Project_Writer; // fld::io::
} // namespace io
} // namespace fld

namespace fld {
namespace app {

/**
 \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 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(fld::io::Project_Writer*);
  void read(fld::io::Project_Reader*);

  int textsize_not_null();
};

extern Layout_Preset *default_layout_preset;

/**
 \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 Layout_Suite {
public:
  char *name_;                  ///< name of the suite
  char *menu_label;             ///< label text used in pulldown menu
  Layout_Preset *layout[3];  ///< presets for application, dialog, and toolbox windows
  fld::Tool_Store storage_;       ///< storage location (see FLD_TOOL_STORE_INTERNAL, etc.)
  void write(Fl_Preferences &prefs);
  void read(Fl_Preferences &prefs);
  void write(fld::io::Project_Writer*);
  void read(fld::io::Project_Reader*);
  void update_label();
  void storage(fld::Tool_Store s) { storage_ = s; update_label(); }
  void name(const char *n);
  void init();
  ~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 separate file
 for import/export and sharing.
 */
class Layout_List {
public:
  Fl_Menu_Item *main_menu_;
  Fl_Menu_Item *choice_menu_;
  Layout_Suite *list_;
  int list_size_;
  int list_capacity_;
  bool list_is_static_;
  int current_suite_;
  int current_preset_;
  std::string filename_;
public:
  Layout_List();
  ~Layout_List();
  void update_dialogs();
  void update_menu_labels();
  int current_suite() const { return current_suite_; }
  void current_suite(int ix);
  void current_suite(std::string);
  int current_preset() const { return current_preset_; }
  void current_preset(int ix);
  Layout_Suite &operator[](int ix) { return list_[ix]; }
  int add(const char *name);
  void rename(const char *name);
  void capacity(int);

  int load(const std::string &filename);
  int save(const std::string &filename);
  void write(Fl_Preferences &prefs, fld::Tool_Store storage);
  void read(Fl_Preferences &prefs, fld::Tool_Store storage);
  void write(fld::io::Project_Writer*);
  void read(fld::io::Project_Reader*);
  int add(Layout_Suite*);
  void remove(int index);
  void remove_all(fld::Tool_Store storage);
  Layout_Preset *at(int);
  int size();
};

/**
 \brief Structure holding all the data to perform interactive alignment operations.
 */
typedef struct 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
  Widget_Node *wgt;  ///< first selected widget
  Window_Node *win;  ///< window that handles the drag action
  int ex_out, ey_out;   ///< chosen snap position
} Snap_Data;

/**
 \brief Find points of interest when moving the bounding box of all selected widgets.
 */
class Snap_Action {
protected:
  int check_x_(Snap_Data &d, int x_ref, int x_snap);
  int check_y_(Snap_Data &d, int y_ref, int y_snap);
  void check_x_y_(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;
  Snap_Action() : ex(0x7fff), ey(0x7fff), dx(128), dy(128), type(0), mask(0) { }
  virtual ~Snap_Action() { }
  virtual void check(Snap_Data &d) = 0;
  virtual void draw(Snap_Data &d) { (void)d; }
  virtual bool matches(Snap_Data &d);
public:
  static int eex, eey;
  static Snap_Action *list[];
  static void check_all(Snap_Data &d);
  static void draw_all(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);
};

} // namespace app
} // namespace fld


#endif // _FLUID_FD_SNAP_ACTION_H