2 Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
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
29 #include "generic/callback.h"
30 #include "stream/stringstream.h"
33 #include "gtkutil/menu.h"
37 const int MRU_MAX = 4;
39 GtkMenuItem *MRU_items[MRU_MAX];
41 typedef CopiedString MRU_filename_t;
42 MRU_filename_t MRU_filenames[MRU_MAX];
43 typedef const char *MRU_key_t;
44 MRU_key_t MRU_keys[MRU_MAX] = {"File0", "File1", "File2", "File3"};
47 inline const char *MRU_GetText(std::size_t index)
49 return MRU_filenames[index].c_str();
52 class EscapedMnemonic {
53 StringBuffer m_buffer;
55 EscapedMnemonic(std::size_t capacity) : m_buffer(capacity)
57 m_buffer.push_back('_');
60 const char *c_str() const
62 return m_buffer.c_str();
65 void push_back(char c)
67 m_buffer.push_back(c);
70 std::size_t write(const char *buffer, std::size_t length)
72 for (const char *end = buffer + length; buffer != end; ++buffer) {
74 m_buffer.push_back('_');
77 m_buffer.push_back(*buffer);
84 inline EscapedMnemonic &operator<<(EscapedMnemonic &ostream, const T &t)
86 return ostream_write(ostream, t);
90 void MRU_updateWidget(std::size_t index, const char *filename)
92 EscapedMnemonic mnemonic(64);
93 mnemonic << Unsigned(index + 1) << "- " << filename;
94 gtk_label_set_text_with_mnemonic(GTK_LABEL(gtk_bin_get_child(GTK_BIN(MRU_items[index]))), mnemonic.c_str());
97 void MRU_SetText(std::size_t index, const char *filename)
99 MRU_filenames[index] = filename;
100 MRU_updateWidget(index, filename);
103 void MRU_AddFile(const char *str)
108 // check if file is already in our list
109 for (i = 0; i < MRU_used; i++) {
110 text = MRU_GetText(i);
112 if (strcmp(text, str) == 0) {
115 MRU_SetText(i, MRU_GetText(i - 1));
124 if (MRU_used < MRU_MAX) {
129 for (i = MRU_used - 1; i > 0; i--) {
130 MRU_SetText(i, MRU_GetText(i - 1));
134 gtk_widget_set_sensitive(ui::MenuItem::from(MRU_items[0]), TRUE);
135 ui::MenuItem::from(MRU_items[MRU_used - 1]).show();
140 if (MRU_used > MRU_MAX) {
145 void MRU_AddWidget(ui::MenuItem widget, std::size_t pos)
148 MRU_items[pos] = widget;
149 if (pos < MRU_used) {
150 MRU_updateWidget(pos, MRU_GetText(pos));
151 gtk_widget_set_sensitive(ui::MenuItem::from(MRU_items[0]), TRUE);
152 ui::MenuItem::from(MRU_items[pos]).show();
157 void MRU_Activate(std::size_t index)
160 strcpy(text, MRU_GetText(index));
162 if (file_readable(text)) { //\todo Test 'map load succeeds' instead of 'file is readable'.
170 for (std::size_t i = index; i < MRU_used; i++) {
171 MRU_SetText(i, MRU_GetText(i + 1));
175 auto label = ui::Label::from(gtk_bin_get_child(GTK_BIN(MRU_items[0])));
176 label.text("Recent Files");
177 gtk_widget_set_sensitive(ui::MenuItem::from(MRU_items[0]), FALSE);
179 ui::MenuItem::from(MRU_items[MRU_used]).hide();
186 std::size_t m_number;
188 LoadMRU(std::size_t number)
195 if (ConfirmModified("Open Map")) {
196 MRU_Activate(m_number - 1);
201 typedef MemberCaller<LoadMRU, void(), &LoadMRU::load> LoadMRUCaller;
203 LoadMRU g_load_mru1(1);
204 LoadMRU g_load_mru2(2);
205 LoadMRU g_load_mru3(3);
206 LoadMRU g_load_mru4(4);
208 void MRU_constructMenu(ui::Menu menu)
211 auto item = create_menu_item_with_mnemonic(menu, "_1", LoadMRUCaller(g_load_mru1));
212 gtk_widget_set_sensitive(item, FALSE);
213 MRU_AddWidget(item, 0);
216 auto item = create_menu_item_with_mnemonic(menu, "_2", LoadMRUCaller(g_load_mru2));
218 MRU_AddWidget(item, 1);
221 auto item = create_menu_item_with_mnemonic(menu, "_3", LoadMRUCaller(g_load_mru3));
223 MRU_AddWidget(item, 2);
226 auto item = create_menu_item_with_mnemonic(menu, "_4", LoadMRUCaller(g_load_mru4));
228 MRU_AddWidget(item, 3);
232 #include "preferencesystem.h"
233 #include "stringio.h"
237 GlobalPreferenceSystem().registerPreference("Count", make_property_string(MRU_used));
239 for (std::size_t i = 0; i != MRU_MAX; ++i) {
240 GlobalPreferenceSystem().registerPreference(MRU_keys[i], make_property_string(MRU_filenames[i]));