]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/grid.cpp
add an opt-out setting to not write entity and brush number comment on map write
[xonotic/netradiant.git] / radiant / grid.cpp
1 /*
2    Copyright (C) 2001-2006, William Joseph.
3    All Rights Reserved.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #include "grid.h"
23
24 #include <math.h>
25 #include <vector>
26 #include <algorithm>
27
28 #include "preferencesystem.h"
29
30 #include "gtkutil/widget.h"
31 #include "signal/signal.h"
32 #include "stringio.h"
33
34 #include "gtkmisc.h"
35 #include "commands.h"
36 #include "preferences.h"
37
38
39 Signal0 g_gridChange_callbacks;
40
41 void AddGridChangeCallback(const SignalHandler &handler)
42 {
43     g_gridChange_callbacks.connectLast(handler);
44     handler();
45 }
46
47 void GridChangeNotify()
48 {
49     g_gridChange_callbacks();
50 }
51
52 enum GridPower {
53     GRIDPOWER_0125 = -3,
54     GRIDPOWER_025 = -2,
55     GRIDPOWER_05 = -1,
56     GRIDPOWER_1 = 0,
57     GRIDPOWER_2 = 1,
58     GRIDPOWER_4 = 2,
59     GRIDPOWER_8 = 3,
60     GRIDPOWER_16 = 4,
61     GRIDPOWER_32 = 5,
62     GRIDPOWER_64 = 6,
63     GRIDPOWER_128 = 7,
64     GRIDPOWER_256 = 8,
65 };
66
67
68 typedef const char *GridName;
69 // this must match the GridPower enumeration
70 const GridName g_gridnames[] = {
71         "0.125",
72         "0.25",
73         "0.5",
74         "1",
75         "2",
76         "4",
77         "8",
78         "16",
79         "32",
80         "64",
81         "128",
82         "256",
83 };
84
85 inline GridPower GridPower_forGridDefault(int gridDefault)
86 {
87     return static_cast<GridPower>( gridDefault - 3 );
88 }
89
90 inline int GridDefault_forGridPower(GridPower gridPower)
91 {
92     return gridPower + 3;
93 }
94
95 int g_grid_default = GridDefault_forGridPower(GRIDPOWER_8);
96
97 int g_grid_power = GridPower_forGridDefault(g_grid_default);
98
99 bool g_grid_snap = true;
100
101 int Grid_getPower()
102 {
103     return g_grid_power;
104 }
105
106 inline float GridSize_forGridPower(int gridPower)
107 {
108     return pow(2.0f, gridPower);
109 }
110
111 float g_gridsize = GridSize_forGridPower(g_grid_power);
112
113 float GetSnapGridSize()
114 {
115     return g_grid_snap ? g_gridsize : 0;
116 }
117
118 float GetGridSize()
119 {
120     return g_gridsize;
121 }
122
123
124 void setGridPower(GridPower power);
125
126 class GridMenuItem {
127     GridPower m_id;
128
129     GridMenuItem(const GridMenuItem &other); // NOT COPYABLE
130     GridMenuItem &operator=(const GridMenuItem &other); // NOT ASSIGNABLE
131 public:
132     ToggleItem m_item;
133
134     GridMenuItem(GridPower id) : m_id(id), m_item(ExportCaller(*this))
135     {
136     }
137
138     void set()
139     {
140         g_grid_power = m_id;
141         m_item.update();
142         setGridPower(m_id);
143     }
144
145     typedef MemberCaller<GridMenuItem, void(), &GridMenuItem::set> SetCaller;
146
147     void active(const Callback<void(bool)> &importCallback)
148     {
149         importCallback(g_grid_power == m_id);
150     }
151
152     typedef MemberCaller<GridMenuItem, void(const Callback<void(bool)> &), &GridMenuItem::active> ExportCaller;
153 };
154
155 GridMenuItem g_gridMenu0125(GRIDPOWER_0125);
156 GridMenuItem g_gridMenu025(GRIDPOWER_025);
157 GridMenuItem g_gridMenu05(GRIDPOWER_05);
158 GridMenuItem g_gridMenu1(GRIDPOWER_1);
159 GridMenuItem g_gridMenu2(GRIDPOWER_2);
160 GridMenuItem g_gridMenu4(GRIDPOWER_4);
161 GridMenuItem g_gridMenu8(GRIDPOWER_8);
162 GridMenuItem g_gridMenu16(GRIDPOWER_16);
163 GridMenuItem g_gridMenu32(GRIDPOWER_32);
164 GridMenuItem g_gridMenu64(GRIDPOWER_64);
165 GridMenuItem g_gridMenu128(GRIDPOWER_128);
166 GridMenuItem g_gridMenu256(GRIDPOWER_256);
167
168 void setGridPower(GridPower power)
169 {
170     g_grid_snap = true;
171     g_gridsize = GridSize_forGridPower(power);
172
173     g_gridMenu0125.m_item.update();
174     g_gridMenu025.m_item.update();
175     g_gridMenu05.m_item.update();
176     g_gridMenu1.m_item.update();
177     g_gridMenu2.m_item.update();
178     g_gridMenu4.m_item.update();
179     g_gridMenu8.m_item.update();
180     g_gridMenu16.m_item.update();
181     g_gridMenu32.m_item.update();
182     g_gridMenu64.m_item.update();
183     g_gridMenu128.m_item.update();
184     g_gridMenu256.m_item.update();
185     GridChangeNotify();
186 }
187
188 void GridPrev()
189 {
190     g_grid_snap = true;
191     if (g_grid_power > GRIDPOWER_0125) {
192         setGridPower(static_cast<GridPower>( --g_grid_power ));
193     }
194 }
195
196 void GridNext()
197 {
198     g_grid_snap = true;
199     if (g_grid_power < GRIDPOWER_256) {
200         setGridPower(static_cast<GridPower>( ++g_grid_power ));
201     }
202 }
203
204 void ToggleGridSnap()
205 {
206     g_grid_snap = !g_grid_snap;
207     GridChangeNotify();
208 }
209
210 void Grid_registerCommands()
211 {
212     GlobalCommands_insert("GridDown", makeCallbackF(GridPrev), Accelerator('['));
213     GlobalCommands_insert("GridUp", makeCallbackF(GridNext), Accelerator(']'));
214
215     GlobalCommands_insert("ToggleGridSnap", makeCallbackF(ToggleGridSnap));
216
217     GlobalToggles_insert("SetGrid0.125", GridMenuItem::SetCaller(g_gridMenu0125),
218                          ToggleItem::AddCallbackCaller(g_gridMenu0125.m_item));
219     GlobalToggles_insert("SetGrid0.25", GridMenuItem::SetCaller(g_gridMenu025),
220                          ToggleItem::AddCallbackCaller(g_gridMenu025.m_item));
221     GlobalToggles_insert("SetGrid0.5", GridMenuItem::SetCaller(g_gridMenu05),
222                          ToggleItem::AddCallbackCaller(g_gridMenu05.m_item));
223     GlobalToggles_insert("SetGrid1", GridMenuItem::SetCaller(g_gridMenu1),
224                          ToggleItem::AddCallbackCaller(g_gridMenu1.m_item), Accelerator('1'));
225     GlobalToggles_insert("SetGrid2", GridMenuItem::SetCaller(g_gridMenu2),
226                          ToggleItem::AddCallbackCaller(g_gridMenu2.m_item), Accelerator('2'));
227     GlobalToggles_insert("SetGrid4", GridMenuItem::SetCaller(g_gridMenu4),
228                          ToggleItem::AddCallbackCaller(g_gridMenu4.m_item), Accelerator('3'));
229     GlobalToggles_insert("SetGrid8", GridMenuItem::SetCaller(g_gridMenu8),
230                          ToggleItem::AddCallbackCaller(g_gridMenu8.m_item), Accelerator('4'));
231     GlobalToggles_insert("SetGrid16", GridMenuItem::SetCaller(g_gridMenu16),
232                          ToggleItem::AddCallbackCaller(g_gridMenu16.m_item), Accelerator('5'));
233     GlobalToggles_insert("SetGrid32", GridMenuItem::SetCaller(g_gridMenu32),
234                          ToggleItem::AddCallbackCaller(g_gridMenu32.m_item), Accelerator('6'));
235     GlobalToggles_insert("SetGrid64", GridMenuItem::SetCaller(g_gridMenu64),
236                          ToggleItem::AddCallbackCaller(g_gridMenu64.m_item), Accelerator('7'));
237     GlobalToggles_insert("SetGrid128", GridMenuItem::SetCaller(g_gridMenu128),
238                          ToggleItem::AddCallbackCaller(g_gridMenu128.m_item), Accelerator('8'));
239     GlobalToggles_insert("SetGrid256", GridMenuItem::SetCaller(g_gridMenu256),
240                          ToggleItem::AddCallbackCaller(g_gridMenu256.m_item), Accelerator('9'));
241 }
242
243
244 void Grid_constructMenu(ui::Menu menu)
245 {
246     create_check_menu_item_with_mnemonic(menu, "Grid0.125", "SetGrid0.125");
247     create_check_menu_item_with_mnemonic(menu, "Grid0.25", "SetGrid0.25");
248     create_check_menu_item_with_mnemonic(menu, "Grid0.5", "SetGrid0.5");
249     create_check_menu_item_with_mnemonic(menu, "Grid1", "SetGrid1");
250     create_check_menu_item_with_mnemonic(menu, "Grid2", "SetGrid2");
251     create_check_menu_item_with_mnemonic(menu, "Grid4", "SetGrid4");
252     create_check_menu_item_with_mnemonic(menu, "Grid8", "SetGrid8");
253     create_check_menu_item_with_mnemonic(menu, "Grid16", "SetGrid16");
254     create_check_menu_item_with_mnemonic(menu, "Grid32", "SetGrid32");
255     create_check_menu_item_with_mnemonic(menu, "Grid64", "SetGrid64");
256     create_check_menu_item_with_mnemonic(menu, "Grid128", "SetGrid128");
257     create_check_menu_item_with_mnemonic(menu, "Grid256", "SetGrid256");
258 }
259
260 void Grid_registerShortcuts()
261 {
262     command_connect_accelerator("ToggleGrid");
263     command_connect_accelerator("GridDown");
264     command_connect_accelerator("GridUp");
265     command_connect_accelerator("ToggleGridSnap");
266 }
267
268 void Grid_constructPreferences(PreferencesPage &page)
269 {
270     page.appendCombo(
271             "Default grid spacing",
272             g_grid_default,
273             ARRAY_RANGE(g_gridnames)
274     );
275 }
276
277 void Grid_constructPage(PreferenceGroup &group)
278 {
279     PreferencesPage page(group.createPage("Grid", "Grid Settings"));
280     Grid_constructPreferences(page);
281 }
282
283 void Grid_registerPreferencesPage()
284 {
285     PreferencesDialog_addSettingsPage(makeCallbackF(Grid_constructPage));
286 }
287
288 void Grid_construct()
289 {
290     Grid_registerPreferencesPage();
291
292     g_grid_default = GridDefault_forGridPower(GRIDPOWER_8);
293
294     GlobalPreferenceSystem().registerPreference("GridDefault", make_property_string(g_grid_default));
295
296     g_grid_power = GridPower_forGridDefault(g_grid_default);
297     g_gridsize = GridSize_forGridPower(g_grid_power);
298 }
299
300 void Grid_destroy()
301 {
302 }