2 Copyright (C) 2001-2006, William Joseph.
5 This file is part of GtkRadiant.
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.
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.
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
28 #include "preferencesystem.h"
30 #include "gtkutil/widget.h"
31 #include "signal/signal.h"
36 #include "preferences.h"
39 Signal0 g_gridChange_callbacks;
41 void AddGridChangeCallback(const SignalHandler &handler)
43 g_gridChange_callbacks.connectLast(handler);
47 void GridChangeNotify()
49 g_gridChange_callbacks();
68 typedef const char *GridName;
69 // this must match the GridPower enumeration
70 const GridName g_gridnames[] = {
85 inline GridPower GridPower_forGridDefault(int gridDefault)
87 return static_cast<GridPower>( gridDefault - 3 );
90 inline int GridDefault_forGridPower(GridPower gridPower)
95 int g_grid_default = GridDefault_forGridPower(GRIDPOWER_8);
97 int g_grid_power = GridPower_forGridDefault(g_grid_default);
99 bool g_grid_snap = true;
106 inline float GridSize_forGridPower(int gridPower)
108 return pow(2.0f, gridPower);
111 float g_gridsize = GridSize_forGridPower(g_grid_power);
113 float GetSnapGridSize()
115 return g_grid_snap ? g_gridsize : 0;
124 void setGridPower(GridPower power);
129 GridMenuItem(const GridMenuItem &other); // NOT COPYABLE
130 GridMenuItem &operator=(const GridMenuItem &other); // NOT ASSIGNABLE
134 GridMenuItem(GridPower id) : m_id(id), m_item(ExportCaller(*this))
145 typedef MemberCaller<GridMenuItem, void(), &GridMenuItem::set> SetCaller;
147 void active(const Callback<void(bool)> &importCallback)
149 importCallback(g_grid_power == m_id);
152 typedef MemberCaller<GridMenuItem, void(const Callback<void(bool)> &), &GridMenuItem::active> ExportCaller;
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);
168 void setGridPower(GridPower power)
171 g_gridsize = GridSize_forGridPower(power);
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();
191 if (g_grid_power > GRIDPOWER_0125) {
192 setGridPower(static_cast<GridPower>( --g_grid_power ));
199 if (g_grid_power < GRIDPOWER_256) {
200 setGridPower(static_cast<GridPower>( ++g_grid_power ));
204 void ToggleGridSnap()
206 g_grid_snap = !g_grid_snap;
210 void Grid_registerCommands()
212 GlobalCommands_insert("GridDown", makeCallbackF(GridPrev), Accelerator('['));
213 GlobalCommands_insert("GridUp", makeCallbackF(GridNext), Accelerator(']'));
215 GlobalCommands_insert("ToggleGridSnap", makeCallbackF(ToggleGridSnap));
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'));
244 void Grid_constructMenu(ui::Menu menu)
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");
260 void Grid_registerShortcuts()
262 command_connect_accelerator("ToggleGrid");
263 command_connect_accelerator("GridDown");
264 command_connect_accelerator("GridUp");
265 command_connect_accelerator("ToggleGridSnap");
268 void Grid_constructPreferences(PreferencesPage &page)
271 "Default grid spacing",
273 ARRAY_RANGE(g_gridnames)
277 void Grid_constructPage(PreferenceGroup &group)
279 PreferencesPage page(group.createPage("Grid", "Grid Settings"));
280 Grid_constructPreferences(page);
283 void Grid_registerPreferencesPage()
285 PreferencesDialog_addSettingsPage(makeCallbackF(Grid_constructPage));
288 void Grid_construct()
290 Grid_registerPreferencesPage();
292 g_grid_default = GridDefault_forGridPower(GRIDPOWER_8);
294 GlobalPreferenceSystem().registerPreference("GridDefault", make_property_string(g_grid_default));
296 g_grid_power = GridPower_forGridDefault(g_grid_default);
297 g_gridsize = GridSize_forGridPower(g_grid_power);