From 107039f1054fa8aa3c1be5af299ec1662d7b8333 Mon Sep 17 00:00:00 2001 From: leo Date: Mon, 20 Dec 1999 21:43:00 +0000 Subject: 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 --- linux/dlgpiece.cpp | 232 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 192 insertions(+), 40 deletions(-) (limited to 'linux/dlgpiece.cpp') 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 #include #include +#include #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); } -- cgit v1.2.3