summaryrefslogtreecommitdiff
path: root/linux/dlgfile.cpp
diff options
context:
space:
mode:
authorleo2000-12-15 19:53:25 +0000
committerleo2000-12-15 19:53:25 +0000
commitd9bc55babd4e7fa69e46445d928c8c545376a3cf (patch)
tree83137853f2d32406d747c9dcacda514c3b08c078 /linux/dlgfile.cpp
parente18b2c83379ec9d7fafaad68f70b22542a685518 (diff)
Added preview to the project open dialog
git-svn-id: http://svn.leocad.org/trunk@174 c7d43263-9d01-0410-8a33-9dba5d9f93d6
Diffstat (limited to 'linux/dlgfile.cpp')
-rwxr-xr-xlinux/dlgfile.cpp331
1 files changed, 329 insertions, 2 deletions
diff --git a/linux/dlgfile.cpp b/linux/dlgfile.cpp
index 90d67ea..187634f 100755
--- a/linux/dlgfile.cpp
+++ b/linux/dlgfile.cpp
@@ -2,22 +2,349 @@
// This file holds all the dialogs that are called
// from the 'File' submenu:
//
+// - File Open Dialog
+// - File Save Dialog
+// - Save Picture Dialog
// - Piece Library Manager
//
#include <gtk/gtk.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include "system.h"
+#include "dialogs.h"
+#include "file.h"
+#include "image.h"
+#include "main.h"
-// =========================================================
-// Piece Library Manager
+// =============================================================================
+// Open Project Dialog
+
+static void openprojectdlg_select (GtkCList *clist, gint row, gint col, GdkEvent *event, GtkPreview *preview)
+{
+ GtkWidget *parent = gtk_widget_get_toplevel (GTK_WIDGET (clist));
+ char *filename, *p;
+ LC_IMAGE *image = NULL;
+
+ filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (parent));
+
+ p = strrchr (filename, '.');
+ if ((p != NULL) && (g_strcasecmp (p+1, "lcd") == 0))
+ {
+ float fv;
+ char id[32];
+ FileDisk file;
+ file.Open (filename, "rb");
+ file.Read (id, 32);
+ sscanf (strchr(id, ' '), "%f", &fv);
+
+ if (fv > 0.4f)
+ {
+ file.Read(&fv, 4);
+
+ if (fv > 0.7f)
+ {
+ unsigned long dwPosition;
+ file.Seek (-4, SEEK_END);
+ file.Read (&dwPosition, 4);
+ file.Seek (dwPosition, SEEK_SET);
+
+ if (dwPosition != 0)
+ {
+ if (fv < 1.0f)
+ {
+ file.Seek (54, SEEK_CUR);
+
+ image = (LC_IMAGE*)malloc (120 * 100 * 3 + sizeof (LC_IMAGE));
+ image->width = 120;
+ image->height = 100;
+ image->bits = (unsigned char*)image + sizeof (LC_IMAGE);
+
+ file.Read (image->bits, 36000);
+
+ for (int y = 0; y < 50; y++)
+ for (int x = 0; x < 120; x++)
+ {
+ unsigned char *from = (unsigned char*)image->bits + x*3 + y*360;
+ unsigned char *to = (unsigned char*)image->bits + x*3 + (100-y-1)*360;
+ unsigned char tmp[3] = { from[0], from[1], from[2] };
+
+ from[0] = to[2];
+ from[1] = to[1];
+ from[2] = to[0];
+ to[0] = tmp[2];
+ to[1] = tmp[1];
+ to[2] = tmp[0];
+ }
+ }
+ else
+ {
+ image = OpenImage (&file, LC_IMAGE_GIF);
+ }
+ }
+ }
+ }
+ file.Close();
+ }
+
+ if (image == NULL)
+ {
+ GtkWidget *w = GTK_WIDGET (preview);
+ guchar row[360];
+
+ for (int x = 0; x < 120; x++)
+ {
+ row[x*3] = w->style->bg[0].red/0xFF;
+ row[x*3+1] = w->style->bg[0].green/0xFF;
+ row[x*3+2] = w->style->bg[0].blue/0xFF;
+ }
+
+ for (int y = 0; y < 100; y++)
+ gtk_preview_draw_row (preview, row, 0, y, 120);
+ gtk_widget_draw (w, NULL);
+
+ }
+ else
+ {
+ for (int y = 0; y < 100; y++)
+ gtk_preview_draw_row (preview, ((unsigned char*)image->bits)+y*360, 0, y, 120);
+ gtk_widget_draw (GTK_WIDGET (preview), NULL);
+
+ free (image);
+ }
+}
+
+int openprojectdlg_execute (char* filename)
+{
+ GtkWidget *dlg, *preview, *vbox, *frame, *frame2, *hbox;
+ int ret = LC_CANCEL, loop = 1, len;
+
+ dlg = gtk_file_selection_new ("Open Project");
+ gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (main_window));
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->ok_button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_OK));
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->cancel_button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_object_set_data (GTK_OBJECT (dlg), "loop", &loop);
+ gtk_object_set_data (GTK_OBJECT (dlg), "ret", &ret);
+
+ // add preview support
+ hbox = GTK_FILE_SELECTION (dlg)->file_list->parent->parent;
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
+
+ frame = gtk_frame_new ("Preview");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, FALSE, 0);
+
+ frame2 = gtk_frame_new (NULL);
+ gtk_widget_show (frame2);
+ gtk_container_add (GTK_CONTAINER (frame), frame2);
+ gtk_container_border_width (GTK_CONTAINER (frame2), 5);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_NONE);
+
+ preview = gtk_preview_new (GTK_PREVIEW_COLOR);
+ gtk_container_add (GTK_CONTAINER (frame2), preview);
+ gtk_preview_size (GTK_PREVIEW (preview), 120, 100);
+ gtk_widget_show (preview);
+
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->file_list), "select_row",
+ GTK_SIGNAL_FUNC (openprojectdlg_select), preview);
+
+ len = strlen (filename);
+ if (len != 0)
+ {
+ if (filename[len-1] != '/')
+ strcat (filename, "/");
+ gtk_file_selection_set_filename (GTK_FILE_SELECTION (dlg), filename);
+ }
+
+ gtk_widget_show (dlg);
+ gtk_grab_add (dlg);
+ while (loop)
+ gtk_main_iteration ();
+ if (ret == LC_OK)
+ strcpy (filename, gtk_file_selection_get_filename (GTK_FILE_SELECTION (dlg)));
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+ return ret;
+}
+// =============================================================================
+// Save Project Dialog
+static void saveprojectdlg_preview (GtkToggleButton *button, gpointer data)
+{
+ Sys_ProfileSaveInt ("Default", "SavePreview", gtk_toggle_button_get_active (button));
+}
+// used by the save project and save picture dialogs
+static void savefiledlg_ok (GtkWidget *widget, gpointer data)
+{
+ GtkWidget *parent;
+ int *loop, *ret;
+ parent = gtk_widget_get_toplevel (widget);
+ loop = (int*)gtk_object_get_data (GTK_OBJECT (parent), "loop");
+ ret = (int*)gtk_object_get_data (GTK_OBJECT (parent), "ret");
+ if ((GPOINTER_TO_INT (data) == LC_OK) &&
+ (access (gtk_file_selection_get_filename (GTK_FILE_SELECTION (parent)), R_OK) == 0))
+ if (Sys_MessageBox ("File already exists, overwrite ?", "LeoCAD", LC_MB_YESNO) == LC_NO)
+ return;
+ *loop = 0;
+ *ret = GPOINTER_TO_INT (data);
+}
+int saveprojectdlg_execute (char* filename)
+{
+ GtkWidget *dlg, *check;
+ int ret = LC_CANCEL, loop = 1;
+
+ dlg = gtk_file_selection_new ("Save Project");
+ gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (main_window));
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->ok_button), "clicked",
+ GTK_SIGNAL_FUNC (savefiledlg_ok), GINT_TO_POINTER (LC_OK));
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->cancel_button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_object_set_data (GTK_OBJECT (dlg), "loop", &loop);
+ gtk_object_set_data (GTK_OBJECT (dlg), "ret", &ret);
+
+ // add preview checkbox
+ check = gtk_check_button_new_with_label ("Save Preview");
+ gtk_widget_show (check);
+ gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (dlg)->main_vbox), check, FALSE, FALSE, 0);
+
+ int i = Sys_ProfileLoadInt ("Default", "SavePreview", 0);
+ if (i != 0)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
+ gtk_signal_connect (GTK_OBJECT (check), "toggled", GTK_SIGNAL_FUNC (saveprojectdlg_preview), NULL);
+
+ gtk_file_selection_set_filename (GTK_FILE_SELECTION (dlg), filename);
+
+ gtk_widget_show (dlg);
+ gtk_grab_add (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == LC_OK)
+ strcpy (filename, gtk_file_selection_get_filename (GTK_FILE_SELECTION (dlg)));
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return ret;
+}
+
+// =============================================================================
+// Save Picture Dialog
+
+static void savepicturedlg_options (GtkWidget *widget, gpointer data)
+{
+ imageoptsdlg_execute (data, false);
+}
+
+int savepicturedlg_execute (void* param)
+{
+ GtkWidget *dlg, *button;
+ int ret = LC_CANCEL, loop = 1;
+
+ unsigned long image = Sys_ProfileLoadInt ("Default", "Image Options", 1|LC_IMAGE_TRANSPARENT);
+ LC_IMAGEDLG_OPTS* opts = (LC_IMAGEDLG_OPTS*)param;
+ opts->width = Sys_ProfileLoadInt ("Default", "Image Width", gdk_screen_width ());
+ opts->height = Sys_ProfileLoadInt ("Default", "Image Height", gdk_screen_height ());
+ opts->imopts.quality = Sys_ProfileLoadInt ("Default", "JPEG Quality", 70);
+ opts->imopts.interlaced = (image & LC_IMAGE_PROGRESSIVE) != 0;
+ opts->imopts.transparent = (image & LC_IMAGE_TRANSPARENT) != 0;
+ opts->imopts.truecolor = (image & LC_IMAGE_HIGHCOLOR) != 0;
+ opts->imopts.pause = (float)Sys_ProfileLoadInt ("Default", "AVI Pause", 100)/100;
+ opts->imopts.format = (unsigned char)(image & ~(LC_IMAGE_MASK));
+
+ dlg = gtk_file_selection_new ("Save Picture");
+ gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (main_window));
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->ok_button), "clicked",
+ GTK_SIGNAL_FUNC (savefiledlg_ok), GINT_TO_POINTER (LC_OK));
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->cancel_button), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_object_set_data (GTK_OBJECT (dlg), "loop", &loop);
+ gtk_object_set_data (GTK_OBJECT (dlg), "ret", &ret);
+
+ // add the options button
+ button = gtk_button_new_with_label ("Options");
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (GTK_FILE_SELECTION (dlg)->ok_button->parent), button, TRUE, TRUE, 0);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (savepicturedlg_options), param);
+
+ /*
+ gtk_file_selection_set_filename (GTK_FILE_SELECTION (dlg), filename);
+ */
+ gtk_widget_show (dlg);
+ gtk_grab_add (dlg);
+
+ while (loop)
+ gtk_main_iteration ();
+
+ if (ret == LC_OK)
+ {
+ char ext[5], *p;
+
+ strcpy (opts->filename, gtk_file_selection_get_filename (GTK_FILE_SELECTION (dlg)));
+
+ if (strlen (opts->filename) == 0)
+ ret = LC_CANCEL;
+
+ p = strrchr (opts->filename, '.');
+ if (p != NULL)
+ {
+ strcpy (ext, p+1);
+ strlwr (ext);
+ }
+ else
+ ext[0] = '\0';
+
+ if ((strcmp (ext, "jpg") != 0) && (strcmp (ext, "jpeg") != 0) &&
+ (strcmp (ext, "bmp") != 0) && (strcmp (ext, "gif") != 0) &&
+ (strcmp (ext, "png") != 0) && (strcmp (ext, "avi") != 0))
+ {
+ switch (opts->imopts.format)
+ {
+ case LC_IMAGE_BMP: strcat(opts->filename, ".bmp"); break;
+ case LC_IMAGE_GIF: strcat(opts->filename, ".gif"); break;
+ case LC_IMAGE_JPG: strcat(opts->filename, ".jpg"); break;
+ case LC_IMAGE_PNG: strcat(opts->filename, ".png"); break;
+ case LC_IMAGE_AVI: strcat(opts->filename, ".avi"); break;
+ }
+ }
+ }
+
+ gtk_grab_remove (dlg);
+ gtk_widget_destroy (dlg);
+
+ return ret;
+}
+
+// =============================================================================
+// Piece Library Manager