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)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user