1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <gtk/gtk.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #include "callbacks.h"
10 #include "interface.h"
11 #include "support.h"
12 #include "parser.h"
13 #include "misc.h"
14
15 extern GtkWidget *window;
16
17 extern List *unitlib[2][CLASS_COUNT];
18 extern List *trplib[2];
19 extern List *reinf[2][SCEN_COUNT];
20 extern int cur_scen, cur_player, cur_class, cur_unit, cur_trp;
21 extern int cur_pin, cur_reinf;
22 extern char *unit_classes[];
23 extern char *scenarios[];
24
25 void
on_file_activate(GtkMenuItem * menuitem,gpointer user_data)26 on_file_activate (GtkMenuItem *menuitem,
27 gpointer user_data)
28 {
29
30 }
31
32
33 void
on_load_activate(GtkMenuItem * menuitem,gpointer user_data)34 on_load_activate (GtkMenuItem *menuitem,
35 gpointer user_data)
36 {
37 load_reinf();
38 }
39
40
41 void
on_save_activate(GtkMenuItem * menuitem,gpointer user_data)42 on_save_activate (GtkMenuItem *menuitem,
43 gpointer user_data)
44 {
45 save_reinf();
46 }
47
48
49 void
on_build_activate(GtkMenuItem * menuitem,gpointer user_data)50 on_build_activate (GtkMenuItem *menuitem,
51 gpointer user_data)
52 {
53 save_reinf();
54 build_reinf();
55 }
56
57
58 void
on_quit_activate(GtkMenuItem * menuitem,gpointer user_data)59 on_quit_activate (GtkMenuItem *menuitem,
60 gpointer user_data)
61 {
62 finalize();
63 gtk_exit( 0 );
64 }
65
66
67 void
on_scenarios_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)68 on_scenarios_select_row (GtkCList *clist,
69 gint row,
70 gint column,
71 GdkEvent *event,
72 gpointer user_data)
73 {
74 gchar aux[64];
75 GtkWidget *widget = lookup_widget( window, "add_label" );
76 if ( widget ) {
77 snprintf( aux, 64, "Add Unit For %s", scenarios[row] );
78 gtk_label_set_text( GTK_LABEL(widget), aux );
79 }
80 cur_scen = row; cur_reinf = -1;
81 update_reinf_list( cur_scen, cur_player );
82 }
83
84
85 void
on_players_changed(GtkEditable * editable,gpointer user_data)86 on_players_changed (GtkEditable *editable,
87 gpointer user_data)
88 {
89 gchar *text = gtk_editable_get_chars( editable, 0, -1 );
90 if ( STRCMP( text, "Axis" ) )
91 cur_player = AXIS;
92 else
93 cur_player = ALLIES;
94 cur_reinf = -1; cur_unit = -1; cur_trp = -1;
95 update_unit_list( cur_player, cur_class );
96 update_trp_list( cur_player );
97 update_reinf_list( cur_scen, cur_player );
98 g_free( text );
99 }
100
101
102 void
on_classes_changed(GtkEditable * editable,gpointer user_data)103 on_classes_changed (GtkEditable *editable,
104 gpointer user_data)
105 {
106 int i;
107 gchar *text = gtk_editable_get_chars( editable, 0, -1 );
108 for ( i = 0; i < CLASS_COUNT; i++ )
109 if ( STRCMP( text, unit_classes[i * 2 + 1] ) ) {
110 cur_class = i;
111 cur_unit = -1;
112 update_unit_list( cur_player, cur_class );
113 }
114 g_free( text );
115 }
116
117
118 void
on_units_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)119 on_units_select_row (GtkCList *clist,
120 gint row,
121 gint column,
122 GdkEvent *event,
123 gpointer user_data)
124 {
125 cur_unit = row;
126 }
127
128
129 void
on_transporters_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)130 on_transporters_select_row (GtkCList *clist,
131 gint row,
132 gint column,
133 GdkEvent *event,
134 gpointer user_data)
135 {
136 cur_trp = row;
137 }
138
139 void
on_add_clicked(GtkButton * button,gpointer user_data)140 on_add_clicked (GtkButton *button,
141 gpointer user_data)
142 {
143 GtkWidget *widget;
144 GtkEditable *editable;
145 gchar *text;
146 UnitLib_Entry *entry, *trp_entry = 0;
147 Unit *unit;
148 if ( cur_unit == -1 )
149 return;
150 unit = calloc( 1, sizeof( Unit ) );
151 if ( unit ) {
152 unit->delay = 1; unit->str = 10; unit->exp = 0;
153 /* pin */
154 unit->pin = cur_pin++;
155 /* id */
156 entry = list_get( unitlib[cur_player][cur_class], cur_unit );
157 unit->uid = entry->nid;
158 strcpy_lt( unit->id, entry->id, 7 );
159 /* trsp id */
160 if ( cur_trp > 0 ) {
161 trp_entry = list_get( trplib[cur_player], cur_trp );
162 unit->tid = trp_entry->nid;
163 strcpy_lt( unit->trp, trp_entry->id, 7 );
164 }
165 else {
166 unit->tid = -1;
167 strcpy( unit->trp, "none" );
168 }
169 /* delay */
170 if ( ( widget = lookup_widget( window, "delay" ) ) )
171 unit->delay = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( widget ) );
172 /* strength */
173 if ( ( widget = lookup_widget( window, "strength" ) ) ) {
174 editable = GTK_EDITABLE( GTK_COMBO(widget)->entry );
175 text = gtk_editable_get_chars( editable, 0, -1 );
176 unit->str = atoi( text );
177 g_free( text );
178 }
179 /* experience */
180 if ( ( widget = lookup_widget( window, "exp" ) ) ) {
181 editable = GTK_EDITABLE( GTK_COMBO(widget)->entry );
182 text = gtk_editable_get_chars( editable, 0, -1 );
183 unit->exp = atoi( text );
184 g_free( text );
185 }
186 /* nation (-1 == auto) */
187 unit->nation = -1;
188 /* build info string */
189 build_unit_info( unit, cur_player );
190 /* save list settings to restore from reinf list */
191 unit->class_id = cur_class;
192 unit->unit_id = cur_unit;
193 unit->trp_id = cur_trp;
194 /* add */
195 insert_reinf_unit( unit, cur_player, cur_scen );
196 update_reinf_list( cur_scen, cur_player );
197 }
198 }
199
200
201 void
on_remove_clicked(GtkButton * button,gpointer user_data)202 on_remove_clicked (GtkButton *button,
203 gpointer user_data)
204 {
205 if ( cur_reinf == -1 ) return;
206 list_delete_pos( reinf[cur_player][cur_scen], cur_reinf );
207 update_reinf_list( cur_scen, cur_player );
208 cur_reinf = -1;
209 }
210
211 void
on_reinforcements_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)212 on_reinforcements_select_row (GtkCList *clist,
213 gint row,
214 gint column,
215 GdkEvent *event,
216 gpointer user_data)
217 {
218 GtkWidget *widget;
219 Unit *unit;
220 int pin, i;
221 gchar *text, *hash;
222 gchar aux[16];
223 gtk_clist_get_text( clist, row, 0, &text );
224 hash = strrchr( text, '#' ); hash++;
225 pin = atoi( hash ); i = 0; cur_reinf = -1;
226 list_reset( reinf[cur_player][cur_scen] );
227 while ( ( unit = list_next( reinf[cur_player][cur_scen] ) ) ) {
228 if ( unit->pin == pin ) {
229 cur_reinf = i;
230 /* set unit class */
231 if ( ( widget = lookup_widget( window, "classes" ) ) ) {
232 cur_class = unit->class_id;
233 gtk_entry_set_text(
234 GTK_ENTRY( GTK_COMBO(widget)->entry ),
235 unit_classes[unit->class_id * 2 + 1] );
236 update_unit_list( cur_player, cur_class );
237 }
238 /* set unit type */
239 if ( ( widget = lookup_widget( window, "units" ) ) )
240 gtk_clist_select_row( GTK_CLIST(widget), unit->unit_id, 0 );
241 /* set transporter type */
242 if ( unit->trp_id == -1 ) unit->trp_id = 0;
243 if ( ( widget = lookup_widget( window, "transporters" ) ) )
244 gtk_clist_select_row( GTK_CLIST(widget), unit->trp_id, 0 );
245 /* set delay, strength ,experience */
246 if ( ( widget = lookup_widget( window, "delay" ) ) ) {
247 gtk_spin_button_set_value( GTK_SPIN_BUTTON(widget), unit->delay );
248 }
249 if ( ( widget = lookup_widget( window, "strength" ) ) ) {
250 sprintf( aux, "%i", unit->str );
251 gtk_entry_set_text(
252 GTK_ENTRY( GTK_COMBO(widget)->entry ), aux );
253 }
254 if ( ( widget = lookup_widget( window, "exp" ) ) ) {
255 sprintf( aux, "%i", unit->exp );
256 gtk_entry_set_text(
257 GTK_ENTRY( GTK_COMBO(widget)->entry ), aux );
258 }
259 break;
260 }
261 i++;
262 }
263 }
264
265 gboolean
on_reinforcements_key_press_event(GtkWidget * widget,GdkEventKey * event,gpointer user_data)266 on_reinforcements_key_press_event (GtkWidget *widget,
267 GdkEventKey *event,
268 gpointer user_data)
269 {
270 if ( cur_reinf == -1 ) return FALSE;
271 list_delete_pos( reinf[cur_player][cur_scen], cur_reinf );
272 update_reinf_list( cur_scen, cur_player );
273 cur_reinf = -1;
274 return FALSE;
275 }
276
277
278 void
on_replace_clicked(GtkButton * button,gpointer user_data)279 on_replace_clicked (GtkButton *button,
280 gpointer user_data)
281 {
282 if ( cur_reinf == -1 ) return;
283 list_delete_pos( reinf[cur_player][cur_scen], cur_reinf );
284 on_add_clicked( 0, 0 );
285 update_reinf_list( cur_scen, cur_player );
286 cur_reinf = -1;
287 }
288
289 void
on_window_destroy(GtkObject * object,gpointer user_data)290 on_window_destroy (GtkObject *object,
291 gpointer user_data)
292 {
293 finalize();
294 gtk_exit( 0 );
295 }
296