aboutsummaryrefslogtreecommitdiff
path: root/src/ld-window-main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ld-window-main.c')
-rw-r--r--src/ld-window-main.c94
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))