diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ld-window-main.c | 94 | 
1 files changed, 89 insertions, 5 deletions
| diff --git a/src/ld-window-main.c b/src/ld-window-main.c index c68ff3d..6616168 100644 --- a/src/ld-window-main.c +++ b/src/ld-window-main.c @@ -106,6 +106,9 @@ static void on_action_new (GtkAction *action, LdWindowMain *self);  static void on_action_open (GtkAction *action, LdWindowMain *self);  static void on_action_save (GtkAction *action, LdWindowMain *self);  static void on_action_save_as (GtkAction *action, LdWindowMain *self); +static void on_action_print (GtkAction *action, LdWindowMain *self); +static void on_action_print_draw_page (GtkPrintOperation *operation, +	GtkPrintContext *context, int page_nr, LdWindowMain *self);  static void on_action_quit (GtkAction *action, LdWindowMain *self);  static void on_action_user_guide (GtkAction *action, LdWindowMain *self);  static void on_action_about (GtkAction *action, LdWindowMain *self); @@ -146,11 +149,11 @@ static GtkActionEntry wm_action_entries[] =  		{"SaveAs", GTK_STOCK_SAVE_AS, N_("Save _As..."), "<Shift><Ctrl>S",  			N_("Save the current diagram with another name"),  			G_CALLBACK (on_action_save_as)}, -/* - *		{"Export", NULL, N_("_Export"), NULL, - *			N_("Export the diagram"), - *			NULL}, - */ + +		{"Print", GTK_STOCK_PRINT, N_("_Print"), "<Ctrl>P", +			N_("Print the diagram"), +			G_CALLBACK (on_action_print)}, +  		{"Quit", GTK_STOCK_QUIT, N_("_Quit"), "<Ctrl>Q",  			N_("Quit the application"),  			G_CALLBACK (on_action_quit)}, @@ -995,6 +998,87 @@ on_action_save_as (GtkAction *action, LdWindowMain *self)  }  static void +on_action_print (GtkAction *action, LdWindowMain *self) +{ +	static GtkPrintSettings *settings = NULL; +	GError *error = NULL; +	GtkPrintOperation *print; +	GtkPrintOperationResult res; +	gchar *name; + +	print = gtk_print_operation_new (); +	gtk_print_operation_set_n_pages (print, 1); +	gtk_print_operation_set_embed_page_setup (print, TRUE); +	gtk_print_operation_set_unit (print, GTK_UNIT_MM); + +	name = diagram_get_name (self); +	gtk_print_operation_set_job_name (print, name); +	g_free (name); + +	if (settings != NULL) +		gtk_print_operation_set_print_settings (print, settings); +	g_signal_connect (print, "draw-page", +		G_CALLBACK (on_action_print_draw_page), self); + +	/* On Windows, it is not possible to get a print preview from the system +	 * print dialog.  But in Windows XP previews do not work at all--unreadable +	 * EMFs come out.  Windows 10 errors out with "A sharing violation occurred +	 * while accessing" the temporary EMF file on our first run of +	 * GtkPrintOperation, and following that it opens the previews up in +	 * fucking Paint, so there is no point in trying.  It lacks a stage +	 * or controls for setting up page parameters anyway. +	 */ +	res = gtk_print_operation_run (print, +		GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, +		GTK_WINDOW (self), &error); +	if (res == GTK_PRINT_OPERATION_RESULT_APPLY) +	{ +		if (settings != NULL) +			g_object_unref (settings); +		settings +			= g_object_ref (gtk_print_operation_get_print_settings (print)); +	} +	if (error) +		display_and_free_error (self, _("Error"), error); + +	g_object_unref (print); +} + +static void +on_action_print_draw_page (GtkPrintOperation *operation, +	GtkPrintContext *context, int page_nr, LdWindowMain *self) +{ +	cairo_t *cr; +	LdDiagramView *view; +	gdouble area_width_mm, area_height_mm; +	gdouble diagram_width_mm, diagram_height_mm; +	gdouble diagram_to_export_units, scale; +	LdRectangle bounds; + +	cr = gtk_print_context_get_cairo_context (context); +	view = self->priv->view; + +	area_width_mm = gtk_print_context_get_width (context); +	area_height_mm = gtk_print_context_get_height (context); +	diagram_to_export_units = ld_diagram_view_get_export_bounds (view, &bounds); + +	/* Scale for the view's constant, measured in milimetres. */ +	scale = 1 / diagram_to_export_units * LD_DIAGRAM_VIEW_BASE_UNIT_LENGTH; +	diagram_width_mm = bounds.width * scale; +	diagram_height_mm = bounds.height * scale; + +	/* Scale to fit the paper. */ +	if (area_width_mm < diagram_width_mm) +		scale *= area_width_mm / diagram_width_mm; +	if (area_height_mm < diagram_height_mm) +		scale *= area_height_mm / diagram_height_mm; + +	cairo_scale (cr, scale, scale); +	cairo_translate (cr, -bounds.x, -bounds.y); +	ld_diagram_view_export (view, cr, &bounds); +} + +static void  on_action_quit (GtkAction *action, LdWindowMain *self)  {  	if (may_quit (self)) | 
