root / trunk / linux / dlgpiece.cpp

Revision 725, 14.0 kB (checked in by leo, 6 months ago)

Linux compile fixes.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1//
2// This file holds all the dialogs that are called
3// from the 'Pieces' submenu:
4//
5// - Group Name
6// - Edit Groups
7// - Minifig Wizard
8//
9
10#include <gtk/gtk.h>
11#include <gdk/gdkkeysyms.h>
12#include <stdio.h>
13#include <string.h>
14#include <stdlib.h>
15#include "opengl.h"
16#include "gtktools.h"
17#include "system.h"
18#include "typedefs.h"
19#include "globals.h"
20#include "dialogs.h"
21#include "pieceinf.h"
22#include "main.h"
23#include "minifig.h"
24#include "lc_colors.h"
25
26// =========================================================
27// Minifig Wizard
28
29typedef struct
30{
31  MinifigWizard* wizard;
32  GtkWidget *pieces[LC_MFW_NUMITEMS];
33  GtkWidget *colors[LC_MFW_NUMITEMS];
34  GtkWidget *angles[LC_MFW_NUMITEMS];
35  GList *infos[LC_MFW_NUMITEMS];
36  GtkWidget *preview;
37  GtkWidget *combo;
38} LC_MINIFIGDLG_STRUCT;
39
40// User wants to add the minifig to the project
41static void minifigdlg_ok(GtkWidget *widget, gpointer data)
42{
43  //  LC_MINIFIGDLG_STRUCT* s = (LC_MINIFIGDLG_STRUCT*)data;
44  //  LC_MINIFIGDLG_OPTS* opts = (LC_MINIFIGDLG_OPTS*)s->data;
45
46  dlg_end (LC_OK);
47}
48
49// A new color was selected from the menu
50static void minifigdlg_color_response (GtkWidget *widget, gpointer data)
51{
52  LC_MINIFIGDLG_STRUCT* info;
53  GtkWidget* button;
54  int i;
55
56  button = (GtkWidget*)gtk_object_get_data (GTK_OBJECT (widget), "button");
57  info = (LC_MINIFIGDLG_STRUCT*)gtk_object_get_data (GTK_OBJECT (button), "info");
58
59  if (!info)
60    return;
61
62  for (i = 0; i < 15; i++)
63    if (info->colors[i] == button)
64      break;
65
66  info->wizard->ChangeColor (i, GPOINTER_TO_INT (data));
67  info->wizard->Redraw ();
68  set_button_pixmap2 (button, lcColorList[GPOINTER_TO_INT(data)].Value);
69}
70
71// A color button was clicked
72static void minifigdlg_color_clicked (GtkWidget *widget, gpointer data)
73{
74  int i;
75  GtkWidget *menu, *menuitem;
76
77  menu = gtk_menu_new ();
78
79  for (i = 0; i < lcNumUserColors; i++)
80  {
81    menuitem = gtk_menu_item_new_with_label (lcColorList[i].Name);
82    gtk_widget_show (menuitem);
83    gtk_menu_append (GTK_MENU (menu), menuitem);
84
85    gtk_object_set_data (GTK_OBJECT (menuitem), "button", widget);
86    gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
87            GTK_SIGNAL_FUNC (minifigdlg_color_response), (void*)i);
88  }
89
90  gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, 0);
91}
92
93// New piece was selected
94static void minifigdlg_piece_changed (GtkWidget *widget, gpointer data)
95{
96  LC_MINIFIGDLG_STRUCT* info;
97  int i, piece_type = 0;
98  const gchar* desc;
99
100  info = (LC_MINIFIGDLG_STRUCT*)gtk_object_get_data (GTK_OBJECT (widget), "info");
101  if (info == NULL)
102    return;
103
104  for (i = 0; i < LC_MFW_NUMITEMS; i++)
105    if (GTK_COMBO (info->pieces[i])->entry == widget)
106    {
107      piece_type = i;
108      break;
109    }
110
111  desc = gtk_entry_get_text(GTK_ENTRY(widget));
112
113  GList* list = info->infos[piece_type];
114  LC_MFW_PIECEINFO* pieceinfo = NULL;
115
116  if (!desc || !strlen(desc))
117    return;
118
119  while (list)
120  {
121    LC_MFW_PIECEINFO* l = (LC_MFW_PIECEINFO*)list->data;
122
123    if (l && !strcmp(l->description, desc))
124    {
125      pieceinfo = l;
126      break;
127    }
128    list = g_list_next(list);
129  }
130
131  info->wizard->ChangePiece (i, pieceinfo);
132  info->wizard->Redraw ();
133}
134
135static void minifigdlg_updatecombo (LC_MINIFIGDLG_STRUCT* s)
136{
137  char **names;
138  int count;
139  GList *lst = NULL;
140
141  s->wizard->GetMinifigNames (&names, &count);
142  for (int i = 0; i < count; i++)
143    lst = g_list_append (lst, names[i]);
144
145  if (lst == NULL)
146    lst = g_list_append (lst, (void*)"");
147
148  gtk_combo_set_popdown_strings (GTK_COMBO (s->combo), lst);
149  g_list_free (lst);
150}
151
152static void minifigdlg_updateselection (LC_MINIFIGDLG_STRUCT* s)
153{
154  const char* names[LC_MFW_NUMITEMS];
155  s->wizard->GetSelections(names);
156
157  for (int i = 0; i < LC_MFW_NUMITEMS; i++)
158  {
159    GtkList *list = GTK_LIST (GTK_COMBO (s->pieces[i])->list);
160    GtkWidget *child;
161    GList *children;
162    gchar* str;
163    int index = 0;
164
165    children = list->children;
166    while (children)
167    {
168      child = (GtkWidget*)children->data;
169      children = children->next;
170
171      gtk_label_get (GTK_LABEL (GTK_BIN (child)->child), &str);
172      if (strcmp (str, names[i]) == 0)
173      {
174    gtk_signal_handler_block_by_func (GTK_OBJECT (GTK_COMBO (s->pieces[i])->entry),
175                      GTK_SIGNAL_FUNC (minifigdlg_piece_changed), NULL);
176    gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (s->pieces[i])->entry), names[i]);
177    gtk_list_select_item (GTK_LIST (GTK_COMBO (s->pieces[i])->list), index);
178    gtk_signal_handler_unblock_by_func (GTK_OBJECT (GTK_COMBO (s->pieces[i])->entry),
179                        GTK_SIGNAL_FUNC (minifigdlg_piece_changed), NULL);
180      }
181      index++;
182    }
183  }
184}
185
186static void minifigdlg_load (GtkWidget *widget, gpointer data)
187{
188  LC_MINIFIGDLG_STRUCT* s = (LC_MINIFIGDLG_STRUCT*)data;
189  if (s->wizard->LoadMinifig (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (s->combo)->entry))) == false)
190    return;
191
192  for (int i = 0; i < LC_MFW_NUMITEMS; i++)
193  {
194    set_button_pixmap2 (s->colors[i], lcColorList[s->wizard->m_Colors[i]].Value);
195    if (s->angles[i] != NULL)
196      gtk_spin_button_set_value (GTK_SPIN_BUTTON (s->angles[i]), s->wizard->m_Angles[i]);
197  }
198  minifigdlg_updateselection (s);
199  s->wizard->Redraw ();
200}
201
202static void minifigdlg_save (GtkWidget *widget, gpointer data)
203{
204  LC_MINIFIGDLG_STRUCT* s = (LC_MINIFIGDLG_STRUCT*)data;
205  s->wizard->SaveMinifig (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (s->combo)->entry)));
206  minifigdlg_updatecombo (s);
207}
208
209static void minifigdlg_delete (GtkWidget *widget, gpointer data)
210{
211  LC_MINIFIGDLG_STRUCT* s = (LC_MINIFIGDLG_STRUCT*)data;
212  s->wizard->DeleteMinifig (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (s->combo)->entry)));
213  minifigdlg_updatecombo (s);
214}
215
216static void adj_changed (GtkAdjustment *adj, gpointer data)
217{
218  LC_MINIFIGDLG_STRUCT* info = (LC_MINIFIGDLG_STRUCT*)data;
219  float val;
220  int i;
221
222  for (i = 0; i < LC_MFW_NUMITEMS; i++)
223    if (info->angles[i] != NULL)
224      if (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (info->angles[i])) == adj)
225    break;
226
227  if (i == LC_MFW_NUMITEMS)
228    return;
229
230  val = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (info->angles[i]));
231
232  if (val == info->wizard->m_Angles[i])
233    return;
234
235  info->wizard->ChangeAngle (i, val);
236
237  if (info->preview != NULL)
238    info->wizard->Redraw ();
239}
240
241// Create a combo box with a color selection control
242static void minifigdlg_createpair (LC_MINIFIGDLG_STRUCT* info, int idx, int num, GtkWidget* table)
243{
244  GtkWidget *combo, *color, *spin;
245  GtkObject *adj;
246
247  combo = info->pieces[num] = gtk_combo_new ();
248  gtk_widget_show (combo);
249  gtk_table_attach (GTK_TABLE (table), combo, 0, 1, idx, idx+1,
250                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) GTK_EXPAND, 0, 0);
251  gtk_widget_set_usize (combo, 60, 25);
252  gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
253  gtk_signal_connect (GTK_OBJECT (GTK_COMBO (combo)->entry), "changed",
254                      GTK_SIGNAL_FUNC (minifigdlg_piece_changed), NULL);
255  gtk_object_set_data (GTK_OBJECT (GTK_COMBO (combo)->entry), "info", info);
256
257  color = info->colors[num] = gtk_button_new_with_label ("");
258  gtk_widget_set_events (color, GDK_EXPOSURE_MASK);
259  gtk_widget_show (color);
260  gtk_object_set_data (GTK_OBJECT (color), "color", &info->wizard->m_Colors[num]);
261  gtk_object_set_data (GTK_OBJECT (color), "info", info);
262  gtk_widget_set_usize (color, 40, 25);
263  gtk_signal_connect (GTK_OBJECT (color), "clicked",
264              GTK_SIGNAL_FUNC (minifigdlg_color_clicked), info);
265  gtk_table_attach (GTK_TABLE (table), color, 1, 2, idx, idx+1,
266                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) GTK_EXPAND, 0, 0);
267
268  if ((num == LC_MFW_TORSO) || (num == LC_MFW_HIPS))
269  {
270    info->angles[num] = NULL;
271    return;
272  }
273
274  adj = gtk_adjustment_new (0, -180, 180, 1, 10, 10);
275  gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (adj_changed), info);
276
277  spin = info->angles[num] = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
278  gtk_widget_show (spin);
279  gtk_object_set_data (GTK_OBJECT (color), "info", info);
280  //  gtk_widget_set_usize (spin, 40, -1);
281  gtk_table_attach (GTK_TABLE (table), spin, 2, 3, idx, idx+1,
282                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) GTK_EXPAND, 0, 0);
283  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spin), TRUE);
284}
285
286int minifigdlg_execute (void* param)
287{
288  GtkWidget *vbox, *hbox, *frame, *table;
289  GtkWidget *dlg, *button;
290  LC_MINIFIGDLG_STRUCT s;
291  int i;
292
293  memset (&s, 0, sizeof (s));
294  s.wizard = (MinifigWizard*)param;
295
296  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
297  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
298  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
299              GTK_SIGNAL_FUNC (dlg_delete_callback), NULL);
300  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
301              GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
302  gtk_widget_set_usize (dlg, 600, 360);
303  gtk_window_set_title (GTK_WINDOW (dlg), "Minifig Wizard");
304  //  gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
305  gtk_widget_realize (dlg);
306
307  vbox = gtk_vbox_new (FALSE, 10);
308  gtk_widget_show (vbox);
309  gtk_container_add (GTK_CONTAINER (dlg), vbox);
310  gtk_container_border_width (GTK_CONTAINER (vbox), 5);
311
312  hbox = gtk_hbox_new (FALSE, 5);
313  gtk_widget_show (hbox);
314  gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
315
316  table = gtk_table_new (8, 3, FALSE);
317  gtk_widget_show (table);
318  gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
319  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
320  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
321
322  minifigdlg_createpair (&s, 0, LC_MFW_HAT, table);
323  minifigdlg_createpair (&s, 1, LC_MFW_NECK, table);
324  minifigdlg_createpair (&s, 2, LC_MFW_RIGHT_ARM, table);
325  minifigdlg_createpair (&s, 3, LC_MFW_RIGHT_HAND, table);
326  minifigdlg_createpair (&s, 4, LC_MFW_RIGHT_TOOL, table);
327  minifigdlg_createpair (&s, 5, LC_MFW_HIPS, table);
328  minifigdlg_createpair (&s, 6, LC_MFW_RIGHT_LEG, table);
329  minifigdlg_createpair (&s, 7, LC_MFW_RIGHT_SHOE, table);
330
331  s.wizard->Create (&s.preview);
332
333  frame = gtk_frame_new (NULL);
334  gtk_widget_show (frame);
335  gtk_container_add (GTK_CONTAINER (hbox), frame);
336  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
337
338  gtk_widget_set_usize (GTK_WIDGET (s.preview), 150, 300);
339  gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (s.preview));
340  gtk_widget_show (GTK_WIDGET (s.preview));
341  gtk_object_set_data (GTK_OBJECT (s.preview), "minifig", &s);
342
343  table = gtk_table_new (7, 3, FALSE);
344  gtk_widget_show (table);
345  gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
346  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
347  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
348
349  minifigdlg_createpair (&s, 0, LC_MFW_HEAD, table);
350  minifigdlg_createpair (&s, 1, LC_MFW_TORSO, table);
351  minifigdlg_createpair (&s, 2, LC_MFW_LEFT_ARM, table);
352  minifigdlg_createpair (&s, 3, LC_MFW_LEFT_HAND, table);
353  minifigdlg_createpair (&s, 4, LC_MFW_LEFT_TOOL, table);
354  minifigdlg_createpair (&s, 5, LC_MFW_LEFT_LEG, table);
355  minifigdlg_createpair (&s, 6, LC_MFW_LEFT_SHOE, table);
356
357  hbox = gtk_hbox_new (FALSE, 10);
358  gtk_widget_show (hbox);
359  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
360  gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
361
362  s.combo = gtk_combo_new ();
363  gtk_widget_show (s.combo);
364  gtk_box_pack_start (GTK_BOX (hbox), s.combo, FALSE, TRUE, 0);
365  gtk_signal_connect (GTK_OBJECT (GTK_COMBO (s.combo)->entry), "changed",
366              GTK_SIGNAL_FUNC (minifigdlg_load), &s);
367
368  button = gtk_button_new_with_label ("Save");
369  gtk_signal_connect (GTK_OBJECT (button), "clicked",
370              GTK_SIGNAL_FUNC (minifigdlg_save), &s);
371  gtk_widget_show (button);
372  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
373  gtk_widget_set_usize (button, 70, 25);
374
375  button = gtk_button_new_with_label ("Delete");
376  gtk_signal_connect (GTK_OBJECT (button), "clicked",
377              GTK_SIGNAL_FUNC (minifigdlg_delete), &s);
378  gtk_widget_show (button);
379  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
380  gtk_widget_set_usize (button, 70, 25);
381
382  button = gtk_button_new_with_label ("OK");
383  gtk_signal_connect (GTK_OBJECT (button), "clicked",
384              GTK_SIGNAL_FUNC (minifigdlg_ok), &s);
385  gtk_widget_show (button);
386  gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0);
387  gtk_widget_set_usize (button, 70, 25);
388  GtkAccelGroup *accel_group = gtk_accel_group_new ();
389  gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
390  gtk_widget_add_accelerator (button, "clicked", accel_group,
391                              GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
392
393  button = gtk_button_new_with_label ("Cancel");
394  gtk_signal_connect (GTK_OBJECT (button), "clicked",
395              GTK_SIGNAL_FUNC (dlg_default_callback), GINT_TO_POINTER (LC_CANCEL));
396  gtk_widget_show (button);
397  gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0);
398  gtk_widget_set_usize (button, 70, 25);
399  gtk_widget_add_accelerator (button, "clicked", accel_group,
400                  GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
401
402  // Fill the combo boxes with the available pieces
403  for (i = 0; i < LC_MFW_NUMITEMS; i++)
404  {
405    GList* names = NULL;
406    int count;
407    LC_MFW_PIECEINFO **list;
408    s.wizard->GetItems(i, &list, &count);
409    s.infos[i] = NULL;
410
411    for (int j = 0; j < count; j++)
412    {
413      if (list[j])
414    s.infos[i] = g_list_append(s.infos[i], list[j]);
415
416      if (list[j])
417    names = g_list_append(names, list[j]->description);
418      else
419    names = g_list_append(names, (void*)"None");
420    }
421
422    if (names != NULL)
423    {
424      gtk_signal_handler_block_by_func(GTK_OBJECT(GTK_COMBO(s.pieces[i])->entry),
425                       GTK_SIGNAL_FUNC(minifigdlg_piece_changed), NULL);
426      gtk_combo_set_popdown_strings (GTK_COMBO (s.pieces[i]), names);
427      g_list_free (names);
428      gtk_signal_handler_unblock_by_func(GTK_OBJECT(GTK_COMBO(s.pieces[i])->entry),
429                     GTK_SIGNAL_FUNC(minifigdlg_piece_changed), NULL);
430    }
431    free (list);
432  }
433
434  minifigdlg_updatecombo (&s);
435  minifigdlg_updateselection (&s);
436
437  gtk_widget_show(dlg);
438
439  for (i = 0; i < LC_MFW_NUMITEMS; i++)
440    set_button_pixmap2(s.colors[i], lcColorList[s.wizard->m_Colors[i]].Value);
441
442  int ret = dlg_domodal(dlg, LC_CANCEL);
443
444  for (i = 0; i < LC_MFW_NUMITEMS; i++)
445    g_list_free(s.infos[i]);
446
447  return ret;
448}
Note: See TracBrowser for help on using the browser.