| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 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 | |
|---|
| 23 | |
|---|
| 24 | static 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 | |
|---|
| 113 | int 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 | |
|---|
| 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 | |
|---|
| 181 | |
|---|
| 182 | static void saveprojectdlg_preview (GtkToggleButton *button, gpointer data) |
|---|
| 183 | { |
|---|
| 184 | Sys_ProfileSaveInt ("Default", "Save Preview", gtk_toggle_button_get_active (button)); |
|---|
| 185 | } |
|---|
| 186 | |
|---|
| 187 | |
|---|
| 188 | static 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 | |
|---|
| 206 | int 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 | |
|---|
| 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 | |
|---|
| 253 | |
|---|
| 254 | static void savepicturedlg_options (GtkWidget *widget, gpointer data) |
|---|
| 255 | { |
|---|
| 256 | imageoptsdlg_execute (data, false); |
|---|
| 257 | } |
|---|
| 258 | |
|---|
| 259 | int 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 | |
|---|
| 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 | |
|---|
| 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 | |
|---|
| 343 | int 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 | |
|---|