Compare commits

...

61 Commits

Author SHA1 Message Date
Přemysl Eric Janouch 17d9b3cf4c
Win64Depends.sh: improve compatibility
Arch Linux AUR Success Details
Alpine 3.19 Success Details
2024-04-09 19:35:41 +02:00
Přemysl Eric Janouch 2aa0a6231c
Accept Lua 5.4 specifically
Arch Linux AUR Success Details
2024-04-09 18:54:14 +02:00
Přemysl Eric Janouch 56a2a58ed6
Enable cross-compiled tests
Arch Linux AUR Success Details
test-diagram still fails, however let's make our toolchain files
a good reference.
2024-04-09 13:02:03 +02:00
Přemysl Eric Janouch 99834e93c0
README.adoc: update package information
Arch Linux AUR Success Details
2023-07-01 21:59:05 +02:00
Přemysl Eric Janouch 266c4c7c9f
CMakeLists.txt: fix RPM license field 2023-06-28 01:57:50 +02:00
Přemysl Eric Janouch e5e42b63eb
Win64Depends.sh: only extract what we need
In case the packages directory has been preloaded or symlinked.
2023-06-26 20:54:38 +02:00
Přemysl Eric Janouch a4532ea322
Add some enlightening comments 2023-06-14 12:29:12 +02:00
Přemysl Eric Janouch 4aeaf61c99
Synchronize cross-compilation scripts 2022-08-12 12:39:21 +02:00
Přemysl Eric Janouch d5837555b8
Update README 2022-08-12 12:33:52 +02:00
Přemysl Eric Janouch 9003f36ba2
Tidy up GSettings 2022-07-25 13:31:32 +02:00
Přemysl Eric Janouch 6df51485d3
Update Windows XP vs. TLS notes 2021-12-28 04:03:54 +01:00
Přemysl Eric Janouch 2433b9046f
Eliminate a Wayland-specific warning
The handling seems to be a bit convoluted there.
2021-11-17 07:42:37 +01:00
Přemysl Eric Janouch 93cd4dc4f9
Remove an unused marshaller
It is no longer used, since the transition to GTK+ 3.
2021-11-14 05:51:07 +01:00
Přemysl Eric Janouch 9dc1d20d6c
Bump version, update NEWS 2021-11-03 07:18:35 +01:00
Přemysl Eric Janouch 66a3b3e259
CMakeLists.txt: fix macOS build
GTK+ doesn't seem to be working much on macOS/brew/M1, though.
2021-11-02 16:29:30 +01:00
Přemysl Eric Janouch 3ff0f117f9
Make note of an alternative export approach 2021-11-02 11:43:49 +01:00
Přemysl Eric Janouch de291ffddb
Reset view position on opening a file 2021-11-02 11:28:48 +01:00
Přemysl Eric Janouch baaca4c58f
Add all opened files to the recent list
The GTK+ file open/save dialog has already been adding them,
but opening files from the command line would circumvent that path.
2021-11-02 11:24:40 +01:00
Přemysl Eric Janouch 7499f92811
Close symbol paths where appropriate
Removes some ugliness in PDF exports, stemming from line thickness.
2021-11-02 10:36:17 +01:00
Přemysl Eric Janouch deceafb4f4
CMakeFiles.txt: remove a confused comment
The process is not executed from a Makefile, the concern is void.
2021-11-01 13:04:26 +01:00
Přemysl Eric Janouch 3465557a5b
Use GResources for the UI file and the LICENSE
- The About dialog now displays the licence.
 - The main UI file is now integrated into the binary.

The project needed some of its ugly CMake code back.
2021-11-01 12:20:16 +01:00
Přemysl Eric Janouch 082f1aa41c
CMakeLists.txt: shuffle things around 2021-11-01 11:57:01 +01:00
Přemysl Eric Janouch 8950a533b4
Don't generate marshallers in the source tree
This is much cleaner.  I'm unsure of the original motivations,
perhaps I just wanted to have all source files next to each other.
There is no functional issue with the build directory, though.
2021-11-01 10:14:19 +01:00
Přemysl Eric Janouch 79d2fc78ea
Win64Depends.sh: describe a more precise fix 2021-11-01 09:26:48 +01:00
Přemysl Eric Janouch 1d118d5406
CMakeLists.txt: remove pointless targets
The win32-depends target only makes sense /before/ running CMake.

Let the builder do it by hand rather than invoking it automatically,
which would be another sensible solution.
2021-11-01 07:52:41 +01:00
Přemysl Eric Janouch d5ea2e2b4d
Move GSettings schema checking to tests 2021-11-01 07:40:32 +01:00
Přemysl Eric Janouch 0cec1b4bad
CMakeLists.txt: slightly modernize
Before version 3.12, we still need to set CPACK_PACKAGE_VERSION
manually, and the subversions are actually wrongly defaulting to 0.1.1
(but we don't particularly care).

FindIntl has been there since CMake 3.2.
2021-10-31 04:18:44 +01:00
Přemysl Eric Janouch a40b281078
Improve clang-format configuration 2021-10-30 03:01:11 +02:00
Přemysl Eric Janouch dd48af42eb
Stop stuttering in CMake scripts 2021-10-29 04:56:56 +02:00
Přemysl Eric Janouch ed6d34159e
Win32Depends.cmake: make a note about cURL 2021-10-29 04:30:35 +02:00
Přemysl Eric Janouch ff03060efa
Win32Depends.cmake: reflect mingw-get's existence
But let's keep Lua in the downloader, to make cross-compiling easier.
2021-10-29 04:11:03 +02:00
Přemysl Eric Janouch 9dcef6a14f
Make ld_library_find_symbol() easier to read
As well as shorter, strangely.

Symbols may technically exist directly in the root category now.
2021-10-29 01:31:50 +02:00
Přemysl Eric Janouch ee7be81434
Clean up 2021-10-29 00:24:12 +02:00
Přemysl Eric Janouch 0c5c680f62
Get rid of broken vera++, integrate clang-tidy 2021-10-29 00:22:43 +02:00
Přemysl Eric Janouch f139efba6d
Support Windows XP forever
GTK+ 3 has been almost abandoned, and there is little newer versions
could improve, so keep supporting the old and working 3.8.
2021-10-28 21:36:54 +02:00
Přemysl Eric Janouch 83c1e7a491
Update translations 2021-10-28 21:33:09 +02:00
Přemysl Eric Janouch 59b5ff7020
Append ellipsis to the Print menu item
It opens a dialog.
2021-10-28 20:05:31 +02:00
Přemysl Eric Janouch 2bc9fe4f1d
Fix scaling to fit paper 2021-10-28 06:14:21 +02:00
Přemysl Eric Janouch bd12c0502a
Update user guides
Now add text labels, and this project is functionally complete.
2021-10-28 06:01:03 +02:00
Přemysl Eric Janouch 4f01392de5
Add basic print functionality
Sadly, the line width depends on the widget's DPI, which seems to
even cause uneven lines on Windows, where virtual printers claim
high DPI.  It might also be an unrelated problem.

Similarly, selected objects are exported highlighted.

Other than that, it works quite well.

Add a manifest to make the print dialog look nice with the older
GTK+ bundle we depend upon.

The RC file could theoretically be scanned for /\s+"([^"]+)"\s*$/,
unescaped, and the results configure_file()-stamped.
2021-10-28 05:57:27 +02:00
Přemysl Eric Janouch 6cd6ddbd1c
ld-window-main.c: clean up 2021-10-28 05:25:57 +02:00
Přemysl Eric Janouch a4a0dd2106
Clean up
It turns out the RC detection snippet is no longer necessary
after the recent CMake version bump.

The "name" argument in the UI file is redundant, implied by "action".
2021-10-28 05:18:03 +02:00
Přemysl Eric Janouch b45670f9e9
CMakeLists.txt: simplify NSIS configuration
Functionality has been verified to remain as it was
on a native Windows XP build using NSIS 3.08.
2021-10-27 21:47:49 +02:00
Přemysl Eric Janouch 06e3c9e280
Bind # to toggling the view grid
As seen in Inkscape.
2021-10-27 18:38:33 +02:00
Přemysl Eric Janouch 073a4cd4a7
CMakeLists.txt: don't look for gtk-doc by default
The integration is broken and it spams with a warning message
when building on Windows directly.
2021-10-26 20:12:26 +02:00
Přemysl Eric Janouch f7807cada2
Make the about dialog link work in Windows XP
For some weird reason, GTK+ is trying to connect to URLs first,
which typically won't succeed these days.
2021-10-26 07:37:50 +02:00
Přemysl Eric Janouch 08cf0ef2e6
Make development builds find the program icon 2021-10-26 06:32:29 +02:00
Přemysl Eric Janouch baf2dc8ccd
Fix help on Windows with newer GIO
It needs its launch helper, luckily it's a tiny binary.
2021-10-25 23:12:14 +02:00
Přemysl Eric Janouch a5e341bcc1
Update README 2021-10-25 18:21:23 +02:00
Přemysl Eric Janouch bc8ceebef7
Add clang-format configuration, clean up 2021-10-25 18:06:50 +02:00
Přemysl Eric Janouch da0a5c43dc
Add the user guide to the Help menu
The old GLib put up a good fight, it says "URIs not supported"
even for the file:// scheme.
2021-10-25 02:50:14 +02:00
Přemysl Eric Janouch 384dad7bd8
Get rid of extra semicolons after macros 2021-10-25 00:27:32 +02:00
Přemysl Eric Janouch ada833a009
Abandon AsciiDoc in favor of plain HTML
It is very difficult to set up Python or Ruby on Windows XP.

Simple HTML works better, everywhere, it covers all our needs,
and it isn't any harder to write.

This documentation is now installed.
2021-10-25 00:04:28 +02:00
Přemysl Eric Janouch 924617e1ce
Silence some GLib deprecation warnings
Using the GLib version from the GTK+ 3.8.2 bundle.
2021-10-24 16:45:53 +02:00
Přemysl Eric Janouch 67acddb26d
Disable the broken gtk-doc rule by default
Unlikely to be used by anyone, especially since it cannot produce
anything useful anymore.
2021-10-24 16:43:55 +02:00
Přemysl Eric Janouch bc1dd64fdf
Partially unbreak the hopeless gtk-doc
GNOME Idiots Inc. keep breaking everything,
sometimes in coöperation with KitWare KludgeMakers Ltd.
2021-10-24 15:31:03 +02:00
Přemysl Eric Janouch 8c290df7b5
Update README 2021-10-23 20:27:51 +02:00
Přemysl Eric Janouch 5fc35517cb
Update README 2021-10-23 20:11:10 +02:00
Přemysl Eric Janouch 5a4cffd35e
Win32Depends.cmake: remove an unused feature 2021-10-23 20:02:45 +02:00
Přemysl Eric Janouch 3a087ad581
Remove unnecessary DLLs from Windows builds
This saves 20 MiB and 4 MiB of libraries in MSYS2 and bundle
builds respectively, in total, without any adverse effects.

The MSYS2 build remains bloated, due to the Adwaita icon theme.

Bump minimum CMake version to avoid a bug.
2021-10-23 18:01:30 +02:00
Přemysl Eric Janouch 4305c603e9
CMakeLists.txt: clean-up
Use the newer 3.0 string quoting to save some ugly escaping.
2021-10-23 16:35:36 +02:00
70 changed files with 1756 additions and 1245 deletions

38
.clang-format Normal file
View File

@ -0,0 +1,38 @@
# clang-format is fairly limited, and these rules are approximate:
# - array initializers can get terribly mangled with clang-format 12.0,
# - sometimes it still aligns with space characters,
# - struct name NL { NL ... NL } NL name; is unachievable.
BasedOnStyle: GNU
ColumnLimit: 80
IndentWidth: 4
TabWidth: 4
UseTab: ForContinuationAndIndentation
BreakBeforeBraces: Allman
SpaceAfterCStyleCast: true
AlignConsecutiveAssignments: true
AlignAfterOpenBracket: DontAlign
AlignEscapedNewlines: DontAlign
AlignOperands: DontAlign
AlignConsecutiveMacros: Consecutive
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
IndentGotoLabels: false
Cpp11BracedListStyle: true
MaxEmptyLinesToKeep: 2
# IncludeCategories has some potential, but currently it breaks build.
# Note that the documentation says the value should be "Never".
SortIncludes: false
# Must be kept synchronized with gi18n.h and make-template.sh.
WhitespaceSensitiveMacros: ['_', 'Q_', 'N_', 'C_', 'NC_']
# This is a compromise, it generally works out aesthetically better.
BinPackArguments: false
# Unfortunately, this doesn't work for block comments, used in logdiag.
SpacesBeforeTrailingComments: 2
# logdiag-specific function body wrappers.
MacroBlockBegin: "LD_LUA_CAIRO_BEGIN"
MacroBlockEnd: "LD_LUA_CAIRO_END"

1
.gitignore vendored
View File

@ -1,4 +1,3 @@
/build
/win32-depends
/liblogdiag/ld-marshal.[ch]
/CMakeLists.txt.user

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "vera++"]
path = vera++
url = https://bitbucket.org/verateam/vera.git

View File

@ -1,13 +1,15 @@
# The last version with Windows XP support is 3.13, we want to keep that
cmake_minimum_required (VERSION 3.9)
project (logdiag VERSION 0.2.1 LANGUAGES C)
cmake_minimum_required (VERSION 3.10)
project (logdiag VERSION 0.3.0 DESCRIPTION "Schematic editor" LANGUAGES C)
# Options
option (OPTION_USE_VERA "Use vera++ for source code style checks" OFF)
option (OPTION_NOINSTALL "Only for developers; work without installing" OFF)
option (OPTION_CLANG_TIDY "Enable use of clang-tidy" OFF)
option (OPTION_NOINSTALL "For developers only--work without installing" OFF)
option (OPTION_GTKDOC "For developers only--enable use of gtk-doc" OFF)
option (BUILD_TESTING "Build tests" OFF)
# Project information
set (project_ID "name.janouch.${PROJECT_NAME}")
set (project_URL "https://git.janouch.name/p/logdiag")
# For custom modules
@ -22,19 +24,13 @@ if (WIN32)
if (CMAKE_CROSSCOMPILING)
list (APPEND CMAKE_FIND_ROOT_PATH ${WIN32_DEPENDS_PATH})
endif (CMAKE_CROSSCOMPILING)
endif ()
set (PKG_CONFIG_USE_CMAKE_PREFIX_PATH FALSE)
# Seems like there is a regression setting this to two paths in one,
# setting the path manually
set (ENV{PKG_CONFIG_PATH} "${WIN32_DEPENDS_PATH}/lib/pkgconfig")
add_custom_target (win32-depends COMMAND ${CMAKE_COMMAND} -P
${PROJECT_SOURCE_DIR}/Win32Depends.cmake
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
add_custom_target (win32-depends-clean COMMAND ${CMAKE_COMMAND} -E
remove_directory ${WIN32_DEPENDS_PATH})
endif (WIN32)
endif ()
# Generate icons
find_program (CONVERT_EXECUTABLE convert)
@ -45,6 +41,7 @@ if (CONVERT_EXECUTABLE AND NOT WIN32)
set (icon_svg ${icon_base}/scalable/apps/logdiag.svg)
set (icon_size_list 16x16 32x32 48x48)
# ImageMagick very oddly outperforms rsvg-convert with our specific SVG
set (icon_png_list)
set (icon_symbolic_list)
foreach (icon_size ${icon_size_list})
@ -61,35 +58,37 @@ if (CONVERT_EXECUTABLE AND NOT WIN32)
DEPENDS ${icon_svg} VERBATIM)
set_source_files_properties (${icon_symbolic}
PROPERTIES SYMBOLIC TRUE)
endforeach (icon_size)
endforeach ()
# Symbolic targets prevent the icons from being either cleaned,
# or pointlessly regenerated slightly differently
set (icon_ico ${PROJECT_SOURCE_DIR}/share/logdiag.ico)
add_custom_target (${PROJECT_NAME}_icons
DEPENDS ${icon_symbolic_list}
COMMAND ${CONVERT_EXECUTABLE} ${icon_png_list} ${icon_ico}
COMMENT "Generating logdiag.ico" VERBATIM)
endif (CONVERT_EXECUTABLE AND NOT WIN32)
endif ()
# Dependencies
find_package (PkgConfig REQUIRED)
pkg_check_modules (GTK3 REQUIRED gtk+-3.0 json-glib-1.0)
link_directories (${GTK3_LIBRARY_DIRS})
if (NOT WIN32)
pkg_search_module (Lua REQUIRED lua>=5.2 lua5.3 lua-5.3 lua5.2 lua-5.2)
else (NOT WIN32)
pkg_search_module (Lua REQUIRED lua>=5.2
lua5.4 lua-5.4 lua5.3 lua-5.3 lua5.2 lua-5.2)
link_directories (${Lua_LIBRARY_DIRS})
else ()
# For whatever reason this now seems to be required
set (LUA_INCLUDE_DIR "${WIN32_DEPENDS_PATH}/include")
find_package (Lua REQUIRED)
if (LUA_VERSION_STRING VERSION_LESS "5.2")
message (FATAL_ERROR "Lua 5.2 not found")
endif (LUA_VERSION_STRING VERSION_LESS "5.2")
endif ()
set (Lua_LIBRARIES ${LUA_LIBRARIES})
set (Lua_INCLUDE_DIRS ${LUA_INCLUDE_DIR})
endif (NOT WIN32)
# This actually fucks up MinGW cross-compilation if omitted
link_directories (${GTK3_LIBRARY_DIRS})
endif ()
# Localization
find_package (Gettext REQUIRED)
@ -101,15 +100,11 @@ GETTEXT_CREATE_TRANSLATIONS (
foreach (file ${project_PO_FILES})
get_filename_component (translation "${file}" NAME_WE)
list (APPEND project_TRANSLATIONS "${translation}")
endforeach (file)
# Documentation--gtk-doc 1.25 is required
find_package (GtkDoc 1.25)
set (project_DOC_DIR "${PROJECT_BINARY_DIR}/liblogdiag")
endforeach ()
# Project source files
set (liblogdiag_SOURCES
liblogdiag/ld-marshal.c
${PROJECT_BINARY_DIR}/ld-marshal.c
liblogdiag/ld-types.c
liblogdiag/ld-undo-action.c
liblogdiag/ld-diagram.c
@ -126,9 +121,9 @@ set (liblogdiag_SOURCES
liblogdiag/ld-lua.c
liblogdiag/ld-lua-symbol.c)
set (liblogdiag_HEADERS
${PROJECT_BINARY_DIR}/ld-marshal.h
${PROJECT_BINARY_DIR}/config.h
liblogdiag/liblogdiag.h
liblogdiag/ld-marshal.h
liblogdiag/ld-types.h
liblogdiag/ld-undo-action.h
liblogdiag/ld-diagram.h
@ -152,77 +147,93 @@ set (logdiag_TESTS
diagram)
set (logdiag_SOURCES
${PROJECT_BINARY_DIR}/gresource.c
src/ld-window-main.c
src/logdiag.c)
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)
endif (WIN32)
# Generate a configure file
configure_file (${PROJECT_SOURCE_DIR}/config.h.in
${PROJECT_BINARY_DIR}/config.h)
include_directories (${PROJECT_BINARY_DIR})
# The file isn't scanned for dependencies, but they will only rarely change
list (APPEND logdiag_SOURCES share/logdiag.rc)
endif ()
# Generate marshallers
find_program (GLIB_GENMARSHAL_EXECUTABLE glib-genmarshal)
if (NOT GLIB_GENMARSHAL_EXECUTABLE)
message (FATAL_ERROR "glib-genmarshal not found")
endif (NOT GLIB_GENMARSHAL_EXECUTABLE)
function (glib_genmarshal listfile prefix)
find_program (GLIB_GENMARSHAL_EXECUTABLE glib-genmarshal)
if (NOT GLIB_GENMARSHAL_EXECUTABLE)
message (FATAL_ERROR "glib-genmarshal not found")
endif ()
function (glib_genmarshal base prefix)
get_filename_component (base_path "${base}" PATH)
get_filename_component (base_name "${base}" NAME)
set (command_base ${GLIB_GENMARSHAL_EXECUTABLE}
--prefix ${prefix} "${base_name}.list")
get_filename_component (_basename "${listfile}" NAME_WE)
set (_command_base ${GLIB_GENMARSHAL_EXECUTABLE} --prefix ${prefix}
"${listfile}")
# On Windows, the final makefile may contain:
add_custom_command (OUTPUT ${_basename}.c ${_basename}.h
COMMAND ${_command_base} --body > ${_basename}.c
COMMAND ${_command_base} --header > ${_basename}.h
DEPENDS "${listfile}"
COMMENT "Generating marshallers source files" VERBATIM)
endfunction ()
glib_genmarshal (${PROJECT_SOURCE_DIR}/liblogdiag/ld-marshal.list ld_marshal)
# Generate resources
function (glib_compile_resources xml target)
find_program (GLIB_COMPILE_RESOURCES_EXECUTABLE glib-compile-resources)
if (NOT GLIB_COMPILE_RESOURCES_EXECUTABLE)
message (FATAL_ERROR "glib-compile-resources not found")
endif ()
# glib-compile-resources reads paths relative to its working directory
get_filename_component (_xml_path "${xml}" PATH)
# On Windows, the final Makefile may contain:
# cd e:\abc && ...
# That won't actually change the directory. We have to do:
# cd e:\abc && e: && ...
if (WIN32 AND "${base_path}" MATCHES "^.:[/\\\\]")
string (SUBSTRING "${base_path}" 0 2 base_drive)
set (command_base "${base_drive}" && "${command_base}")
endif (WIN32 AND "${base_path}" MATCHES "^.:[/\\\\]")
set (_prefix)
if (WIN32 AND "${_xml_path}" MATCHES "^.:[/\\\\]")
string (SUBSTRING "${_xml_path}" 0 2 _xml_drive)
set (_prefix ${_xml_drive} &&)
endif ()
# NOTE: VERBATIM would cause problems, so it is not used here
add_custom_command (OUTPUT ${base}.c
COMMAND ${command_base} --body > "${base_name}.c"
DEPENDS "${base}.list"
WORKING_DIRECTORY "${base_path}"
COMMENT "Generating marshallers source file")
add_custom_command (OUTPUT ${base}.h
COMMAND ${command_base} --header > "${base_name}.h"
DEPENDS "${base}.list"
WORKING_DIRECTORY "${base_path}"
COMMENT "Generating marshallers header file")
endfunction (glib_genmarshal)
# VERBATIM would cause problems, so it is not used here
add_custom_command (OUTPUT ${target}
COMMAND ${_prefix} ${GLIB_COMPILE_RESOURCES_EXECUTABLE}
--generate-source --target ${target} "${xml}" DEPENDS "${xml}"
WORKING_DIRECTORY "${_xml_path}" COMMENT "Compiling resources")
glib_genmarshal (${PROJECT_SOURCE_DIR}/liblogdiag/ld-marshal
ld_marshal)
execute_process (COMMAND ${GLIB_COMPILE_RESOURCES_EXECUTABLE}
--generate-dependencies "${xml}"
WORKING_DIRECTORY "${_xml_path}" OUTPUT_VARIABLE _deps)
string (REPLACE "\n" ";" _deps "${_deps}")
foreach (_dep ${_deps})
set_property (SOURCE "${target}"
APPEND PROPERTY OBJECT_DEPENDS "${_xml_path}/${_dep}")
endforeach ()
include_directories (${PROJECT_SOURCE_DIR})
include_directories (${GTK3_INCLUDE_DIRS} ${Lua_INCLUDE_DIRS})
configure_file ("${xml}" glib-compile-resources.stamp COPYONLY)
endfunction ()
glib_compile_resources (${PROJECT_SOURCE_DIR}/share/logdiag.gresource.xml
${PROJECT_BINARY_DIR}/gresource.c)
# Generate a configure file
add_definitions (-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_36)
add_definitions (-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_36)
configure_file (config.h.in ${PROJECT_BINARY_DIR}/config.h)
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR}
${GTK3_INCLUDE_DIRS} ${Lua_INCLUDE_DIRS})
set (logdiag_LIBS ${GTK3_LIBRARIES} ${Lua_LIBRARIES} m)
if (WIN32)
find_package (LibIntl REQUIRED)
list (APPEND logdiag_LIBS ${LIBINTL_LIBRARIES})
endif (WIN32)
find_package (Intl REQUIRED)
list (APPEND logdiag_LIBS ${Intl_LIBRARIES} shell32)
endif ()
# Build the library
add_library (liblogdiag STATIC ${liblogdiag_SOURCES} ${liblogdiag_HEADERS})
@ -232,31 +243,66 @@ set_target_properties (liblogdiag PROPERTIES OUTPUT_NAME logdiag)
add_executable (logdiag WIN32 ${logdiag_SOURCES} ${logdiag_HEADERS})
target_link_libraries (logdiag liblogdiag ${logdiag_LIBS})
# GSettings
find_program (GLIB_COMPILE_SCHEMAS_EXECUTABLE glib-compile-schemas)
if (NOT GLIB_COMPILE_SCHEMAS_EXECUTABLE)
message (FATAL_ERROR "glib-compile-schemas not found")
endif ()
set (GSETTINGS_DIR "${PROJECT_SOURCE_DIR}/share")
set (GSETTINGS_SCHEMAS "${GSETTINGS_DIR}/${PROJECT_NAME}.gschema.xml")
if (OPTION_NOINSTALL)
set (GSETTINGS_COMPILED_SCHEMA "${PROJECT_BINARY_DIR}/gschemas.compiled")
add_custom_command (OUTPUT "${GSETTINGS_COMPILED_SCHEMA}"
COMMAND ${GLIB_COMPILE_SCHEMAS_EXECUTABLE}
"--targetdir=${PROJECT_BINARY_DIR}" "${GSETTINGS_DIR}"
DEPENDS "${GSETTINGS_SCHEMAS}"
COMMENT "Compiling GSettings schema files" VERBATIM)
add_custom_target (${PROJECT_NAME}-gschema ALL
DEPENDS "${GSETTINGS_COMPILED_SCHEMA}")
endif ()
# Testing
if (BUILD_TESTING)
enable_testing ()
add_test (NAME test-gschema-${PROJECT_NAME}
COMMAND ${GLIB_COMPILE_SCHEMAS_EXECUTABLE} --dry-run "${GSETTINGS_DIR}")
foreach (name ${logdiag_TESTS})
add_executable (test-${name} tests/${name}.c)
target_link_libraries (test-${name} liblogdiag ${logdiag_LIBS})
add_test (NAME test-${name} COMMAND test-${name})
list (APPEND logdiag_TEST_TARGETS test-${name})
endforeach (name)
endforeach ()
if (WIN32 AND NOT CMAKE_CROSSCOMPILING)
set_tests_properties (${logdiag_TEST_TARGETS}
PROPERTIES ENVIRONMENT "PATH=${WIN32_DEPENDS_PATH}/bin")
endif ()
endif (BUILD_TESTING)
endif ()
# Generate documentation
if (GTKDOC_FOUND)
# FIXME: not our bug but xml/gtkdocentities.ent cannot be passed
target_link_libraries (liblogdiag ${logdiag_LIBS})
if (OPTION_GTKDOC)
find_package (GtkDoc 1.25 REQUIRED)
set (project_DOC_DIR "${PROJECT_BINARY_DIR}/liblogdiag")
# Extracted LDFLAGS didn't contain -l in CMake 3.21.3 and gtk-doc 1.33.2,
# pass them explicitly and work around insanity; CMake still exits with
# an error and gtk-doc produces empty HTML documentation
string (REGEX REPLACE "(;)([^-])" "\\1-l\\2" xldflags "${logdiag_LIBS}")
set_target_properties (liblogdiag PROPERTIES LINK_LIBRARIES "")
# The "official" module wants an XML file I don't want to give it
file (WRITE ${PROJECT_BINARY_DIR}/liblogdiag-docs-dummy.xml "<book/>")
# XXX: not our bug but xml/gtkdocentities.ent cannot be passed
# XXX: this causes `make clean` to remove the entire build directory,
# because it marks CMAKE_CURRENT_BINARY_DIR as an output
gtk_doc_add_module (liblogdiag
SOURCE ${PROJECT_SOURCE_DIR}/liblogdiag
SUFFIXES c h
# The "official" module wants an XML file I don't want to give it
XML ${PROJECT_BINARY_DIR}/liblogdiag/liblogdiag-docs.xml
SUFFIXES c h LDFLAGS "-l${xldflags}"
XML ${PROJECT_BINARY_DIR}/liblogdiag-docs-dummy.xml
LIBRARIES liblogdiag)
endif ()
@ -264,68 +310,38 @@ find_package (CppCheck)
GENERATE_CPPCHECK (SOURCES liblogdiag src tests ENABLE_IDS all
TARGET_NAME ${PROJECT_NAME}_cppcheck INCLUDES ${PROJECT_BINARY_DIR})
if (OPTION_USE_VERA)
# Force this off, we don't need it
option (VERA_LUA "" OFF)
# Various clang-based diagnostics, loads of fake positives and spam
if (OPTION_CLANG_TIDY)
set (clang_tidy_checks
clang-analyzer-* bugprone-* misc-* readability-* performance-*
-bugprone-reserved-identifier # GObject
-performance-no-int-to-ptr # GObject
-bugprone-narrowing-conversions
-bugprone-macro-parentheses # too coarse-grained
-readability-braces-around-statements # fine by me
-readability-isolate-declaration # fine by me
-readability-magic-numbers # too coarse-grained
-misc-unused-parameters) # fine by me
# Make it build within the same build tree
get_directory_property (backup_includes INCLUDE_DIRECTORIES)
set_directory_properties (PROPERTIES INCLUDE_DIRECTORIES "")
set (backup_source_dir "${CMAKE_SOURCE_DIR}")
set (CMAKE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/vera++")
string (REPLACE ";" "," clang_tidy_checks "${clang_tidy_checks}")
set (clang_tidy_config "{
Checks: '${clang_tidy_checks}',
CheckOptions: [{
key: readability-function-cognitive-complexity.Threshold,
value: '30'
}]}")
add_subdirectory ("vera++")
string (REPLACE "\n" " " clang_tidy_config "${clang_tidy_config}")
set_directory_properties (PROPERTIES INCLUDE_DIRECTORIES "${backup_includes}")
set (CMAKE_SOURCE_DIR "${backup_source_dir}")
# Check the sources
# XXX: maybe do it per source file and not all at once
set (vera_srcs ${liblogdiag_SOURCES} ${logdiag_SOURCES} ${logdiag_HEADERS})
set (vera_output ${PROJECT_BINARY_DIR}/vera.log)
add_custom_command (OUTPUT ${vera_output}
COMMAND vera
-R F001 -R L001 -R T001 -R T004 -R T005 -R T006
-R T007 -R T009 -R T010 -R T015 -R T017 -R T018
-R L004 -P max-line-length=80
-R L005 -P max-consecutive-empty-lines=2
--root ${CMAKE_SOURCE_DIR}/vera++
--std-report=-
--std-report=${vera_output}
--warning -s
${vera_srcs}
DEPENDS ${vera_srcs}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Checking style for logdiag")
add_custom_target (logdiag_vera ALL DEPENDS ${vera_output})
endif (OPTION_USE_VERA)
# GSettings
find_program (GLIB_COMPILE_SCHEMAS_EXECUTABLE glib-compile-schemas)
if (NOT GLIB_COMPILE_SCHEMAS_EXECUTABLE)
message (FATAL_ERROR "glib-compile-schemas not found")
endif (NOT GLIB_COMPILE_SCHEMAS_EXECUTABLE)
set (GSETTINGS_DIR "${PROJECT_SOURCE_DIR}/share")
set (GSETTINGS_SCHEMAS "${GSETTINGS_DIR}/org.logdiag.gschema.xml")
add_custom_target (${PROJECT_NAME}_gschema_check
COMMAND ${GLIB_COMPILE_SCHEMAS_EXECUTABLE} --dry-run "${GSETTINGS_DIR}"
DEPENDS "${GSETTINGS_SCHEMAS}"
COMMENT "Checking GSettings schema files" VERBATIM)
if (OPTION_NOINSTALL)
set (GSETTINGS_COMPILED_SCHEMA "${PROJECT_BINARY_DIR}/gschemas.compiled")
add_custom_command (OUTPUT "${GSETTINGS_COMPILED_SCHEMA}"
COMMAND ${GLIB_COMPILE_SCHEMAS_EXECUTABLE}
"--targetdir=${PROJECT_BINARY_DIR}" "${GSETTINGS_DIR}"
DEPENDS "${GSETTINGS_SCHEMAS}"
COMMENT "Compiling GSettings schema files" VERBATIM)
add_custom_target (${PROJECT_NAME}_gschema ALL
DEPENDS "${GSETTINGS_COMPILED_SCHEMA}")
endif (OPTION_NOINSTALL)
set (CMAKE_EXPORT_COMPILE_COMMANDS ON)
set (clang_tidy_sources ${liblogdiag_SOURCES} ${logdiag_SOURCES})
add_custom_target (${PROJECT_NAME}_clang_tidy
COMMAND clang-tidy --quiet -p ${PROJECT_BINARY_DIR}
"--config=${clang_tidy_config}" ${clang_tidy_sources}
| sh -c "cat 1>&2"
DEPENDS ${clang_tidy_sources} VERBATIM
USES_TERMINAL WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
endif ()
# Installation
if (WIN32)
@ -333,8 +349,7 @@ if (WIN32)
install (DIRECTORY
${WIN32_DEPENDS_PATH}/bin/
DESTINATION .
FILES_MATCHING PATTERN "*.dll"
PATTERN "libgettext*" EXCLUDE)
FILES_MATCHING PATTERN "*.dll" PATTERN "gspawn-*-helper.exe")
install (DIRECTORY
${WIN32_DEPENDS_PATH}/etc/
DESTINATION etc)
@ -364,9 +379,11 @@ if (WIN32)
install (DIRECTORY
${WIN32_DEPENDS_PATH}/share/locale/${translation}
DESTINATION share/locale)
endif (translation_found GREATER -1)
endforeach (locale)
else (WIN32)
endif ()
endforeach ()
install (SCRIPT Win32Cleanup.cmake)
else ()
install (TARGETS logdiag DESTINATION bin)
install (FILES share/logdiag.desktop DESTINATION share/applications)
install (FILES share/logdiag.xml DESTINATION share/mime/packages)
@ -375,18 +392,19 @@ else (WIN32)
# install (DIRECTORY "${project_DOC_DIR}/html/"
# DESTINATION share/gtk-doc/html/${PROJECT_NAME})
install (FILES LICENSE NEWS DESTINATION share/doc/${PROJECT_NAME})
endif (WIN32)
endif ()
install (DIRECTORY share/gui share/library DESTINATION share/${PROJECT_NAME})
install (FILES ${GSETTINGS_SCHEMAS} DESTINATION share/glib-2.0/schemas)
install (CODE " # DESTDIR is not in use on Windows
install (DIRECTORY docs/user-guide DESTINATION share/doc/${PROJECT_NAME})
install (DIRECTORY share/library DESTINATION share/${PROJECT_NAME})
install (FILES ${GSETTINGS_SCHEMAS} DESTINATION share/glib-2.0/schemas
RENAME "${project_ID}.gschema.xml")
install (CODE " # DESTDIR is not in use on Windows (WIN32 is only native here!)
if (WIN32 OR \"\$ENV{DESTDIR}\" STREQUAL \"\")
execute_process (COMMAND \"${GLIB_COMPILE_SCHEMAS_EXECUTABLE}\"
\"\${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas\")
endif (WIN32 OR \"\$ENV{DESTDIR}\" STREQUAL \"\")")
endif ()")
# CPack
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Schematic editor")
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
@ -394,10 +412,10 @@ set (CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
if (WIN32)
set (CPACK_GENERATOR "NSIS;ZIP")
else (WIN32)
else ()
set (CPACK_GENERATOR "TGZ;ZIP")
set (CPACK_SET_DESTDIR TRUE)
endif (WIN32)
endif ()
set (CPACK_PACKAGE_FILE_NAME
"${PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
@ -409,22 +427,21 @@ set (CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${PROJECT_NAME}")
set (CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/share\\\\header.bmp")
set (CPACK_NSIS_INSTALLED_ICON_NAME "logdiag.exe")
set (CPACK_NSIS_CREATE_ICONS_EXTRA "
CreateShortCut '\$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\logdiag.lnk' '\$INSTDIR\\\\logdiag.exe'")
set (CPACK_NSIS_DELETE_ICONS_EXTRA "
Delete '\$SMPROGRAMS\\\\$MUI_TEMP\\\\logdiag.lnk'")
set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
set (CPACK_NSIS_URL_INFO_ABOUT "${project_URL}")
set (CPACK_NSIS_HELP_LINK "${project_URL}")
# Or CPACK_NSIS_EXECUTABLES_DIRECTORY needs to be changed from "bin"
set (CPACK_NSIS_MENU_LINKS "logdiag.exe" ${PROJECT_NAME})
set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS [[
WriteRegStr HKCR '.ldd' '' 'logdiag.Diagram'
WriteRegStr HKCR 'logdiag.Diagram' '' 'logdiag Diagram'
WriteRegStr HKCR 'logdiag.Diagram\\\\shell\\\\open\\\\command' '' '\\\"\$INSTDIR\\\\logdiag.exe\\\" \\\"%1\\\"'
WriteRegStr HKCR 'logdiag.Diagram\\\\shell\\\\edit\\\\command' '' '\\\"\$INSTDIR\\\\logdiag.exe\\\" \\\"%1\\\"'
System::Call 'shell32::SHChangeNotify(i,i,i,i) (0x08000000, 0x1000, 0, 0)'")
set (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
WriteRegStr HKCR 'logdiag.Diagram\\shell\\open\\command' '' '\"$INSTDIR\\logdiag.exe\" \"%1\"'
WriteRegStr HKCR 'logdiag.Diagram\\shell\\edit\\command' '' '\"$INSTDIR\\logdiag.exe\" \"%1\"'
System::Call 'shell32::SHChangeNotify(i,i,i,i) (0x08000000, 0x1000, 0, 0)'
]])
set (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS [[
DeleteRegKey HKCR 'logdiag.Diagram'
System::Call 'shell32::SHChangeNotify(i,i,i,i) (0x08000000, 0x1000, 0, 0)'")
string (REPLACE "https://" "https:\\\\\\\\" project_URL_NSIS "${project_URL}")
set (CPACK_NSIS_URL_INFO_ABOUT "${project_URL_NSIS}")
System::Call 'shell32::SHChangeNotify(i,i,i,i) (0x08000000, 0x1000, 0, 0)'
]])
set (CPACK_DEBIAN_PACKAGE_DEPENDS
"libgtk3.0-0 (>= 3.8), libjson-glib-1.0-0 (>= 0.10.4), liblua5.2-0")
@ -435,12 +452,11 @@ set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${project_URL}")
set (CPACK_RPM_PACKAGE_REQUIRES "gtk3 >= 3.8, json-glib >= 0.10.4, lua = 5.2")
set (CPACK_RPM_PACKAGE_GROUP "Graphics")
set (CPACK_RPM_PACKAGE_LICENSE "ISC")
set (CPACK_RPM_PACKAGE_LICENSE "0BSD")
set (CPACK_RPM_PACKAGE_URL "${project_URL}")
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user;/win32-depends;/liblogdiag/ld-marshal.[ch]")
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user;/win32-depends")
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
include (CPack)

13
NEWS
View File

@ -1,3 +1,14 @@
Version 0.3.0
- Added basic print functionality (lines may have the wrong width).
- Fine-tuned rendering of a few symbols.
- Bound toggling of the grid to the # key, following Inkscape.
- Ensured all opened files are added to the list of recent files.
- View position is reset when opening files.
- Made the user guide available from the Help menu.
- The website link in the About dialog now opens on Windows XP.
- Put the project's license in the About dialog.
- Made Windows builds considerably slimmer.
Version 0.2.1
- Set up grounds for 64-bit Windows builds using the latest GTK+ 3.
- Made the Windows installer ask to uninstall previous versions first.
@ -18,8 +29,6 @@ Version 0.2.0
- Symbol categories are also loaded from user-specific directories.
- Show current zoom in the statusbar.
- Ported to GTK+ 3 and Lua 5.2.
- This is the last version supporting Windows XP (we use an outdated GTK+
bundle, support for this operating system has been dropped in version 3.18).
- Various unimportant fixes and changes.
- Known issues: Windows XP looks ugly with the classic theme, little we can do.

View File

@ -3,19 +3,25 @@ logdiag
'logdiag' is a simple multiplatform schematic editor written in GTK+.
This software has never really been finished, and is no longer being worked on.
This software has never really been finished, and is no longer being worked on,
although I strive to keep it building on Windows XP and elsewhere.
image::docs/user-guide/logdiag-en.png[align="center"]
Packages
--------
Regular releases are sporadic. git master should be stable enough. You can get
a package with the latest development version from Archlinux's AUR.
Regular releases are sporadic. git master should be stable enough.
You can get a package with the latest development version using Arch Linux's
https://aur.archlinux.org/packages/logdiag-git[AUR],
or as a https://git.janouch.name/p/nixexprs[Nix derivation].
Windows installers can be downloaded from
https://git.janouch.name/p/logdiag/releases[the Releases page on Gitea].
Requirements
------------
Runtime dependencies: GTK+ >= 3.8, json-glib >= 0.10.4, lua >= 5.2 +
Build dependencies: CMake >= 3.9
Build dependencies: CMake >= 3.10
Build from source on Unix-like systems
--------------------------------------
@ -32,49 +38,48 @@ application to be installed. The default is _/usr/local_.
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
Now you have two basic choices of installing the application.
Using _make install_
~~~~~~~~~~~~~~~~~~~~
Now you have two basic choices of installing the application:
1. Using _make install_:
+
# make install
Using _cpack_
~~~~~~~~~~~~~
2. Using _cpack_:
+
You have to choose a package format understood by your system package manager.
CMake offers DEB and RPM.
+
After _cpack_ finishes making the package, install this file.
+
$ cpack -G DEB
# dpkg -i logdiag-version-system-arch.deb
Build from source on Windows
----------------------------
_Note that with the current method we're stuck with GTK+ 3.8.2._
_Note that using the current method we're stuck with GTK+ 3.8.2, which works
worse on Windows 10, but better on XP and under WINE._
First install CMake and MinGW. Add both to your system path. If you want
to build an installation package, also install NSIS. If you want to build within
a path containing spaces, fix your FindPkgConfig.cmake to say:
First, install CMake and MinGW (mingw32-base-bin, mingw32-gettext-dev).
Ensure they're both in your system path. If you want to build an installation
package, also install NSIS. If you want to build within a path containing
spaces, https://gitlab.kitware.com/cmake/cmake/-/issues/22396[fix] your CMake's
FindPkgConfig.cmake module to say:
separate_arguments(_pkgconfig_invoke_result UNIX_COMMAND "${_pkgconfig_invoke_result}")
Run the following command in the directory with source files to automatically
fetch and setup all dependencies (contact me if the script becomes obsolete,
it's easy to fix but I usually update it only just a short while before
releasing a new version in order to resolve compatibility issues):
fetch and set up all dependencies:
> cmake -P Win32Depends.cmake
Note that Windows XP is no longer able to reliably download from HTTPS sources.
Note that on Windows XP, CMake will fail to download those files, even with
https://emailarchitect.net/easendmail/sdk/html/object_tls12.htm[updates].
You will have to run the script externally.
Reserve a directory for an out-of-source build:
Reserve a directory for an out-of-source build and let CMake prepare the build:
> mkdir build
> cd build
Let CMake prepare the build:
> cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
Now you can generate a package with CPack. You may choose between:
@ -97,14 +102,13 @@ Just install MinGW-w64 and let automation take care of the rest.
$ cmake -P Win32Depends.cmake
$ mkdir build
$ cd build
$ cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../ToolchainCrossMinGWW64.cmake \
-DCMAKE_BUILD_TYPE=Release
$ cmake -DCMAKE_TOOLCHAIN_FILE=../ToolchainCrossMinGWW64.cmake \
-DCMAKE_BUILD_TYPE=Release ..
$ cpack
Alternatively, for an unnecessarily bloated MSYS2-based 64-bit build:
$ sh Win64Depends.sh
$ sh -e Win64Depends.sh
$ cmake -DCMAKE_TOOLCHAIN_FILE=ToolchainCrossWin64.cmake \
-DCMAKE_BUILD_TYPE=Release -B build
$ cmake --build build -- package

View File

@ -5,12 +5,11 @@ set (CMAKE_C_COMPILER "i586-mingw32msvc-gcc")
set (CMAKE_CXX_COMPILER "i586-mingw32msvc-g++")
set (CMAKE_RC_COMPILER "i586-mingw32msvc-windres")
# Not needed to crosscompile an installation package
#set (CMAKE_CROSSCOMPILING_EMULATOR "wine")
# Remember to set WINEPATH for library dependencies
set (CMAKE_CROSSCOMPILING_EMULATOR "wine")
set (CMAKE_FIND_ROOT_PATH "/usr/i586-mingw32msvc")
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

View File

@ -5,12 +5,11 @@ set (CMAKE_C_COMPILER "i686-w64-mingw32-gcc")
set (CMAKE_CXX_COMPILER "i686-w64-mingw32-g++")
set (CMAKE_RC_COMPILER "i686-w64-mingw32-windres")
# Not needed to crosscompile an installation package
#set (CMAKE_CROSSCOMPILING_EMULATOR "wine")
# Remember to set WINEPATH for library dependencies
set (CMAKE_CROSSCOMPILING_EMULATOR "wine")
set (CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

View File

@ -5,12 +5,11 @@ set (CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc")
set (CMAKE_CXX_COMPILER "x86_64-w64-mingw32-g++")
set (CMAKE_RC_COMPILER "x86_64-w64-mingw32-windres")
# Not needed to crosscompile an installation package
#set (CMAKE_CROSSCOMPILING_EMULATOR "wine64")
# Remember to set WINEPATH for library dependencies
set (CMAKE_CROSSCOMPILING_EMULATOR "wine64")
set (CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

37
Win32Cleanup.cmake Normal file
View File

@ -0,0 +1,37 @@
# To be run from cmake_install.cmake, eradicates all unreferenced libraries.
# CMake 3.9.6 has a parsing bug with ENCODING UTF-8.
cmake_minimum_required (VERSION 3.10)
# CPack runs this almost without any CMake variables at all
# (cmStateSnapshot::SetDefaultDefinitions(), CMAKE_INSTALL_PREFIX, [DESTDIR])
set (installdir "${CMAKE_INSTALL_PREFIX}")
if (NOT installdir OR installdir MATCHES "^/usr(/|$)")
return ()
endif ()
# The function is recursive and CMake has tragic scoping behaviour;
# environment variables are truly global there, in the absence of a cache
unset (ENV{seen})
function (expand path)
set (seen $ENV{seen})
if (path IN_LIST seen OR NOT EXISTS "${path}")
return ()
endif ()
set (ENV{seen} "$ENV{seen};${path}")
file (STRINGS "${path}" strings REGEX "[.][Dd][Ll][Ll]$" ENCODING UTF-8)
foreach (string ${strings})
string (REGEX MATCH "[-.+_a-zA-Z0-9]+$" word "${string}")
expand ("${installdir}/${word}")
endforeach ()
endfunction ()
file (GLOB roots LIST_DIRECTORIES false "${installdir}/*.[Ee][Xx][Ee]"
"${installdir}/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.[Dd][Ll][Ll]")
foreach (binary ${roots})
expand ("${binary}")
endforeach ()
file (GLOB libraries LIST_DIRECTORIES false "${installdir}/*.[Dd][Ll][Ll]")
list (REMOVE_ITEM libraries $ENV{seen})
file (REMOVE ${libraries})

View File

@ -6,7 +6,6 @@ cmake_minimum_required (VERSION 3.9)
# Directories
set (working_dir ${CMAKE_CURRENT_BINARY_DIR}/win32-depends)
set (pkg_dir ${working_dir}/packages)
set (tmp_dir ${working_dir}/tmp)
file (MAKE_DIRECTORY ${working_dir})
file (MAKE_DIRECTORY ${pkg_dir})
@ -16,32 +15,27 @@ file (GLOB files ${working_dir}/*)
list (REMOVE_ITEM files ${pkg_dir})
if (files)
file (REMOVE_RECURSE ${files})
endif (files)
endif ()
# Packages
set (pkg_list "gtk" "gtkalt" "winlibs" "mingw_lua")
set (pkg_gtk_root "http://ftp.gnome.org/pub/gnome/binaries/win32")
set (pkg_gtk_urls
"${pkg_gtk_root}/dependencies/gettext-tools-0.17.zip"
"${pkg_gtk_root}/dependencies/gettext-runtime-0.17-1.zip")
set (pkg_gtk_md5
"09baff956ebd1c391c7f71e9bd768edd"
"110394b4b1e0a50cd440f1e8729d159c")
set (pkg_list "geany" "winlibs" "mingw_lua")
# https://sourceforge.net/projects/urlget/files
# /GTK%2B%203%20binary%20for%20Windows/GTK%2B%203.16.6/
# contains a binary bundle that may be more or less simply transplanted over,
# due to ABI compatibility, however something is wrong with icons,
# and it looks alien on Windows XP (use themes) for close to no improvement.
set (pkg_gtkalt_root "https://download.geany.org/contrib/gtk")
set (pkg_gtkalt_urls "${pkg_gtkalt_root}/gtk+-bundle_3.8.2-20131001_win32.zip")
set (pkg_gtkalt_md5 "3f9b159207edf44937f209b4a5e6bb63")
set (pkg_geany_root "https://download.geany.org/contrib/gtk")
set (pkg_geany_urls "${pkg_geany_root}/gtk+-bundle_3.8.2-20131001_win32.zip")
set (pkg_geany_md5 "3f9b159207edf44937f209b4a5e6bb63")
set (pkg_winlibs_root "http://sourceforge.net/projects/winlibs/files")
set (pkg_winlibs_urls "${pkg_winlibs_root}/GTK+/libjson-glib-1.0-1-mingw32.7z")
set (pkg_winlibs_md5 "f06e42c5998dae5fb6245fecc96a403e")
# With luabinaries MinGW-W64 builds the .dll/.a need to be moved to bin/lib
# manually, and note that CMake 3.10.0 FindLua.cmake can't find Lua 5.4;
# in any case there is no pkg-config file
set (pkg_mingw_lua_root "http://sourceforge.net/projects/mingw/files/MinGW/Extension")
set (pkg_mingw_lua_urls
"${pkg_mingw_lua_root}/lua/lua-5.2.0-1/lua-5.2.0-1-mingw32-dll-52.tar.xz"
@ -70,6 +64,8 @@ foreach (pkg_set ${pkg_list})
if (NOT EXISTS ${filename})
message (STATUS "Downloading ${url}...")
# TODO: on Windows XP, we can't download https://curl.se/windows/
# but it would be somewhat nice to be able to detect it in PATH
file (DOWNLOAD ${url} ${filename} STATUS status ${pkg_md5_param})
list (GET status 0 status_errno)
@ -77,44 +73,32 @@ foreach (pkg_set ${pkg_list})
if (status_errno)
file (REMOVE ${filename})
message (FATAL_ERROR "Download failed: ${status_msg}")
endif (status_errno)
endif ()
elseif (pkg_md5_sum)
execute_process (COMMAND ${CMAKE_COMMAND} -E md5sum ${filename}
OUTPUT_VARIABLE output)
if (NOT output MATCHES "^${pkg_md5_sum}")
message (FATAL_ERROR "MD5 mismatch for ${basename}")
endif (NOT output MATCHES "^${pkg_md5_sum}")
endif ()
endif ()
endforeach (url)
endforeach (pkg_set)
endforeach ()
endforeach ()
# Stage 2: extract the rest of packages
foreach (pkg_set ${pkg_list})
foreach (url ${pkg_${pkg_set}_urls})
get_filename_component (filename ${url} NAME)
message (STATUS "Extracting ${filename}...")
set (extract_command ${CMAKE_COMMAND} -E tar xf)
set (filename ${pkg_dir}/${filename})
if (pkg_${pkg_set}_strip)
file (MAKE_DIRECTORY ${tmp_dir})
execute_process (COMMAND ${extract_command} ${filename}
WORKING_DIRECTORY ${tmp_dir}
RESULT_VARIABLE status)
file (COPY ${tmp_dir}/${pkg_${pkg_set}_strip}/
DESTINATION ${working_dir})
file (REMOVE_RECURSE ${tmp_dir})
else ()
execute_process (COMMAND ${extract_command} ${filename}
WORKING_DIRECTORY ${working_dir}
RESULT_VARIABLE status)
endif ()
execute_process (COMMAND ${CMAKE_COMMAND} -E tar xf ${filename}
WORKING_DIRECTORY ${working_dir}
RESULT_VARIABLE status)
if (status)
message (FATAL_ERROR "Extraction failed: ${status}")
endif ()
endforeach (url)
endforeach (pkg_set)
endforeach ()
endforeach ()
# Stage 3: final touches
# We have to fix the prefix path as it is completely wrong everywhere
@ -125,4 +109,4 @@ foreach (file ${files})
string (REGEX REPLACE "prefix=[^\r\n]*(.*)" "prefix=${working_dir}\\1"
file_content_fixed "${file_content}")
file (WRITE ${file} "${file_content_fixed}")
endforeach (file)
endforeach ()

View File

@ -1,5 +1,5 @@
#!/bin/sh -e
# Win64Depends.sh: download dependencies from MSYS2 for cross-compilation
# Win64Depends.sh: download dependencies from MSYS2 for cross-compilation.
# Dependencies: AWK, sed, sha256sum, cURL, bsdtar, wine64
repository=https://repo.msys2.org/mingw/mingw64/
@ -27,7 +27,8 @@ fetch() {
} BEGIN { while ((getline < "db.tsv") > 0) {
filenames[$1] = $2; deps[$1] = ""; for (i = 3; i <= NF; i++) {
gsub(/[<=>].*/, "", $i); deps[$1] = deps[$1] $i FS }
} for (i = 0; i < ARGC; i++) get(ARGV[i]) }' "$@" | while IFS= read -r name
} for (i = 0; i < ARGC; i++) get(ARGV[i]) }' "$@" | tee db.want | \
while IFS= read -r name
do
status Fetching "$name"
[ -f "packages/$name" ] || curl -#o "packages/$name" "$repository/$name"
@ -44,9 +45,9 @@ extract() {
for subdir in *
do [ -d "$subdir" -a "$subdir" != packages ] && rm -rf -- "$subdir"
done
for i in packages/*
do bsdtar -xf "$i" --strip-components 1 mingw64
done
while IFS= read -r name
do bsdtar -xf "packages/$name" --strip-components 1
done < db.want
}
configure() {
@ -55,15 +56,16 @@ configure() {
wine64 bin/gdk-pixbuf-query-loaders.exe \
> lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
# pkgconf has a command line option for this, but CMake can't pass it
sed -i "s|^prefix=/mingw64|prefix=$(pwd)|" {share,lib}/pkgconfig/*.pc
# pkgconf has a command line option for this, but CMake can't pass it.
sed -i "s|^prefix=/mingw64|prefix=$(pwd)|" \
share/pkgconfig/*.pc lib/pkgconfig/*.pc
}
mkdir -p win32-depends
cd win32-depends
dbsync
fetch mingw-w64-x86_64-gtk3 mingw-w64-x86_64-lua \
mingw-w64-x86_64-libwinpthread-git # because we don't do "provides"?
mingw-w64-x86_64-libwinpthread-git # Because we don't do "provides"?
verify
extract
configure
@ -71,4 +73,4 @@ configure
status Success
# XXX: Why is this override needed to run some GLib-based things under wine64?
export XDG_DATA_DIRS=$(pwd)/share
unset XDG_DATA_DIRS

View File

@ -1,38 +0,0 @@
# - Find libintl
# This module looks for libintl.
# This module defines the following values:
# LIBINTL_FOUND
# LIBINTL_LIBRARIES
#=============================================================================
# Copyright 2011 Přemysl Eric Janouch
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.
#=============================================================================
find_library (LIBINTL_LIBRARIES intl)
include (FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS (LibIntl DEFAULT_MSG LIBINTL_LIBRARIES)
mark_as_advanced (LIBINTL_LIBRARIES)

View File

@ -10,17 +10,21 @@
#define PROJECT_NAME "${PROJECT_NAME}"
#define PROJECT_VERSION "${PROJECT_VERSION}"
#define PROJECT_ID "${project_ID}"
#define PROJECT_URL "${project_URL}"
#cmakedefine OPTION_NOINSTALL
#ifdef OPTION_NOINSTALL
/* For developers. */
#define PROJECT_DOC_DIR "${CMAKE_SOURCE_DIR}/docs/"
#define PROJECT_SHARE_DIR "${CMAKE_SOURCE_DIR}/share/"
#define PROJECT_GSETTINGS_DIR "${CMAKE_BINARY_DIR}"
#elif defined (_WIN32)
#define PROJECT_DOC_DIR "share/doc/${PROJECT_NAME}/"
#define PROJECT_SHARE_DIR "share/${PROJECT_NAME}/"
#else
#define PROJECT_DOC_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}/"
#define PROJECT_SHARE_DIR "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/"
#endif

View File

@ -0,0 +1,7 @@
body { max-width: 50em; margin: 0 auto 4em auto; padding: 0 2em;
font-family: sans-serif; } h1, h2, h3 { font-weight: normal; }
h1 { font-size: 2.5em; } h2 { font-size: 2em; } h3 { font-size: 1.33em; }
h2 { padding-top: .67em; border-top: 1px solid silver; }
p { line-height: 1.5; } .figure { text-align: center; } img { max-width: 100%; }
q { font-style: normal; } .details { border-bottom: 1px solid silver; }
.details br { display: none; } .details br + span:before { content: " — "; }

View File

@ -1,148 +0,0 @@
// TODO: nakonfigurovat v CMake asciidoctor-pdf, je potřeba pár `gem install`
// https://github.com/asciidoctor/asciidoctor-pdf/blob/master/README.adoc
// https://github.com/asciidoctor/asciidoctor-pdf/blob/master/docs/theming-guide.adoc
logdiag: Průvodce uživatele
===========================
Přemysl Eric Janouch <p@janouch.name>
v0.2.0, 2018-06-27
:toc: left
:toc-title: Obsah
:sectnums:
:warning-caption: VAROVÁNÍ
:xrefstyle: short
:figure-caption: Obrázek
image::logdiag-cs.png[]
<<<
Úvod
----
Tento dokument vás má za účel provést po aplikaci a pomoci vám se v ní
zorientovat. Popis úkonů se přednostně vztahuje na operační systém Microsoft
Windows, do jisté míry je však platný i pro jiné operační systémy.
Získání aplikace
----------------
Nejnovější verzi aplikace je možné stáhnout na následující webové adrese:
https://git.janouch.name/p/logdiag.
[[gitea-download]]
.Nabídka pro stahování na stráncách projektu
image::gitea.png[]
Až se ocitnete na webu, vyhledejte v záhlaví záložku s nápisem ``Releases'' a
klepněte na ni. Zobrazí se přehled vydání a pod hlavičkami ``Downloads''
související soubory ke stažení. Instalační soubor pro Microsoft Windows nese
název ve stylu ``logdiag-__verze__-Windows-x86.exe''.
Instalace
---------
Proces instalace je velmi přímočarý. Po úvodní obrazovce je vyžadován souhlas s
licencí. Pokud nerozumíte anglicky, její stručné shrnutí zní, že aplikaci smíte
v nezměněné formě zcela volně používat a redistribuovat, ale nejsou vám
poskytovány žádné záruky. Následuje výběr složky, do které chcete aplikaci
nainstalovat, a složky pro umístění ve Start menu. V případě, že nenastala žádná
náhlá chyba, už jen stačí potvrdit úspěšnou instalaci.
WARNING: Pokud aplikaci instalujete do složky, kde se nachází již existující
instalace, mohou nastat potíže. Ačkoliv je to možné, nepokoušejte se z těch
samých příčin instalovat ani více kopií vedle sebe. Nejdříve stávající instalaci
odstraňte, například pomocí zástupce umístěného ve Start menu.
Operace s objekty
-----------------
////
TODO: zkusit restrukturalizovat na:
4. Operace s objekty
4.1 Základní operace
4.1.1 Výběr
4.1.2 Přesun
4.1.3 Odstranění
4.2 Značky
4.2.1 Vložení
4.2.2 Otáčení
4.3 Spojení
4.3.1 Tvorba
////
Každý diagram je tvořen z objektů, a s těmi se sdružují dále popsané operace.
Budete-li chtít momentálně prováděnou operaci zrušit, můžete tak obvykle učinit
stiskem klávesy Escape.
Výběr objektů
~~~~~~~~~~~~~
Jednotlivé objekty můžete vybírat levým kliknutím myší. Ty se v reakci na to
vyznačí červenou barvou. Chcete-li vybrat objektů více, držte během klikání
stisknutou klávesu Shift.
// XXX: nelze zarovnat obrázek na střed zároveň s caption
[[select-objects]]
.Výběr objektů v oblasti
image::select-objects.png[]
Alternativně můžete táhnout myší z volné oblasti diagramu do prostoru, viz
<<select-objects>>. Vyberou se objekty obsažené ve vytvořeném obdélníku. Výběr
lze zrušit klepnutím na prázdné místo.
Přesun objektů
~~~~~~~~~~~~~~
Přesun objektů se provede tažením objektů myší na požadované místo. Pokud jsou
tyto objekty součástí výběru, přesune se celý výběr. Ten lze též přesouvat
pomocí kurzorových kláves.
Odstranění objektů
~~~~~~~~~~~~~~~~~~
Objekty odstraníte stisknutím klávesy Delete, případně z menu aplikace.
Vložení značky
~~~~~~~~~~~~~~
_Značky_ představují nejdůležitější druh objektů. Do diagramu je vložíte výběrem
z nabídky značek umístěné po levé straně hlavního okna aplikace a přetažením
myší do diagramu na požadované umístění.
Otáčení značek
~~~~~~~~~~~~~~
Otočit značku vloženou do diagramu můžete přes pravé tlačítko myši.
Propojení terminálů
~~~~~~~~~~~~~~~~~~~
_Terminálem_ se nazývá bod určený pro tvorbu spojení mezi značkami nebo jinými
spojeními. Abyste z něj spojení vyvedli, nejdříve na něj najeďte kurzorem myši
tak, aby se viditelně vyznačil kroužkem. Pak stiskněte levé tlačítko myši a
přetáhněte kurzor myši na místo, kde chcete, aby spojení končilo.
// XXX: nelze sloučit do jedné figure
[[create-connection]]
.Propojení terminálů dvou značek
image:create-connection-begin.png[]
&nbsp;...&nbsp;
image:create-connection-end.png[]
Časté problémy
--------------
Nelze otevřít uložený diagram
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Při ukládání se ujistěte, že zadaný název souboru obsahuje příponu ``.ldd''. V
opačném případě se nezobrazí v dialogu pro otevření diagramu. 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.
Jak můžu diagram vytisknout?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
Schází mi popisky
~~~~~~~~~~~~~~~~~
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.

View File

@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>logdiag: Průvodce uživatele</title>
<link rel="stylesheet" href="stylesheet.css">
<style>
q:lang(cs):before { content: "„"; }
q:lang(cs):after { content: "“"; }
</style>
</head>
<body>
<h1>logdiag: Průvodce uživatele</h1>
<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.3.0,</span>
<span id="revdate">2021-10-28</span>
<p class="figure"><img src="logdiag-cs.png" alt="Okno programu logdiag">
<h2>Úvod</h2>
<p>Tento dokument vás má za účel provést po aplikaci a pomoci vám se v ní
zorientovat. Popis úkonů se přednostně vztahuje na operační systém Microsoft
Windows, do jisté míry je však platný i pro jiné operační systémy.
<h2>Získání aplikace</h2>
<p>Nejnovější verzi aplikace je možné stáhnout na následující webové adrese:
<a href="https://git.janouch.name/p/logdiag">https://git.janouch.name/p/logdiag</a>.
<p class="figure"><img src="gitea.png" alt="Gitea">
<br>Obrázek 1: Nabídka pro stahování na stránkách projektu
<p>Až se ocitnete na webu, vyhledejte v záhlaví záložku s nápisem
<q>Releases</q> a klepněte na ni. Zobrazí se přehled vydání a pod hlavičkami
<q>Downloads</q> související soubory ke stažení. Instalační soubor pro Microsoft
Windows nese název ve stylu <q>logdiag-<i>verze</i>-Windows-x86.exe</q>.
<h2>Instalace</h2>
<p>Proces instalace je velmi přímočarý. Po úvodní obrazovce je vyžadován souhlas
s licencí. Pokud nerozumíte anglicky, její stručné shrnutí zní, že aplikaci
smíte v nezměněné formě zcela volně používat a redistribuovat, ale nejsou vám
poskytovány žádné záruky. Následuje výběr složky, do které chcete aplikaci
nainstalovat, a složky pro umístění ve Start menu. V případě, že nenastala žádná
náhlá chyba, už jen stačí potvrdit úspěšnou instalaci.
<p><b>Pozor</b>: Pokud aplikaci instalujete do složky, kde se nachází již
existující instalace, mohou nastat potíže. Ačkoliv je to možné, nepokoušejte se
z těch samých příčin instalovat ani více kopií vedle sebe. Nejdříve stávající
instalaci odstraňte, například pomocí zástupce umístěného ve Start menu.
<h2>Operace s objekty</h2>
<p>Každý diagram je tvořen z objektů, a s těmi se sdružují dále popsané operace.
Budete-li chtít momentálně prováděnou operaci zrušit, můžete tak obvykle učinit
stiskem klávesy Escape.
<!-- TODO: zkusit restrukturalizovat na:
Operace s objekty
Základní operace
Výběr
Přesun
Odstranění
Značky
Vložení
Otáčení
Spojení
Tvorba
-->
<h3>Výběr objektů</h3>
<p>Jednotlivé objekty můžete vybírat levým kliknutím myší. Ty se v reakci na to
vyznačí červenou barvou. Chcete-li vybrat objektů více, držte během klikání
stisknutou klávesu Shift.
<p class="figure" id="select-objects">
<img src="select-objects.png" alt="Výběr objektů">
<br>Obrázek 2: Výběr objektů v oblasti
<p>Alternativně můžete táhnout myší z volné oblasti diagramu do prostoru, viz
<a href="#select-objects">Obrázek 2</a>. Vyberou se objekty obsažené
ve vytvořeném obdélníku. Výběr lze zrušit klepnutím na prázdné místo.
<h3>Přesun objektů</h3>
<p>Přesun objektů se provede tažením objektů myší na požadované místo. Pokud
jsou tyto objekty součástí výběru, přesune se celý výběr. Ten lze též přesouvat
pomocí kurzorových kláves.
<h3>Odstranění objektů</h3>
<p>Objekty odstraníte stisknutím klávesy Delete, případně z menu aplikace.
<h3>Vložení značky</h3>
<p><i>Značky</i> představují nejdůležitější druh objektů. Do diagramu je vložíte
výběrem z nabídky značek umístěné po levé straně hlavního okna aplikace
a přetažením myší do diagramu na požadované umístění.
<h3>Otáčení značek</h3>
<p>Otočit značku vloženou do diagramu můžete přes pravé tlačítko myši.
<h3>Propojení terminálů</h3>
<p><i>Terminálem</i> se nazývá bod určený pro tvorbu spojení mezi značkami nebo
jinými spojeními. Abyste z něj spojení vyvedli, nejdříve na něj najeďte kurzorem
myši tak, aby se viditelně vyznačil kroužkem. Pak stiskněte levé tlačítko myši
a přetáhněte kurzor myši na místo, kde chcete, aby spojení končilo.
<p class="figure" id="create-connection">
<img src="create-connection-begin.png" alt="Začátek operace" align="center">
&nbsp;&#8230;&nbsp;
<img src="create-connection-end.png" alt="Konec operace" align="center">
<br>Obrázek 3: Propojení terminálů dvou značek
<h2>Časté problémy</h2>
<h3>Nelze otevřít uložený diagram</h3>
<p>Při ukládání se ujistěte, že zadaný název souboru obsahuje příponu
<q>.ldd</q>. V opačném případě se nezobrazí v dialogu pro otevření diagramu.
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>Schází mi popisky</h3>
<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')
for (var i = 0; i < all.length; i++) {
var name = all[i].innerHTML.replace(/[^0-9a-z]/ig, '-')
toc += '<li><p><a href="#' + name + '">' + all[i].innerHTML + '</a></li>'
all[i].id = name
all[i].innerHTML = (i + 1) + '. ' + all[i].innerHTML
}
all[0].insertAdjacentHTML('beforebegin',
'<h2>Obsah</h2><ol>' + toc + '</ol>')
</script>

View File

@ -1,146 +0,0 @@
// TODO: nakonfigurovat v CMake asciidoctor-pdf, je potřeba pár `gem install`
// https://github.com/asciidoctor/asciidoctor-pdf/blob/master/README.adoc
// https://github.com/asciidoctor/asciidoctor-pdf/blob/master/docs/theming-guide.adoc
logdiag: User Guide
===================
Přemysl Eric Janouch <p@janouch.name>
v0.2.0, 2018-06-27
:toc: left
:sectnums:
:xrefstyle: short
image::logdiag-en.png[]
<<<
Introduction
------------
This document will guide you through the application and help to familiarize you
with it. The description of tasks mainly targets the Microsoft Windows
operating system, though it's also valid for other operating systems to
a certain extent.
Getting the application
-----------------------
Download the newest version of the application at the following web address:
https://git.janouch.name/p/logdiag.
[[gitea-download]]
.The download menu on the project site
image::gitea.png[]
While on the web, look for a tab entitled ``Releases'' and click on it. A list
of versions will appear with files for download listed under ``Downloads''
headings. The installation file for Microsoft Windows is named in the style of
``logdiag-__version__-Windows-x86.exe''.
Installation
------------
The installation process is quite straight-forward. After the initial screen a
license agreement is required. Next, choose a folder in which to install the
application and another one for placement in the Start menu. So long as no
unexpected errors have occurred, all that's left is confirming a successful
installation.
WARNING: If the application is installed into a folder where a previous
installation is already located, problems may arise. Although it is possible to
do so, don't try to install multiple copies parallely either, for the same
reasons. Remove the current installation first, for example by using the
shortcut located in the Start menu.
Operations with objects
-----------------------
////
TODO: zkusit restrukturalizovat na:
4. Operace s objekty
4.1 Základní operace
4.1.1 Výběr
4.1.2 Přesun
4.1.3 Odstranění
4.2 Značky
4.2.1 Vložení
4.2.2 Otáčení
4.3 Spojení
4.3.1 Tvorba
////
Each diagram consists of objects, and these are accompanied by the operations
described below. To cancel any current operation, press the Escape key.
Selecting objects
~~~~~~~~~~~~~~~~~
Select single objects by left-clicking on them. They will get highlighted with
red color in reaction to this. To select multiple objects, hold the Shift key
while clicking.
// XXX: nelze zarovnat obrázek na střed zároveň s caption
[[select-objects]]
.Selecting objects inside an area
image::select-objects.png[]
Alternatively drag the mouse from free space within the diagram into the area,
see <<select-objects>>. Objects contained in this rectangle will be
selected. The selection may later be dismissed by just clicking into free space.
Moving objects
~~~~~~~~~~~~~~
Moving of objects is done by dragging them with the mouse onto the desired
place. If these objects form a part of the current selection, the whole
selection is moved. The selection may also be moved using cursor keys.
Removing objects
~~~~~~~~~~~~~~~~
Remove objects either by pressing the Delete key or from the application menu.
Inserting symbols
~~~~~~~~~~~~~~~~~
_Symbols_ constitute the most important kind of objects. Insert them into the
diagram by choosing one from the symbol menu located on the left side of the
main application window and dragging it onto the diagram where you want the
symbol to be placed.
Rotating symbols
~~~~~~~~~~~~~~~~
Rotate a symbol inserted into the diagram by right-clicking on it.
Connecting terminals
~~~~~~~~~~~~~~~~~~~~
A point intended for creation of connections between symbols or other
connections is called a _terminal_. To lead a connection out of it, first
hover it with the mouse pointer, so it gets visibly highlighted with a circle.
Then press the left mouse button and drag the pointer onto the place where you
want the connection to end.
// XXX: nelze sloučit do jedné figure
[[create-connection]]
.Interconnecting terminals of two symbols
image:create-connection-begin.png[]
&nbsp;...&nbsp;
image:create-connection-end.png[]
Frequent problems
-----------------
Can't open a saved diagram
~~~~~~~~~~~~~~~~~~~~~~~~~~
When saving, ensure that the filename you've typed in contains the ``.ldd''
suffix. If not, it won't show up in the dialog for opening diagrams. In case
you've already saved a file without an extension, you may fix this situation by
adding the suffix to its name.
How do I print a diagram?
~~~~~~~~~~~~~~~~~~~~~~~~~
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.
I miss labels
~~~~~~~~~~~~~
Similarly to the previous case, this functionality doesn't exist yet, but it is
possible to get around this limitation using a graphics editor.

View File

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>logdiag: User Guide</title>
<link rel="stylesheet" href="stylesheet.css">
<style>
q:lang(en):before { content: ""; }
q:lang(en):after { content: ""; }
</style>
</head>
<body>
<h1>logdiag: User Guide</h1>
<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.3.0,</span>
<span id="revdate">2021-10-28</span>
<p class="figure"><img src="logdiag-en.png" alt="logdiag program window">
<h2>Introduction</h2>
<p>This document will guide you through the application and help to familiarize
you with it. The description of tasks mainly targets the Microsoft Windows
operating system, though its also valid for other operating systems to
a certain extent.
<h2>Getting the application</h2>
<p>Download the newest version of the application at the following web address:
<a href="https://git.janouch.name/p/logdiag">https://git.janouch.name/p/logdiag</a>.
<p class="figure"><img src="gitea.png" alt="Gitea">
<br>Figure 1: The download menu on the project site
<p>While on the web, look for a tab entitled <q>Releases</q> and click on it.
A list of versions will appear with files for download listed under
<q>Downloads</q> headings. The installation file for Microsoft Windows is named
in the style of <q>logdiag-<i>version</i>-Windows-x86.exe</q>.
<h2>Installation</h2>
<p>The installation process is quite straight-forward. After the initial screen
a license agreement is required. Next, choose a folder in which to install
the application and another one for placement in the Start menu. So long as
no unexpected errors have occurred, all thats left is confirming a successful
installation.
<p><b>Warning</b>: If the application is installed into a folder where
a previous installation is already located, problems may arise. Although it is
possible to do so, dont try to install multiple copies parallely either, for
the same reasons. Remove the current installation first, for example by using
the shortcut located in the Start menu.
<h2>Operations with objects</h2>
<p>Each diagram consists of objects, and these are accompanied by the operations
described below. To cancel any current operation, press the Escape key.
<!-- TODO: see the Czech version -->
<h3>Selecting objects</h3>
<p>Select single objects by left-clicking on them. They will get highlighted
with red color in reaction to this. To select multiple objects, hold the Shift
key while clicking.
<p class="figure" id="select-objects">
<img src="select-objects.png" alt="select objects">
<br>Figure 2: Selecting objects inside an area
<p>Alternatively drag the mouse from free space within the diagram into
the area, see <a href="#select-objects">Figure 2</a>. Objects contained in this
rectangle will be selected. The selection may later be dismissed by just
clicking into free space.
<h3>Moving objects</h3>
<p>Moving of objects is done by dragging them with the mouse onto the desired
place. If these objects form a part of the current selection, the whole
selection is moved. The selection may also be moved using cursor keys.
<h3>Removing objects</h3>
<p>Remove objects either by pressing the Delete key or from the application
menu.
<h3>Inserting symbols</h3>
<p><i>Symbols</i> constitute the most important kind of objects. Insert them
into the diagram by choosing one from the symbol menu located on the left side
of the main application window and dragging it onto the diagram where you want
the symbol to be placed.
<h3>Rotating symbols</h3>
<p>Rotate a symbol inserted into the diagram by right-clicking on it.
<h3>Connecting terminals</h3>
<p>A point intended for creation of connections between symbols or other
connections is called a <i>terminal</i>. To lead a connection out of it, first
hover it with the mouse pointer, so it gets visibly highlighted with a circle.
Then press the left mouse button and drag the pointer onto the place where you
want the connection to end.
<p class="figure" id="create-connection">
<img src="create-connection-begin.png" alt="Start of operation" align="center">
&nbsp;&#8230;&nbsp;
<img src="create-connection-end.png" alt="End of operation" align="center">
<br>Figure 3: Interconnecting terminals of two symbols
<h2>Frequent problems</h2>
<h3>Cant open a saved diagram</h3>
<p>When saving, ensure that the filename youve typed in contains the
<q>.ldd</q> suffix. If not, it wont show up in the dialog for opening diagrams.
In case youve already saved a file without an extension, you may fix this
situation by adding the suffix to its name.
<h3>I miss labels</h3>
<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')
for (var i = 0; i < all.length; i++) {
var name = all[i].innerHTML.replace(/[^0-9a-z]/ig, '-')
toc += '<li><p><a href="#' + name + '">' + all[i].innerHTML + '</a></li>'
all[i].id = name
all[i].innerHTML = (i + 1) + '. ' + all[i].innerHTML
}
all[0].insertAdjacentHTML('beforebegin',
'<h2>Table of Contents</h2><ol>' + toc + '</ol>')
</script>

View File

@ -456,9 +456,9 @@ on_leave_notify (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
}
static void
on_drag_data_get
(GtkWidget *widget, GdkDragContext *ctx, GtkSelectionData *selection_data,
guint target_type, guint time, gpointer user_data)
on_drag_data_get (GtkWidget *widget, GdkDragContext *ctx,
GtkSelectionData *selection_data, guint target_type, guint time,
gpointer user_data)
{
LdCategorySymbolView *self;

View File

@ -15,16 +15,22 @@ G_BEGIN_DECLS
#define LD_TYPE_CATEGORY_SYMBOL_VIEW (ld_category_symbol_view_get_type ())
#define LD_CATEGORY_SYMBOL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_CATEGORY_SYMBOL_VIEW, LdCategorySymbolView))
#define LD_CATEGORY_SYMBOL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_CATEGORY_SYMBOL_VIEW, LdCategorySymbolViewClass))
#define LD_IS_CATEGORY_SYMBOL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_CATEGORY_SYMBOL_VIEW))
#define LD_IS_CATEGORY_SYMBOL_VIEW_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_CATEGORY_SYMBOL_VIEW))
#define LD_CATEGORY_SYMBOL_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_CATEGORY_SYMBOL_VIEW, LdCategorySymbolViewClass))
#define LD_CATEGORY_SYMBOL_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
LD_TYPE_CATEGORY_SYMBOL_VIEW, \
LdCategorySymbolView))
#define LD_CATEGORY_SYMBOL_VIEW_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
LD_TYPE_CATEGORY_SYMBOL_VIEW, \
LdCategorySymbolViewClass))
#define LD_IS_CATEGORY_SYMBOL_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_CATEGORY_SYMBOL_VIEW))
#define LD_IS_CATEGORY_SYMBOL_VIEW_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_CATEGORY_SYMBOL_VIEW))
#define LD_CATEGORY_SYMBOL_VIEW_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
LD_CATEGORY_SYMBOL_VIEW, \
LdCategorySymbolViewClass))
typedef struct _LdCategorySymbolView LdCategorySymbolView;
typedef struct _LdCategorySymbolViewPrivate LdCategorySymbolViewPrivate;

View File

@ -58,7 +58,7 @@ ld_category_view_init (LdCategoryViewInterface *iface)
G_DEFINE_TYPE_WITH_CODE (LdCategoryTreeView,
ld_category_tree_view, GTK_TYPE_BOX,
G_IMPLEMENT_INTERFACE (LD_TYPE_CATEGORY_VIEW, ld_category_view_init));
G_IMPLEMENT_INTERFACE (LD_TYPE_CATEGORY_VIEW, ld_category_view_init))
static void
ld_category_tree_view_class_init (LdCategoryTreeViewClass *klass)

View File

@ -15,16 +15,22 @@ G_BEGIN_DECLS
#define LD_TYPE_CATEGORY_TREE_VIEW (ld_category_tree_view_get_type ())
#define LD_CATEGORY_TREE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_CATEGORY_TREE_VIEW, LdCategoryTreeView))
#define LD_CATEGORY_TREE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_CATEGORY_TREE_VIEW, LdCategoryTreeViewClass))
#define LD_IS_CATEGORY_TREE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_CATEGORY_TREE_VIEW))
#define LD_IS_CATEGORY_TREE_VIEW_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_CATEGORY_TREE_VIEW))
#define LD_CATEGORY_TREE_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_CATEGORY_TREE_VIEW, LdCategoryTreeViewClass))
#define LD_CATEGORY_TREE_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
LD_TYPE_CATEGORY_TREE_VIEW, \
LdCategoryTreeView))
#define LD_CATEGORY_TREE_VIEW_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
LD_TYPE_CATEGORY_TREE_VIEW, \
LdCategoryTreeViewClass))
#define LD_IS_CATEGORY_TREE_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_CATEGORY_TREE_VIEW))
#define LD_IS_CATEGORY_TREE_VIEW_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_CATEGORY_TREE_VIEW))
#define LD_CATEGORY_TREE_VIEW_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
LD_CATEGORY_TREE_VIEW, \
LdCategoryTreeViewClass))
typedef struct _LdCategoryTreeView LdCategoryTreeView;
typedef struct _LdCategoryTreeViewPrivate LdCategoryTreeViewPrivate;

View File

@ -21,7 +21,7 @@
* hierarchies.
*/
G_DEFINE_INTERFACE (LdCategoryView, ld_category_view, 0);
G_DEFINE_INTERFACE (LdCategoryView, ld_category_view, 0)
static void
ld_category_view_default_init (LdCategoryViewInterface *iface)
@ -77,8 +77,7 @@ ld_category_view_default_init (LdCategoryViewInterface *iface)
* Assign an #LdCategory object to the view.
*/
void
ld_category_view_set_category (LdCategoryView *self,
LdCategory *category)
ld_category_view_set_category (LdCategoryView *self, LdCategory *category)
{
g_return_if_fail (LD_IS_CATEGORY_VIEW (self));
LD_CATEGORY_VIEW_GET_INTERFACE (self)->set_category (self, category);

View File

@ -15,12 +15,14 @@ G_BEGIN_DECLS
#define LD_TYPE_CATEGORY_VIEW (ld_category_view_get_type ())
#define LD_CATEGORY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_CATEGORY_VIEW, LdCategoryView))
#define LD_IS_CATEGORY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_CATEGORY_VIEW))
#define LD_CATEGORY_VIEW_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE \
((inst), LD_TYPE_CATEGORY_VIEW, LdCategoryViewInterface))
#define LD_CATEGORY_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_CATEGORY_VIEW, LdCategoryView))
#define LD_IS_CATEGORY_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_CATEGORY_VIEW))
#define LD_CATEGORY_VIEW_GET_INTERFACE(inst) \
(G_TYPE_INSTANCE_GET_INTERFACE ((inst), \
LD_TYPE_CATEGORY_VIEW, \
LdCategoryViewInterface))
typedef struct _LdCategoryView LdCategoryView;
typedef struct _LdCategoryViewInterface LdCategoryViewInterface;
@ -48,8 +50,7 @@ struct _LdCategoryViewInterface
GType ld_category_view_get_type (void) G_GNUC_CONST;
void ld_category_view_set_category (LdCategoryView *self,
LdCategory *category);
void ld_category_view_set_category (LdCategoryView *self, LdCategory *category);
LdCategory *ld_category_view_get_category (LdCategoryView *self);

View File

@ -55,7 +55,7 @@ static void on_category_notify_name (LdCategory *category,
GParamSpec *pspec, gpointer user_data);
G_DEFINE_TYPE (LdCategory, ld_category, G_TYPE_OBJECT);
G_DEFINE_TYPE (LdCategory, ld_category, G_TYPE_OBJECT)
static void
ld_category_class_init (LdCategoryClass *klass)
@ -561,4 +561,3 @@ ld_category_get_children (LdCategory *self)
g_return_val_if_fail (LD_IS_CATEGORY (self), NULL);
return self->priv->subcategories;
}

View File

@ -15,16 +15,16 @@ G_BEGIN_DECLS
#define LD_TYPE_CATEGORY (ld_category_get_type ())
#define LD_CATEGORY(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_CATEGORY, LdCategory))
#define LD_CATEGORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_CATEGORY, LdCategoryClass))
#define LD_IS_CATEGORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_CATEGORY))
#define LD_IS_CATEGORY_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_CATEGORY))
#define LD_CATEGORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_CATEGORY, LdCategoryClass))
#define LD_CATEGORY(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_CATEGORY, LdCategory))
#define LD_CATEGORY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_CATEGORY, LdCategoryClass))
#define LD_IS_CATEGORY(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_CATEGORY))
#define LD_IS_CATEGORY_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_CATEGORY))
#define LD_CATEGORY_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_CATEGORY, LdCategoryClass))
typedef struct _LdCategory LdCategory;
typedef struct _LdCategoryPrivate LdCategoryPrivate;
@ -77,4 +77,3 @@ const GSList *ld_category_get_children (LdCategory *self);
G_END_DECLS
#endif /* ! __LD_CATEGORY_H__ */

View File

@ -57,7 +57,7 @@ static void on_set_points_destroy (gpointer user_data);
G_DEFINE_TYPE (LdDiagramConnection, ld_diagram_connection,
LD_TYPE_DIAGRAM_OBJECT);
LD_TYPE_DIAGRAM_OBJECT)
static void
ld_diagram_connection_class_init (LdDiagramConnectionClass *klass)
@ -332,4 +332,3 @@ on_set_points_destroy (gpointer user_data)
json_node_free (data->new_node);
g_slice_free (SetPointsActionData, data);
}

View File

@ -15,16 +15,22 @@ G_BEGIN_DECLS
#define LD_TYPE_DIAGRAM_CONNECTION (ld_diagram_connection_get_type ())
#define LD_DIAGRAM_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_DIAGRAM_CONNECTION, LdDiagramConnection))
#define LD_DIAGRAM_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_DIAGRAM_CONNECTION, LdDiagramConnectionClass))
#define LD_IS_DIAGRAM_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_DIAGRAM_CONNECTION))
#define LD_IS_DIAGRAM_CONNECTION_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_DIAGRAM_CONNECTION))
#define LD_DIAGRAM_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_DIAGRAM_CONNECTION, LdDiagramConnectionClass))
#define LD_DIAGRAM_CONNECTION(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
LD_TYPE_DIAGRAM_CONNECTION, \
LdDiagramConnection))
#define LD_DIAGRAM_CONNECTION_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
LD_TYPE_DIAGRAM_CONNECTION, \
LdDiagramConnectionClass))
#define LD_IS_DIAGRAM_CONNECTION(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_DIAGRAM_CONNECTION))
#define LD_IS_DIAGRAM_CONNECTION_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_DIAGRAM_CONNECTION))
#define LD_DIAGRAM_CONNECTION_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
LD_DIAGRAM_CONNECTION, \
LdDiagramConnectionClass))
typedef struct _LdDiagramConnection LdDiagramConnection;
typedef struct _LdDiagramConnectionPrivate LdDiagramConnectionPrivate;
@ -61,4 +67,3 @@ void ld_diagram_connection_set_points (LdDiagramConnection *self,
G_END_DECLS
#endif /* ! __LD_DIAGRAM_CONNECTION_H__ */

View File

@ -69,7 +69,7 @@ static void on_set_param_redo (gpointer user_data);
static void on_set_param_destroy (gpointer user_data);
G_DEFINE_TYPE (LdDiagramObject, ld_diagram_object, G_TYPE_OBJECT);
G_DEFINE_TYPE (LdDiagramObject, ld_diagram_object, G_TYPE_OBJECT)
static void
ld_diagram_object_class_init (LdDiagramObjectClass *klass)

View File

@ -15,16 +15,20 @@ G_BEGIN_DECLS
#define LD_TYPE_DIAGRAM_OBJECT (ld_diagram_object_get_type ())
#define LD_DIAGRAM_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_DIAGRAM_OBJECT, LdDiagramObject))
#define LD_DIAGRAM_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_DIAGRAM_OBJECT, LdDiagramObjectClass))
#define LD_IS_DIAGRAM_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_DIAGRAM_OBJECT))
#define LD_IS_DIAGRAM_OBJECT_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_DIAGRAM_OBJECT))
#define LD_DIAGRAM_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_DIAGRAM_OBJECT, LdDiagramObjectClass))
#define LD_DIAGRAM_OBJECT(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
LD_TYPE_DIAGRAM_OBJECT, \
LdDiagramObject))
#define LD_DIAGRAM_OBJECT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
LD_TYPE_DIAGRAM_OBJECT, \
LdDiagramObjectClass))
#define LD_IS_DIAGRAM_OBJECT(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_DIAGRAM_OBJECT))
#define LD_IS_DIAGRAM_OBJECT_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_DIAGRAM_OBJECT))
#define LD_DIAGRAM_OBJECT_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_DIAGRAM_OBJECT, LdDiagramObjectClass))
typedef struct _LdDiagramObject LdDiagramObject;
typedef struct _LdDiagramObjectPrivate LdDiagramObjectPrivate;
@ -74,4 +78,3 @@ void ld_diagram_object_set_y (LdDiagramObject *self, gdouble y);
G_END_DECLS
#endif /* ! __LD_DIAGRAM_OBJECT_H__ */

View File

@ -33,7 +33,7 @@ static void ld_diagram_symbol_set_property (GObject *object, guint property_id,
const GValue *value, GParamSpec *pspec);
G_DEFINE_TYPE (LdDiagramSymbol, ld_diagram_symbol, LD_TYPE_DIAGRAM_OBJECT);
G_DEFINE_TYPE (LdDiagramSymbol, ld_diagram_symbol, LD_TYPE_DIAGRAM_OBJECT)
static void
ld_diagram_symbol_class_init (LdDiagramSymbolClass *klass)

View File

@ -15,16 +15,20 @@ G_BEGIN_DECLS
#define LD_TYPE_DIAGRAM_SYMBOL (ld_diagram_symbol_get_type ())
#define LD_DIAGRAM_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_DIAGRAM_SYMBOL, LdDiagramSymbol))
#define LD_DIAGRAM_SYMBOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_DIAGRAM_SYMBOL, LdDiagramSymbolClass))
#define LD_IS_DIAGRAM_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_DIAGRAM_SYMBOL))
#define LD_IS_DIAGRAM_SYMBOL_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_DIAGRAM_SYMBOL))
#define LD_DIAGRAM_SYMBOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_DIAGRAM_SYMBOL, LdDiagramSymbolClass))
#define LD_DIAGRAM_SYMBOL(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
LD_TYPE_DIAGRAM_SYMBOL, \
LdDiagramSymbol))
#define LD_DIAGRAM_SYMBOL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
LD_TYPE_DIAGRAM_SYMBOL, \
LdDiagramSymbolClass))
#define LD_IS_DIAGRAM_SYMBOL(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_DIAGRAM_SYMBOL))
#define LD_IS_DIAGRAM_SYMBOL_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_DIAGRAM_SYMBOL))
#define LD_DIAGRAM_SYMBOL_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_DIAGRAM_SYMBOL, LdDiagramSymbolClass))
typedef struct _LdDiagramSymbol LdDiagramSymbol;
typedef struct _LdDiagramSymbolPrivate LdDiagramSymbolPrivate;
@ -70,4 +74,3 @@ void ld_diagram_symbol_set_rotation (LdDiagramSymbol *self, gint rotation);
G_END_DECLS
#endif /* ! __LD_DIAGRAM_SYMBOL_H__ */

View File

@ -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.
@ -1288,7 +1315,7 @@ point_to_line_segment_distance
/* The projection is beyond the line segment. */
if (u < 0.)
return ld_point_distance (point, p1->x, p1->y);
else if (u > 1.)
if (u > 1.)
return ld_point_distance (point, p2->x, p2->y);
/* The projection is on the line segment. */
@ -1390,8 +1417,8 @@ move_selection (LdDiagramView *self, gdouble dx, gdouble dy)
static gboolean
is_object_selected (LdDiagramView *self, LdDiagramObject *object)
{
return g_list_find (ld_diagram_get_selection (self->priv->diagram),
object) != NULL;
return g_list_find (ld_diagram_get_selection (self->priv->diagram), object)
!= NULL;
}
static void
@ -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;
@ -2561,7 +2591,9 @@ on_drag_motion (GtkWidget *widget, GdkDragContext *drag_ctx,
/* Discard leftovers from any previous unsuccessful drag. */
if (self->priv->dnd_left)
{
g_object_unref (self->priv->dnd_symbol);
/* The Wayland backend does a leave-drop-leave sequence. */
if (self->priv->dnd_symbol)
g_object_unref (self->priv->dnd_symbol);
self->priv->dnd_symbol = NULL;
self->priv->dnd_left = FALSE;
}
@ -2664,19 +2696,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 +2770,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 +2792,7 @@ draw_terminal (GtkWidget *widget, DrawData *data)
}
static void
draw_diagram (GtkWidget *widget, DrawData *data)
draw_diagram (DrawData *data)
{
GList *objects, *iter;
@ -2905,5 +2937,101 @@ 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;
/* Presumably, cairo_recording_surface_ink_extents() could also be used,
* though DrawData::exposed_rect currently stands in the way.
*/
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);
}

View File

@ -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.
*
@ -15,16 +15,18 @@ G_BEGIN_DECLS
#define LD_TYPE_DIAGRAM_VIEW (ld_diagram_view_get_type ())
#define LD_DIAGRAM_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_DIAGRAM_VIEW, LdDiagramView))
#define LD_DIAGRAM_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_DIAGRAM_VIEW, LdDiagramViewClass))
#define LD_IS_DIAGRAM_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_DIAGRAM_VIEW))
#define LD_IS_DIAGRAM_VIEW_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_DIAGRAM_VIEW))
#define LD_DIAGRAM_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_DIAGRAM_VIEW, LdDiagramViewClass))
#define LD_DIAGRAM_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_DIAGRAM_VIEW, LdDiagramView))
#define LD_DIAGRAM_VIEW_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
LD_TYPE_DIAGRAM_VIEW, \
LdDiagramViewClass))
#define LD_IS_DIAGRAM_VIEW(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_DIAGRAM_VIEW))
#define LD_IS_DIAGRAM_VIEW_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_DIAGRAM_VIEW))
#define LD_DIAGRAM_VIEW_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_DIAGRAM_VIEW, LdDiagramViewClass))
typedef struct _LdDiagramView LdDiagramView;
typedef struct _LdDiagramViewPrivate LdDiagramViewPrivate;
@ -94,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

View File

@ -105,7 +105,7 @@ static void uninstall_object (LdDiagramObject *object, LdDiagram *self);
static void ld_diagram_unselect_all_internal (LdDiagram *self);
G_DEFINE_TYPE (LdDiagram, ld_diagram, G_TYPE_OBJECT);
G_DEFINE_TYPE (LdDiagram, ld_diagram, G_TYPE_OBJECT)
static void
ld_diagram_class_init (LdDiagramClass *klass)

View File

@ -15,16 +15,15 @@ G_BEGIN_DECLS
#define LD_TYPE_DIAGRAM (ld_diagram_get_type ())
#define LD_DIAGRAM(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_DIAGRAM, LdDiagram))
#define LD_DIAGRAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_DIAGRAM, LdDiagramClass))
#define LD_IS_DIAGRAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_DIAGRAM))
#define LD_IS_DIAGRAM_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_DIAGRAM))
#define LD_DIAGRAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_DIAGRAM, LdDiagramClass))
#define LD_DIAGRAM(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_DIAGRAM, LdDiagram))
#define LD_DIAGRAM_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_DIAGRAM, LdDiagramClass))
#define LD_IS_DIAGRAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_DIAGRAM))
#define LD_IS_DIAGRAM_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_DIAGRAM))
#define LD_DIAGRAM_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_DIAGRAM, LdDiagramClass))
typedef struct _LdDiagram LdDiagram;
typedef struct _LdDiagramClass LdDiagramClass;
@ -114,4 +113,3 @@ void ld_diagram_unselect_all (LdDiagram *self);
G_END_DECLS
#endif /* ! __LD_DIAGRAM_H__ */

View File

@ -49,8 +49,10 @@ static gboolean foreach_dir (const gchar *path,
gboolean (*callback) (const gchar *, const gchar *, gpointer),
gpointer userdata, GError **error);
static LdSymbol *traverse_path (LdCategory *category, gchar **path);
G_DEFINE_TYPE (LdLibrary, ld_library, G_TYPE_OBJECT);
G_DEFINE_TYPE (LdLibrary, ld_library, G_TYPE_OBJECT)
static void
ld_library_class_init (LdLibraryClass *klass)
@ -356,62 +358,51 @@ ld_library_load (LdLibrary *self, const gchar *directory)
LdSymbol *
ld_library_find_symbol (LdLibrary *self, const gchar *identifier)
{
gchar **id_el_start, **id_el;
const GSList *list, *list_el;
LdCategory *cat;
gchar **path;
LdSymbol *symbol = NULL;
g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
g_return_val_if_fail (identifier != NULL, NULL);
id_el_start = g_strsplit (identifier, LD_LIBRARY_IDENTIFIER_SEPARATOR, 0);
if (!id_el_start)
return NULL;
/* We need at least one category name plus the symbol name. */
id_el = id_el_start;
if (!id_el[0] || !id_el[1])
goto ld_library_find_symbol_error;
/* Find the category where the symbol is in. */
cat = self->priv->root;
while (1)
path = g_strsplit (identifier, LD_LIBRARY_IDENTIFIER_SEPARATOR, 0);
if (path)
{
gboolean found = FALSE;
symbol = traverse_path (self->priv->root, path);
g_strfreev (path);
}
return symbol;
}
list = ld_category_get_children (cat);
for (list_el = list; list_el; list_el = g_slist_next (list_el))
static LdSymbol *
traverse_path (LdCategory *category, gchar **path)
{
const GSList *list, *iter;
LdSymbol *symbol;
g_return_val_if_fail (*path != NULL, NULL);
/* Walk the category tree to where the symbol is supposed to be. */
for (; path[1]; path++)
{
list = ld_category_get_children (category);
for (iter = list; iter; iter = g_slist_next (iter))
{
cat = LD_CATEGORY (list_el->data);
if (!strcmp (*id_el, ld_category_get_name (cat)))
{
found = TRUE;
category = LD_CATEGORY (iter->data);
if (!strcmp (*path, ld_category_get_name (category)))
break;
}
}
if (!found)
goto ld_library_find_symbol_error;
if (!(id_el++)[2])
break;
if (!iter)
return NULL;
}
/* And then the actual symbol. */
list = ld_category_get_symbols (cat);
for (list_el = list; list_el; list_el = g_slist_next (list_el))
/* And look up the actual symbol at the leaf. */
list = ld_category_get_symbols (category);
for (iter = list; iter; iter = g_slist_next (iter))
{
LdSymbol *symbol;
symbol = LD_SYMBOL (list_el->data);
if (!strcmp (*id_el, ld_symbol_get_name (symbol)))
{
g_strfreev (id_el_start);
symbol = LD_SYMBOL (iter->data);
if (!strcmp (*path, ld_symbol_get_name (symbol)))
return symbol;
}
}
ld_library_find_symbol_error:
g_strfreev (id_el_start);
return NULL;
}
@ -427,4 +418,3 @@ ld_library_get_root (LdLibrary *self)
g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
return self->priv->root;
}

View File

@ -15,16 +15,15 @@ G_BEGIN_DECLS
#define LD_TYPE_LIBRARY (ld_library_get_type ())
#define LD_LIBRARY(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_LIBRARY, LdLibrary))
#define LD_LIBRARY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_LIBRARY, LdLibraryClass))
#define LD_IS_LIBRARY(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_LIBRARY))
#define LD_IS_LIBRARY_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_LIBRARY))
#define LD_LIBRARY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_LIBRARY, LdLibraryClass))
#define LD_LIBRARY(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_LIBRARY, LdLibrary))
#define LD_LIBRARY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_LIBRARY, LdLibraryClass))
#define LD_IS_LIBRARY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_LIBRARY))
#define LD_IS_LIBRARY_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_LIBRARY))
#define LD_LIBRARY_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_LIBRARY, LdLibraryClass))
typedef struct _LdLibrary LdLibrary;
typedef struct _LdLibraryPrivate LdLibraryPrivate;
@ -66,4 +65,3 @@ LdCategory *ld_library_get_root (LdLibrary *self);
G_END_DECLS
#endif /* ! __LD_LIBRARY_H__ */

View File

@ -23,4 +23,3 @@ void ld_lua_private_draw (LdLua *self, LdLuaSymbol *symbol, cairo_t *cr);
G_END_DECLS
#endif /* ! __LD_LUA_PRIVATE_H__ */

View File

@ -37,4 +37,3 @@ struct _LdLuaSymbolPrivate
G_END_DECLS
#endif /* ! __LD_LUA_SYMBOL_PRIVATE_H__ */

View File

@ -32,7 +32,7 @@ static const LdPointArray *ld_lua_symbol_real_get_terminals (LdSymbol *symbol);
static void ld_lua_symbol_real_draw (LdSymbol *symbol, cairo_t *cr);
G_DEFINE_TYPE (LdLuaSymbol, ld_lua_symbol, LD_TYPE_SYMBOL);
G_DEFINE_TYPE (LdLuaSymbol, ld_lua_symbol, LD_TYPE_SYMBOL)
static void
ld_lua_symbol_class_init (LdLuaSymbolClass *klass)
@ -135,4 +135,3 @@ ld_lua_symbol_real_draw (LdSymbol *symbol, cairo_t *cr)
ld_lua_private_draw (self->priv->lua, self, cr);
cairo_restore (cr);
}

View File

@ -15,16 +15,16 @@ G_BEGIN_DECLS
#define LD_TYPE_LUA_SYMBOL (ld_lua_symbol_get_type ())
#define LD_LUA_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_LUA_SYMBOL, LdLuaSymbol))
#define LD_LUA_SYMBOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_LUA_SYMBOL, LdLuaSymbolClass))
#define LD_IS_LUA_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_LUA_SYMBOL))
#define LD_IS_LUA_SYMBOL_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_LUA_SYMBOL))
#define LD_LUA_SYMBOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_LUA_SYMBOL, LdLuaSymbolClass))
#define LD_LUA_SYMBOL(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_LUA_SYMBOL, LdLuaSymbol))
#define LD_LUA_SYMBOL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_LUA_SYMBOL, LdLuaSymbolClass))
#define LD_IS_LUA_SYMBOL(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_LUA_SYMBOL))
#define LD_IS_LUA_SYMBOL_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_LUA_SYMBOL))
#define LD_LUA_SYMBOL_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_LUA_SYMBOL, LdLuaSymbolClass))
typedef struct _LdLuaSymbol LdLuaSymbol;
typedef struct _LdLuaSymbolPrivate LdLuaSymbolPrivate;
@ -57,4 +57,3 @@ GType ld_lua_symbol_get_type (void) G_GNUC_CONST;
G_END_DECLS
#endif /* ! __LD_LUA_SYMBOL_H__ */

View File

@ -150,7 +150,7 @@ static luaL_Reg ld_lua_cairo_table[] =
/* ===== Generic =========================================================== */
G_DEFINE_TYPE (LdLua, ld_lua, G_TYPE_OBJECT);
G_DEFINE_TYPE (LdLua, ld_lua, G_TYPE_OBJECT)
static void
ld_lua_class_init (LdLuaClass *klass)
@ -187,8 +187,7 @@ ld_lua_init (LdLua *self)
lua_State *L;
LdLuaData *ud;
self->priv = G_TYPE_INSTANCE_GET_PRIVATE
(self, LD_TYPE_LUA, LdLuaPrivate);
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, LD_TYPE_LUA, LdLuaPrivate);
L = self->priv->L = lua_newstate (ld_lua_alloc, NULL);
g_return_if_fail (L != NULL);
@ -251,8 +250,7 @@ ld_lua_alloc (void *ud, void *ptr, size_t osize, size_t nsize)
g_free (ptr);
return NULL;
}
else
return g_try_realloc (ptr, nsize);
return g_try_realloc (ptr, nsize);
}
/**
@ -465,8 +463,7 @@ ld_lua_logdiag_register (lua_State *L)
lua_insert (L, -2);
lua_concat (L, 2);
g_warning ("Lua symbol registration failed: %s",
lua_tostring (L, -1));
g_warning ("Lua symbol registration failed: %s", lua_tostring (L, -1));
lua_pushboolean (L, FALSE);
}
else
@ -861,4 +858,3 @@ LD_LUA_CAIRO_BEGIN (show_text)
g_object_unref (layout);
LD_LUA_CAIRO_END (0)

View File

@ -15,16 +15,14 @@ G_BEGIN_DECLS
#define LD_TYPE_LUA (ld_lua_get_type ())
#define LD_LUA(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_LUA, LdLua))
#define LD_LUA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_LUA, LdLuaClass))
#define LD_IS_LUA(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_LUA))
#define LD_IS_LUA_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_LUA))
#define LD_LUA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_LUA, LdLuaClass))
#define LD_LUA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_LUA, LdLua))
#define LD_LUA_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_LUA, LdLuaClass))
#define LD_IS_LUA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_LUA))
#define LD_IS_LUA_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_LUA))
#define LD_LUA_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_LUA, LdLuaClass))
typedef struct _LdLua LdLua;
typedef struct _LdLuaPrivate LdLuaPrivate;
@ -67,4 +65,3 @@ gboolean ld_lua_load_file (LdLua *self, const gchar *filename,
G_END_DECLS
#endif /* ! __LD_LUA_H__ */

View File

@ -1,3 +1,2 @@
VOID:OBJECT,OBJECT
VOID:OBJECT,STRING
VOID:DOUBLE,DOUBLE

View File

@ -38,7 +38,7 @@ static void ld_symbol_set_property (GObject *object, guint property_id,
const GValue *value, GParamSpec *pspec);
G_DEFINE_ABSTRACT_TYPE (LdSymbol, ld_symbol, G_TYPE_OBJECT);
G_DEFINE_ABSTRACT_TYPE (LdSymbol, ld_symbol, G_TYPE_OBJECT)
static void
ld_symbol_class_init (LdSymbolClass *klass)

View File

@ -15,16 +15,15 @@ G_BEGIN_DECLS
#define LD_TYPE_SYMBOL (ld_symbol_get_type ())
#define LD_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_SYMBOL, LdSymbol))
#define LD_SYMBOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_SYMBOL, LdSymbolClass))
#define LD_IS_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_SYMBOL))
#define LD_IS_SYMBOL_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_SYMBOL))
#define LD_SYMBOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_SYMBOL, LdSymbolClass))
#define LD_SYMBOL(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_SYMBOL, LdSymbol))
#define LD_SYMBOL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_SYMBOL, LdSymbolClass))
#define LD_IS_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_SYMBOL))
#define LD_IS_SYMBOL_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_SYMBOL))
#define LD_SYMBOL_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_SYMBOL, LdSymbolClass))
typedef struct _LdSymbol LdSymbol;
typedef struct _LdSymbolPrivate LdSymbolPrivate;
@ -72,4 +71,3 @@ void ld_symbol_draw (LdSymbol *self, cairo_t *cr);
G_END_DECLS
#endif /* ! __LD_SYMBOL_H__ */

View File

@ -256,7 +256,8 @@ ld_point_array_remove (LdPointArray *self, gint pos, guint length)
*
* Change size of the array.
*/
void ld_point_array_set_size (LdPointArray *self, guint size)
void
ld_point_array_set_size (LdPointArray *self, guint size)
{
g_return_if_fail (self != NULL);

View File

@ -14,9 +14,9 @@
G_BEGIN_DECLS
#define LD_TYPE_POINT (ld_point_get_type ())
#define LD_TYPE_POINT (ld_point_get_type ())
#define LD_TYPE_POINT_ARRAY (ld_point_array_get_type ())
#define LD_TYPE_RECTANGLE (ld_rectangle_get_type ())
#define LD_TYPE_RECTANGLE (ld_rectangle_get_type ())
/**
@ -99,4 +99,3 @@ void ld_rectangle_extend (LdRectangle *self, gdouble border);
G_END_DECLS
#endif /* ! __LD_TYPES_H__ */

View File

@ -40,7 +40,7 @@ struct _LdUndoActionPrivate
static void ld_undo_action_finalize (GObject *gobject);
G_DEFINE_TYPE (LdUndoAction, ld_undo_action, G_TYPE_OBJECT);
G_DEFINE_TYPE (LdUndoAction, ld_undo_action, G_TYPE_OBJECT)
static void
ld_undo_action_class_init (LdUndoActionClass *klass)
@ -84,9 +84,8 @@ ld_undo_action_finalize (GObject *gobject)
* Return value: a new #LdUndoAction object.
*/
LdUndoAction *
ld_undo_action_new (LdUndoActionFunc undo_func,
LdUndoActionFunc redo_func, LdUndoActionFunc destroy_func,
gpointer user_data)
ld_undo_action_new (LdUndoActionFunc undo_func, LdUndoActionFunc redo_func,
LdUndoActionFunc destroy_func, gpointer user_data)
{
LdUndoAction *self;

View File

@ -15,16 +15,16 @@ G_BEGIN_DECLS
#define LD_TYPE_UNDO_ACTION (ld_undo_action_get_type ())
#define LD_UNDO_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_UNDO_ACTION, LdUndoAction))
#define LD_UNDO_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_UNDO_ACTION, LdUndoActionClass))
#define LD_IS_UNDO_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_UNDO_ACTION))
#define LD_IS_UNDO_ACTION_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_UNDO_ACTION))
#define LD_UNDO_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_UNDO_ACTION, LdUndoActionClass))
#define LD_UNDO_ACTION(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_UNDO_ACTION, LdUndoAction))
#define LD_UNDO_ACTION_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_UNDO_ACTION, LdUndoActionClass))
#define LD_IS_UNDO_ACTION(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_UNDO_ACTION))
#define LD_IS_UNDO_ACTION_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_UNDO_ACTION))
#define LD_UNDO_ACTION_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_UNDO_ACTION, LdUndoActionClass))
typedef struct _LdUndoAction LdUndoAction;
typedef struct _LdUndoActionPrivate LdUndoActionPrivate;
@ -73,4 +73,3 @@ void ld_undo_action_redo (LdUndoAction *self);
G_END_DECLS
#endif /* ! __LD_UNDO_ACTION_H__ */

134
po/cs.po
View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: logdiag\n"
"Report-Msgid-Bugs-To: https://git.janouch.name/p/logdiag/issues\n"
"POT-Creation-Date: 2021-10-22 22:16+0200\n"
"PO-Revision-Date: 2021-10-22 22:21+0200\n"
"POT-Creation-Date: 2021-10-28 20:07+0200\n"
"PO-Revision-Date: 2021-10-28 20:10+0200\n"
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
"Language-Team: Czech <cs@li.org>\n"
"Language: cs\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.0\n"
#: ../src/ld-window-main.c:937
#: ../src/ld-window-main.c:968
#, c-format
msgid "%d%%"
msgstr "%d %%"
@ -26,19 +26,19 @@ msgstr "%d %%"
msgid "- Schematic editor"
msgstr "- Editor schémat"
#: ../src/ld-window-main.c:861
#: ../src/ld-window-main.c:892
msgid "Close _without Saving"
msgstr "Zavřít _bez uložení"
#: ../src/ld-window-main.c:128
#: ../src/ld-window-main.c:141
msgid "Create a new diagram"
msgstr "Vytvoří nový diagram"
#: ../src/ld-window-main.c:161
#: ../src/ld-window-main.c:174
msgid "Delete the contents of the selection"
msgstr "Odstraní obsah výběru"
#: ../src/ld-window-main.c:354
#: ../src/ld-window-main.c:370
msgid "Drag symbols from the library pane to add them to the diagram."
msgstr "Pro přidání symbolů do diagramu je přetáhněte z panelu knihovny."
@ -46,131 +46,147 @@ msgstr "Pro přidání symbolů do diagramu je přetáhněte z panelu knihovny."
msgid "Empty"
msgstr "Prázdné"
#: ../src/ld-window-main.c:707
#: ../src/ld-window-main.c:1042
msgid "Error"
msgstr "Chyba"
#: ../src/ld-window-main.c:738
#, c-format
msgid "Failed to open file `%s': Invalid contents."
msgstr "Nelze otevřít soubor \"%s\": Neplatný obsah."
#: ../src/ld-window-main.c:698
#: ../src/ld-window-main.c:729
msgid "Failed to open the file"
msgstr "Nelze otevřít soubor"
#: ../src/ld-window-main.c:662
#: ../src/ld-window-main.c:1149
msgid "Failed to open the user guide"
msgstr "Nelze otevřít průvodce uživatele"
#: ../src/ld-window-main.c:693
msgid "Failed to save the diagram"
msgstr "Nelze uložit diagram"
#: ../src/ld-window-main.c:859
#: ../src/ld-window-main.c:890
msgid "If you don't save, changes will be permanently lost."
msgstr "Pokud je neuložíte, budou změny navždy ztraceny."
#: ../src/ld-window-main.c:738
#: ../src/ld-window-main.c:769
msgid "Logdiag Diagrams (*.ldd)"
msgstr "Diagramy logdiag (*.ldd)"
#: ../src/ld-window-main.c:131
#: ../src/ld-window-main.c:144
msgid "Open a diagram"
msgstr "Otevře diagram"
#: ../src/ld-window-main.c:759
#: ../src/ld-window-main.c:193
msgid "Open the manual"
msgstr "Otevře manuál"
#: ../src/ld-window-main.c:790
msgid "Open..."
msgstr "Otevřít..."
#: ../src/ld-window-main.c:145
#: ../src/ld-window-main.c:154
msgid "Print the diagram"
msgstr "Vytiskne diagram"
#: ../src/ld-window-main.c:158
msgid "Quit the application"
msgstr "Ukončí aplikaci"
#: ../src/ld-window-main.c:153
#: ../src/ld-window-main.c:166
msgid "Redo the last undone action"
msgstr "Provede posledně vrácenou akci"
#: ../src/ld-window-main.c:175
#: ../src/ld-window-main.c:188
msgid "Reset zoom level back to the default"
msgstr "Vrátí přiblížení na výchozí hodnotu"
#: ../src/ld-window-main.c:792
#: ../src/ld-window-main.c:823
msgid "Save As..."
msgstr "Uložit jako..."
#: ../src/ld-window-main.c:136
#: ../src/ld-window-main.c:149
msgid "Save _As..."
msgstr "Uložit _jako..."
#: ../src/ld-window-main.c:623
#: ../src/ld-window-main.c:654
#, c-format
msgid "Save the changes to diagram \"%s\" before closing it and creating a new one?"
msgstr "Uložit změny v diagramu \"%s\" před jeho zavřením a vytvořením nového?"
#: ../src/ld-window-main.c:755
#: ../src/ld-window-main.c:786
#, c-format
msgid "Save the changes to diagram \"%s\" before closing it and opening another one?"
msgstr "Uložit změny v diagramu \"%s\" před jeho zavřením a otevřením jiného?"
#: ../src/ld-window-main.c:899
#: ../src/ld-window-main.c:930
#, c-format
msgid "Save the changes to diagram \"%s\" before closing?"
msgstr "Uložit změny v diagramu \"%s\" před jeho zavřením?"
#: ../src/ld-window-main.c:134
#: ../src/ld-window-main.c:147
msgid "Save the current diagram"
msgstr "Uloží stávající diagram"
#: ../src/ld-window-main.c:137
#: ../src/ld-window-main.c:150
msgid "Save the current diagram with another name"
msgstr "Uloží stávající diagram pod jiným jménem"
#: ../src/ld-window-main.c:163
#: ../src/ld-window-main.c:176
msgid "Select _All"
msgstr "Vybrat _vše"
#: ../src/ld-window-main.c:164
#: ../src/ld-window-main.c:177
msgid "Select all objects in the diagram"
msgstr "Vybere všechny objekty v diagramu"
#: ../src/ld-window-main.c:192
#: ../src/ld-window-main.c:208
msgid "Show _Grid"
msgstr "Zobrazit _mřížku"
#: ../src/ld-window-main.c:180
#: ../src/ld-window-main.c:196
msgid "Show a dialog about this application"
msgstr "Zobrazí dialog o této aplikaci"
#: ../src/ld-window-main.c:193
#: ../src/ld-window-main.c:209
msgid "Toggle displaying of the grid"
msgstr "Přepne zobrazování mřížky"
#: ../src/ld-window-main.c:190
#: ../src/ld-window-main.c:206
msgid "Toggle displaying of the library pane"
msgstr "Přepne zobrazování panelu knihovny"
#: ../src/ld-window-main.c:187
#: ../src/ld-window-main.c:203
msgid "Toggle displaying of the main toolbar"
msgstr "Přepne zobrazování hlavního panelu nástrojů"
#: ../src/ld-window-main.c:665
#: ../src/ld-window-main.c:696
msgid "Try again or save it under another name."
msgstr "Zkuste to znova nebo jej uložte pod jiným názvem."
#: ../src/ld-window-main.c:150
#: ../src/ld-window-main.c:163
msgid "Undo the last action"
msgstr "Vrátí poslední akci"
#: ../src/ld-window-main.c:591
#: ../src/ld-window-main.c:622
msgid "Unsaved Diagram"
msgstr "Neuložený diagram"
#: ../src/ld-window-main.c:806
#: ../src/ld-window-main.c:837
msgid "Untitled diagram"
msgstr "Nepojmenovaný diagram"
#: ../src/ld-window-main.c:171
#: ../src/ld-window-main.c:184
msgid "Zoom _Out"
msgstr "_Oddálit"
#: ../src/ld-window-main.c:169
#: ../src/ld-window-main.c:182
msgid "Zoom into the diagram"
msgstr "Přiblíží diagram"
#: ../src/ld-window-main.c:172
#: ../src/ld-window-main.c:185
msgid "Zoom out of the diagram"
msgstr "Oddálí diagram"
@ -178,71 +194,79 @@ msgstr "Oddálí diagram"
msgid "[FILE...]"
msgstr "[SOUBOR...]"
#: ../src/ld-window-main.c:179
#: ../src/ld-window-main.c:195
msgid "_About"
msgstr "_O programu"
#: ../src/ld-window-main.c:160
#: ../src/ld-window-main.c:173
msgid "_Delete"
msgstr "_Smazat"
#: ../src/ld-window-main.c:148
#: ../src/ld-window-main.c:161
msgid "_Edit"
msgstr "_Úpravy"
#: ../src/ld-window-main.c:126
#: ../src/ld-window-main.c:139
msgid "_File"
msgstr "_Soubor"
#: ../src/ld-window-main.c:178
#: ../src/ld-window-main.c:191
msgid "_Help"
msgstr "_Nápověda"
#: ../src/ld-window-main.c:189
#: ../src/ld-window-main.c:205
msgid "_Library Pane"
msgstr "Panel _knihovny"
#: ../src/ld-window-main.c:186
#: ../src/ld-window-main.c:202
msgid "_Main Toolbar"
msgstr "_Hlavní panel nástrojů"
#: ../src/ld-window-main.c:127
#: ../src/ld-window-main.c:140
msgid "_New"
msgstr "_Nový"
#: ../src/ld-window-main.c:174
#: ../src/ld-window-main.c:187
msgid "_Normal Size"
msgstr "_Normální velikost"
#: ../src/ld-window-main.c:130
#: ../src/ld-window-main.c:143
msgid "_Open..."
msgstr "_Otevřít..."
#: ../src/ld-window-main.c:144
#: ../src/ld-window-main.c:153
msgid "_Print..."
msgstr "_Tisk..."
#: ../src/ld-window-main.c:157
msgid "_Quit"
msgstr "U_končit"
#: ../src/ld-window-main.c:152
#: ../src/ld-window-main.c:165
msgid "_Redo"
msgstr "Z_novu"
#: ../src/ld-window-main.c:133
#: ../src/ld-window-main.c:146
msgid "_Save"
msgstr "_Uložit"
#: ../src/ld-window-main.c:149
#: ../src/ld-window-main.c:162
msgid "_Undo"
msgstr "_Zpět"
#: ../src/ld-window-main.c:167
#: ../src/ld-window-main.c:192
msgid "_User Guide"
msgstr "_Průvodce uživatele"
#: ../src/ld-window-main.c:180
msgid "_View"
msgstr "_Zobrazení"
#: ../src/ld-window-main.c:168
#: ../src/ld-window-main.c:181
msgid "_Zoom In"
msgstr "_Přiblížit"
#: ../src/ld-window-main.c:983
#: ../src/ld-window-main.c:1163
msgid "translator-credits"
msgstr "Přemysl Eric Janouch <p@janouch.name>"

141
po/de.po
View File

@ -7,17 +7,17 @@ msgid ""
msgstr ""
"Project-Id-Version: logdiag\n"
"Report-Msgid-Bugs-To: https://git.janouch.name/p/logdiag/issues\n"
"POT-Creation-Date: 2021-10-22 22:16+0200\n"
"PO-Revision-Date: 2018-06-25 04:11+0200\n"
"POT-Creation-Date: 2021-10-28 20:07+0200\n"
"PO-Revision-Date: 2021-10-28 21:29+0200\n"
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
"Language-Team: German <de@li.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.8\n"
"X-Generator: Poedit 3.0\n"
#: ../src/ld-window-main.c:937
#: ../src/ld-window-main.c:968
#, c-format
msgid "%d%%"
msgstr "%d %%"
@ -26,19 +26,19 @@ msgstr "%d %%"
msgid "- Schematic editor"
msgstr "- Schema Editor"
#: ../src/ld-window-main.c:861
#: ../src/ld-window-main.c:892
msgid "Close _without Saving"
msgstr "Schließen _ohne Speichern"
#: ../src/ld-window-main.c:128
#: ../src/ld-window-main.c:141
msgid "Create a new diagram"
msgstr "Neues Diagramm erstellen"
#: ../src/ld-window-main.c:161
#: ../src/ld-window-main.c:174
msgid "Delete the contents of the selection"
msgstr "Inhalt der markierten Einträge löschen"
#: ../src/ld-window-main.c:354
#: ../src/ld-window-main.c:370
msgid "Drag symbols from the library pane to add them to the diagram."
msgstr ""
"Ziehen Sie Symbole aus dem Bibliotheksfenster, um sie dem Diagramm "
@ -48,62 +48,78 @@ msgstr ""
msgid "Empty"
msgstr "Leere"
#: ../src/ld-window-main.c:707
#: ../src/ld-window-main.c:1042
msgid "Error"
msgstr "Fehler"
#: ../src/ld-window-main.c:738
#, c-format
msgid "Failed to open file `%s': Invalid contents."
msgstr "Fehler beim Öffnen der Datei \"%s\": Ungültiger Inhalt."
#: ../src/ld-window-main.c:698
#: ../src/ld-window-main.c:729
msgid "Failed to open the file"
msgstr "Fehler beim Öffnen der Datei"
#: ../src/ld-window-main.c:662
#: ../src/ld-window-main.c:1149
msgid "Failed to open the user guide"
msgstr "Fehler beim Öffnen des Benutzerhandbuchs"
#: ../src/ld-window-main.c:693
msgid "Failed to save the diagram"
msgstr "Fehler beim Speichern des Diagramms"
#: ../src/ld-window-main.c:859
#: ../src/ld-window-main.c:890
msgid "If you don't save, changes will be permanently lost."
msgstr "Wenn Sie nicht speichern, gehen alle Änderungen verloren."
#: ../src/ld-window-main.c:738
#: ../src/ld-window-main.c:769
msgid "Logdiag Diagrams (*.ldd)"
msgstr "Diagramme logdiag (.ldd)"
#: ../src/ld-window-main.c:131
#: ../src/ld-window-main.c:144
msgid "Open a diagram"
msgstr "Diagramm öffnen"
#: ../src/ld-window-main.c:759
#: ../src/ld-window-main.c:193
msgid "Open the manual"
msgstr "Die Betriebsanleitung öffnen"
#: ../src/ld-window-main.c:790
msgid "Open..."
msgstr "Öffnen..."
#: ../src/ld-window-main.c:145
#: ../src/ld-window-main.c:154
msgid "Print the diagram"
msgstr "Das Diagramm drucken"
#: ../src/ld-window-main.c:158
msgid "Quit the application"
msgstr "Anwendung beenden"
#: ../src/ld-window-main.c:153
#: ../src/ld-window-main.c:166
msgid "Redo the last undone action"
msgstr "Letzte nicht abgeschlossene Aktion wiederholen"
#: ../src/ld-window-main.c:175
#: ../src/ld-window-main.c:188
msgid "Reset zoom level back to the default"
msgstr "Zoom Bereich zurücksetzen"
#: ../src/ld-window-main.c:792
#: ../src/ld-window-main.c:823
msgid "Save As..."
msgstr "Speichern unter..."
#: ../src/ld-window-main.c:136
#: ../src/ld-window-main.c:149
msgid "Save _As..."
msgstr "Speichern _unter..."
#: ../src/ld-window-main.c:623
#: ../src/ld-window-main.c:654
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and creating a new one?"
msgstr "Änderungen im Diagramm \"%s\" speichern bevor ein Neues geöffnet wird?"
#: ../src/ld-window-main.c:755
#: ../src/ld-window-main.c:786
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and opening another one?"
@ -111,73 +127,72 @@ msgstr ""
"Änderungen im Diagramm \"%s\" speichern bevor es beendet und ein Weiteres "
"geöffnet wird?"
#: ../src/ld-window-main.c:899
#: ../src/ld-window-main.c:930
#, c-format
msgid "Save the changes to diagram \"%s\" before closing?"
msgstr "Änderungen im Diagramm \"%s\" vor dem Schließen speichern?"
#: ../src/ld-window-main.c:134
#: ../src/ld-window-main.c:147
msgid "Save the current diagram"
msgstr "Speichern des aktuellen Diagramms"
#: ../src/ld-window-main.c:137
#: ../src/ld-window-main.c:150
msgid "Save the current diagram with another name"
msgstr "Aktuelles Diagramm unter anderem Namen speichern"
#: ../src/ld-window-main.c:163
#: ../src/ld-window-main.c:176
msgid "Select _All"
msgstr "_Alles Auswählen"
#: ../src/ld-window-main.c:164
#: ../src/ld-window-main.c:177
msgid "Select all objects in the diagram"
msgstr "Alle Objekte im Diagramm auswählen"
#: ../src/ld-window-main.c:192
#: ../src/ld-window-main.c:208
msgid "Show _Grid"
msgstr "_Gitter anzeigen"
#: ../src/ld-window-main.c:180
#: ../src/ld-window-main.c:196
msgid "Show a dialog about this application"
msgstr "Zeige einen Dialog über diese Anwendung"
#: ../src/ld-window-main.c:193
#: ../src/ld-window-main.c:209
msgid "Toggle displaying of the grid"
msgstr "Gitter ein-/ausblenden"
#: ../src/ld-window-main.c:190
#: ../src/ld-window-main.c:206
msgid "Toggle displaying of the library pane"
msgstr "Bibliothek ein-/ausblenden"
#: ../src/ld-window-main.c:187
#: ../src/ld-window-main.c:203
msgid "Toggle displaying of the main toolbar"
msgstr "Symbolleiste ein-/ausblenden"
#: ../src/ld-window-main.c:665
#: ../src/ld-window-main.c:696
msgid "Try again or save it under another name."
msgstr "Erneuter Versuch oder unter anderem Namen speichern."
#: ../src/ld-window-main.c:150
#: ../src/ld-window-main.c:163
msgid "Undo the last action"
msgstr "Letzte Aktion rückgangig machen"
#: ../src/ld-window-main.c:591
#: ../src/ld-window-main.c:622
msgid "Unsaved Diagram"
msgstr "Ungespeichertes Diagramm"
#: ../src/ld-window-main.c:806
#, fuzzy
#: ../src/ld-window-main.c:837
msgid "Untitled diagram"
msgstr "Ungespeichertes Diagramm"
msgstr "Unbenanntes Diagramm"
#: ../src/ld-window-main.c:171
#: ../src/ld-window-main.c:184
msgid "Zoom _Out"
msgstr "Zoom _heraus"
#: ../src/ld-window-main.c:169
#: ../src/ld-window-main.c:182
msgid "Zoom into the diagram"
msgstr "In das Diagramm zoomen"
#: ../src/ld-window-main.c:172
#: ../src/ld-window-main.c:185
msgid "Zoom out of the diagram"
msgstr "Aus dem Diagramm zoomen"
@ -185,71 +200,79 @@ msgstr "Aus dem Diagramm zoomen"
msgid "[FILE...]"
msgstr "[DATEI...]"
#: ../src/ld-window-main.c:179
#: ../src/ld-window-main.c:195
msgid "_About"
msgstr "_Über"
msgstr "_Info"
#: ../src/ld-window-main.c:160
#: ../src/ld-window-main.c:173
msgid "_Delete"
msgstr "_Löschen"
#: ../src/ld-window-main.c:148
#: ../src/ld-window-main.c:161
msgid "_Edit"
msgstr "_Ändern"
#: ../src/ld-window-main.c:126
#: ../src/ld-window-main.c:139
msgid "_File"
msgstr "_Datei"
#: ../src/ld-window-main.c:178
#: ../src/ld-window-main.c:191
msgid "_Help"
msgstr "_Hilfe"
#: ../src/ld-window-main.c:189
#: ../src/ld-window-main.c:205
msgid "_Library Pane"
msgstr "_Bibliothek Menüleiste"
#: ../src/ld-window-main.c:186
#: ../src/ld-window-main.c:202
msgid "_Main Toolbar"
msgstr "_Symbolleiste"
#: ../src/ld-window-main.c:127
#: ../src/ld-window-main.c:140
msgid "_New"
msgstr "_Neu"
#: ../src/ld-window-main.c:174
#: ../src/ld-window-main.c:187
msgid "_Normal Size"
msgstr "_Normale Größe"
#: ../src/ld-window-main.c:130
#: ../src/ld-window-main.c:143
msgid "_Open..."
msgstr "_Öffnen..."
#: ../src/ld-window-main.c:144
#: ../src/ld-window-main.c:153
msgid "_Print..."
msgstr "_Drucken..."
#: ../src/ld-window-main.c:157
msgid "_Quit"
msgstr "_Beenden"
#: ../src/ld-window-main.c:152
#: ../src/ld-window-main.c:165
msgid "_Redo"
msgstr "_Wiederholen"
#: ../src/ld-window-main.c:133
#: ../src/ld-window-main.c:146
msgid "_Save"
msgstr "_Speichern"
#: ../src/ld-window-main.c:149
#: ../src/ld-window-main.c:162
msgid "_Undo"
msgstr "_Rückgängig"
#: ../src/ld-window-main.c:167
#: ../src/ld-window-main.c:192
msgid "_User Guide"
msgstr "_Benutzerhandbuch"
#: ../src/ld-window-main.c:180
msgid "_View"
msgstr "_Ansicht"
#: ../src/ld-window-main.c:168
#: ../src/ld-window-main.c:181
msgid "_Zoom In"
msgstr "_Hineinzoomen"
#: ../src/ld-window-main.c:983
#: ../src/ld-window-main.c:1163
msgid "translator-credits"
msgstr "Andy J."

View File

@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: logdiag 0.2.0\n"
"Project-Id-Version: logdiag 0.3.0\n"
"Report-Msgid-Bugs-To: https://git.janouch.name/p/logdiag/issues\n"
"POT-Creation-Date: 2021-10-22 22:16+0200\n"
"POT-Creation-Date: 2021-10-28 20:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,222 +17,246 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../src/ld-window-main.c:126
#: ../src/ld-window-main.c:139
msgid "_File"
msgstr ""
#: ../src/ld-window-main.c:127
#: ../src/ld-window-main.c:140
msgid "_New"
msgstr ""
#: ../src/ld-window-main.c:128
#: ../src/ld-window-main.c:141
msgid "Create a new diagram"
msgstr ""
#: ../src/ld-window-main.c:130
#: ../src/ld-window-main.c:143
msgid "_Open..."
msgstr ""
#: ../src/ld-window-main.c:131
#: ../src/ld-window-main.c:144
msgid "Open a diagram"
msgstr ""
#: ../src/ld-window-main.c:133
#: ../src/ld-window-main.c:146
msgid "_Save"
msgstr ""
#: ../src/ld-window-main.c:134
#: ../src/ld-window-main.c:147
msgid "Save the current diagram"
msgstr ""
#: ../src/ld-window-main.c:136
#: ../src/ld-window-main.c:149
msgid "Save _As..."
msgstr ""
#: ../src/ld-window-main.c:137
#: ../src/ld-window-main.c:150
msgid "Save the current diagram with another name"
msgstr ""
#: ../src/ld-window-main.c:144
#: ../src/ld-window-main.c:153
msgid "_Print..."
msgstr ""
#: ../src/ld-window-main.c:154
msgid "Print the diagram"
msgstr ""
#: ../src/ld-window-main.c:157
msgid "_Quit"
msgstr ""
#: ../src/ld-window-main.c:145
#: ../src/ld-window-main.c:158
msgid "Quit the application"
msgstr ""
#: ../src/ld-window-main.c:148
#: ../src/ld-window-main.c:161
msgid "_Edit"
msgstr ""
#: ../src/ld-window-main.c:149
#: ../src/ld-window-main.c:162
msgid "_Undo"
msgstr ""
#: ../src/ld-window-main.c:150
#: ../src/ld-window-main.c:163
msgid "Undo the last action"
msgstr ""
#: ../src/ld-window-main.c:152
#: ../src/ld-window-main.c:165
msgid "_Redo"
msgstr ""
#: ../src/ld-window-main.c:153
#: ../src/ld-window-main.c:166
msgid "Redo the last undone action"
msgstr ""
#: ../src/ld-window-main.c:160
#: ../src/ld-window-main.c:173
msgid "_Delete"
msgstr ""
#: ../src/ld-window-main.c:161
#: ../src/ld-window-main.c:174
msgid "Delete the contents of the selection"
msgstr ""
#: ../src/ld-window-main.c:163
#: ../src/ld-window-main.c:176
msgid "Select _All"
msgstr ""
#: ../src/ld-window-main.c:164
#: ../src/ld-window-main.c:177
msgid "Select all objects in the diagram"
msgstr ""
#: ../src/ld-window-main.c:167
#: ../src/ld-window-main.c:180
msgid "_View"
msgstr ""
#: ../src/ld-window-main.c:168
#: ../src/ld-window-main.c:181
msgid "_Zoom In"
msgstr ""
#: ../src/ld-window-main.c:169
#: ../src/ld-window-main.c:182
msgid "Zoom into the diagram"
msgstr ""
#: ../src/ld-window-main.c:171
#: ../src/ld-window-main.c:184
msgid "Zoom _Out"
msgstr ""
#: ../src/ld-window-main.c:172
#: ../src/ld-window-main.c:185
msgid "Zoom out of the diagram"
msgstr ""
#: ../src/ld-window-main.c:174
#: ../src/ld-window-main.c:187
msgid "_Normal Size"
msgstr ""
#: ../src/ld-window-main.c:175
#: ../src/ld-window-main.c:188
msgid "Reset zoom level back to the default"
msgstr ""
#: ../src/ld-window-main.c:178
#: ../src/ld-window-main.c:191
msgid "_Help"
msgstr ""
#: ../src/ld-window-main.c:179
msgid "_About"
msgstr ""
#: ../src/ld-window-main.c:180
msgid "Show a dialog about this application"
msgstr ""
#: ../src/ld-window-main.c:186
msgid "_Main Toolbar"
msgstr ""
#: ../src/ld-window-main.c:187
msgid "Toggle displaying of the main toolbar"
msgstr ""
#: ../src/ld-window-main.c:189
msgid "_Library Pane"
msgstr ""
#: ../src/ld-window-main.c:190
msgid "Toggle displaying of the library pane"
msgstr ""
#: ../src/ld-window-main.c:192
msgid "Show _Grid"
msgid "_User Guide"
msgstr ""
#: ../src/ld-window-main.c:193
msgid "Open the manual"
msgstr ""
#: ../src/ld-window-main.c:195
msgid "_About"
msgstr ""
#: ../src/ld-window-main.c:196
msgid "Show a dialog about this application"
msgstr ""
#: ../src/ld-window-main.c:202
msgid "_Main Toolbar"
msgstr ""
#: ../src/ld-window-main.c:203
msgid "Toggle displaying of the main toolbar"
msgstr ""
#: ../src/ld-window-main.c:205
msgid "_Library Pane"
msgstr ""
#: ../src/ld-window-main.c:206
msgid "Toggle displaying of the library pane"
msgstr ""
#: ../src/ld-window-main.c:208
msgid "Show _Grid"
msgstr ""
#: ../src/ld-window-main.c:209
msgid "Toggle displaying of the grid"
msgstr ""
#: ../src/ld-window-main.c:354
#: ../src/ld-window-main.c:370
msgid "Drag symbols from the library pane to add them to the diagram."
msgstr ""
#: ../src/ld-window-main.c:591
#: ../src/ld-window-main.c:622
msgid "Unsaved Diagram"
msgstr ""
#: ../src/ld-window-main.c:623
#: ../src/ld-window-main.c:654
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and creating a new one?"
msgstr ""
#: ../src/ld-window-main.c:662
#: ../src/ld-window-main.c:693
msgid "Failed to save the diagram"
msgstr ""
#: ../src/ld-window-main.c:665
#: ../src/ld-window-main.c:696
msgid "Try again or save it under another name."
msgstr ""
#: ../src/ld-window-main.c:698
#: ../src/ld-window-main.c:729
msgid "Failed to open the file"
msgstr ""
#: ../src/ld-window-main.c:707
#: ../src/ld-window-main.c:738
#, c-format
msgid "Failed to open file `%s': Invalid contents."
msgstr ""
#: ../src/ld-window-main.c:738
#: ../src/ld-window-main.c:769
msgid "Logdiag Diagrams (*.ldd)"
msgstr ""
#: ../src/ld-window-main.c:755
#: ../src/ld-window-main.c:786
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and opening another one?"
msgstr ""
#: ../src/ld-window-main.c:759
#: ../src/ld-window-main.c:790
msgid "Open..."
msgstr ""
#: ../src/ld-window-main.c:792
#: ../src/ld-window-main.c:823
msgid "Save As..."
msgstr ""
#: ../src/ld-window-main.c:806
#: ../src/ld-window-main.c:837
msgid "Untitled diagram"
msgstr ""
#: ../src/ld-window-main.c:859
#: ../src/ld-window-main.c:890
msgid "If you don't save, changes will be permanently lost."
msgstr ""
#: ../src/ld-window-main.c:861
#: ../src/ld-window-main.c:892
msgid "Close _without Saving"
msgstr ""
#: ../src/ld-window-main.c:899
#: ../src/ld-window-main.c:930
#, c-format
msgid "Save the changes to diagram \"%s\" before closing?"
msgstr ""
#: ../src/ld-window-main.c:937
#: ../src/ld-window-main.c:968
#, c-format
msgid "%d%%"
msgstr ""
#: ../src/ld-window-main.c:983
#: ../src/ld-window-main.c:1042
msgid "Error"
msgstr ""
#: ../src/ld-window-main.c:1149
msgid "Failed to open the user guide"
msgstr ""
#: ../src/ld-window-main.c:1163
msgid "translator-credits"
msgstr ""

159
po/pl.po
View File

@ -7,17 +7,17 @@ msgid ""
msgstr ""
"Project-Id-Version: logdiag\n"
"Report-Msgid-Bugs-To: https://git.janouch.name/p/logdiag/issues\n"
"POT-Creation-Date: 2021-10-22 22:16+0200\n"
"PO-Revision-Date: 2018-06-25 04:09+0200\n"
"POT-Creation-Date: 2021-10-28 20:07+0200\n"
"PO-Revision-Date: 2021-10-28 20:38+0200\n"
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
"Language-Team: Polish <pl@li.org>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.8\n"
"X-Generator: Poedit 3.0\n"
#: ../src/ld-window-main.c:937
#: ../src/ld-window-main.c:968
#, c-format
msgid "%d%%"
msgstr "%d%%"
@ -26,19 +26,19 @@ msgstr "%d%%"
msgid "- Schematic editor"
msgstr "- Edytor schematów"
#: ../src/ld-window-main.c:861
#: ../src/ld-window-main.c:892
msgid "Close _without Saving"
msgstr "Zamknąć _bez zapisu"
#: ../src/ld-window-main.c:128
#: ../src/ld-window-main.c:141
msgid "Create a new diagram"
msgstr "Stworzenie nowego wykresu"
#: ../src/ld-window-main.c:161
#: ../src/ld-window-main.c:174
msgid "Delete the contents of the selection"
msgstr "Usuń zawartość wyboru"
#: ../src/ld-window-main.c:354
#: ../src/ld-window-main.c:370
msgid "Drag symbols from the library pane to add them to the diagram."
msgstr "Przeciągnij symbole z panelu biblioteki, aby dodać je do diagramu."
@ -46,136 +46,147 @@ msgstr "Przeciągnij symbole z panelu biblioteki, aby dodać je do diagramu."
msgid "Empty"
msgstr "Puste"
#: ../src/ld-window-main.c:707
#: ../src/ld-window-main.c:1042
msgid "Error"
msgstr "Błąd"
#: ../src/ld-window-main.c:738
#, c-format
msgid "Failed to open file `%s': Invalid contents."
msgstr "Nie można otworzyć pliku \"%s\": Niepoprawna zawartość."
#: ../src/ld-window-main.c:698
#: ../src/ld-window-main.c:729
msgid "Failed to open the file"
msgstr "Pliku nie da się otworzyć"
#: ../src/ld-window-main.c:662
#: ../src/ld-window-main.c:1149
msgid "Failed to open the user guide"
msgstr "Przewodniku użytkownika nie da się otworzyć"
#: ../src/ld-window-main.c:693
msgid "Failed to save the diagram"
msgstr "Nie udało się zapisać wykresu"
#: ../src/ld-window-main.c:859
#: ../src/ld-window-main.c:890
msgid "If you don't save, changes will be permanently lost."
msgstr "Jeżeli nie zapiszesz zmian, zostaną one trwale utracone"
msgstr "Jeżeli nie zapiszesz zmian, zostaną one trwale utracone."
#: ../src/ld-window-main.c:738
#: ../src/ld-window-main.c:769
msgid "Logdiag Diagrams (*.ldd)"
msgstr "Wykresy logdiag (*.ldd)"
#: ../src/ld-window-main.c:131
#: ../src/ld-window-main.c:144
msgid "Open a diagram"
msgstr "Otwórz wykres"
#: ../src/ld-window-main.c:759
#: ../src/ld-window-main.c:193
msgid "Open the manual"
msgstr "Otworzy podręcznik"
#: ../src/ld-window-main.c:790
msgid "Open..."
msgstr "Otworzyć..."
#: ../src/ld-window-main.c:145
#: ../src/ld-window-main.c:154
msgid "Print the diagram"
msgstr "Wydrukuje wykres"
#: ../src/ld-window-main.c:158
msgid "Quit the application"
msgstr "Zamknie aplikację"
#: ../src/ld-window-main.c:153
#: ../src/ld-window-main.c:166
msgid "Redo the last undone action"
msgstr "Powtórzy ostatnio cofniętą akcję"
#: ../src/ld-window-main.c:175
#: ../src/ld-window-main.c:188
msgid "Reset zoom level back to the default"
msgstr "Przywróci poziom zbliżenia na poziom wyjściowy"
#: ../src/ld-window-main.c:792
#: ../src/ld-window-main.c:823
msgid "Save As..."
msgstr "Zapisz jako..."
#: ../src/ld-window-main.c:136
#: ../src/ld-window-main.c:149
msgid "Save _As..."
msgstr "Zapisz _jako..."
#: ../src/ld-window-main.c:623
#: ../src/ld-window-main.c:654
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and creating a new one?"
msgstr ""
"Zapisać zmiany w wykresie \"%s\" przed jego zamknięciem i stworzeniem nowego?"
msgid "Save the changes to diagram \"%s\" before closing it and creating a new one?"
msgstr "Zapisać zmiany w wykresie \"%s\" przed jego zamknięciem i stworzeniem nowego?"
#: ../src/ld-window-main.c:755
#: ../src/ld-window-main.c:786
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and opening another one?"
msgstr ""
"Zapisać zmiany w wykresie \"%s\" przed jego zamknięciem i stworzeniem nowego?"
msgid "Save the changes to diagram \"%s\" before closing it and opening another one?"
msgstr "Zapisać zmiany w wykresie \"%s\" przed jego zamknięciem i stworzeniem nowego?"
#: ../src/ld-window-main.c:899
#: ../src/ld-window-main.c:930
#, c-format
msgid "Save the changes to diagram \"%s\" before closing?"
msgstr "Zapisać zmiany w wykresie \"%s\" przed jego zamknięciem?"
#: ../src/ld-window-main.c:134
#: ../src/ld-window-main.c:147
msgid "Save the current diagram"
msgstr "Zapisz aktywny wykres"
#: ../src/ld-window-main.c:137
#: ../src/ld-window-main.c:150
msgid "Save the current diagram with another name"
msgstr "Zapisać aktywny wykres pod inną nazwą"
#: ../src/ld-window-main.c:163
#: ../src/ld-window-main.c:176
msgid "Select _All"
msgstr "Wybierz _wszystko"
#: ../src/ld-window-main.c:164
#: ../src/ld-window-main.c:177
msgid "Select all objects in the diagram"
msgstr "Wybierze wszystkie obietky w wykresie"
#: ../src/ld-window-main.c:192
#: ../src/ld-window-main.c:208
msgid "Show _Grid"
msgstr "Pokaż _Siatkę"
msgstr "Pokaż _siatkę"
#: ../src/ld-window-main.c:180
#: ../src/ld-window-main.c:196
msgid "Show a dialog about this application"
msgstr "Pokaże informacje o tej aplikacji"
#: ../src/ld-window-main.c:193
#: ../src/ld-window-main.c:209
msgid "Toggle displaying of the grid"
msgstr "Przełączy pokazywanie siatki"
#: ../src/ld-window-main.c:190
#: ../src/ld-window-main.c:206
msgid "Toggle displaying of the library pane"
msgstr "Przełączy pokazywanie panelu biblioteki"
#: ../src/ld-window-main.c:187
#: ../src/ld-window-main.c:203
msgid "Toggle displaying of the main toolbar"
msgstr "Przełączy pokazywanie głównego panelu narzędzi"
#: ../src/ld-window-main.c:665
#: ../src/ld-window-main.c:696
msgid "Try again or save it under another name."
msgstr "Spróbuj ponownie, bądź zapisz pod inną nazwą."
#: ../src/ld-window-main.c:150
#: ../src/ld-window-main.c:163
msgid "Undo the last action"
msgstr "Cofnie ostatnią akcję"
#: ../src/ld-window-main.c:591
#: ../src/ld-window-main.c:622
msgid "Unsaved Diagram"
msgstr "Niezapisany Wykres"
msgstr "Niezapisany wykres"
#: ../src/ld-window-main.c:806
#, fuzzy
#: ../src/ld-window-main.c:837
msgid "Untitled diagram"
msgstr "Niezapisany Wykres"
msgstr "Wykres bez nazwy"
#: ../src/ld-window-main.c:171
#: ../src/ld-window-main.c:184
msgid "Zoom _Out"
msgstr "_Oddalić widok"
#: ../src/ld-window-main.c:169
#: ../src/ld-window-main.c:182
msgid "Zoom into the diagram"
msgstr "Przybliżyć widok"
#: ../src/ld-window-main.c:172
#: ../src/ld-window-main.c:185
msgid "Zoom out of the diagram"
msgstr "Oddalić widok"
@ -183,71 +194,79 @@ msgstr "Oddalić widok"
msgid "[FILE...]"
msgstr "[PLIK...]"
#: ../src/ld-window-main.c:179
#: ../src/ld-window-main.c:195
msgid "_About"
msgstr "_O programie"
#: ../src/ld-window-main.c:160
#: ../src/ld-window-main.c:173
msgid "_Delete"
msgstr "_Usuń"
#: ../src/ld-window-main.c:148
#: ../src/ld-window-main.c:161
msgid "_Edit"
msgstr "_Edycja"
#: ../src/ld-window-main.c:126
#: ../src/ld-window-main.c:139
msgid "_File"
msgstr "_Plik"
#: ../src/ld-window-main.c:178
#: ../src/ld-window-main.c:191
msgid "_Help"
msgstr "_Pomoc"
#: ../src/ld-window-main.c:189
#: ../src/ld-window-main.c:205
msgid "_Library Pane"
msgstr "Panel _biblioteki"
#: ../src/ld-window-main.c:186
#: ../src/ld-window-main.c:202
msgid "_Main Toolbar"
msgstr "_Główny panel narzędzi"
#: ../src/ld-window-main.c:127
#: ../src/ld-window-main.c:140
msgid "_New"
msgstr "_Nowy"
#: ../src/ld-window-main.c:174
#: ../src/ld-window-main.c:187
msgid "_Normal Size"
msgstr "_Normalna Wielkość"
msgstr "_Normalna wielkość"
#: ../src/ld-window-main.c:130
#: ../src/ld-window-main.c:143
msgid "_Open..."
msgstr "_Otwórz..."
#: ../src/ld-window-main.c:144
#: ../src/ld-window-main.c:153
msgid "_Print..."
msgstr "Wy_drukuj..."
#: ../src/ld-window-main.c:157
msgid "_Quit"
msgstr "_Zakończ"
#: ../src/ld-window-main.c:152
#: ../src/ld-window-main.c:165
msgid "_Redo"
msgstr "_Powtórz"
#: ../src/ld-window-main.c:133
#: ../src/ld-window-main.c:146
msgid "_Save"
msgstr "Z_apisz"
#: ../src/ld-window-main.c:149
#: ../src/ld-window-main.c:162
msgid "_Undo"
msgstr "_Wróć"
#: ../src/ld-window-main.c:167
#: ../src/ld-window-main.c:192
msgid "_User Guide"
msgstr "_Przewodnik użytkownika"
#: ../src/ld-window-main.c:180
msgid "_View"
msgstr "_Widok"
#: ../src/ld-window-main.c:168
#: ../src/ld-window-main.c:181
msgid "_Zoom In"
msgstr "_Przybliżyć"
#: ../src/ld-window-main.c:983
#: ../src/ld-window-main.c:1163
msgid "translator-credits"
msgstr "Robert Svoboda <ravath@gmail.com>"

148
po/sk.po
View File

@ -7,17 +7,17 @@ msgid ""
msgstr ""
"Project-Id-Version: logdiag\n"
"Report-Msgid-Bugs-To: https://git.janouch.name/p/logdiag/issues\n"
"POT-Creation-Date: 2021-10-22 22:16+0200\n"
"PO-Revision-Date: 2018-06-25 04:05+0200\n"
"POT-Creation-Date: 2021-10-28 20:07+0200\n"
"PO-Revision-Date: 2021-10-28 20:23+0200\n"
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
"Language-Team: Slovak <sk@li.org>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.8\n"
"X-Generator: Poedit 3.0\n"
#: ../src/ld-window-main.c:937
#: ../src/ld-window-main.c:968
#, c-format
msgid "%d%%"
msgstr "%d %%"
@ -26,19 +26,19 @@ msgstr "%d %%"
msgid "- Schematic editor"
msgstr "- Editor schém"
#: ../src/ld-window-main.c:861
#: ../src/ld-window-main.c:892
msgid "Close _without Saving"
msgstr "Zatvoriť _bez uloženia"
#: ../src/ld-window-main.c:128
#: ../src/ld-window-main.c:141
msgid "Create a new diagram"
msgstr "Vytvorí nový diagram"
#: ../src/ld-window-main.c:161
#: ../src/ld-window-main.c:174
msgid "Delete the contents of the selection"
msgstr "Odstráni obsah výberu"
#: ../src/ld-window-main.c:354
#: ../src/ld-window-main.c:370
msgid "Drag symbols from the library pane to add them to the diagram."
msgstr "Pre pridanie symbolov do diagramu ich pretiahnite z panela knižnice."
@ -46,135 +46,147 @@ msgstr "Pre pridanie symbolov do diagramu ich pretiahnite z panela knižnice."
msgid "Empty"
msgstr "Prázdne"
#: ../src/ld-window-main.c:707
#: ../src/ld-window-main.c:1042
msgid "Error"
msgstr "Chyba"
#: ../src/ld-window-main.c:738
#, c-format
msgid "Failed to open file `%s': Invalid contents."
msgstr "Nepodarilo sa otvoriť súbor \"%s\": Neplatný obsah."
#: ../src/ld-window-main.c:698
#: ../src/ld-window-main.c:729
msgid "Failed to open the file"
msgstr "Nepodarilo sa otvoriť súbor"
#: ../src/ld-window-main.c:662
#: ../src/ld-window-main.c:1149
msgid "Failed to open the user guide"
msgstr "Nepodarilo sa otvoriť príručku používateľa"
#: ../src/ld-window-main.c:693
msgid "Failed to save the diagram"
msgstr "Nepodarilo sa uložiť diagram"
#: ../src/ld-window-main.c:859
#: ../src/ld-window-main.c:890
msgid "If you don't save, changes will be permanently lost."
msgstr "Ak ich neuložíte, budú zmeny navždy stratené."
#: ../src/ld-window-main.c:738
#: ../src/ld-window-main.c:769
msgid "Logdiag Diagrams (*.ldd)"
msgstr "Diagramy logdiag (*.ldd)"
#: ../src/ld-window-main.c:131
#: ../src/ld-window-main.c:144
msgid "Open a diagram"
msgstr "Otvorí diagram"
#: ../src/ld-window-main.c:759
#: ../src/ld-window-main.c:193
msgid "Open the manual"
msgstr "Otvorí manuál"
#: ../src/ld-window-main.c:790
msgid "Open..."
msgstr "Otvoriť..."
#: ../src/ld-window-main.c:145
#: ../src/ld-window-main.c:154
msgid "Print the diagram"
msgstr "Vytlačí diagram"
#: ../src/ld-window-main.c:158
msgid "Quit the application"
msgstr "Ukončí aplikáciu"
#: ../src/ld-window-main.c:153
#: ../src/ld-window-main.c:166
msgid "Redo the last undone action"
msgstr "Vykoná naposledy vrátenú akciu"
#: ../src/ld-window-main.c:175
#: ../src/ld-window-main.c:188
msgid "Reset zoom level back to the default"
msgstr "Vráti priblíženie na východiskovú hodnotu"
#: ../src/ld-window-main.c:792
#: ../src/ld-window-main.c:823
msgid "Save As..."
msgstr "Uložiť ako..."
#: ../src/ld-window-main.c:136
#: ../src/ld-window-main.c:149
msgid "Save _As..."
msgstr "Uložiť _ako..."
#: ../src/ld-window-main.c:623
#: ../src/ld-window-main.c:654
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and creating a new one?"
msgstr ""
"Uložiť zmeny v diagrame \"%s\" pred jeho zatvorením a vytvorením nového?"
msgid "Save the changes to diagram \"%s\" before closing it and creating a new one?"
msgstr "Uložiť zmeny v diagrame \"%s\" pred jeho zatvorením a vytvorením nového?"
#: ../src/ld-window-main.c:755
#: ../src/ld-window-main.c:786
#, c-format
msgid ""
"Save the changes to diagram \"%s\" before closing it and opening another one?"
msgid "Save the changes to diagram \"%s\" before closing it and opening another one?"
msgstr "Uložiť zmeny v diagrame \"%s\" pred jeho zatvorením a otvorením iného?"
#: ../src/ld-window-main.c:899
#: ../src/ld-window-main.c:930
#, c-format
msgid "Save the changes to diagram \"%s\" before closing?"
msgstr "Uložiť zmeny v diagrame \"%s\" pred jeho zatvorením?"
#: ../src/ld-window-main.c:134
#: ../src/ld-window-main.c:147
msgid "Save the current diagram"
msgstr "Uloží aktuálny diagram"
#: ../src/ld-window-main.c:137
#: ../src/ld-window-main.c:150
msgid "Save the current diagram with another name"
msgstr "Uloží aktuálny diagram pod iným menom"
#: ../src/ld-window-main.c:163
#: ../src/ld-window-main.c:176
msgid "Select _All"
msgstr "Vybrať _všetko"
#: ../src/ld-window-main.c:164
#: ../src/ld-window-main.c:177
msgid "Select all objects in the diagram"
msgstr "Vyberie všetky objekty v diagrame"
#: ../src/ld-window-main.c:192
#: ../src/ld-window-main.c:208
msgid "Show _Grid"
msgstr "Zobraziť _mriežku"
#: ../src/ld-window-main.c:180
#: ../src/ld-window-main.c:196
msgid "Show a dialog about this application"
msgstr "Zobrazí dialóg o tejto aplikácii"
#: ../src/ld-window-main.c:193
#: ../src/ld-window-main.c:209
msgid "Toggle displaying of the grid"
msgstr "Prepne zobrazovanie mriežky"
#: ../src/ld-window-main.c:190
#: ../src/ld-window-main.c:206
msgid "Toggle displaying of the library pane"
msgstr "Prepne zobrazovanie panelu knižnice"
#: ../src/ld-window-main.c:187
#: ../src/ld-window-main.c:203
msgid "Toggle displaying of the main toolbar"
msgstr "Prepne zobrazovanie hlavného panelu nástrojov"
#: ../src/ld-window-main.c:665
#: ../src/ld-window-main.c:696
msgid "Try again or save it under another name."
msgstr "Skúste to znova alebo ho uložte pod iným názvom."
#: ../src/ld-window-main.c:150
#: ../src/ld-window-main.c:163
msgid "Undo the last action"
msgstr "Vráti poslednú akciu"
#: ../src/ld-window-main.c:591
#: ../src/ld-window-main.c:622
msgid "Unsaved Diagram"
msgstr "Neuložený diagram"
#: ../src/ld-window-main.c:806
#, fuzzy
#: ../src/ld-window-main.c:837
msgid "Untitled diagram"
msgstr "Neuložený diagram"
msgstr "Nepomenovaný diagram"
#: ../src/ld-window-main.c:171
#: ../src/ld-window-main.c:184
msgid "Zoom _Out"
msgstr "_Oddialiť"
#: ../src/ld-window-main.c:169
#: ../src/ld-window-main.c:182
msgid "Zoom into the diagram"
msgstr "Priblíži diagram"
#: ../src/ld-window-main.c:172
#: ../src/ld-window-main.c:185
msgid "Zoom out of the diagram"
msgstr "Oddiali diagram"
@ -182,71 +194,79 @@ msgstr "Oddiali diagram"
msgid "[FILE...]"
msgstr "[SÚBOR...]"
#: ../src/ld-window-main.c:179
#: ../src/ld-window-main.c:195
msgid "_About"
msgstr "_O programe"
#: ../src/ld-window-main.c:160
#: ../src/ld-window-main.c:173
msgid "_Delete"
msgstr "_Zmazať"
#: ../src/ld-window-main.c:148
#: ../src/ld-window-main.c:161
msgid "_Edit"
msgstr "_Úpravy"
#: ../src/ld-window-main.c:126
#: ../src/ld-window-main.c:139
msgid "_File"
msgstr "_Súbor"
#: ../src/ld-window-main.c:178
#: ../src/ld-window-main.c:191
msgid "_Help"
msgstr "_Nápoveda"
#: ../src/ld-window-main.c:189
#: ../src/ld-window-main.c:205
msgid "_Library Pane"
msgstr "Panel _knižnice"
#: ../src/ld-window-main.c:186
#: ../src/ld-window-main.c:202
msgid "_Main Toolbar"
msgstr "_Hlavný panel nástrojov"
#: ../src/ld-window-main.c:127
#: ../src/ld-window-main.c:140
msgid "_New"
msgstr "_Nový"
#: ../src/ld-window-main.c:174
#: ../src/ld-window-main.c:187
msgid "_Normal Size"
msgstr "_Normálna veľkosť"
#: ../src/ld-window-main.c:130
#: ../src/ld-window-main.c:143
msgid "_Open..."
msgstr "_Otvoriť..."
#: ../src/ld-window-main.c:144
#: ../src/ld-window-main.c:153
msgid "_Print..."
msgstr "_Tlačiť..."
#: ../src/ld-window-main.c:157
msgid "_Quit"
msgstr "U_končiť"
#: ../src/ld-window-main.c:152
#: ../src/ld-window-main.c:165
msgid "_Redo"
msgstr "Z_novu"
#: ../src/ld-window-main.c:133
#: ../src/ld-window-main.c:146
msgid "_Save"
msgstr "_Uložiť"
#: ../src/ld-window-main.c:149
#: ../src/ld-window-main.c:162
msgid "_Undo"
msgstr "_Späť"
#: ../src/ld-window-main.c:167
#: ../src/ld-window-main.c:192
msgid "_User Guide"
msgstr "_Príručka používateľa"
#: ../src/ld-window-main.c:180
msgid "_View"
msgstr "_Zobrazenie"
#: ../src/ld-window-main.c:168
#: ../src/ld-window-main.c:181
msgid "_Zoom In"
msgstr "_Priblížiť"
#: ../src/ld-window-main.c:983
#: ../src/ld-window-main.c:1163
msgid "translator-credits"
msgstr "Miroslav Rigler <itsgoingd@luzer.sk>"

View File

@ -23,6 +23,7 @@ local render = function (cr)
cr:curve_to (3, 0, 2, 2, 0, 2)
cr:line_to (-2, 2)
cr:curve_to (-1, 1, -1, -1, -2, -2)
cr:close_path ()
cr:stroke ()
-- The terminals

View File

@ -21,8 +21,7 @@ local render = function (cr)
cr:line_to (-1, 0)
-- The terminals
cr:move_to (-2, 0)
cr:line_to (-1, 0)
cr:line_to (-2, 0)
cr:move_to (1, 0)
cr:line_to (2, 0)

View File

@ -48,7 +48,7 @@ local render = function (cr)
cr:move_to (-1, -1)
cr:line_to (1, 0)
cr:line_to (-1, 1)
cr:line_to (-1, -1)
cr:close_path ()
-- The vertical line
cr:move_to (1, 1)

View File

@ -42,7 +42,7 @@ local render = function (cr)
cr:line_to (1.5, -0.5)
cr:line_to (1.5, 0.5)
cr:line_to (-1.5, 0.5)
cr:line_to (-1.5, -0.5)
cr:close_path ()
-- The terminals
cr:move_to (-2, 0)

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/logdiag">
<file>logdiag.ui</file>
<file alias="LICENSE">../LICENSE</file>
</gresource>
</gresources>

View File

@ -1,5 +1,5 @@
<schemalist>
<schema id="org.logdiag" path="/org/logdiag/" gettext-domain="logdiag">
<schema id="name.janouch.logdiag" path="/name/janouch/logdiag/" gettext-domain="logdiag">
<key name="show-main-toolbar" type="b">
<default>true</default>
<summary>Whether to show the main toolbar</summary>
@ -14,4 +14,3 @@
</key>
</schema>
</schemalist>

11
share/logdiag.manifest Normal file
View 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>

View File

@ -1 +1,3 @@
#include <windows.h>
LD_ICON ICON "logdiag.ico"
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "logdiag.manifest"

View File

@ -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,8 @@
<menuitem action="ZoomOut" />
<menuitem action="NormalSize" />
</menu>
<menu name="HelpMenu" action="HelpMenu">
<menu action="HelpMenu">
<menuitem action="UserGuide" />
<menuitem action="About" />
</menu>
</menubar>

View File

@ -13,6 +13,11 @@
#include "ld-window-main.h"
#ifdef G_OS_WIN32
#include <gdk/gdkwin32.h>
#include <shellapi.h>
#endif
struct _LdWindowMainPrivate
{
@ -51,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);
@ -99,8 +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);
@ -136,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)},
@ -176,9 +189,12 @@ static GtkActionEntry wm_action_entries[] =
G_CALLBACK (on_action_normal_size)},
{"HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL},
{"UserGuide", GTK_STOCK_HELP, N_("_User Guide"), NULL,
N_("Open the manual"),
G_CALLBACK (on_action_user_guide)},
{"About", GTK_STOCK_ABOUT, N_("_About"), NULL,
N_("Show a dialog about this application"),
G_CALLBACK (on_action_about)}
G_CALLBACK (on_action_about)},
};
static GtkToggleActionEntry wm_toggle_action_entries[] =
@ -189,7 +205,7 @@ static GtkToggleActionEntry wm_toggle_action_entries[] =
{"LibraryPane", NULL, N_("_Library Pane"), NULL,
N_("Toggle displaying of the library pane"),
G_CALLBACK (on_action_library_pane), TRUE},
{"ShowGrid", NULL, N_("Show _Grid"), NULL,
{"ShowGrid", NULL, N_("Show _Grid"), "numbersign",
N_("Toggle displaying of the grid"),
G_CALLBACK (on_action_grid), TRUE}
};
@ -215,7 +231,7 @@ ld_window_main_new (const gchar *filename)
return self;
}
G_DEFINE_TYPE (LdWindowMain, ld_window_main, GTK_TYPE_WINDOW);
G_DEFINE_TYPE (LdWindowMain, ld_window_main, GTK_TYPE_WINDOW)
static void
ld_window_main_class_init (LdWindowMainClass *klass)
@ -258,8 +274,8 @@ ld_window_main_init (LdWindowMain *self)
priv->action_group, 0);
error = NULL;
gtk_ui_manager_add_ui_from_file
(priv->ui_manager, PROJECT_SHARE_DIR "gui/window-main.ui", &error);
gtk_ui_manager_add_ui_from_resource
(priv->ui_manager, "/logdiag/logdiag.ui", &error);
if (error)
{
g_message ("building UI failed: %s", error->message);
@ -373,7 +389,7 @@ ld_window_main_init (LdWindowMain *self)
gtk_widget_show_all (GTK_WIDGET (self));
/* Set up GSettings. */
priv->settings = g_settings_new ("org." PROJECT_NAME);
priv->settings = g_settings_new (PROJECT_ID);
g_settings_bind (priv->settings, "show-main-toolbar",
gtk_action_group_get_action (priv->action_group,
@ -435,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:
*
@ -587,8 +618,8 @@ diagram_get_name (LdWindowMain *self)
if (self->priv->filename)
return g_filename_display_basename (self->priv->filename);
else
return g_strdup (_("Unsaved Diagram"));
return g_strdup (_("Unsaved Diagram"));
}
/*
@ -667,12 +698,10 @@ diagram_save (LdWindowMain *self, GtkWindow *dialog_parent,
gtk_widget_destroy (message_dialog);
return FALSE;
}
else
{
ld_diagram_set_modified (self->priv->diagram, FALSE);
update_title (self);
return TRUE;
}
ld_diagram_set_modified (self->priv->diagram, FALSE);
update_title (self);
return TRUE;
}
/*
@ -683,9 +712,10 @@ diagram_save (LdWindowMain *self, GtkWindow *dialog_parent,
static gboolean
diagram_open (LdWindowMain *self, const gchar *filename)
{
GError *error;
GError *error = NULL;
GFile *file;
gchar *uri;
error = NULL;
ld_diagram_load_from_file (self->priv->diagram, filename, &error);
if (error)
{
@ -719,8 +749,17 @@ diagram_open (LdWindowMain *self, const gchar *filename)
return FALSE;
}
file = g_file_new_for_path (filename);
uri = g_file_get_uri (file);
g_object_unref (file);
gtk_recent_manager_add_item (gtk_recent_manager_get_default (), uri);
g_free (uri);
ld_diagram_set_modified (self->priv->diagram, FALSE);
diagram_set_filename (self, g_strdup (filename));
ld_diagram_view_set_x (self->priv->view, 0);
ld_diagram_view_set_y (self->priv->view, 0);
return TRUE;
}
@ -966,6 +1005,89 @@ 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, width_fit, height_fit;
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, taking care to not divide by zero. */
width_fit = (area_width_mm < diagram_width_mm)
? area_width_mm / diagram_width_mm : 1;
height_fit = (area_height_mm < diagram_height_mm)
? area_height_mm / diagram_height_mm : 1;
scale *= MIN (width_fit, height_fit);
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)
{
@ -973,17 +1095,123 @@ on_action_quit (GtkAction *action, LdWindowMain *self)
gtk_widget_destroy (GTK_WIDGET (self));
}
static GFile *
user_guide_path (const gchar *language)
{
gchar *filename, *path;
GFile *file;
filename = g_strdup_printf ("user-guide-%s.html", language);
path = g_build_filename (PROJECT_DOC_DIR, "user-guide", filename, NULL);
g_free (filename);
file = g_file_new_for_path (path);
g_free (path);
return file;
}
static gboolean
open_file (GFile *file, GdkScreen *screen, GError **error)
{
GdkDisplay *display;
GAppInfo *app_info;
GdkAppLaunchContext *context;
GList link;
gboolean success;
/* GLib 2.36.1 prevents us from using gtk_show_uri() on Windows XP. */
if (!(app_info = g_file_query_default_handler (file, NULL, error)))
return FALSE;
link.next = link.prev = NULL;
link.data = file;
display = gdk_screen_get_display (screen);
context = gdk_display_get_app_launch_context (display);
gdk_app_launch_context_set_screen (context, screen);
success = g_app_info_launch (app_info,
&link, G_APP_LAUNCH_CONTEXT (context), error);
g_object_unref (context);
return success;
}
static void
on_action_user_guide (GtkAction *action, LdWindowMain *self)
{
const gchar *const *iter;
GFile *file;
GError *error = NULL;
/* Look for a usable language variant, or fall back to the lingua franca. */
for (iter = g_get_language_names (); *iter; iter++)
{
if (g_file_query_exists ((file = user_guide_path (*iter)), NULL))
break;
g_object_unref (file);
}
if (!*iter)
file = user_guide_path ("en");
if (!open_file (file, gtk_window_get_screen (GTK_WINDOW (self)), &error))
{
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)
{
gtk_show_about_dialog (GTK_WINDOW (self),
GtkWidget *about_dialog;
GBytes *license;
license = g_resources_lookup_data ("/logdiag/LICENSE",
G_RESOURCE_LOOKUP_FLAGS_NONE, NULL);
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",
"license", g_bytes_get_data (license, NULL),
"website", PROJECT_URL,
NULL);
g_bytes_unref (license);
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)
{
#ifdef G_OS_WIN32
GdkWindow *window;
window = gtk_widget_get_window (GTK_WIDGET (self));
/* gtk_show_uri() on Windows XP fails, due to trying to establish
* an SSL connection, so let's first try to not do that on Windows.
* `cmd.exe /c start "" ...` would pop up a command line window,
* so use SHELL32.DLL directly. rundll does not cover this.
* There doesn't seem to be anything better directly in GIO/GLib.
*
* When we fail here, we fall back to normal processing.
*/
if ((INT_PTR) ShellExecute (gdk_win32_window_get_handle (window),
"open", uri, NULL, NULL, SW_SHOWNORMAL) > 32)
return TRUE;
#endif /* G_OS_WIN32 */
return FALSE;
}
static void

View File

@ -15,16 +15,16 @@ G_BEGIN_DECLS
#define LD_TYPE_WINDOW_MAIN (ld_window_main_get_type ())
#define LD_WINDOW_MAIN(obj) (G_TYPE_CHECK_INSTANCE_CAST \
((obj), LD_TYPE_WINDOW_MAIN, LdWindowMain))
#define LD_WINDOW_MAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
((klass), LD_TYPE_WINDOW_MAIN, LdWindowMainClass))
#define LD_IS_WINDOW_MAIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
((obj), LD_TYPE_WINDOW_MAIN))
#define LD_IS_WINDOW_MAIN_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
((klass), LD_TYPE_WINDOW_MAIN))
#define LD_WINDOW_MAIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
((obj), LD_WINDOW_MAIN, LdWindowMainClass))
#define LD_WINDOW_MAIN(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LD_TYPE_WINDOW_MAIN, LdWindowMain))
#define LD_WINDOW_MAIN_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), LD_TYPE_WINDOW_MAIN, LdWindowMainClass))
#define LD_IS_WINDOW_MAIN(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LD_TYPE_WINDOW_MAIN))
#define LD_IS_WINDOW_MAIN_CLASS(klass) \
(G_TYPE_CHECK_INSTANCE_TYPE ((klass), LD_TYPE_WINDOW_MAIN))
#define LD_WINDOW_MAIN_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), LD_WINDOW_MAIN, LdWindowMainClass))
typedef struct _LdWindowMain LdWindowMain;
typedef struct _LdWindowMainPrivate LdWindowMainPrivate;
@ -53,4 +53,3 @@ GtkWidget *ld_window_main_new (const gchar *filename);
G_END_DECLS
#endif /* ! __LD_WINDOW_MAIN_H__ */

View File

@ -127,16 +127,16 @@ main (int argc, char *argv[])
textdomain (GETTEXT_DOMAIN);
#ifdef PROJECT_GSETTINGS_DIR
/* This is enabled when the build is set up for developing, so that the
* application can find its schema. It might also find use when
* installing the application into a location that's missing from
/* This is enabled when the build is set up for development,
* so that the application can find its schema. It might also find use
* when installing the application into a location that's missing from
* g_get_system_data_dirs(), for example /usr/local or ~/.local.
*/
g_setenv ("GSETTINGS_SCHEMA_DIR", PROJECT_GSETTINGS_DIR, 0);
#endif /* PROJECT_GSETTINGS_DIR */
#ifdef _WIN32
/* Don't be unneccessarily limited by the system ANSI codepage. */
/* Don't be unneccessarily limited by the system's ANSI codepage. */
/* g_win32_get_command_line() should replace this code for GLib >= 2.40. */
argv_overriden = get_utf8_args (&argc, &argv);
if (argv_overriden)
@ -161,6 +161,11 @@ main (int argc, char *argv[])
}
#endif
#ifdef OPTION_NOINSTALL
gtk_icon_theme_prepend_search_path (gtk_icon_theme_get_default (),
PROJECT_SHARE_DIR "icons");
#endif
gtk_window_set_default_icon_name (PROJECT_NAME);
if (files)
@ -175,4 +180,3 @@ main (int argc, char *argv[])
gtk_main ();
return 0;
}

1
vera++

@ -1 +0,0 @@
Subproject commit 45f3ab870d3722891642098bd7fc0d6fc97c8571