root / branches / simulator / projects / simulator / simulator / gui / gtk_gui.c @ 1082
History | View | Annotate | Download (3.49 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 | 1082 | bcoltin | #define NEW_ROBOT 1 |
11 | #define PAUSE 2 |
||
12 | #define QUIT 3 |
||
13 | 1074 | bcoltin | |
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 | 1082 | bcoltin | if (!robots_paused)
|
50 | { |
||
51 | gdk_threads_leave(); |
||
52 | robots_resume(); |
||
53 | gdk_threads_enter(); |
||
54 | } |
||
55 | 1074 | bcoltin | } |
56 | |||
57 | static gboolean menuhandler(int type) |
||
58 | { |
||
59 | switch (type)
|
||
60 | { |
||
61 | case NEW_ROBOT:
|
||
62 | make_new_robot(); |
||
63 | break;
|
||
64 | case PAUSE:
|
||
65 | gdk_threads_leave(); |
||
66 | 1078 | bcoltin | if (robots_paused)
|
67 | robots_resume(); |
||
68 | else
|
||
69 | robots_pause(); |
||
70 | robots_paused = !robots_paused; |
||
71 | 1074 | bcoltin | gdk_threads_enter(); |
72 | break;
|
||
73 | 1082 | bcoltin | case QUIT:
|
74 | destroy_callback(0);
|
||
75 | 1074 | bcoltin | break;
|
76 | } |
||
77 | |||
78 | return TRUE;
|
||
79 | } |
||
80 | |||
81 | GtkWidget* make_menu_bar(GtkWidget* window, GtkWidget* other) |
||
82 | { |
||
83 | GtkWidget* menu_bar; |
||
84 | GtkWidget* file_item; |
||
85 | GtkWidget* file_menu; |
||
86 | GtkWidget* menu_item; |
||
87 | GtkWidget* vbox; |
||
88 | |||
89 | file_menu = gtk_menu_new(); |
||
90 | gtk_widget_show(file_menu); |
||
91 | |||
92 | menu_item = gtk_menu_item_new_with_label("New Robot");
|
||
93 | gtk_widget_show(menu_item); |
||
94 | gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), menu_item); |
||
95 | g_signal_connect_swapped(G_OBJECT(menu_item), "activate",
|
||
96 | G_CALLBACK(menuhandler), (gint*)NEW_ROBOT); |
||
97 | |||
98 | 1078 | bcoltin | menu_item = gtk_check_menu_item_new_with_label("Paused");
|
99 | gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), 0);
|
||
100 | 1074 | bcoltin | gtk_widget_show(menu_item); |
101 | gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), menu_item); |
||
102 | g_signal_connect_swapped(G_OBJECT(menu_item), "activate",
|
||
103 | G_CALLBACK(menuhandler), (gint*)PAUSE); |
||
104 | |||
105 | 1082 | bcoltin | menu_item = gtk_menu_item_new_with_label("Quit");
|
106 | gtk_widget_show(menu_item); |
||
107 | gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), menu_item); |
||
108 | g_signal_connect_swapped(G_OBJECT(menu_item), "activate",
|
||
109 | G_CALLBACK(menuhandler), (gint*)QUIT); |
||
110 | |||
111 | 1074 | bcoltin | file_item = gtk_menu_item_new_with_label("File");
|
112 | gtk_widget_show(file_item); |
||
113 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_menu); |
||
114 | menu_bar = gtk_menu_bar_new(); |
||
115 | |||
116 | vbox = gtk_vbox_new (FALSE, 0);
|
||
117 | gtk_container_add (GTK_CONTAINER (window), vbox); |
||
118 | gtk_widget_show (vbox); |
||
119 | gtk_box_pack_start (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 2);
|
||
120 | gtk_widget_show(menu_bar); |
||
121 | |||
122 | gtk_box_pack_end (GTK_BOX (vbox), other, TRUE, TRUE, 2);
|
||
123 | gtk_widget_show(other); |
||
124 | |||
125 | gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), file_item); |
||
126 | |||
127 | return menu_bar;
|
||
128 | } |
||
129 | |||
130 | 971 | bcoltin | int gtk_gui_run(int argc, char** argv) |
131 | 962 | bcoltin | { |
132 | gdk_threads_init(); |
||
133 | gdk_threads_enter(); |
||
134 | gtk_init(&argc, &argv); |
||
135 | |||
136 | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
||
137 | gtk_window_set_title(GTK_WINDOW(window), "Colony Simulator");
|
||
138 | gtk_window_maximize(GTK_WINDOW(window)); |
||
139 | 1074 | bcoltin | gtk_container_set_border_width(GTK_CONTAINER(window), 0);
|
140 | 962 | bcoltin | g_signal_connect(G_OBJECT(window), "destroy",
|
141 | G_CALLBACK(destroy_callback), NULL);
|
||
142 | |||
143 | view = gtk_environment_view_new(); |
||
144 | |||
145 | 1074 | bcoltin | make_menu_bar(window, view); |
146 | 962 | bcoltin | gtk_widget_show(window); |
147 | |||
148 | gtk_main(); |
||
149 | gdk_threads_leave(); |
||
150 | |||
151 | return 0; |
||
152 | } |
||
153 | |||
154 | 1006 | bcoltin | void gui_refresh()
|
155 | { |
||
156 | 1065 | bcoltin | if (view == NULL) |
157 | return;
|
||
158 | 1006 | bcoltin | gtk_environment_view_refresh(view); |
159 | } |