ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/RenegadeMapSelector/MapSelector.cpp
(Generate patch)

Comparing trunk/RenegadeMapSelector/MapSelector.cpp (file contents):
Revision 86 by douglas, 2003-03-15T16:43:53-08:00 vs.
Revision 94 by douglas, 2003-03-22T13:53:44-08:00

# Line 4 | Line 4
4   //
5   // MapSelector.cpp
6  
7 < #ifndef _WIN32
8 <
9 < static void destruct(GtkWidget* widget, gpointer data)
10 < {
11 <        gtk_main_quit();
12 < }
13 <
14 < static void done(GtkWidget* widget, gpointer data)
15 < {
16 <        if (true)
17 <        {
18 <                message(GTK_WINDOW(window), "You need at least one map.", "No Maps",
19 <                        GTK_MESSAGE_WARNING);
20 <        }
21 <        else
22 <        {
23 <                //
24 <
25 <                config->save();
26 <
27 <                gtk_main_quit();
28 <        }
29 < }
30 <
31 < static void mapAdd(GtkWidget* widget, gpointer data)
32 < {
33 <        cout << "STUB: add\n\a" << flush;
34 < }
35 <
36 < static void mapRemove(GtkWidget* widget, gpointer data)
37 < {
38 <        cout << "STUB: remove\n\a" << flush;
39 < }
40 <
41 < static void mapUp(GtkWidget* widget, gpointer data)
42 < {
43 <        cout << "STUB: up\n\a" << flush;
44 < }
7 > #include "MapSelector.h"
8  
9 < static void mapDown(GtkWidget* widget, gpointer data)
47 < {
48 <        cout << "STUB: down\n\a" << flush;
49 < }
9 > #ifndef _WIN32
10  
11   MapSelector::MapSelector()
12   {
# Line 55 | Line 15 | MapSelector::MapSelector()
15          gtk_window_set_title(GTK_WINDOW(window), "Renegade Map Selector");
16          gtk_window_set_resizable(GTK_WINDOW(window), false);
17          g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(destruct),
18 <                NULL);
18 >                this);
19  
20          GtkWidget* vertical = gtk_vbox_new(false, 0);
21          GtkWidget* horizontal = gtk_hbox_new(false, 9);
# Line 64 | Line 24 | MapSelector::MapSelector()
24          gtk_frame_set_label_align(GTK_FRAME(left), 0.5, 0.5);
25          gtk_container_set_border_width(GTK_CONTAINER(left), 6);
26  
27 +        GtkWidget* leftScroll = gtk_scrolled_window_new(NULL, NULL);
28 +        
29 +        gtk_container_set_border_width(GTK_CONTAINER(leftScroll), 6);
30 +        gtk_widget_set_size_request(leftScroll, 150, 200);
31 +        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(leftScroll),
32 +                GTK_SHADOW_IN);
33 +
34 +        available = gtk_tree_view_new();
35 +
36 +        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(available), false);
37 +        setupAvailable();
38 +
39          GtkWidget* center = gtk_vbox_new(true, 0);
40          GtkWidget* top = gtk_vbutton_box_new();
41  
# Line 73 | Line 45 | MapSelector::MapSelector()
45  
46          add = gtk_button_new_with_mnemonic("_Add");
47  
48 <        g_signal_connect(G_OBJECT(add), "clicked", G_CALLBACK(mapAdd), NULL);
48 >        g_signal_connect(G_OBJECT(add), "clicked", G_CALLBACK(mapAdd), this);
49          gtk_widget_set_sensitive(add, false);
50  
51          remove = gtk_button_new_with_mnemonic("_Remove");
52  
53 <        g_signal_connect(G_OBJECT(remove), "clicked", G_CALLBACK(mapRemove), NULL);
53 >        g_signal_connect(G_OBJECT(remove), "clicked", G_CALLBACK(mapRemove), this);
54          gtk_widget_set_sensitive(remove, false);
55  
56          GtkWidget* middle = gtk_vbutton_box_new();
# Line 89 | Line 61 | MapSelector::MapSelector()
61  
62          up = gtk_button_new_with_mnemonic("_Up");
63  
64 <        g_signal_connect(G_OBJECT(up), "clicked", G_CALLBACK(mapUp), NULL);
64 >        g_signal_connect(G_OBJECT(up), "clicked", G_CALLBACK(mapUp), this);
65          gtk_widget_set_sensitive(up, false);
66  
67          down = gtk_button_new_with_mnemonic("_Down");
68  
69 <        g_signal_connect(G_OBJECT(down), "clicked", G_CALLBACK(mapDown), NULL);
69 >        g_signal_connect(G_OBJECT(down), "clicked", G_CALLBACK(mapDown), this);
70          gtk_widget_set_sensitive(down, false);
71  
72          GtkWidget* right = gtk_frame_new("Selected Maps");
# Line 102 | Line 74 | MapSelector::MapSelector()
74          gtk_frame_set_label_align(GTK_FRAME(right), 0.5, 0.5);
75          gtk_container_set_border_width(GTK_CONTAINER(right), 6);
76  
77 +        GtkWidget* rightScroll = gtk_scrolled_window_new(NULL, NULL);
78 +
79 +        gtk_container_set_border_width(GTK_CONTAINER(rightScroll), 6);
80 +        gtk_widget_set_size_request(rightScroll, 150, 200);
81 +        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(rightScroll),
82 +                GTK_SHADOW_IN);
83 +
84 +        selected = gtk_tree_view_new();
85 +
86 +        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(selected), false);
87 +        setupSelected();
88 +
89          GtkWidget* separator = gtk_hseparator_new();
90          GtkWidget* bottom = gtk_hbutton_box_new();
91  
# Line 111 | Line 95 | MapSelector::MapSelector()
95  
96          GtkWidget* ok = gtk_button_new_from_stock(GTK_STOCK_OK);
97  
98 <        g_signal_connect(G_OBJECT(ok), "clicked", G_CALLBACK(done), NULL);
98 >        g_signal_connect(G_OBJECT(ok), "clicked", G_CALLBACK(done), this);
99 >        GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT);
100  
101          GtkWidget* cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
102  
103 <        g_signal_connect(G_OBJECT(cancel), "clicked", G_CALLBACK(destruct), NULL);
103 >        g_signal_connect(G_OBJECT(cancel), "clicked", G_CALLBACK(destruct), this);
104  
105          // pack
106          gtk_container_add(GTK_CONTAINER(vertical), horizontal);
107          gtk_container_add(GTK_CONTAINER(horizontal), left);
108 +        gtk_container_add(GTK_CONTAINER(left), leftScroll);
109 +        gtk_container_add(GTK_CONTAINER(leftScroll), available);
110          gtk_container_add(GTK_CONTAINER(horizontal), center);
111          gtk_container_add(GTK_CONTAINER(center), top);
112          gtk_container_add(GTK_CONTAINER(top), add);
# Line 128 | Line 115 | MapSelector::MapSelector()
115          gtk_container_add(GTK_CONTAINER(middle), up);
116          gtk_container_add(GTK_CONTAINER(middle), down);
117          gtk_container_add(GTK_CONTAINER(horizontal), right);
118 +        gtk_container_add(GTK_CONTAINER(right), rightScroll);
119 +        gtk_container_add(GTK_CONTAINER(rightScroll), selected);
120          gtk_container_add(GTK_CONTAINER(vertical), separator);
121          gtk_container_add(GTK_CONTAINER(bottom), ok);
122          gtk_container_add(GTK_CONTAINER(bottom), cancel);
# Line 135 | Line 124 | MapSelector::MapSelector()
124          gtk_container_add(GTK_CONTAINER(window), vertical);
125  
126          // show
127 +        gtk_widget_show(available);
128 +        gtk_widget_show(leftScroll);
129          gtk_widget_show(left);
130          gtk_widget_show(add);
131          gtk_widget_show(remove);
# Line 143 | Line 134 | MapSelector::MapSelector()
134          gtk_widget_show(down);
135          gtk_widget_show(middle);
136          gtk_widget_show(center);
137 +        gtk_widget_show(selected);
138 +        gtk_widget_show(rightScroll);
139          gtk_widget_show(right);
140          gtk_widget_show(horizontal);
141          gtk_widget_show(separator);
# Line 152 | Line 145 | MapSelector::MapSelector()
145          gtk_widget_show(vertical);
146          gtk_widget_show(window);
147  
148 +        // stuff
149 +        gtk_widget_grab_default(ok);
150 +        gtk_widget_grab_focus(ok);
151 +
152 +        GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
153 +                available));
154 +
155 +        gtk_tree_selection_unselect_all(selection);
156 +
157          gtk_main();
158   }
159  
160 + void MapSelector::setupAvailable()
161 + {
162 +        GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
163 +
164 +        char* directory = new char[MAXPATHLEN + 1];
165 +        getcwd(directory, MAXPATHLEN + 1);
166 +        if (debug) cerr << "directory = " << directory << "\n";
167 +
168 +        char* data = new char[strlen(directory) + 6];
169 +        sprintf(data, "%s/data", directory);
170 +        delete [] directory;
171 +        if (debug) cerr << "data = " << data << "\n";
172 +
173 +        DIR* dir = opendir(data);
174 +        delete [] data;
175 +
176 +        GtkTreeIter itor;
177 +        dirent* file;
178 +        while ((file = readdir(dir)) != NULL)
179 +        {
180 +                string name = file->d_name;
181 +
182 +                if (name.rfind(".mix") == name.length() - 4)
183 +                {
184 +                        gtk_list_store_append(store, &itor);
185 +                        gtk_list_store_set(store, &itor, 0, name.c_str(), -1);
186 +                }
187 +        }
188 +
189 +        closedir(dir);
190 +
191 +        gtk_tree_view_set_model(GTK_TREE_VIEW(available), GTK_TREE_MODEL(store));
192 +
193 +        GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
194 +        GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(NULL,
195 +                renderer, "text", 0, NULL);
196 +
197 +        gtk_tree_view_append_column(GTK_TREE_VIEW(available), column);
198 +
199 +        GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
200 +                available));
201 +
202 +        gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
203 +        g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(changeAvailable
204 +                ), this);
205 + }
206 +
207 + void MapSelector::setupSelected()
208 + {
209 +        GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);
210 +
211 +        vector<string> maps = config->getMaps();
212 +
213 +        GtkTreeIter itor;
214 +        for (unsigned index = 0; index < maps.size(); index++)
215 +        {
216 +                gtk_list_store_append(store, &itor);
217 +                gtk_list_store_set(store, &itor, 0, maps[index].c_str(), -1);
218 +        }
219 +
220 +        gtk_tree_view_set_model(GTK_TREE_VIEW(selected), GTK_TREE_MODEL(store));
221 +
222 +        GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
223 +        GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(NULL,
224 +                renderer, "text", 0, NULL);
225 +
226 +        gtk_tree_view_append_column(GTK_TREE_VIEW(selected), column);
227 +
228 +        GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
229 +                selected));
230 +
231 +        gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
232 +        g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(changeSelected),
233 +                this);
234 + }
235 +
236 + void destruct(GtkWidget* widget, MapSelector* data)
237 + {
238 +        gtk_main_quit();
239 + }
240 +
241 + void done(GtkWidget* widget, MapSelector* data)
242 + {
243 +        GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected)
244 +                );
245 +        
246 +        GtkTreeIter itor;
247 +        if (!gtk_tree_model_get_iter_first(store, &itor))
248 +        {
249 +                message(GTK_WINDOW(data->window), "You need at least one map.",
250 +                        "No Maps", GTK_MESSAGE_INFO);
251 +        }
252 +        else
253 +        {
254 +                vector<string> maps;
255 +
256 +                do
257 +                {
258 +                        char* name;
259 +
260 +                        gtk_tree_model_get(store, &itor, 0, &name, -1);
261 +                        maps.push_back(name);
262 +
263 +                        g_free(name);
264 +                }
265 +                while (gtk_tree_model_iter_next(store, &itor));
266 +
267 +                config->setMaps(maps);
268 +                
269 +                config->save();
270 +
271 +                gtk_main_quit();
272 +        }
273 + }
274 +
275 + void changeAvailable(GtkTreeSelection* selection, MapSelector* data)
276 + {
277 +        if (gtk_tree_selection_count_selected_rows(selection) > 0)
278 +        {
279 +                gtk_widget_set_sensitive(data->add, true);
280 +        }
281 +        else
282 +        {
283 +                gtk_widget_set_sensitive(data->add, false);
284 +        }
285 + }
286 +
287 + void changeSelected(GtkTreeSelection* selection, MapSelector* data)
288 + {
289 +        cout << "STUB: changeSelected\n\a" << flush;
290 + }
291 +
292 + void mapAdd(GtkWidget* widget, MapSelector* data)
293 + {
294 +        cout << "STUB: add\n\a" << flush;
295 + }
296 +
297 + void mapRemove(GtkWidget* widget, MapSelector* data)
298 + {
299 +        cout << "STUB: remove\n\a" << flush;
300 + }
301 +
302 + void mapUp(GtkWidget* widget, MapSelector* data)
303 + {
304 +        cout << "STUB: up\n\a" << flush;
305 + }
306 +
307 + void mapDown(GtkWidget* widget, MapSelector* data)
308 + {
309 +        cout << "STUB: down\n\a" << flush;
310 + }
311 +
312   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines