96 |
|
GtkWidget* ok = gtk_button_new_from_stock(GTK_STOCK_OK); |
97 |
|
|
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 |
|
|
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 |
|
|
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() |
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) |
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_INFORMATION); |
250 |
> |
"No Maps", GTK_MESSAGE_INFO); |
251 |
|
} |
252 |
|
else |
253 |
|
{ |
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 |
+ |
if (gtk_tree_selection_count_selected_rows(selection) > 0) |
290 |
+ |
{ |
291 |
+ |
gtk_widget_set_sensitive(data->remove, true); |
292 |
+ |
|
293 |
+ |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW( |
294 |
+ |
data->selected)); |
295 |
+ |
GtkTreeIter first, last; |
296 |
+ |
|
297 |
+ |
gtk_tree_model_get_iter_first(store, &first); |
298 |
+ |
gtk_tree_model_iter_nth_child(store, &last, NULL, |
299 |
+ |
gtk_tree_model_iter_n_children(store, NULL) - 1); |
300 |
+ |
|
301 |
+ |
if (!gtk_tree_selection_iter_is_selected(selection, &first)) |
302 |
+ |
{ |
303 |
+ |
gtk_widget_set_sensitive(data->up, true); |
304 |
+ |
} |
305 |
+ |
else |
306 |
+ |
{ |
307 |
+ |
gtk_widget_set_sensitive(data->up, false); |
308 |
+ |
} |
309 |
+ |
|
310 |
+ |
if (!gtk_tree_selection_iter_is_selected(selection, &last)) |
311 |
+ |
{ |
312 |
+ |
gtk_widget_set_sensitive(data->down, true); |
313 |
+ |
} |
314 |
+ |
else |
315 |
+ |
{ |
316 |
+ |
gtk_widget_set_sensitive(data->down, false); |
317 |
+ |
} |
318 |
+ |
} |
319 |
+ |
else |
320 |
+ |
{ |
321 |
+ |
gtk_widget_set_sensitive(data->remove, false); |
322 |
+ |
gtk_widget_set_sensitive(data->up, false); |
323 |
+ |
gtk_widget_set_sensitive(data->down, false); |
324 |
+ |
} |
325 |
+ |
} |
326 |
+ |
|
327 |
|
void mapAdd(GtkWidget* widget, MapSelector* data) |
328 |
|
{ |
329 |
< |
cout << "STUB: add\n\a" << flush; |
329 |
> |
GtkTreeSelection* additions = gtk_tree_view_get_selection(GTK_TREE_VIEW( |
330 |
> |
data->available)); |
331 |
> |
|
332 |
> |
if (debug) cerr << "additions = {\n"; |
333 |
> |
|
334 |
> |
data->counter = 0; |
335 |
> |
gtk_tree_selection_selected_foreach(additions, mapAddEach, data); |
336 |
> |
|
337 |
> |
if (debug) cerr << "}\n"; |
338 |
> |
|
339 |
> |
gtk_tree_selection_unselect_all(additions); |
340 |
> |
} |
341 |
> |
|
342 |
> |
void mapAddEach(GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, |
343 |
> |
MapSelector* data) |
344 |
> |
{ |
345 |
> |
if (debug) |
346 |
> |
{ |
347 |
> |
char* number = gtk_tree_model_get_string_from_iter(model, iter); |
348 |
> |
|
349 |
> |
cerr << " [" << data->counter++ << "] = " << number << "\n"; |
350 |
> |
|
351 |
> |
g_free(number); |
352 |
> |
} |
353 |
> |
|
354 |
> |
char* addition; |
355 |
> |
|
356 |
> |
gtk_tree_model_get(model, iter, 0, &addition, -1); |
357 |
> |
|
358 |
> |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected) |
359 |
> |
); |
360 |
> |
GtkTreeIter itor; |
361 |
> |
|
362 |
> |
gtk_list_store_append(GTK_LIST_STORE(store), &itor); |
363 |
> |
gtk_list_store_set(GTK_LIST_STORE(store), &itor, 0, addition, -1); |
364 |
> |
|
365 |
> |
g_free(addition); |
366 |
|
} |
367 |
|
|
368 |
|
void mapRemove(GtkWidget* widget, MapSelector* data) |
369 |
|
{ |
370 |
< |
cout << "STUB: remove\n\a" << flush; |
370 |
> |
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( |
371 |
> |
data->selected)); |
372 |
> |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected) |
373 |
> |
); |
374 |
> |
GList* removals = gtk_tree_selection_get_selected_rows(selection, &store); |
375 |
> |
|
376 |
> |
if (debug) cerr << "removals = {\n"; |
377 |
> |
|
378 |
> |
removals = g_list_reverse(removals); |
379 |
> |
data->counter = g_list_length(removals) - 1; |
380 |
> |
g_list_foreach(removals, mapRemoveEach, data); |
381 |
> |
|
382 |
> |
if (debug) cerr << "}\n"; |
383 |
> |
|
384 |
> |
g_list_free(removals); |
385 |
> |
gtk_tree_selection_unselect_all(selection); |
386 |
> |
} |
387 |
> |
|
388 |
> |
void mapRemoveEach(GtkTreePath* path, MapSelector* data) |
389 |
> |
{ |
390 |
> |
if (debug) |
391 |
> |
{ |
392 |
> |
char* number = gtk_tree_path_to_string(path); |
393 |
> |
|
394 |
> |
cerr << " [" << data->counter-- << "] = " << number << "\n"; |
395 |
> |
|
396 |
> |
g_free(number); |
397 |
> |
} |
398 |
> |
|
399 |
> |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected) |
400 |
> |
); |
401 |
> |
GtkTreeIter itor; |
402 |
> |
|
403 |
> |
gtk_tree_model_get_iter(store, &itor, path); |
404 |
> |
gtk_list_store_remove(GTK_LIST_STORE(store), &itor); |
405 |
|
} |
406 |
|
|
407 |
|
void mapUp(GtkWidget* widget, MapSelector* data) |
408 |
|
{ |
409 |
< |
cout << "STUB: up\n\a" << flush; |
409 |
> |
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( |
410 |
> |
data->selected)); |
411 |
> |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected) |
412 |
> |
); |
413 |
> |
GList* ups = gtk_tree_selection_get_selected_rows(selection, &store); |
414 |
> |
|
415 |
> |
if (debug) cerr << "ups = {\n"; |
416 |
> |
|
417 |
> |
data->counter = 0; |
418 |
> |
data->insert = 0; |
419 |
> |
g_list_foreach(ups, mapUpEach, data); |
420 |
> |
|
421 |
> |
if (debug) cerr << "}\n"; |
422 |
> |
|
423 |
> |
g_list_free(ups); |
424 |
> |
} |
425 |
> |
|
426 |
> |
void mapUpEach(GtkTreePath* path, MapSelector* data) |
427 |
> |
{ |
428 |
> |
if (debug) |
429 |
> |
{ |
430 |
> |
char* number = gtk_tree_path_to_string(path); |
431 |
> |
|
432 |
> |
cerr << " [" << data->counter++ << "] = " << number << "\n"; |
433 |
> |
|
434 |
> |
g_free(number); |
435 |
> |
} |
436 |
> |
|
437 |
> |
if (data->insert == 0) |
438 |
> |
{ |
439 |
> |
int* number = gtk_tree_path_get_indices(path); |
440 |
> |
|
441 |
> |
data->insert = *number - 1; |
442 |
> |
} |
443 |
> |
|
444 |
> |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected) |
445 |
> |
); |
446 |
> |
GtkTreeIter itor; |
447 |
> |
char* up; |
448 |
> |
|
449 |
> |
gtk_tree_model_get_iter(store, &itor, path); |
450 |
> |
gtk_tree_model_get(store, &itor, 0, &up, -1); |
451 |
> |
gtk_list_store_remove(GTK_LIST_STORE(store), &itor); |
452 |
> |
gtk_list_store_insert(GTK_LIST_STORE(store), &itor, data->insert++); |
453 |
> |
gtk_list_store_set(GTK_LIST_STORE(store), &itor, 0, up, -1); |
454 |
> |
|
455 |
> |
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( |
456 |
> |
data->selected)); |
457 |
> |
|
458 |
> |
gtk_tree_selection_select_iter(selection, &itor); |
459 |
> |
g_free(up); |
460 |
|
} |
461 |
|
|
462 |
|
void mapDown(GtkWidget* widget, MapSelector* data) |
463 |
|
{ |
464 |
< |
cout << "STUB: down\n\a" << flush; |
464 |
> |
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( |
465 |
> |
data->selected)); |
466 |
> |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected) |
467 |
> |
); |
468 |
> |
GList* downs = gtk_tree_selection_get_selected_rows(selection, &store); |
469 |
> |
|
470 |
> |
if (debug) cerr << "downs = {\n"; |
471 |
> |
|
472 |
> |
downs = g_list_reverse(downs); |
473 |
> |
data->counter = g_list_length(downs) - 1; |
474 |
> |
data->insert = 0; |
475 |
> |
g_list_foreach(downs, mapDownEach, data); |
476 |
> |
|
477 |
> |
if (debug) cerr << "}\n"; |
478 |
> |
|
479 |
> |
g_list_free(downs); |
480 |
> |
} |
481 |
> |
|
482 |
> |
void mapDownEach(GtkTreePath* path, MapSelector* data) |
483 |
> |
{ |
484 |
> |
if (debug) |
485 |
> |
{ |
486 |
> |
char* number = gtk_tree_path_to_string(path); |
487 |
> |
|
488 |
> |
cerr << " [" << data->counter-- << "] = " << number << "\n"; |
489 |
> |
|
490 |
> |
g_free(number); |
491 |
> |
} |
492 |
> |
|
493 |
> |
if (data->insert == 0) |
494 |
> |
{ |
495 |
> |
int* number = gtk_tree_path_get_indices(path); |
496 |
> |
|
497 |
> |
data->insert = *number + 1; |
498 |
> |
} |
499 |
> |
|
500 |
> |
GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(data->selected) |
501 |
> |
); |
502 |
> |
GtkTreeIter itor; |
503 |
> |
char* down; |
504 |
> |
|
505 |
> |
gtk_tree_model_get_iter(store, &itor, path); |
506 |
> |
gtk_tree_model_get(store, &itor, 0, &down, -1); |
507 |
> |
gtk_list_store_remove(GTK_LIST_STORE(store), &itor); |
508 |
> |
gtk_list_store_insert(GTK_LIST_STORE(store), &itor, data->insert--); |
509 |
> |
gtk_list_store_set(GTK_LIST_STORE(store), &itor, 0, down, -1); |
510 |
> |
|
511 |
> |
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( |
512 |
> |
data->selected)); |
513 |
> |
|
514 |
> |
gtk_tree_selection_select_iter(selection, &itor); |
515 |
> |
g_free(down); |
516 |
|
} |
517 |
|
|
518 |
|
#endif |