root / trunk / linux / dlgfile.cpp

Revision 635, 12.3 kB (checked in by leo, 2 years ago)

Added directory browse dialog.

  • 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 'File' submenu:
4//
5// - File Open Dialog
6// - File Save Dialog
7// - Save Picture Dialog
8// - Piece Library Manager
9//
10
11#include <gtk/gtk.h>
12#include <unistd.h>
13#include <string.h>
14#include <stdlib.h>
15#include "system.h"
16#include "dialogs.h"
17#include "file.h"
18#include "image.h"
19#include "main.h"
20
21// =============================================================================
22// Open Project Dialog
23
24static void openprojectdlg_select (GtkCList *clist, gint row, gint col, GdkEvent *event, GtkPreview *preview)
25{
26  GtkWidget *parent = gtk_widget_get_toplevel (GTK_WIDGET (clist));
27  const char *filename, *p;
28  bool loaded = false;
29  Image image;
30
31  filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (parent));
32
33  p = strrchr (filename, '.');
34  if ((p != NULL) && (g_strcasecmp (p+1, "lcd") == 0))
35  {
36    float fv;
37    char id[32];
38    FileDisk file;
39    file.Open (filename, "rb");
40    file.Read (id, 32);
41    sscanf (strchr(id, ' '), "%f", &fv);
42
43    if (fv > 0.4f)
44    {
45      file.Read(&fv, 4);
46
47      if (fv > 0.7f)
48      {
49        unsigned long dwPosition;
50        file.Seek (-4, SEEK_END);
51        file.Read (&dwPosition, 4);
52        file.Seek (dwPosition, SEEK_SET);
53
54        if (dwPosition != 0)
55        {
56          if (fv < 1.0f)
57          {
58            file.Seek (54, SEEK_CUR);
59
60            image.Allocate (120, 100, false);
61            file.Read (image.GetData (), 36000);
62
63            for (int y = 0; y < 50; y++)
64              for (int x = 0; x < 120; x++)
65              {
66                unsigned char *from = image.GetData() + x*3 + y*360;
67                unsigned char *to = image.GetData() + x*3 + (100-y-1)*360;
68                unsigned char tmp[3] = { from[0], from[1], from[2] };
69
70                from[0] = to[2];
71                from[1] = to[1];
72                from[2] = to[0];
73                to[0] = tmp[2];
74                to[1] = tmp[1];
75                to[2] = tmp[0];
76              }
77            loaded = true;
78          }
79          else
80          {
81            loaded = image.FileLoad (file);
82          }
83        }
84      }
85    }
86    file.Close();
87  }
88
89  if (loaded == false)
90  {
91    GtkWidget *w = GTK_WIDGET (preview);
92    guchar row[360];
93
94    for (int x = 0; x < 120; x++)
95    {
96      row[x*3] = w->style->bg[0].red/0xFF;
97      row[x*3+1] = w->style->bg[0].green/0xFF;
98      row[x*3+2] = w->style->bg[0].blue/0xFF;
99    }
100
101    for (int y = 0; y < 100; y++)
102      gtk_preview_draw_row (preview, row, 0, y, 120);
103    gtk_widget_draw (w, NULL);
104  }
105  else
106  {
107    for (int y = 0; y < 100; y++)
108      gtk_preview_draw_row (preview, image.GetData ()+y*360, 0, y, 120);
109    gtk_widget_draw (GTK_WIDGET (preview), NULL);
110  }
111}
112
113int openprojectdlg_execute (char* filename)
114{
115  GtkWidget *dlg, *preview, *vbox, *frame, *frame2, *hbox;
116  int ret = LC_CANCEL, loop = 1, len;
117
118  dlg = gtk_file_selection_new ("Open Project");
119  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
120  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
121                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
122  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
123                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
124  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->ok_button), "clicked",
125                      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_OK));
126  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->cancel_button), "clicked",
127                      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
128  gtk_object_set_data (GTK_OBJECT (dlg), "loop", &loop);
129  gtk_object_set_data (GTK_OBJECT (dlg), "ret", &ret);
130
131  // add preview support
132  hbox = GTK_FILE_SELECTION (dlg)->file_list->parent->parent;
133
134  vbox = gtk_vbox_new (FALSE, 0);
135  gtk_widget_show (vbox);
136  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
137
138  frame = gtk_frame_new ("Preview");
139  gtk_widget_show (frame);
140  gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, FALSE, 0);
141
142  frame2 = gtk_frame_new (NULL);
143  gtk_widget_show (frame2);
144  gtk_container_add (GTK_CONTAINER (frame), frame2);
145  gtk_container_border_width (GTK_CONTAINER (frame2), 5);
146  gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_NONE);
147
148  preview = gtk_preview_new (GTK_PREVIEW_COLOR);
149  gtk_container_add (GTK_CONTAINER (frame2), preview);
150  gtk_preview_size (GTK_PREVIEW (preview), 120, 100);
151  gtk_widget_show (preview);
152
153  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->file_list), "select_row",
154                      GTK_SIGNAL_FUNC (openprojectdlg_select), preview);
155
156  len = strlen (filename);
157  if (len != 0)
158  {
159    if (filename[len-1] != '/')
160      strcat (filename, "/");
161    gtk_file_selection_set_filename (GTK_FILE_SELECTION (dlg), filename);
162  }
163
164  gtk_widget_show (dlg);
165  gtk_grab_add (dlg);
166
167  while (loop)
168    gtk_main_iteration ();
169
170  if (ret == LC_OK)
171    strcpy (filename, gtk_file_selection_get_filename (GTK_FILE_SELECTION (dlg)));
172
173  gtk_grab_remove (dlg);
174  gtk_widget_destroy (dlg);
175
176  return ret;
177}
178
179// =============================================================================
180// Save Project Dialog
181
182static void saveprojectdlg_preview (GtkToggleButton *button, gpointer data)
183{
184  Sys_ProfileSaveInt ("Default", "Save Preview", gtk_toggle_button_get_active (button));
185}
186
187// used by the save project and save picture dialogs
188static void savefiledlg_ok (GtkWidget *widget, gpointer data)
189{
190  GtkWidget *parent;
191  int *loop, *ret;
192
193  parent = gtk_widget_get_toplevel (widget);
194  loop = (int*)gtk_object_get_data (GTK_OBJECT (parent), "loop");
195  ret = (int*)gtk_object_get_data (GTK_OBJECT (parent), "ret");
196
197  if ((GPOINTER_TO_INT (data) == LC_OK) &&
198      (access (gtk_file_selection_get_filename (GTK_FILE_SELECTION (parent)), R_OK) == 0))
199    if (Sys_MessageBox ("File already exists, overwrite ?", "LeoCAD", LC_MB_YESNO) == LC_NO)
200      return;
201
202  *loop = 0;
203  *ret = GPOINTER_TO_INT (data);
204}
205
206int saveprojectdlg_execute (char* filename)
207{
208  GtkWidget *dlg, *check;
209  int ret = LC_CANCEL, loop = 1;
210
211  dlg = gtk_file_selection_new ("Save Project");
212  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
213  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
214                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
215  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
216                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
217  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->ok_button), "clicked",
218                      GTK_SIGNAL_FUNC (savefiledlg_ok), GINT_TO_POINTER (LC_OK));
219  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->cancel_button), "clicked",
220                      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
221  gtk_object_set_data (GTK_OBJECT (dlg), "loop", &loop);
222  gtk_object_set_data (GTK_OBJECT (dlg), "ret", &ret);
223
224  // add preview checkbox
225  check = gtk_check_button_new_with_label ("Save Preview");
226  gtk_widget_show (check);
227  gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (dlg)->main_vbox), check, FALSE, FALSE, 0);
228
229  int i = Sys_ProfileLoadInt ("Default", "Save Preview", 0);
230  if (i != 0)
231    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
232  gtk_signal_connect (GTK_OBJECT (check), "toggled", GTK_SIGNAL_FUNC (saveprojectdlg_preview), NULL);
233
234  gtk_file_selection_set_filename (GTK_FILE_SELECTION (dlg), filename);
235
236  gtk_widget_show (dlg);
237  gtk_grab_add (dlg);
238
239  while (loop)
240    gtk_main_iteration ();
241
242  if (ret == LC_OK)
243    strcpy (filename, gtk_file_selection_get_filename (GTK_FILE_SELECTION (dlg)));
244
245  gtk_grab_remove (dlg);
246  gtk_widget_destroy (dlg);
247
248  return ret;
249}
250
251// =============================================================================
252// Save Picture Dialog
253
254static void savepicturedlg_options (GtkWidget *widget, gpointer data)
255{
256  imageoptsdlg_execute (data, false);
257}
258
259int savepicturedlg_execute (void* param)
260{
261  GtkWidget *dlg, *button;
262  int ret = LC_CANCEL, loop = 1;
263
264  unsigned long image = Sys_ProfileLoadInt ("Default", "Image Options", 1|LC_IMAGE_TRANSPARENT);
265  LC_IMAGEDLG_OPTS* opts = (LC_IMAGEDLG_OPTS*)param;
266  opts->width = Sys_ProfileLoadInt ("Default", "Image Width", gdk_screen_width ());
267  opts->height = Sys_ProfileLoadInt ("Default", "Image Height", gdk_screen_height ());
268  opts->imopts.quality = Sys_ProfileLoadInt ("Default", "JPEG Quality", 70);
269  opts->imopts.interlaced = (image & LC_IMAGE_PROGRESSIVE) != 0;
270  opts->imopts.transparent = (image & LC_IMAGE_TRANSPARENT) != 0;
271  opts->imopts.truecolor = (image & LC_IMAGE_HIGHCOLOR) != 0;
272  opts->imopts.pause = (float)Sys_ProfileLoadInt ("Default", "AVI Pause", 100)/100;
273  opts->imopts.format = (unsigned char)(image & ~(LC_IMAGE_MASK));
274
275  dlg = gtk_file_selection_new ("Save Picture");
276  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
277  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
278                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
279  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
280                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
281  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->ok_button), "clicked",
282                      GTK_SIGNAL_FUNC (savefiledlg_ok), GINT_TO_POINTER (LC_OK));
283  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->cancel_button), "clicked",
284                      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
285  gtk_object_set_data (GTK_OBJECT (dlg), "loop", &loop);
286  gtk_object_set_data (GTK_OBJECT (dlg), "ret", &ret);
287
288  // add the options button
289  button = gtk_button_new_with_label ("Options");
290  gtk_widget_show (button);
291  gtk_box_pack_end (GTK_BOX (GTK_FILE_SELECTION (dlg)->ok_button->parent), button, TRUE, TRUE, 0);
292  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
293  gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (savepicturedlg_options), param);
294
295  /*
296  gtk_file_selection_set_filename (GTK_FILE_SELECTION (dlg), filename);
297  */
298  gtk_widget_show (dlg);
299  gtk_grab_add (dlg);
300
301  while (loop)
302    gtk_main_iteration ();
303
304  if (ret == LC_OK)
305  {
306    char ext[5], *p;
307
308    strcpy (opts->filename, gtk_file_selection_get_filename (GTK_FILE_SELECTION (dlg)));
309
310    if (strlen (opts->filename) == 0)
311      ret = LC_CANCEL;
312
313    p = strrchr (opts->filename, '.');
314    if (p != NULL)
315    {
316      strcpy (ext, p+1);
317      strlwr (ext);
318    }
319    else
320      ext[0] = '\0';
321
322    if ((strcmp (ext, "jpg") != 0) && (strcmp (ext, "jpeg") != 0) &&
323        (strcmp (ext, "bmp") != 0) && (strcmp (ext, "gif") != 0) &&
324        (strcmp (ext, "png") != 0) && (strcmp (ext, "avi") != 0))
325    {
326      switch (opts->imopts.format)
327      {
328        case LC_IMAGE_BMP: strcat(opts->filename, ".bmp"); break;
329        case LC_IMAGE_GIF: strcat(opts->filename, ".gif"); break;
330        case LC_IMAGE_JPG: strcat(opts->filename, ".jpg"); break;
331        case LC_IMAGE_PNG: strcat(opts->filename, ".png"); break;
332        case LC_IMAGE_AVI: strcat(opts->filename, ".avi"); break;
333      }
334    }
335  }
336
337  gtk_grab_remove (dlg);
338  gtk_widget_destroy (dlg);
339
340  return ret;
341}
342
343int dirbrowsedlg_execute(void* param)
344{
345  GtkWidget *dlg;
346  int ret = LC_CANCEL, loop = 1;
347  LC_DLG_DIRECTORY_BROWSE_OPTS* opts = (LC_DLG_DIRECTORY_BROWSE_OPTS*)param;
348
349  dlg = gtk_file_selection_new(opts->Title);
350  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (((GtkWidget*)(*main_window))));
351  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
352                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
353  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
354                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
355  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->ok_button), "clicked",
356                      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_OK));
357  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (dlg)->cancel_button), "clicked",
358                      GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
359  gtk_object_set_data (GTK_OBJECT (dlg), "loop", &loop);
360  gtk_object_set_data (GTK_OBJECT (dlg), "ret", &ret);
361
362  gtk_widget_show (dlg);
363  gtk_grab_add (dlg);
364
365  while (loop)
366    gtk_main_iteration ();
367
368  if (ret == LC_OK)
369    strcpy (opts->Path, gtk_file_selection_get_filename (GTK_FILE_SELECTION (dlg)));
370
371  gtk_grab_remove (dlg);
372  gtk_widget_destroy (dlg);
373
374  return ret;
375}
376
377// =============================================================================
378// Piece Library Manager
Note: See TracBrowser for help on using the browser.