2 * gEDA - GNU Electronic Design Automation
3 * This file is a part of gerbv.
5 * Copyright (C) 2000-2003 Stefan Petersen (spe@stacken.kth.se)
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.s
14 * This program is distributed in the hope that it toowill be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
25 \brief GUI building functions for Gerbv
33 #include <sys/types.h>
40 #include <gdk/gdkkeysyms.h>
45 #include "callbacks.h"
46 #include "interface.h"
52 #include "gerbv_icon.h"
54 extern gerbv_render_info_t screenRenderInfo
;
56 #define WIN_TITLE "Gerbv -- gEDA's Gerber Viewer"
57 #define _(String) (String)
59 #define dprintf if(DEBUG) printf
61 /* ---------------------------------------------- */
63 rename_main_window(char const* filename
, GtkWidget
*main_win
)
65 GString
*win_title
=g_string_new(NULL
);
66 static GtkWidget
*win
=NULL
;
68 if( main_win
!= NULL
)
71 g_assert(win
!= NULL
);
73 g_string_printf (win_title
,"%s version %s: %s", WIN_TITLE
, VERSION
, filename
);
74 gtk_window_set_title(GTK_WINDOW(win
), win_title
->str
);
75 g_string_free(win_title
,TRUE
);
78 /* ---------------------------------------------- */
80 set_window_icon (GtkWidget
* this_window
)
85 pixmap
= gdk_pixmap_create_from_xpm_d (this_window
->window
, &mask
,
86 &this_window
->style
->bg
[GTK_STATE_NORMAL
], gerbv_icon_xpm
);
87 gdk_window_set_icon (this_window
->window
, NULL
, pixmap
, mask
);
92 /* ---------------------------------------------- */
94 interface_load_accels (void)
96 gchar
*accel_map_filename
= g_build_filename (g_get_home_dir(), GERBV_ACCELS_RELPATH
, NULL
);
97 if (accel_map_filename
) {
98 gtk_accel_map_load (accel_map_filename
);
99 g_free (accel_map_filename
);
103 /* ---------------------------------------------- */
105 interface_save_accels (void)
107 gchar
*accel_map_filename
= g_build_filename (g_get_home_dir(), GERBV_ACCELS_RELPATH
, NULL
);
108 if (accel_map_filename
) {
109 gtk_accel_map_save (accel_map_filename
);
110 g_free (accel_map_filename
);
114 /* ---------------------------------------------- */
116 interface_create_gui (int req_width
, int req_height
)
120 GtkWidget
*mainWindow
;
124 GtkWidget
*menuitem_file
;
125 GtkWidget
*menuitem_file_menu
;
127 GtkWidget
*open_project
;
129 GtkWidget
*open_layer
;
133 GtkWidget
*save_layer
;
134 GtkWidget
*save_as_layer
;
135 GtkWidget
*separatormenuitem1
;
136 GtkWidget
*menuitem_file_export
;
137 GtkWidget
*menuitem_file_export_menu
;
141 GtkWidget
*postscript
;
142 GtkWidget
*rs274x
,*drill
,*rs274xm
,*drillm
;
144 GtkWidget
*separator1
;
145 #if GTK_CHECK_VERSION(2,10,0)
147 GtkWidget
*separator2
;
151 GtkWidget
*menuitem_edit
;
152 GtkWidget
*menuitem_edit_menu
;
153 GtkWidget
*properties_selected
;
154 GtkWidget
*delete_selected
;
155 GtkWidget
*menuitem_view
;
156 GtkWidget
*menuitem_view_menu
;
157 GtkWidget
*view_fullscreen
;
158 GtkWidget
*show_toolbar
;
159 GtkWidget
*show_sidepane
;
160 GtkWidget
*separator3
;
161 GtkWidget
*toggle_layer_visibility_item1
;
162 GtkWidget
*toggle_layer_visibility_item2
;
163 GtkWidget
*toggle_layer_visibility_item3
;
164 GtkWidget
*toggle_layer_visibility_item4
;
165 GtkWidget
*toggle_layer_visibility_item5
;
166 GtkWidget
*toggle_layer_visibility_item6
;
167 GtkWidget
*toggle_layer_visibility_item7
;
168 GtkWidget
*toggle_layer_visibility_item8
;
169 GtkWidget
*toggle_layer_visibility_item9
;
170 GtkWidget
*toggle_layer_visibility_item10
;
171 GtkWidget
*separator4
;
174 GtkWidget
*fit_to_window
;
175 GtkWidget
*separator5
;
176 GtkWidget
*backgroundColor
;
177 GtkWidget
*menuitem_view_render
, *menuitem_view_render_menu
;
178 GSList
*menu_view_render_group
;
179 GtkWidget
*render_fast
, *render_fast_xor
, *render_normal
, *render_hq
;
180 GtkWidget
*menuitem_view_unit
, *menuitem_view_unit_menu
;
181 GSList
*menu_view_unit_group
;
182 GtkWidget
*unit_mil
, *unit_mm
, *unit_in
;
183 GtkWidget
*menuitem_layer
;
184 GtkWidget
*menuitem_layer_menu
;
185 GtkWidget
*layer_visibility
;
186 GtkWidget
*layer_invert
;
187 GtkWidget
*layer_color
;
188 GtkWidget
*layer_reload
;
189 GtkWidget
*layer_orientation
;
190 GtkWidget
*layer_format
;
192 GtkWidget
*layer_down
;
193 GtkWidget
*layer_remove
;
194 GtkWidget
*menuitem_analyze
;
195 GtkWidget
*menuitem_analyze_menu
;
196 GtkWidget
*analyze_active_gerbers
;
197 GtkWidget
*analyze_active_drill
;
198 GtkWidget
*analyze_benchmark
;
199 /*GtkWidget *control_gerber_options;*/
200 GtkWidget
*menuitem_tools
;
201 GtkWidget
*menuitem_tools_menu
;
202 GtkWidget
*toggletoolbutton_pointer
;
203 GtkWidget
*pointer_tool
;
204 GdkPixbuf
*pointerpixbuf
;
205 GtkWidget
*pointerimage
;
207 GtkWidget
*zoom_tool
;
208 GtkWidget
*measure_tool
;
209 GtkWidget
*menuitem_help
;
210 GtkWidget
*layer_visibility_menu
;
211 GtkWidget
*layer_visibility_main_menu
;
212 GtkWidget
*menuitem_help_menu
;
213 /*GtkWidget *online_manual;*/
215 GtkWidget
*bugs_menuitem
;
217 GtkWidget
*toolbar_hbox
;
218 GtkWidget
*handlebox
;
219 GtkWidget
*button_toolbar
;
220 GtkIconSize tmp_toolbar_icon_size
;
221 GtkWidget
*toolbutton_new
;
222 GtkWidget
*toolbutton_open
;
223 GtkWidget
*toolbutton_revert
;
224 GtkWidget
*toolbutton_save
;
225 GtkWidget
*separatortoolitem1
;
226 #if GTK_CHECK_VERSION(2,10,0)
227 GtkWidget
*toolbutton_print
;
228 GtkWidget
*separatortoolitem2
;
230 GtkWidget
*toolbutton_zoom_in
;
231 GtkWidget
*toolbutton_zoom_out
;
232 GtkWidget
*toolbutton_zoom_fit
;
233 /* Implement these tool buttons later when we have icons */
234 /* GtkWidget *separatortoolitem3; */
235 /* GtkWidget *toolbutton_analyze; */
236 /* GtkWidget *toolbutton_validate;*/
237 /* GtkWidget *toolbutton_control; */
238 GtkWidget
*separatortoolitem4
;
239 GtkWidget
*toggletoolbutton_pan
;
240 GtkWidget
*toggletoolbutton_zoom
;
241 GtkWidget
*toggletoolbutton_measure
;
243 GtkWidget
*sidepane_vbox
;
244 GtkWidget
*sidepane_notebook
;
248 GtkWidget
*render_combobox
;
249 GtkWidget
*scrolledwindow1
;
259 GtkWidget
*Layer_label
;
261 GtkWidget
*messages_scrolledwindow
;
262 GtkWidget
*message_textview
;
263 GtkWidget
*clear_messages_button
;
264 GtkWidget
*Message_label
;
266 GtkWidget
*main_view_table
;
270 GtkWidget
*statusbar_label_left
;
271 GtkWidget
*statusUnitComboBox
;
272 GtkWidget
*statusbar_label_right
;
273 GtkWidget
*drawingarea
, *hAdjustment
, *vAdjustment
, *hScrollbar
, *vScrollbar
;
275 GtkAccelGroup
*accel_group
;
276 GtkTooltips
*tooltips
;
279 GdkPixbuf
*zoompixbuf
;
280 GtkWidget
*zoomimage
;
281 GdkPixbuf
*measurepixbuf
;
282 GtkWidget
*measureimage
;
283 GdkPixbuf
*movepixbuf
;
284 GtkWidget
*moveimage
;
286 GtkWidget
*tempImage
;
288 pointerpixbuf
= gdk_pixbuf_new_from_inline(-1, pointer
, FALSE
, NULL
);
289 movepixbuf
= gdk_pixbuf_new_from_inline(-1, move
, FALSE
, NULL
);
290 zoompixbuf
= gdk_pixbuf_new_from_inline(-1, lzoom
, FALSE
, NULL
);
291 measurepixbuf
= gdk_pixbuf_new_from_inline(-1, ruler
, FALSE
, NULL
);
293 tooltips
= gtk_tooltips_new();
294 accel_group
= gtk_accel_group_new ();
296 mainWindow
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
297 gtk_window_set_title (GTK_WINDOW (mainWindow
), _(WIN_TITLE
));
299 vbox1
= gtk_vbox_new (FALSE
, 0);
300 gtk_container_add (GTK_CONTAINER (mainWindow
), vbox1
);
302 menubar1
= gtk_menu_bar_new ();
303 gtk_box_pack_start (GTK_BOX (vbox1
), menubar1
, FALSE
, FALSE
, 0);
305 /* --- File menu --- */
306 menuitem_file
= gtk_menu_item_new_with_mnemonic (_("_File"));
307 gtk_container_add (GTK_CONTAINER (menubar1
), menuitem_file
);
309 /* File menu items dealing with a gerbv project. */
310 menuitem_file_menu
= gtk_menu_new ();
311 gtk_menu_set_accel_group (GTK_MENU(menuitem_file_menu
), accel_group
);
312 gtk_menu_set_accel_path (GTK_MENU(menuitem_file_menu
), ACCEL_FILE
);
313 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_file
), menuitem_file_menu
);
315 new = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW
, NULL
);
316 SET_ACCELS_FROM_STOCK (GTK_STOCK_NEW
, ACCEL_FILE_NEW
);
317 gtk_tooltips_set_tip (tooltips
, new, "Close all layers and start a new project", NULL
);
318 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), new);
320 open_project
= gtk_image_menu_item_new_with_mnemonic (_("_Open project..."));
321 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), open_project
);
322 gtk_tooltips_set_tip (tooltips
, open_project
, "Open an existing Gerbv project", NULL
);
323 image33
= gtk_image_new_from_stock (GTK_STOCK_OPEN
, GTK_ICON_SIZE_MENU
);
324 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (open_project
), image33
);
326 save
= gtk_image_menu_item_new_with_mnemonic (_("Save project"));
327 gtk_tooltips_set_tip (tooltips
, save
, "Save the current project", NULL
);
328 tempImage
= gtk_image_new_from_stock (GTK_STOCK_SAVE
, GTK_ICON_SIZE_MENU
);
329 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (save
), tempImage
);
330 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), save
);
332 save_as
= gtk_image_menu_item_new_with_mnemonic (_("Save project as..."));
333 gtk_tooltips_set_tip (tooltips
, save_as
, "Save the current project to a new file", NULL
);
334 tempImage
= gtk_image_new_from_stock (GTK_STOCK_SAVE_AS
, GTK_ICON_SIZE_MENU
);
335 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (save_as
), tempImage
);
336 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), save_as
);
338 revert
= gtk_image_menu_item_new_from_stock (GTK_STOCK_REVERT_TO_SAVED
, NULL
);
339 SET_ACCELS_FROM_STOCK (GTK_STOCK_REVERT_TO_SAVED
, ACCEL_FILE_REVERT
);
340 gtk_tooltips_set_tip (tooltips
, revert
, "Reload all layers", NULL
);
341 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), revert
);
343 /* File menu items dealing individual layers. */
344 separator1
= gtk_separator_menu_item_new ();
345 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), separator1
);
346 gtk_widget_set_sensitive (separator1
, FALSE
);
348 open_layer
= gtk_menu_item_new_with_mnemonic (_("Open _layer(s)..."));
349 gtk_accel_map_add_entry (ACCEL_FILE_OPEN_LAYER_PATH
, ACCEL_FILE_OPEN_LAYER_KEY
, ACCEL_FILE_OPEN_LAYER_MOD
);
350 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), open_layer
);
351 gtk_tooltips_set_tip (tooltips
, open_layer
, "Open Gerber, drill, or pick and place file(s)", NULL
);
353 save_layer
= gtk_menu_item_new_with_mnemonic (_("_Save active layer"));
354 gtk_tooltips_set_tip (tooltips
, save_layer
, "Save the active layer", NULL
);
355 gtk_accel_map_add_entry (ACCEL_FILE_SAVE_LAYER_PATH
, ACCEL_FILE_SAVE_LAYER_KEY
, ACCEL_FILE_SAVE_LAYER_MOD
);
356 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), save_layer
);
358 save_as_layer
= gtk_menu_item_new_with_mnemonic (_("Save active layer _as..."));
359 gtk_tooltips_set_tip (tooltips
, save_as_layer
, "Save the active layer to a new file", NULL
);
360 gtk_accel_map_add_entry (ACCEL_FILE_SAVE_LAYER_AS_PATH
, ACCEL_FILE_SAVE_LAYER_AS_KEY
, ACCEL_FILE_SAVE_LAYER_AS_MOD
);
361 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), save_as_layer
);
363 /* File menu items dealing with exporting different types of files. */
364 separatormenuitem1
= gtk_separator_menu_item_new ();
365 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), separatormenuitem1
);
366 gtk_widget_set_sensitive (separatormenuitem1
, FALSE
);
368 menuitem_file_export
= gtk_menu_item_new_with_mnemonic (_("_Export"));
369 gtk_tooltips_set_tip (tooltips
, menuitem_file_export
, "Export all visible layers to a new format", NULL
);
370 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), menuitem_file_export
);
372 menuitem_file_export_menu
= gtk_menu_new ();
373 gtk_menu_set_accel_group (GTK_MENU(menuitem_file_export_menu
), accel_group
);
374 gtk_menu_set_accel_path (GTK_MENU(menuitem_file_export_menu
), ACCEL_FILE_EXPORT
);
375 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_file_export
), menuitem_file_export_menu
);
377 png
= gtk_menu_item_new_with_mnemonic (_("P_NG..."));
378 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), png
);
379 gtk_tooltips_set_tip (tooltips
, png
, _("Export project to a PNG file..."), NULL
);
381 pdf
= gtk_menu_item_new_with_mnemonic (_("P_DF..."));
382 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), pdf
);
383 gtk_tooltips_set_tip (tooltips
, pdf
, _("Export project to a PDF file..."), NULL
);
385 svg
= gtk_menu_item_new_with_mnemonic (_("_SVG..."));
386 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), svg
);
387 gtk_tooltips_set_tip (tooltips
, svg
, _("Export project to a SVG file"), NULL
);
389 postscript
= gtk_menu_item_new_with_mnemonic (_("_PostScript..."));
390 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), postscript
);
391 gtk_tooltips_set_tip (tooltips
, postscript
, _("Export project to a PostScript file"), NULL
);
393 rs274x
= gtk_menu_item_new_with_mnemonic (_("RS-274X (_Gerber)..."));
394 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), rs274x
);
395 gtk_tooltips_set_tip (tooltips
, rs274x
, _("Export layer to a RS-274X (Gerber) file"), NULL
);
397 drill
= gtk_menu_item_new_with_mnemonic (_("_Excellon drill..."));
398 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), drill
);
399 gtk_tooltips_set_tip (tooltips
, drill
, _("Export layer to an Excellon drill file"), NULL
);
401 rs274xm
= gtk_menu_item_new_with_mnemonic (_("RS-274X Merge (Gerber)..."));
402 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), rs274xm
);
403 gtk_tooltips_set_tip (tooltips
, rs274xm
, _("Export (merge visible gerber layers) to a RS-274X (Gerber) file"), NULL
);
405 drillm
= gtk_menu_item_new_with_mnemonic (_("Excellon drill Merge..."));
406 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu
), drillm
);
407 gtk_tooltips_set_tip (tooltips
, drillm
, _("Export (merge visible drill layers) to an Excellon drill file"), NULL
);
409 /* File menu items dealing with printing and quitting. */
410 separator1
= gtk_separator_menu_item_new ();
411 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), separator1
);
412 gtk_widget_set_sensitive (separator1
, FALSE
);
414 #if GTK_CHECK_VERSION(2,10,0)
415 if (gtk_stock_lookup(GTK_STOCK_PRINT
, &stock
)) {
416 gchar
new[] = "_Print...";
418 gtk_stock_add(&stock
, 1);
421 print
= gtk_image_menu_item_new_from_stock (GTK_STOCK_PRINT
, NULL
);
422 SET_ACCELS_FROM_STOCK (GTK_STOCK_PRINT
, ACCEL_FILE_PRINT
);
423 gtk_tooltips_set_tip (tooltips
, print
, "Print the visible layers", NULL
);
424 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), print
);
426 separator2
= gtk_separator_menu_item_new ();
427 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), separator2
);
428 gtk_widget_set_sensitive (separator2
, FALSE
);
430 quit
= gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT
, NULL
);
431 SET_ACCELS_FROM_STOCK (GTK_STOCK_QUIT
, ACCEL_FILE_QUIT
);
432 gtk_tooltips_set_tip (tooltips
, quit
, "Quit Gerbv", NULL
);
433 gtk_container_add (GTK_CONTAINER (menuitem_file_menu
), quit
);
435 /* --- Next menu item (Edit) --- */
436 menuitem_edit
= gtk_menu_item_new_with_mnemonic (_("_Edit"));
437 gtk_container_add (GTK_CONTAINER (menubar1
), menuitem_edit
);
439 menuitem_edit_menu
= gtk_menu_new ();
440 gtk_menu_set_accel_group (GTK_MENU(menuitem_edit_menu
), accel_group
);
441 gtk_menu_set_accel_path (GTK_MENU(menuitem_edit_menu
), ACCEL_EDIT
);
442 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_edit
), menuitem_edit_menu
);
444 properties_selected
= gtk_image_menu_item_new_with_mnemonic (_("Display _properties of selected object(s)"));
445 SET_ACCELS_FROM_STOCK (GTK_STOCK_PROPERTIES
, ACCEL_EDIT_PROPERTIES
);
446 gtk_tooltips_set_tip (tooltips
, properties_selected
, "Examine the properties of the selected object", NULL
);
447 tempImage
= gtk_image_new_from_stock (GTK_STOCK_PROPERTIES
, GTK_ICON_SIZE_MENU
);
448 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (properties_selected
), tempImage
);
449 gtk_container_add (GTK_CONTAINER (menuitem_edit_menu
), properties_selected
);
451 delete_selected
= gtk_image_menu_item_new_with_mnemonic (_("_Delete selected object(s)"));
452 SET_ACCELS_FROM_STOCK (GTK_STOCK_REMOVE
, ACCEL_EDIT_DELETE
);
453 gtk_tooltips_set_tip (tooltips
, delete_selected
, "Delete selected objects", NULL
);
454 tempImage
= gtk_image_new_from_stock (GTK_STOCK_DELETE
, GTK_ICON_SIZE_MENU
);
455 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (delete_selected
), tempImage
);
456 gtk_container_add (GTK_CONTAINER (menuitem_edit_menu
), delete_selected
);
458 /* Include these after they are coded.
459 tempMenuItem = gtk_image_menu_item_new_with_label ("Edit object properties");
460 gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
461 gtk_tooltips_set_tip (tooltips, tempMenuItem, "Edit the properties of the selected object", NULL);
462 g_signal_connect ((gpointer) tempMenuItem, "activate",
463 G_CALLBACK (callbacks_edit_object_properties_clicked), NULL);
465 tempMenuItem = gtk_image_menu_item_new_with_label ("Move object(s)");
466 gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
467 gtk_tooltips_set_tip (tooltips, tempMenuItem, "Move the selected object(s)",NULL);
468 g_signal_connect ((gpointer) tempMenuItem, "activate",
469 G_CALLBACK (callbacks_move_objects_clicked), NULL);
471 tempMenuItem = gtk_image_menu_item_new_with_label ("Reduce area");
472 gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
473 gtk_tooltips_set_tip (tooltips, tempMenuItem, "Reduce the area of the object (e.g. to prevent component floating)",NULL);
474 g_signal_connect ((gpointer) tempMenuItem, "activate",
475 G_CALLBACK (callbacks_reduce_object_area_clicked), NULL);
478 /* Use the "Edit" menu as right click popup menu for the drawing area */
479 screen
.win
.drawWindowPopupMenu
= menuitem_edit_menu
;
481 /* --- Next menu item (View) --- */
482 menuitem_view
= gtk_menu_item_new_with_mnemonic (_("_View"));
483 gtk_container_add (GTK_CONTAINER (menubar1
), menuitem_view
);
485 menuitem_view_menu
= gtk_menu_new ();
486 gtk_menu_set_accel_group (GTK_MENU(menuitem_view_menu
), accel_group
);
487 gtk_menu_set_accel_path (GTK_MENU(menuitem_view_menu
), ACCEL_VIEW
);
488 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view
), menuitem_view_menu
);
490 view_fullscreen
= gtk_check_menu_item_new_with_mnemonic (_("Fullscr_een"));
491 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_fullscreen
), FALSE
);
492 gtk_tooltips_set_tip (tooltips
, view_fullscreen
, "Toggle between fullscreen and normal view", NULL
);
493 SET_ACCELS (ACCEL_VIEW_FULLSCREEN
);
494 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), view_fullscreen
);
496 show_toolbar
= gtk_check_menu_item_new_with_mnemonic (_("Show _Toolbar"));
497 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_toolbar
), TRUE
);
498 gtk_tooltips_set_tip (tooltips
, show_toolbar
, "Toggle visibility of the toolbar", NULL
);
499 SET_ACCELS (ACCEL_VIEW_TOOLBAR
);
500 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), show_toolbar
);
502 show_sidepane
= gtk_check_menu_item_new_with_mnemonic (_("Show _Sidepane"));
503 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_sidepane
), TRUE
);
504 gtk_tooltips_set_tip (tooltips
, show_sidepane
, "Toggle visibility of the sidepane", NULL
);
505 SET_ACCELS (ACCEL_VIEW_SIDEPANE
);
506 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), show_sidepane
);
508 separator3
= gtk_separator_menu_item_new ();
509 gtk_widget_set_sensitive (separator3
, FALSE
);
510 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), separator3
);
512 layer_visibility_main_menu
= gtk_menu_item_new_with_mnemonic (_("Toggle layer _visibility"));
513 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), layer_visibility_main_menu
);
515 layer_visibility_menu
= gtk_menu_new ();
516 gtk_menu_set_accel_group (GTK_MENU(layer_visibility_menu
), accel_group
);
517 gtk_menu_set_accel_path (GTK_MENU(layer_visibility_menu
), ACCEL_VIEW_VIS
);
518 gtk_menu_item_set_submenu (GTK_MENU_ITEM (layer_visibility_main_menu
), layer_visibility_menu
);
520 toggle_layer_visibility_item1
= gtk_menu_item_new_with_label ("Toggle visibility of layer 1");
521 SET_ACCELS (ACCEL_VIEW_VIS_LAYER1
);
522 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item1
);
524 toggle_layer_visibility_item2
= gtk_menu_item_new_with_label ("Toggle visibility of layer 2");
525 SET_ACCELS (ACCEL_VIEW_VIS_LAYER2
);
526 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item2
);
528 toggle_layer_visibility_item3
= gtk_menu_item_new_with_label ("Toggle visibility of layer 3");
529 SET_ACCELS (ACCEL_VIEW_VIS_LAYER3
);
530 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item3
);
532 toggle_layer_visibility_item4
= gtk_menu_item_new_with_label ("Toggle visibility of layer 4");
533 SET_ACCELS (ACCEL_VIEW_VIS_LAYER4
);
534 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item4
);
536 toggle_layer_visibility_item5
= gtk_menu_item_new_with_label ("Toggle visibility of layer 5");
537 SET_ACCELS (ACCEL_VIEW_VIS_LAYER5
);
538 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item5
);
540 toggle_layer_visibility_item6
= gtk_menu_item_new_with_label ("Toggle visibility of layer 6");
541 SET_ACCELS (ACCEL_VIEW_VIS_LAYER6
);
542 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item6
);
544 toggle_layer_visibility_item7
= gtk_menu_item_new_with_label ("Toggle visibility of layer 7");
545 SET_ACCELS (ACCEL_VIEW_VIS_LAYER7
);
546 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item7
);
548 toggle_layer_visibility_item8
= gtk_menu_item_new_with_label ("Toggle visibility of layer 8");
549 SET_ACCELS (ACCEL_VIEW_VIS_LAYER8
);
550 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item8
);
552 toggle_layer_visibility_item9
= gtk_menu_item_new_with_label ("Toggle visibility of layer 9");
553 SET_ACCELS (ACCEL_VIEW_VIS_LAYER9
);
554 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item9
);
556 toggle_layer_visibility_item10
= gtk_menu_item_new_with_label ("Toggle visibility of layer 10");
557 SET_ACCELS (ACCEL_VIEW_VIS_LAYER10
);
558 gtk_container_add (GTK_CONTAINER (layer_visibility_menu
), toggle_layer_visibility_item10
);
560 separator4
= gtk_separator_menu_item_new ();
561 gtk_widget_set_sensitive (separator4
, FALSE
);
562 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), separator4
);
564 zoom_in
= gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_IN
, NULL
);
565 SET_ACCELS_FROM_STOCK (GTK_STOCK_ZOOM_IN
, ACCEL_VIEW_ZOOM_IN
);
566 gtk_tooltips_set_tip (tooltips
, zoom_in
, "Zoom in", NULL
);
567 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), zoom_in
);
569 zoom_out
= gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_OUT
, NULL
);
570 SET_ACCELS_FROM_STOCK (GTK_STOCK_ZOOM_OUT
, ACCEL_VIEW_ZOOM_OUT
);
571 gtk_tooltips_set_tip (tooltips
, zoom_out
, "Zoom out", NULL
);
572 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), zoom_out
);
574 fit_to_window
= gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_FIT
, NULL
);
575 gtk_tooltips_set_tip (tooltips
, fit_to_window
, "Zoom to fit all visible layers in the window", NULL
);
576 SET_ACCELS_FROM_STOCK (GTK_STOCK_ZOOM_FIT
, ACCEL_VIEW_ZOOM_FIT
);
577 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), fit_to_window
);
579 separator5
= gtk_separator_menu_item_new ();
580 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), separator5
);
581 gtk_widget_set_sensitive (separator5
, FALSE
);
583 backgroundColor
= gtk_menu_item_new_with_mnemonic ("Change background color");
584 gtk_tooltips_set_tip (tooltips
, backgroundColor
, "Change the background color", NULL
);
585 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), backgroundColor
);
587 { // rendering submenu
588 menuitem_view_render
= gtk_menu_item_new_with_mnemonic (_("_Rendering"));
589 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), menuitem_view_render
);
591 menuitem_view_render_menu
= gtk_menu_new ();
592 gtk_menu_set_accel_group (GTK_MENU(menuitem_view_render_menu
), accel_group
);
593 gtk_menu_set_accel_path (GTK_MENU(menuitem_view_render_menu
), ACCEL_VIEW_RENDER
);
594 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view_render
), menuitem_view_render_menu
);
596 menu_view_render_group
= NULL
;
598 render_fast
= gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group
, _("_Fast"));
599 menu_view_render_group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_fast
));
600 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu
), render_fast
);
602 render_fast_xor
= gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group
, _("Fast (_XOR)"));
603 menu_view_render_group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_fast_xor
));
604 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu
), render_fast_xor
);
606 render_normal
= gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group
, _("_Normal"));
607 menu_view_render_group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_normal
));
608 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu
), render_normal
);
610 render_hq
= gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group
, _("High _Quality"));
611 menu_view_render_group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_hq
));
612 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu
), render_hq
);
614 screen
.win
.menu_view_render_group
= malloc(4*sizeof(GtkWidget
*));
615 if(screen
.win
.menu_view_render_group
== NULL
)
616 GERB_FATAL_ERROR("malloc for rendering type synchronization failed.\n");
618 screen
.win
.menu_view_render_group
[GERBV_RENDER_TYPE_GDK
] = GTK_CHECK_MENU_ITEM(render_fast
);
619 screen
.win
.menu_view_render_group
[GERBV_RENDER_TYPE_GDK_XOR
] = GTK_CHECK_MENU_ITEM(render_fast_xor
);
620 screen
.win
.menu_view_render_group
[GERBV_RENDER_TYPE_CAIRO_NORMAL
] = GTK_CHECK_MENU_ITEM(render_normal
);
621 screen
.win
.menu_view_render_group
[GERBV_RENDER_TYPE_CAIRO_HIGH_QUALITY
] = GTK_CHECK_MENU_ITEM(render_hq
);
625 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (render_fast
), TRUE
);
627 menuitem_view_unit
= gtk_menu_item_new_with_mnemonic (_("U_nits"));
628 gtk_container_add (GTK_CONTAINER (menuitem_view_menu
), menuitem_view_unit
);
630 menuitem_view_unit_menu
= gtk_menu_new ();
631 gtk_menu_set_accel_group (GTK_MENU(menuitem_view_unit_menu
), accel_group
);
632 gtk_menu_set_accel_path (GTK_MENU(menuitem_view_unit_menu
), ACCEL_VIEW_UNITS
);
633 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view_unit
), menuitem_view_unit_menu
);
635 menu_view_unit_group
= NULL
;
637 unit_mil
= gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group
, _("mi_l"));
638 menu_view_unit_group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_mil
));
639 gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu
), unit_mil
);
641 unit_mm
= gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group
, _("_mm"));
642 menu_view_unit_group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_mm
));
643 gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu
), unit_mm
);
645 unit_in
= gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group
, _("_in"));
646 menu_view_unit_group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_in
));
647 gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu
), unit_in
);
649 screen
.win
.menu_view_unit_group
= malloc(3*sizeof(GtkWidget
*));
650 if(screen
.win
.menu_view_unit_group
== NULL
)
651 GERB_FATAL_ERROR("malloc for display unit synchronization failed.\n");
653 screen
.win
.menu_view_unit_group
[GERBV_MILS
] = GTK_CHECK_MENU_ITEM(unit_mil
);
654 screen
.win
.menu_view_unit_group
[GERBV_MMS
] = GTK_CHECK_MENU_ITEM(unit_mm
);
655 screen
.win
.menu_view_unit_group
[GERBV_INS
] = GTK_CHECK_MENU_ITEM(unit_in
);
658 /* --- Next menu item (Current Layer) --- */
659 menuitem_layer
= gtk_menu_item_new_with_mnemonic (_("Current _Layer"));
660 gtk_container_add (GTK_CONTAINER (menubar1
), menuitem_layer
);
662 menuitem_layer_menu
= gtk_menu_new ();
663 gtk_menu_set_accel_group (GTK_MENU (menuitem_layer_menu
), accel_group
);
664 gtk_menu_set_accel_path (GTK_MENU (menuitem_layer_menu
), ACCEL_LAYER
);
665 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_layer
), menuitem_layer_menu
);
667 layer_visibility
= gtk_menu_item_new_with_mnemonic ("Toggle _visibility");
668 gtk_tooltips_set_tip (tooltips
, layer_visibility
, "Toggles the visibility of the layer currently selected in the sidepane", NULL
);
669 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_visibility
);
671 layer_invert
= gtk_menu_item_new_with_mnemonic ("_Invert color");
672 gtk_tooltips_set_tip (tooltips
, layer_invert
, "Invert the display polarity of the layer currently selected in the sidepane", NULL
);
673 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_invert
);
675 layer_color
= gtk_menu_item_new_with_mnemonic (_("_Change color"));
676 SET_ACCELS (ACCEL_LAYER_COLOR
);
677 gtk_tooltips_set_tip (tooltips
, layer_color
, "Change the display color of the layer currently selected in the sidepane", NULL
);
678 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_color
);
680 layer_reload
= gtk_menu_item_new_with_mnemonic (_("_Reload layer"));
681 gtk_tooltips_set_tip (tooltips
, layer_reload
, "Reload the layer from disk", NULL
);
682 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_reload
);
684 layer_orientation
= gtk_menu_item_new_with_mnemonic (_("Modify _orientation"));
685 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_orientation
);
686 gtk_tooltips_set_tip (tooltips
, layer_orientation
, "Translate, scale, rotate, or mirror the layer currently selected in the sidepane", NULL
);
688 layer_format
= gtk_menu_item_new_with_mnemonic (_("Edit file _format"));
689 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_format
);
690 gtk_tooltips_set_tip (tooltips
, layer_format
, "View and edit the numerical format used to parse this layer currently selected in the sidepane", NULL
);
692 layer_up
= gtk_image_menu_item_new_with_mnemonic (_("Move u_p"));
693 gtk_tooltips_set_tip (tooltips
, layer_up
, "Move the layer currently selected in the sidepane one step up", NULL
);
694 tempImage
= gtk_image_new_from_stock (GTK_STOCK_GO_UP
, GTK_ICON_SIZE_MENU
);
695 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_up
), tempImage
);
696 SET_ACCELS (ACCEL_LAYER_UP
);
697 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_up
);
699 layer_down
= gtk_image_menu_item_new_with_mnemonic (_("Move dow_n"));
700 gtk_tooltips_set_tip (tooltips
, layer_down
, "Move the layer currently selected in the sidepane one step down", NULL
);
701 tempImage
= gtk_image_new_from_stock (GTK_STOCK_GO_DOWN
, GTK_ICON_SIZE_MENU
);
702 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_down
), tempImage
);
703 SET_ACCELS (ACCEL_LAYER_DOWN
);
704 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_down
);
706 layer_remove
= gtk_image_menu_item_new_with_mnemonic (_("_Delete"));
707 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu
), layer_remove
);
708 gtk_tooltips_set_tip (tooltips
, layer_remove
, "Remove the layer currently selected in the sidepane", NULL
);
709 tempImage
= gtk_image_new_from_stock (GTK_STOCK_REMOVE
, GTK_ICON_SIZE_MENU
);
710 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_remove
), tempImage
);
712 /* The callbacks need this reference to grey the layer menu out, if there are none loaded. */
713 screen
.win
.curLayerMenuItem
= menuitem_layer
;
715 /* Use the "Current Layer" menu as right click popup menu for layer tree */
716 screen
.win
.layerTreePopupMenu
= menuitem_layer_menu
;
718 /* --- Next menu item (Analyze) --- */
719 menuitem_analyze
= gtk_menu_item_new_with_mnemonic (_("_Analyze"));
720 gtk_container_add (GTK_CONTAINER (menubar1
), menuitem_analyze
);
722 menuitem_analyze_menu
= gtk_menu_new ();
723 gtk_menu_set_accel_group (GTK_MENU(menuitem_analyze_menu
), accel_group
);
724 gtk_menu_set_accel_path (GTK_MENU(menuitem_analyze_menu
), ACCEL_ANAL
);
725 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_analyze
), menuitem_analyze_menu
);
727 analyze_active_gerbers
= gtk_menu_item_new_with_mnemonic (_("Analyze visible _Gerber layers"));
728 gtk_tooltips_set_tip (tooltips
, analyze_active_gerbers
,
729 "Examine a detailed anaylsis of the contents of all visible Gerber layers", NULL
);
730 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu
), analyze_active_gerbers
);
732 analyze_active_drill
= gtk_menu_item_new_with_mnemonic (_("Analyze visible _drill layers"));
733 gtk_tooltips_set_tip (tooltips
, analyze_active_drill
,
734 "Examine a detailed anaylsis of the contents of all visible drill layers", NULL
);
735 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu
), analyze_active_drill
);
737 analyze_benchmark
= gtk_menu_item_new_with_mnemonic (_("_Benchmark (1 min)"));
738 gtk_tooltips_set_tip (tooltips
, analyze_benchmark
,
739 "Benchmark different rendering methods. Will make the application unresponsive for 1 minute!", NULL
);
740 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu
), analyze_benchmark
);
743 /* Wait and add in for 2.1??
744 control_gerber_options = gtk_menu_item_new_with_mnemonic (_("Control Gerber options..."));
745 gtk_tooltips_set_tip (tooltips, control_gerber_options, "Set which Gerber features should be displayed", NULL);
746 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), control_gerber_options);
748 menuitem_tools
= gtk_menu_item_new_with_mnemonic (_("_Tools"));
749 gtk_container_add (GTK_CONTAINER (menubar1
), menuitem_tools
);
751 menuitem_tools_menu
= gtk_menu_new ();
752 gtk_menu_set_accel_group (GTK_MENU(menuitem_tools_menu
), accel_group
);
753 gtk_menu_set_accel_path (GTK_MENU(menuitem_tools_menu
), ACCEL_TOOLS
);
754 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_tools
), menuitem_tools_menu
);
755 pointer_tool
= gtk_image_menu_item_new_with_mnemonic (_("_Pointer Tool"));
757 GtkWidget *tempImage = gtk_image_new_from_pixbuf (pointerpixbuf);
758 gtk_image_menu_item_set_image ((GtkImageMenuItem *)pointer_tool, tempImage);
760 SET_ACCELS (ACCEL_TOOLS_POINTER
);
761 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu
), pointer_tool
);
762 gtk_tooltips_set_tip (tooltips
, pointer_tool
, "Select objects on the screen", NULL
);
763 pan_tool
= gtk_image_menu_item_new_with_mnemonic ("Pa_n Tool");
765 tempImage = gtk_image_new_from_pixbuf (movepixbuf);
766 gtk_image_menu_item_set_image ((GtkImageMenuItem *)pan_tool, tempImage);
768 SET_ACCELS (ACCEL_TOOLS_PAN
);
769 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu
), pan_tool
);
770 gtk_tooltips_set_tip (tooltips
, pan_tool
, "Pan by left clicking and dragging", NULL
);
772 zoom_tool
= gtk_image_menu_item_new_with_mnemonic (_("_Zoom Tool"));
774 tempImage = gtk_image_new_from_pixbuf (zoompixbuf);
775 gtk_image_menu_item_set_image ((GtkImageMenuItem *)zoom_tool, tempImage);
777 SET_ACCELS (ACCEL_TOOLS_ZOOM
);
778 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu
), zoom_tool
);
779 gtk_tooltips_set_tip (tooltips
, zoom_tool
, "Zoom by left clicking or dragging", NULL
);
781 measure_tool
= gtk_image_menu_item_new_with_mnemonic (_("_Measure Tool"));
783 tempImage = gtk_image_new_from_pixbuf (measurepixbuf);
784 gtk_image_menu_item_set_image ((GtkImageMenuItem *)measure_tool, tempImage);
786 SET_ACCELS (ACCEL_TOOLS_MEASURE
);
787 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu
), measure_tool
);
788 gtk_tooltips_set_tip (tooltips
, measure_tool
, "Measure distances on the screen", NULL
);
790 menuitem_help
= gtk_menu_item_new_with_mnemonic (_("_Help"));
791 gtk_container_add (GTK_CONTAINER (menubar1
), menuitem_help
);
793 menuitem_help_menu
= gtk_menu_new ();
794 gtk_menu_set_accel_group (GTK_MENU(menuitem_help_menu
), accel_group
);
795 gtk_menu_set_accel_path (GTK_MENU(menuitem_help_menu
), ACCEL_HELP
);
796 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_help
), menuitem_help_menu
);
799 online_manual = gtk_menu_item_new_with_mnemonic (_("_Online Manual..."));
800 gtk_container_add (GTK_CONTAINER (menuitem_help_menu), online_manual);
801 gtk_tooltips_set_tip (tooltips, online_manual, "View the online help documentation", NULL);
804 about
= gtk_image_menu_item_new_with_mnemonic (_("_About Gerbv..."));
805 gtk_container_add (GTK_CONTAINER (menuitem_help_menu
), about
);
806 gtk_tooltips_set_tip (tooltips
, about
, "View information about gerbv", NULL
);
807 image34
= gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO
, GTK_ICON_SIZE_MENU
);
808 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (about
), image34
);
810 bugs_menuitem
= gtk_menu_item_new_with_mnemonic (_("Known _bugs in this version..."));
811 gtk_container_add (GTK_CONTAINER (menuitem_help_menu
), bugs_menuitem
);
812 gtk_tooltips_set_tip (tooltips
, bugs_menuitem
, "View list of known gerbv bugs", NULL
);
814 /* Create toolbar (button bar) beneath main menu */
815 toolbar_hbox
= gtk_hbox_new (FALSE
, 0);
816 gtk_box_pack_start (GTK_BOX (vbox1
), toolbar_hbox
, FALSE
, FALSE
, 0);
818 handlebox
= gtk_handle_box_new ();
820 gtk_box_pack_start (GTK_BOX (toolbar_hbox
), handlebox
, TRUE
, TRUE
, 0);
822 button_toolbar
= gtk_toolbar_new ();
823 gtk_widget_set_size_request (button_toolbar
, 500, -1);
824 gtk_container_add (GTK_CONTAINER (handlebox
), button_toolbar
);
825 gtk_toolbar_set_style (GTK_TOOLBAR (button_toolbar
), GTK_TOOLBAR_ICONS
);
826 tmp_toolbar_icon_size
= gtk_toolbar_get_icon_size (GTK_TOOLBAR (button_toolbar
));
828 toolbutton_new
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_NEW
);
829 gtk_tooltips_set_tip (tooltips
, toolbutton_new
, "Close all layers and start a new project", NULL
);
830 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_new
);
832 toolbutton_open
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_OPEN
);
833 gtk_tooltips_set_tip (tooltips
, toolbutton_open
, "Open a previously saved gerbv project", NULL
);
834 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_open
);
836 toolbutton_revert
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED
);
837 gtk_tooltips_set_tip (tooltips
, toolbutton_revert
, "Reload all layers in project", NULL
);
838 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_revert
);
840 toolbutton_save
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_SAVE
);
841 gtk_tooltips_set_tip (tooltips
, toolbutton_save
, "Save the current project", NULL
);
842 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_save
);
844 separatortoolitem1
= (GtkWidget
*) gtk_separator_tool_item_new ();
845 gtk_container_add (GTK_CONTAINER (button_toolbar
), separatortoolitem1
);
846 #if GTK_CHECK_VERSION(2,10,0)
847 toolbutton_print
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_PRINT
);
848 gtk_tooltips_set_tip (tooltips
, toolbutton_print
, "Print the visible layers", NULL
);
849 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_print
);
851 separatortoolitem2
= (GtkWidget
*) gtk_separator_tool_item_new ();
852 gtk_container_add (GTK_CONTAINER (button_toolbar
), separatortoolitem2
);
854 toolbutton_zoom_in
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_IN
);
855 gtk_tooltips_set_tip (tooltips
, toolbutton_zoom_in
, "Zoom in", NULL
);
856 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_zoom_in
);
858 toolbutton_zoom_out
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_OUT
);
859 gtk_tooltips_set_tip (tooltips
, toolbutton_zoom_out
, "Zoom out", NULL
);
860 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_zoom_out
);
862 toolbutton_zoom_fit
= (GtkWidget
*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_FIT
);
863 gtk_tooltips_set_tip (tooltips
, toolbutton_zoom_fit
, "Zoom to fit all visible layers in the window", NULL
);
864 gtk_container_add (GTK_CONTAINER (button_toolbar
), toolbutton_zoom_fit
);
866 /* Turn these on later when we have icons for these buttons */
868 separatortoolitem3 = (GtkWidget*) gtk_separator_tool_item_new ();
869 gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem3);
871 toolbutton_analyze = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
872 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_analyze);
874 toolbutton_validate = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
875 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_validate);
877 toolbutton_control = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
878 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_control);
881 separatortoolitem4
= (GtkWidget
*) gtk_separator_tool_item_new ();
882 gtk_container_add (GTK_CONTAINER (button_toolbar
), separatortoolitem4
);
883 toggletoolbutton_pointer
= (GtkWidget
*) gtk_toggle_tool_button_new();
884 pointerimage
= gtk_image_new_from_pixbuf(pointerpixbuf
);
885 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_pointer
),
887 gtk_tooltips_set_tip (tooltips
, toggletoolbutton_pointer
, "Select objects on the screen", NULL
);
888 gtk_container_add (GTK_CONTAINER (button_toolbar
), toggletoolbutton_pointer
);
889 toggletoolbutton_pan
= (GtkWidget
*) gtk_toggle_tool_button_new();
890 moveimage
= gtk_image_new_from_pixbuf(movepixbuf
);
891 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_pan
),
893 gtk_tooltips_set_tip (tooltips
, toggletoolbutton_pan
, "Pan by left clicking and dragging", NULL
);
894 gtk_container_add (GTK_CONTAINER (button_toolbar
), toggletoolbutton_pan
);
897 toggletoolbutton_zoom
= (GtkWidget
*) gtk_toggle_tool_button_new();
898 zoomimage
= gtk_image_new_from_pixbuf(zoompixbuf
);
899 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_zoom
),
901 gtk_tooltips_set_tip (tooltips
, toggletoolbutton_zoom
, "Zoom by left clicking or dragging", NULL
);
902 gtk_container_add (GTK_CONTAINER (button_toolbar
), toggletoolbutton_zoom
);
904 toggletoolbutton_measure
= (GtkWidget
*) gtk_toggle_tool_button_new();
905 measureimage
= gtk_image_new_from_pixbuf(measurepixbuf
);
906 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_measure
),
908 gtk_tooltips_set_tip (tooltips
, toggletoolbutton_measure
, "Measure distances on the screen", NULL
);
909 gtk_container_add (GTK_CONTAINER (button_toolbar
), toggletoolbutton_measure
);
911 hpaned1
= gtk_hpaned_new ();
912 gtk_box_pack_start (GTK_BOX (vbox1
), hpaned1
, TRUE
, TRUE
, 0);
913 gtk_paned_set_position (GTK_PANED (hpaned1
), 225);
915 sidepane_vbox
= gtk_vbox_new (FALSE
, 0);
916 gtk_widget_set_size_request (sidepane_vbox
, 150, -1);
918 gtk_paned_pack1 (GTK_PANED (hpaned1
), sidepane_vbox
, TRUE
, FALSE
);
919 gtk_container_set_border_width (GTK_CONTAINER (sidepane_vbox
), 5);
921 sidepane_notebook
= gtk_notebook_new ();
922 gtk_widget_set_size_request (sidepane_notebook
, 100, -1);
923 gtk_box_pack_start (GTK_BOX (sidepane_vbox
), sidepane_notebook
, TRUE
, TRUE
, 0);
925 vbox10
= gtk_vbox_new (FALSE
, 3);
926 gtk_container_add (GTK_CONTAINER (sidepane_notebook
), vbox10
);
927 gtk_widget_set_size_request (vbox10
, 82, -1);
928 gtk_container_set_border_width (GTK_CONTAINER (vbox10
), 4);
930 hbox4
= gtk_hbox_new (FALSE
, 0);
931 gtk_box_pack_start (GTK_BOX (vbox10
), hbox4
, FALSE
, FALSE
, 0);
933 label1
= gtk_label_new (_("Rendering: "));
934 gtk_box_pack_start (GTK_BOX (hbox4
), label1
, FALSE
, FALSE
, 0);
936 render_combobox
= gtk_combo_box_new_text ();
937 gtk_box_pack_start (GTK_BOX (hbox4
), render_combobox
, TRUE
, TRUE
, 0);
939 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox
), _("Fast"));
940 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox
), _("Fast, with XOR"));
941 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox
), _("Normal"));
942 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox
), _("High quality"));
943 if (screenRenderInfo
.renderType
< GERBV_RENDER_TYPE_MAX
)
944 gtk_combo_box_set_active (GTK_COMBO_BOX (render_combobox
), screenRenderInfo
.renderType
);
946 scrolledwindow1
= gtk_scrolled_window_new (NULL
, NULL
);
947 gtk_box_pack_start (GTK_BOX (vbox10
), scrolledwindow1
, TRUE
, TRUE
, 0);
948 gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow1
), 2);
949 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1
),
950 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
951 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1
),
954 hbox1
= gtk_hbox_new (TRUE
, 0);
955 gtk_box_pack_start (GTK_BOX (vbox10
), hbox1
, FALSE
, FALSE
, 0);
957 button4
= gtk_button_new ();
958 gtk_box_pack_start (GTK_BOX (hbox1
), button4
, FALSE
, TRUE
, 0);
960 image8
= gtk_image_new_from_stock (GTK_STOCK_ADD
, GTK_ICON_SIZE_BUTTON
);
961 gtk_container_add (GTK_CONTAINER (button4
), image8
);
963 button5
= gtk_button_new ();
964 gtk_box_pack_start (GTK_BOX (hbox1
), button5
, FALSE
, TRUE
, 0);
966 image9
= gtk_image_new_from_stock (GTK_STOCK_GO_DOWN
, GTK_ICON_SIZE_BUTTON
);
967 gtk_container_add (GTK_CONTAINER (button5
), image9
);
969 button6
= gtk_button_new ();
970 gtk_box_pack_start (GTK_BOX (hbox1
), button6
, FALSE
, TRUE
, 0);
972 image10
= gtk_image_new_from_stock (GTK_STOCK_GO_UP
, GTK_ICON_SIZE_BUTTON
);
973 gtk_container_add (GTK_CONTAINER (button6
), image10
);
975 button7
= gtk_button_new ();
976 gtk_box_pack_start (GTK_BOX (hbox1
), button7
, FALSE
, TRUE
, 0);
978 image11
= gtk_image_new_from_stock (GTK_STOCK_REMOVE
, GTK_ICON_SIZE_BUTTON
);
979 gtk_container_add (GTK_CONTAINER (button7
), image11
);
981 Layer_label
= gtk_label_new (_("Layers"));
982 gtk_notebook_set_tab_label (GTK_NOTEBOOK (sidepane_notebook
),
983 gtk_notebook_get_nth_page (GTK_NOTEBOOK (sidepane_notebook
), 0),
986 vbox11
= gtk_vbox_new (FALSE
, 2);
987 gtk_container_add (GTK_CONTAINER (sidepane_notebook
), vbox11
);
988 gtk_container_set_border_width (GTK_CONTAINER (vbox11
), 3);
990 messages_scrolledwindow
= gtk_scrolled_window_new (NULL
, NULL
);
991 gtk_box_pack_start (GTK_BOX (vbox11
), messages_scrolledwindow
, TRUE
, TRUE
, 0);
992 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (messages_scrolledwindow
),
993 GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
995 message_textview
= gtk_text_view_new ();
996 gtk_container_add (GTK_CONTAINER (messages_scrolledwindow
), message_textview
);
997 gtk_text_view_set_editable (GTK_TEXT_VIEW (message_textview
), FALSE
);
998 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (message_textview
), GTK_WRAP_WORD
);
999 gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (message_textview
), FALSE
);
1001 clear_messages_button
= gtk_button_new_from_stock (GTK_STOCK_CLEAR
);
1002 gtk_box_pack_start (GTK_BOX (vbox11
), clear_messages_button
, FALSE
, FALSE
, 0);
1004 Message_label
= gtk_label_new (_("Messages"));
1005 gtk_notebook_set_tab_label (GTK_NOTEBOOK (sidepane_notebook
),
1006 gtk_notebook_get_nth_page (GTK_NOTEBOOK (sidepane_notebook
), 1),
1009 vbox2
= gtk_vbox_new (FALSE
, 4);
1010 gtk_paned_pack2 (GTK_PANED (hpaned1
), vbox2
, TRUE
, FALSE
);
1011 gtk_container_set_border_width (GTK_CONTAINER (vbox2
), 4);
1013 main_view_table
= gtk_table_new (3, 3, FALSE
);
1014 gtk_box_pack_start (GTK_BOX (vbox2
), main_view_table
, TRUE
, TRUE
, 0);
1016 hRuler
= gtk_hruler_new ();
1017 gtk_table_attach (GTK_TABLE (main_view_table
), hRuler
, 1, 2, 0, 1,
1018 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
1019 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
1020 gtk_ruler_set_range (GTK_RULER (hRuler
), 0, 100, 8.56051, 1000);
1022 vRuler
= gtk_vruler_new ();
1023 gtk_table_attach (GTK_TABLE (main_view_table
), vRuler
, 0, 1, 1, 2,
1024 (GtkAttachOptions
) (GTK_FILL
),
1025 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), 0, 0);
1026 gtk_ruler_set_range (GTK_RULER (vRuler
), 0, 100, 8.37341, 1000);
1028 drawingarea
= gtk_drawing_area_new();
1029 gtk_table_attach (GTK_TABLE (main_view_table
), drawingarea
, 1, 2, 1, 2,
1030 (GtkAttachOptions
) (GTK_FILL
),
1031 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), 0, 0);
1033 hAdjustment
= (GtkWidget
*) gtk_adjustment_new (0.0, -1000.0, 1000.0, 1000.0, 1000.0, 500.0);
1034 vAdjustment
= (GtkWidget
*) gtk_adjustment_new (0.0, -1000.0, 1000.0, 1000.0, 1000.0, 500.0);
1036 hScrollbar
= gtk_hscrollbar_new (GTK_ADJUSTMENT (hAdjustment
));
1037 gtk_table_attach (GTK_TABLE (main_view_table
), hScrollbar
, 1, 2, 2, 3,
1038 (GtkAttachOptions
) (GTK_FILL
),
1039 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
1041 vScrollbar
= gtk_vscrollbar_new (GTK_ADJUSTMENT (vAdjustment
));
1042 gtk_table_attach (GTK_TABLE (main_view_table
), vScrollbar
, 2, 3, 1, 2,
1043 (GtkAttachOptions
) (GTK_FILL
),
1044 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
1046 hbox5
= gtk_hbox_new (FALSE
, 10);
1047 gtk_box_pack_start (GTK_BOX (vbox2
), hbox5
, FALSE
, FALSE
, 0);
1049 statusbar_label_left
= gtk_label_new ("( 0.0, 0.0 )");
1050 gtk_box_pack_start (GTK_BOX (hbox5
), statusbar_label_left
, FALSE
, FALSE
, 0);
1051 gtk_widget_set_size_request (statusbar_label_left
, 130, -1);
1052 gtk_label_set_justify ((GtkLabel
*) statusbar_label_left
, GTK_JUSTIFY_RIGHT
);
1054 statusUnitComboBox
= gtk_combo_box_new_text ();
1055 gtk_box_pack_start (GTK_BOX (hbox5
), statusUnitComboBox
, FALSE
, FALSE
, 0);
1056 gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox
), _("mil"));
1057 gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox
), _("mm"));
1058 gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox
), _("in"));
1060 statusbar_label_right
= gtk_label_new (_(""));
1061 gtk_box_pack_start (GTK_BOX (hbox5
), statusbar_label_right
, TRUE
, TRUE
, 0);
1062 gtk_label_set_ellipsize ((GtkLabel
*)statusbar_label_right
, PANGO_ELLIPSIZE_END
);
1063 gtk_misc_set_alignment (GTK_MISC (statusbar_label_right
), 0, 0.5);
1068 * Connect signals to widgets
1071 /* --- File menu --- */
1072 g_signal_connect ((gpointer
) new, "activate",
1073 G_CALLBACK (callbacks_new_activate
),
1075 g_signal_connect ((gpointer
) open_project
, "activate",
1076 G_CALLBACK (callbacks_open_project_activate
),
1078 g_signal_connect ((gpointer
) open_layer
, "activate",
1079 G_CALLBACK (callbacks_open_layer_activate
),
1081 g_signal_connect ((gpointer
) revert
, "activate",
1082 G_CALLBACK (callbacks_revert_activate
),
1084 g_signal_connect ((gpointer
) save_layer
, "activate",
1085 G_CALLBACK (callbacks_save_layer_activate
),
1087 g_signal_connect ((gpointer
) save_as_layer
, "activate",
1088 G_CALLBACK (callbacks_generic_save_activate
),
1089 (gpointer
) CALLBACKS_SAVE_LAYER_AS
);
1090 g_signal_connect ((gpointer
) save
, "activate",
1091 G_CALLBACK (callbacks_save_project_activate
),
1093 g_signal_connect ((gpointer
) save_as
, "activate",
1094 G_CALLBACK (callbacks_generic_save_activate
),
1095 (gpointer
) CALLBACKS_SAVE_PROJECT_AS
);
1096 g_signal_connect ((gpointer
) png
, "activate",
1097 G_CALLBACK (callbacks_generic_save_activate
),
1098 (gpointer
) CALLBACKS_SAVE_FILE_PNG
);
1100 g_signal_connect ((gpointer
) pdf
, "activate",
1101 G_CALLBACK (callbacks_generic_save_activate
),
1102 (gpointer
) CALLBACKS_SAVE_FILE_PDF
);
1103 g_signal_connect ((gpointer
) svg
, "activate",
1104 G_CALLBACK (callbacks_generic_save_activate
),
1105 (gpointer
) CALLBACKS_SAVE_FILE_SVG
);
1106 g_signal_connect ((gpointer
) postscript
, "activate",
1107 G_CALLBACK (callbacks_generic_save_activate
),
1108 (gpointer
) CALLBACKS_SAVE_FILE_PS
);
1109 g_signal_connect ((gpointer
) rs274x
, "activate",
1110 G_CALLBACK (callbacks_generic_save_activate
),
1111 (gpointer
) CALLBACKS_SAVE_FILE_RS274X
);
1112 g_signal_connect ((gpointer
) drill
, "activate",
1113 G_CALLBACK (callbacks_generic_save_activate
),
1114 (gpointer
) CALLBACKS_SAVE_FILE_DRILL
);
1115 g_signal_connect ((gpointer
) rs274xm
, "activate",
1116 G_CALLBACK (callbacks_generic_save_activate
),
1117 (gpointer
) CALLBACKS_SAVE_FILE_RS274XM
);
1118 g_signal_connect ((gpointer
) drillm
, "activate",
1119 G_CALLBACK (callbacks_generic_save_activate
),
1120 (gpointer
) CALLBACKS_SAVE_FILE_DRILLM
);
1122 #if GTK_CHECK_VERSION(2,10,0)
1123 g_signal_connect ((gpointer
) print
, "activate",
1124 G_CALLBACK (callbacks_print_activate
),
1127 g_signal_connect ((gpointer
) quit
, "activate",
1128 G_CALLBACK (callbacks_quit_activate
),
1131 /* --- Edit menu --- */
1132 g_signal_connect ((gpointer
) delete_selected
, "activate",
1133 G_CALLBACK (callbacks_delete_objects_clicked
),
1135 g_signal_connect ((gpointer
) properties_selected
, "activate",
1136 G_CALLBACK (callbacks_display_object_properties_clicked
),
1139 /* --- View menu --- */
1140 g_signal_connect ((gpointer
) view_fullscreen
, "activate",
1141 G_CALLBACK (callbacks_fullscreen_toggled
),
1142 GINT_TO_POINTER(0));
1143 g_signal_connect ((gpointer
) show_toolbar
, "toggled",
1144 G_CALLBACK (callbacks_show_toolbar_toggled
),
1146 g_signal_connect ((gpointer
) show_sidepane
, "toggled",
1147 G_CALLBACK (callbacks_show_sidepane_toggled
),
1149 g_signal_connect ((gpointer
) toggle_layer_visibility_item1
, "activate",
1150 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1151 GINT_TO_POINTER(0));
1152 g_signal_connect ((gpointer
) toggle_layer_visibility_item2
, "activate",
1153 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1154 GINT_TO_POINTER(1));
1155 g_signal_connect ((gpointer
) toggle_layer_visibility_item3
, "activate",
1156 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1157 GINT_TO_POINTER(2));
1158 g_signal_connect ((gpointer
) toggle_layer_visibility_item4
, "activate",
1159 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1160 GINT_TO_POINTER(3));
1161 g_signal_connect ((gpointer
) toggle_layer_visibility_item5
, "activate",
1162 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1163 GINT_TO_POINTER(4));
1164 g_signal_connect ((gpointer
) toggle_layer_visibility_item6
, "activate",
1165 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1166 GINT_TO_POINTER(5));
1167 g_signal_connect ((gpointer
) toggle_layer_visibility_item7
, "activate",
1168 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1169 GINT_TO_POINTER(6));
1170 g_signal_connect ((gpointer
) toggle_layer_visibility_item8
, "activate",
1171 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1172 GINT_TO_POINTER(7));
1173 g_signal_connect ((gpointer
) toggle_layer_visibility_item9
, "activate",
1174 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1175 GINT_TO_POINTER(8));
1176 g_signal_connect ((gpointer
) toggle_layer_visibility_item10
, "activate",
1177 G_CALLBACK (callbacks_toggle_layer_visibility_activate
),
1178 GINT_TO_POINTER(9));
1179 g_signal_connect ((gpointer
) zoom_in
, "activate",
1180 G_CALLBACK (callbacks_zoom_in_activate
),
1182 g_signal_connect ((gpointer
) zoom_out
, "activate",
1183 G_CALLBACK (callbacks_zoom_out_activate
),
1185 g_signal_connect ((gpointer
) fit_to_window
, "activate",
1186 G_CALLBACK (callbacks_fit_to_window_activate
),
1188 g_signal_connect ((gpointer
) backgroundColor
, "activate",
1189 G_CALLBACK (callbacks_change_background_color_clicked
),
1191 g_signal_connect ((gpointer
) unit_mil
, "activate",
1192 G_CALLBACK (callbacks_viewmenu_units_changed
),
1193 GINT_TO_POINTER(GERBV_MILS
));
1194 g_signal_connect ((gpointer
) unit_mm
, "activate",
1195 G_CALLBACK (callbacks_viewmenu_units_changed
),
1196 GINT_TO_POINTER(GERBV_MMS
));
1197 g_signal_connect ((gpointer
) unit_in
, "activate",
1198 G_CALLBACK (callbacks_viewmenu_units_changed
),
1199 GINT_TO_POINTER(GERBV_INS
));
1201 /* --- Current Layer menu --- */
1202 g_signal_connect ((gpointer
) layer_visibility
, "activate", G_CALLBACK (callbacks_toggle_layer_visibility_activate
), GINT_TO_POINTER(-1));
1203 g_signal_connect ((gpointer
) layer_invert
, "activate", G_CALLBACK (callbacks_invert_layer_clicked
), NULL
);
1204 g_signal_connect ((gpointer
) layer_color
, "activate", G_CALLBACK (callbacks_change_layer_color_clicked
), NULL
);
1205 g_signal_connect ((gpointer
) layer_reload
, "activate", G_CALLBACK (callbacks_reload_layer_clicked
), NULL
);
1206 g_signal_connect ((gpointer
) layer_orientation
, "activate", G_CALLBACK (callbacks_change_layer_orientation_clicked
), NULL
);
1207 g_signal_connect ((gpointer
) layer_format
, "activate", G_CALLBACK (callbacks_change_layer_format_clicked
), NULL
);
1208 g_signal_connect ((gpointer
) layer_remove
, "activate", G_CALLBACK (callbacks_remove_layer_button_clicked
), NULL
);
1209 g_signal_connect ((gpointer
) layer_up
, "activate", G_CALLBACK (callbacks_move_layer_up_menu_activate
), NULL
);
1210 g_signal_connect ((gpointer
) layer_down
, "activate", G_CALLBACK (callbacks_move_layer_down_menu_activate
), NULL
);
1212 /* --- Analyze menu --- */
1213 g_signal_connect ((gpointer
) analyze_active_gerbers
, "activate",
1214 G_CALLBACK (callbacks_analyze_active_gerbers_activate
),
1216 g_signal_connect ((gpointer
) analyze_active_drill
, "activate",
1217 G_CALLBACK (callbacks_analyze_active_drill_activate
),
1219 g_signal_connect ((gpointer
) analyze_benchmark
, "activate",
1220 G_CALLBACK (callbacks_benchmark_clicked
),
1225 g_signal_connect ((gpointer) control_gerber_options, "activate",
1226 G_CALLBACK (callbacks_control_gerber_options_activate),
1230 /* --- Tools menu --- */
1231 g_signal_connect ((gpointer
) pointer_tool
, "activate",
1232 G_CALLBACK (callbacks_change_tool
), (gpointer
) 0);
1233 g_signal_connect ((gpointer
) pan_tool
, "activate",
1234 G_CALLBACK (callbacks_change_tool
), (gpointer
) 1);
1235 g_signal_connect ((gpointer
) zoom_tool
, "activate",
1236 G_CALLBACK (callbacks_change_tool
), (gpointer
) 2);
1237 g_signal_connect ((gpointer
) measure_tool
, "activate",
1238 G_CALLBACK (callbacks_change_tool
), (gpointer
) 3);
1240 /* --- Help menu --- */
1242 g_signal_connect ((gpointer) online_manual, "activate",
1243 G_CALLBACK (callbacks_online_manual_activate),
1246 g_signal_connect ((gpointer
) about
, "activate",
1247 G_CALLBACK (callbacks_about_activate
),
1250 g_signal_connect ((gpointer
) bugs_menuitem
, "activate",
1251 G_CALLBACK (callbacks_bugs_activate
),
1254 /* End of Glade generated code */
1255 g_signal_connect ((gpointer
) toolbutton_new
, "clicked",
1256 G_CALLBACK (callbacks_new_activate
),
1258 g_signal_connect ((gpointer
) toolbutton_save
, "clicked",
1259 G_CALLBACK (callbacks_save_project_activate
),
1261 g_signal_connect ((gpointer
) toolbutton_open
, "clicked",
1262 G_CALLBACK (callbacks_open_project_activate
),
1264 g_signal_connect ((gpointer
) toolbutton_revert
, "clicked",
1265 G_CALLBACK (callbacks_revert_activate
),
1267 g_signal_connect ((gpointer
) clear_messages_button
, "clicked",
1268 G_CALLBACK (callbacks_clear_messages_button_clicked
),
1270 #if GTK_CHECK_VERSION(2,10,0)
1271 g_signal_connect ((gpointer
) toolbutton_print
, "clicked",
1272 G_CALLBACK (callbacks_print_activate
),
1275 g_signal_connect ((gpointer
) toolbutton_zoom_in
, "clicked",
1276 G_CALLBACK (callbacks_zoom_in_activate
),
1278 g_signal_connect ((gpointer
) toolbutton_zoom_out
, "clicked",
1279 G_CALLBACK (callbacks_zoom_out_activate
),
1281 g_signal_connect ((gpointer
) toolbutton_zoom_fit
, "clicked",
1282 G_CALLBACK (callbacks_fit_to_window_activate
),
1284 g_signal_connect ((gpointer
) toggletoolbutton_pointer
, "clicked",
1285 G_CALLBACK (callbacks_change_tool
), (gpointer
) 0);
1286 g_signal_connect ((gpointer
) toggletoolbutton_pan
, "clicked",
1287 G_CALLBACK (callbacks_change_tool
), (gpointer
) 1);
1288 g_signal_connect ((gpointer
) toggletoolbutton_zoom
, "clicked",
1289 G_CALLBACK (callbacks_change_tool
), (gpointer
) 2);
1290 g_signal_connect ((gpointer
) toggletoolbutton_measure
, "clicked",
1291 G_CALLBACK (callbacks_change_tool
), (gpointer
) 3);
1293 g_signal_connect ((gpointer
) statusUnitComboBox
, "changed",
1294 G_CALLBACK (callbacks_statusbar_unit_combo_box_changed
),
1297 g_signal_connect ((gpointer
) button4
, "clicked",
1298 G_CALLBACK (callbacks_add_layer_button_clicked
), NULL
);
1299 g_signal_connect ((gpointer
) button7
, "clicked",
1300 G_CALLBACK (callbacks_remove_layer_button_clicked
), NULL
);
1301 g_signal_connect ((gpointer
) button5
, "clicked",
1302 G_CALLBACK (callbacks_move_layer_down_button_clicked
), NULL
);
1303 g_signal_connect ((gpointer
) button6
, "clicked",
1304 G_CALLBACK (callbacks_move_layer_up_button_clicked
), NULL
);
1306 g_signal_connect ((gpointer
) hAdjustment
, "value-changed",
1307 G_CALLBACK (callbacks_hadjustment_value_changed
), NULL
);
1308 g_signal_connect ((gpointer
) vAdjustment
, "value-changed",
1309 G_CALLBACK (callbacks_vadjustment_value_changed
), NULL
);
1310 g_signal_connect ((gpointer
) hScrollbar
, "button-press-event",
1311 G_CALLBACK (callbacks_scrollbar_button_pressed
), NULL
);
1312 g_signal_connect ((gpointer
) hScrollbar
, "button-release-event",
1313 G_CALLBACK (callbacks_scrollbar_button_released
), NULL
);
1314 g_signal_connect ((gpointer
) vScrollbar
, "button-press-event",
1315 G_CALLBACK (callbacks_scrollbar_button_pressed
), NULL
);
1316 g_signal_connect ((gpointer
) vScrollbar
, "button-release-event",
1317 G_CALLBACK (callbacks_scrollbar_button_released
), NULL
);
1320 if (screen
.unit
== GERBV_MILS
)
1321 gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox
), 0);
1322 else if (screen
.unit
== GERBV_MMS
)
1323 gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox
), 1);
1325 gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox
), 2);
1329 gtk_window_add_accel_group (GTK_WINDOW (mainWindow
), accel_group
);
1331 GtkListStore
*list_store
;
1333 list_store
= gtk_list_store_new (4, G_TYPE_BOOLEAN
,
1334 GDK_TYPE_PIXBUF
, G_TYPE_STRING
, G_TYPE_STRING
);
1338 tree
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store
));
1339 GtkCellRenderer
*renderer
;
1340 GtkTreeViewColumn
*column
;
1342 renderer
= gtk_cell_renderer_toggle_new ();
1343 column
= gtk_tree_view_column_new_with_attributes ("Visible",
1347 gtk_tree_view_column_set_min_width ((GtkTreeViewColumn
*)column
,25);
1348 gtk_signal_connect(GTK_OBJECT(renderer
), "toggled",
1349 GTK_SIGNAL_FUNC(callbacks_layer_tree_visibility_button_toggled
), NULL
);
1350 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1352 renderer
= gtk_cell_renderer_pixbuf_new ();
1353 column
= gtk_tree_view_column_new_with_attributes ("Color",
1356 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1358 renderer
= gtk_cell_renderer_text_new ();
1359 g_object_set (G_OBJECT (renderer
), "foreground", "red", "xalign", 0.5,
1360 "family", "Times", "size-points", 12.0, NULL
);
1361 column
= gtk_tree_view_column_new_with_attributes ("Modified",
1365 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1366 gtk_tree_view_column_set_min_width ((GtkTreeViewColumn
*)column
,20);
1368 renderer
= gtk_cell_renderer_text_new ();
1369 column
= gtk_tree_view_column_new_with_attributes ("Name",
1373 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1375 gtk_tree_view_set_headers_visible ((GtkTreeView
*)tree
, FALSE
);
1376 gtk_signal_connect(GTK_OBJECT(tree
), "key-press-event",
1377 GTK_SIGNAL_FUNC(callbacks_layer_tree_key_press
), NULL
);
1378 gtk_signal_connect(GTK_OBJECT(tree
), "button-press-event",
1379 GTK_SIGNAL_FUNC(callbacks_layer_tree_button_press
), NULL
);
1380 gtk_container_add (GTK_CONTAINER (scrolledwindow1
), tree
);
1382 GtkTreeSelection
*selection
;
1383 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(tree
));
1384 gtk_tree_selection_set_mode (selection
, GTK_SELECTION_BROWSE
);
1385 gtk_tree_view_set_enable_search (GTK_TREE_VIEW (tree
), FALSE
);
1386 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (tree
), TRUE
);
1388 g_signal_connect (G_OBJECT(list_store
), "row-inserted",
1389 G_CALLBACK (callbacks_layer_tree_row_inserted
), NULL
);
1390 /* steal the focus to the tree to make sure none of the buttons are focused */
1391 gtk_widget_grab_focus (tree
);
1393 * Connect all events on drawing area
1395 gtk_signal_connect(GTK_OBJECT(drawingarea
), "expose_event",
1396 GTK_SIGNAL_FUNC(callbacks_drawingarea_expose_event
), NULL
);
1397 gtk_signal_connect(GTK_OBJECT(drawingarea
),"configure_event",
1398 GTK_SIGNAL_FUNC(callbacks_drawingarea_configure_event
), NULL
);
1399 gtk_signal_connect(GTK_OBJECT(drawingarea
), "motion_notify_event",
1400 GTK_SIGNAL_FUNC(callbacks_drawingarea_motion_notify_event
), NULL
);
1401 gtk_signal_connect(GTK_OBJECT(drawingarea
), "button_press_event",
1402 GTK_SIGNAL_FUNC(callbacks_drawingarea_button_press_event
), NULL
);
1403 gtk_signal_connect(GTK_OBJECT(drawingarea
), "button_release_event",
1404 GTK_SIGNAL_FUNC(callbacks_drawingarea_button_release_event
), NULL
);
1405 gtk_signal_connect_after(GTK_OBJECT(mainWindow
), "key_press_event",
1406 GTK_SIGNAL_FUNC(callbacks_window_key_press_event
), NULL
);
1407 gtk_signal_connect_after(GTK_OBJECT(mainWindow
), "key_release_event",
1408 GTK_SIGNAL_FUNC(callbacks_window_key_release_event
), NULL
);
1409 gtk_signal_connect_after(GTK_OBJECT(mainWindow
), "scroll_event",
1410 GTK_SIGNAL_FUNC(callbacks_window_scroll_event
), NULL
);
1411 gtk_signal_connect_after(GTK_OBJECT(mainWindow
), "delete_event",
1412 GTK_SIGNAL_FUNC(callbacks_quit_activate
), NULL
);
1414 gtk_widget_set_events(drawingarea
, GDK_EXPOSURE_MASK
1415 | GDK_LEAVE_NOTIFY_MASK
1416 | GDK_ENTER_NOTIFY_MASK
1417 | GDK_BUTTON_PRESS_MASK
1418 | GDK_BUTTON_RELEASE_MASK
1419 | GDK_KEY_PRESS_MASK
1420 | GDK_KEY_RELEASE_MASK
1421 | GDK_POINTER_MOTION_MASK
1422 | GDK_POINTER_MOTION_HINT_MASK
1427 * Set gtk error log handler
1429 g_log_set_handler (NULL
,
1430 G_LOG_FLAG_FATAL
| G_LOG_FLAG_RECURSION
| G_LOG_LEVEL_MASK
,
1431 callbacks_handle_log_messages
, NULL
);
1434 * Setup some GTK+ defaults.
1435 * These should really be somewhere else.
1437 GdkColor zoom_outline_color
= {0, 50000, 50000, 50000};
1438 GdkColor dist_measure_color
= {0, 60000, 30000, 65000};
1439 GdkColor selection_color
= {0, 65000, 65000, 65000};
1441 screen
.zoom_outline_color
= zoom_outline_color
;
1442 screen
.dist_measure_color
= dist_measure_color
;
1443 screen
.selection_color
= selection_color
;
1445 screen
.drawing_area
= drawingarea
;
1446 screen
.win
.hAdjustment
= hAdjustment
;
1447 screen
.win
.vAdjustment
= vAdjustment
;
1448 screen
.win
.hRuler
= hRuler
;
1449 screen
.win
.vRuler
= vRuler
;
1450 screen
.win
.sidepane_notebook
= sidepane_notebook
;
1451 screen
.win
.sidepaneRenderComboBox
= GTK_COMBO_BOX(render_combobox
);
1452 screen
.win
.toolButtonPointer
= toggletoolbutton_pointer
;
1453 screen
.win
.toolButtonPan
= toggletoolbutton_pan
;
1454 screen
.win
.toolButtonZoom
= toggletoolbutton_zoom
;
1455 screen
.win
.toolButtonMeasure
= toggletoolbutton_measure
;
1457 /* make sure tooltips show on gtk <2.12 systems */
1458 gtk_tooltips_enable (tooltips
);
1460 * Good defaults according to Ales. Gives aspect ratio of 1.3333...
1462 if ((req_width
!= -1) && (req_height
!= -1)) {
1464 height
= req_height
;
1470 screen
= gdk_screen_get_default();
1471 nmonitors
= gdk_screen_get_n_monitors(screen
);
1473 width
= gdk_screen_get_width(screen
) * 3/4 / nmonitors
;
1474 height
= gdk_screen_get_height(screen
) * 3/4 / nmonitors
;
1477 gtk_window_set_default_size((GtkWindow
*)mainWindow
, width
, height
);
1479 GtkSettings
* gtksettings
= gtk_settings_get_default ();
1480 g_object_set (G_OBJECT(gtksettings
), "gtk-can-change-accels", TRUE
, NULL
);
1481 interface_load_accels ();
1482 gtk_widget_show_all (mainWindow
);
1483 screen
.win
.topLevelWindow
= mainWindow
;
1484 screen
.win
.messageTextView
= message_textview
;
1485 screen
.win
.statusMessageLeft
= statusbar_label_left
;
1486 screen
.win
.statusMessageRight
= statusbar_label_right
;
1487 screen
.win
.statusUnitComboBox
= statusUnitComboBox
;
1488 screen
.win
.layerTree
= tree
;
1489 screen
.win
.treeIsUpdating
= FALSE
;
1491 screen
.selectionInfo
.selectedNodeArray
= g_array_new (FALSE
,
1492 FALSE
, sizeof(gerbv_selection_item_t
));
1493 callbacks_change_tool (NULL
, (gpointer
) 0);
1494 rename_main_window("",mainWindow
);
1496 set_window_icon (mainWindow
);
1497 callbacks_update_layer_tree ();
1499 /* connect this signals as late as possible to avoid triggering them before
1501 g_signal_connect ((gpointer
) render_fast
, "activate",
1502 G_CALLBACK (callbacks_viewmenu_rendertype_changed
),
1503 GINT_TO_POINTER(GERBV_RENDER_TYPE_GDK
));
1504 g_signal_connect ((gpointer
) render_fast_xor
, "activate",
1505 G_CALLBACK (callbacks_viewmenu_rendertype_changed
),
1506 GINT_TO_POINTER(GERBV_RENDER_TYPE_GDK_XOR
));
1507 g_signal_connect ((gpointer
) render_normal
, "activate",
1508 G_CALLBACK (callbacks_viewmenu_rendertype_changed
),
1509 GINT_TO_POINTER(GERBV_RENDER_TYPE_CAIRO_NORMAL
));
1510 g_signal_connect ((gpointer
) render_hq
, "activate",
1511 G_CALLBACK (callbacks_viewmenu_rendertype_changed
),
1512 GINT_TO_POINTER(GERBV_RENDER_TYPE_CAIRO_HIGH_QUALITY
));
1513 g_signal_connect ((gpointer
) render_combobox
, "changed",
1514 G_CALLBACK (callbacks_sidepane_render_type_combo_box_changed
),
1517 interface_save_accels ();
1520 /* ---------------------------------------------------- */
1522 interface_set_render_type (int t
)
1524 if (t
>= GERBV_RENDER_TYPE_MAX
)
1527 screenRenderInfo
.renderType
= t
;
1529 /* make sure the interface is already up before calling
1530 * gtk_combo_box_set_active()
1532 if (!screen
.win
.sidepaneRenderComboBox
)
1535 gtk_combo_box_set_active (GTK_COMBO_BOX (screen
.win
.sidepaneRenderComboBox
), t
);
1536 gtk_check_menu_item_set_active (screen
.win
.menu_view_render_group
[t
], TRUE
);
1539 /* ---------------------------------------------------- */
1541 * This dialog box shows a message and two buttons:
1542 * "OK" and "Cancel". It returns gboolean 1 if the
1543 * user clicked "OK", and gboolean 0 if the user
1549 interface_get_alert_dialog_response (gchar
*primaryText
, gchar
*secondaryText
,
1550 gboolean show_checkbox
, gboolean
*ask_to_show_again
)
1551 /* This fcn returns TRUE if the user presses the OK button,
1552 otherwise it returns FALSE. */
1554 /* Set show_checkbox = TRUE to show "do not show this again" checkbox. */
1555 /* Point ask_to_show_again to the variable to set to not show the checkbox. */
1557 GtkWidget
*dialog_vbox1
;
1561 GtkWidget
*checkbox
=NULL
;
1562 GtkWidget
*dialog_action_area1
;
1563 GtkWidget
*cancelbutton1
;
1564 GtkWidget
*okbutton1
;
1565 gboolean returnVal
= FALSE
;
1567 dialog1
= gtk_dialog_new ();
1568 gtk_container_set_border_width (GTK_CONTAINER (dialog1
), 6);
1569 gtk_window_set_resizable (GTK_WINDOW (dialog1
), FALSE
);
1570 gtk_window_set_type_hint (GTK_WINDOW (dialog1
), GDK_WINDOW_TYPE_HINT_DIALOG
);
1571 gtk_dialog_set_has_separator (GTK_DIALOG (dialog1
), FALSE
);
1573 dialog_vbox1
= GTK_DIALOG (dialog1
)->vbox
;
1575 hbox1
= gtk_hbox_new (FALSE
, 12);
1576 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), hbox1
, TRUE
, TRUE
, 0);
1577 gtk_container_set_border_width (GTK_CONTAINER (hbox1
), 6);
1579 image1
= gtk_image_new_from_icon_name (GTK_STOCK_DIALOG_WARNING
, GTK_ICON_SIZE_DIALOG
);
1580 gtk_box_pack_start (GTK_BOX (hbox1
), image1
, TRUE
, TRUE
, 0);
1581 gtk_misc_set_alignment (GTK_MISC (image1
), 0.5, 0);
1583 gchar
*labelMessage
= g_strconcat ("<span weight=\"bold\" size=\"larger\">",primaryText
,
1584 "</span>\n<span/>\n",secondaryText
,NULL
);
1585 label1
= gtk_label_new (labelMessage
);
1586 g_free (labelMessage
);
1587 GtkWidget
*vbox9
= gtk_vbox_new (FALSE
, 0);
1588 gtk_box_pack_start (GTK_BOX (vbox9
), label1
, FALSE
, FALSE
, 0);
1589 gtk_box_pack_start (GTK_BOX (hbox1
), vbox9
, FALSE
, FALSE
, 0);
1590 gtk_label_set_use_markup (GTK_LABEL (label1
), TRUE
);
1591 gtk_label_set_line_wrap (GTK_LABEL (label1
), TRUE
);
1593 // even with no checkbox, this extra hbox gives the recommended 24 px space between the
1594 // label and the buttons
1595 GtkWidget
*hbox2
= gtk_hbox_new (FALSE
, 12);
1596 if (show_checkbox
) {
1597 GtkWidget
*label3
= gtk_label_new (" ");
1599 checkbox
= gtk_check_button_new_with_label("Do not show this dialog again.");
1600 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbox
), FALSE
);
1601 gtk_box_pack_start (GTK_BOX (hbox2
), label3
, FALSE
, FALSE
, 0);
1602 gtk_box_pack_start (GTK_BOX (hbox2
), checkbox
, FALSE
, FALSE
, 0);
1604 gtk_box_pack_start (GTK_BOX (vbox9
), hbox2
, FALSE
, FALSE
, 12);
1606 dialog_action_area1
= GTK_DIALOG (dialog1
)->action_area
;
1607 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1
), GTK_BUTTONBOX_END
);
1609 cancelbutton1
= gtk_button_new_from_stock (GTK_STOCK_CANCEL
);
1610 gtk_dialog_add_action_widget (GTK_DIALOG (dialog1
), cancelbutton1
, GTK_RESPONSE_CANCEL
);
1611 GTK_WIDGET_SET_FLAGS (cancelbutton1
, GTK_CAN_DEFAULT
);
1612 gtk_widget_grab_default (cancelbutton1
);
1613 gtk_widget_grab_focus (cancelbutton1
);
1615 okbutton1
= gtk_button_new_from_stock (GTK_STOCK_OK
);
1616 gtk_dialog_add_action_widget (GTK_DIALOG (dialog1
), okbutton1
, GTK_RESPONSE_OK
);
1617 GTK_WIDGET_SET_FLAGS (okbutton1
, GTK_CAN_DEFAULT
);
1619 gtk_widget_show_all (dialog1
);
1621 if (gtk_dialog_run ((GtkDialog
*)dialog1
) == GTK_RESPONSE_OK
) {
1622 /* check to see if user clicked on "do not show again" box */
1623 if ((show_checkbox
== TRUE
) &&
1624 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox
)) == TRUE
) &&
1625 (ask_to_show_again
!= NULL
) ) {
1626 /* The user clicked the "do not show again box". Set corresponding
1628 *ask_to_show_again
= FALSE
;
1632 gtk_widget_destroy (dialog1
);
1639 /* ---------------------------------------------------- */
1641 * This dialog box shows a textmessage and one button:
1642 * "OK". It does not return anything.
1646 interface_show_alert_dialog (gchar
*primaryText
, gchar
*secondaryText
,
1647 gboolean show_checkbox
, gboolean
*ask_to_show_again
)
1648 /* This fcn tells the user something, and only displays "OK" */
1650 /* Set show_checkbox = TRUE to show "do not show this again" checkbox. */
1651 /* Point ask_to_show_again to the variable to set to not show the checkbox. */
1653 GtkWidget
*dialog_vbox1
;
1657 GtkWidget
*checkbox
=NULL
;
1658 GtkWidget
*dialog_action_area1
;
1659 GtkWidget
*okbutton1
;
1661 dialog1
= gtk_dialog_new ();
1662 gtk_container_set_border_width (GTK_CONTAINER (dialog1
), 6);
1663 gtk_window_set_resizable (GTK_WINDOW (dialog1
), FALSE
);
1664 gtk_window_set_type_hint (GTK_WINDOW (dialog1
), GDK_WINDOW_TYPE_HINT_DIALOG
);
1665 gtk_dialog_set_has_separator (GTK_DIALOG (dialog1
), FALSE
);
1667 dialog_vbox1
= GTK_DIALOG (dialog1
)->vbox
;
1669 hbox1
= gtk_hbox_new (FALSE
, 12);
1670 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), hbox1
, TRUE
, TRUE
, 0);
1671 gtk_container_set_border_width (GTK_CONTAINER (hbox1
), 6);
1673 image1
= gtk_image_new_from_icon_name (GTK_STOCK_DIALOG_WARNING
, GTK_ICON_SIZE_DIALOG
);
1674 gtk_box_pack_start (GTK_BOX (hbox1
), image1
, TRUE
, TRUE
, 0);
1675 gtk_misc_set_alignment (GTK_MISC (image1
), 0.5, 0);
1677 gchar
*labelMessage
= g_strconcat ("<span weight=\"bold\" size=\"larger\">",primaryText
,
1678 "</span>\n<span/>\n",secondaryText
,NULL
);
1679 label1
= gtk_label_new (labelMessage
);
1680 g_free (labelMessage
);
1682 GtkWidget
*vbox9
= gtk_vbox_new (FALSE
, 0);
1683 gtk_box_pack_start (GTK_BOX (vbox9
), label1
, FALSE
, FALSE
, 0);
1684 gtk_label_set_use_markup (GTK_LABEL (label1
), TRUE
);
1685 gtk_label_set_line_wrap (GTK_LABEL (label1
), TRUE
);
1686 gtk_box_pack_start (GTK_BOX (hbox1
), vbox9
, FALSE
, FALSE
, 0);
1688 GtkWidget
*hbox2
= gtk_hbox_new (FALSE
, 12);
1689 if (show_checkbox
) {
1690 GtkWidget
*label3
= gtk_label_new (" ");
1692 checkbox
= gtk_check_button_new_with_label("Do not show this dialog again.");
1693 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbox
), FALSE
);
1694 gtk_box_pack_start (GTK_BOX (hbox2
), label3
, FALSE
, FALSE
, 0);
1695 gtk_box_pack_start (GTK_BOX (hbox2
), checkbox
, FALSE
, FALSE
, 0);
1697 gtk_box_pack_start (GTK_BOX (vbox9
), hbox2
, FALSE
, FALSE
, 12);
1699 dialog_action_area1
= GTK_DIALOG (dialog1
)->action_area
;
1700 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1
), GTK_BUTTONBOX_END
);
1702 okbutton1
= gtk_button_new_from_stock (GTK_STOCK_OK
);
1703 gtk_dialog_add_action_widget (GTK_DIALOG (dialog1
), okbutton1
, GTK_RESPONSE_OK
);
1704 GTK_WIDGET_SET_FLAGS (okbutton1
, GTK_CAN_DEFAULT
);
1706 gtk_widget_show_all (dialog1
);
1708 /* check to see if user clicked on "do not show again" box */
1709 if ((show_checkbox
== TRUE
) &&
1710 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox
)) == TRUE
) &&
1711 (ask_to_show_again
!= NULL
) ) {
1712 /* The user clicked the "do not show again box". Set corresponding
1714 *ask_to_show_again
= FALSE
;
1717 gtk_dialog_run (GTK_DIALOG(dialog1
));
1718 gtk_widget_destroy (dialog1
);
1724 interface_show_modify_orientation_dialog (gerbv_user_transformation_t
*transform
,
1725 gerbv_unit_t screenUnit
) {
1727 GtkWidget
*check1
,*check2
,*tempWidget
,*tempWidget2
,*tableWidget
;
1728 GtkWidget
*spin1
,*spin2
,*spin3
,*spin4
,*spin5
;
1730 gerbv_user_transformation_t startTransform
= *transform
;
1732 dialog
= gtk_dialog_new_with_buttons ("Modify layer orientation",
1733 GTK_WINDOW (screen
.win
.topLevelWindow
), GTK_DIALOG_DESTROY_WITH_PARENT
,
1734 GTK_STOCK_CANCEL
, GTK_RESPONSE_NONE
, GTK_STOCK_OK
, GTK_RESPONSE_OK
,
1735 GTK_STOCK_APPLY
, GTK_RESPONSE_APPLY
,
1738 gtk_container_set_border_width (GTK_CONTAINER (dialog
), 6);
1739 gtk_window_set_resizable (GTK_WINDOW (dialog
), FALSE
);
1740 gtk_window_set_type_hint (GTK_WINDOW (dialog
), GDK_WINDOW_TYPE_HINT_DIALOG
);
1741 gtk_dialog_set_has_separator (GTK_DIALOG (dialog
), FALSE
);
1743 tableWidget
= gtk_table_new (16,3,FALSE
);
1744 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog
)->vbox
), tableWidget
, FALSE
, FALSE
, 0);
1746 tempWidget
= gtk_label_new (NULL
);
1747 gtk_label_set_markup (GTK_LABEL (tempWidget
), "<span weight=\"bold\">Translation</span>");
1748 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1749 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,0,2,0,1,GTK_EXPAND
|GTK_FILL
,0,0,5);
1751 tempWidget
= gtk_label_new (" ");
1752 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,0,1,1,2,0,0,0,0);
1753 gdouble translateX
, translateY
;
1755 if (screenUnit
== GERBV_MILS
) {
1756 tempWidget
= gtk_label_new ("X (mils):");
1757 tempWidget2
= gtk_label_new ("Y (mils):");
1758 translateX
= transform
->translateX
* 1000;
1759 translateY
= transform
->translateY
* 1000;
1761 else if (screen
.unit
== GERBV_MMS
) {
1762 tempWidget
= gtk_label_new ("X (mms):");
1763 tempWidget2
= gtk_label_new ("Y (mms):");
1764 translateX
= transform
->translateX
* 25.4;
1765 translateY
= transform
->translateY
* 25.4;
1768 tempWidget
= gtk_label_new ("X (inches):");
1769 tempWidget2
= gtk_label_new ("Y (inches):");
1770 translateX
= transform
->translateX
;
1771 translateY
= transform
->translateY
;
1774 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1775 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,1,2,1,2,GTK_EXPAND
|GTK_FILL
,0,0,0);
1776 gtk_misc_set_alignment (GTK_MISC (tempWidget2
), 0.0, 0.5);
1777 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget2
,1,2,2,3,GTK_EXPAND
|GTK_FILL
,0,0,0);
1778 adj
= (GtkAdjustment
*) gtk_adjustment_new (translateX
, -1000000, 1000000, 1, 10, 0.0);
1779 spin1
= (GtkWidget
*) gtk_spin_button_new (adj
, 0.1, 4);
1780 gtk_table_attach ((GtkTable
*) tableWidget
, spin1
,2,3,1,2,GTK_FILL
,0,0,0);
1781 adj
= (GtkAdjustment
*) gtk_adjustment_new (translateY
, -1000000, 1000000, 1, 10, 0.0);
1782 spin2
= (GtkWidget
*) gtk_spin_button_new (adj
, 0.1, 4);
1783 gtk_table_attach ((GtkTable
*) tableWidget
, spin2
,2,3,2,3,GTK_FILL
,0,0,0);
1785 gtk_table_set_row_spacing ((GtkTable
*) tableWidget
, 3, 8);
1786 tempWidget
= gtk_label_new (NULL
);
1787 gtk_label_set_markup (GTK_LABEL (tempWidget
), "<span weight=\"bold\">Scale</span>");
1788 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1789 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,0,2,4,5,GTK_EXPAND
|GTK_FILL
,0,0,5);
1791 tempWidget
= gtk_label_new ("X direction:");
1792 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1793 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,1,2,5,6,GTK_EXPAND
|GTK_FILL
,0,0,0);
1794 tempWidget
= gtk_label_new ("Y direction:");
1795 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1796 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,1,2,6,7,GTK_EXPAND
|GTK_FILL
,0,0,0);
1797 adj
= (GtkAdjustment
*) gtk_adjustment_new (transform
->scaleX
, -1000000, 1000000, 1, 10, 0.0);
1798 spin3
= (GtkWidget
*) gtk_spin_button_new (adj
, 1, 3);
1799 gtk_table_attach ((GtkTable
*) tableWidget
, spin3
,2,3,5,6,GTK_FILL
,0,0,0);
1800 adj
= (GtkAdjustment
*) gtk_adjustment_new (transform
->scaleY
, -1000000, 1000000, 1, 10, 0.0);
1801 spin4
= (GtkWidget
*) gtk_spin_button_new (adj
, 1, 3);
1802 gtk_table_attach ((GtkTable
*) tableWidget
, spin4
,2,3,6,7,GTK_FILL
,0,0,0);
1804 gtk_table_set_row_spacing ((GtkTable
*) tableWidget
, 7, 8);
1806 tempWidget
= gtk_label_new (NULL
);
1807 gtk_label_set_markup (GTK_LABEL (tempWidget
), "<span weight=\"bold\">Rotation</span>");
1808 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1809 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,0,2,8,9,GTK_EXPAND
|GTK_FILL
,0,0,5);
1811 tempWidget
= gtk_label_new ("Rotation (degrees): ");
1812 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1813 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,1,2,9,10,GTK_EXPAND
|GTK_FILL
,0,0,0);
1814 spin5
= gtk_combo_box_new_text();
1815 gtk_combo_box_append_text ((GtkComboBox
*)spin5
, "None");
1816 gtk_combo_box_append_text ((GtkComboBox
*)spin5
, "90 deg CCW");
1817 gtk_combo_box_append_text ((GtkComboBox
*)spin5
, "180 deg CCW");
1818 gtk_combo_box_append_text ((GtkComboBox
*)spin5
, "270 deg CCW");
1819 gdouble degreeRotation
= transform
->rotation
/M_PI
*180;
1820 if ((degreeRotation
< 135)&&(degreeRotation
>= 45))
1821 gtk_combo_box_set_active ((GtkComboBox
*)spin5
, 1);
1822 else if ((degreeRotation
< 225)&&(degreeRotation
>= 135))
1823 gtk_combo_box_set_active ((GtkComboBox
*)spin5
, 2);
1824 else if ((degreeRotation
< 315)&&(degreeRotation
>= 225))
1825 gtk_combo_box_set_active ((GtkComboBox
*)spin5
, 3);
1827 gtk_combo_box_set_active ((GtkComboBox
*)spin5
, 0);
1829 adj = (GtkAdjustment *) gtk_adjustment_new (transform->rotation/M_PI*180, -1000000, 1000000,
1831 spin5 = (GtkWidget *) gtk_spin_button_new (adj, 0, 3);
1833 gtk_table_attach ((GtkTable
*) tableWidget
, spin5
,2,3,9,10,GTK_FILL
,0,0,0);
1836 gtk_table_set_row_spacing ((GtkTable
*) tableWidget
, 10, 8);
1837 tempWidget
= gtk_label_new (NULL
);
1838 gtk_label_set_markup (GTK_LABEL (tempWidget
), "<span weight=\"bold\">Mirroring</span>");
1839 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1840 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,0,2,11,12,GTK_EXPAND
|GTK_FILL
,0,0,5);
1842 tempWidget
= gtk_label_new ("About X axis:");
1843 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1844 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,1,2,12,13,GTK_EXPAND
|GTK_FILL
,0,0,0);
1845 check1
= (GtkWidget
*) gtk_check_button_new ();
1846 gtk_toggle_button_set_active ((GtkToggleButton
*) check1
, transform
->mirrorAroundX
);
1847 gtk_table_attach ((GtkTable
*) tableWidget
, check1
,2,3,12,13,0,0,0,2);
1849 tempWidget
= gtk_label_new ("About Y axis:");
1850 gtk_misc_set_alignment (GTK_MISC (tempWidget
), 0.0, 0.5);
1851 gtk_table_attach ((GtkTable
*) tableWidget
, tempWidget
,1,2,13,14,GTK_EXPAND
|GTK_FILL
,0,0,0);
1852 check2
= (GtkWidget
*) gtk_check_button_new ();
1853 gtk_toggle_button_set_active ((GtkToggleButton
*) check2
, transform
->mirrorAroundY
);
1854 gtk_table_attach ((GtkTable
*) tableWidget
, check2
,2,3,13,14,0,0,0,2);
1856 gtk_table_set_row_spacing ((GtkTable
*) tableWidget
, 14, 8);
1857 gtk_widget_show_all (dialog
);
1858 gint result
= GTK_RESPONSE_APPLY
;
1860 // each time the user selects "apply", update the screen and re-enter the dialog loop
1861 while (result
== GTK_RESPONSE_APPLY
) {
1862 result
= gtk_dialog_run (GTK_DIALOG(dialog
));
1863 if (result
!= GTK_RESPONSE_NONE
) {
1864 /* extract all the parameters */
1865 if (screenUnit
== GERBV_MILS
) {
1866 transform
->translateX
= gtk_spin_button_get_value ((GtkSpinButton
*) spin1
)/
1868 transform
->translateY
= gtk_spin_button_get_value ((GtkSpinButton
*) spin2
)/
1871 else if (screen
.unit
== GERBV_MMS
) {
1872 transform
->translateX
= gtk_spin_button_get_value ((GtkSpinButton
*) spin1
)/
1874 transform
->translateY
= gtk_spin_button_get_value ((GtkSpinButton
*) spin2
)/
1878 transform
->translateX
= gtk_spin_button_get_value ((GtkSpinButton
*) spin1
);
1879 transform
->translateY
= gtk_spin_button_get_value ((GtkSpinButton
*) spin2
);
1881 transform
->scaleX
= gtk_spin_button_get_value ((GtkSpinButton
*)spin3
);
1882 transform
->scaleY
= gtk_spin_button_get_value ((GtkSpinButton
*)spin4
);
1883 gint rotationIndex
= gtk_combo_box_get_active ((GtkComboBox
*)spin5
);
1884 if (rotationIndex
== 0)
1885 transform
->rotation
= 0;
1886 else if (rotationIndex
== 1)
1887 transform
->rotation
= 90.0/180*M_PI
;
1888 else if (rotationIndex
== 2)
1889 transform
->rotation
= 180.0/180*M_PI
;
1890 else if (rotationIndex
== 3)
1891 transform
->rotation
= 270.0/180*M_PI
;
1892 transform
->mirrorAroundX
= gtk_toggle_button_get_active ((GtkToggleButton
*) check1
);
1893 transform
->mirrorAroundY
= gtk_toggle_button_get_active ((GtkToggleButton
*) check2
);
1895 render_refresh_rendered_image_on_screen ();
1896 callbacks_update_layer_tree ();
1899 if (result
== GTK_RESPONSE_NONE
) {
1900 // revert back to the start values if the user cancelled
1901 *transform
= startTransform
;
1903 gtk_widget_destroy (dialog
);