summaryrefslogtreecommitdiff
path: root/linux/dlgpiece.cpp
diff options
context:
space:
mode:
authorleo1999-12-20 21:43:00 +0000
committerleo1999-12-20 21:43:00 +0000
commit107039f1054fa8aa3c1be5af299ec1662d7b8333 (patch)
treec74bb69eea4d9b70e36e0c94869fd50ed00671c3 /linux/dlgpiece.cpp
parent03d1428a293c9abdddfed2d5faa1984901932384 (diff)
Finished the Minifig Wizard, it still needs some work but is 'usable'
git-svn-id: http://svn.leocad.org/trunk@38 c7d43263-9d01-0410-8a33-9dba5d9f93d6
Diffstat (limited to 'linux/dlgpiece.cpp')
-rwxr-xr-xlinux/dlgpiece.cpp232
1 files changed, 192 insertions, 40 deletions
diff --git a/linux/dlgpiece.cpp b/linux/dlgpiece.cpp
index 62d1ac1..778fcd0 100755
--- a/linux/dlgpiece.cpp
+++ b/linux/dlgpiece.cpp
@@ -13,6 +13,7 @@
#include <GL/glu.h>
#include <GL/glx.h>
#include <stdio.h>
+#include <string.h>
#include "gtkglarea.h"
#include "gtktools.h"
#include "system.h"
@@ -186,6 +187,143 @@ static gint minifigdlg_color_expose (GtkWidget *widget)
return TRUE;
}
+// New piece was selected
+static void minifigdlg_piece_selection (GtkWidget *widget)
+{
+ LC_MINIFIGDLG_STRUCT* info;
+ PieceInfo* piece_info;
+ int i, j;
+
+ gtk_widget_hide (widget);
+ if (GTK_WIDGET_HAS_GRAB (widget))
+ gtk_grab_remove (widget);
+ // gdk_pointer_ungrab (0);
+
+ info = (LC_MINIFIGDLG_STRUCT*)gtk_object_get_data (GTK_OBJECT (widget), "info");
+ if (info == NULL)
+ return;
+
+ // TODO: rewrite !!!
+ for (i = 0; i < 15; i++)
+ if (GTK_COMBO (info->pieces[i])->popwin == widget)
+ {
+ char* desc = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (info->pieces[i])->entry));
+
+ for (j = 0; j < MFW_PIECES; j++)
+ {
+ piece_info = project->FindPieceInfo(mfwpieceinfo[j].name);
+ if (piece_info == NULL)
+ continue;
+
+ if (strcmp (desc, mfwpieceinfo[j].description) == 0)
+ {
+ if (info->opts->info[i])
+ info->opts->info[i]->DeRef();
+ info->opts->info[i] = piece_info;
+ piece_info->AddRef();
+ break;
+ }
+ }
+
+ if (j == MFW_PIECES)
+ {
+ if (info->opts->info[i])
+ info->opts->info[i]->DeRef();
+ info->opts->info[i] = NULL;
+ break;
+ }
+
+ // Get the pieces in the right place
+ if (i == MFW_NECK)
+ {
+ if (info->opts->info[3] != NULL)
+ {
+ info->opts->pos[0][2] = 3.92f;
+ info->opts->pos[1][2] = 3.92f;
+ }
+ else
+ {
+ info->opts->pos[0][2] = 3.84f;
+ info->opts->pos[1][2] = 3.84f;
+ }
+ }
+
+ if (i == MFW_LEFT_SHOE)
+ {
+ if (strcmp (desc, "Ski"))
+ info->opts->pos[13][1] = 0;
+ else
+ info->opts->pos[13][1] = -0.12f;
+ }
+
+ if (i == MFW_RIGHT_SHOE)
+ {
+ if (strcmp (desc, "Ski"))
+ info->opts->pos[14][1] = 0;
+ else
+ info->opts->pos[14][1] = -0.12f;
+ }
+
+ if ((i == MFW_LEFT_TOOL) || (i == MFW_RIGHT_TOOL))
+ if (strcmp(desc, "None") != 0)
+ {
+ float rx = 45, ry = 0, rz = 0, x = 0.92f, y = -0.62f, z = 1.76f;
+
+ if (strcmp (piece_info->m_strName,"4529") == 0)
+ { rx = -45; y = -1.14f; z = 2.36f; }
+ if (strcmp (piece_info->m_strName,"3899") == 0)
+ { y = -1.64f; z = 1.38f; }
+ if (strcmp (piece_info->m_strName,"4528") == 0)
+ { rx = -45; y = -1.26f; z = 2.36f; }
+ if (strcmp (piece_info->m_strName,"4479") == 0)
+ { rz = 90; y = -1.22f; z = 2.44f; }
+ if (strcmp (piece_info->m_strName,"3962") == 0)
+ { rz = 90; y = -0.7f; z = 1.62f; }
+ if (strcmp (piece_info->m_strName,"4360") == 0)
+ { rz = -90; y = -1.22f; z = 2.44f; }
+ if (strncmp (piece_info->m_strName,"6246",4) == 0)
+ { y = -1.82f; z = 2.72f; rz = 90; }
+ if (strcmp (piece_info->m_strName,"4349") == 0)
+ { y = -1.16f; z = 2.0f; }
+ if (strcmp (piece_info->m_strName,"4479") == 0)
+ { y = -1.42f; z = 2.26f; }
+ if (strcmp (piece_info->m_strName,"3959") == 0)
+ { y = -1.0f; z = 1.88f; }
+ if (strcmp (piece_info->m_strName,"4522") == 0)
+ { y = -1.64f; z = 2.48f; }
+ if (strcmp (piece_info->m_strName,"194") == 0)
+ { rz = 180; y = -1.04f; z = 1.94f; }
+ if (strcmp (piece_info->m_strName,"4006") == 0)
+ { rz = 180; y = -1.24f; z = 2.18f; }
+ if (strcmp (piece_info->m_strName,"6246C") == 0)
+ { rx = 35; rz = 0; y = -2.36f; z = 1.08f; }
+ if (strcmp (piece_info->m_strName,"4497") == 0)
+ { y = -2.16f; z = 3.08f; rz = 90; }
+ if (strcmp (piece_info->m_strName,"30092") == 0)
+ { x = 0; rz = 180; }
+ if (strcmp (piece_info->m_strName,"37") == 0)
+ { z = 1.52f; y = -0.64f; }
+ if (strcmp (piece_info->m_strName,"38") == 0)
+ { z = 1.24f; y = -0.34f; }
+ if (strcmp (piece_info->m_strName,"3841") == 0)
+ { z = 2.24f; y = -1.34f; rz = 180; }
+
+ if (i == MFW_RIGHT_TOOL)
+ x = -x;
+
+ info->opts->pos[i][0] = x;
+ info->opts->pos[i][1] = y;
+ info->opts->pos[i][2] = z;
+ info->opts->rot[i][0] = rx;
+ info->opts->rot[i][1] = ry;
+ info->opts->rot[i][2] = rz;
+ }
+ break;
+ }
+ gtk_widget_draw (info->preview, NULL);
+}
+
+
// Create a combo box with a color selection control
static void minifigdlg_createpair (LC_MINIFIGDLG_STRUCT* info, int num, GtkWidget* vbox)
{
@@ -200,6 +338,9 @@ static void minifigdlg_createpair (LC_MINIFIGDLG_STRUCT* info, int num, GtkWidge
gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0);
gtk_widget_set_usize (combo, 60, 25);
gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
+ gtk_signal_connect (GTK_OBJECT (GTK_COMBO (combo)->popwin), "button_press_event",
+ GTK_SIGNAL_FUNC (minifigdlg_piece_selection), NULL);
+ gtk_object_set_data (GTK_OBJECT (GTK_COMBO (combo)->popwin), "info", info);
color = info->colors[num] = gtk_button_new_with_label ("");
gtk_widget_set_events (color, GDK_EXPOSURE_MASK);
@@ -214,6 +355,12 @@ static void minifigdlg_createpair (LC_MINIFIGDLG_STRUCT* info, int num, GtkWidge
gtk_box_pack_start (GTK_BOX (hbox), color, FALSE, TRUE, 0);
}
+// sort the names from the combo boxes
+static gint minifigdlg_compare (gconstpointer a, gconstpointer b)
+{
+ return strcmp ((const char*)a, (const char*)b);
+}
+
int minifigdlg_execute(void* param)
{
int attrlist[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 16, 0 };
@@ -309,55 +456,60 @@ int minifigdlg_execute(void* param)
GDK_Escape, 0, GTK_ACCEL_VISIBLE);
// Fill the combo boxes with the available pieces
+ GList* names[15];
+ for (i = 0; i < 15; i++)
+ names[i] = NULL;
+
for (i = 0; i < MFW_PIECES; i++)
{
- PieceInfo* piece_info = project->FindPieceInfo(mfwpieceinfo[i].name);
+ PieceInfo* piece_info;
+ int id;
- if (piece_info != NULL)
- {
- GtkWidget *list, *item;
- int id;
+ piece_info = project->FindPieceInfo(mfwpieceinfo[i].name);
+ if (piece_info == NULL)
+ continue;
- switch (mfwpieceinfo[i].type)
- {
- case MF_HAT: id = MFW_HAT; break;
- case MF_HEAD: id = MFW_HEAD; break;
- case MF_TORSO: id = MFW_TORSO; break;
- case MF_NECK: id = MFW_NECK; break;
- case MF_ARML: id = MFW_LEFT_ARM; break;
- case MF_ARMR: id = MFW_RIGHT_ARM; break;
- case MF_HAND: id = MFW_LEFT_HAND; break;
- case MF_TOOL: id = MFW_LEFT_TOOL; break;
- case MF_HIPS: id = MFW_HIPS; break;
- case MF_LEGL: id = MFW_LEFT_LEG; break;
- case MF_LEGR: id = MFW_RIGHT_LEG; break;
- case MF_SHOE: id = MFW_LEFT_SHOE; break;
- default:
- continue;
- }
+ switch (mfwpieceinfo[i].type)
+ {
+ case MF_HAT: id = MFW_HAT; break;
+ case MF_HEAD: id = MFW_HEAD; break;
+ case MF_TORSO: id = MFW_TORSO; break;
+ case MF_NECK: id = MFW_NECK; break;
+ case MF_ARML: id = MFW_LEFT_ARM; break;
+ case MF_ARMR: id = MFW_RIGHT_ARM; break;
+ case MF_HAND: id = MFW_LEFT_HAND; break;
+ case MF_TOOL: id = MFW_LEFT_TOOL; break;
+ case MF_HIPS: id = MFW_HIPS; break;
+ case MF_LEGL: id = MFW_LEFT_LEG; break;
+ case MF_LEGR: id = MFW_RIGHT_LEG; break;
+ case MF_SHOE: id = MFW_LEFT_SHOE; break;
+ default:
+ continue;
+ }
- if (i != 29)
- {
- list = GTK_COMBO (s.pieces[id])->list;
- item = gtk_list_item_new_with_label(mfwpieceinfo[i].description);
- gtk_object_set_data (GTK_OBJECT (item), "pieceinfo", piece_info);
- gtk_widget_show(item);
- gtk_container_add (GTK_CONTAINER(list), item);
- }
+ if (i != 29)
+ names[id] = g_list_insert_sorted (names[id], mfwpieceinfo[i].description, minifigdlg_compare);
- if (id == MFW_LEFT_HAND || id == MFW_LEFT_TOOL || id == MFW_LEFT_SHOE)
- {
- list = GTK_COMBO (s.pieces[id+1])->list;
- item = gtk_list_item_new_with_label(mfwpieceinfo[i].description);
- gtk_object_set_data (GTK_OBJECT (item), "pieceinfo", piece_info);
- gtk_widget_show(item);
- gtk_container_add (GTK_CONTAINER(list), item);
- }
+ if (id == MFW_LEFT_HAND || id == MFW_LEFT_TOOL || id == MFW_LEFT_SHOE)
+ names[id+1] = g_list_insert_sorted (names[id+1], mfwpieceinfo[i].description, minifigdlg_compare);
- if (i == 6) i++;
- }
+ if (i == 6) i++;
}
+ names[MFW_HAT] = g_list_prepend (names[MFW_HAT], "None");
+ names[MFW_NECK] = g_list_prepend (names[MFW_NECK], "None");
+ names[MFW_LEFT_TOOL] = g_list_prepend (names[MFW_LEFT_TOOL], "None");
+ names[MFW_RIGHT_TOOL] = g_list_prepend (names[MFW_RIGHT_TOOL], "None");
+ names[MFW_LEFT_SHOE] = g_list_prepend (names[MFW_LEFT_SHOE], "None");
+ names[MFW_RIGHT_SHOE] = g_list_prepend (names[MFW_RIGHT_SHOE], "None");
+
+ for (i = 0; i < 15; i++)
+ gtk_combo_set_popdown_strings ( GTK_COMBO (s.pieces[i]), names[i]);
+
+ gtk_list_select_item ( GTK_LIST (GTK_COMBO (s.pieces[MFW_HAT])->list), 6);
+ gtk_list_select_item ( GTK_LIST (GTK_COMBO (s.pieces[MFW_HEAD])->list), 4);
+ gtk_list_select_item ( GTK_LIST (GTK_COMBO (s.pieces[MFW_TORSO])->list), 16);
+
return dlg_domodal(dlg, LC_CANCEL);
}