Compare commits
4 Commits
b45670f9e9
...
bd12c0502a
Author | SHA1 | Date | |
---|---|---|---|
bd12c0502a | |||
4f01392de5 | |||
6cd6ddbd1c | |||
a4a0dd2106 |
@ -155,19 +155,10 @@ set (logdiag_HEADERS
|
||||
${liblogdiag_HEADERS}
|
||||
src/ld-window-main.h)
|
||||
|
||||
# Resource compilation for MinGW
|
||||
if (MINGW)
|
||||
set (CMAKE_RC_COMPILER_INIT windres)
|
||||
enable_language (RC)
|
||||
set (CMAKE_RC_FLAGS "-O coff")
|
||||
set (CMAKE_RC_COMPILE_OBJECT
|
||||
"<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
|
||||
endif (MINGW)
|
||||
|
||||
# Resource compilation for Windows
|
||||
if (WIN32)
|
||||
set (logdiag_SOURCES
|
||||
${logdiag_SOURCES}
|
||||
share/logdiag.rc)
|
||||
# The file isn't scanned for dependencies, but they will only rarely change
|
||||
list (APPEND logdiag_SOURCES share/logdiag.rc)
|
||||
endif (WIN32)
|
||||
|
||||
# Generate a configure file
|
||||
|
@ -16,8 +16,8 @@ q:lang(cs):after { content: "“"; }
|
||||
<p class="details">
|
||||
<span id="author">Přemysl Eric Janouch</span><br>
|
||||
<span id="email"><a href="mailto:p@janouch.name">p@janouch.name</a></span><br>
|
||||
<span id="revnumber">verze 0.2.0,</span>
|
||||
<span id="revdate">2018-06-27</span>
|
||||
<span id="revnumber">verze 0.2.2,</span>
|
||||
<span id="revdate">2021-10-28</span>
|
||||
|
||||
<p class="figure"><img src="logdiag-cs.png" alt="Okno programu logdiag">
|
||||
|
||||
@ -118,15 +118,11 @@ a přetáhněte kurzor myši na místo, kde chcete, aby spojení končilo.
|
||||
Pokud jste nějaký soubor již bez přípony uložili, napravíte to dodatečným
|
||||
přidáním přípony k jeho názvu.
|
||||
|
||||
<h3>Jak můžu diagram vytisknout?</h3>
|
||||
<p>Současná verze aplikace není schopná přímo tisknout. Pro vytištění
|
||||
vytvořeného diagramu můžete klávesou PrintScreen sejmout snímek obrazovky,
|
||||
vložit jej například do aplikace Malování, oříznout požadovanou část
|
||||
a vytisknout ji z tohoto grafického editoru.
|
||||
|
||||
<h3>Schází mi popisky</h3>
|
||||
<p>Obdobně jako v předchozím případě tato funkcionalita zatím neexistuje,
|
||||
ale je možné tento nedostatek obejít přes běžný grafický editor.
|
||||
<p>Tato funkcionalita zatím neexistuje, ale je možné tento nedostatek obejít
|
||||
buď sejmutím snímku obrazovky klávesou PrintScreen a jeho vložením například
|
||||
do aplikace Malování, nebo obdobně doplněním vašich textů do <q>vytištěného</q>
|
||||
PDF souboru.
|
||||
|
||||
<script>
|
||||
var toc = '', all = document.querySelectorAll('h2')
|
||||
|
@ -16,8 +16,8 @@ q:lang(en):after { content: "’"; }
|
||||
<p class="details">
|
||||
<span id="author">Přemysl Eric Janouch</span><br>
|
||||
<span id="email"><a href="mailto:p@janouch.name">p@janouch.name</a></span><br>
|
||||
<span id="revnumber">version 0.2.0,</span>
|
||||
<span id="revdate">2018-06-27</span>
|
||||
<span id="revnumber">version 0.2.2,</span>
|
||||
<span id="revdate">2021-10-28</span>
|
||||
|
||||
<p class="figure"><img src="logdiag-en.png" alt="logdiag program window">
|
||||
|
||||
@ -110,15 +110,11 @@ want the connection to end.
|
||||
In case you’ve already saved a file without an extension, you may fix this
|
||||
situation by adding the suffix to its name.
|
||||
|
||||
<h3>How do I print a diagram?</h3>
|
||||
<p>The current version of application is not able to print directly. To print
|
||||
out a created diagram, you may use the PrintScreen key to capture a screenshot,
|
||||
then insert it to, for example, Paint, and print it from inside the graphics
|
||||
editor.
|
||||
|
||||
<h3>I miss labels</h3>
|
||||
<p>Similarly to the previous case, this functionality doesn’t exist yet, but it
|
||||
is possible to get around this limitation using a graphics editor.
|
||||
<p>This functionality doesn't exist yet, but it is possible to get around this
|
||||
limitation either by using the PrintScreen key to capture a screenshot
|
||||
and inserting it to, for example, Paint, or similarly by adding your texts
|
||||
to a <q>printed</q> PDF file.
|
||||
|
||||
<script>
|
||||
var toc = '', all = document.querySelectorAll('h2')
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ld-diagram-view.c
|
||||
*
|
||||
* This file is a part of logdiag.
|
||||
* Copyright 2010, 2011, 2012, 2015 Přemysl Eric Janouch
|
||||
* Copyright 2010 - 2021 Přemysl Eric Janouch
|
||||
*
|
||||
* See the file LICENSE for licensing information.
|
||||
*
|
||||
@ -335,7 +335,7 @@ static void oper_select_begin (LdDiagramView *self, const LdPoint *point);
|
||||
static void oper_select_end (LdDiagramView *self);
|
||||
static void oper_select_get_rectangle (LdDiagramView *self, LdRectangle *rect);
|
||||
static void oper_select_queue_draw (LdDiagramView *self);
|
||||
static void oper_select_draw (GtkWidget *widget, DrawData *data);
|
||||
static void oper_select_draw (DrawData *data);
|
||||
static void oper_select_motion (LdDiagramView *self, const LdPoint *point);
|
||||
|
||||
static void oper_move_selection_begin (LdDiagramView *self,
|
||||
@ -374,13 +374,19 @@ static void on_drag_leave (GtkWidget *widget, GdkDragContext *drag_ctx,
|
||||
guint time, gpointer user_data);
|
||||
|
||||
static gboolean on_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data);
|
||||
static void draw_grid (GtkWidget *widget, DrawData *data);
|
||||
static void draw_diagram (GtkWidget *widget, DrawData *data);
|
||||
static void draw_terminal (GtkWidget *widget, DrawData *data);
|
||||
static void draw_grid (DrawData *data);
|
||||
static void draw_diagram (DrawData *data);
|
||||
static void draw_terminal (DrawData *data);
|
||||
static void draw_object (LdDiagramObject *diagram_object, DrawData *data);
|
||||
static void draw_symbol (LdDiagramSymbol *diagram_symbol, DrawData *data);
|
||||
static void draw_connection (LdDiagramConnection *connection, DrawData *data);
|
||||
|
||||
/* Export. */
|
||||
|
||||
static void get_diagram_bounds (LdDiagramView *self, LdRectangle *rect);
|
||||
static gboolean get_object_bounds (LdDiagramView *self, LdDiagramObject *object,
|
||||
LdRectangle *rect);
|
||||
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (LdDiagramView, ld_diagram_view, GTK_TYPE_DRAWING_AREA,
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE,
|
||||
@ -1045,6 +1051,27 @@ ld_diagram_view_diagram_to_widget_coords (LdDiagramView *self,
|
||||
*wy = scale * (dy - self->priv->y) + 0.5 * allocation.height;
|
||||
}
|
||||
|
||||
static void
|
||||
ld_diagram_view_diagram_to_widget_coords_rect (LdDiagramView *self,
|
||||
const LdRectangle *area, LdRectangle *rect)
|
||||
{
|
||||
gdouble x1, x2, y1, y2;
|
||||
|
||||
ld_diagram_view_diagram_to_widget_coords (self,
|
||||
area->x,
|
||||
area->y,
|
||||
&x1, &y1);
|
||||
ld_diagram_view_diagram_to_widget_coords (self,
|
||||
area->x + area->width,
|
||||
area->y + area->height,
|
||||
&x2, &y2);
|
||||
|
||||
rect->x = floor (x1);
|
||||
rect->y = floor (y1);
|
||||
rect->width = ceil (x2) - rect->x;
|
||||
rect->height = ceil (y2) - rect->y;
|
||||
}
|
||||
|
||||
/**
|
||||
* ld_diagram_view_get_x:
|
||||
* @self: an #LdDiagramView object.
|
||||
@ -1612,14 +1639,12 @@ get_symbol_clip_area (LdDiagramView *self,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_symbol_area (LdDiagramView *self, LdDiagramSymbol *symbol,
|
||||
get_symbol_area_in_diagram_units (LdDiagramView *self, LdDiagramSymbol *symbol,
|
||||
LdRectangle *rect)
|
||||
{
|
||||
gdouble object_x, object_y;
|
||||
LdSymbol *library_symbol;
|
||||
LdRectangle area;
|
||||
gdouble x1, x2;
|
||||
gdouble y1, y2;
|
||||
gint rotation;
|
||||
|
||||
g_object_get (symbol, "x", &object_x, "y", &object_y,
|
||||
@ -1633,24 +1658,23 @@ get_symbol_area (LdDiagramView *self, LdDiagramSymbol *symbol,
|
||||
|
||||
rotate_symbol_area (&area, rotation);
|
||||
|
||||
ld_diagram_view_diagram_to_widget_coords (self,
|
||||
object_x + area.x,
|
||||
object_y + area.y,
|
||||
&x1, &y1);
|
||||
ld_diagram_view_diagram_to_widget_coords (self,
|
||||
object_x + area.x + area.width,
|
||||
object_y + area.y + area.height,
|
||||
&x2, &y2);
|
||||
rect->x = object_x + area.x;
|
||||
rect->y = object_y + area.y;
|
||||
rect->width = (rect->x + area.width) - rect->x;
|
||||
rect->height = (rect->y + area.height) - rect->y;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
x1 = floor (x1);
|
||||
y1 = floor (y1);
|
||||
x2 = ceil (x2);
|
||||
y2 = ceil (y2);
|
||||
static gboolean
|
||||
get_symbol_area (LdDiagramView *self, LdDiagramSymbol *symbol,
|
||||
LdRectangle *rect)
|
||||
{
|
||||
LdRectangle intermediate;
|
||||
|
||||
rect->x = x1;
|
||||
rect->y = y1;
|
||||
rect->width = x2 - x1;
|
||||
rect->height = y2 - y1;
|
||||
if (!get_symbol_area_in_diagram_units (self, symbol, &intermediate))
|
||||
return FALSE;
|
||||
|
||||
ld_diagram_view_diagram_to_widget_coords_rect (self, &intermediate, rect);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -1782,7 +1806,7 @@ get_connection_clip_area (LdDiagramView *self,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_connection_area (LdDiagramView *self,
|
||||
get_connection_area_in_diagram_units (LdDiagramView *self,
|
||||
LdDiagramConnection *connection, LdRectangle *rect)
|
||||
{
|
||||
gdouble x_origin, y_origin;
|
||||
@ -1799,20 +1823,13 @@ get_connection_area (LdDiagramView *self,
|
||||
|
||||
g_object_get (connection, "x", &x_origin, "y", &y_origin, NULL);
|
||||
|
||||
ld_diagram_view_diagram_to_widget_coords (self,
|
||||
x_origin + points->points[0].x,
|
||||
y_origin + points->points[0].y,
|
||||
&x, &y);
|
||||
|
||||
x_max = x_min = x;
|
||||
y_max = y_min = y;
|
||||
x_max = x_min = x_origin + points->points[0].x;
|
||||
y_max = y_min = y_origin + points->points[0].y;
|
||||
|
||||
for (i = 1; i < points->length; i++)
|
||||
{
|
||||
ld_diagram_view_diagram_to_widget_coords (self,
|
||||
x_origin + points->points[i].x,
|
||||
y_origin + points->points[i].y,
|
||||
&x, &y);
|
||||
x = x_origin + points->points[i].x;
|
||||
y = y_origin + points->points[i].y;
|
||||
|
||||
if (x < x_min)
|
||||
x_min = x;
|
||||
@ -1834,6 +1851,19 @@ get_connection_area (LdDiagramView *self,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_connection_area (LdDiagramView *self,
|
||||
LdDiagramConnection *connection, LdRectangle *rect)
|
||||
{
|
||||
LdRectangle intermediate;
|
||||
|
||||
if (!get_connection_area_in_diagram_units (self, connection, &intermediate))
|
||||
return FALSE;
|
||||
|
||||
ld_diagram_view_diagram_to_widget_coords_rect (self, &intermediate, rect);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* ===== Operations ======================================================== */
|
||||
|
||||
@ -2101,7 +2131,7 @@ oper_select_queue_draw (LdDiagramView *self)
|
||||
}
|
||||
|
||||
static void
|
||||
oper_select_draw (GtkWidget *widget, DrawData *data)
|
||||
oper_select_draw (DrawData *data)
|
||||
{
|
||||
static const double dashes[] = {3, 5};
|
||||
SelectData *select_data;
|
||||
@ -2664,19 +2694,19 @@ on_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data)
|
||||
cairo_paint (data.cr);
|
||||
|
||||
if (data.self->priv->show_grid)
|
||||
draw_grid (widget, &data);
|
||||
draw_grid (&data);
|
||||
|
||||
draw_diagram (widget, &data);
|
||||
draw_terminal (widget, &data);
|
||||
draw_diagram (&data);
|
||||
draw_terminal (&data);
|
||||
|
||||
if (data.self->priv->operation == OPER_SELECT)
|
||||
oper_select_draw (widget, &data);
|
||||
oper_select_draw (&data);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
draw_grid (GtkWidget *widget, DrawData *data)
|
||||
draw_grid (DrawData *data)
|
||||
{
|
||||
gdouble grid_step;
|
||||
gint grid_factor;
|
||||
@ -2738,7 +2768,7 @@ draw_grid (GtkWidget *widget, DrawData *data)
|
||||
}
|
||||
|
||||
static void
|
||||
draw_terminal (GtkWidget *widget, DrawData *data)
|
||||
draw_terminal (DrawData *data)
|
||||
{
|
||||
LdDiagramViewPrivate *priv;
|
||||
LdPoint widget_coords;
|
||||
@ -2760,7 +2790,7 @@ draw_terminal (GtkWidget *widget, DrawData *data)
|
||||
}
|
||||
|
||||
static void
|
||||
draw_diagram (GtkWidget *widget, DrawData *data)
|
||||
draw_diagram (DrawData *data)
|
||||
{
|
||||
GList *objects, *iter;
|
||||
|
||||
@ -2905,5 +2935,98 @@ draw_connection (LdDiagramConnection *connection, DrawData *data)
|
||||
|
||||
draw_connection_end:
|
||||
ld_point_array_free (points);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* ===== Export ============================================================ */
|
||||
|
||||
static void
|
||||
get_diagram_bounds (LdDiagramView *self, LdRectangle *rect)
|
||||
{
|
||||
GList *objects;
|
||||
gboolean initialized = FALSE;
|
||||
LdRectangle partial;
|
||||
gdouble x2, y2;
|
||||
|
||||
g_return_if_fail (LD_IS_DIAGRAM_VIEW (self));
|
||||
g_return_if_fail (rect != NULL);
|
||||
|
||||
memset (rect, 0, sizeof *rect);
|
||||
objects = (GList *) ld_diagram_get_objects (self->priv->diagram);
|
||||
for (; objects != NULL; objects = objects->next)
|
||||
{
|
||||
if (!get_object_bounds (self, objects->data, &partial))
|
||||
continue;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
*rect = partial;
|
||||
initialized = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
x2 = MAX (partial.x + partial.width, rect->x + rect->width);
|
||||
y2 = MAX (partial.y + partial.height, rect->y + rect->height);
|
||||
rect->x = MIN (rect->x, partial.x);
|
||||
rect->y = MIN (rect->y, partial.y);
|
||||
rect->width = x2 - rect->x;
|
||||
rect->height = y2 - rect->y;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_object_bounds (LdDiagramView *self, LdDiagramObject *object,
|
||||
LdRectangle *rect)
|
||||
{
|
||||
if (LD_IS_DIAGRAM_SYMBOL (object))
|
||||
return get_symbol_area_in_diagram_units (self,
|
||||
LD_DIAGRAM_SYMBOL (object), rect);
|
||||
if (LD_IS_DIAGRAM_CONNECTION (object))
|
||||
return get_connection_area_in_diagram_units (self,
|
||||
LD_DIAGRAM_CONNECTION (object), rect);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* ld_diagram_view_get_export_bounds:
|
||||
* @self: an #LdDiagramView object.
|
||||
* @rect: (out): diagram boundaries.
|
||||
*
|
||||
* Get the smallest rectangular area containing all objects in the diagram.
|
||||
* The diagram object itself doesn't have any idea of how symbols are rendered.
|
||||
*
|
||||
* Return value: export units per diagram unit.
|
||||
*/
|
||||
gdouble
|
||||
ld_diagram_view_get_export_bounds (LdDiagramView *self, LdRectangle *rect)
|
||||
{
|
||||
LdRectangle intermediate;
|
||||
|
||||
get_diagram_bounds (self, &intermediate);
|
||||
ld_diagram_view_diagram_to_widget_coords_rect (self, &intermediate, rect);
|
||||
return ld_diagram_view_get_scale_in_px (self);
|
||||
}
|
||||
|
||||
/**
|
||||
* ld_diagram_view_export:
|
||||
* @self: an #LdDiagramView object.
|
||||
* @cr: Cairo context to draw on.
|
||||
* @clip: the clip area (the function itself does not clip).
|
||||
*
|
||||
* Get the smallest rectangular area containing all objects in the diagram.
|
||||
* The diagram object itself doesn't have any idea of how symbols are rendered.
|
||||
*/
|
||||
void
|
||||
ld_diagram_view_export (LdDiagramView *self, cairo_t *cr,
|
||||
const LdRectangle *clip)
|
||||
{
|
||||
DrawData data;
|
||||
|
||||
data.cr = cr;
|
||||
data.self = self;
|
||||
/* FIXME: Various functions call this directly, this export is a hack. */
|
||||
data.scale = ld_diagram_view_get_scale_in_px (data.self);
|
||||
data.exposed_rect = *clip;
|
||||
|
||||
draw_diagram (&data);
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ld-diagram-view.h
|
||||
*
|
||||
* This file is a part of logdiag.
|
||||
* Copyright 2010, 2011 Přemysl Eric Janouch
|
||||
* Copyright 2010 - 2021 Přemysl Eric Janouch
|
||||
*
|
||||
* See the file LICENSE for licensing information.
|
||||
*
|
||||
@ -96,6 +96,11 @@ void ld_diagram_view_set_show_grid (LdDiagramView *self, gboolean show_grid);
|
||||
void ld_diagram_view_add_object_begin (LdDiagramView *self,
|
||||
LdDiagramObject *object);
|
||||
|
||||
gdouble ld_diagram_view_get_export_bounds (LdDiagramView *self,
|
||||
LdRectangle *rect);
|
||||
void ld_diagram_view_export (LdDiagramView *self,
|
||||
cairo_t *cr, const LdRectangle *clip);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@ -1,18 +1,16 @@
|
||||
<ui>
|
||||
<menubar name="MenuBar">
|
||||
<menu name="FileMenu" action="FileMenu">
|
||||
<menu action="FileMenu">
|
||||
<menuitem action="New" />
|
||||
<menuitem action="Open" />
|
||||
<menuitem action="Save" />
|
||||
<menuitem action="SaveAs" />
|
||||
<separator />
|
||||
<!--
|
||||
<menuitem action="Export" />
|
||||
<menuitem action="Print" />
|
||||
<separator />
|
||||
-->
|
||||
<menuitem action="Quit" />
|
||||
</menu>
|
||||
<menu name="EditMenu" action="EditMenu">
|
||||
<menu action="EditMenu">
|
||||
<menuitem action="Undo" />
|
||||
<menuitem action="Redo" />
|
||||
<separator />
|
||||
@ -25,7 +23,7 @@
|
||||
<separator />
|
||||
<menuitem action="SelectAll" />
|
||||
</menu>
|
||||
<menu name="ViewMenu" action="ViewMenu">
|
||||
<menu action="ViewMenu">
|
||||
<menuitem action="MainToolbar" />
|
||||
<menuitem action="LibraryPane" />
|
||||
<separator />
|
||||
@ -35,7 +33,7 @@
|
||||
<menuitem action="ZoomOut" />
|
||||
<menuitem action="NormalSize" />
|
||||
</menu>
|
||||
<menu name="HelpMenu" action="HelpMenu">
|
||||
<menu action="HelpMenu">
|
||||
<menuitem action="UserGuide" />
|
||||
<menuitem action="About" />
|
||||
</menu>
|
||||
|
11
share/logdiag.manifest
Normal file
11
share/logdiag.manifest
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity name="logdiag" version="1.0.0.0" type="win32" />
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.Windows.Common-Controls"
|
||||
version="6.0.0.0" type="win32" processorArchitecture="*"
|
||||
publicKeyToken="6595b64144ccf1df" language="*" />
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
</assembly>
|
@ -1 +1,3 @@
|
||||
#include <windows.h>
|
||||
LD_ICON ICON "logdiag.ico"
|
||||
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "logdiag.manifest"
|
||||
|
@ -56,6 +56,8 @@ struct _LdWindowMainPrivate
|
||||
|
||||
static void ld_window_main_finalize (GObject *gobject);
|
||||
static void load_library_directories (LdLibrary *library);
|
||||
static void display_and_free_error (LdWindowMain *self, const gchar *title,
|
||||
GError *error);
|
||||
|
||||
static void on_ui_proxy_connected (GtkUIManager *ui, GtkAction *action,
|
||||
GtkWidget *proxy, LdWindowMain *window);
|
||||
@ -104,9 +106,14 @@ 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);
|
||||
static gboolean on_action_about_activate_link (GtkAboutDialog *dialog,
|
||||
gchar *uri, LdWindowMain *self);
|
||||
|
||||
static void on_action_undo (GtkAction *action, LdWindowMain *self);
|
||||
static void on_action_redo (GtkAction *action, LdWindowMain *self);
|
||||
@ -142,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)},
|
||||
@ -444,6 +451,21 @@ load_library_directories (LdLibrary *library)
|
||||
g_free (user_dir);
|
||||
}
|
||||
|
||||
static void
|
||||
display_and_free_error (LdWindowMain *self, const gchar *title, GError *error)
|
||||
{
|
||||
GtkWidget *message_dialog;
|
||||
|
||||
message_dialog = gtk_message_dialog_new (GTK_WINDOW (self),
|
||||
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", title);
|
||||
gtk_message_dialog_format_secondary_text
|
||||
(GTK_MESSAGE_DIALOG (message_dialog), "%s", error->message);
|
||||
g_error_free (error);
|
||||
|
||||
gtk_dialog_run (GTK_DIALOG (message_dialog));
|
||||
gtk_widget_destroy (message_dialog);
|
||||
}
|
||||
|
||||
/*
|
||||
* on_delete:
|
||||
*
|
||||
@ -975,6 +997,87 @@ on_action_save_as (GtkAction *action, LdWindowMain *self)
|
||||
diagram_show_save_as_dialog (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)
|
||||
{
|
||||
@ -1040,21 +1143,36 @@ on_action_user_guide (GtkAction *action, LdWindowMain *self)
|
||||
|
||||
if (!open_file (file, gtk_window_get_screen (GTK_WINDOW (self)), &error))
|
||||
{
|
||||
GtkWidget *message_dialog;
|
||||
|
||||
message_dialog = gtk_message_dialog_new (GTK_WINDOW (self),
|
||||
GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
|
||||
_("Failed to open the user guide"));
|
||||
gtk_message_dialog_format_secondary_text
|
||||
(GTK_MESSAGE_DIALOG (message_dialog), "%s", error->message);
|
||||
g_error_free (error);
|
||||
|
||||
gtk_dialog_run (GTK_DIALOG (message_dialog));
|
||||
gtk_widget_destroy (message_dialog);
|
||||
display_and_free_error (self,
|
||||
_("Failed to open the user guide"), error);
|
||||
}
|
||||
g_object_unref (file);
|
||||
}
|
||||
|
||||
static void
|
||||
on_action_about (GtkAction *action, LdWindowMain *self)
|
||||
{
|
||||
GtkWidget *about_dialog;
|
||||
|
||||
about_dialog = g_object_new (GTK_TYPE_ABOUT_DIALOG,
|
||||
"program-name", PROJECT_NAME,
|
||||
"logo-icon-name", PROJECT_NAME,
|
||||
"version", PROJECT_VERSION,
|
||||
"translator-credits", _("translator-credits"),
|
||||
"copyright", "Copyright 2010 - 2021 Přemysl Eric Janouch",
|
||||
"website", PROJECT_URL,
|
||||
NULL);
|
||||
|
||||
g_signal_connect (about_dialog, "activate-link",
|
||||
G_CALLBACK (on_action_about_activate_link), self);
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (about_dialog), GTK_WINDOW (self));
|
||||
gtk_window_set_modal (GTK_WINDOW (about_dialog), TRUE);
|
||||
gtk_window_set_destroy_with_parent (GTK_WINDOW (about_dialog), TRUE);
|
||||
gtk_dialog_run (GTK_DIALOG (about_dialog));
|
||||
gtk_widget_destroy (about_dialog);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_action_about_activate_link (GtkAboutDialog *dialog, gchar *uri,
|
||||
LdWindowMain *self)
|
||||
@ -1080,30 +1198,6 @@ on_action_about_activate_link (GtkAboutDialog *dialog, gchar *uri,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
on_action_about (GtkAction *action, LdWindowMain *self)
|
||||
{
|
||||
GtkWidget *about_dialog;
|
||||
|
||||
about_dialog = g_object_new (GTK_TYPE_ABOUT_DIALOG,
|
||||
"program-name", PROJECT_NAME,
|
||||
"logo-icon-name", PROJECT_NAME,
|
||||
"version", PROJECT_VERSION,
|
||||
"translator-credits", _("translator-credits"),
|
||||
"copyright", "Copyright 2010 - 2021 Přemysl Eric Janouch",
|
||||
"website", PROJECT_URL,
|
||||
NULL);
|
||||
|
||||
g_signal_connect (about_dialog, "activate-link",
|
||||
G_CALLBACK (on_action_about_activate_link), self);
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (about_dialog), GTK_WINDOW (self));
|
||||
gtk_window_set_modal (GTK_WINDOW (about_dialog), TRUE);
|
||||
gtk_window_set_destroy_with_parent (GTK_WINDOW (about_dialog), TRUE);
|
||||
gtk_dialog_run (GTK_DIALOG (about_dialog));
|
||||
gtk_widget_destroy (about_dialog);
|
||||
}
|
||||
|
||||
static void
|
||||
on_action_undo (GtkAction *action, LdWindowMain *self)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user