root / branches / simulator / projects / simulator / simulator / gui / gtk_gui.c @ 1078
History | View | Annotate | Download (3.27 KB)
1 | 962 | bcoltin | #include <stdlib.h> |
---|---|---|---|
2 | #include <gtk/gtk.h> |
||
3 | #include <glib.h> |
||
4 | |||
5 | #include "gtk_gui.h" |
||
6 | 971 | bcoltin | #include "gtk_environment_view.h" |
7 | 962 | bcoltin | |
8 | 1074 | bcoltin | #include "robot.h" |
9 | |||
10 | #define NEW_ROBOT 1 |
||
11 | #define PAUSE 2 |
||
12 | #define RESUME 3 |
||
13 | |||
14 | 1006 | bcoltin | GtkWidget* window; |
15 | 1065 | bcoltin | GtkWidget* view = NULL;
|
16 | 1006 | bcoltin | |
17 | 1078 | bcoltin | int robots_paused = 0; |
18 | |||
19 | 962 | bcoltin | void destroy_callback(int arg) |
20 | { |
||
21 | 1074 | bcoltin | robots_cleanup(); |
22 | 962 | bcoltin | gtk_main_quit(); |
23 | } |
||
24 | |||
25 | 1074 | bcoltin | void make_new_robot(void) |
26 | { |
||
27 | GtkWidget *dialog; |
||
28 | |||
29 | gdk_threads_leave(); |
||
30 | robots_pause(); |
||
31 | gdk_threads_enter(); |
||
32 | |||
33 | dialog = gtk_file_chooser_dialog_new ("Open File",
|
||
34 | GTK_WINDOW(window), |
||
35 | GTK_FILE_CHOOSER_ACTION_OPEN, |
||
36 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
||
37 | GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, |
||
38 | NULL);
|
||
39 | |||
40 | if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
|
||
41 | { |
||
42 | char *filename;
|
||
43 | filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); |
||
44 | robot_create(filename); |
||
45 | g_free (filename); |
||
46 | } |
||
47 | gtk_widget_destroy (dialog); |
||
48 | |||
49 | gdk_threads_leave(); |
||
50 | robots_resume(); |
||
51 | gdk_threads_enter(); |
||
52 | } |
||
53 | |||
54 | static gboolean menuhandler(int type) |
||
55 | { |
||
56 | switch (type)
|
||
57 | { |
||
58 | case NEW_ROBOT:
|
||
59 | make_new_robot(); |
||
60 | break;
|
||
61 | case PAUSE:
|
||
62 | gdk_threads_leave(); |
||
63 | 1078 | bcoltin | if (robots_paused)
|
64 | robots_resume(); |
||
65 | else
|
||
66 | robots_pause(); |
||
67 | robots_paused = !robots_paused; |
||
68 | 1074 | bcoltin | gdk_threads_enter(); |
69 | break;
|
||
70 | case RESUME:
|
||
71 | gdk_threads_leave(); |
||
72 | robots_resume(); |
||
73 | gdk_threads_enter(); |
||
74 | break;
|
||
75 | } |
||
76 | |||
77 | return TRUE;
|
||
78 | } |
||
79 | |||
80 | GtkWidget* make_menu_bar(GtkWidget* window, GtkWidget* other) |
||
81 | { |
||
82 | GtkWidget* menu_bar; |
||
83 | GtkWidget* file_item; |
||
84 | GtkWidget* file_menu; |
||
85 | GtkWidget* menu_item; |
||
86 | GtkWidget* vbox; |
||
87 | |||
88 | file_menu = gtk_menu_new(); |
||
89 | gtk_widget_show(file_menu); |
||
90 | |||
91 | menu_item = gtk_menu_item_new_with_label("New Robot");
|
||
92 | gtk_widget_show(menu_item); |
||
93 | gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), menu_item); |
||
94 | g_signal_connect_swapped(G_OBJECT(menu_item), "activate",
|
||
95 | G_CALLBACK(menuhandler), (gint*)NEW_ROBOT); |
||
96 | |||
97 | 1078 | bcoltin | menu_item = gtk_check_menu_item_new_with_label("Paused");
|
98 | gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), 0);
|
||
99 | 1074 | bcoltin | gtk_widget_show(menu_item); |
100 | gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), menu_item); |
||
101 | g_signal_connect_swapped(G_OBJECT(menu_item), "activate",
|
||
102 | G_CALLBACK(menuhandler), (gint*)PAUSE); |
||
103 | |||
104 | file_item = gtk_menu_item_new_with_label("File");
|
||
105 | gtk_widget_show(file_item); |
||
106 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_menu); |
||
107 | menu_bar = gtk_menu_bar_new(); |
||
108 | |||
109 | vbox = gtk_vbox_new (FALSE, 0);
|
||
110 | gtk_container_add (GTK_CONTAINER (window), vbox); |
||
111 | gtk_widget_show (vbox); |
||
112 | gtk_box_pack_start (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 2);
|
||
113 | gtk_widget_show(menu_bar); |
||
114 | |||
115 | gtk_box_pack_end (GTK_BOX (vbox), other, TRUE, TRUE, 2);
|
||
116 | gtk_widget_show(other); |
||
117 | |||
118 | gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), file_item); |
||
119 | |||
120 | return menu_bar;
|
||
121 | } |
||
122 | |||
123 | 971 | bcoltin | int gtk_gui_run(int argc, char** argv) |
124 | 962 | bcoltin | { |
125 | gdk_threads_init(); |
||
126 | gdk_threads_enter(); |
||
127 | gtk_init(&argc, &argv); |
||
128 | |||
129 | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
||
130 | gtk_window_set_title(GTK_WINDOW(window), "Colony Simulator");
|
||
131 | gtk_window_maximize(GTK_WINDOW(window)); |
||
132 | 1074 | bcoltin | gtk_container_set_border_width(GTK_CONTAINER(window), 0);
|
133 | 962 | bcoltin | g_signal_connect(G_OBJECT(window), "destroy",
|
134 | G_CALLBACK(destroy_callback), NULL);
|
||
135 | |||
136 | view = gtk_environment_view_new(); |
||
137 | |||
138 | 1074 | bcoltin | make_menu_bar(window, view); |
139 | 962 | bcoltin | gtk_widget_show(window); |
140 | |||
141 | gtk_main(); |
||
142 | gdk_threads_leave(); |
||
143 | |||
144 | return 0; |
||
145 | } |
||
146 | |||
147 | 1006 | bcoltin | void gui_refresh()
|
148 | { |
||
149 | 1065 | bcoltin | if (view == NULL) |
150 | return;
|
||
151 | 1006 | bcoltin | gtk_environment_view_refresh(view); |
152 | } |