Compare commits
	
		
			147 Commits
		
	
	
		
			v0.1.2
			...
			3a087ad581
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						3a087ad581
	
				 | 
					
					
						|||
| 
						
						
							
						
						4305c603e9
	
				 | 
					
					
						|||
| 
						
						
							
						
						cbe23b7bb6
	
				 | 
					
					
						|||
| 
						
						
							
						
						2d103ed454
	
				 | 
					
					
						|||
| 
						
						
							
						
						885ccb46a3
	
				 | 
					
					
						|||
| 
						
						
							
						
						47fb9653b8
	
				 | 
					
					
						|||
| 
						
						
							
						
						42b6da1ffe
	
				 | 
					
					
						|||
| 
						
						
							
						
						98f16c2c76
	
				 | 
					
					
						|||
| 
						
						
							
						
						03c6ae0750
	
				 | 
					
					
						|||
| 
						
						
							
						
						95f53863ec
	
				 | 
					
					
						|||
| 
						
						
							
						
						8ac267c8db
	
				 | 
					
					
						|||
| 
						
						
							
						
						45dd1a4a86
	
				 | 
					
					
						|||
| 
						
						
							
						
						2c5fc3ebdd
	
				 | 
					
					
						|||
| 
						
						
							
						
						1ca42eb8e2
	
				 | 
					
					
						|||
| 
						
						
							
						
						8815d72db7
	
				 | 
					
					
						|||
| 
						
						
							
						
						3102bc0cb9
	
				 | 
					
					
						|||
| 
						
						
							
						
						7f357cb7c8
	
				 | 
					
					
						|||
| 
						
						
							
						
						b4db65d246
	
				 | 
					
					
						|||
| 
						
						
							
						
						af14119165
	
				 | 
					
					
						|||
| 
						
						
							
						
						cc47064379
	
				 | 
					
					
						|||
| 
						
						
							
						
						c0b2715c70
	
				 | 
					
					
						|||
| 
						
						
							
						
						1ef1add173
	
				 | 
					
					
						|||
| 
						
						
							
						
						41d68e6636
	
				 | 
					
					
						|||
| 
						
						
							
						
						12ac611a14
	
				 | 
					
					
						|||
| 
						
						
							
						
						033fe31b7b
	
				 | 
					
					
						|||
| 
						
						
							
						
						57e7252900
	
				 | 
					
					
						|||
| 
						
						
							
						
						45842016eb
	
				 | 
					
					
						|||
| 
						
						
							
						
						96fd6b6f24
	
				 | 
					
					
						|||
| 
						
						
							
						
						6c8a655bfc
	
				 | 
					
					
						|||
| 
						
						
							
						
						c2caf2b825
	
				 | 
					
					
						|||
| 
						
						
							
						
						f75c15fda5
	
				 | 
					
					
						|||
| 
						
						
							
						
						cc629fd160
	
				 | 
					
					
						|||
| 
						
						
							
						
						46821d2e49
	
				 | 
					
					
						|||
| 
						
						
							
						
						9aa9512190
	
				 | 
					
					
						|||
| 
						
						
							
						
						193b724709
	
				 | 
					
					
						|||
| 
						
						
							
						
						b5af31b048
	
				 | 
					
					
						|||
| 
						
						
							
						
						c09acf120c
	
				 | 
					
					
						|||
| 
						
						
							
						
						f9f1c830f8
	
				 | 
					
					
						|||
| 
						
						
							
						
						b353fc133e
	
				 | 
					
					
						|||
| 
						
						
							
						
						0c0b9640f8
	
				 | 
					
					
						|||
| 
						
						
							
						
						948a332d01
	
				 | 
					
					
						|||
| 
						
						
							
						
						ced3913e68
	
				 | 
					
					
						|||
| 
						
						
							
						
						97f551d918
	
				 | 
					
					
						|||
| 2a4572294b | |||
| 64f5a7abbc | |||
| b552b3cae9 | |||
| 7a3ceb5435 | |||
| 24731d6831 | |||
| e74d582eca | |||
| 4e0e09a62b | |||
| c117a6ddaa | |||
| d55422e0a5 | |||
| 9e54e5a49c | |||
| f2ae2fbd35 | |||
| af51c00c93 | |||
| de133622a2 | |||
| 61f7536e22 | |||
| b62b7bfa18 | |||
| 260a15fdda | |||
| 4fc23df6bd | |||
| 4d0721bf68 | |||
| 5bb6a05e1c | |||
| 733fb54580 | |||
| ec29804080 | |||
| cd3599bd1b | |||
| 1adeac6c22 | |||
| 13f212d4e9 | |||
| a7f869b707 | |||
| fb6f89fb5c | |||
| e1225accf4 | |||
| 5b16953a2f | |||
| adead30747 | |||
| 616650c558 | |||
| 5c17944454 | |||
| c41f3ae529 | |||
| 7617e6a002 | |||
| c95519830d | |||
| 6e6cf05093 | |||
| 36ffb0f8cf | |||
| 64a97f54bf | |||
| 4f8b17e67a | |||
| 48d353a5cb | |||
| 313a47843f | |||
| f0ac99072e | |||
| c535bd2383 | |||
| fa602c20ec | |||
| 0066917014 | |||
| f21395779a | |||
| 366cfa3473 | |||
| da3e53215b | |||
| 295c18ae47 | |||
| b19326a1e0 | |||
| 733dfef8e0 | |||
| 16d45a485f | |||
| 492daa3ce3 | |||
| 24b4e9956b | |||
| 66aca31467 | |||
| 3b85eeec8d | |||
| c12c6fbf56 | |||
| 09d6bda3db | |||
| 15d8c257d1 | |||
| ec4f78c008 | |||
| 819917536e | |||
| 8acfeae8c8 | |||
| 47023938ca | |||
| 3290aa877d | |||
| 77aad430ef | |||
| 2156a92a09 | |||
| 9569d96cd6 | |||
| 6a633c8321 | |||
| 0e952b084c | |||
| ef64c0427f | |||
| a915bf4496 | |||
| 00a50737f3 | |||
| a18b6d6f35 | |||
| 6a24ede141 | |||
| 6c925b7092 | |||
| 4196a10ece | |||
| cf5260990c | |||
| 20c2595f2d | |||
| 89ec69b067 | |||
| d9ce2716ed | |||
| a1b79a55d2 | |||
| 9366c42026 | |||
| bb224bafd0 | |||
| f55afb6542 | |||
| b0ecd81212 | |||
| 94f27cb38c | |||
| b3ccabe627 | |||
| d9a310a691 | |||
| 745bbf0ce5 | |||
| 72b562760e | |||
| 2e1adc3d56 | |||
| ae8d44a75b | |||
| 50b0d3c395 | |||
| 4e440eb35b | |||
| b2223d6595 | |||
| e1e9a6d319 | |||
| 2509f0af52 | |||
| 5d1c8bbf75 | |||
| a2b898b610 | |||
| c36ca83406 | |||
| d8fd4430fc | |||
| 82bf779405 | |||
| cd66c3d84a | |||
| 8001619bf1 | |||
| 423afa8eec | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,3 +1,4 @@
 | 
			
		||||
/build
 | 
			
		||||
/win32-depends
 | 
			
		||||
/liblogdiag/ld-marshal.[ch]
 | 
			
		||||
/CMakeLists.txt.user
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
[submodule "vera++"]
 | 
			
		||||
	path = vera++
 | 
			
		||||
	url = https://bitbucket.org/verateam/vera.git
 | 
			
		||||
							
								
								
									
										324
									
								
								CMakeLists.txt
									
									
									
									
									
								
							
							
						
						@@ -1,56 +1,37 @@
 | 
			
		||||
project (logdiag C)
 | 
			
		||||
cmake_minimum_required (VERSION 2.6.2)
 | 
			
		||||
 | 
			
		||||
# Default to 2.6.3 behaviour
 | 
			
		||||
cmake_policy (VERSION 2.6.3)
 | 
			
		||||
# The last version with Windows XP support is 3.13, we want to keep that
 | 
			
		||||
cmake_minimum_required (VERSION 3.10)
 | 
			
		||||
project (logdiag VERSION 0.2.1 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)
 | 
			
		||||
 | 
			
		||||
if (OPTION_NOINSTALL)
 | 
			
		||||
	set (OPTION_NOINSTALL 1)
 | 
			
		||||
else (OPTION_NOINSTALL)
 | 
			
		||||
	set (OPTION_NOINSTALL 0)
 | 
			
		||||
endif (OPTION_NOINSTALL)
 | 
			
		||||
option (BUILD_TESTING "Build tests" OFF)
 | 
			
		||||
 | 
			
		||||
# Project information
 | 
			
		||||
set (project_VERSION_MAJOR "0")
 | 
			
		||||
set (project_VERSION_MINOR "1")
 | 
			
		||||
set (project_VERSION_PATCH "2")
 | 
			
		||||
 | 
			
		||||
set (project_VERSION "${project_VERSION_MAJOR}")
 | 
			
		||||
set (project_VERSION "${project_VERSION}.${project_VERSION_MINOR}")
 | 
			
		||||
set (project_VERSION "${project_VERSION}.${project_VERSION_PATCH}")
 | 
			
		||||
 | 
			
		||||
set (project_URL "http://github.com/pjanouch/logdiag")
 | 
			
		||||
set (project_URL "https://git.janouch.name/p/logdiag")
 | 
			
		||||
 | 
			
		||||
# For custom modules
 | 
			
		||||
set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
 | 
			
		||||
 | 
			
		||||
# Test this machine
 | 
			
		||||
include (CheckCSourceCompiles)
 | 
			
		||||
 | 
			
		||||
CHECK_C_SOURCE_COMPILES (
 | 
			
		||||
"typedef struct abc *d;
 | 
			
		||||
int test (d __restrict x);
 | 
			
		||||
int main (void) {return 0;}"
 | 
			
		||||
HAVE_SANE___RESTRICT)
 | 
			
		||||
 | 
			
		||||
CHECK_C_SOURCE_COMPILES (
 | 
			
		||||
"int test (void *restrict x);
 | 
			
		||||
int main (void) {return 0;}"
 | 
			
		||||
HAVE_RESTRICT)
 | 
			
		||||
set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
 | 
			
		||||
 | 
			
		||||
# Automatic retrieval of dependencies
 | 
			
		||||
if (WIN32)
 | 
			
		||||
	set (WIN32_DEPENDS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/win32-depends)
 | 
			
		||||
	set (WIN32_DEPENDS_PATH ${PROJECT_SOURCE_DIR}/win32-depends)
 | 
			
		||||
	list (APPEND CMAKE_PREFIX_PATH ${WIN32_DEPENDS_PATH})
 | 
			
		||||
	list (APPEND CMAKE_INCLUDE_PATH ${WIN32_DEPENDS_PATH}/lib)
 | 
			
		||||
	list (APPEND CMAKE_C_FLAGS "-mms-bitfields")
 | 
			
		||||
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mms-bitfields")
 | 
			
		||||
 | 
			
		||||
	if (CMAKE_CROSSCOMPILING)
 | 
			
		||||
		list (APPEND CMAKE_FIND_ROOT_PATH ${WIN32_DEPENDS_PATH})
 | 
			
		||||
	endif (CMAKE_CROSSCOMPILING)
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
		${CMAKE_CURRENT_SOURCE_DIR}/Win32Depends.cmake
 | 
			
		||||
		WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 | 
			
		||||
		${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)
 | 
			
		||||
@@ -60,7 +41,7 @@ find_program (CONVERT_EXECUTABLE convert)
 | 
			
		||||
mark_as_advanced (CONVERT_EXECUTABLE)
 | 
			
		||||
 | 
			
		||||
if (CONVERT_EXECUTABLE AND NOT WIN32)
 | 
			
		||||
	set (icon_base ${CMAKE_CURRENT_SOURCE_DIR}/share/icons/hicolor)
 | 
			
		||||
	set (icon_base ${PROJECT_SOURCE_DIR}/share/icons/hicolor)
 | 
			
		||||
	set (icon_svg ${icon_base}/scalable/apps/logdiag.svg)
 | 
			
		||||
	set (icon_size_list 16x16 32x32 48x48)
 | 
			
		||||
 | 
			
		||||
@@ -70,7 +51,7 @@ if (CONVERT_EXECUTABLE AND NOT WIN32)
 | 
			
		||||
		set (icon_png_path ${icon_base}/${icon_size}/apps)
 | 
			
		||||
		set (icon_png ${icon_png_path}/logdiag.png)
 | 
			
		||||
		list (APPEND icon_png_list ${icon_png})
 | 
			
		||||
		set (icon_symbolic logdiag_icons_${icon_size})
 | 
			
		||||
		set (icon_symbolic ${PROJECT_NAME}_icons_${icon_size})
 | 
			
		||||
		list (APPEND icon_symbolic_list ${icon_symbolic})
 | 
			
		||||
 | 
			
		||||
		add_custom_command (OUTPUT ${icon_symbolic}
 | 
			
		||||
@@ -82,22 +63,39 @@ if (CONVERT_EXECUTABLE AND NOT WIN32)
 | 
			
		||||
			PROPERTIES SYMBOLIC TRUE)
 | 
			
		||||
	endforeach (icon_size)
 | 
			
		||||
 | 
			
		||||
	set (icon_ico ${CMAKE_CURRENT_SOURCE_DIR}/share/logdiag.ico)
 | 
			
		||||
	add_custom_target (logdiag_icons DEPENDS ${icon_symbolic_list}
 | 
			
		||||
	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)
 | 
			
		||||
 | 
			
		||||
# Dependencies
 | 
			
		||||
find_package (GTK2 2.12 REQUIRED gtk)
 | 
			
		||||
find_package (Lua51 REQUIRED)
 | 
			
		||||
find_package (JsonGlib REQUIRED)
 | 
			
		||||
find_package (PkgConfig REQUIRED)
 | 
			
		||||
pkg_check_modules (GTK3 REQUIRED gtk+-3.0 json-glib-1.0)
 | 
			
		||||
 | 
			
		||||
if (NOT WIN32)
 | 
			
		||||
	pkg_search_module (Lua REQUIRED lua>=5.2 lua5.3 lua-5.3 lua5.2 lua-5.2)
 | 
			
		||||
else (NOT WIN32)
 | 
			
		||||
	# 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")
 | 
			
		||||
	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})
 | 
			
		||||
 | 
			
		||||
# Localization
 | 
			
		||||
find_package (Gettext REQUIRED)
 | 
			
		||||
file (GLOB project_PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po)
 | 
			
		||||
file (GLOB project_PO_FILES ${PROJECT_SOURCE_DIR}/po/*.po)
 | 
			
		||||
GETTEXT_CREATE_TRANSLATIONS (
 | 
			
		||||
	${CMAKE_CURRENT_SOURCE_DIR}/po/${CMAKE_PROJECT_NAME}.pot
 | 
			
		||||
	${PROJECT_SOURCE_DIR}/po/${PROJECT_NAME}.pot
 | 
			
		||||
	ALL ${project_PO_FILES})
 | 
			
		||||
 | 
			
		||||
foreach (file ${project_PO_FILES})
 | 
			
		||||
@@ -105,10 +103,9 @@ foreach (file ${project_PO_FILES})
 | 
			
		||||
	list (APPEND project_TRANSLATIONS "${translation}")
 | 
			
		||||
endforeach (file)
 | 
			
		||||
 | 
			
		||||
# Documentation
 | 
			
		||||
# TODO: Add pregenerated docs to the tree
 | 
			
		||||
find_package (GtkDoc)
 | 
			
		||||
set (project_DOC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/docs/reference")
 | 
			
		||||
# Documentation--gtk-doc 1.25 is required
 | 
			
		||||
find_package (GtkDoc 1.25)
 | 
			
		||||
set (project_DOC_DIR "${PROJECT_BINARY_DIR}/liblogdiag")
 | 
			
		||||
 | 
			
		||||
# Project source files
 | 
			
		||||
set (liblogdiag_SOURCES
 | 
			
		||||
@@ -121,13 +118,15 @@ set (liblogdiag_SOURCES
 | 
			
		||||
	liblogdiag/ld-diagram-connection.c
 | 
			
		||||
	liblogdiag/ld-diagram-view.c
 | 
			
		||||
	liblogdiag/ld-library.c
 | 
			
		||||
	liblogdiag/ld-library-toolbar.c
 | 
			
		||||
	liblogdiag/ld-symbol-category.c
 | 
			
		||||
	liblogdiag/ld-category-view.c
 | 
			
		||||
	liblogdiag/ld-category-tree-view.c
 | 
			
		||||
	liblogdiag/ld-category-symbol-view.c
 | 
			
		||||
	liblogdiag/ld-category.c
 | 
			
		||||
	liblogdiag/ld-symbol.c
 | 
			
		||||
	liblogdiag/ld-lua.c
 | 
			
		||||
	liblogdiag/ld-lua-symbol.c)
 | 
			
		||||
set (liblogdiag_HEADERS
 | 
			
		||||
	${CMAKE_CURRENT_BINARY_DIR}/config.h
 | 
			
		||||
	${PROJECT_BINARY_DIR}/config.h
 | 
			
		||||
	liblogdiag/liblogdiag.h
 | 
			
		||||
	liblogdiag/ld-marshal.h
 | 
			
		||||
	liblogdiag/ld-types.h
 | 
			
		||||
@@ -138,8 +137,10 @@ set (liblogdiag_HEADERS
 | 
			
		||||
	liblogdiag/ld-diagram-connection.h
 | 
			
		||||
	liblogdiag/ld-diagram-view.h
 | 
			
		||||
	liblogdiag/ld-library.h
 | 
			
		||||
	liblogdiag/ld-library-toolbar.h
 | 
			
		||||
	liblogdiag/ld-symbol-category.h
 | 
			
		||||
	liblogdiag/ld-category-view.h
 | 
			
		||||
	liblogdiag/ld-category-tree-view.h
 | 
			
		||||
	liblogdiag/ld-category-symbol-view.h
 | 
			
		||||
	liblogdiag/ld-category.h
 | 
			
		||||
	liblogdiag/ld-symbol.h
 | 
			
		||||
	liblogdiag/ld-lua.h
 | 
			
		||||
	liblogdiag/ld-lua-private.h
 | 
			
		||||
@@ -173,9 +174,9 @@ if (WIN32)
 | 
			
		||||
endif (WIN32)
 | 
			
		||||
 | 
			
		||||
# Generate a configure file
 | 
			
		||||
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
 | 
			
		||||
	${CMAKE_CURRENT_BINARY_DIR}/config.h)
 | 
			
		||||
include_directories (${CMAKE_CURRENT_BINARY_DIR})
 | 
			
		||||
configure_file (${PROJECT_SOURCE_DIR}/config.h.in
 | 
			
		||||
	${PROJECT_BINARY_DIR}/config.h)
 | 
			
		||||
include_directories (${PROJECT_BINARY_DIR})
 | 
			
		||||
 | 
			
		||||
# Generate marshallers
 | 
			
		||||
find_program (GLIB_GENMARSHAL_EXECUTABLE glib-genmarshal)
 | 
			
		||||
@@ -211,14 +212,12 @@ function (glib_genmarshal base prefix)
 | 
			
		||||
		COMMENT "Generating marshallers header file")
 | 
			
		||||
endfunction (glib_genmarshal)
 | 
			
		||||
 | 
			
		||||
glib_genmarshal (${CMAKE_CURRENT_SOURCE_DIR}/liblogdiag/ld-marshal
 | 
			
		||||
glib_genmarshal (${PROJECT_SOURCE_DIR}/liblogdiag/ld-marshal
 | 
			
		||||
	ld_marshal)
 | 
			
		||||
 | 
			
		||||
include_directories (${CMAKE_CURRENT_SOURCE_DIR})
 | 
			
		||||
include_directories (${GTK2_INCLUDE_DIRS}
 | 
			
		||||
	${JSON_GLIB_INCLUDE_DIRS} ${LUA_INCLUDE_DIR})
 | 
			
		||||
set (logdiag_LIBS ${GTK2_LIBRARIES}
 | 
			
		||||
	${JSON_GLIB_LIBRARIES} ${LUA_LIBRARIES})
 | 
			
		||||
include_directories (${PROJECT_SOURCE_DIR})
 | 
			
		||||
include_directories (${GTK3_INCLUDE_DIRS} ${Lua_INCLUDE_DIRS})
 | 
			
		||||
set (logdiag_LIBS ${GTK3_LIBRARIES} ${Lua_LIBRARIES} m)
 | 
			
		||||
 | 
			
		||||
if (WIN32)
 | 
			
		||||
	find_package (LibIntl REQUIRED)
 | 
			
		||||
@@ -234,50 +233,126 @@ add_executable (logdiag WIN32 ${logdiag_SOURCES} ${logdiag_HEADERS})
 | 
			
		||||
target_link_libraries (logdiag liblogdiag ${logdiag_LIBS})
 | 
			
		||||
 | 
			
		||||
# Testing
 | 
			
		||||
option (BUILD_TESTING "Build tests" OFF)
 | 
			
		||||
 | 
			
		||||
if (BUILD_TESTING)
 | 
			
		||||
	enable_testing ()
 | 
			
		||||
 | 
			
		||||
	foreach (name ${logdiag_TESTS})
 | 
			
		||||
		add_executable (test-${name} tests/${name}.c)
 | 
			
		||||
		target_link_libraries (test-${name} liblogdiag ${logdiag_LIBS})
 | 
			
		||||
 | 
			
		||||
		add_test (test-${name} test-${name})
 | 
			
		||||
		add_test (NAME test-${name} COMMAND test-${name})
 | 
			
		||||
		list (APPEND logdiag_TEST_TARGETS test-${name})
 | 
			
		||||
	endforeach (name)
 | 
			
		||||
	if (WIN32 AND NOT CMAKE_CROSSCOMPILING)
 | 
			
		||||
		set_tests_properties (${logdiag_TEST_TARGETS}
 | 
			
		||||
			PROPERTIES ENVIRONMENT "PATH=${WIN32_DEPENDS_PATH}/bin")
 | 
			
		||||
	endif ()
 | 
			
		||||
endif (BUILD_TESTING)
 | 
			
		||||
 | 
			
		||||
# Generate documentation
 | 
			
		||||
if (GTK_DOC_FOUND)
 | 
			
		||||
	GTK_DOC_RUN (WORKING_DIR ${project_DOC_DIR}
 | 
			
		||||
		SOURCE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/liblogdiag
 | 
			
		||||
		SCANGOBJ liblogdiag ${logdiag_LIBS}
 | 
			
		||||
		XML ${project_DOC_DIR}/xml --sgml-mode
 | 
			
		||||
		HTML ${project_DOC_DIR}/html)
 | 
			
		||||
endif (GTK_DOC_FOUND)
 | 
			
		||||
if (GTKDOC_FOUND)
 | 
			
		||||
	# FIXME: not our bug but xml/gtkdocentities.ent cannot be passed
 | 
			
		||||
	target_link_libraries (liblogdiag ${logdiag_LIBS})
 | 
			
		||||
	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
 | 
			
		||||
		LIBRARIES liblogdiag)
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
	# 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++")
 | 
			
		||||
 | 
			
		||||
	add_subdirectory ("vera++")
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
 | 
			
		||||
# Installation
 | 
			
		||||
install (DIRECTORY share/gui share/library
 | 
			
		||||
	DESTINATION share/${CMAKE_PROJECT_NAME})
 | 
			
		||||
 | 
			
		||||
if (WIN32)
 | 
			
		||||
	install (TARGETS logdiag DESTINATION .)
 | 
			
		||||
	install (DIRECTORY
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/bin/
 | 
			
		||||
		DESTINATION .
 | 
			
		||||
		FILES_MATCHING PATTERN "*.dll"
 | 
			
		||||
		PATTERN "libgettext*" EXCLUDE)
 | 
			
		||||
		FILES_MATCHING PATTERN "*.dll")
 | 
			
		||||
	install (DIRECTORY
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/etc/
 | 
			
		||||
		DESTINATION etc)
 | 
			
		||||
	install (DIRECTORY
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/lib/glib-2.0
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/lib/gtk-2.0
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/lib/gdk-pixbuf-2.0
 | 
			
		||||
		DESTINATION lib)
 | 
			
		||||
		DESTINATION lib
 | 
			
		||||
		FILES_MATCHING PATTERN "*" PATTERN "*.a" EXCLUDE)
 | 
			
		||||
	install (DIRECTORY
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/share/themes/MS-Windows
 | 
			
		||||
		DESTINATION share/themes)
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/share/glib-2.0/schemas
 | 
			
		||||
		DESTINATION share/glib-2.0
 | 
			
		||||
		FILES_MATCHING PATTERN "org.gtk.Settings.*")
 | 
			
		||||
 | 
			
		||||
	install (DIRECTORY
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/share/icons/Adwaita
 | 
			
		||||
		DESTINATION share/icons OPTIONAL)
 | 
			
		||||
	install (FILES
 | 
			
		||||
		${WIN32_DEPENDS_PATH}/share/icons/hicolor/index.theme
 | 
			
		||||
		DESTINATION share/icons/hicolor)
 | 
			
		||||
	install (DIRECTORY share/icons DESTINATION share)
 | 
			
		||||
 | 
			
		||||
	# Avoid partial translations
 | 
			
		||||
	file (GLOB locales ${WIN32_DEPENDS_PATH}/share/locale/*)
 | 
			
		||||
@@ -290,6 +365,8 @@ if (WIN32)
 | 
			
		||||
				DESTINATION share/locale)
 | 
			
		||||
		endif (translation_found GREATER -1)
 | 
			
		||||
	endforeach (locale)
 | 
			
		||||
 | 
			
		||||
	install (SCRIPT Win32Cleanup.cmake)
 | 
			
		||||
else (WIN32)
 | 
			
		||||
	install (TARGETS logdiag DESTINATION bin)
 | 
			
		||||
	install (FILES share/logdiag.desktop DESTINATION share/applications)
 | 
			
		||||
@@ -297,65 +374,78 @@ else (WIN32)
 | 
			
		||||
	install (DIRECTORY share/icons DESTINATION share)
 | 
			
		||||
# Don't install the documentation yet as we don't install any library
 | 
			
		||||
#	install (DIRECTORY "${project_DOC_DIR}/html/"
 | 
			
		||||
#		DESTINATION share/gtk-doc/html/${CMAKE_PROJECT_NAME})
 | 
			
		||||
	install (FILES LICENSE NEWS DESTINATION share/doc/${CMAKE_PROJECT_NAME})
 | 
			
		||||
#		DESTINATION share/gtk-doc/html/${PROJECT_NAME})
 | 
			
		||||
	install (FILES LICENSE NEWS DESTINATION share/doc/${PROJECT_NAME})
 | 
			
		||||
endif (WIN32)
 | 
			
		||||
 | 
			
		||||
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 (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 ()")
 | 
			
		||||
 | 
			
		||||
# CPack
 | 
			
		||||
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Schematic editor")
 | 
			
		||||
set (CPACK_PACKAGE_VENDOR "Premysl Janouch")
 | 
			
		||||
set (CPACK_PACKAGE_CONTACT "p.janouch@gmail.com")
 | 
			
		||||
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
 | 
			
		||||
set (CPACK_PACKAGE_VERSION_MAJOR ${project_VERSION_MAJOR})
 | 
			
		||||
set (CPACK_PACKAGE_VERSION_MINOR ${project_VERSION_MINOR})
 | 
			
		||||
set (CPACK_PACKAGE_VERSION_PATCH ${project_VERSION_PATCH})
 | 
			
		||||
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")
 | 
			
		||||
set (CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
 | 
			
		||||
 | 
			
		||||
if (WIN32)
 | 
			
		||||
	set (CPACK_GENERATOR "NSIS;ZIP")
 | 
			
		||||
else (WIN32)
 | 
			
		||||
	set (CPACK_GENERATOR "TGZ;ZIP")
 | 
			
		||||
	set (CPACK_SET_DESTDIR TRUE)
 | 
			
		||||
endif (WIN32)
 | 
			
		||||
 | 
			
		||||
set (CPACK_PACKAGE_FILE_NAME
 | 
			
		||||
	"${CMAKE_PROJECT_NAME}-${project_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
 | 
			
		||||
set (CPACK_PACKAGE_INSTALL_DIRECTORY
 | 
			
		||||
	"${CMAKE_PROJECT_NAME} ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
 | 
			
		||||
	"${PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
 | 
			
		||||
set (CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME} ${CPACK_PACKAGE_VERSION}")
 | 
			
		||||
 | 
			
		||||
# FIXME: It is possible to install multiple copies. Everything screws up then.
 | 
			
		||||
set (CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/share\\\\header.bmp")
 | 
			
		||||
# XXX: It is still possible to install multiple copies, making commands collide.
 | 
			
		||||
set (CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
 | 
			
		||||
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_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 [[
 | 
			
		||||
	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)'")
 | 
			
		||||
	System::Call 'shell32::SHChangeNotify(i,i,i,i) (0x08000000, 0x1000, 0, 0)'
 | 
			
		||||
]])
 | 
			
		||||
 | 
			
		||||
string (REPLACE "http://" "http:\\\\\\\\" project_URL_NSIS "${project_URL}")
 | 
			
		||||
string (REPLACE "https://" "https:\\\\\\\\" project_URL_NSIS "${project_URL}")
 | 
			
		||||
set (CPACK_NSIS_URL_INFO_ABOUT "${project_URL_NSIS}")
 | 
			
		||||
 | 
			
		||||
set (CPACK_DEBIAN_PACKAGE_DEPENDS
 | 
			
		||||
	"libgtk2.0-0 (>= 2.12), libjson-glib-1.0-0 (>= 0.10.4), liblua5.1-0, librsvg2-common")
 | 
			
		||||
	"libgtk3.0-0 (>= 3.8), libjson-glib-1.0-0 (>= 0.10.4), liblua5.2-0")
 | 
			
		||||
set (CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS
 | 
			
		||||
	"libgtk2.0-dev (>= 2.12), libjson-glib-dev (>= 0.10.4), liblua5.1-0-dev")
 | 
			
		||||
	"libgtk3.0-dev (>= 3.8), libjson-glib-dev (>= 0.10.4), liblua5.2-0-dev")
 | 
			
		||||
set (CPACK_DEBIAN_PACKAGE_SECTION "Electronics")
 | 
			
		||||
set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${project_URL}")
 | 
			
		||||
 | 
			
		||||
set (CPACK_RPM_PACKAGE_REQUIRES "gtk2 >= 2.12, json-glib >= 0.10.4, lua = 5.1, librsvg2")
 | 
			
		||||
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 "BSD")
 | 
			
		||||
set (CPACK_RPM_PACKAGE_LICENSE "ISC")
 | 
			
		||||
set (CPACK_RPM_PACKAGE_URL "${project_URL}")
 | 
			
		||||
 | 
			
		||||
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
 | 
			
		||||
set (CPACK_SOURCE_IGNORE_FILES "/.git;/build;/win32-depends;/liblogdiag/ld-marshal.[ch]")
 | 
			
		||||
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${project_VERSION}")
 | 
			
		||||
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user;/win32-depends;/liblogdiag/ld-marshal.[ch]")
 | 
			
		||||
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
 | 
			
		||||
 | 
			
		||||
include (CPack)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						@@ -1,26 +1,12 @@
 | 
			
		||||
Copyright Premysl Janouch 2010 - 2011
 | 
			
		||||
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.
 | 
			
		||||
    * The names of the copyright holders and contributors may not be used
 | 
			
		||||
      to endorse or promote products derived from this software without
 | 
			
		||||
      specific prior written permission.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2010 - 2021, Přemysl Eric Janouch <p@janouch.name>
 | 
			
		||||
 | 
			
		||||
Permission to use, copy, modify, and/or distribute this software for any
 | 
			
		||||
purpose with or without fee is hereby granted.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
			
		||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 | 
			
		||||
SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
			
		||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 | 
			
		||||
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 | 
			
		||||
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						@@ -1,3 +1,28 @@
 | 
			
		||||
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.
 | 
			
		||||
 - Worked around a mysterious recent GTK+ bug with symbol dragging.
 | 
			
		||||
 - Put a default filename in the save dialog, ensuring a file extension.
 | 
			
		||||
 | 
			
		||||
Version 0.2.0
 | 
			
		||||
 - Added a library pane instead of a toolbar.
 | 
			
		||||
 - Added scrolling using the middle mouse button.
 | 
			
		||||
 - View menu settings are remembered.
 | 
			
		||||
 - Fixed command line parsing on Windows;
 | 
			
		||||
   it's not limited to the system ANSI codepage anymore.
 | 
			
		||||
 - Fixed checking for the Shift key when selecting.
 | 
			
		||||
 - Terminals are ignored when hovering the cursor above a selection.
 | 
			
		||||
 - Disallowed wheel zooming when holding mouse buttons.
 | 
			
		||||
 - Fixed the behaviour of saving.
 | 
			
		||||
 - Fixed rapid right-clicking rotating more than it should.
 | 
			
		||||
 - 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.
 | 
			
		||||
 | 
			
		||||
Version 0.1.2
 | 
			
		||||
 - Updated symbol library.
 | 
			
		||||
 - Added Slovak, Polish and German translations.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										123
									
								
								README.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,123 @@
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Requirements
 | 
			
		||||
------------
 | 
			
		||||
Runtime dependencies: GTK+ >= 3.8, json-glib >= 0.10.4, lua >= 5.2 +
 | 
			
		||||
Build dependencies: CMake >= 3.10
 | 
			
		||||
 | 
			
		||||
Build from source on Unix-like systems
 | 
			
		||||
--------------------------------------
 | 
			
		||||
First check that you have all the required dependencies installed, including
 | 
			
		||||
development packages, if your distribution provides them.
 | 
			
		||||
 | 
			
		||||
Reserve a directory for an out-of-source build:
 | 
			
		||||
 | 
			
		||||
 $ mkdir build
 | 
			
		||||
 $ cd build
 | 
			
		||||
 | 
			
		||||
Let CMake prepare the build. You may change the directory where you want the
 | 
			
		||||
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_
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
 # make install
 | 
			
		||||
 | 
			
		||||
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._
 | 
			
		||||
 | 
			
		||||
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:
 | 
			
		||||
 | 
			
		||||
 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):
 | 
			
		||||
 | 
			
		||||
 > cmake -P Win32Depends.cmake
 | 
			
		||||
 | 
			
		||||
Note that Windows XP is no longer able to reliably download from HTTPS sources.
 | 
			
		||||
 | 
			
		||||
Reserve a directory for an out-of-source 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:
 | 
			
		||||
 | 
			
		||||
1. An NSIS-based installation package:
 | 
			
		||||
+
 | 
			
		||||
 > cpack -G NSIS
 | 
			
		||||
 | 
			
		||||
2. A portable ZIP package:
 | 
			
		||||
+
 | 
			
		||||
 > cpack -G ZIP
 | 
			
		||||
 | 
			
		||||
By default, that is if you specify no generator, both packages are built.
 | 
			
		||||
 | 
			
		||||
Cross-compilation for Windows
 | 
			
		||||
-----------------------------
 | 
			
		||||
The procedure is almost exactly the same as before, including the requirements.
 | 
			
		||||
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
 | 
			
		||||
 $ cpack
 | 
			
		||||
 | 
			
		||||
Alternatively, for an unnecessarily bloated MSYS2-based 64-bit build:
 | 
			
		||||
 | 
			
		||||
 $ sh Win64Depends.sh
 | 
			
		||||
 $ cmake -DCMAKE_TOOLCHAIN_FILE=ToolchainCrossWin64.cmake \
 | 
			
		||||
   -DCMAKE_BUILD_TYPE=Release -B build
 | 
			
		||||
 $ cmake --build build -- package
 | 
			
		||||
 | 
			
		||||
Contributing and Support
 | 
			
		||||
------------------------
 | 
			
		||||
Use https://git.janouch.name/p/logdiag to report any bugs, request features,
 | 
			
		||||
or submit pull requests.  `git send-email` is tolerated.  If you want to discuss
 | 
			
		||||
the project, feel free to join me at ircs://irc.janouch.name, channel #dev.
 | 
			
		||||
 | 
			
		||||
Bitcoin donations are accepted at: 12r5uEWEgcHC46xd64tt3hHt9EUvYYDHe9
 | 
			
		||||
 | 
			
		||||
License
 | 
			
		||||
-------
 | 
			
		||||
This software is released under the terms of the 0BSD license, the text of which
 | 
			
		||||
is included within the package along with the list of authors.
 | 
			
		||||
							
								
								
									
										71
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,71 +0,0 @@
 | 
			
		||||
# logdiag
 | 
			
		||||
 | 
			
		||||
logdiag is a schematic editor written in GTK+.
 | 
			
		||||
 | 
			
		||||
__This software is considered to be alpha quality and cannot be recommended  
 | 
			
		||||
for regular usage.__  
 | 
			
		||||
 | 
			
		||||
## Requirements
 | 
			
		||||
 | 
			
		||||
Runtime dependencies:  
 | 
			
		||||
 | 
			
		||||
 - GTK+ >= 2.12
 | 
			
		||||
 - json-glib >= 0.10.4
 | 
			
		||||
 - lua = 5.1
 | 
			
		||||
 - librsvg >= 2.0
 | 
			
		||||
 | 
			
		||||
Build dependencies:  
 | 
			
		||||
 | 
			
		||||
 - CMake >= 2.6
 | 
			
		||||
 | 
			
		||||
## Installation from sources on Unix-like systems
 | 
			
		||||
 | 
			
		||||
First check that you have all the required dependencies installed, including  
 | 
			
		||||
all development packages, if your distribution provides them.  
 | 
			
		||||
 | 
			
		||||
Reserve a directory for an out-of-source build:  
 | 
			
		||||
    $ mkdir build
 | 
			
		||||
    $ cd build
 | 
			
		||||
 | 
			
		||||
Let CMake prepare the build. You may change the directory where you want  
 | 
			
		||||
the 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:  
 | 
			
		||||
 | 
			
		||||
1. Using _make install_:  
 | 
			
		||||
       # make install
 | 
			
		||||
 | 
			
		||||
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-0.0-Linux-x86_64.deb
 | 
			
		||||
 | 
			
		||||
# Building from sources on Windows
 | 
			
		||||
 | 
			
		||||
First install CMake 2.8 and MinGW. Add both to the system path.  
 | 
			
		||||
If you want to build an installation package, also install NSIS.  
 | 
			
		||||
 | 
			
		||||
Run the following command in the directory with source files  
 | 
			
		||||
to automatically fetch and setup all dependencies:  
 | 
			
		||||
    > cmake -P Win32Depends.cmake
 | 
			
		||||
 | 
			
		||||
Reserve a directory for an out-of-source 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:  
 | 
			
		||||
 | 
			
		||||
1. An NSIS-based installation package:  
 | 
			
		||||
       > cpack -G NSIS
 | 
			
		||||
 | 
			
		||||
2. A portable ZIP package:  
 | 
			
		||||
       > cpack -G ZIP
 | 
			
		||||
 | 
			
		||||
By default, that is if you specify no generator, both packages are built.  
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								ToolchainCrossMinGW.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
			
		||||
set (CMAKE_SYSTEM_NAME "Windows")
 | 
			
		||||
set (CMAKE_SYSTEM_PROCESSOR "x86")
 | 
			
		||||
 | 
			
		||||
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")
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								ToolchainCrossMinGWW64.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
			
		||||
set (CMAKE_SYSTEM_NAME "Windows")
 | 
			
		||||
set (CMAKE_SYSTEM_PROCESSOR "x86")
 | 
			
		||||
 | 
			
		||||
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")
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								ToolchainCrossWin64.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
			
		||||
set (CMAKE_SYSTEM_NAME "Windows")
 | 
			
		||||
set (CMAKE_SYSTEM_PROCESSOR "x86_64")
 | 
			
		||||
 | 
			
		||||
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")
 | 
			
		||||
 | 
			
		||||
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
									
								
							
							
						
						@@ -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})
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
# Usage: cmake -P Win32Depends.cmake
 | 
			
		||||
 | 
			
		||||
# Only CMake 3.1+ supports XZ archives, not sure when 7z support comes from
 | 
			
		||||
cmake_minimum_required (VERSION 3.9)
 | 
			
		||||
 | 
			
		||||
# Directories
 | 
			
		||||
set (working_dir ${CMAKE_CURRENT_BINARY_DIR}/win32-depends)
 | 
			
		||||
set (pkg_dir ${working_dir}/packages)
 | 
			
		||||
set (bsdtar_dir ${working_dir}/bsdtar)
 | 
			
		||||
set (bsdtar_executable ${bsdtar_dir}/bsdtar)
 | 
			
		||||
set (tmp_dir ${working_dir}/tmp)
 | 
			
		||||
file (MAKE_DIRECTORY ${working_dir})
 | 
			
		||||
file (MAKE_DIRECTORY ${pkg_dir})
 | 
			
		||||
@@ -18,60 +19,36 @@ if (files)
 | 
			
		||||
endif (files)
 | 
			
		||||
 | 
			
		||||
# Packages
 | 
			
		||||
set (pkg_list "bsdtar" "gtk" "opensuse" "mingw_lua")
 | 
			
		||||
 | 
			
		||||
set (pkg_bsdtar_root "http://sourceforge.net/projects/mingw/files/MinGW")
 | 
			
		||||
set (pkg_bsdtar_urls
 | 
			
		||||
	"${pkg_bsdtar_root}/libarchive/libarchive-2.8.3-1/bsdtar-2.8.3-1-mingw32-bin.tar.bz2"
 | 
			
		||||
	"${pkg_bsdtar_root}/libarchive/libarchive-2.8.3-1/libarchive-2.8.3-1-mingw32-dll-2.tar.bz2"
 | 
			
		||||
	"${pkg_bsdtar_root}/expat/expat-2.0.1-1/libexpat-2.0.1-1-mingw32-dll-1.tar.gz"
 | 
			
		||||
	"${pkg_bsdtar_root}/xz/xz-4.999.9beta_20100401-1/liblzma-4.999.9beta_20100401-1-mingw32-dll-1.tar.bz2"
 | 
			
		||||
	"${pkg_bsdtar_root}/bzip2/release%201.0.5-2/libbz2-1.0.5-2-mingw32-dll-2.tar.gz"
 | 
			
		||||
	"${pkg_bsdtar_root}/zlib/zlib-1.2.3-1-mingw32/libz-1.2.3-1-mingw32-dll-1.tar.gz")
 | 
			
		||||
set (pkg_bsdtar_md5
 | 
			
		||||
	"160168b10075bf11a6405d43d98b1612"
 | 
			
		||||
	"8409b7e9138423b491a41faff742a362"
 | 
			
		||||
	"deb721ecbcb723d5d3ac4b7dc0860402"
 | 
			
		||||
	"5f98e85610656cfcfa68c45e601bad0e"
 | 
			
		||||
	"86a00cac65439ef3e3cb5c466cf6695f"
 | 
			
		||||
	"4ccd26ac32ad3ffdef5e78cdc770ef12")
 | 
			
		||||
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}/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip"
 | 
			
		||||
	"${pkg_gtk_root}/librsvg/2.32/librsvg_2.32.1-1_win32.zip"
 | 
			
		||||
	"${pkg_gtk_root}/librsvg/2.32/librsvg-dev_2.32.1-1_win32.zip"
 | 
			
		||||
	"${pkg_gtk_root}/librsvg/2.32/svg-gdk-pixbuf-loader_2.32.1-1_win32.zip"
 | 
			
		||||
	"${pkg_gtk_root}/libcroco/0.6/libcroco_0.6.2-1_win32.zip"
 | 
			
		||||
	"${pkg_gtk_root}/dependencies/libxml2_2.7.7-1_win32.zip"
 | 
			
		||||
	"${pkg_gtk_root}/dependencies/libxml2-dev_2.7.7-1_win32.zip"
 | 
			
		||||
	"${pkg_gtk_root}/dependencies/gettext-tools-0.17.zip")
 | 
			
		||||
	"${pkg_gtk_root}/dependencies/gettext-tools-0.17.zip"
 | 
			
		||||
	"${pkg_gtk_root}/dependencies/gettext-runtime-0.17-1.zip")
 | 
			
		||||
set (pkg_gtk_md5
 | 
			
		||||
	"a545c0ca1e6a312701d42a18e49572af"
 | 
			
		||||
	"2c712a8d7a652363241c0967098515db"
 | 
			
		||||
	"b09662bc99c5c1b8edb8af32a1722477"
 | 
			
		||||
	"bf4e34f1f175b88430159d33e01d0c49"
 | 
			
		||||
	"2d90c71404be0de4e5f3259f63a3e278"
 | 
			
		||||
	"bd6b3d8c35e06a00937db65887c6e287"
 | 
			
		||||
	"b6f59b70eef0992df37f8db891d4b283"
 | 
			
		||||
	"09baff956ebd1c391c7f71e9bd768edd")
 | 
			
		||||
	"09baff956ebd1c391c7f71e9bd768edd"
 | 
			
		||||
	"110394b4b1e0a50cd440f1e8729d159c")
 | 
			
		||||
 | 
			
		||||
set (pkg_opensuse_root "http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_Factory/noarch")
 | 
			
		||||
set (pkg_opensuse_urls
 | 
			
		||||
	"${pkg_opensuse_root}/mingw32-libjson-glib-0.12.0-3.1.noarch.rpm"
 | 
			
		||||
	"${pkg_opensuse_root}/mingw32-json-glib-devel-0.12.0-3.1.noarch.rpm")
 | 
			
		||||
set (pkg_opensuse_strip "usr/i686-pc-mingw32/sys-root/mingw")
 | 
			
		||||
set (pkg_opensuse_md5
 | 
			
		||||
	"df41a913984b865a46d234ad59703c8c"
 | 
			
		||||
	"13702ee3e22f79f42948ec5cbb6e23cb")
 | 
			
		||||
# 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_mingw_lua_root "http://sourceforge.net/projects/mingw-cross/files/%5BLIB%5D%20Lua")
 | 
			
		||||
set (pkg_mingw_lua_name "mingw32-lua-5.1.4-2")
 | 
			
		||||
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")
 | 
			
		||||
 | 
			
		||||
set (pkg_mingw_lua_root "http://sourceforge.net/projects/mingw/files/MinGW/Extension")
 | 
			
		||||
set (pkg_mingw_lua_urls
 | 
			
		||||
	"${pkg_mingw_lua_root}/${pkg_mingw_lua_name}/${pkg_mingw_lua_name}.zip")
 | 
			
		||||
set (pkg_mingw_lua_strip ${pkg_mingw_lua_name})
 | 
			
		||||
	"${pkg_mingw_lua_root}/lua/lua-5.2.0-1/lua-5.2.0-1-mingw32-dll-52.tar.xz"
 | 
			
		||||
	"${pkg_mingw_lua_root}/lua/lua-5.2.0-1/lua-5.2.0-1-mingw32-dev.tar.xz")
 | 
			
		||||
set (pkg_mingw_lua_md5
 | 
			
		||||
	"7deb1f62a9631871e9b90c0419c2e2bb")
 | 
			
		||||
	"150b27cab05b78ba40bbd7225630c00d"
 | 
			
		||||
	"6abe77c1e1a783075fe73c53b7c235fb")
 | 
			
		||||
 | 
			
		||||
# Stage 1: fetch missing packages
 | 
			
		||||
foreach (pkg_set ${pkg_list})
 | 
			
		||||
@@ -82,13 +59,14 @@ foreach (pkg_set ${pkg_list})
 | 
			
		||||
		set (filename ${pkg_dir}/${basename})
 | 
			
		||||
 | 
			
		||||
		if (NOT pkg_md5)
 | 
			
		||||
			message (WARNING "Checksum missing for ${basename}")
 | 
			
		||||
			message (WARNING "MD5 checksum missing for ${basename}")
 | 
			
		||||
			set (pkg_md5_sum)
 | 
			
		||||
			set (pkg_md5_param)
 | 
			
		||||
		else (NOT pkg_md5)
 | 
			
		||||
			list (GET pkg_md5 0 pkg_md5_param)
 | 
			
		||||
		else ()
 | 
			
		||||
			list (GET pkg_md5 0 pkg_md5_sum)
 | 
			
		||||
			list (REMOVE_AT pkg_md5 0)
 | 
			
		||||
			set (pkg_md5_param EXPECTED_MD5 ${pkg_md5_param})
 | 
			
		||||
		endif (NOT pkg_md5)
 | 
			
		||||
			set (pkg_md5_param EXPECTED_MD5 ${pkg_md5_sum})
 | 
			
		||||
		endif ()
 | 
			
		||||
 | 
			
		||||
		if (NOT EXISTS ${filename})
 | 
			
		||||
			message (STATUS "Downloading ${url}...")
 | 
			
		||||
@@ -100,72 +78,51 @@ foreach (pkg_set ${pkg_list})
 | 
			
		||||
				file (REMOVE ${filename})
 | 
			
		||||
				message (FATAL_ERROR "Download failed: ${status_msg}")
 | 
			
		||||
			endif (status_errno)
 | 
			
		||||
		endif (NOT EXISTS ${filename})
 | 
			
		||||
		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 ()
 | 
			
		||||
	endforeach (url)
 | 
			
		||||
endforeach (pkg_set)
 | 
			
		||||
 | 
			
		||||
if (NOT WIN32)
 | 
			
		||||
	message (FATAL_ERROR "Must run on Windows to extract packages; aborting")
 | 
			
		||||
endif (NOT WIN32)
 | 
			
		||||
 | 
			
		||||
# Stage 2: setup bsdtar first (RPM support)
 | 
			
		||||
file (MAKE_DIRECTORY ${tmp_dir})
 | 
			
		||||
foreach (url ${pkg_bsdtar_urls})
 | 
			
		||||
	get_filename_component (filename ${url} NAME)
 | 
			
		||||
	message (STATUS "Extracting ${filename}...")
 | 
			
		||||
	set (filename ${pkg_dir}/${filename})
 | 
			
		||||
 | 
			
		||||
	execute_process (COMMAND ${CMAKE_COMMAND} -E tar xf ${filename}
 | 
			
		||||
		WORKING_DIRECTORY ${tmp_dir}
 | 
			
		||||
		RESULT_VARIABLE status)
 | 
			
		||||
	if (status)
 | 
			
		||||
		message (FATAL_ERROR "Extraction failed: ${status}")
 | 
			
		||||
	endif (status)
 | 
			
		||||
endforeach (url)
 | 
			
		||||
 | 
			
		||||
file (COPY ${tmp_dir}/bin/ DESTINATION ${bsdtar_dir})
 | 
			
		||||
file (REMOVE_RECURSE ${tmp_dir})
 | 
			
		||||
list (REMOVE_ITEM pkg_list "bsdtar")
 | 
			
		||||
 | 
			
		||||
# Stage 3: extract the rest of packages
 | 
			
		||||
# 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 (filename ${pkg_dir}/${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 ${bsdtar_executable} -xf ${filename}
 | 
			
		||||
			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 (pkg_${pkg_set}_strip)
 | 
			
		||||
			execute_process (COMMAND ${bsdtar_executable} -xf ${filename}
 | 
			
		||||
		else ()
 | 
			
		||||
			execute_process (COMMAND ${extract_command} ${filename}
 | 
			
		||||
				WORKING_DIRECTORY ${working_dir}
 | 
			
		||||
				RESULT_VARIABLE status)
 | 
			
		||||
		endif (pkg_${pkg_set}_strip)
 | 
			
		||||
		endif ()
 | 
			
		||||
 | 
			
		||||
		if (status)
 | 
			
		||||
			message (FATAL_ERROR "Extraction failed: ${status}")
 | 
			
		||||
		endif (status)
 | 
			
		||||
		endif ()
 | 
			
		||||
	endforeach (url)
 | 
			
		||||
endforeach (pkg_set)
 | 
			
		||||
 | 
			
		||||
# Stage 4: final touches
 | 
			
		||||
file (WRITE ${working_dir}/etc/gtk-2.0/gtkrc
 | 
			
		||||
	"gtk-theme-name = \"MS-Windows\"")
 | 
			
		||||
 | 
			
		||||
set (gdk_pixbuf_libdir lib/gdk-pixbuf-2.0/2.10.0)
 | 
			
		||||
set (ENV{GDK_PIXBUF_MODULE_FILE} ${gdk_pixbuf_libdir}/loaders.cache)
 | 
			
		||||
set (ENV{GDK_PIXBUF_MODULEDIR} ${gdk_pixbuf_libdir}/loaders)
 | 
			
		||||
execute_process (COMMAND
 | 
			
		||||
	${working_dir}/bin/gdk-pixbuf-query-loaders --update-cache
 | 
			
		||||
	WORKING_DIRECTORY "${working_dir}"
 | 
			
		||||
	RESULT_VARIABLE result)
 | 
			
		||||
if (result)
 | 
			
		||||
	message (FATAL_ERROR "gdk-pixbuf-query-loaders failed")
 | 
			
		||||
endif (result)
 | 
			
		||||
 | 
			
		||||
# Stage 3: final touches
 | 
			
		||||
# We have to fix the prefix path as it is completely wrong everywhere
 | 
			
		||||
file (GLOB files ${working_dir}/lib/pkgconfig/*.pc)
 | 
			
		||||
foreach (file ${files})
 | 
			
		||||
	message (STATUS "Fixing ${file}...")
 | 
			
		||||
	file (READ ${file} file_content)
 | 
			
		||||
	string (REGEX REPLACE "prefix=[^\r\n]*(.*)" "prefix=${working_dir}\\1"
 | 
			
		||||
		file_content_fixed "${file_content}")
 | 
			
		||||
	file (WRITE ${file} "${file_content_fixed}")
 | 
			
		||||
endforeach (file)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										74
									
								
								Win64Depends.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,74 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
# Win64Depends.sh: download dependencies from MSYS2 for cross-compilation
 | 
			
		||||
# Dependencies: AWK, sed, sha256sum, cURL, bsdtar, wine64
 | 
			
		||||
repository=https://repo.msys2.org/mingw/mingw64/
 | 
			
		||||
 | 
			
		||||
status() {
 | 
			
		||||
	echo "$(tput bold)-- $*$(tput sgr0)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dbsync() {
 | 
			
		||||
	status Fetching repository DB
 | 
			
		||||
	[ -f db.tsv ] || curl -# "$repository/mingw64.db" | bsdtar -xOf- | awk '
 | 
			
		||||
		function flush() { print f["%NAME%"] f["%FILENAME%"] f["%DEPENDS%"] }
 | 
			
		||||
		NR > 1 && $0 == "%FILENAME%" { flush(); for (i in f) delete f[i] }
 | 
			
		||||
		!/^[^%]/ { field = $0; next } { f[field] = f[field] $0 "\t" }
 | 
			
		||||
		field == "%SHA256SUM%" { path = "*packages/" f["%FILENAME%"]
 | 
			
		||||
			sub(/\t$/, "", path); print $0, path > "db.sums" } END { flush() }
 | 
			
		||||
	' > db.tsv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fetch() {
 | 
			
		||||
	status Resolving "$@"
 | 
			
		||||
	mkdir -p packages
 | 
			
		||||
	awk -F'\t' 'function get(name,    i, a) {
 | 
			
		||||
		if (visited[name]++ || !(name in filenames)) return
 | 
			
		||||
		print filenames[name]; split(deps[name], a); for (i in a) get(a[i])
 | 
			
		||||
	} 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
 | 
			
		||||
	do
 | 
			
		||||
		status Fetching "$name"
 | 
			
		||||
		[ -f "packages/$name" ] || curl -#o "packages/$name" "$repository/$name"
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
verify() {
 | 
			
		||||
	status Verifying checksums
 | 
			
		||||
	sha256sum --ignore-missing --quiet -c db.sums
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extract() {
 | 
			
		||||
	status Extracting packages
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
configure() {
 | 
			
		||||
	status Configuring packages
 | 
			
		||||
	glib-compile-schemas share/glib-2.0/schemas
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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"?
 | 
			
		||||
verify
 | 
			
		||||
extract
 | 
			
		||||
configure
 | 
			
		||||
 | 
			
		||||
status Success
 | 
			
		||||
 | 
			
		||||
# XXX: Why is this override needed to run some GLib-based things under wine64?
 | 
			
		||||
export XDG_DATA_DIRS=$(pwd)/share
 | 
			
		||||
							
								
								
									
										156
									
								
								cmake/FindCppCheck.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,156 @@
 | 
			
		||||
# - Find cppcheck
 | 
			
		||||
# This module looks for cppcheck.
 | 
			
		||||
# This module defines the following variables:
 | 
			
		||||
#
 | 
			
		||||
#   CPPCHECK_FOUND      - Set to TRUE when cppcheck is found.
 | 
			
		||||
#   CPPCHECK_EXECUTABLE - Path to the executable.
 | 
			
		||||
#
 | 
			
		||||
# and a convenience function for calling the utility:
 | 
			
		||||
#
 | 
			
		||||
#   GENERATE_CPPCHECK(SOURCES <sources to check...>
 | 
			
		||||
#                    [SUPPRESSION_FILE <file>]
 | 
			
		||||
#                    [ENABLE_IDS <id...>]
 | 
			
		||||
#                    [TARGET_NAME <name>]
 | 
			
		||||
#                    [INCLUDES <dir...>])
 | 
			
		||||
#
 | 
			
		||||
# This generates a "cppcheck" target that executes cppcheck on the specified
 | 
			
		||||
# sources. Sources may be either file names or directories containing files
 | 
			
		||||
# where all C/++ files will be parsed automatically. Use directories whenever
 | 
			
		||||
# possible because there is a limitation in arguments to pass to the cppcheck
 | 
			
		||||
# binary.
 | 
			
		||||
#
 | 
			
		||||
# SUPPRESSION_FILE may be given additionally to specify suppressions for
 | 
			
		||||
# cppcheck. The sources mentioned in the suppression file must be in the same
 | 
			
		||||
# format as given for SOURCES. This means if you specify them relative to
 | 
			
		||||
# CMAKE_CURRENT_SOURCE_DIR, then the same relative paths must be used in the
 | 
			
		||||
# suppression file.
 | 
			
		||||
#
 | 
			
		||||
# ENABLE_IDS allows to specify which additional cppcheck check ids to execute,
 | 
			
		||||
# e.g. all or style.
 | 
			
		||||
#
 | 
			
		||||
# With TARGET_NAME a different name for the generated check target can be
 | 
			
		||||
# specified. This is useful if several calls to this function are made in one
 | 
			
		||||
# CMake project, as otherwise the target names would collide.
 | 
			
		||||
#
 | 
			
		||||
# Additional include directories for the cppcheck program can be given with
 | 
			
		||||
# INCLUDES.
 | 
			
		||||
#
 | 
			
		||||
# cppcheck will be executed with CMAKE_CURRENT_SOURCE_DIR as working directory.
 | 
			
		||||
#
 | 
			
		||||
# This function can be called even if cppcheck wasn't found. In that case no
 | 
			
		||||
# target is created.
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# Copyright 2011 Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
 | 
			
		||||
# Copyright 2012 Přemysl Eric Janouch <p at janouch dot name>
 | 
			
		||||
# 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_program (CPPCHECK_EXECUTABLE cppcheck)
 | 
			
		||||
mark_as_advanced (CPPCHECK_EXECUTABLE)
 | 
			
		||||
 | 
			
		||||
include (FindPackageHandleStandardArgs)
 | 
			
		||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS (CppCheck DEFAULT_MSG CPPCHECK_EXECUTABLE)
 | 
			
		||||
 | 
			
		||||
include (ProcessArguments)
 | 
			
		||||
 | 
			
		||||
function (GENERATE_CPPCHECK)
 | 
			
		||||
	if (NOT CPPCHECK_FOUND)
 | 
			
		||||
		return ()
 | 
			
		||||
	endif (NOT CPPCHECK_FOUND)
 | 
			
		||||
 | 
			
		||||
	# Parse arguments given to this function
 | 
			
		||||
	set (__names  SOURCES  SUPPRESION_FILE  ENABLE_IDS  TARGET_NAME  INCLUDES)
 | 
			
		||||
	set (__need   YES      NO               NO          NO           NO)
 | 
			
		||||
	set (__want   1        1                1           1            1)
 | 
			
		||||
	set (__more   YES      NO               YES         NO           YES)
 | 
			
		||||
	set (__skip   0        0                0           0            0)
 | 
			
		||||
 | 
			
		||||
	set (__argv ${ARGV})
 | 
			
		||||
	PROCESS_ARGUMENTS (__argv __names __need __want __more __skip "opt_")
 | 
			
		||||
 | 
			
		||||
	# Get target name
 | 
			
		||||
	set (target_name "cppcheck")
 | 
			
		||||
	set (target_name_suffix "")
 | 
			
		||||
 | 
			
		||||
	if (opt_target_name)
 | 
			
		||||
		set (target_name ${opt_target_name_param})
 | 
			
		||||
		set (target_suffix "-${target_name}")
 | 
			
		||||
	endif (opt_target_name)
 | 
			
		||||
 | 
			
		||||
	set (cppcheck_base "${PROJECT_BINARY_DIR}/cppcheck${target_suffix}")
 | 
			
		||||
 | 
			
		||||
	set (cppcheck_report_file     "${cppcheck_base}-report.log")
 | 
			
		||||
	set (cppcheck_wrapper_script  "${cppcheck_base}.cmake")
 | 
			
		||||
 | 
			
		||||
	# Prepare a command line for cppcheck
 | 
			
		||||
	set (source_args ${opt_sources_param})
 | 
			
		||||
	set (options "--inline-suppr")
 | 
			
		||||
 | 
			
		||||
	# Suppression argument
 | 
			
		||||
	if (opt_suppression_file)
 | 
			
		||||
		get_filename_component (abs "${opt_suppression_file_param}" ABSOLUTE)
 | 
			
		||||
		set (options "${options} --suppressions \"${abs}\"")
 | 
			
		||||
	endif (opt_suppression_file)
 | 
			
		||||
 | 
			
		||||
	# Includes
 | 
			
		||||
	foreach (include ${opt_includes_param})
 | 
			
		||||
		set (options "${options} -I \"${include}\"")
 | 
			
		||||
	endforeach (include)
 | 
			
		||||
 | 
			
		||||
	# Enabled ids
 | 
			
		||||
	if (opt_enable_ids)
 | 
			
		||||
		set (id_list "")
 | 
			
		||||
		foreach (id ${opt_enable_ids_param})
 | 
			
		||||
			set (id_list "${id_list},${id}")
 | 
			
		||||
		endforeach (id)
 | 
			
		||||
 | 
			
		||||
		string (SUBSTRING ${id_list} 1 -1 id_list)
 | 
			
		||||
		set (options "${options} \"--enable=${id_list}\"")
 | 
			
		||||
	endif (opt_enable_ids)
 | 
			
		||||
 | 
			
		||||
	# Create a wrapper script which redirects stderr of cppcheck to a file
 | 
			
		||||
	file (WRITE ${cppcheck_wrapper_script} "
 | 
			
		||||
		execute_process (
 | 
			
		||||
			COMMAND \"${CPPCHECK_EXECUTABLE}\" ${options} ${source_args}
 | 
			
		||||
			RESULT_VARIABLE exit_code
 | 
			
		||||
			ERROR_VARIABLE error_out
 | 
			
		||||
			WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\")
 | 
			
		||||
		if (exit_code)
 | 
			
		||||
			message (FATAL_ERROR \"Error executing cppcheck\")
 | 
			
		||||
		endif (exit_code)
 | 
			
		||||
		if (error_out)
 | 
			
		||||
			message (\"\\nDetected errors:\\n\${error_out}\")
 | 
			
		||||
		endif (error_out)
 | 
			
		||||
		file (WRITE \"${cppcheck_report_file}\" \"\${error_out}\")
 | 
			
		||||
	")
 | 
			
		||||
 | 
			
		||||
	add_custom_target (${target_name}
 | 
			
		||||
		COMMAND ${CMAKE_COMMAND} -P "${cppcheck_wrapper_script}"
 | 
			
		||||
		DEPENDS "${cppcheck_wrapper_script}"
 | 
			
		||||
		COMMENT "Calling cppcheck static code analyzer" VERBATIM)
 | 
			
		||||
endfunction (GENERATE_CPPCHECK)
 | 
			
		||||
 | 
			
		||||
@@ -1,588 +0,0 @@
 | 
			
		||||
# - FindGTK2.cmake
 | 
			
		||||
# This module can find the GTK2 widget libraries and several of its other
 | 
			
		||||
# optional components like gtkmm, glade, and glademm.
 | 
			
		||||
#
 | 
			
		||||
# NOTE: If you intend to use version checking, CMake 2.6.2 or later is
 | 
			
		||||
#       required.
 | 
			
		||||
#
 | 
			
		||||
# Specify one or more of the following components
 | 
			
		||||
# as you call this find module. See example below.
 | 
			
		||||
#
 | 
			
		||||
#   gtk
 | 
			
		||||
#   gtkmm
 | 
			
		||||
#   glade
 | 
			
		||||
#   glademm
 | 
			
		||||
#
 | 
			
		||||
# The following variables will be defined for your use
 | 
			
		||||
#
 | 
			
		||||
#   GTK2_FOUND - Were all of your specified components found?
 | 
			
		||||
#   GTK2_INCLUDE_DIRS - All include directories
 | 
			
		||||
#   GTK2_LIBRARIES - All libraries
 | 
			
		||||
#
 | 
			
		||||
#   GTK2_VERSION - The version of GTK2 found (x.y.z)
 | 
			
		||||
#   GTK2_MAJOR_VERSION - The major version of GTK2
 | 
			
		||||
#   GTK2_MINOR_VERSION - The minor version of GTK2
 | 
			
		||||
#   GTK2_PATCH_VERSION - The patch version of GTK2
 | 
			
		||||
#
 | 
			
		||||
# Optional variables you can define prior to calling this module:
 | 
			
		||||
#
 | 
			
		||||
#   GTK2_DEBUG - Enables verbose debugging of the module
 | 
			
		||||
#   GTK2_SKIP_MARK_AS_ADVANCED - Disable marking cache variables as advanced
 | 
			
		||||
#   GTK2_ADDITIONAL_SUFFIXES - Allows defining additional directories to
 | 
			
		||||
#                              search for include files
 | 
			
		||||
#
 | 
			
		||||
#=================
 | 
			
		||||
# Example Usage:
 | 
			
		||||
#
 | 
			
		||||
#   Call find_package() once, here are some examples to pick from:
 | 
			
		||||
#
 | 
			
		||||
#   Require GTK 2.6 or later
 | 
			
		||||
#       find_package(GTK2 2.6 REQUIRED gtk)
 | 
			
		||||
#
 | 
			
		||||
#   Require GTK 2.10 or later and Glade
 | 
			
		||||
#       find_package(GTK2 2.10 REQUIRED gtk glade)
 | 
			
		||||
#
 | 
			
		||||
#   Search for GTK/GTKMM 2.8 or later
 | 
			
		||||
#       find_package(GTK2 2.8 COMPONENTS gtk gtkmm)
 | 
			
		||||
#
 | 
			
		||||
#   if(GTK2_FOUND)
 | 
			
		||||
#      include_directories(${GTK2_INCLUDE_DIRS})
 | 
			
		||||
#      add_executable(mygui mygui.cc)
 | 
			
		||||
#      target_link_libraries(mygui ${GTK2_LIBRARIES})
 | 
			
		||||
#   endif()
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# Copyright 2009 Kitware, Inc.
 | 
			
		||||
# Copyright 2008-2009 Philip Lowman <philip@yhbt.com>
 | 
			
		||||
#
 | 
			
		||||
# Distributed under the OSI-approved BSD License (the "License");
 | 
			
		||||
# see accompanying file Copyright.txt for details.
 | 
			
		||||
#
 | 
			
		||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
 | 
			
		||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
# See the License for more information.
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# (To distribute this file outside of CMake, substitute the full
 | 
			
		||||
#  License text for the above reference.)
 | 
			
		||||
 | 
			
		||||
# Version 1.2 (8/30/2010) (CMake 2.8.3)
 | 
			
		||||
#   * Merge patch for detecting gdk-pixbuf library (split off
 | 
			
		||||
#     from core GTK in 2.21).  Thanks to Vincent Untz for the patch
 | 
			
		||||
#     and Ricardo Cruz for the heads up.
 | 
			
		||||
# Version 1.1 (8/19/2010) (CMake 2.8.3)
 | 
			
		||||
#   * Add support for detecting GTK2 under macports (thanks to Gary Kramlich)
 | 
			
		||||
# Version 1.0 (8/12/2010) (CMake 2.8.3)
 | 
			
		||||
#   * Add support for detecting new pangommconfig.h header file
 | 
			
		||||
#     (Thanks to Sune Vuorela & the Debian Project for the patch)
 | 
			
		||||
#   * Add support for detecting fontconfig.h header
 | 
			
		||||
#   * Call find_package(Freetype) since it's required
 | 
			
		||||
#   * Add support for allowing users to add additional library directories
 | 
			
		||||
#     via the GTK2_ADDITIONAL_SUFFIXES variable (kind of a future-kludge in
 | 
			
		||||
#     case the GTK developers change versions on any of the directories in the
 | 
			
		||||
#     future).
 | 
			
		||||
# Version 0.8 (1/4/2010)
 | 
			
		||||
#   * Get module working under MacOSX fink by adding /sw/include, /sw/lib
 | 
			
		||||
#     to PATHS and the gobject library
 | 
			
		||||
# Version 0.7 (3/22/09)
 | 
			
		||||
#   * Checked into CMake CVS
 | 
			
		||||
#   * Added versioning support
 | 
			
		||||
#   * Module now defaults to searching for GTK if COMPONENTS not specified.
 | 
			
		||||
#   * Added HKCU prior to HKLM registry key and GTKMM specific environment
 | 
			
		||||
#      variable as per mailing list discussion.
 | 
			
		||||
#   * Added lib64 to include search path and a few other search paths where GTK
 | 
			
		||||
#      may be installed on Unix systems.
 | 
			
		||||
#   * Switched to lowercase CMake commands
 | 
			
		||||
#   * Prefaced internal variables with _GTK2 to prevent collision
 | 
			
		||||
#   * Changed internal macros to functions
 | 
			
		||||
#   * Enhanced documentation
 | 
			
		||||
# Version 0.6 (1/8/08)
 | 
			
		||||
#   Added GTK2_SKIP_MARK_AS_ADVANCED option
 | 
			
		||||
# Version 0.5 (12/19/08)
 | 
			
		||||
#   Second release to cmake mailing list
 | 
			
		||||
 | 
			
		||||
#=============================================================
 | 
			
		||||
# _GTK2_GET_VERSION
 | 
			
		||||
# Internal function to parse the version number in gtkversion.h
 | 
			
		||||
#   _OUT_major = Major version number
 | 
			
		||||
#   _OUT_minor = Minor version number
 | 
			
		||||
#   _OUT_micro = Micro version number
 | 
			
		||||
#   _gtkversion_hdr = Header file to parse
 | 
			
		||||
#=============================================================
 | 
			
		||||
function(_GTK2_GET_VERSION _OUT_major _OUT_minor _OUT_micro _gtkversion_hdr)
 | 
			
		||||
    file(READ ${_gtkversion_hdr} _contents)
 | 
			
		||||
    if(_contents)
 | 
			
		||||
        string(REGEX REPLACE ".*#define GTK_MAJOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_major} "${_contents}")
 | 
			
		||||
        string(REGEX REPLACE ".*#define GTK_MINOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_minor} "${_contents}")
 | 
			
		||||
        string(REGEX REPLACE ".*#define GTK_MICRO_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_micro} "${_contents}")
 | 
			
		||||
        
 | 
			
		||||
        if(NOT ${_OUT_major} MATCHES "[0-9]+")
 | 
			
		||||
            message(FATAL_ERROR "Version parsing failed for GTK2_MAJOR_VERSION!")
 | 
			
		||||
        endif()
 | 
			
		||||
        if(NOT ${_OUT_minor} MATCHES "[0-9]+")
 | 
			
		||||
            message(FATAL_ERROR "Version parsing failed for GTK2_MINOR_VERSION!")
 | 
			
		||||
        endif()
 | 
			
		||||
        if(NOT ${_OUT_micro} MATCHES "[0-9]+")
 | 
			
		||||
            message(FATAL_ERROR "Version parsing failed for GTK2_MICRO_VERSION!")
 | 
			
		||||
        endif()
 | 
			
		||||
 | 
			
		||||
        set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE)
 | 
			
		||||
        set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE)
 | 
			
		||||
        set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE)
 | 
			
		||||
    else()
 | 
			
		||||
        message(FATAL_ERROR "Include file ${_gtkversion_hdr} does not exist")
 | 
			
		||||
    endif()
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
#=============================================================
 | 
			
		||||
# _GTK2_FIND_INCLUDE_DIR
 | 
			
		||||
# Internal function to find the GTK include directories
 | 
			
		||||
#   _var = variable to set
 | 
			
		||||
#   _hdr = header file to look for
 | 
			
		||||
#=============================================================
 | 
			
		||||
function(_GTK2_FIND_INCLUDE_DIR _var _hdr)
 | 
			
		||||
 | 
			
		||||
    if(GTK2_DEBUG)
 | 
			
		||||
        message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
 | 
			
		||||
                       "_GTK2_FIND_INCLUDE_DIR( ${_var} ${_hdr} )")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    set(_relatives
 | 
			
		||||
        # If these ever change, things will break.
 | 
			
		||||
        ${GTK2_ADDITIONAL_SUFFIXES}
 | 
			
		||||
        glibmm-2.4
 | 
			
		||||
        glib-2.0
 | 
			
		||||
        atk-1.0
 | 
			
		||||
        atkmm-1.6
 | 
			
		||||
        cairo
 | 
			
		||||
        cairomm-1.0
 | 
			
		||||
        gdk-pixbuf-2.0
 | 
			
		||||
        gdkmm-2.4
 | 
			
		||||
        giomm-2.4
 | 
			
		||||
        gtk-2.0
 | 
			
		||||
        gtkmm-2.4
 | 
			
		||||
        libglade-2.0
 | 
			
		||||
        libglademm-2.4
 | 
			
		||||
        pango-1.0
 | 
			
		||||
        pangomm-1.4
 | 
			
		||||
        sigc++-2.0
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    set(_suffixes)
 | 
			
		||||
    foreach(_d ${_relatives})
 | 
			
		||||
        list(APPEND _suffixes ${_d})
 | 
			
		||||
        list(APPEND _suffixes ${_d}/include) # for /usr/lib/gtk-2.0/include
 | 
			
		||||
    endforeach()
 | 
			
		||||
 | 
			
		||||
    if(GTK2_DEBUG)
 | 
			
		||||
        message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
 | 
			
		||||
                       "include suffixes = ${_suffixes}")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    find_path(${_var} ${_hdr}
 | 
			
		||||
        PATHS
 | 
			
		||||
            /usr/local/lib64
 | 
			
		||||
            /usr/local/lib
 | 
			
		||||
            /usr/lib64
 | 
			
		||||
            /usr/lib
 | 
			
		||||
            /opt/gnome/include
 | 
			
		||||
            /opt/gnome/lib
 | 
			
		||||
            /opt/openwin/include
 | 
			
		||||
            /usr/openwin/lib
 | 
			
		||||
            /sw/include
 | 
			
		||||
            /sw/lib
 | 
			
		||||
            /opt/local/include
 | 
			
		||||
            /opt/local/lib
 | 
			
		||||
            $ENV{GTKMM_BASEPATH}/include
 | 
			
		||||
            $ENV{GTKMM_BASEPATH}/lib
 | 
			
		||||
            [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/include
 | 
			
		||||
            [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
 | 
			
		||||
            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/include
 | 
			
		||||
            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
 | 
			
		||||
        PATH_SUFFIXES
 | 
			
		||||
            ${_suffixes}
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    if(${_var})
 | 
			
		||||
        set(GTK2_INCLUDE_DIRS ${GTK2_INCLUDE_DIRS} ${${_var}} PARENT_SCOPE)
 | 
			
		||||
        if(NOT GTK2_SKIP_MARK_AS_ADVANCED)
 | 
			
		||||
            mark_as_advanced(${_var})
 | 
			
		||||
        endif()
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
endfunction(_GTK2_FIND_INCLUDE_DIR)
 | 
			
		||||
 | 
			
		||||
#=============================================================
 | 
			
		||||
# _GTK2_FIND_LIBRARY
 | 
			
		||||
# Internal function to find libraries packaged with GTK2
 | 
			
		||||
#   _var = library variable to create
 | 
			
		||||
#=============================================================
 | 
			
		||||
function(_GTK2_FIND_LIBRARY _var _lib _expand_vc _append_version)
 | 
			
		||||
 | 
			
		||||
    if(GTK2_DEBUG)
 | 
			
		||||
        message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
 | 
			
		||||
                       "_GTK2_FIND_LIBRARY( ${_var} ${_lib} ${_expand_vc} ${_append_version} )")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    # Not GTK versions per se but the versions encoded into Windows
 | 
			
		||||
    # import libraries (GtkMM 2.14.1 has a gtkmm-vc80-2_4.lib for example)
 | 
			
		||||
    # Also the MSVC libraries use _ for . (this is handled below)
 | 
			
		||||
    set(_versions 2.20 2.18 2.16 2.14 2.12
 | 
			
		||||
                  2.10  2.8  2.6  2.4  2.2 2.0
 | 
			
		||||
                  1.20 1.18 1.16 1.14 1.12
 | 
			
		||||
                  1.10  1.8  1.6  1.4  1.2 1.0)
 | 
			
		||||
 | 
			
		||||
    set(_library)
 | 
			
		||||
    set(_library_d)
 | 
			
		||||
 | 
			
		||||
    set(_library ${_lib})
 | 
			
		||||
 | 
			
		||||
    if(_expand_vc)
 | 
			
		||||
        # Add vc80/vc90 midfixes
 | 
			
		||||
        if(MSVC80)
 | 
			
		||||
            set(_library   ${_library}-vc80)
 | 
			
		||||
            set(_library_d ${_library}-d)
 | 
			
		||||
        elseif(MSVC90)
 | 
			
		||||
            set(_library   ${_library}-vc90)
 | 
			
		||||
            set(_library_d ${_library}-d)
 | 
			
		||||
        endif()
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    if(GTK2_DEBUG)
 | 
			
		||||
        message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
 | 
			
		||||
                       "After midfix addition = ${_library} and ${_library_d}")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    set(_lib_list)
 | 
			
		||||
    set(_libd_list)
 | 
			
		||||
    if(_append_version)
 | 
			
		||||
        foreach(_ver ${_versions})
 | 
			
		||||
            list(APPEND _lib_list  "${_library}-${_ver}")
 | 
			
		||||
            list(APPEND _libd_list "${_library_d}-${_ver}")
 | 
			
		||||
        endforeach()
 | 
			
		||||
    else()
 | 
			
		||||
        set(_lib_list ${_library})
 | 
			
		||||
        set(_libd_list ${_library_d})
 | 
			
		||||
    endif()
 | 
			
		||||
    
 | 
			
		||||
    if(GTK2_DEBUG)
 | 
			
		||||
        message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
 | 
			
		||||
                       "library list = ${_lib_list} and library debug list = ${_libd_list}")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    # For some silly reason the MSVC libraries use _ instead of .
 | 
			
		||||
    # in the version fields
 | 
			
		||||
    if(_expand_vc AND MSVC)
 | 
			
		||||
        set(_no_dots_lib_list)
 | 
			
		||||
        set(_no_dots_libd_list)
 | 
			
		||||
        foreach(_l ${_lib_list})
 | 
			
		||||
            string(REPLACE "." "_" _no_dots_library ${_l})
 | 
			
		||||
            list(APPEND _no_dots_lib_list ${_no_dots_library})
 | 
			
		||||
        endforeach()
 | 
			
		||||
        # And for debug
 | 
			
		||||
        set(_no_dots_libsd_list)
 | 
			
		||||
        foreach(_l ${_libd_list})
 | 
			
		||||
            string(REPLACE "." "_" _no_dots_libraryd ${_l})
 | 
			
		||||
            list(APPEND _no_dots_libd_list ${_no_dots_libraryd})
 | 
			
		||||
        endforeach()
 | 
			
		||||
 | 
			
		||||
        # Copy list back to original names
 | 
			
		||||
        set(_lib_list ${_no_dots_lib_list})
 | 
			
		||||
        set(_libd_list ${_no_dots_libd_list})
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    if(GTK2_DEBUG)
 | 
			
		||||
        message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
 | 
			
		||||
                       "While searching for ${_var}, our proposed library list is ${_lib_list}")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    find_library(${_var} 
 | 
			
		||||
        NAMES ${_lib_list}
 | 
			
		||||
        PATHS
 | 
			
		||||
            /opt/gnome/lib
 | 
			
		||||
            /opt/gnome/lib64
 | 
			
		||||
            /usr/openwin/lib
 | 
			
		||||
            /usr/openwin/lib64
 | 
			
		||||
            /sw/lib
 | 
			
		||||
            $ENV{GTKMM_BASEPATH}/lib
 | 
			
		||||
            [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
 | 
			
		||||
            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    if(_expand_vc AND MSVC)
 | 
			
		||||
        if(GTK2_DEBUG)
 | 
			
		||||
            message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
 | 
			
		||||
                           "While searching for ${_var}_DEBUG our proposed library list is ${_libd_list}")
 | 
			
		||||
        endif()
 | 
			
		||||
 | 
			
		||||
        find_library(${_var}_DEBUG
 | 
			
		||||
            NAMES ${_libd_list}
 | 
			
		||||
            PATHS
 | 
			
		||||
            $ENV{GTKMM_BASEPATH}/lib
 | 
			
		||||
            [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
 | 
			
		||||
            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        if(${_var} AND ${_var}_DEBUG)
 | 
			
		||||
            if(NOT GTK2_SKIP_MARK_AS_ADVANCED)
 | 
			
		||||
                mark_as_advanced(${_var}_DEBUG)
 | 
			
		||||
            endif()
 | 
			
		||||
            set(GTK2_LIBRARIES ${GTK2_LIBRARIES} optimized ${${_var}} debug ${${_var}_DEBUG})
 | 
			
		||||
            set(GTK2_LIBRARIES ${GTK2_LIBRARIES} PARENT_SCOPE)
 | 
			
		||||
        endif()
 | 
			
		||||
    else()
 | 
			
		||||
        if(NOT GTK2_SKIP_MARK_AS_ADVANCED)
 | 
			
		||||
            mark_as_advanced(${_var})
 | 
			
		||||
        endif()
 | 
			
		||||
        set(GTK2_LIBRARIES ${GTK2_LIBRARIES} ${${_var}})
 | 
			
		||||
        set(GTK2_LIBRARIES ${GTK2_LIBRARIES} PARENT_SCOPE)
 | 
			
		||||
        # Set debug to release
 | 
			
		||||
        set(${_var}_DEBUG ${${_var}})
 | 
			
		||||
        set(${_var}_DEBUG ${${_var}} PARENT_SCOPE)
 | 
			
		||||
    endif()
 | 
			
		||||
endfunction(_GTK2_FIND_LIBRARY)
 | 
			
		||||
 | 
			
		||||
#=============================================================
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# main()
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
set(GTK2_FOUND)
 | 
			
		||||
set(GTK2_INCLUDE_DIRS)
 | 
			
		||||
set(GTK2_LIBRARIES)
 | 
			
		||||
 | 
			
		||||
if(NOT GTK2_FIND_COMPONENTS)
 | 
			
		||||
    # Assume they only want GTK
 | 
			
		||||
    set(GTK2_FIND_COMPONENTS gtk)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# If specified, enforce version number
 | 
			
		||||
#
 | 
			
		||||
if(GTK2_FIND_VERSION)
 | 
			
		||||
    cmake_minimum_required(VERSION 2.6.2)
 | 
			
		||||
    set(GTK2_FAILED_VERSION_CHECK true)
 | 
			
		||||
    if(GTK2_DEBUG)
 | 
			
		||||
        message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
 | 
			
		||||
                       "Searching for version ${GTK2_FIND_VERSION}")
 | 
			
		||||
    endif()
 | 
			
		||||
    _GTK2_FIND_INCLUDE_DIR(GTK2_GTK_INCLUDE_DIR gtk/gtk.h)
 | 
			
		||||
    if(GTK2_GTK_INCLUDE_DIR)
 | 
			
		||||
        _GTK2_GET_VERSION(GTK2_MAJOR_VERSION
 | 
			
		||||
                          GTK2_MINOR_VERSION
 | 
			
		||||
                          GTK2_PATCH_VERSION
 | 
			
		||||
                          ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h)
 | 
			
		||||
        set(GTK2_VERSION
 | 
			
		||||
            ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION})
 | 
			
		||||
        if(GTK2_FIND_VERSION_EXACT)
 | 
			
		||||
            if(GTK2_VERSION VERSION_EQUAL GTK2_FIND_VERSION)
 | 
			
		||||
                set(GTK2_FAILED_VERSION_CHECK false)
 | 
			
		||||
            endif()
 | 
			
		||||
        else()
 | 
			
		||||
            if(GTK2_VERSION VERSION_EQUAL   GTK2_FIND_VERSION OR
 | 
			
		||||
               GTK2_VERSION VERSION_GREATER GTK2_FIND_VERSION)
 | 
			
		||||
                set(GTK2_FAILED_VERSION_CHECK false)
 | 
			
		||||
            endif()
 | 
			
		||||
        endif()
 | 
			
		||||
    else()
 | 
			
		||||
        # If we can't find the GTK include dir, we can't do version checking
 | 
			
		||||
        if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY)
 | 
			
		||||
            message(FATAL_ERROR "Could not find GTK2 include directory")
 | 
			
		||||
        endif()
 | 
			
		||||
        return()
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    if(GTK2_FAILED_VERSION_CHECK)
 | 
			
		||||
        if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY)
 | 
			
		||||
            if(GTK2_FIND_VERSION_EXACT)
 | 
			
		||||
                message(FATAL_ERROR "GTK2 version check failed.  Version ${GTK2_VERSION} was found, version ${GTK2_FIND_VERSION} is needed exactly.")
 | 
			
		||||
            else()
 | 
			
		||||
                message(FATAL_ERROR "GTK2 version check failed.  Version ${GTK2_VERSION} was found, at least version ${GTK2_FIND_VERSION} is required")
 | 
			
		||||
            endif()
 | 
			
		||||
        endif()    
 | 
			
		||||
        
 | 
			
		||||
        # If the version check fails, exit out of the module here
 | 
			
		||||
        return()
 | 
			
		||||
    endif()
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Find all components
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
find_package(Freetype)
 | 
			
		||||
list(APPEND GTK2_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS})
 | 
			
		||||
list(APPEND GTK2_LIBRARIES ${FREETYPE_LIBRARIES})
 | 
			
		||||
 | 
			
		||||
foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
 | 
			
		||||
    if(_GTK2_component STREQUAL "gtk")
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIB_INCLUDE_DIR glib.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIBCONFIG_INCLUDE_DIR glibconfig.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GLIB_LIBRARY glib false true)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GIO_LIBRARY gio false true)
 | 
			
		||||
        
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GOBJECT_INCLUDE_DIR gobject/gobject.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GOBJECT_LIBRARY gobject false true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GDK_PIXBUF_INCLUDE_DIR gdk-pixbuf/gdk-pixbuf.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GDK_PIXBUF_LIBRARY gdk_pixbuf false true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GDK_INCLUDE_DIR gdk/gdk.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GDKCONFIG_INCLUDE_DIR gdkconfig.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GTK_INCLUDE_DIR gtk/gtk.h)
 | 
			
		||||
 | 
			
		||||
        if(UNIX)
 | 
			
		||||
            _GTK2_FIND_LIBRARY    (GTK2_GDK_LIBRARY gdk-x11 false true)
 | 
			
		||||
            _GTK2_FIND_LIBRARY    (GTK2_GTK_LIBRARY gtk-x11 false true)
 | 
			
		||||
        else()
 | 
			
		||||
            _GTK2_FIND_LIBRARY    (GTK2_GDK_LIBRARY gdk-win32 false true)
 | 
			
		||||
            _GTK2_FIND_LIBRARY    (GTK2_GTK_LIBRARY gtk-win32 false true)
 | 
			
		||||
        endif()
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_CAIRO_INCLUDE_DIR cairo.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_CAIRO_LIBRARY cairo false false)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_PANGO_INCLUDE_DIR pango/pango.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_PANGO_LIBRARY pango false true)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_PANGOCAIRO_LIBRARY pangocairo false true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_ATK_INCLUDE_DIR atk/atk.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_ATK_LIBRARY atk false true)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    elseif(_GTK2_component STREQUAL "gtkmm")
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIBMM_INCLUDE_DIR glibmm.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIBMMCONFIG_INCLUDE_DIR glibmmconfig.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GLIBMM_LIBRARY glibmm true true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GDKMM_INCLUDE_DIR gdkmm.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GDKMMCONFIG_INCLUDE_DIR gdkmmconfig.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GDKMM_LIBRARY gdkmm true true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GTKMM_INCLUDE_DIR gtkmm.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GTKMMCONFIG_INCLUDE_DIR gtkmmconfig.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GTKMM_LIBRARY gtkmm true true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_CAIROMM_INCLUDE_DIR cairomm/cairomm.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_CAIROMM_LIBRARY cairomm true true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_PANGOMM_INCLUDE_DIR pangomm.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_PANGOMMCONFIG_INCLUDE_DIR pangommconfig.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_PANGOMM_LIBRARY pangomm true true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_SIGC++_INCLUDE_DIR sigc++/sigc++.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_SIGC++CONFIG_INCLUDE_DIR sigc++config.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_SIGC++_LIBRARY sigc true true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GIOMM_INCLUDE_DIR giomm.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GIOMMCONFIG_INCLUDE_DIR giommconfig.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GIOMM_LIBRARY giomm true true)
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_ATKMM_INCLUDE_DIR atkmm.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_ATKMM_LIBRARY atkmm true true)
 | 
			
		||||
 | 
			
		||||
    elseif(_GTK2_component STREQUAL "glade")
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GLADE_INCLUDE_DIR glade/glade.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GLADE_LIBRARY glade false true)
 | 
			
		||||
    
 | 
			
		||||
    elseif(_GTK2_component STREQUAL "glademm")
 | 
			
		||||
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GLADEMM_INCLUDE_DIR libglademm.h)
 | 
			
		||||
        _GTK2_FIND_INCLUDE_DIR(GTK2_GLADEMMCONFIG_INCLUDE_DIR libglademmconfig.h)
 | 
			
		||||
        _GTK2_FIND_LIBRARY    (GTK2_GLADEMM_LIBRARY glademm true true)
 | 
			
		||||
 | 
			
		||||
    else()
 | 
			
		||||
        message(FATAL_ERROR "Unknown GTK2 component ${_component}")
 | 
			
		||||
    endif()
 | 
			
		||||
endforeach()
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Solve for the GTK2 version if we haven't already
 | 
			
		||||
#
 | 
			
		||||
if(NOT GTK2_FIND_VERSION AND GTK2_GTK_INCLUDE_DIR)
 | 
			
		||||
    _GTK2_GET_VERSION(GTK2_MAJOR_VERSION
 | 
			
		||||
                      GTK2_MINOR_VERSION
 | 
			
		||||
                      GTK2_PATCH_VERSION
 | 
			
		||||
                      ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h)
 | 
			
		||||
    set(GTK2_VERSION ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION})
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Try to enforce components
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
set(_GTK2_did_we_find_everything true)  # This gets set to GTK2_FOUND
 | 
			
		||||
 | 
			
		||||
include(FindPackageHandleStandardArgs)
 | 
			
		||||
 | 
			
		||||
foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
 | 
			
		||||
    string(TOUPPER ${_GTK2_component} _COMPONENT_UPPER)
 | 
			
		||||
 | 
			
		||||
    if(_GTK2_component STREQUAL "gtk")
 | 
			
		||||
        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtk libraries were not found."
 | 
			
		||||
            GTK2_GTK_LIBRARY
 | 
			
		||||
            GTK2_GTK_INCLUDE_DIR
 | 
			
		||||
 | 
			
		||||
            GTK2_GLIB_INCLUDE_DIR
 | 
			
		||||
            GTK2_GLIBCONFIG_INCLUDE_DIR
 | 
			
		||||
            GTK2_GLIB_LIBRARY
 | 
			
		||||
            GTK2_GIO_LIBRARY
 | 
			
		||||
 | 
			
		||||
            GTK2_GDK_INCLUDE_DIR
 | 
			
		||||
            GTK2_GDKCONFIG_INCLUDE_DIR
 | 
			
		||||
            GTK2_GDK_LIBRARY
 | 
			
		||||
        )
 | 
			
		||||
    elseif(_GTK2_component STREQUAL "gtkmm")
 | 
			
		||||
        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtkmm libraries were not found."
 | 
			
		||||
            GTK2_GTKMM_LIBRARY
 | 
			
		||||
            GTK2_GTKMM_INCLUDE_DIR
 | 
			
		||||
            GTK2_GTKMMCONFIG_INCLUDE_DIR
 | 
			
		||||
 | 
			
		||||
            GTK2_GLIBMM_INCLUDE_DIR
 | 
			
		||||
            GTK2_GLIBMMCONFIG_INCLUDE_DIR
 | 
			
		||||
            GTK2_GLIBMM_LIBRARY
 | 
			
		||||
 | 
			
		||||
            GTK2_GDKMM_INCLUDE_DIR
 | 
			
		||||
            GTK2_GDKMMCONFIG_INCLUDE_DIR
 | 
			
		||||
            GTK2_GDKMM_LIBRARY
 | 
			
		||||
        )
 | 
			
		||||
    elseif(_GTK2_component STREQUAL "glade")
 | 
			
		||||
        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glade library was not found."
 | 
			
		||||
            GTK2_GLADE_LIBRARY
 | 
			
		||||
            GTK2_GLADE_INCLUDE_DIR
 | 
			
		||||
        )
 | 
			
		||||
    elseif(_GTK2_component STREQUAL "glademm")
 | 
			
		||||
        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glademm library was not found."
 | 
			
		||||
            GTK2_GLADEMM_LIBRARY
 | 
			
		||||
            GTK2_GLADEMM_INCLUDE_DIR
 | 
			
		||||
            GTK2_GLADEMMCONFIG_INCLUDE_DIR
 | 
			
		||||
        )
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    if(NOT GTK2_${_COMPONENT_UPPER}_FOUND)
 | 
			
		||||
        set(_GTK2_did_we_find_everything false)
 | 
			
		||||
    endif()
 | 
			
		||||
endforeach()
 | 
			
		||||
 | 
			
		||||
if(_GTK2_did_we_find_everything AND NOT GTK2_VERSION_CHECK_FAILED)
 | 
			
		||||
    set(GTK2_FOUND true)
 | 
			
		||||
else()
 | 
			
		||||
    # Unset our variables.
 | 
			
		||||
    set(GTK2_FOUND false)
 | 
			
		||||
    set(GTK2_VERSION)
 | 
			
		||||
    set(GTK2_VERSION_MAJOR)
 | 
			
		||||
    set(GTK2_VERSION_MINOR)
 | 
			
		||||
    set(GTK2_VERSION_PATCH)
 | 
			
		||||
    set(GTK2_INCLUDE_DIRS)
 | 
			
		||||
    set(GTK2_LIBRARIES)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(GTK2_INCLUDE_DIRS)
 | 
			
		||||
   list(REMOVE_DUPLICATES GTK2_INCLUDE_DIRS)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
@@ -1,99 +0,0 @@
 | 
			
		||||
# - Find GNU gettext tools
 | 
			
		||||
# This module looks for the GNU gettext tools. This module defines the
 | 
			
		||||
# following values:
 | 
			
		||||
#    GETTEXT_MSGMERGE_EXECUTABLE: the full path to the msgmerge tool.
 | 
			
		||||
#    GETTEXT_MSGFMT_EXECUTABLE: the full path to the msgfmt tool.
 | 
			
		||||
#    GETTEXT_FOUND: True if gettext has been found.
 | 
			
		||||
#
 | 
			
		||||
# Additionally it provides the following macros:
 | 
			
		||||
# GETTEXT_CREATE_TRANSLATIONS ( outputFile [ALL] file1 ... fileN )
 | 
			
		||||
#    This will create a target "${PROJECT_NAME}_translations" which will
 | 
			
		||||
#    convert the given input po files into the binary output mo file.
 | 
			
		||||
#    If the ALL option is used, the translations will also be created
 | 
			
		||||
#    when building the default target.
 | 
			
		||||
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# Copyright 2007-2009 Kitware, Inc.
 | 
			
		||||
# Copyright 2010-2011 Přemysl Janouch
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#     * Neither the name of the Kitware nor the names of contributors may be
 | 
			
		||||
#       used to endorse or promote products derived from this software
 | 
			
		||||
#       without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# 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_program (GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
 | 
			
		||||
find_program (GETTEXT_MSGFMT_EXECUTABLE msgfmt)
 | 
			
		||||
 | 
			
		||||
macro (GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg)
 | 
			
		||||
	# Make it a real variable, so we can modify it here.
 | 
			
		||||
	set (_firstPoFile "${_firstPoFileArg}")
 | 
			
		||||
 | 
			
		||||
	set (_gmoFiles)
 | 
			
		||||
	get_filename_component (_potBasename ${_potFile} NAME_WE)
 | 
			
		||||
	get_filename_component (_absPotFile ${_potFile} ABSOLUTE)
 | 
			
		||||
 | 
			
		||||
	set (_addToAll)
 | 
			
		||||
	if (${_firstPoFile} STREQUAL "ALL")
 | 
			
		||||
		set (_addToAll "ALL")
 | 
			
		||||
		set (_firstPoFile)
 | 
			
		||||
	endif (${_firstPoFile} STREQUAL "ALL")
 | 
			
		||||
 | 
			
		||||
	foreach (_currentPoFile ${_firstPoFile} ${ARGN})
 | 
			
		||||
		get_filename_component (_absFile ${_currentPoFile} ABSOLUTE)
 | 
			
		||||
		get_filename_component (_abs_PATH ${_absFile} PATH)
 | 
			
		||||
		get_filename_component (_lang ${_absFile} NAME_WE)
 | 
			
		||||
		set (_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)
 | 
			
		||||
 | 
			
		||||
		# msgmerge versions older than 0.11 don't actually support --update
 | 
			
		||||
		# and --backup, let's try to workaround that (tested on 0.10.40).
 | 
			
		||||
		execute_process (COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} -V
 | 
			
		||||
			OUTPUT_VARIABLE _msgmergeVersion)
 | 
			
		||||
		string (REGEX MATCH "0[.][0-9]+" _msgmergeVersion ${_msgmergeVersion})
 | 
			
		||||
		if ("${_msgmergeVersion}" MATCHES "[.]10|[.][0-9]")
 | 
			
		||||
			set (_msgmergeParams --quiet -s
 | 
			
		||||
				${_absFile} -o ${_absFile} ${_absPotFile})
 | 
			
		||||
		else ("${_msgmergeVersion}" MATCHES "[.]10|[.][0-9]")
 | 
			
		||||
			set (_msgmergeParams --quiet --update --backup=none -s
 | 
			
		||||
				${_absFile} ${_absPotFile})
 | 
			
		||||
		endif ("${_msgmergeVersion}" MATCHES "[.]10|[.][0-9]")
 | 
			
		||||
 | 
			
		||||
		add_custom_command (
 | 
			
		||||
			OUTPUT ${_gmoFile}
 | 
			
		||||
			COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} ${_msgmergeParams}
 | 
			
		||||
			COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
 | 
			
		||||
			DEPENDS ${_absPotFile} ${_absFile}
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		install (FILES ${_gmoFile} DESTINATION
 | 
			
		||||
			share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
 | 
			
		||||
		set (_gmoFiles ${_gmoFiles} ${_gmoFile})
 | 
			
		||||
	endforeach (_currentPoFile)
 | 
			
		||||
 | 
			
		||||
	add_custom_target (${PROJECT_NAME}_translations ${_addToAll}
 | 
			
		||||
		DEPENDS ${_gmoFiles})
 | 
			
		||||
endmacro (GETTEXT_CREATE_TRANSLATIONS)
 | 
			
		||||
 | 
			
		||||
include (FindPackageHandleStandardArgs)
 | 
			
		||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS (Gettext DEFAULT_MSG
 | 
			
		||||
	GETTEXT_MSGMERGE_EXECUTABLE GETTEXT_MSGFMT_EXECUTABLE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,373 +0,0 @@
 | 
			
		||||
# - Finding gtk-doc and building documentation
 | 
			
		||||
# This module provides the following function:
 | 
			
		||||
#
 | 
			
		||||
# GTK_DOC_RUN (
 | 
			
		||||
#   [ALL]
 | 
			
		||||
#   [MODULE <module-name>]
 | 
			
		||||
#   [WORKING_DIR <working-dir>]
 | 
			
		||||
#   SOURCE_DIRS <source-dir> ...
 | 
			
		||||
#   [IGNORE_FILES <file> ...]
 | 
			
		||||
#   [SCANGOBJ <library> [<link-libraries> ...]]
 | 
			
		||||
#   [{SGML | XML} [<mkdb-output-dir> [<mkdb-options>]]
 | 
			
		||||
#   [HTML <html-output-dir> <backend-options>]]
 | 
			
		||||
# )
 | 
			
		||||
#
 | 
			
		||||
# The function creates a target named <module-name>_gtkdocize
 | 
			
		||||
# which will build the documentation as specified by parameters.
 | 
			
		||||
#
 | 
			
		||||
#   ALL          - always build the target
 | 
			
		||||
#   MODULE       - the name of the module
 | 
			
		||||
#                  CMAKE_PROJECT_NAME by default
 | 
			
		||||
#   WORKING_DIR  - path to the working directory
 | 
			
		||||
#                  CMAKE_CURRENT_BINARY_DIR by default
 | 
			
		||||
#   SOURCE_DIRS  - documentation sources
 | 
			
		||||
#   IGNORE_FILES - ignore these files in the process
 | 
			
		||||
#   SCANGOBJ     - build an object hierarchy scanner
 | 
			
		||||
#   SGML         - make SGML output in the spec. directory
 | 
			
		||||
#   XML          - make XML output in the spec. directory
 | 
			
		||||
#   HTML         - make HTML output in the spec. directory
 | 
			
		||||
#                  (requires either SGML or XML)
 | 
			
		||||
#
 | 
			
		||||
# Also creates these virtual symbolic outputs if appropriate:
 | 
			
		||||
#   <module-name>_gtkdocize_scan
 | 
			
		||||
#   <module-name>_gtkdocize_scan_rebuild_types
 | 
			
		||||
#   <module-name>_gtkdocize_scan_rebuild_sections
 | 
			
		||||
#   <module-name>_gtkdocize_scan_gobject
 | 
			
		||||
#   <module-name>_gtkdocize_mkdb
 | 
			
		||||
#   <module-name>_gtkdocize_mkhtml
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# Copyright Přemysl Janouch 2010 - 2011
 | 
			
		||||
# 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.
 | 
			
		||||
#=============================================================================
 | 
			
		||||
 | 
			
		||||
# TODO
 | 
			
		||||
# ====
 | 
			
		||||
#  - Since it doesn't work without the full Unix environment,
 | 
			
		||||
#    it might be actually proper to use pkg-config
 | 
			
		||||
#
 | 
			
		||||
#  - <module-name>_gtkdocize_fixxref
 | 
			
		||||
#  - gtkdoc-rebase
 | 
			
		||||
#  - Content files (included by the main SGML file)
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
find_program (GTK_DOC_SCAN_EXECUTABLE "gtkdoc-scan")
 | 
			
		||||
find_program (GTK_DOC_SCANGOBJ_EXECUTABLE "gtkdoc-scangobj")
 | 
			
		||||
find_program (GTK_DOC_MKTMPL_EXECUTABLE "gtkdoc-mktmpl")
 | 
			
		||||
find_program (GTK_DOC_MKDB_EXECUTABLE "gtkdoc-mkdb")
 | 
			
		||||
find_program (GTK_DOC_MKHTML_EXECUTABLE "gtkdoc-mkhtml")
 | 
			
		||||
find_program (GTK_DOC_FIXXREF_EXECUTABLE "gtkdoc-fixxref")
 | 
			
		||||
 | 
			
		||||
mark_as_advanced (GTK_DOC_SCAN_EXECUTABLE GTK_DOC_SCANGOBJ_EXECUTABLE
 | 
			
		||||
	GTK_DOC_MKTMPL_EXECUTABLE GTK_DOC_MKDB_EXECUTABLE
 | 
			
		||||
	GTK_DOC_MKHTML_EXECUTABLE GTK_DOC_FIXXREF_EXECUTABLE)
 | 
			
		||||
 | 
			
		||||
include (FindPackageHandleStandardArgs)
 | 
			
		||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS (GTK_DOC DEFAULT_MSG GTK_DOC_SCAN_EXECUTABLE)
 | 
			
		||||
 | 
			
		||||
include (ProcessArguments)
 | 
			
		||||
 | 
			
		||||
function (GTK_DOC_RUN)
 | 
			
		||||
	# Parse arguments given to this function
 | 
			
		||||
	set (__names  ALL  MODULE  WORKING_DIR  SOURCE_DIRS  IGNORE_FILES)
 | 
			
		||||
	set (__need   NO   NO      NO           YES          NO)
 | 
			
		||||
	set (__want   0    1       1            1            1)
 | 
			
		||||
	set (__more   NO   NO      NO           YES          YES)
 | 
			
		||||
	set (__skip   0    0       0            0            0)
 | 
			
		||||
 | 
			
		||||
	list (APPEND __names  SCANGOBJ  SGML  XML  HTML)
 | 
			
		||||
	list (APPEND __need   NO        NO    NO   NO)
 | 
			
		||||
	list (APPEND __want   1         0     0    1)
 | 
			
		||||
	list (APPEND __more   YES       YES   YES  YES)
 | 
			
		||||
	list (APPEND __skip   0         1     0    0)
 | 
			
		||||
 | 
			
		||||
	set (__argv ${ARGV})
 | 
			
		||||
	PROCESS_ARGUMENTS (__argv __names __need __want __more __skip "_opt_")
 | 
			
		||||
 | 
			
		||||
	# Further process the arguments
 | 
			
		||||
	if (_opt_all)
 | 
			
		||||
		set (_all ALL)
 | 
			
		||||
	else (_opt_all)
 | 
			
		||||
		set (_all)
 | 
			
		||||
	endif (_opt_all)
 | 
			
		||||
 | 
			
		||||
	if (_opt_module)
 | 
			
		||||
		set (_module_name ${_opt_module_param})
 | 
			
		||||
	else (_opt_module)
 | 
			
		||||
		set (_module_name ${CMAKE_PROJECT_NAME})
 | 
			
		||||
	endif (_opt_module)
 | 
			
		||||
 | 
			
		||||
	if (_opt_working_dir)
 | 
			
		||||
		set (_working_dir ${_opt_working_dir_param})
 | 
			
		||||
	else (_opt_working_dir)
 | 
			
		||||
		set (_working_dir ${CMAKE_CURRENT_BINARY_DIR})
 | 
			
		||||
	endif (_opt_working_dir)
 | 
			
		||||
 | 
			
		||||
	set (_source_dirs)
 | 
			
		||||
	foreach (_dir ${_opt_source_dirs_param})
 | 
			
		||||
		list (APPEND _source_dirs "--source-dir" "${_dir}")
 | 
			
		||||
	endforeach (_dir)
 | 
			
		||||
 | 
			
		||||
	set (_ignores)
 | 
			
		||||
	if (_opt_ignore_files)
 | 
			
		||||
		foreach (_file ${_opt_ignore_files_param})
 | 
			
		||||
			set (_ignores "${_ignores} ${_file}")
 | 
			
		||||
		endforeach (_file)
 | 
			
		||||
		string (STRIP "${_ignores}" _ignores)
 | 
			
		||||
	endif (_opt_ignore_files)
 | 
			
		||||
 | 
			
		||||
	if (_opt_sgml)
 | 
			
		||||
		set (_mkdb_format "sgml")
 | 
			
		||||
		set (_mkdb_options "${_opt_sgml_param}")
 | 
			
		||||
	elseif (_opt_xml)
 | 
			
		||||
		set (_mkdb_format "xml")
 | 
			
		||||
		set (_mkdb_options "${_opt_xml_param}")
 | 
			
		||||
	else (_opt_sgml)
 | 
			
		||||
		set (_mkdb_format OFF)
 | 
			
		||||
	endif (_opt_sgml)
 | 
			
		||||
 | 
			
		||||
	if (_mkdb_format)
 | 
			
		||||
		set (_mkdb_driver ${_working_dir}/${_module_name}-docs.${_mkdb_format})
 | 
			
		||||
		list (LENGTH _mkdb_options _length)
 | 
			
		||||
		if (${_length} GREATER 0)
 | 
			
		||||
			list (GET _mkdb_options 0 _mkdb_output_dir)
 | 
			
		||||
			list (REMOVE_AT _mkdb_options 0)
 | 
			
		||||
		else (${_length} GREATER 0)
 | 
			
		||||
			set (_mkdb_output_dir ${_working_dir}/${_mkdb_format})
 | 
			
		||||
		endif (${_length} GREATER 0)
 | 
			
		||||
	endif (_mkdb_format)
 | 
			
		||||
 | 
			
		||||
	# The basic target name
 | 
			
		||||
	set (_target_name ${_module_name}_gtkdocize)
 | 
			
		||||
 | 
			
		||||
	# Scan the source files
 | 
			
		||||
	set (_scan_target_base
 | 
			
		||||
	# These files are created if they don't exist
 | 
			
		||||
	#	        ${_working_dir}/${_module_name}.types
 | 
			
		||||
	#	        ${_working_dir}/${_module_name}-sections.txt
 | 
			
		||||
	#	        ${_working_dir}/${_module_name}-overrides.txt
 | 
			
		||||
		        ${_working_dir}/${_module_name}-decl.txt
 | 
			
		||||
		        ${_working_dir}/${_module_name}-decl-list.txt
 | 
			
		||||
		COMMAND ${GTK_DOC_SCAN_EXECUTABLE}
 | 
			
		||||
		        --module=${_module_name}
 | 
			
		||||
		        ${_source_dirs} "--ignore-headers=${_ignores}"
 | 
			
		||||
		        --output-dir=${_working_dir})
 | 
			
		||||
	add_custom_command (
 | 
			
		||||
		OUTPUT ${_target_name}_scan
 | 
			
		||||
		${_scan_target_base}
 | 
			
		||||
		COMMENT "Calling gtkdoc-scan" VERBATIM)
 | 
			
		||||
 | 
			
		||||
	# Special target to force rebuild of ${_module_name}.types
 | 
			
		||||
	add_custom_command (
 | 
			
		||||
		OUTPUT ${_target_name}_scan_rebuild_types
 | 
			
		||||
		${_scan_target_base} --rebuild-types
 | 
			
		||||
		COMMENT "Calling gtkdoc-scan to rebuild types" VERBATIM)
 | 
			
		||||
	add_custom_target (${_target_name}_rebuild_types
 | 
			
		||||
		DEPENDS ${_target_name}_scan_rebuild_types)
 | 
			
		||||
 | 
			
		||||
	# Special target to force rebuild of ${_module_name}-sections.txt
 | 
			
		||||
	add_custom_command (
 | 
			
		||||
		OUTPUT ${_target_name}_scan_rebuild_sections
 | 
			
		||||
		${_scan_target_base} --rebuild-sections
 | 
			
		||||
		COMMENT "Calling gtkdoc-scan to rebuild sections" VERBATIM)
 | 
			
		||||
	add_custom_target (${_target_name}_rebuild_sections
 | 
			
		||||
		DEPENDS ${_target_name}_scan_rebuild_sections)
 | 
			
		||||
 | 
			
		||||
	set_source_files_properties (
 | 
			
		||||
		${_target_name}_scan
 | 
			
		||||
		${_target_name}_scan_rebuild_types
 | 
			
		||||
		${_target_name}_scan_rebuild_sections
 | 
			
		||||
		PROPERTIES SYMBOLIC TRUE)
 | 
			
		||||
	set (_top_output ${_target_name}_scan)
 | 
			
		||||
 | 
			
		||||
	# Scan the object hierarchy
 | 
			
		||||
	# This is a terrible hack, but there's no other way around.
 | 
			
		||||
	if (_opt_scangobj)
 | 
			
		||||
		# Put all include directories into CFLAGS
 | 
			
		||||
		set (_cflags)
 | 
			
		||||
		get_directory_property (_include_dirs INCLUDE_DIRECTORIES)
 | 
			
		||||
		foreach (_dir ${_include_dirs})
 | 
			
		||||
			set (_cflags "${_cflags} -I${_dir}")
 | 
			
		||||
		endforeach (_dir)
 | 
			
		||||
 | 
			
		||||
		# Put all libraries to LDFLAGS
 | 
			
		||||
		set (_ldflags "-L${CMAKE_CURRENT_BINARY_DIR}")
 | 
			
		||||
		set (_lib_depends)
 | 
			
		||||
		set (_lib_dir_used)
 | 
			
		||||
		foreach (_lib ${_opt_scangobj_param} ${CMAKE_STANDARD_LIBRARIES})
 | 
			
		||||
			get_filename_component (_lib_dir ${_lib} PATH)
 | 
			
		||||
			get_filename_component (_lib_name ${_lib} NAME)
 | 
			
		||||
 | 
			
		||||
			# If it's not a target, suppose it's a shared library
 | 
			
		||||
			get_target_property (_target_type ${_lib_name} TYPE)
 | 
			
		||||
			if (_target_type)
 | 
			
		||||
				get_target_property (_lib_output_name ${_lib_name} OUTPUT_NAME)
 | 
			
		||||
				if (_lib_output_name)
 | 
			
		||||
					set (_lib_name ${_lib_output_name})
 | 
			
		||||
				endif (_lib_output_name)
 | 
			
		||||
				list (APPEND _lib_depends ${_lib_name})
 | 
			
		||||
			else (_target_type)
 | 
			
		||||
				list (FIND _lib_dir_used "${_lib_dir}" _lib_dir_found)
 | 
			
		||||
				if (_lib_dir AND _lib_dir_found EQUAL "-1")
 | 
			
		||||
					set (_ldflags "${_ldflags} -L${_lib_dir}")
 | 
			
		||||
					list (APPEND _lib_dir_used ${_lib_dir})
 | 
			
		||||
				endif (_lib_dir AND _lib_dir_found EQUAL "-1")
 | 
			
		||||
 | 
			
		||||
				string (REGEX REPLACE "^${CMAKE_SHARED_LIBRARY_PREFIX}" ""
 | 
			
		||||
					_lib_name "${_lib_name}")
 | 
			
		||||
				string (REGEX REPLACE "${CMAKE_SHARED_LIBRARY_SUFFIX}\$" ""
 | 
			
		||||
					_lib_name "${_lib_name}")
 | 
			
		||||
			endif (_target_type)
 | 
			
		||||
 | 
			
		||||
			set (_ldflags "${_ldflags} -l${_lib_name}")
 | 
			
		||||
		endforeach (_lib)
 | 
			
		||||
 | 
			
		||||
		add_custom_command (
 | 
			
		||||
			OUTPUT ${_target_name}_scan_gobject
 | 
			
		||||
			       ${_working_dir}/${_module_name}.signals
 | 
			
		||||
			       ${_working_dir}/${_module_name}.hierarchy
 | 
			
		||||
			       ${_working_dir}/${_module_name}.interfaces
 | 
			
		||||
			       ${_working_dir}/${_module_name}.prerequisites
 | 
			
		||||
			       ${_working_dir}/${_module_name}.args
 | 
			
		||||
			COMMAND "CC=${CMAKE_C_COMPILER}" "CFLAGS=${_cflags}"
 | 
			
		||||
			        "LD=${CMAKE_C_COMPILER}" "LDFLAGS=${_ldflags}"
 | 
			
		||||
			        "RUN=" ${GTK_DOC_SCANGOBJ_EXECUTABLE}
 | 
			
		||||
			        --module=${_module_name} --output-dir=${_working_dir}
 | 
			
		||||
			DEPENDS ${_top_output} ${_lib_depends}
 | 
			
		||||
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
 | 
			
		||||
			COMMENT "Calling gtkdoc-scangobj")
 | 
			
		||||
 | 
			
		||||
		set_source_files_properties (${_target_name}_scan_gobject
 | 
			
		||||
			PROPERTIES SYMBOLIC TRUE)
 | 
			
		||||
		set (_top_output ${_target_name}_scan_gobject)
 | 
			
		||||
	endif (_opt_scangobj)
 | 
			
		||||
 | 
			
		||||
	# Create XML or SGML files
 | 
			
		||||
	if (_mkdb_format)
 | 
			
		||||
		add_custom_command (
 | 
			
		||||
			OUTPUT ${_target_name}_mkdb
 | 
			
		||||
			       ${_mkdb_output_dir}
 | 
			
		||||
			       ${_working_dir}/sgml.stamp
 | 
			
		||||
			       ${_working_dir}/${_module_name}-undeclared.txt
 | 
			
		||||
			       ${_working_dir}/${_module_name}-undocumented.txt
 | 
			
		||||
			       ${_working_dir}/${_module_name}-unused.txt
 | 
			
		||||
		# --outputallsymbols --outputsymbolswithoutsince
 | 
			
		||||
		#	       ${_working_dir}/${_module_name}-symbols.txt
 | 
			
		||||
		#	       ${_working_dir}/${_module_name}-nosince.txt
 | 
			
		||||
			COMMAND ${CMAKE_COMMAND} -E remove_directory ${_mkdb_output_dir}
 | 
			
		||||
			COMMAND ${GTK_DOC_MKDB_EXECUTABLE}
 | 
			
		||||
			        --module=${_module_name}
 | 
			
		||||
			        ${_source_dirs} "--ignore-files=${_ignores}"
 | 
			
		||||
			        --output-format=${_mkdb_format}
 | 
			
		||||
			        --output-dir=${_mkdb_output_dir}
 | 
			
		||||
			        ${_mkdb_options} --main-sgml-file=${_mkdb_driver}
 | 
			
		||||
			DEPENDS ${_top_output}
 | 
			
		||||
			WORKING_DIRECTORY ${_working_dir}
 | 
			
		||||
			COMMENT "Calling gtkdoc-mkdb" VERBATIM)
 | 
			
		||||
 | 
			
		||||
		set_source_files_properties (${_target_name}_mkdb
 | 
			
		||||
			PROPERTIES SYMBOLIC TRUE)
 | 
			
		||||
		set (_top_output ${_target_name}_mkdb)
 | 
			
		||||
	endif (_mkdb_format)
 | 
			
		||||
 | 
			
		||||
	# Create HTML documentation
 | 
			
		||||
	if (_opt_html)
 | 
			
		||||
		if (NOT _mkdb_format)
 | 
			
		||||
			message (FATAL_ERROR "Given HTML but neither XML nor SGML")
 | 
			
		||||
		endif (NOT _mkdb_format)
 | 
			
		||||
 | 
			
		||||
		list (GET _opt_html_param 0 _html_output_dir)
 | 
			
		||||
		list (REMOVE_AT _opt_html_param 0)
 | 
			
		||||
 | 
			
		||||
		add_custom_command (
 | 
			
		||||
			OUTPUT ${_target_name}_mkhtml
 | 
			
		||||
			       ${_html_output_dir}/../html.stamp
 | 
			
		||||
		# We probably don't want this to be removed either
 | 
			
		||||
		#	       ${_html_output_dir}
 | 
			
		||||
			COMMAND ${CMAKE_COMMAND} -E remove_directory ${_html_output_dir}
 | 
			
		||||
			COMMAND ${CMAKE_COMMAND} -E make_directory ${_html_output_dir}
 | 
			
		||||
			COMMAND ${CMAKE_COMMAND} -E chdir ${_html_output_dir}
 | 
			
		||||
			        ${GTK_DOC_MKHTML_EXECUTABLE}
 | 
			
		||||
			        ${_module_name} ${_mkdb_driver} ${_opt_html_param}
 | 
			
		||||
			DEPENDS ${_top_output}
 | 
			
		||||
			COMMENT "Calling gtkdoc-mkhtml" VERBATIM)
 | 
			
		||||
 | 
			
		||||
		set_source_files_properties (${_target_name}_mkhtml
 | 
			
		||||
			PROPERTIES SYMBOLIC TRUE)
 | 
			
		||||
		set (_top_output ${_target_name}_mkhtml)
 | 
			
		||||
	endif (_opt_html)
 | 
			
		||||
 | 
			
		||||
	# gtkdoc-fixxref
 | 
			
		||||
	#   ? copy ${_html_output_dir} to CMAKE_BINARY_DIR,
 | 
			
		||||
	#     run gtkdoc-fixxref in there and install the directory
 | 
			
		||||
	#      -> FIXXREF <output-dir> [INSTALL]
 | 
			
		||||
	#
 | 
			
		||||
	#? set (_fixxref_dir ${CMAKE_CURRENT_BINARY_DIR}/html-fixxref)
 | 
			
		||||
	# add_custom_command (
 | 
			
		||||
	#	OUTPUT ${_target_name}_fixxref
 | 
			
		||||
	#?	       ${_fixxref_dir}
 | 
			
		||||
	#?	COMMAND ${CMAKE_COMMAND} -E remove_directory ${_fixxref_dir}
 | 
			
		||||
	#?	COMMAND ${CMAKE_COMMAND} -E copy_directory
 | 
			
		||||
	#?	        ${_html_output_dir} ${_fixxref_dir}
 | 
			
		||||
	#	COMMAND ${GTK_DOC_FIXXREF_EXECUTABLE}
 | 
			
		||||
	#	        --module=${_module_name}
 | 
			
		||||
	#	        --module-dir=${_html_output_dir}
 | 
			
		||||
	#?	        --module-dir=${_fixxref_dir}
 | 
			
		||||
	#	DEPENDS ${_html_output_dir}
 | 
			
		||||
	#	WORKING_DIRECTORY ${_working_dir}
 | 
			
		||||
	#	COMMENT "Calling gtkdoc-fixxref" VERBATIM)
 | 
			
		||||
	#? install (DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html-fixxref/
 | 
			
		||||
	#?          DESTINATION share/gtk-doc/html/${_module_name})
 | 
			
		||||
	#&          COMPONENT docs) -- see CPack component install
 | 
			
		||||
 | 
			
		||||
	# gtkdoc-rebase -- how to do this?
 | 
			
		||||
	#
 | 
			
		||||
	# Probably omit this because source tarball cannot be hooked
 | 
			
		||||
	# to do some action before.
 | 
			
		||||
	#  -> Custom dist target?
 | 
			
		||||
	#     add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
 | 
			
		||||
	#  -> ${_html_output_dir} could contain online links by default,
 | 
			
		||||
	#     then it could be copied to binary dir and rebased to relative
 | 
			
		||||
	#       * Looks like a very good idea, can work even without gtk-doc
 | 
			
		||||
	#  -> Or it can be first xreffed in the binary dir and then
 | 
			
		||||
	#     converted to online links in ${_html_output_dir}
 | 
			
		||||
	#       * Which one of those should be installed?
 | 
			
		||||
	#         The one in the binary directory or should the
 | 
			
		||||
	#         ${_html_output_dir} be rebased?
 | 
			
		||||
	#       * A rebasing custom command may create the binary directory
 | 
			
		||||
	#         if it doesn't exist
 | 
			
		||||
	#
 | 
			
		||||
	# When creating the source tarball for distribution,
 | 
			
		||||
	# gtkdoc-rebase turns all external links into web-links.
 | 
			
		||||
	# When installing distributed (pregenerated) docs the same
 | 
			
		||||
	# application will try to turn links back to local links
 | 
			
		||||
	# (where those docs are installed).
 | 
			
		||||
 | 
			
		||||
	add_custom_target (${_target_name} ${_all}
 | 
			
		||||
		DEPENDS ${_top_output})
 | 
			
		||||
endfunction (GTK_DOC_RUN)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,58 +0,0 @@
 | 
			
		||||
# - Find json-glib
 | 
			
		||||
# This module looks for json-glib.
 | 
			
		||||
# This module defines the following values:
 | 
			
		||||
#    JSON_GLIB_FOUND
 | 
			
		||||
#    JSON_GLIB_INCLUDE_DIRS
 | 
			
		||||
#    JSON_GLIB_LIBRARIES
 | 
			
		||||
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# Copyright Přemysl Janouch 2010
 | 
			
		||||
# 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_path (JSON_GLIB_INCLUDE_DIR json-glib/json-glib.h
 | 
			
		||||
	PATH_SUFFIXES json-glib-1.0)
 | 
			
		||||
 | 
			
		||||
find_path (JSON_GLIB_INCLUDE_DIR_GOBJECT glib-object.h
 | 
			
		||||
	PATH_SUFFIXES glib-2.0)
 | 
			
		||||
 | 
			
		||||
find_path (JSON_GLIB_INCLUDE_DIR_GLIBCONFIG glibconfig.h
 | 
			
		||||
	PATHS /usr/lib
 | 
			
		||||
	PATH_SUFFIXES glib-2.0 glib-2.0/include)
 | 
			
		||||
 | 
			
		||||
find_library (JSON_GLIB_LIBRARIES json-glib-1.0)
 | 
			
		||||
 | 
			
		||||
include (FindPackageHandleStandardArgs)
 | 
			
		||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS (JSON_GLIB DEFAULT_MSG JSON_GLIB_LIBRARIES
 | 
			
		||||
	JSON_GLIB_INCLUDE_DIR JSON_GLIB_INCLUDE_DIR_GOBJECT JSON_GLIB_INCLUDE_DIR_GLIBCONFIG)
 | 
			
		||||
 | 
			
		||||
set (JSON_GLIB_INCLUDE_DIRS
 | 
			
		||||
	${JSON_GLIB_INCLUDE_DIR}
 | 
			
		||||
	${JSON_GLIB_INCLUDE_DIR_GOBJECT}
 | 
			
		||||
	${JSON_GLIB_INCLUDE_DIR_GLIBCONFIG})
 | 
			
		||||
 | 
			
		||||
unset (JSON_GLIB_INCLUDE_DIR CACHE)
 | 
			
		||||
unset (JSON_GLIB_INCLUDE_DIR_GOBJECT CACHE)
 | 
			
		||||
unset (JSON_GLIB_INCLUDE_DIR_GLIBCONFIG CACHE)
 | 
			
		||||
mark_as_advanced (JSON_GLIB_LIBRARIES JSON_GLIB_INCLUDE_DIRS)
 | 
			
		||||
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
#    LIBINTL_LIBRARIES
 | 
			
		||||
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# Copyright Přemysl Janouch 2011
 | 
			
		||||
# Copyright 2011 Přemysl Eric Janouch
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
#=============================================================================
 | 
			
		||||
# Copyright Přemysl Janouch 2010
 | 
			
		||||
# Copyright 2010 Přemysl Eric Janouch
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								config.h.in
									
									
									
									
									
								
							
							
						
						@@ -9,12 +9,15 @@
 | 
			
		||||
#define __CONFIG_H__
 | 
			
		||||
 | 
			
		||||
#define PROJECT_NAME "${PROJECT_NAME}"
 | 
			
		||||
#define PROJECT_VERSION "${project_VERSION}"
 | 
			
		||||
#define PROJECT_VERSION "${PROJECT_VERSION}"
 | 
			
		||||
#define PROJECT_URL "${project_URL}"
 | 
			
		||||
 | 
			
		||||
#if ${OPTION_NOINSTALL}
 | 
			
		||||
#cmakedefine OPTION_NOINSTALL
 | 
			
		||||
 | 
			
		||||
#ifdef OPTION_NOINSTALL
 | 
			
		||||
	/* For developers. */
 | 
			
		||||
	#define PROJECT_SHARE_DIR "${CMAKE_SOURCE_DIR}/share/"
 | 
			
		||||
	#define PROJECT_GSETTINGS_DIR "${CMAKE_BINARY_DIR}"
 | 
			
		||||
#elif defined (_WIN32)
 | 
			
		||||
	#define PROJECT_SHARE_DIR "share/${PROJECT_NAME}/"
 | 
			
		||||
#else
 | 
			
		||||
@@ -22,10 +25,6 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#cmakedefine HAVE_SANE___RESTRICT
 | 
			
		||||
#cmakedefine HAVE_RESTRICT
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <glib/gi18n.h>
 | 
			
		||||
 | 
			
		||||
#define GETTEXT_DOMAIN "${PROJECT_NAME}"
 | 
			
		||||
@@ -36,14 +35,6 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_SANE___RESTRICT
 | 
			
		||||
	#ifdef HAVE_RESTRICT
 | 
			
		||||
		#define __restrict restrict
 | 
			
		||||
	#else
 | 
			
		||||
		#define __restrict
 | 
			
		||||
	#endif
 | 
			
		||||
#endif /* ! HAVE_SANE___RESTRICT */
 | 
			
		||||
 | 
			
		||||
/* We have to remove nodes first due to a bug in json-glib. */
 | 
			
		||||
#define json_object_set_member(object, name, node) \
 | 
			
		||||
	G_STMT_START { \
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								docs/user-guide/gitea.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 46 KiB  | 
| 
		 Before Width: | Height: | Size: 60 KiB  | 
| 
		 Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 22 KiB  | 
| 
		 Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 22 KiB  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB  | 
							
								
								
									
										148
									
								
								docs/user-guide/user-guide-cs.asciidoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,148 @@
 | 
			
		||||
// 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[]
 | 
			
		||||
 ... 
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
@@ -1,148 +0,0 @@
 | 
			
		||||
%&program=xelatex
 | 
			
		||||
%&encoding=UTF-8 Unicode
 | 
			
		||||
 | 
			
		||||
\documentclass[12pt,oneside,a4paper,titlepage,final]{article}
 | 
			
		||||
\usepackage{fontspec}
 | 
			
		||||
\usepackage{indentfirst}
 | 
			
		||||
\usepackage{setspace}
 | 
			
		||||
\usepackage{graphicx}
 | 
			
		||||
\usepackage[czech]{babel}
 | 
			
		||||
\usepackage[pdfborder={0 0 0},pdfpagelabels=true,plainpages=false]{hyperref}
 | 
			
		||||
\usepackage[all]{hypcap}
 | 
			
		||||
 | 
			
		||||
\usepackage{amsmath}
 | 
			
		||||
\usepackage{amsthm}
 | 
			
		||||
 | 
			
		||||
\newtheoremstyle{note}{\parskip}{0pt}{}{\parindent}{\bfseries}{:}{.5em}{}
 | 
			
		||||
\theoremstyle{note}
 | 
			
		||||
\newtheorem*{warning}{Pozor}
 | 
			
		||||
 | 
			
		||||
% Better quotations
 | 
			
		||||
\renewcommand*{\uv}[1]{\quotedblbase #1\textquotedblleft}
 | 
			
		||||
 | 
			
		||||
% Metadata
 | 
			
		||||
\newcommand{\gettitle}{logdiag}
 | 
			
		||||
\newcommand{\getsubtitle}{Průvodce uživatele}
 | 
			
		||||
\newcommand{\getauthor}{Přemysl Janouch}
 | 
			
		||||
\newcommand{\getdate}{6. března 2011}
 | 
			
		||||
 | 
			
		||||
\hypersetup{pdftitle={\gettitle{} --- \getsubtitle},pdfauthor={\getauthor}}
 | 
			
		||||
 | 
			
		||||
\begin{document}
 | 
			
		||||
 | 
			
		||||
% Number the first pages with roman numerals
 | 
			
		||||
\renewcommand{\thepage}{\roman{page}}
 | 
			
		||||
 | 
			
		||||
% The title page has no header or footer at all
 | 
			
		||||
\thispagestyle{empty}
 | 
			
		||||
 | 
			
		||||
\begin{center}
 | 
			
		||||
	\doublespacing
 | 
			
		||||
	\textbf{\LARGE\gettitle}\\{\Large\getsubtitle}
 | 
			
		||||
	\par\getauthor
 | 
			
		||||
	\par\getdate
 | 
			
		||||
	\vfill
 | 
			
		||||
	\includegraphics{logdiag-cs}
 | 
			
		||||
	\newpage
 | 
			
		||||
\end{center}
 | 
			
		||||
 | 
			
		||||
\tableofcontents
 | 
			
		||||
\newpage
 | 
			
		||||
 | 
			
		||||
% Number the real content with arabic numerals and show them in the footer
 | 
			
		||||
\renewcommand{\thepage}{\arabic{page}}
 | 
			
		||||
\setcounter{page}{1}
 | 
			
		||||
 | 
			
		||||
\section{Ú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.
 | 
			
		||||
 | 
			
		||||
\section{Získání aplikace}
 | 
			
		||||
Nejnovější verzi aplikace je možné stáhnout na následující webové adrese: \mbox{\url{http://github.com/pjanouch/logdiag}}.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics[width=\textwidth,keepaspectratio]{github}
 | 
			
		||||
	\caption{Nabídka pro stahování na githubu}
 | 
			
		||||
	\label{github-download}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
Až se ocitnete na githubu, vyhledejte po pravé straně tlačítko s~nápisem \uv{Downloads}, případně \uv{Soubory ke stažení}, a~klepněte na něj. Zobrazí se před vámi nabídka balíčků. Instalační soubor pro Microsoft Windows nese název ve stylu \uv{logdiag-\emph{verze}-Windows-x86.exe}.
 | 
			
		||||
 | 
			
		||||
\section{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.
 | 
			
		||||
 | 
			
		||||
\begin{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.
 | 
			
		||||
\end{warning}
 | 
			
		||||
 | 
			
		||||
\section{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.
 | 
			
		||||
 | 
			
		||||
\subsection{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.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics{select-objects}
 | 
			
		||||
	\caption{Výběr objektů v~oblasti}
 | 
			
		||||
	\label{select-objects}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
Alternativně můžete táhnout myší z~volné oblasti diagramu do prostoru, viz obrázek \ref{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.
 | 
			
		||||
 | 
			
		||||
\subsection{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.
 | 
			
		||||
 | 
			
		||||
\subsection{Odstranění objektů}
 | 
			
		||||
Objekty odstraníte stisknutím klávesy Delete, případně z~menu aplikace.
 | 
			
		||||
 | 
			
		||||
\subsection{Vložení značky}
 | 
			
		||||
\emph{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, viz obrázek \ref{select-symbol}. Po kliknutí na vámi vybranou značku klikněte znovu do diagramu na místo, kde ji chcete umístit.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics{select-symbol}
 | 
			
		||||
	\caption{Výběr značky z~nabídky}
 | 
			
		||||
	\label{select-symbol}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\subsection{Otáčení značek}
 | 
			
		||||
Otočit značku vloženou do diagramu můžete přes pravé tlačítko myši.
 | 
			
		||||
 | 
			
		||||
\subsection{Propojení terminálů}
 | 
			
		||||
\emph{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.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics{create-connection-begin} \hspace{15pt} \includegraphics{create-connection-end}
 | 
			
		||||
	\caption{Propojení terminálů dvou značek}
 | 
			
		||||
	\label{create-connection}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\section{Časté problémy}
 | 
			
		||||
\subsection{Nelze otevřít uložený diagram}
 | 
			
		||||
Při ukládání se ujistěte, že zadaný název souboru obsahuje příponu \uv{.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.
 | 
			
		||||
 | 
			
		||||
\subsection{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.
 | 
			
		||||
 | 
			
		||||
\subsection{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.
 | 
			
		||||
 | 
			
		||||
\end{document}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										146
									
								
								docs/user-guide/user-guide-en.asciidoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,146 @@
 | 
			
		||||
// 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[]
 | 
			
		||||
 ... 
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
@@ -1,134 +0,0 @@
 | 
			
		||||
%&program=xelatex
 | 
			
		||||
%&encoding=UTF-8 Unicode
 | 
			
		||||
 | 
			
		||||
\documentclass[12pt,oneside,a4paper,titlepage,final]{article}
 | 
			
		||||
\usepackage{fontspec}
 | 
			
		||||
\usepackage{indentfirst}
 | 
			
		||||
\usepackage{setspace}
 | 
			
		||||
\usepackage{graphicx}
 | 
			
		||||
\usepackage[english]{babel}
 | 
			
		||||
\usepackage[pdfborder={0 0 0},pdfpagelabels=true,plainpages=false]{hyperref}
 | 
			
		||||
\usepackage[all]{hypcap}
 | 
			
		||||
 | 
			
		||||
\usepackage{amsmath}
 | 
			
		||||
\usepackage{amsthm}
 | 
			
		||||
 | 
			
		||||
\newtheoremstyle{note}{\parskip}{0pt}{}{\parindent}{\bfseries}{:}{.5em}{}
 | 
			
		||||
\theoremstyle{note}
 | 
			
		||||
\newtheorem*{warning}{Warning}
 | 
			
		||||
 | 
			
		||||
% Better quotations
 | 
			
		||||
\newcommand*{\uv}[1]{"#1"}
 | 
			
		||||
 | 
			
		||||
% Metadata
 | 
			
		||||
\newcommand{\gettitle}{logdiag}
 | 
			
		||||
\newcommand{\getsubtitle}{User Guide}
 | 
			
		||||
\newcommand{\getauthor}{Přemysl Janouch}
 | 
			
		||||
\newcommand{\getdate}{6. March 2011}
 | 
			
		||||
 | 
			
		||||
\hypersetup{pdftitle={\gettitle{} --- \getsubtitle},pdfauthor={\getauthor}}
 | 
			
		||||
 | 
			
		||||
\begin{document}
 | 
			
		||||
 | 
			
		||||
% Number the first pages with roman numerals
 | 
			
		||||
\renewcommand{\thepage}{\roman{page}}
 | 
			
		||||
 | 
			
		||||
% The title page has no header or footer at all
 | 
			
		||||
\thispagestyle{empty}
 | 
			
		||||
 | 
			
		||||
\begin{center}
 | 
			
		||||
	\doublespacing
 | 
			
		||||
	\textbf{\LARGE\gettitle}\\{\Large\getsubtitle}
 | 
			
		||||
	\par\getauthor
 | 
			
		||||
	\par\getdate
 | 
			
		||||
	\vfill
 | 
			
		||||
	\includegraphics{logdiag-en}
 | 
			
		||||
	\newpage
 | 
			
		||||
\end{center}
 | 
			
		||||
 | 
			
		||||
\tableofcontents
 | 
			
		||||
\newpage
 | 
			
		||||
 | 
			
		||||
% Number the real content with arabic numerals and show them in the footer
 | 
			
		||||
\renewcommand{\thepage}{\arabic{page}}
 | 
			
		||||
\setcounter{page}{1}
 | 
			
		||||
 | 
			
		||||
\section{Introduction}
 | 
			
		||||
This document will guide you through the application and help to familiarize you with it. The description of tasks is preferentially related to the Microsoft Windows operating system, though it's also valid for other operating systems to a certain extent.
 | 
			
		||||
 | 
			
		||||
\section{Getting the application}
 | 
			
		||||
Download the newest version of the application at the following web address: \mbox{\url{http://github.com/pjanouch/logdiag}}.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics[width=\textwidth,keepaspectratio]{github}
 | 
			
		||||
	\caption{The download menu at github}
 | 
			
		||||
	\label{github-download}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
While at github, look for a button entitled \uv{Downloads} at the right side of the page and click on it. A menu with packages appears. The installation file for Microsoft Windows is named \uv{logdiag-\emph{version}-Windows-x86.exe}.
 | 
			
		||||
 | 
			
		||||
\section{Installation}
 | 
			
		||||
The installation process is quite straight-forward. After the initial screen the license agreement is required. Next, choose a folder in which to install the application and another one for placement in the Start menu. As long as no unexpected error has occurred, all that's left is confirming a successful installation.
 | 
			
		||||
 | 
			
		||||
\begin{warning}
 | 
			
		||||
	If the application is installed to 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.
 | 
			
		||||
\end{warning}
 | 
			
		||||
 | 
			
		||||
\section{Operations with objects}
 | 
			
		||||
Each diagram consists of objects, and these are joined with the operations described below. To cancel any current operation, press the Escape key.
 | 
			
		||||
 | 
			
		||||
\subsection{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.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics{select-objects}
 | 
			
		||||
	\caption{Selecting objects inside an area}
 | 
			
		||||
	\label{select-objects}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
Alternatively drag the mouse from free space within the diagram into the area, see figure \ref{select-objects}. Objects contained in this rectangle will be selected. The selection may later be dismissed by just clicking into free space.
 | 
			
		||||
 | 
			
		||||
\subsection{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.
 | 
			
		||||
 | 
			
		||||
\subsection{Removing objects}
 | 
			
		||||
Remove objects either by pressing the Delete key or from the application menu.
 | 
			
		||||
 | 
			
		||||
\subsection{Inserting symbols}
 | 
			
		||||
\emph{Symbols} constitute the most important kind of objects. Insert them into the diagram by choosing one from the symbol menu located at the left side of the main application window, see figure \ref{select-symbol}. After clicking on a symbol, click again into the diagram where the symbol is to be placed.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics{select-symbol}
 | 
			
		||||
	\caption{Choosing a symbol from the menu}
 | 
			
		||||
	\label{select-symbol}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\subsection{Rotating symbols}
 | 
			
		||||
Rotate a symbol inserted into the diagram by right-clicking on it.
 | 
			
		||||
 | 
			
		||||
\subsection{Connecting terminals}
 | 
			
		||||
A point intended for creation of connections between symbols or other connections is called a \emph{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.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[ht]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics{create-connection-begin} \hspace{15pt} \includegraphics{create-connection-end}
 | 
			
		||||
	\caption{Interconnecting terminals of two symbols}
 | 
			
		||||
	\label{create-connection}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
\section{Frequent problems}
 | 
			
		||||
\subsection{Can't open a saved diagram}
 | 
			
		||||
When saving, assure that the filename you've typed in contains the \uv{.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.
 | 
			
		||||
 | 
			
		||||
\subsection{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.
 | 
			
		||||
 | 
			
		||||
\subsection{I miss labels}
 | 
			
		||||
Similarly to the previous case, this functionality doesn't exist yet, but it is possible to get around this limitation via a regular graphics editor.
 | 
			
		||||
 | 
			
		||||
\end{document}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										630
									
								
								liblogdiag/ld-category-symbol-view.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,630 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category-symbol-view.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2012, 2015 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "liblogdiag.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:ld-category-symbol-view
 | 
			
		||||
 * @short_description: A widget that displays symbols in a category
 | 
			
		||||
 * @see_also: #LdCategory, #LdDiagramView
 | 
			
		||||
 *
 | 
			
		||||
 * #LdCategorySymbolView allows the user to drag symbols from an #LdCategory
 | 
			
		||||
 * onto #LdDiagramView.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Milimetres per inch. */
 | 
			
		||||
#define MM_PER_INCH 25.4
 | 
			
		||||
/* The default screen resolution in DPI units. */
 | 
			
		||||
#define DEFAULT_SCREEN_RESOLUTION 96
 | 
			
		||||
 | 
			
		||||
#define SYMBOL_WIDTH    50   /* Width  of a symbol. */
 | 
			
		||||
#define SYMBOL_HEIGHT   40   /* Height of a symbol. */
 | 
			
		||||
#define SYMBOL_SPACING  10   /* Spacing between symbols, and also borders. */
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	LdSymbol *symbol;        /* The associated symbol, ref'ed. */
 | 
			
		||||
	gchar *path;             /* Path to the symbol. */
 | 
			
		||||
 | 
			
		||||
	GdkRectangle rect;       /* Clipping rectangle. */
 | 
			
		||||
	gdouble scale;           /* Scale to draw the symbol in. */
 | 
			
		||||
	gdouble dx, dy;          /* Delta into .rect. */
 | 
			
		||||
}
 | 
			
		||||
SymbolData;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LdCategorySymbolViewPrivate:
 | 
			
		||||
 * @category: a category object assigned as a model.
 | 
			
		||||
 * @path: path to the category within the library.
 | 
			
		||||
 * @layout: (element-type SymbolData *): current layout of symbols.
 | 
			
		||||
 * @preselected: currently preselected symbol.
 | 
			
		||||
 * @dragged: currently dragged symbol.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdCategorySymbolViewPrivate
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *category;
 | 
			
		||||
	gchar *path;
 | 
			
		||||
	GSList *layout;
 | 
			
		||||
	SymbolData *preselected;
 | 
			
		||||
	SymbolData *dragged;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	PROP_0,
 | 
			
		||||
	PROP_CATEGORY
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ld_category_symbol_view_get_property (GObject *object,
 | 
			
		||||
	guint property_id, GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_category_symbol_view_set_property (GObject *object,
 | 
			
		||||
	guint property_id, const GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_category_symbol_view_finalize (GObject *gobject);
 | 
			
		||||
 | 
			
		||||
static void on_size_allocate (GtkWidget *widget, GdkRectangle *allocation);
 | 
			
		||||
static gboolean on_draw (GtkWidget *widget, cairo_t *cr);
 | 
			
		||||
 | 
			
		||||
static GtkSizeRequestMode on_get_request_mode (GtkWidget *widget);
 | 
			
		||||
static void on_get_preferred_height (GtkWidget *widget,
 | 
			
		||||
	gint *minimum_height, gint *natural_height);
 | 
			
		||||
static void on_get_preferred_width_for_height (GtkWidget *widget,
 | 
			
		||||
	gint height, gint *minimum_width, gint *natural_width);
 | 
			
		||||
static void on_get_preferred_width (GtkWidget *widget,
 | 
			
		||||
	gint *minimum_width, gint *natural_width);
 | 
			
		||||
static void on_get_preferred_height_for_width (GtkWidget *widget,
 | 
			
		||||
	gint width, gint *minimum_height, gint *natural_height);
 | 
			
		||||
 | 
			
		||||
static void ld_category_symbol_view_set_category
 | 
			
		||||
	(LdCategoryView *iface, LdCategory *category);
 | 
			
		||||
static LdCategory *ld_category_symbol_view_get_category
 | 
			
		||||
	(LdCategoryView *iface);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_view_init (LdCategoryViewInterface *iface)
 | 
			
		||||
{
 | 
			
		||||
	iface->set_category = ld_category_symbol_view_set_category;
 | 
			
		||||
	iface->get_category = ld_category_symbol_view_get_category;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_CODE (LdCategorySymbolView,
 | 
			
		||||
	ld_category_symbol_view, GTK_TYPE_DRAWING_AREA,
 | 
			
		||||
	G_IMPLEMENT_INTERFACE (LD_TYPE_CATEGORY_VIEW, ld_category_view_init))
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_symbol_view_class_init (LdCategorySymbolViewClass *klass)
 | 
			
		||||
{
 | 
			
		||||
	GObjectClass *object_class;
 | 
			
		||||
	GtkWidgetClass *widget_class;
 | 
			
		||||
 | 
			
		||||
	object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
	object_class->get_property = ld_category_symbol_view_get_property;
 | 
			
		||||
	object_class->set_property = ld_category_symbol_view_set_property;
 | 
			
		||||
	object_class->finalize = ld_category_symbol_view_finalize;
 | 
			
		||||
 | 
			
		||||
	widget_class = GTK_WIDGET_CLASS (klass);
 | 
			
		||||
	widget_class->draw = on_draw;
 | 
			
		||||
	widget_class->get_request_mode = on_get_request_mode;
 | 
			
		||||
	widget_class->get_preferred_width = on_get_preferred_width;
 | 
			
		||||
	widget_class->get_preferred_width_for_height
 | 
			
		||||
		= on_get_preferred_width_for_height;
 | 
			
		||||
	widget_class->get_preferred_height = on_get_preferred_height;
 | 
			
		||||
	widget_class->get_preferred_height_for_width
 | 
			
		||||
		= on_get_preferred_height_for_width;
 | 
			
		||||
 | 
			
		||||
	g_object_class_override_property (object_class, PROP_CATEGORY, "category");
 | 
			
		||||
 | 
			
		||||
	g_type_class_add_private (klass, sizeof (LdCategorySymbolViewPrivate));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
symbol_redraw (LdCategorySymbolView *self, SymbolData *symbol)
 | 
			
		||||
{
 | 
			
		||||
	gtk_widget_queue_draw_area (GTK_WIDGET (self),
 | 
			
		||||
		symbol->rect.x,
 | 
			
		||||
		symbol->rect.y,
 | 
			
		||||
		symbol->rect.width,
 | 
			
		||||
		symbol->rect.height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
symbol_deselect (LdCategorySymbolView *self)
 | 
			
		||||
{
 | 
			
		||||
	SymbolData *preselected;
 | 
			
		||||
 | 
			
		||||
	preselected = self->priv->preselected;
 | 
			
		||||
	if (!preselected)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	g_signal_emit (self, LD_CATEGORY_VIEW_GET_INTERFACE (self)->
 | 
			
		||||
		symbol_deselected_signal, 0, preselected->symbol, preselected->path);
 | 
			
		||||
 | 
			
		||||
	symbol_redraw (self, preselected);
 | 
			
		||||
	self->priv->preselected = NULL;
 | 
			
		||||
	gtk_drag_source_unset (GTK_WIDGET (self));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
symbol_data_free (SymbolData *self)
 | 
			
		||||
{
 | 
			
		||||
	g_object_unref (self->symbol);
 | 
			
		||||
	g_free (self->path);
 | 
			
		||||
	g_slice_free (SymbolData, self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	guint total_height;      /* Total height required to show the symbols. */
 | 
			
		||||
	guint max_width;         /* Width available to the widget. */
 | 
			
		||||
 | 
			
		||||
	GSList *cur_row;         /* Current row of symbols. */
 | 
			
		||||
	guint cur_width;         /* Current width of the row. */
 | 
			
		||||
	guint cur_height_up;     /* Current max. upper height of symbols. */
 | 
			
		||||
	guint cur_height_down;   /* Current max. lower height of symbols. */
 | 
			
		||||
}
 | 
			
		||||
LayoutContext;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
layout_destroy (LdCategorySymbolView *self)
 | 
			
		||||
{
 | 
			
		||||
	symbol_deselect (self);
 | 
			
		||||
 | 
			
		||||
	g_slist_foreach (self->priv->layout, (GFunc) symbol_data_free, NULL);
 | 
			
		||||
	g_slist_free (self->priv->layout);
 | 
			
		||||
	self->priv->layout = NULL;
 | 
			
		||||
	self->priv->preselected = NULL;
 | 
			
		||||
	self->priv->dragged = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GSList *
 | 
			
		||||
layout_finish_row (LayoutContext *ctx)
 | 
			
		||||
{
 | 
			
		||||
	GSList *item, *result;
 | 
			
		||||
	gint row_height, h_delta;
 | 
			
		||||
 | 
			
		||||
	row_height = SYMBOL_SPACING + ctx->cur_height_up + ctx->cur_height_down;
 | 
			
		||||
	h_delta = (ctx->max_width - ctx->cur_width) / 2;
 | 
			
		||||
 | 
			
		||||
	for (item = ctx->cur_row; item; item = item->next)
 | 
			
		||||
	{
 | 
			
		||||
		SymbolData *data;
 | 
			
		||||
 | 
			
		||||
		data = item->data;
 | 
			
		||||
		data->rect.x += h_delta;
 | 
			
		||||
		data->rect.height = row_height;
 | 
			
		||||
		data->dy = SYMBOL_SPACING * 0.5 + ctx->cur_height_up;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result = g_slist_reverse (ctx->cur_row);
 | 
			
		||||
 | 
			
		||||
	ctx->cur_row = NULL;
 | 
			
		||||
	ctx->total_height += row_height;
 | 
			
		||||
 | 
			
		||||
	ctx->cur_width = SYMBOL_SPACING;
 | 
			
		||||
	ctx->cur_height_up = 0;
 | 
			
		||||
	ctx->cur_height_down = 0;
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gint
 | 
			
		||||
layout_for_width (LdCategorySymbolView *self, gint width)
 | 
			
		||||
{
 | 
			
		||||
	GSList *symbols, *iter;
 | 
			
		||||
	LayoutContext ctx = {SYMBOL_SPACING, 0, NULL, SYMBOL_SPACING, 0, 0};
 | 
			
		||||
 | 
			
		||||
	layout_destroy (self);
 | 
			
		||||
	ctx.max_width = width;
 | 
			
		||||
 | 
			
		||||
	symbols = (GSList *) ld_category_get_symbols (self->priv->category);
 | 
			
		||||
	for (iter = symbols; iter; iter = iter->next)
 | 
			
		||||
	{
 | 
			
		||||
		SymbolData *data;
 | 
			
		||||
		LdRectangle area;
 | 
			
		||||
		LdSymbol *symbol;
 | 
			
		||||
		gint real_width, height_up, height_down;
 | 
			
		||||
 | 
			
		||||
		symbol = LD_SYMBOL (iter->data);
 | 
			
		||||
		ld_symbol_get_area (symbol, &area);
 | 
			
		||||
 | 
			
		||||
		data = g_slice_new (SymbolData);
 | 
			
		||||
		data->symbol = g_object_ref (symbol);
 | 
			
		||||
		data->path = g_build_path (LD_LIBRARY_IDENTIFIER_SEPARATOR,
 | 
			
		||||
			self->priv->path, ld_symbol_get_name (symbol), NULL);
 | 
			
		||||
 | 
			
		||||
		/* Compute the scale to fit the symbol to an area of
 | 
			
		||||
		 * SYMBOL_WIDTH * SYMBOL_HEIGHT, vertically centred. */
 | 
			
		||||
		data->scale = SYMBOL_HEIGHT * 0.5
 | 
			
		||||
			/ MAX (ABS (area.y), ABS (area.y + area.height)) * 0.5;
 | 
			
		||||
		if (data->scale * area.width > SYMBOL_WIDTH)
 | 
			
		||||
			data->scale = SYMBOL_WIDTH / area.width;
 | 
			
		||||
 | 
			
		||||
		real_width = data->scale * area.width + 0.5;
 | 
			
		||||
		data->rect.width = real_width + SYMBOL_SPACING;
 | 
			
		||||
		/* Now I have no idea what this does but it worked before.
 | 
			
		||||
		 * When I do, I have to write it in here. */
 | 
			
		||||
		data->dx = data->rect.width * 0.5 + data->scale
 | 
			
		||||
			* (area.width * 0.5 - ABS (area.x + area.width));
 | 
			
		||||
 | 
			
		||||
		if (ctx.cur_width + real_width + SYMBOL_SPACING > ctx.max_width
 | 
			
		||||
			&& ctx.cur_row != NULL)
 | 
			
		||||
		{
 | 
			
		||||
			self->priv->layout = g_slist_concat (self->priv->layout,
 | 
			
		||||
				layout_finish_row (&ctx));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Half of the spacing is included on each side of the rect. */
 | 
			
		||||
		data->rect.x = ctx.cur_width    - SYMBOL_SPACING / 2;
 | 
			
		||||
		data->rect.y = ctx.total_height - SYMBOL_SPACING / 2;
 | 
			
		||||
 | 
			
		||||
		height_up   = data->scale * ABS (area.y);
 | 
			
		||||
		height_down = data->scale * ABS (area.y + area.height);
 | 
			
		||||
 | 
			
		||||
		if (height_up   > ctx.cur_height_up)
 | 
			
		||||
			ctx.cur_height_up   = height_up;
 | 
			
		||||
		if (height_down > ctx.cur_height_down)
 | 
			
		||||
			ctx.cur_height_down = height_down;
 | 
			
		||||
 | 
			
		||||
		ctx.cur_row = g_slist_prepend (ctx.cur_row, data);
 | 
			
		||||
		ctx.cur_width += real_width + SYMBOL_SPACING;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ctx.cur_row != NULL)
 | 
			
		||||
		self->priv->layout = g_slist_concat (self->priv->layout,
 | 
			
		||||
			layout_finish_row (&ctx));
 | 
			
		||||
 | 
			
		||||
	return ctx.total_height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GtkSizeRequestMode
 | 
			
		||||
on_get_request_mode (GtkWidget *widget)
 | 
			
		||||
{
 | 
			
		||||
	return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_get_preferred_height (GtkWidget *widget,
 | 
			
		||||
	gint *minimum_height, gint *natural_height)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	if (!self->priv->category
 | 
			
		||||
	 || !ld_category_get_symbols (self->priv->category))
 | 
			
		||||
		*minimum_height = *natural_height = 0;
 | 
			
		||||
	else
 | 
			
		||||
		*minimum_height = *natural_height = SYMBOL_HEIGHT + 2 * SYMBOL_SPACING;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_get_preferred_width_for_height (GtkWidget *widget,
 | 
			
		||||
	gint height, gint *minimum_width, gint *natural_width)
 | 
			
		||||
{
 | 
			
		||||
	// TODO: compute it the other way around
 | 
			
		||||
	on_get_preferred_width (widget, minimum_width, natural_width);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_get_preferred_width (GtkWidget *widget,
 | 
			
		||||
	gint *minimum_width, gint *natural_width)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	if (!self->priv->category
 | 
			
		||||
	 || !ld_category_get_symbols (self->priv->category))
 | 
			
		||||
		*minimum_width = *natural_width = 0;
 | 
			
		||||
	else
 | 
			
		||||
		*minimum_width = *natural_width = SYMBOL_WIDTH + 2 * SYMBOL_SPACING;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_get_preferred_height_for_width (GtkWidget *widget,
 | 
			
		||||
	gint width, gint *minimum_height, gint *natural_height)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	*minimum_height = *natural_height = layout_for_width (self, width);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_size_allocate (GtkWidget *widget, GdkRectangle *allocation)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	layout_for_width (self, allocation->width);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_draw (GtkWidget *widget, cairo_t *cr)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
	GSList *iter;
 | 
			
		||||
	GdkRGBA color;
 | 
			
		||||
	GtkStyleContext *context;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
 | 
			
		||||
	GdkRectangle draw_area;
 | 
			
		||||
	if (!gdk_cairo_get_clip_rectangle (cr, &draw_area))
 | 
			
		||||
		return FALSE;
 | 
			
		||||
 | 
			
		||||
	context = gtk_widget_get_style_context (widget);
 | 
			
		||||
 | 
			
		||||
	// XXX: alternatively, we could use gtk_style_context_lookup_color()
 | 
			
		||||
	//   with hardcoded colour names ("theme_*_color")--this is cleaner,
 | 
			
		||||
	//   and unlike GtkStyle doesn't cause deprecation warnings
 | 
			
		||||
	gtk_style_context_add_class (context, "gtkstyle-fallback");
 | 
			
		||||
 | 
			
		||||
	gtk_style_context_get_background_color (context,
 | 
			
		||||
		GTK_STATE_FLAG_NORMAL, &color);
 | 
			
		||||
	gdk_cairo_set_source_rgba (cr, &color);
 | 
			
		||||
	cairo_paint (cr);
 | 
			
		||||
 | 
			
		||||
	for (iter = self->priv->layout; iter; iter = iter->next)
 | 
			
		||||
	{
 | 
			
		||||
		SymbolData *data;
 | 
			
		||||
 | 
			
		||||
		data = iter->data;
 | 
			
		||||
		if (!gdk_rectangle_intersect (&data->rect, &draw_area, NULL))
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		cairo_save (cr);
 | 
			
		||||
		gdk_cairo_rectangle (cr, &data->rect);
 | 
			
		||||
		cairo_clip (cr);
 | 
			
		||||
 | 
			
		||||
		GtkStateFlags state = GTK_STATE_FLAG_NORMAL;
 | 
			
		||||
		if (data == self->priv->preselected)
 | 
			
		||||
			state = GTK_STATE_FLAG_SELECTED;
 | 
			
		||||
 | 
			
		||||
		gtk_style_context_get_background_color (context, state, &color);
 | 
			
		||||
		gdk_cairo_set_source_rgba (cr, &color);
 | 
			
		||||
		cairo_paint (cr);
 | 
			
		||||
 | 
			
		||||
		gtk_style_context_get_color (context, state, &color);
 | 
			
		||||
		gdk_cairo_set_source_rgba (cr, &color);
 | 
			
		||||
 | 
			
		||||
		cairo_translate (cr, data->rect.x + data->dx, data->rect.y + data->dy);
 | 
			
		||||
		cairo_scale (cr, data->scale, data->scale);
 | 
			
		||||
 | 
			
		||||
		cairo_set_line_width (cr, 1 / data->scale);
 | 
			
		||||
		ld_symbol_draw (data->symbol, cr);
 | 
			
		||||
 | 
			
		||||
		cairo_restore (cr);
 | 
			
		||||
	}
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_motion_notify (GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
	GSList *iter;
 | 
			
		||||
 | 
			
		||||
	if (event->state & GDK_BUTTON1_MASK)
 | 
			
		||||
		return FALSE;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	for (iter = self->priv->layout; iter; iter = iter->next)
 | 
			
		||||
	{
 | 
			
		||||
		SymbolData *data;
 | 
			
		||||
 | 
			
		||||
		data = iter->data;
 | 
			
		||||
		if (event->x <  data->rect.x
 | 
			
		||||
		 || event->y <  data->rect.y
 | 
			
		||||
		 || event->x >= data->rect.x + data->rect.width
 | 
			
		||||
		 || event->y >= data->rect.y + data->rect.height)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (data != self->priv->preselected)
 | 
			
		||||
		{
 | 
			
		||||
			GtkTargetEntry target = {"ld-symbol", GTK_TARGET_SAME_APP, 0};
 | 
			
		||||
 | 
			
		||||
			symbol_deselect (self);
 | 
			
		||||
			self->priv->preselected = data;
 | 
			
		||||
			symbol_redraw (self, data);
 | 
			
		||||
 | 
			
		||||
			gtk_drag_source_set (widget,
 | 
			
		||||
				GDK_BUTTON1_MASK, &target, 1, GDK_ACTION_COPY);
 | 
			
		||||
 | 
			
		||||
			g_signal_emit (self, LD_CATEGORY_VIEW_GET_INTERFACE (self)->
 | 
			
		||||
				symbol_selected_signal, 0, data->symbol, data->path);
 | 
			
		||||
		}
 | 
			
		||||
		return FALSE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	symbol_deselect (self);
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_leave_notify (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	switch (event->mode)
 | 
			
		||||
	{
 | 
			
		||||
	case GDK_CROSSING_GRAB:
 | 
			
		||||
	case GDK_CROSSING_GTK_GRAB:
 | 
			
		||||
	case GDK_CROSSING_STATE_CHANGED:
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		symbol_deselect (LD_CATEGORY_SYMBOL_VIEW (widget));
 | 
			
		||||
	}
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_drag_data_get
 | 
			
		||||
(GtkWidget *widget, GdkDragContext *ctx, GtkSelectionData *selection_data,
 | 
			
		||||
	guint target_type, guint time, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	g_return_if_fail (self->priv->dragged != NULL);
 | 
			
		||||
 | 
			
		||||
	gtk_selection_data_set (selection_data,
 | 
			
		||||
		gtk_selection_data_get_target (selection_data),
 | 
			
		||||
		8, (guchar *) self->priv->dragged->path,
 | 
			
		||||
		strlen (self->priv->dragged->path));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_drag_begin (GtkWidget *widget, GdkDragContext *ctx, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
	GdkPixbuf *pbuf;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	g_return_if_fail (self->priv->preselected != NULL);
 | 
			
		||||
 | 
			
		||||
	/* Working around a mysterious bug where we /sometimes/ get deselected. */
 | 
			
		||||
	self->priv->dragged = self->priv->preselected;
 | 
			
		||||
 | 
			
		||||
	/* Some of the larger previews didn't work, and we have to get rid of
 | 
			
		||||
	 * the icon later when we're hovering above LdDiagramView anyway. */
 | 
			
		||||
	pbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1);
 | 
			
		||||
	gdk_pixbuf_fill (pbuf, 0x00000000);
 | 
			
		||||
	gtk_drag_set_icon_pixbuf (ctx, pbuf, 0, 0);
 | 
			
		||||
	g_object_unref (pbuf);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_drag_end (GtkWidget *widget, GdkDragContext *ctx, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_SYMBOL_VIEW (widget);
 | 
			
		||||
	symbol_deselect (self);
 | 
			
		||||
	self->priv->dragged = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_symbol_view_init (LdCategorySymbolView *self)
 | 
			
		||||
{
 | 
			
		||||
	self->priv = G_TYPE_INSTANCE_GET_PRIVATE
 | 
			
		||||
		(self, LD_TYPE_CATEGORY_SYMBOL_VIEW, LdCategorySymbolViewPrivate);
 | 
			
		||||
 | 
			
		||||
	g_signal_connect (self, "size-allocate",
 | 
			
		||||
		G_CALLBACK (on_size_allocate), NULL);
 | 
			
		||||
 | 
			
		||||
	g_signal_connect (self, "motion-notify-event",
 | 
			
		||||
		G_CALLBACK (on_motion_notify), NULL);
 | 
			
		||||
	g_signal_connect (self, "leave-notify-event",
 | 
			
		||||
		G_CALLBACK (on_leave_notify), NULL);
 | 
			
		||||
 | 
			
		||||
	g_signal_connect (self, "drag-begin",
 | 
			
		||||
		G_CALLBACK (on_drag_begin), NULL);
 | 
			
		||||
	g_signal_connect (self, "drag-data-get",
 | 
			
		||||
		G_CALLBACK (on_drag_data_get), NULL);
 | 
			
		||||
	g_signal_connect (self, "drag-end",
 | 
			
		||||
		G_CALLBACK (on_drag_end), NULL);
 | 
			
		||||
 | 
			
		||||
	gtk_widget_add_events (GTK_WIDGET (self),
 | 
			
		||||
		GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK
 | 
			
		||||
		| GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
 | 
			
		||||
		| GDK_LEAVE_NOTIFY_MASK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_symbol_view_finalize (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_SYMBOL_VIEW (gobject);
 | 
			
		||||
 | 
			
		||||
	layout_destroy (self);
 | 
			
		||||
	if (self->priv->category)
 | 
			
		||||
		g_object_unref (self->priv->category);
 | 
			
		||||
	g_free (self->priv->path);
 | 
			
		||||
 | 
			
		||||
	/* Chain up to the parent class. */
 | 
			
		||||
	G_OBJECT_CLASS (ld_category_symbol_view_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_symbol_view_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_CATEGORY:
 | 
			
		||||
		g_value_set_object (value,
 | 
			
		||||
			ld_category_view_get_category (LD_CATEGORY_VIEW (object)));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_symbol_view_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_CATEGORY:
 | 
			
		||||
		ld_category_view_set_category (LD_CATEGORY_VIEW (object),
 | 
			
		||||
			LD_CATEGORY (g_value_get_object (value)));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ===== Interface ========================================================= */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_symbol_view_new:
 | 
			
		||||
 * @category: (allow-none): a category to be assigned to the widget.
 | 
			
		||||
 *
 | 
			
		||||
 * Create an instance.
 | 
			
		||||
 */
 | 
			
		||||
GtkWidget *
 | 
			
		||||
ld_category_symbol_view_new (LdCategory *category)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
 | 
			
		||||
	self = g_object_new (LD_TYPE_CATEGORY_SYMBOL_VIEW, NULL);
 | 
			
		||||
	ld_category_view_set_category (LD_CATEGORY_VIEW (self), category);
 | 
			
		||||
	return GTK_WIDGET (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_symbol_view_set_category (LdCategoryView *iface,
 | 
			
		||||
	LdCategory *category)
 | 
			
		||||
{
 | 
			
		||||
	LdCategorySymbolView *self;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY_SYMBOL_VIEW (iface));
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (category));
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_SYMBOL_VIEW (iface);
 | 
			
		||||
	if (self->priv->category)
 | 
			
		||||
	{
 | 
			
		||||
		g_object_unref (self->priv->category);
 | 
			
		||||
 | 
			
		||||
		g_free (self->priv->path);
 | 
			
		||||
		self->priv->path = NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* XXX: We should rebuild the path if the name changes but it shouldn't
 | 
			
		||||
	 *      happen and we would have to track the parents, too. */
 | 
			
		||||
	self->priv->path = ld_category_get_path (category);
 | 
			
		||||
 | 
			
		||||
	self->priv->category = category;
 | 
			
		||||
	g_object_ref (category);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "category");
 | 
			
		||||
	gtk_widget_queue_resize (GTK_WIDGET (self));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static LdCategory *
 | 
			
		||||
ld_category_symbol_view_get_category (LdCategoryView *iface)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY_SYMBOL_VIEW (iface), NULL);
 | 
			
		||||
	return LD_CATEGORY_SYMBOL_VIEW (iface)->priv->category;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								liblogdiag/ld-category-symbol-view.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,58 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category-symbol-view.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LD_CATEGORY_SYMBOL_VIEW_H__
 | 
			
		||||
#define __LD_CATEGORY_SYMBOL_VIEW_H__
 | 
			
		||||
 | 
			
		||||
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))
 | 
			
		||||
 | 
			
		||||
typedef struct _LdCategorySymbolView LdCategorySymbolView;
 | 
			
		||||
typedef struct _LdCategorySymbolViewPrivate LdCategorySymbolViewPrivate;
 | 
			
		||||
typedef struct _LdCategorySymbolViewClass LdCategorySymbolViewClass;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategorySymbolView:
 | 
			
		||||
 */
 | 
			
		||||
struct _LdCategorySymbolView
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GtkDrawingArea parent_instance;
 | 
			
		||||
	LdCategorySymbolViewPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _LdCategorySymbolViewClass
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GtkDrawingAreaClass parent_class;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GType ld_category_symbol_view_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
GtkWidget *ld_category_symbol_view_new (LdCategory *category);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* ! __LD_CATEGORY_SYMBOL_VIEW_H__ */
 | 
			
		||||
							
								
								
									
										342
									
								
								liblogdiag/ld-category-tree-view.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,342 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category-tree-view.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2011, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "liblogdiag.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:ld-category-tree-view
 | 
			
		||||
 * @short_description: A category tree view widget
 | 
			
		||||
 * @see_also: #LdCategory
 | 
			
		||||
 *
 | 
			
		||||
 * #LdCategoryTreeView enables the user to drag symbols from #LdLibrary
 | 
			
		||||
 * onto #LdDiagramView.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LdCategoryTreeViewPrivate:
 | 
			
		||||
 * @category: a category object assigned as a model.
 | 
			
		||||
 * @expander_prefix: a string to prepend to subcategory labels in expanders.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdCategoryTreeViewPrivate
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *category;
 | 
			
		||||
	gchar *expander_prefix;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	PROP_0,
 | 
			
		||||
	PROP_CATEGORY
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ld_category_tree_view_get_property (GObject *object,
 | 
			
		||||
	guint property_id, GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_category_tree_view_set_property (GObject *object,
 | 
			
		||||
	guint property_id, const GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_category_tree_view_dispose (GObject *gobject);
 | 
			
		||||
 | 
			
		||||
static void ld_category_tree_view_set_category (LdCategoryView *iface,
 | 
			
		||||
	LdCategory *category);
 | 
			
		||||
static LdCategory *ld_category_tree_view_get_category (LdCategoryView *iface);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_view_init (LdCategoryViewInterface *iface)
 | 
			
		||||
{
 | 
			
		||||
	iface->set_category = ld_category_tree_view_set_category;
 | 
			
		||||
	iface->get_category = ld_category_tree_view_get_category;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_CODE (LdCategoryTreeView,
 | 
			
		||||
	ld_category_tree_view, GTK_TYPE_BOX,
 | 
			
		||||
	G_IMPLEMENT_INTERFACE (LD_TYPE_CATEGORY_VIEW, ld_category_view_init));
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_tree_view_class_init (LdCategoryTreeViewClass *klass)
 | 
			
		||||
{
 | 
			
		||||
	GObjectClass *object_class;
 | 
			
		||||
 | 
			
		||||
	object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
	object_class->get_property = ld_category_tree_view_get_property;
 | 
			
		||||
	object_class->set_property = ld_category_tree_view_set_property;
 | 
			
		||||
	object_class->dispose = ld_category_tree_view_dispose;
 | 
			
		||||
 | 
			
		||||
	g_object_class_override_property (object_class, PROP_CATEGORY, "category");
 | 
			
		||||
 | 
			
		||||
	g_type_class_add_private (klass, sizeof (LdCategoryTreeViewPrivate));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_tree_view_init (LdCategoryTreeView *self)
 | 
			
		||||
{
 | 
			
		||||
	self->priv = G_TYPE_INSTANCE_GET_PRIVATE
 | 
			
		||||
		(self, LD_TYPE_CATEGORY_TREE_VIEW, LdCategoryTreeViewPrivate);
 | 
			
		||||
	gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_tree_view_dispose (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
	LdCategoryTreeView *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_TREE_VIEW (gobject);
 | 
			
		||||
	ld_category_view_set_category (LD_CATEGORY_VIEW (self), NULL);
 | 
			
		||||
 | 
			
		||||
	g_free (self->priv->expander_prefix);
 | 
			
		||||
	self->priv->expander_prefix = NULL;
 | 
			
		||||
 | 
			
		||||
	/* Chain up to the parent class. */
 | 
			
		||||
	G_OBJECT_CLASS (ld_category_tree_view_parent_class)->dispose (gobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_tree_view_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_CATEGORY:
 | 
			
		||||
		g_value_set_object (value,
 | 
			
		||||
			ld_category_view_get_category (LD_CATEGORY_VIEW (object)));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_tree_view_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_CATEGORY:
 | 
			
		||||
		ld_category_view_set_category (LD_CATEGORY_VIEW (object),
 | 
			
		||||
			LD_CATEGORY (g_value_get_object (value)));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static GtkWidget *
 | 
			
		||||
create_empty_label (void)
 | 
			
		||||
{
 | 
			
		||||
	GtkWidget *label;
 | 
			
		||||
	PangoAttrList *attr;
 | 
			
		||||
 | 
			
		||||
	label = gtk_label_new (_("Empty"));
 | 
			
		||||
	gtk_widget_set_sensitive (label, FALSE);
 | 
			
		||||
 | 
			
		||||
	gtk_widget_set_halign (label, GTK_ALIGN_CENTER);
 | 
			
		||||
	gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
 | 
			
		||||
	gtk_widget_set_margin_left (label, 5);
 | 
			
		||||
	gtk_widget_set_margin_right (label, 5);
 | 
			
		||||
	gtk_widget_set_margin_top (label, 5);
 | 
			
		||||
	gtk_widget_set_margin_bottom (label, 5);
 | 
			
		||||
 | 
			
		||||
	attr = pango_attr_list_new ();
 | 
			
		||||
	pango_attr_list_change (attr, pango_attr_style_new (PANGO_STYLE_ITALIC));
 | 
			
		||||
	gtk_label_set_attributes (GTK_LABEL (label), attr);
 | 
			
		||||
	pango_attr_list_unref (attr);
 | 
			
		||||
 | 
			
		||||
	return label;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
reconstruct_prefix (LdCategoryTreeView *self)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *iter;
 | 
			
		||||
	gchar *start, *end;
 | 
			
		||||
 | 
			
		||||
	start = g_strdup ("");
 | 
			
		||||
	end   = g_strdup ("");
 | 
			
		||||
 | 
			
		||||
	for (iter = self->priv->category; iter;
 | 
			
		||||
		iter = ld_category_get_parent (iter))
 | 
			
		||||
	{
 | 
			
		||||
		const gchar *name;
 | 
			
		||||
		gchar *new_start, *new_end, *name_escaped;
 | 
			
		||||
 | 
			
		||||
		/* Stop at the root category. */
 | 
			
		||||
		if (!strcmp (ld_category_get_name (iter),
 | 
			
		||||
			LD_LIBRARY_IDENTIFIER_SEPARATOR))
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		name = ld_category_get_human_name (iter);
 | 
			
		||||
		name_escaped = g_markup_escape_text (name, -1);
 | 
			
		||||
 | 
			
		||||
		new_start = g_strconcat (start, "<small>", NULL);
 | 
			
		||||
		new_end   = g_strconcat (name_escaped, ":</small> ", end, NULL);
 | 
			
		||||
 | 
			
		||||
		g_free (name_escaped);
 | 
			
		||||
		g_free (start);
 | 
			
		||||
		g_free (end);
 | 
			
		||||
 | 
			
		||||
		start = new_start;
 | 
			
		||||
		end   = new_end;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	g_free (self->priv->expander_prefix);
 | 
			
		||||
	self->priv->expander_prefix = g_strconcat (start, end, NULL);
 | 
			
		||||
	g_free (start);
 | 
			
		||||
	g_free (end);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_symbol_selected (GObject *source,
 | 
			
		||||
	LdSymbol *symbol, const gchar *path, LdCategoryTreeView *self)
 | 
			
		||||
{
 | 
			
		||||
	g_signal_emit (self, LD_CATEGORY_VIEW_GET_INTERFACE (self)->
 | 
			
		||||
		symbol_selected_signal, 0, symbol, path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_symbol_deselected (GObject *source,
 | 
			
		||||
	LdSymbol *symbol, const gchar *path, LdCategoryTreeView *self)
 | 
			
		||||
{
 | 
			
		||||
	g_signal_emit (self, LD_CATEGORY_VIEW_GET_INTERFACE (self)->
 | 
			
		||||
		symbol_deselected_signal, 0, symbol, path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
load_category_cb (gpointer data, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdCategoryTreeView *self;
 | 
			
		||||
	LdCategory *cat;
 | 
			
		||||
	GtkWidget *expander, *child;
 | 
			
		||||
	gchar *name, *label_markup;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY_TREE_VIEW (user_data));
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (data));
 | 
			
		||||
 | 
			
		||||
	self = user_data;
 | 
			
		||||
	cat = data;
 | 
			
		||||
 | 
			
		||||
	name = g_markup_escape_text (ld_category_get_human_name (cat), -1);
 | 
			
		||||
	label_markup = g_strconcat (self->priv->expander_prefix, name, NULL);
 | 
			
		||||
	g_free (name);
 | 
			
		||||
 | 
			
		||||
	expander = gtk_expander_new (label_markup);
 | 
			
		||||
	gtk_expander_set_expanded (GTK_EXPANDER (expander), TRUE);
 | 
			
		||||
	gtk_expander_set_use_markup (GTK_EXPANDER (expander), TRUE);
 | 
			
		||||
	g_free (label_markup);
 | 
			
		||||
 | 
			
		||||
	child = ld_category_tree_view_new (cat);
 | 
			
		||||
	gtk_container_add (GTK_CONTAINER (expander), child);
 | 
			
		||||
	gtk_box_pack_start (GTK_BOX (self), expander, FALSE, FALSE, 0);
 | 
			
		||||
 | 
			
		||||
	g_signal_connect_after (child, "symbol-selected",
 | 
			
		||||
		G_CALLBACK (on_symbol_selected), self);
 | 
			
		||||
	g_signal_connect_after (child, "symbol-deselected",
 | 
			
		||||
		G_CALLBACK (on_symbol_deselected), self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
reload_category (LdCategoryTreeView *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY_TREE_VIEW (self));
 | 
			
		||||
 | 
			
		||||
	/* Clear the container first, if there is already something in it. */
 | 
			
		||||
	gtk_container_foreach (GTK_CONTAINER (self),
 | 
			
		||||
		(GtkCallback) gtk_widget_destroy, NULL);
 | 
			
		||||
 | 
			
		||||
	/* XXX: We might want to disconnect signal handlers. */
 | 
			
		||||
 | 
			
		||||
	if (self->priv->category)
 | 
			
		||||
	{
 | 
			
		||||
		GSList *symbols, *children;
 | 
			
		||||
 | 
			
		||||
		symbols  = (GSList *) ld_category_get_symbols  (self->priv->category);
 | 
			
		||||
		children = (GSList *) ld_category_get_children (self->priv->category);
 | 
			
		||||
 | 
			
		||||
		if (symbols)
 | 
			
		||||
		{
 | 
			
		||||
			GtkWidget *symbol_view;
 | 
			
		||||
 | 
			
		||||
			symbol_view = ld_category_symbol_view_new (self->priv->category);
 | 
			
		||||
			gtk_box_pack_start (GTK_BOX (self), symbol_view, FALSE, FALSE, 0);
 | 
			
		||||
 | 
			
		||||
			g_signal_connect_after (symbol_view, "symbol-selected",
 | 
			
		||||
				G_CALLBACK (on_symbol_selected), self);
 | 
			
		||||
			g_signal_connect_after (symbol_view, "symbol-deselected",
 | 
			
		||||
				G_CALLBACK (on_symbol_deselected), self);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (children)
 | 
			
		||||
		{
 | 
			
		||||
			reconstruct_prefix (self);
 | 
			
		||||
			g_slist_foreach (children, load_category_cb, self);
 | 
			
		||||
		}
 | 
			
		||||
		else if (!symbols)
 | 
			
		||||
			gtk_box_pack_start (GTK_BOX (self),
 | 
			
		||||
				create_empty_label (), FALSE, FALSE, 0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ===== Interface ========================================================= */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_tree_view_new:
 | 
			
		||||
 * @category: (allow-none): a category to be assigned to the widget.
 | 
			
		||||
 *
 | 
			
		||||
 * Create an instance.
 | 
			
		||||
 */
 | 
			
		||||
GtkWidget *
 | 
			
		||||
ld_category_tree_view_new (LdCategory *category)
 | 
			
		||||
{
 | 
			
		||||
	LdCategoryTreeView *self;
 | 
			
		||||
 | 
			
		||||
	self = g_object_new (LD_TYPE_CATEGORY_TREE_VIEW, NULL);
 | 
			
		||||
	ld_category_view_set_category (LD_CATEGORY_VIEW (self), category);
 | 
			
		||||
	return GTK_WIDGET (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_tree_view_set_category (LdCategoryView *iface, LdCategory *category)
 | 
			
		||||
{
 | 
			
		||||
	LdCategoryTreeView *self;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY_TREE_VIEW (iface));
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (category) || category == NULL);
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY_TREE_VIEW (iface);
 | 
			
		||||
	if (self->priv->category)
 | 
			
		||||
	{
 | 
			
		||||
		g_signal_handlers_disconnect_by_func (self->priv->category,
 | 
			
		||||
			reload_category, self);
 | 
			
		||||
		g_object_unref (self->priv->category);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	self->priv->category = category;
 | 
			
		||||
 | 
			
		||||
	if (category)
 | 
			
		||||
	{
 | 
			
		||||
		g_signal_connect_data (category, "children-changed",
 | 
			
		||||
			G_CALLBACK (reload_category), self,
 | 
			
		||||
			NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
 | 
			
		||||
		g_signal_connect_data (category, "notify::parent",
 | 
			
		||||
			G_CALLBACK (reload_category), self,
 | 
			
		||||
			NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
 | 
			
		||||
		g_object_ref (category);
 | 
			
		||||
	}
 | 
			
		||||
	reload_category (self);
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "category");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static LdCategory *
 | 
			
		||||
ld_category_tree_view_get_category (LdCategoryView *iface)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY_TREE_VIEW (iface), NULL);
 | 
			
		||||
	return LD_CATEGORY_TREE_VIEW (iface)->priv->category;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								liblogdiag/ld-category-tree-view.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,58 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category-tree-view.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2011, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LD_CATEGORY_TREE_VIEW_H__
 | 
			
		||||
#define __LD_CATEGORY_TREE_VIEW_H__
 | 
			
		||||
 | 
			
		||||
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))
 | 
			
		||||
 | 
			
		||||
typedef struct _LdCategoryTreeView LdCategoryTreeView;
 | 
			
		||||
typedef struct _LdCategoryTreeViewPrivate LdCategoryTreeViewPrivate;
 | 
			
		||||
typedef struct _LdCategoryTreeViewClass LdCategoryTreeViewClass;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategoryTreeView:
 | 
			
		||||
 */
 | 
			
		||||
struct _LdCategoryTreeView
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GtkBox parent_instance;
 | 
			
		||||
	LdCategoryTreeViewPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _LdCategoryTreeViewClass
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GtkBoxClass parent_class;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GType ld_category_tree_view_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
GtkWidget *ld_category_tree_view_new (LdCategory *category);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* ! __LD_CATEGORY_TREE_VIEW_H__ */
 | 
			
		||||
							
								
								
									
										99
									
								
								liblogdiag/ld-category-view.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,99 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category-view.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "liblogdiag.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:ld-category-view
 | 
			
		||||
 * @short_description: Interface for objects displaying categories
 | 
			
		||||
 * @see_also: #LdCategory
 | 
			
		||||
 *
 | 
			
		||||
 * #LdCategoryView defines objects displaying contents of #LdCategory
 | 
			
		||||
 * hierarchies.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
G_DEFINE_INTERFACE (LdCategoryView, ld_category_view, 0);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_view_default_init (LdCategoryViewInterface *iface)
 | 
			
		||||
{
 | 
			
		||||
	GParamSpec *pspec;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategoryView::symbol-selected:
 | 
			
		||||
 * @self: an #LdCategoryView object.
 | 
			
		||||
 * @symbol: the selected #LdSymbol object.
 | 
			
		||||
 * @path: location of the symbol within the library.
 | 
			
		||||
 *
 | 
			
		||||
 * A symbol has been selected.
 | 
			
		||||
 */
 | 
			
		||||
	iface->symbol_selected_signal = g_signal_new
 | 
			
		||||
		("symbol-selected", G_TYPE_FROM_INTERFACE (iface),
 | 
			
		||||
		G_SIGNAL_RUN_LAST, 0, NULL, NULL,
 | 
			
		||||
		ld_marshal_VOID__OBJECT_STRING,
 | 
			
		||||
		G_TYPE_NONE, 2, LD_TYPE_SYMBOL,
 | 
			
		||||
		G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategoryView::symbol-deselected:
 | 
			
		||||
 * @self: an #LdCategoryView object.
 | 
			
		||||
 * @symbol: the deselected #LdSymbol object.
 | 
			
		||||
 * @path: location of the symbol within the library.
 | 
			
		||||
 *
 | 
			
		||||
 * A symbol has been deselected.
 | 
			
		||||
 */
 | 
			
		||||
	iface->symbol_deselected_signal = g_signal_new
 | 
			
		||||
		("symbol-deselected", G_TYPE_FROM_INTERFACE (iface),
 | 
			
		||||
		G_SIGNAL_RUN_LAST, 0, NULL, NULL,
 | 
			
		||||
		ld_marshal_VOID__OBJECT_STRING,
 | 
			
		||||
		G_TYPE_NONE, 2, LD_TYPE_SYMBOL,
 | 
			
		||||
		G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategoryView:category:
 | 
			
		||||
 *
 | 
			
		||||
 * The #LdCategory this object retrieves content from.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_object ("category", "Category",
 | 
			
		||||
		"The symbol category that is shown by this object.",
 | 
			
		||||
		LD_TYPE_CATEGORY, G_PARAM_READWRITE);
 | 
			
		||||
	g_object_interface_install_property (iface, pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_view_set_category:
 | 
			
		||||
 * @self: an #LdCategoryView object.
 | 
			
		||||
 * @category: the #LdCategory to be assigned to the view.
 | 
			
		||||
 *
 | 
			
		||||
 * Assign an #LdCategory object to the view.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_view_get_category:
 | 
			
		||||
 * @self: an #LdCategoryView object.
 | 
			
		||||
 *
 | 
			
		||||
 * Get the #LdCategory object assigned to this view.
 | 
			
		||||
 * The reference count on the category is not incremented.
 | 
			
		||||
 */
 | 
			
		||||
LdCategory *
 | 
			
		||||
ld_category_view_get_category (LdCategoryView *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY_VIEW (self), NULL);
 | 
			
		||||
	return LD_CATEGORY_VIEW_GET_INTERFACE (self)->get_category (self);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								liblogdiag/ld-category-view.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,58 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category-view.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LD_CATEGORY_VIEW_H__
 | 
			
		||||
#define __LD_CATEGORY_VIEW_H__
 | 
			
		||||
 | 
			
		||||
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))
 | 
			
		||||
 | 
			
		||||
typedef struct _LdCategoryView LdCategoryView;
 | 
			
		||||
typedef struct _LdCategoryViewInterface LdCategoryViewInterface;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategoryView:
 | 
			
		||||
 */
 | 
			
		||||
struct _LdCategoryView
 | 
			
		||||
{
 | 
			
		||||
	/* Just to remind gtk-doc that this really exists. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _LdCategoryViewInterface
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GTypeInterface parent;
 | 
			
		||||
 | 
			
		||||
	guint symbol_selected_signal;
 | 
			
		||||
	guint symbol_deselected_signal;
 | 
			
		||||
 | 
			
		||||
	void (*set_category) (LdCategoryView *self, LdCategory *category);
 | 
			
		||||
	LdCategory *(*get_category) (LdCategoryView *self);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GType ld_category_view_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
void ld_category_view_set_category (LdCategoryView *self,
 | 
			
		||||
	LdCategory *category);
 | 
			
		||||
LdCategory *ld_category_view_get_category (LdCategoryView *self);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* ! __LD_CATEGORY_VIEW_H__ */
 | 
			
		||||
							
								
								
									
										564
									
								
								liblogdiag/ld-category.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,564 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2010, 2011, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "liblogdiag.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:ld-category
 | 
			
		||||
 * @short_description: A category of symbols
 | 
			
		||||
 * @see_also: #LdSymbol, #LdLibrary
 | 
			
		||||
 *
 | 
			
		||||
 * #LdCategory represents a category of #LdSymbol objects.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LdCategoryPrivate:
 | 
			
		||||
 * @parent: the parent of this category.
 | 
			
		||||
 * @name: the name of this category.
 | 
			
		||||
 * @human_name: the localized human-readable name of this category.
 | 
			
		||||
 * @symbols: (element-type LdSymbol *): symbols in this category.
 | 
			
		||||
 * @subcategories: (element-type LdCategory *) children of this category.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdCategoryPrivate
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *parent;
 | 
			
		||||
	gchar *name;
 | 
			
		||||
	gchar *human_name;
 | 
			
		||||
	GSList *symbols;
 | 
			
		||||
	GSList *subcategories;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	PROP_0,
 | 
			
		||||
	PROP_PARENT,
 | 
			
		||||
	PROP_NAME,
 | 
			
		||||
	PROP_HUMAN_NAME
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ld_category_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_category_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_category_finalize (GObject *gobject);
 | 
			
		||||
 | 
			
		||||
static void on_category_notify_name (LdCategory *category,
 | 
			
		||||
	GParamSpec *pspec, gpointer user_data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (LdCategory, ld_category, G_TYPE_OBJECT);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_class_init (LdCategoryClass *klass)
 | 
			
		||||
{
 | 
			
		||||
	GObjectClass *object_class;
 | 
			
		||||
	GParamSpec *pspec;
 | 
			
		||||
 | 
			
		||||
	object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
	object_class->get_property = ld_category_get_property;
 | 
			
		||||
	object_class->set_property = ld_category_set_property;
 | 
			
		||||
	object_class->finalize = ld_category_finalize;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategory:parent:
 | 
			
		||||
 *
 | 
			
		||||
 * The parent of this symbol category.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_string ("parent", "Parent",
 | 
			
		||||
		"The parent of this symbol category.",
 | 
			
		||||
		"", G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_PARENT, pspec);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategory:name:
 | 
			
		||||
 *
 | 
			
		||||
 * The name of this symbol category.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_string ("name", "Name",
 | 
			
		||||
		"The name of this symbol category.",
 | 
			
		||||
		"", G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_NAME, pspec);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategory:human-name:
 | 
			
		||||
 *
 | 
			
		||||
 * The localized human name of this symbol category.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_string ("human-name", "Human name",
 | 
			
		||||
		"The localized human name of this symbol category.",
 | 
			
		||||
		"", G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_HUMAN_NAME, pspec);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategory::symbols-changed:
 | 
			
		||||
 *
 | 
			
		||||
 * The list of symbols has changed.
 | 
			
		||||
 */
 | 
			
		||||
	klass->symbols_changed_signal = g_signal_new
 | 
			
		||||
		("symbols-changed", G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
		G_SIGNAL_RUN_LAST, 0, NULL, NULL,
 | 
			
		||||
		g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategory::children-changed:
 | 
			
		||||
 *
 | 
			
		||||
 * The list of subcategory children has changed.
 | 
			
		||||
 */
 | 
			
		||||
	klass->children_changed_signal = g_signal_new
 | 
			
		||||
		("children-changed", G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
		G_SIGNAL_RUN_LAST, 0, NULL, NULL,
 | 
			
		||||
		g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
	g_type_class_add_private (klass, sizeof (LdCategoryPrivate));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_init (LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	self->priv = G_TYPE_INSTANCE_GET_PRIVATE
 | 
			
		||||
		(self, LD_TYPE_CATEGORY, LdCategoryPrivate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY (object);
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_NAME:
 | 
			
		||||
		g_value_set_string (value, ld_category_get_name (self));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_HUMAN_NAME:
 | 
			
		||||
		g_value_set_string (value, ld_category_get_human_name (self));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_PARENT:
 | 
			
		||||
		g_value_set_object (value, ld_category_get_parent (self));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY (object);
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_NAME:
 | 
			
		||||
		ld_category_set_name (self, g_value_get_string (value));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_HUMAN_NAME:
 | 
			
		||||
		ld_category_set_human_name (self, g_value_get_string (value));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_PARENT:
 | 
			
		||||
		ld_category_set_parent (self, g_value_get_object (value));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
uninstall_category_cb (LdCategory *category, LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_signal_handlers_disconnect_by_func (category,
 | 
			
		||||
		on_category_notify_name, self);
 | 
			
		||||
	if (ld_category_get_parent (category) == self)
 | 
			
		||||
		ld_category_set_parent (category, NULL);
 | 
			
		||||
	g_object_unref (category);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
parent_weak_notify (gpointer data, GObject *object)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *self;
 | 
			
		||||
 | 
			
		||||
	/* In practice this should never happen, for it would mean that
 | 
			
		||||
	 * we have a parent that have us as its child.
 | 
			
		||||
	 */
 | 
			
		||||
	self = (LdCategory *) data;
 | 
			
		||||
	if (self->priv->parent)
 | 
			
		||||
	{
 | 
			
		||||
		self->priv->parent = NULL;
 | 
			
		||||
		g_object_notify (G_OBJECT (self), "parent");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_category_finalize (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_CATEGORY (gobject);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->parent)
 | 
			
		||||
		g_object_weak_unref
 | 
			
		||||
			(G_OBJECT (self->priv->parent), parent_weak_notify, self);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->name)
 | 
			
		||||
		g_free (self->priv->name);
 | 
			
		||||
	if (self->priv->human_name)
 | 
			
		||||
		g_free (self->priv->human_name);
 | 
			
		||||
 | 
			
		||||
	g_slist_foreach (self->priv->symbols, (GFunc) g_object_unref, NULL);
 | 
			
		||||
	g_slist_free (self->priv->symbols);
 | 
			
		||||
 | 
			
		||||
	g_slist_foreach (self->priv->subcategories,
 | 
			
		||||
		(GFunc) uninstall_category_cb, self);
 | 
			
		||||
	g_slist_free (self->priv->subcategories);
 | 
			
		||||
 | 
			
		||||
	/* Chain up to the parent class. */
 | 
			
		||||
	G_OBJECT_CLASS (ld_category_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_new:
 | 
			
		||||
 * @name: the name of the new category.
 | 
			
		||||
 * @human_name: the localized human name of the new category.
 | 
			
		||||
 *
 | 
			
		||||
 * Create an instance.
 | 
			
		||||
 */
 | 
			
		||||
LdCategory *
 | 
			
		||||
ld_category_new (const gchar *name, const gchar *human_name)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *cat;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (name != NULL, NULL);
 | 
			
		||||
	g_return_val_if_fail (human_name != NULL, NULL);
 | 
			
		||||
 | 
			
		||||
	cat = g_object_new (LD_TYPE_CATEGORY, NULL);
 | 
			
		||||
	cat->priv->name = g_strdup (name);
 | 
			
		||||
	cat->priv->human_name = g_strdup (human_name);
 | 
			
		||||
 | 
			
		||||
	return cat;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_set_name:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 * @name: the new name for this category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_category_set_name (LdCategory *self, const gchar *name)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (name != NULL);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->name)
 | 
			
		||||
		g_free (self->priv->name);
 | 
			
		||||
	self->priv->name = g_strdup (name);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "name");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_get_name:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return the name of this category.
 | 
			
		||||
 */
 | 
			
		||||
const gchar *
 | 
			
		||||
ld_category_get_name (LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_set_human_name:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 * @human_name: the new localized human name for this category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_category_set_human_name (LdCategory *self, const gchar *human_name)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (human_name != NULL);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->human_name)
 | 
			
		||||
		g_free (self->priv->human_name);
 | 
			
		||||
	self->priv->human_name = g_strdup (human_name);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "human-name");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_get_human_name:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return the localized human name of this category.
 | 
			
		||||
 */
 | 
			
		||||
const gchar *
 | 
			
		||||
ld_category_get_human_name (LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->human_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_insert_symbol:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 * @symbol: the symbol to be inserted.
 | 
			
		||||
 * @pos: the position at which the symbol will be inserted.
 | 
			
		||||
 *       Negative values will append to the end of list.
 | 
			
		||||
 *
 | 
			
		||||
 * Insert a symbol into the category.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: %TRUE if successful (no name collisions).
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
ld_category_insert_symbol (LdCategory *self, LdSymbol *symbol, gint pos)
 | 
			
		||||
{
 | 
			
		||||
	const gchar *name;
 | 
			
		||||
	const GSList *iter;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), FALSE);
 | 
			
		||||
	g_return_val_if_fail (LD_IS_SYMBOL (symbol), FALSE);
 | 
			
		||||
 | 
			
		||||
	/* Check for name collisions. */
 | 
			
		||||
	name = ld_symbol_get_name (symbol);
 | 
			
		||||
	for (iter = self->priv->symbols; iter; iter = iter->next)
 | 
			
		||||
	{
 | 
			
		||||
		if (!strcmp (name, ld_symbol_get_name (iter->data)))
 | 
			
		||||
		{
 | 
			
		||||
			g_warning ("attempted to insert multiple `%s' symbols into"
 | 
			
		||||
				" category `%s'", name, ld_category_get_name (self));
 | 
			
		||||
			return FALSE;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	self->priv->symbols = g_slist_insert (self->priv->symbols, symbol, pos);
 | 
			
		||||
	g_object_ref (symbol);
 | 
			
		||||
 | 
			
		||||
	g_signal_emit (self,
 | 
			
		||||
		LD_CATEGORY_GET_CLASS (self)->symbols_changed_signal, 0);
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_remove_symbol:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 * @symbol: the symbol to be removed.
 | 
			
		||||
 *
 | 
			
		||||
 * Removes a symbol from the category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_category_remove_symbol (LdCategory *self, LdSymbol *symbol)
 | 
			
		||||
{
 | 
			
		||||
	GSList *link;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL (symbol));
 | 
			
		||||
 | 
			
		||||
	if ((link = g_slist_find (self->priv->symbols, symbol)))
 | 
			
		||||
	{
 | 
			
		||||
		self->priv->symbols = g_slist_delete_link (self->priv->symbols, link);
 | 
			
		||||
		g_object_unref (symbol);
 | 
			
		||||
 | 
			
		||||
		g_signal_emit (self,
 | 
			
		||||
			LD_CATEGORY_GET_CLASS (self)->symbols_changed_signal, 0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_get_symbols:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (element-type LdSymbol *): a list of symbols.  Do not modify.
 | 
			
		||||
 */
 | 
			
		||||
const GSList *
 | 
			
		||||
ld_category_get_symbols (LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->symbols;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_set_parent:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 * @parent: the new parent category.
 | 
			
		||||
 *
 | 
			
		||||
 * Set the parent of this category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_category_set_parent (LdCategory *self, LdCategory *parent)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (parent == NULL || LD_IS_CATEGORY (parent));
 | 
			
		||||
 | 
			
		||||
	if (self->priv->parent)
 | 
			
		||||
		g_object_weak_unref
 | 
			
		||||
			(G_OBJECT (self->priv->parent), parent_weak_notify, self);
 | 
			
		||||
 | 
			
		||||
	self->priv->parent = parent;
 | 
			
		||||
 | 
			
		||||
	if (parent)
 | 
			
		||||
		g_object_weak_ref (G_OBJECT (parent), parent_weak_notify, self);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "parent");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_get_parent:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the parent of this category.
 | 
			
		||||
 */
 | 
			
		||||
LdCategory *
 | 
			
		||||
ld_category_get_parent (LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->parent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_get_path:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the path to this category within the library.
 | 
			
		||||
 */
 | 
			
		||||
gchar *
 | 
			
		||||
ld_category_get_path (LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *iter;
 | 
			
		||||
	gchar *path = NULL, *new_path;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), NULL);
 | 
			
		||||
 | 
			
		||||
	for (iter = self; iter; iter = ld_category_get_parent (iter))
 | 
			
		||||
	{
 | 
			
		||||
		const gchar *name;
 | 
			
		||||
 | 
			
		||||
		/* Stop at the root category. */
 | 
			
		||||
		name = ld_category_get_name (iter);
 | 
			
		||||
		if (!strcmp (name, LD_LIBRARY_IDENTIFIER_SEPARATOR))
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		new_path = g_build_path
 | 
			
		||||
			(LD_LIBRARY_IDENTIFIER_SEPARATOR, name, path, NULL);
 | 
			
		||||
		g_free (path);
 | 
			
		||||
		path = new_path;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return path;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_category_notify_name (LdCategory *category,
 | 
			
		||||
	GParamSpec *pspec, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdCategory *self;
 | 
			
		||||
 | 
			
		||||
	self = (LdCategory *) user_data;
 | 
			
		||||
	g_warning ("name of a library subcategory has changed");
 | 
			
		||||
 | 
			
		||||
	/* The easy way of handling it. */
 | 
			
		||||
	g_object_ref (category);
 | 
			
		||||
	ld_category_remove_child (self, category);
 | 
			
		||||
	ld_category_add_child (self, category);
 | 
			
		||||
	g_object_unref (category);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_add_child:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 * @category: the category to be inserted.
 | 
			
		||||
 *
 | 
			
		||||
 * Insert a subcategory into the category.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: %TRUE if successful (no name collisions).
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
ld_category_add_child (LdCategory *self, LdCategory *category)
 | 
			
		||||
{
 | 
			
		||||
	const gchar *name;
 | 
			
		||||
	GSList *iter;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), FALSE);
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (category), FALSE);
 | 
			
		||||
 | 
			
		||||
	name = ld_category_get_name (category);
 | 
			
		||||
	for (iter = self->priv->subcategories; iter; iter = iter->next)
 | 
			
		||||
	{
 | 
			
		||||
		gint comp;
 | 
			
		||||
 | 
			
		||||
		comp = g_utf8_collate (name, ld_category_get_name (iter->data));
 | 
			
		||||
		if (!comp)
 | 
			
		||||
		{
 | 
			
		||||
			g_warning ("attempted to insert multiple `%s' subcategories into"
 | 
			
		||||
				" category `%s'", name, ld_category_get_name (self));
 | 
			
		||||
			return FALSE;
 | 
			
		||||
		}
 | 
			
		||||
		if (comp < 0)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	g_signal_connect (category, "notify::name",
 | 
			
		||||
		G_CALLBACK (on_category_notify_name), self);
 | 
			
		||||
	self->priv->subcategories = g_slist_insert_before
 | 
			
		||||
		(self->priv->subcategories, iter, category);
 | 
			
		||||
	ld_category_set_parent (category, self);
 | 
			
		||||
	g_object_ref (category);
 | 
			
		||||
 | 
			
		||||
	g_signal_emit (self,
 | 
			
		||||
		LD_CATEGORY_GET_CLASS (self)->children_changed_signal, 0);
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_remove_child:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 * @category: the category to be removed.
 | 
			
		||||
 *
 | 
			
		||||
 * Removes a subcategory from the category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_category_remove_child (LdCategory *self, LdCategory *category)
 | 
			
		||||
{
 | 
			
		||||
	GSList *link;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (category));
 | 
			
		||||
 | 
			
		||||
	if ((link = g_slist_find (self->priv->subcategories, category)))
 | 
			
		||||
	{
 | 
			
		||||
		self->priv->subcategories
 | 
			
		||||
			= g_slist_delete_link (self->priv->subcategories, link);
 | 
			
		||||
		uninstall_category_cb (category, self);
 | 
			
		||||
 | 
			
		||||
		g_signal_emit (self,
 | 
			
		||||
			LD_CATEGORY_GET_CLASS (self)->children_changed_signal, 0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_category_get_children:
 | 
			
		||||
 * @self: an #LdCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (element-type LdCategory *):
 | 
			
		||||
 *               a list of subcategories.  Do not modify.
 | 
			
		||||
 */
 | 
			
		||||
const GSList *
 | 
			
		||||
ld_category_get_children (LdCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->subcategories;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										80
									
								
								liblogdiag/ld-category.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,80 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-category.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright 2010, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LD_CATEGORY_H__
 | 
			
		||||
#define __LD_CATEGORY_H__
 | 
			
		||||
 | 
			
		||||
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))
 | 
			
		||||
 | 
			
		||||
typedef struct _LdCategory LdCategory;
 | 
			
		||||
typedef struct _LdCategoryPrivate LdCategoryPrivate;
 | 
			
		||||
typedef struct _LdCategoryClass LdCategoryClass;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdCategory:
 | 
			
		||||
 */
 | 
			
		||||
struct _LdCategory
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GObject parent_instance;
 | 
			
		||||
	LdCategoryPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _LdCategoryClass
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GObjectClass parent_class;
 | 
			
		||||
 | 
			
		||||
	guint symbols_changed_signal;
 | 
			
		||||
	guint children_changed_signal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GType ld_category_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
LdCategory *ld_category_new (const gchar *name, const gchar *human_name);
 | 
			
		||||
 | 
			
		||||
void ld_category_set_name (LdCategory *self, const gchar *name);
 | 
			
		||||
const gchar *ld_category_get_name (LdCategory *self);
 | 
			
		||||
void ld_category_set_human_name (LdCategory *self, const gchar *human_name);
 | 
			
		||||
const gchar *ld_category_get_human_name (LdCategory *self);
 | 
			
		||||
 | 
			
		||||
gboolean ld_category_insert_symbol (LdCategory *self,
 | 
			
		||||
	LdSymbol *symbol, gint pos);
 | 
			
		||||
void ld_category_remove_symbol (LdCategory *self, LdSymbol *symbol);
 | 
			
		||||
const GSList *ld_category_get_symbols (LdCategory *self);
 | 
			
		||||
 | 
			
		||||
void ld_category_set_parent (LdCategory *self, LdCategory *parent);
 | 
			
		||||
LdCategory *ld_category_get_parent (LdCategory *self);
 | 
			
		||||
gchar *ld_category_get_path (LdCategory *self);
 | 
			
		||||
 | 
			
		||||
gboolean ld_category_add_child (LdCategory *self, LdCategory *category);
 | 
			
		||||
void ld_category_remove_child (LdCategory *self, LdCategory *category);
 | 
			
		||||
const GSList *ld_category_get_children (LdCategory *self);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* ! __LD_CATEGORY_H__ */
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram-connection.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -98,7 +98,7 @@ ld_diagram_connection_get_property (GObject *object, guint property_id,
 | 
			
		||||
 | 
			
		||||
	case PROP_POINTS:
 | 
			
		||||
		points = ld_diagram_connection_get_points (self);
 | 
			
		||||
		g_value_set_boxed_take_ownership (value, points);
 | 
			
		||||
		g_value_take_boxed (value, points);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram-connection.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram-object.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -221,8 +221,12 @@ JsonObject *
 | 
			
		||||
ld_diagram_object_get_storage (LdDiagramObject *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_DIAGRAM_OBJECT (self), NULL);
 | 
			
		||||
 | 
			
		||||
	if (!self->priv->storage)
 | 
			
		||||
	{
 | 
			
		||||
		self->priv->storage = json_object_new ();
 | 
			
		||||
		g_object_notify (G_OBJECT (self), "storage");
 | 
			
		||||
	}
 | 
			
		||||
	return self->priv->storage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -245,6 +249,8 @@ ld_diagram_object_set_storage (LdDiagramObject *self, JsonObject *storage)
 | 
			
		||||
		self->priv->storage = json_object_ref (storage);
 | 
			
		||||
	else
 | 
			
		||||
		self->priv->storage = NULL;
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "storage");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram-object.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram-symbol.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram-symbol.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram-view.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -49,8 +49,6 @@ struct _LdDiagramViewClass
 | 
			
		||||
	guint cancel_operation_signal;
 | 
			
		||||
	guint move_signal;
 | 
			
		||||
 | 
			
		||||
	void (*set_scroll_adjustments) (LdDiagramView *self,
 | 
			
		||||
		GtkAdjustment *horizontal, GtkAdjustment *vertical);
 | 
			
		||||
	void (*cancel_operation) (LdDiagramView *self);
 | 
			
		||||
	void (*move) (LdDiagramView *self, gdouble dx, gdouble dy);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -31,7 +31,6 @@
 | 
			
		||||
 *              each containing a #GList of #LdUndoAction subactions.
 | 
			
		||||
 * @objects: all objects in the diagram.
 | 
			
		||||
 * @selection: all currently selected objects.
 | 
			
		||||
 * @connections: connections between objects.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdDiagramPrivate
 | 
			
		||||
{
 | 
			
		||||
@@ -43,7 +42,6 @@ struct _LdDiagramPrivate
 | 
			
		||||
 | 
			
		||||
	GList *objects;
 | 
			
		||||
	GList *selection;
 | 
			
		||||
	GList *connections;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct _ObjectActionData ObjectActionData;
 | 
			
		||||
@@ -56,7 +54,7 @@ typedef struct _ObjectActionData ObjectActionData;
 | 
			
		||||
 */
 | 
			
		||||
struct _ObjectActionData
 | 
			
		||||
{
 | 
			
		||||
	LdDiagram *self;
 | 
			
		||||
	gpointer self;
 | 
			
		||||
	LdDiagramObject *object;
 | 
			
		||||
	gint pos;
 | 
			
		||||
};
 | 
			
		||||
@@ -76,6 +74,7 @@ static void ld_diagram_set_property (GObject *object, guint property_id,
 | 
			
		||||
static void ld_diagram_dispose (GObject *gobject);
 | 
			
		||||
static void ld_diagram_finalize (GObject *gobject);
 | 
			
		||||
static void ld_diagram_real_changed (LdDiagram *self);
 | 
			
		||||
static void ld_diagram_clear_internal (LdDiagram *self, gboolean emit_signals);
 | 
			
		||||
 | 
			
		||||
static gboolean write_signature (GOutputStream *stream, GError **error);
 | 
			
		||||
 | 
			
		||||
@@ -232,7 +231,7 @@ ld_diagram_dispose (GObject *gobject)
 | 
			
		||||
	LdDiagram *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_DIAGRAM (gobject);
 | 
			
		||||
	ld_diagram_clear (self);
 | 
			
		||||
	ld_diagram_clear_internal (self, FALSE);
 | 
			
		||||
 | 
			
		||||
	/* Chain up to the parent class. */
 | 
			
		||||
	G_OBJECT_CLASS (ld_diagram_parent_class)->dispose (gobject);
 | 
			
		||||
@@ -286,24 +285,23 @@ ld_diagram_new (void)
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_diagram_clear (LdDiagram *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_DIAGRAM (self));
 | 
			
		||||
	ld_diagram_clear_internal (self, TRUE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_diagram_clear_internal (LdDiagram *self, gboolean emit_signals)
 | 
			
		||||
{
 | 
			
		||||
	gboolean changed = FALSE;
 | 
			
		||||
	gboolean selection_changed = FALSE;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_DIAGRAM (self));
 | 
			
		||||
 | 
			
		||||
	if (self->priv->selection)
 | 
			
		||||
	{
 | 
			
		||||
		ld_diagram_unselect_all_internal (self);
 | 
			
		||||
		selection_changed = TRUE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (self->priv->connections)
 | 
			
		||||
	{
 | 
			
		||||
		g_list_free (self->priv->connections);
 | 
			
		||||
		self->priv->connections = NULL;
 | 
			
		||||
		changed = TRUE;
 | 
			
		||||
	}
 | 
			
		||||
	if (self->priv->objects)
 | 
			
		||||
	{
 | 
			
		||||
		g_list_foreach (self->priv->objects, (GFunc) uninstall_object, self);
 | 
			
		||||
@@ -315,15 +313,18 @@ ld_diagram_clear (LdDiagram *self)
 | 
			
		||||
	destroy_action_stack (&self->priv->undo_stack);
 | 
			
		||||
	destroy_action_stack (&self->priv->redo_stack);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "can-undo");
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "can-redo");
 | 
			
		||||
	if (emit_signals)
 | 
			
		||||
	{
 | 
			
		||||
		g_object_notify (G_OBJECT (self), "can-undo");
 | 
			
		||||
		g_object_notify (G_OBJECT (self), "can-redo");
 | 
			
		||||
 | 
			
		||||
	if (changed)
 | 
			
		||||
		g_signal_emit (self,
 | 
			
		||||
			LD_DIAGRAM_GET_CLASS (self)->changed_signal, 0);
 | 
			
		||||
	if (selection_changed)
 | 
			
		||||
		g_signal_emit (self,
 | 
			
		||||
			LD_DIAGRAM_GET_CLASS (self)->selection_changed_signal, 0);
 | 
			
		||||
		if (changed)
 | 
			
		||||
			g_signal_emit (self,
 | 
			
		||||
				LD_DIAGRAM_GET_CLASS (self)->changed_signal, 0);
 | 
			
		||||
		if (selection_changed)
 | 
			
		||||
			g_signal_emit (self,
 | 
			
		||||
				LD_DIAGRAM_GET_CLASS (self)->selection_changed_signal, 0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -809,7 +810,9 @@ on_object_action_remove (gpointer user_data)
 | 
			
		||||
	ObjectActionData *data;
 | 
			
		||||
 | 
			
		||||
	data = user_data;
 | 
			
		||||
	ld_diagram_remove_object (data->self, data->object);
 | 
			
		||||
	g_return_if_fail (data->self != NULL);
 | 
			
		||||
	ld_diagram_remove_object
 | 
			
		||||
		((LdDiagram *) data->self, data->object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -818,7 +821,9 @@ on_object_action_insert (gpointer user_data)
 | 
			
		||||
	ObjectActionData *data;
 | 
			
		||||
 | 
			
		||||
	data = user_data;
 | 
			
		||||
	ld_diagram_insert_object (data->self, data->object, data->pos);
 | 
			
		||||
	g_return_if_fail (data->self != NULL);
 | 
			
		||||
	ld_diagram_insert_object
 | 
			
		||||
		((LdDiagram *) data->self, data->object, data->pos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -827,7 +832,8 @@ on_object_action_destroy (gpointer user_data)
 | 
			
		||||
	ObjectActionData *data;
 | 
			
		||||
 | 
			
		||||
	data = user_data;
 | 
			
		||||
	g_object_unref (data->self);
 | 
			
		||||
	if (data->self)
 | 
			
		||||
		g_object_remove_weak_pointer (G_OBJECT (data->self), &data->self);
 | 
			
		||||
	g_object_unref (data->object);
 | 
			
		||||
	g_slice_free (ObjectActionData, data);
 | 
			
		||||
}
 | 
			
		||||
@@ -891,7 +897,8 @@ ld_diagram_insert_object (LdDiagram *self, LdDiagramObject *object, gint pos)
 | 
			
		||||
	install_object (object, self);
 | 
			
		||||
 | 
			
		||||
	action_data = g_slice_new (ObjectActionData);
 | 
			
		||||
	action_data->self = g_object_ref (self);
 | 
			
		||||
	action_data->self = self;
 | 
			
		||||
	g_object_add_weak_pointer (G_OBJECT (self), &action_data->self);
 | 
			
		||||
	action_data->object = g_object_ref (object);
 | 
			
		||||
	action_data->pos = pos;
 | 
			
		||||
 | 
			
		||||
@@ -938,7 +945,8 @@ ld_diagram_remove_object (LdDiagram *self, LdDiagramObject *object)
 | 
			
		||||
	uninstall_object (object, self);
 | 
			
		||||
 | 
			
		||||
	action_data = g_slice_new (ObjectActionData);
 | 
			
		||||
	action_data->self = g_object_ref (self);
 | 
			
		||||
	action_data->self = self;
 | 
			
		||||
	g_object_add_weak_pointer (G_OBJECT (self), &action_data->self);
 | 
			
		||||
	action_data->object = g_object_ref (object);
 | 
			
		||||
	action_data->pos = pos;
 | 
			
		||||
 | 
			
		||||
@@ -1024,13 +1032,15 @@ ld_diagram_select (LdDiagram *self, LdDiagramObject *object)
 | 
			
		||||
void
 | 
			
		||||
ld_diagram_unselect (LdDiagram *self, LdDiagramObject *object)
 | 
			
		||||
{
 | 
			
		||||
	GList *link;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_DIAGRAM (self));
 | 
			
		||||
	g_return_if_fail (LD_IS_DIAGRAM_OBJECT (object));
 | 
			
		||||
 | 
			
		||||
	if (!g_list_find (self->priv->selection, object))
 | 
			
		||||
	if (!(link = g_list_find (self->priv->selection, object)))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	self->priv->selection = g_list_remove (self->priv->selection, object);
 | 
			
		||||
	self->priv->selection = g_list_delete_link (self->priv->selection, link);
 | 
			
		||||
	g_object_unref (object);
 | 
			
		||||
 | 
			
		||||
	g_signal_emit (self,
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-diagram.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,787 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-library-toolbar.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2011. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "liblogdiag.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:ld-library-toolbar
 | 
			
		||||
 * @short_description: A library toolbar
 | 
			
		||||
 * @see_also: #LdLibrary
 | 
			
		||||
 *
 | 
			
		||||
 * #LdLibraryToolbar enables the user to choose symbols from an #LdLibrary.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define LIBRARY_TOOLBAR_ICON_WIDTH 32
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * SymbolMenuItem:
 | 
			
		||||
 *
 | 
			
		||||
 * Data related to a symbol in an open symbol menu.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _SymbolMenuItem SymbolMenuItem;
 | 
			
		||||
 | 
			
		||||
struct _SymbolMenuItem
 | 
			
		||||
{
 | 
			
		||||
	LdSymbol *symbol;
 | 
			
		||||
	gchar *klass;
 | 
			
		||||
 | 
			
		||||
	gint width;
 | 
			
		||||
	gdouble dx;
 | 
			
		||||
	gdouble scale;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * SymbolMenuData:
 | 
			
		||||
 *
 | 
			
		||||
 * Data related to the currently opened symbol menu.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _SymbolMenuData SymbolMenuData;
 | 
			
		||||
 | 
			
		||||
struct _SymbolMenuData
 | 
			
		||||
{
 | 
			
		||||
	GtkToggleButton *active_button;
 | 
			
		||||
 | 
			
		||||
	SymbolMenuItem *items;
 | 
			
		||||
	gint n_items;
 | 
			
		||||
	gint active_item;
 | 
			
		||||
 | 
			
		||||
	gint menu_width;
 | 
			
		||||
	gint menu_height;
 | 
			
		||||
	gint menu_y;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	VIEW_HANDLER_EXPOSE,
 | 
			
		||||
	VIEW_HANDLER_MOTION_NOTIFY,
 | 
			
		||||
	VIEW_HANDLER_BUTTON_PRESS,
 | 
			
		||||
	VIEW_HANDLER_BUTTON_RELEASE,
 | 
			
		||||
	VIEW_HANDLER_COUNT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LdLibraryToolbarPrivate:
 | 
			
		||||
 * @library: a library object assigned as a model.
 | 
			
		||||
 * @view: a view widget for showing symbol menus.
 | 
			
		||||
 * @view_handlers: signal handlers that hook the view.
 | 
			
		||||
 * @symbol_menu: data related to menus.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdLibraryToolbarPrivate
 | 
			
		||||
{
 | 
			
		||||
	LdLibrary *library;
 | 
			
		||||
	LdDiagramView *view;
 | 
			
		||||
	gulong view_handlers[VIEW_HANDLER_COUNT];
 | 
			
		||||
	SymbolMenuData symbol_menu;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	PROP_0,
 | 
			
		||||
	PROP_LIBRARY,
 | 
			
		||||
	PROP_VIEW
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ld_library_toolbar_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_library_toolbar_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_library_toolbar_dispose (GObject *gobject);
 | 
			
		||||
 | 
			
		||||
static void reload_library (LdLibraryToolbar *self);
 | 
			
		||||
static void load_category_cb (gpointer data, gpointer user_data);
 | 
			
		||||
static GdkPixbuf *recolor_pixbuf (GdkPixbuf *pbuf, GdkColor *color);
 | 
			
		||||
 | 
			
		||||
static void redraw_symbol_menu (LdLibraryToolbar *self);
 | 
			
		||||
static void emit_symbol_signal (LdLibraryToolbar *self,
 | 
			
		||||
	guint signal_id, gint menu_index);
 | 
			
		||||
static void on_category_toggle (GtkToggleButton *toggle_button,
 | 
			
		||||
	gpointer user_data);
 | 
			
		||||
 | 
			
		||||
static inline void block_view_handlers (LdLibraryToolbar *self);
 | 
			
		||||
static inline void unblock_view_handlers (LdLibraryToolbar *self);
 | 
			
		||||
static inline void disconnect_view_handlers (LdLibraryToolbar *self);
 | 
			
		||||
static gboolean on_view_exposed (GtkWidget *widget,
 | 
			
		||||
	GdkEventExpose *event, gpointer user_data);
 | 
			
		||||
static gboolean on_view_motion_notify (GtkWidget *widget,
 | 
			
		||||
	GdkEventMotion *event, gpointer user_data);
 | 
			
		||||
static gboolean on_view_button_press (GtkWidget *widget,
 | 
			
		||||
	GdkEventButton *event, gpointer user_data);
 | 
			
		||||
static gboolean on_view_button_release (GtkWidget *widget,
 | 
			
		||||
	GdkEventButton *event, gpointer user_data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (LdLibraryToolbar, ld_library_toolbar, GTK_TYPE_TOOLBAR);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_library_toolbar_class_init (LdLibraryToolbarClass *klass)
 | 
			
		||||
{
 | 
			
		||||
	GObjectClass *object_class;
 | 
			
		||||
	GtkWidgetClass *widget_class;
 | 
			
		||||
	GParamSpec *pspec;
 | 
			
		||||
 | 
			
		||||
	widget_class = GTK_WIDGET_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
	object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
	object_class->get_property = ld_library_toolbar_get_property;
 | 
			
		||||
	object_class->set_property = ld_library_toolbar_set_property;
 | 
			
		||||
	object_class->dispose = ld_library_toolbar_dispose;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdLibraryToolbar:library:
 | 
			
		||||
 *
 | 
			
		||||
 * The #LdLibrary that this toolbar retrieves symbols from.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_object ("library", "Library",
 | 
			
		||||
		"The library that this toolbar retrieves symbols from.",
 | 
			
		||||
		LD_TYPE_LIBRARY, G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_LIBRARY, pspec);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdLibraryToolbar:view:
 | 
			
		||||
 *
 | 
			
		||||
 * The #LdDiagramView widget misused for showing symbol menus.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_object ("view", "View",
 | 
			
		||||
		"The view widget misused for showing symbol menus.",
 | 
			
		||||
		LD_TYPE_DIAGRAM_VIEW, G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_VIEW, pspec);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdLibraryToolbar::symbol-chosen:
 | 
			
		||||
 * @self: an #LdLibraryToolbar object.
 | 
			
		||||
 * @symbol: the chosen #LdSymbol object.
 | 
			
		||||
 * @klass: location of the symbol within the library.
 | 
			
		||||
 *
 | 
			
		||||
 * A symbol has been chosen.
 | 
			
		||||
 */
 | 
			
		||||
	klass->symbol_chosen_signal = g_signal_new
 | 
			
		||||
		("symbol-chosen", G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
		G_SIGNAL_RUN_LAST, 0, NULL, NULL,
 | 
			
		||||
		ld_marshal_VOID__OBJECT_STRING,
 | 
			
		||||
		G_TYPE_NONE, 2, LD_TYPE_SYMBOL,
 | 
			
		||||
		G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdLibraryToolbar::symbol-selected:
 | 
			
		||||
 * @self: an #LdLibraryToolbar object.
 | 
			
		||||
 * @symbol: the selected #LdSymbol object.
 | 
			
		||||
 * @klass: location of the symbol within the library.
 | 
			
		||||
 *
 | 
			
		||||
 * A symbol has been selected.
 | 
			
		||||
 */
 | 
			
		||||
	klass->symbol_selected_signal = g_signal_new
 | 
			
		||||
		("symbol-selected", G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
		G_SIGNAL_RUN_LAST, 0, NULL, NULL,
 | 
			
		||||
		ld_marshal_VOID__OBJECT_STRING,
 | 
			
		||||
		G_TYPE_NONE, 2, LD_TYPE_SYMBOL,
 | 
			
		||||
		G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdLibraryToolbar::symbol-deselected:
 | 
			
		||||
 * @self: an #LdLibraryToolbar object.
 | 
			
		||||
 * @symbol: the deselected #LdSymbol object.
 | 
			
		||||
 * @klass: location of the symbol within the library.
 | 
			
		||||
 *
 | 
			
		||||
 * A symbol has been deselected.
 | 
			
		||||
 */
 | 
			
		||||
	klass->symbol_deselected_signal = g_signal_new
 | 
			
		||||
		("symbol-deselected", G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
		G_SIGNAL_RUN_LAST, 0, NULL, NULL,
 | 
			
		||||
		ld_marshal_VOID__OBJECT_STRING,
 | 
			
		||||
		G_TYPE_NONE, 2, LD_TYPE_SYMBOL,
 | 
			
		||||
		G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
 | 
			
		||||
 | 
			
		||||
	g_type_class_add_private (klass, sizeof (LdLibraryToolbarPrivate));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_library_toolbar_init (LdLibraryToolbar *self)
 | 
			
		||||
{
 | 
			
		||||
	self->priv = G_TYPE_INSTANCE_GET_PRIVATE
 | 
			
		||||
		(self, LD_TYPE_LIBRARY_TOOLBAR, LdLibraryToolbarPrivate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_library_toolbar_dispose (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (gobject);
 | 
			
		||||
 | 
			
		||||
	ld_library_toolbar_set_library (self, NULL);
 | 
			
		||||
	ld_library_toolbar_set_view (self, NULL);
 | 
			
		||||
 | 
			
		||||
	/* Chain up to the parent class. */
 | 
			
		||||
	G_OBJECT_CLASS (ld_library_toolbar_parent_class)->dispose (gobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_library_toolbar_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (object);
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_LIBRARY:
 | 
			
		||||
		g_value_set_object (value, ld_library_toolbar_get_library (self));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_VIEW:
 | 
			
		||||
		g_value_set_object (value, ld_library_toolbar_get_view (self));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_library_toolbar_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (object);
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_LIBRARY:
 | 
			
		||||
		ld_library_toolbar_set_library (self,
 | 
			
		||||
			LD_LIBRARY (g_value_get_object (value)));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_VIEW:
 | 
			
		||||
		ld_library_toolbar_set_view (self,
 | 
			
		||||
			LD_DIAGRAM_VIEW (g_value_get_object (value)));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_toolbar_new:
 | 
			
		||||
 *
 | 
			
		||||
 * Create an instance.
 | 
			
		||||
 */
 | 
			
		||||
GtkWidget *
 | 
			
		||||
ld_library_toolbar_new (void)
 | 
			
		||||
{
 | 
			
		||||
	return g_object_new (LD_TYPE_LIBRARY_TOOLBAR, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_toolbar_set_library:
 | 
			
		||||
 * @self: an #LdLibraryToolbar object.
 | 
			
		||||
 * @library: (allow-none): the library to be assigned to the toolbar.
 | 
			
		||||
 *
 | 
			
		||||
 * Assign an #LdLibrary object to the toolbar.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_library_toolbar_set_library (LdLibraryToolbar *self, LdLibrary *library)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY_TOOLBAR (self));
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY (library) || library == NULL);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->library)
 | 
			
		||||
	{
 | 
			
		||||
		g_signal_handlers_disconnect_by_func (self->priv->library,
 | 
			
		||||
			reload_library, self);
 | 
			
		||||
		g_object_unref (self->priv->library);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	self->priv->library = library;
 | 
			
		||||
 | 
			
		||||
	if (library)
 | 
			
		||||
	{
 | 
			
		||||
		g_signal_connect_data (library, "changed",
 | 
			
		||||
			G_CALLBACK (reload_library), self,
 | 
			
		||||
			NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
 | 
			
		||||
		g_object_ref (library);
 | 
			
		||||
	}
 | 
			
		||||
	reload_library (self);
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "library");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_toolbar_get_library:
 | 
			
		||||
 * @self: an #LdLibraryToolbar object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): the #LdLibrary object
 | 
			
		||||
 *               assigned to the toolbar.
 | 
			
		||||
 */
 | 
			
		||||
LdLibrary *
 | 
			
		||||
ld_library_toolbar_get_library (LdLibraryToolbar *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_LIBRARY_TOOLBAR (self), NULL);
 | 
			
		||||
	return self->priv->library;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_toolbar_set_view:
 | 
			
		||||
 * @self: an #LdLibraryToolbar object.
 | 
			
		||||
 * @view: (allow-none): the widget to be assigned to the toolbar.
 | 
			
		||||
 *
 | 
			
		||||
 * Assign an #LdDiagramView widget to the toolbar.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_library_toolbar_set_view (LdLibraryToolbar *self, LdDiagramView *view)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY_TOOLBAR (self));
 | 
			
		||||
	g_return_if_fail (LD_IS_DIAGRAM_VIEW (view) || view == NULL);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->view)
 | 
			
		||||
	{
 | 
			
		||||
		disconnect_view_handlers (self);
 | 
			
		||||
		g_object_unref (self->priv->view);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	self->priv->view = view;
 | 
			
		||||
 | 
			
		||||
	if (view)
 | 
			
		||||
	{
 | 
			
		||||
		self->priv->view_handlers[VIEW_HANDLER_EXPOSE]
 | 
			
		||||
			= g_signal_connect (view, "expose-event",
 | 
			
		||||
			G_CALLBACK (on_view_exposed), self);
 | 
			
		||||
		self->priv->view_handlers[VIEW_HANDLER_MOTION_NOTIFY]
 | 
			
		||||
			= g_signal_connect (view, "motion-notify-event",
 | 
			
		||||
			G_CALLBACK (on_view_motion_notify), self);
 | 
			
		||||
		self->priv->view_handlers[VIEW_HANDLER_BUTTON_PRESS]
 | 
			
		||||
			= g_signal_connect (view, "button-press-event",
 | 
			
		||||
			G_CALLBACK (on_view_button_press), self);
 | 
			
		||||
		self->priv->view_handlers[VIEW_HANDLER_BUTTON_RELEASE]
 | 
			
		||||
			= g_signal_connect (view, "button-release-event",
 | 
			
		||||
			G_CALLBACK (on_view_button_release), self);
 | 
			
		||||
 | 
			
		||||
		block_view_handlers (self);
 | 
			
		||||
		g_object_ref (view);
 | 
			
		||||
	}
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "view");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_toolbar_get_view:
 | 
			
		||||
 * @self: an #LdLibraryToolbar object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): the #LdDiagramView widget
 | 
			
		||||
 *               assigned to the toolbar.
 | 
			
		||||
 */
 | 
			
		||||
LdDiagramView *
 | 
			
		||||
ld_library_toolbar_get_view (LdLibraryToolbar *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_LIBRARY_TOOLBAR (self), NULL);
 | 
			
		||||
	return self->priv->view;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
reload_library (LdLibraryToolbar *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY_TOOLBAR (self));
 | 
			
		||||
 | 
			
		||||
	/* Clear the toolbar first, if there was already something in it. */
 | 
			
		||||
	gtk_container_foreach (GTK_CONTAINER (self),
 | 
			
		||||
		(GtkCallback) gtk_widget_destroy, NULL);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->library)
 | 
			
		||||
	{
 | 
			
		||||
		GSList *categories;
 | 
			
		||||
 | 
			
		||||
		categories = (GSList *) ld_library_get_children (self->priv->library);
 | 
			
		||||
		g_slist_foreach (categories, load_category_cb, self);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
load_category_cb (gpointer data, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
	LdSymbolCategory *cat;
 | 
			
		||||
	const gchar *human_name;
 | 
			
		||||
	GdkPixbuf *pbuf, *new_pbuf;
 | 
			
		||||
	GtkWidget *img;
 | 
			
		||||
	GtkToolItem *item;
 | 
			
		||||
	GtkWidget *button;
 | 
			
		||||
	GtkStyle *style;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY_TOOLBAR (user_data));
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL_CATEGORY (data));
 | 
			
		||||
 | 
			
		||||
	self = user_data;
 | 
			
		||||
	cat = data;
 | 
			
		||||
 | 
			
		||||
	pbuf = gdk_pixbuf_new_from_file_at_size	(ld_symbol_category_get_image_path
 | 
			
		||||
		(cat), LIBRARY_TOOLBAR_ICON_WIDTH, -1, NULL);
 | 
			
		||||
	g_return_if_fail (pbuf != NULL);
 | 
			
		||||
 | 
			
		||||
	button = gtk_toggle_button_new ();
 | 
			
		||||
	style = gtk_rc_get_style (button);
 | 
			
		||||
 | 
			
		||||
	/* TODO: Handle all states. */
 | 
			
		||||
	new_pbuf = recolor_pixbuf (pbuf, &style->fg[GTK_STATE_NORMAL]);
 | 
			
		||||
	if (new_pbuf)
 | 
			
		||||
	{
 | 
			
		||||
		g_object_unref (pbuf);
 | 
			
		||||
		pbuf = new_pbuf;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	img = gtk_image_new_from_pixbuf (pbuf);
 | 
			
		||||
	g_object_unref (pbuf);
 | 
			
		||||
 | 
			
		||||
	item = gtk_tool_item_new ();
 | 
			
		||||
	gtk_container_add (GTK_CONTAINER (button), img);
 | 
			
		||||
	gtk_container_add (GTK_CONTAINER (item), button);
 | 
			
		||||
 | 
			
		||||
	/* Don't steal focus from the view. */
 | 
			
		||||
	g_object_set (button, "can-focus", FALSE, NULL);
 | 
			
		||||
 | 
			
		||||
	/* Assign the category to the toggle button. */
 | 
			
		||||
	/* TODO: Move this to the data parameter for the signal handler.
 | 
			
		||||
	 *       Use g_signal_connect_data() to set up destroy notification.
 | 
			
		||||
	 */
 | 
			
		||||
	g_object_ref (cat);
 | 
			
		||||
	g_object_set_data_full (G_OBJECT (button),
 | 
			
		||||
		"category", cat, (GDestroyNotify) g_object_unref);
 | 
			
		||||
 | 
			
		||||
	/* Hook toggling of the button. */
 | 
			
		||||
	g_signal_connect (button, "toggled", G_CALLBACK (on_category_toggle), self);
 | 
			
		||||
 | 
			
		||||
	human_name = ld_symbol_category_get_human_name (cat);
 | 
			
		||||
	gtk_tool_item_set_tooltip_text (item, human_name);
 | 
			
		||||
	gtk_toolbar_insert (GTK_TOOLBAR (self), item, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GdkPixbuf *
 | 
			
		||||
recolor_pixbuf (GdkPixbuf *pbuf, GdkColor *color)
 | 
			
		||||
{
 | 
			
		||||
	gint width, height;
 | 
			
		||||
	GdkPixbuf *new_pbuf;
 | 
			
		||||
	cairo_surface_t *cr_surface;
 | 
			
		||||
	cairo_t *cr;
 | 
			
		||||
 | 
			
		||||
	width  = gdk_pixbuf_get_width  (pbuf);
 | 
			
		||||
	height = gdk_pixbuf_get_height (pbuf);
 | 
			
		||||
 | 
			
		||||
	new_pbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
 | 
			
		||||
	g_return_val_if_fail (new_pbuf != NULL, NULL);
 | 
			
		||||
 | 
			
		||||
	cr_surface = cairo_image_surface_create_for_data
 | 
			
		||||
		(gdk_pixbuf_get_pixels (new_pbuf), CAIRO_FORMAT_ARGB32,
 | 
			
		||||
		width, height, gdk_pixbuf_get_rowstride (new_pbuf));
 | 
			
		||||
	cr = cairo_create (cr_surface);
 | 
			
		||||
 | 
			
		||||
	/* Change the color of all pixels but leave the alpha channel intact. */
 | 
			
		||||
	gdk_cairo_set_source_color (cr, color);
 | 
			
		||||
	cairo_paint (cr);
 | 
			
		||||
 | 
			
		||||
	cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN);
 | 
			
		||||
	gdk_cairo_set_source_pixbuf (cr, pbuf, 0, 0);
 | 
			
		||||
	cairo_paint (cr);
 | 
			
		||||
 | 
			
		||||
	cairo_destroy (cr);
 | 
			
		||||
	cairo_surface_destroy (cr_surface);
 | 
			
		||||
	return new_pbuf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
redraw_symbol_menu (LdLibraryToolbar *self)
 | 
			
		||||
{
 | 
			
		||||
	SymbolMenuData *data;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY_TOOLBAR (self));
 | 
			
		||||
	data = &self->priv->symbol_menu;
 | 
			
		||||
 | 
			
		||||
	gtk_widget_queue_draw_area (GTK_WIDGET (self->priv->view),
 | 
			
		||||
		0, data->menu_y - 1, data->menu_width + 2, data->menu_height + 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
emit_symbol_signal (LdLibraryToolbar *self, guint signal_id, gint menu_index)
 | 
			
		||||
{
 | 
			
		||||
	SymbolMenuData *data;
 | 
			
		||||
	SymbolMenuItem *item;
 | 
			
		||||
 | 
			
		||||
	data = &self->priv->symbol_menu;
 | 
			
		||||
	if (menu_index == -1)
 | 
			
		||||
		menu_index = data->active_item;
 | 
			
		||||
	if (menu_index != -1)
 | 
			
		||||
	{
 | 
			
		||||
		item = &data->items[menu_index];
 | 
			
		||||
		g_signal_emit (self, signal_id, 0, item->symbol, item->klass);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_category_toggle (GtkToggleButton *toggle_button, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
	LdLibraryToolbarPrivate *priv;
 | 
			
		||||
	LdSymbolCategory *cat;
 | 
			
		||||
	SymbolMenuData *data;
 | 
			
		||||
	const gchar *category_name, *symbol_name;
 | 
			
		||||
 | 
			
		||||
	cat = g_object_get_data (G_OBJECT (toggle_button), "category");
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (user_data);
 | 
			
		||||
	priv = self->priv;
 | 
			
		||||
	data = &priv->symbol_menu;
 | 
			
		||||
 | 
			
		||||
	/* First untoggle any active button. */
 | 
			
		||||
	if (data->active_button)
 | 
			
		||||
		gtk_toggle_button_set_active (data->active_button, FALSE);
 | 
			
		||||
 | 
			
		||||
	/* And toggle signal handlers that enable the user to add a symbol. */
 | 
			
		||||
	if (data->active_button == toggle_button)
 | 
			
		||||
	{
 | 
			
		||||
		gint i;
 | 
			
		||||
 | 
			
		||||
		block_view_handlers (self);
 | 
			
		||||
 | 
			
		||||
		g_object_unref (data->active_button);
 | 
			
		||||
		data->active_button = NULL;
 | 
			
		||||
 | 
			
		||||
		emit_symbol_signal (self, LD_LIBRARY_TOOLBAR_GET_CLASS (self)
 | 
			
		||||
			->symbol_deselected_signal, -1);
 | 
			
		||||
 | 
			
		||||
		/* Ashes to ashes, NULL to NULL. */
 | 
			
		||||
		for (i = 0; i < data->n_items; i++)
 | 
			
		||||
		{
 | 
			
		||||
			g_object_unref (data->items[i].symbol);
 | 
			
		||||
			g_free (data->items[i].klass);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		g_free (data->items);
 | 
			
		||||
		data->items = NULL;
 | 
			
		||||
 | 
			
		||||
		gtk_grab_remove (GTK_WIDGET (self->priv->view));
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		const GSList *children, *symbol_iter;
 | 
			
		||||
		SymbolMenuItem *item;
 | 
			
		||||
		gint x, y, menu_width;
 | 
			
		||||
 | 
			
		||||
		g_return_if_fail (gtk_widget_translate_coordinates (GTK_WIDGET
 | 
			
		||||
			(toggle_button), GTK_WIDGET (priv->view), 0, 0, &x, &y));
 | 
			
		||||
 | 
			
		||||
		data->menu_y = y;
 | 
			
		||||
		data->menu_height = GTK_WIDGET (toggle_button)->allocation.height;
 | 
			
		||||
 | 
			
		||||
		unblock_view_handlers (self);
 | 
			
		||||
 | 
			
		||||
		data->active_button = toggle_button;
 | 
			
		||||
		g_object_ref (data->active_button);
 | 
			
		||||
 | 
			
		||||
		category_name = ld_symbol_category_get_name (cat);
 | 
			
		||||
		children = ld_symbol_category_get_children (cat);
 | 
			
		||||
 | 
			
		||||
		data->n_items = g_slist_length ((GSList *) children);
 | 
			
		||||
		data->items = g_new (SymbolMenuItem, data->n_items);
 | 
			
		||||
		data->active_item = -1;
 | 
			
		||||
 | 
			
		||||
		item = data->items;
 | 
			
		||||
		menu_width = 0;
 | 
			
		||||
		for (symbol_iter = children; symbol_iter;
 | 
			
		||||
			symbol_iter = symbol_iter->next)
 | 
			
		||||
		{
 | 
			
		||||
			LdRectangle area;
 | 
			
		||||
 | 
			
		||||
			item->symbol = LD_SYMBOL (symbol_iter->data);
 | 
			
		||||
			g_object_ref (item->symbol);
 | 
			
		||||
 | 
			
		||||
			symbol_name = ld_symbol_get_name (item->symbol);
 | 
			
		||||
			item->klass = g_build_path (LD_LIBRARY_IDENTIFIER_SEPARATOR,
 | 
			
		||||
				category_name, symbol_name, NULL);
 | 
			
		||||
 | 
			
		||||
			ld_symbol_get_area (item->symbol, &area);
 | 
			
		||||
 | 
			
		||||
			/* This is the height when the center of the symbol is
 | 
			
		||||
			 * in the center of it's symbol menu item.
 | 
			
		||||
			 */
 | 
			
		||||
			item->scale = data->menu_height * 0.5
 | 
			
		||||
				/ MAX (ABS (area.y), ABS (area.y + area.height)) * 0.5;
 | 
			
		||||
			if (item->scale * area.width > 1.5 * data->menu_height)
 | 
			
		||||
				item->scale = 1.5 * data->menu_height / area.width;
 | 
			
		||||
			item->width = data->menu_height * 0.5 + item->scale * area.width;
 | 
			
		||||
			item->dx = item->width * 0.5 + item->scale
 | 
			
		||||
				* (area.width * 0.5 - ABS (area.x + area.width));
 | 
			
		||||
 | 
			
		||||
			menu_width += item++->width;
 | 
			
		||||
		}
 | 
			
		||||
		data->menu_width = menu_width;
 | 
			
		||||
 | 
			
		||||
		gtk_grab_add (GTK_WIDGET (self->priv->view));
 | 
			
		||||
	}
 | 
			
		||||
	redraw_symbol_menu (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define DEFINE_VIEW_HANDLER_FUNC(name) \
 | 
			
		||||
static inline void \
 | 
			
		||||
name ## _view_handlers (LdLibraryToolbar *self) \
 | 
			
		||||
{ \
 | 
			
		||||
	gint i; \
 | 
			
		||||
	g_return_if_fail (LD_IS_DIAGRAM_VIEW (self->priv->view)); \
 | 
			
		||||
	for (i = 0; i < VIEW_HANDLER_COUNT; i++) \
 | 
			
		||||
		g_signal_handler_ ## name (self->priv->view, \
 | 
			
		||||
			self->priv->view_handlers[i]); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_VIEW_HANDLER_FUNC (block)
 | 
			
		||||
DEFINE_VIEW_HANDLER_FUNC (unblock)
 | 
			
		||||
DEFINE_VIEW_HANDLER_FUNC (disconnect)
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_view_exposed (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	cairo_t *cr;
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
	SymbolMenuData *data;
 | 
			
		||||
	gint i, x;
 | 
			
		||||
 | 
			
		||||
	cr = gdk_cairo_create (widget->window);
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (user_data);
 | 
			
		||||
	data = &self->priv->symbol_menu;
 | 
			
		||||
 | 
			
		||||
	/* Draw some border. */
 | 
			
		||||
	cairo_set_line_width (cr, 1);
 | 
			
		||||
 | 
			
		||||
	cairo_rectangle (cr, 0, data->menu_y, data->menu_width, data->menu_height);
 | 
			
		||||
	cairo_set_source_rgb (cr, 1, 1, 1);
 | 
			
		||||
	cairo_fill (cr);
 | 
			
		||||
 | 
			
		||||
	/* Draw all symbols from that category. */
 | 
			
		||||
	for (x = i = 0; i < data->n_items; i++)
 | 
			
		||||
	{
 | 
			
		||||
		SymbolMenuItem *item;
 | 
			
		||||
 | 
			
		||||
		if (i)
 | 
			
		||||
		{
 | 
			
		||||
			cairo_move_to (cr, x - 0.5, data->menu_y + 1);
 | 
			
		||||
			cairo_line_to (cr, x - 0.5, data->menu_y + data->menu_height);
 | 
			
		||||
			cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
 | 
			
		||||
			cairo_stroke (cr);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		item = data->items + i;
 | 
			
		||||
		cairo_save (cr);
 | 
			
		||||
 | 
			
		||||
		cairo_rectangle (cr, x, data->menu_y, item->width, data->menu_height);
 | 
			
		||||
		cairo_clip (cr);
 | 
			
		||||
 | 
			
		||||
		if (i == data->active_item)
 | 
			
		||||
		{
 | 
			
		||||
			cairo_set_source_rgb (cr, 0.9, 0.9, 0.9);
 | 
			
		||||
			cairo_paint (cr);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		cairo_translate (cr, x + item->dx,
 | 
			
		||||
			data->menu_y + data->menu_height * 0.5);
 | 
			
		||||
		cairo_scale (cr, item->scale, item->scale);
 | 
			
		||||
 | 
			
		||||
		cairo_set_source_rgb (cr, 0, 0, 0);
 | 
			
		||||
		cairo_set_line_width (cr, 1 / item->scale);
 | 
			
		||||
		ld_symbol_draw (item->symbol, cr);
 | 
			
		||||
 | 
			
		||||
		cairo_restore (cr);
 | 
			
		||||
		x += item->width;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cairo_rectangle (cr, 0.5, data->menu_y + 0.5,
 | 
			
		||||
		data->menu_width, data->menu_height);
 | 
			
		||||
	cairo_set_source_rgb (cr, 0, 0, 0);
 | 
			
		||||
	cairo_stroke (cr);
 | 
			
		||||
 | 
			
		||||
	cairo_destroy (cr);
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_view_motion_notify (GtkWidget *widget, GdkEventMotion *event,
 | 
			
		||||
	gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
	SymbolMenuData *data;
 | 
			
		||||
	gint i, x, at_cursor = -1;
 | 
			
		||||
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (user_data);
 | 
			
		||||
	data = &self->priv->symbol_menu;
 | 
			
		||||
 | 
			
		||||
	if (widget->window != event->window
 | 
			
		||||
		|| event->x < 0 || event->y < data->menu_y
 | 
			
		||||
		|| event->y >= data->menu_y + data->menu_height)
 | 
			
		||||
		goto on_view_motion_notify_end;
 | 
			
		||||
 | 
			
		||||
	for (x = i = 0; i < data->n_items; i++)
 | 
			
		||||
	{
 | 
			
		||||
		x += data->items[i].width;
 | 
			
		||||
		if (event->x < x)
 | 
			
		||||
		{
 | 
			
		||||
			at_cursor = i;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
on_view_motion_notify_end:
 | 
			
		||||
	if (data->active_item != at_cursor)
 | 
			
		||||
	{
 | 
			
		||||
		emit_symbol_signal (self, LD_LIBRARY_TOOLBAR_GET_CLASS (self)
 | 
			
		||||
			->symbol_deselected_signal, -1);
 | 
			
		||||
 | 
			
		||||
		if (at_cursor != -1)
 | 
			
		||||
			emit_symbol_signal (self, LD_LIBRARY_TOOLBAR_GET_CLASS (self)
 | 
			
		||||
				->symbol_selected_signal, at_cursor);
 | 
			
		||||
	}
 | 
			
		||||
	data->active_item = at_cursor;
 | 
			
		||||
	redraw_symbol_menu (self);
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_view_button_press (GtkWidget *widget, GdkEventButton *event,
 | 
			
		||||
	gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
	SymbolMenuData *data;
 | 
			
		||||
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (user_data);
 | 
			
		||||
	data = &self->priv->symbol_menu;
 | 
			
		||||
 | 
			
		||||
	/* If the event occured elsewhere, cancel the menu and put the event
 | 
			
		||||
	 * back into the queue.
 | 
			
		||||
	 */
 | 
			
		||||
	if (widget->window != event->window && data->active_button)
 | 
			
		||||
	{
 | 
			
		||||
		gtk_toggle_button_set_active (data->active_button, FALSE);
 | 
			
		||||
		gdk_event_put ((GdkEvent *) event);
 | 
			
		||||
	}
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_view_button_release (GtkWidget *widget, GdkEventButton *event,
 | 
			
		||||
	gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	LdLibraryToolbar *self;
 | 
			
		||||
	SymbolMenuData *data;
 | 
			
		||||
 | 
			
		||||
	self = LD_LIBRARY_TOOLBAR (user_data);
 | 
			
		||||
	data = &self->priv->symbol_menu;
 | 
			
		||||
 | 
			
		||||
	if (event->button != 1)
 | 
			
		||||
		return FALSE;
 | 
			
		||||
 | 
			
		||||
	emit_symbol_signal (self, LD_LIBRARY_TOOLBAR_GET_CLASS (self)
 | 
			
		||||
		->symbol_chosen_signal, -1);
 | 
			
		||||
 | 
			
		||||
	/* We've either chosen a symbol or canceled the menu, so hide it. */
 | 
			
		||||
	if (data->active_button)
 | 
			
		||||
		gtk_toggle_button_set_active (data->active_button, FALSE);
 | 
			
		||||
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,69 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-library-toolbar.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2011. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LD_LIBRARY_TOOLBAR_H__
 | 
			
		||||
#define __LD_LIBRARY_TOOLBAR_H__
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define LD_TYPE_LIBRARY_TOOLBAR (ld_library_toolbar_get_type ())
 | 
			
		||||
#define LD_LIBRARY_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST \
 | 
			
		||||
	((obj), LD_TYPE_LIBRARY_TOOLBAR, LdLibraryToolbar))
 | 
			
		||||
#define LD_LIBRARY_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
 | 
			
		||||
	((klass), LD_TYPE_LIBRARY_TOOLBAR, LdLibraryToolbarClass))
 | 
			
		||||
#define LD_IS_LIBRARY_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
 | 
			
		||||
	((obj), LD_TYPE_LIBRARY_TOOLBAR))
 | 
			
		||||
#define LD_IS_LIBRARY_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
 | 
			
		||||
	((klass), LD_TYPE_LIBRARY_TOOLBAR))
 | 
			
		||||
#define LD_LIBRARY_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
 | 
			
		||||
	((obj), LD_LIBRARY_TOOLBAR, LdLibraryToolbarClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _LdLibraryToolbar LdLibraryToolbar;
 | 
			
		||||
typedef struct _LdLibraryToolbarPrivate LdLibraryToolbarPrivate;
 | 
			
		||||
typedef struct _LdLibraryToolbarClass LdLibraryToolbarClass;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdLibraryToolbar:
 | 
			
		||||
 */
 | 
			
		||||
struct _LdLibraryToolbar
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GtkToolbar parent_instance;
 | 
			
		||||
	LdLibraryToolbarPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _LdLibraryToolbarClass
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GtkToolbarClass parent_class;
 | 
			
		||||
 | 
			
		||||
	guint symbol_chosen_signal;
 | 
			
		||||
	guint symbol_selected_signal;
 | 
			
		||||
	guint symbol_deselected_signal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GType ld_library_toolbar_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
GtkWidget *ld_library_toolbar_new (void);
 | 
			
		||||
 | 
			
		||||
void ld_library_toolbar_set_library (LdLibraryToolbar *self,
 | 
			
		||||
	LdLibrary *library);
 | 
			
		||||
LdLibrary *ld_library_toolbar_get_library (LdLibraryToolbar *self);
 | 
			
		||||
void ld_library_toolbar_set_view (LdLibraryToolbar *self,
 | 
			
		||||
	LdDiagramView *view);
 | 
			
		||||
LdDiagramView *ld_library_toolbar_get_view (LdLibraryToolbar *self);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* ! __LD_LIBRARY_TOOLBAR_H__ */
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-library.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -17,28 +17,30 @@
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:ld-library
 | 
			
		||||
 * @short_description: A symbol library
 | 
			
		||||
 * @see_also: #LdSymbol, #LdSymbolCategory
 | 
			
		||||
 * @see_also: #LdSymbol, #LdCategory
 | 
			
		||||
 *
 | 
			
		||||
 * #LdLibrary is used for loading symbols from their files.
 | 
			
		||||
 * #LdLibrary is used for loading symbols from their files.  The library object
 | 
			
		||||
 * itself is a container for categories, which in turn contain other
 | 
			
		||||
 * subcategories and the actual symbols.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LdLibraryPrivate:
 | 
			
		||||
 * @lua: state of the scripting language.
 | 
			
		||||
 * @children: child objects of the library.
 | 
			
		||||
 * @children: categories in the library.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdLibraryPrivate
 | 
			
		||||
{
 | 
			
		||||
	LdLua *lua;
 | 
			
		||||
	GSList *children;
 | 
			
		||||
	LdCategory *root;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ld_library_finalize (GObject *gobject);
 | 
			
		||||
 | 
			
		||||
static LdSymbolCategory *load_category (LdLibrary *self,
 | 
			
		||||
static LdCategory *load_category (LdLibrary *self,
 | 
			
		||||
	const gchar *path, const gchar *name);
 | 
			
		||||
static gboolean load_category_cb (const gchar *base,
 | 
			
		||||
	const gchar *filename, gpointer userdata);
 | 
			
		||||
	const gchar *path, gpointer userdata);
 | 
			
		||||
static void load_category_symbol_cb (LdSymbol *symbol, gpointer user_data);
 | 
			
		||||
 | 
			
		||||
static gchar *read_human_name_from_file (const gchar *filename);
 | 
			
		||||
@@ -46,8 +48,6 @@ static gchar *read_human_name_from_file (const gchar *filename);
 | 
			
		||||
static gboolean foreach_dir (const gchar *path,
 | 
			
		||||
	gboolean (*callback) (const gchar *, const gchar *, gpointer),
 | 
			
		||||
	gpointer userdata, GError **error);
 | 
			
		||||
static gboolean ld_library_load_cb
 | 
			
		||||
	(const gchar *base, const gchar *filename, gpointer userdata);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (LdLibrary, ld_library, G_TYPE_OBJECT);
 | 
			
		||||
@@ -81,7 +81,7 @@ ld_library_init (LdLibrary *self)
 | 
			
		||||
		(self, LD_TYPE_LIBRARY, LdLibraryPrivate);
 | 
			
		||||
 | 
			
		||||
	self->priv->lua = ld_lua_new ();
 | 
			
		||||
	self->priv->children = NULL;
 | 
			
		||||
	self->priv->root = ld_category_new (LD_LIBRARY_IDENTIFIER_SEPARATOR, "/");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -92,9 +92,7 @@ ld_library_finalize (GObject *gobject)
 | 
			
		||||
	self = LD_LIBRARY (gobject);
 | 
			
		||||
 | 
			
		||||
	g_object_unref (self->priv->lua);
 | 
			
		||||
 | 
			
		||||
	g_slist_foreach (self->priv->children, (GFunc) g_object_unref, NULL);
 | 
			
		||||
	g_slist_free (self->priv->children);
 | 
			
		||||
	g_object_unref (self->priv->root);
 | 
			
		||||
 | 
			
		||||
	/* Chain up to the parent class. */
 | 
			
		||||
	G_OBJECT_CLASS (ld_library_parent_class)->finalize (gobject);
 | 
			
		||||
@@ -152,7 +150,9 @@ foreach_dir (const gchar *path,
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	LdLibrary *self;
 | 
			
		||||
	LdSymbolCategory *cat;
 | 
			
		||||
	LdCategory *cat;
 | 
			
		||||
	guint changed : 1;
 | 
			
		||||
	guint load_symbols : 1;
 | 
			
		||||
}
 | 
			
		||||
LoadCategoryData;
 | 
			
		||||
 | 
			
		||||
@@ -164,12 +164,10 @@ LoadCategoryData;
 | 
			
		||||
 *
 | 
			
		||||
 * Loads a category into the library.
 | 
			
		||||
 */
 | 
			
		||||
static LdSymbolCategory *
 | 
			
		||||
static LdCategory *
 | 
			
		||||
load_category (LdLibrary *self, const gchar *path, const gchar *name)
 | 
			
		||||
{
 | 
			
		||||
	LdSymbolCategory *cat;
 | 
			
		||||
	gchar *icon_file, *category_file;
 | 
			
		||||
	gchar *human_name;
 | 
			
		||||
	gchar *category_file, *human_name;
 | 
			
		||||
	LoadCategoryData data;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
 | 
			
		||||
@@ -177,57 +175,59 @@ load_category (LdLibrary *self, const gchar *path, const gchar *name)
 | 
			
		||||
	g_return_val_if_fail (name != NULL, NULL);
 | 
			
		||||
 | 
			
		||||
	if (!g_file_test (path, G_FILE_TEST_IS_DIR))
 | 
			
		||||
		goto load_category_fail_1;
 | 
			
		||||
 | 
			
		||||
	icon_file = g_build_filename (path, "icon.svg", NULL);
 | 
			
		||||
	if (!g_file_test (icon_file, G_FILE_TEST_IS_REGULAR))
 | 
			
		||||
	{
 | 
			
		||||
		g_warning ("the category in `%s' has no icon", path);
 | 
			
		||||
		goto load_category_fail_2;
 | 
			
		||||
	}
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	category_file = g_build_filename (path, "category.json", NULL);
 | 
			
		||||
	human_name = read_human_name_from_file (category_file);
 | 
			
		||||
	if (!human_name)
 | 
			
		||||
		human_name = g_strdup (name);
 | 
			
		||||
 | 
			
		||||
	cat = ld_symbol_category_new (name, human_name);
 | 
			
		||||
	ld_symbol_category_set_image_path (cat, icon_file);
 | 
			
		||||
 | 
			
		||||
	data.self = self;
 | 
			
		||||
	data.cat = cat;
 | 
			
		||||
	data.cat = ld_category_new (name, human_name);
 | 
			
		||||
	data.load_symbols = TRUE;
 | 
			
		||||
	data.changed = FALSE;
 | 
			
		||||
	foreach_dir (path, load_category_cb, &data, NULL);
 | 
			
		||||
 | 
			
		||||
	g_free (human_name);
 | 
			
		||||
	g_free (category_file);
 | 
			
		||||
	g_free (icon_file);
 | 
			
		||||
	return cat;
 | 
			
		||||
 | 
			
		||||
load_category_fail_2:
 | 
			
		||||
	g_free (icon_file);
 | 
			
		||||
load_category_fail_1:
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return data.cat;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * load_category_cb:
 | 
			
		||||
 *
 | 
			
		||||
 * Load script files from a directory into a symbol category.
 | 
			
		||||
 * Load contents of a directory into a symbol category.
 | 
			
		||||
 */
 | 
			
		||||
static gboolean
 | 
			
		||||
load_category_cb (const gchar *base, const gchar *filename, gpointer userdata)
 | 
			
		||||
load_category_cb (const gchar *base, const gchar *path, gpointer userdata)
 | 
			
		||||
{
 | 
			
		||||
	LoadCategoryData *data;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (base != NULL, FALSE);
 | 
			
		||||
	g_return_val_if_fail (filename != NULL, FALSE);
 | 
			
		||||
	g_return_val_if_fail (path != NULL, FALSE);
 | 
			
		||||
	g_return_val_if_fail (userdata != NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
	data = (LoadCategoryData *) userdata;
 | 
			
		||||
 | 
			
		||||
	if (ld_lua_check_file (data->self->priv->lua, filename))
 | 
			
		||||
		ld_lua_load_file (data->self->priv->lua, filename,
 | 
			
		||||
	if (g_file_test (path, G_FILE_TEST_IS_DIR))
 | 
			
		||||
	{
 | 
			
		||||
		LdCategory *cat;
 | 
			
		||||
 | 
			
		||||
		cat = load_category (data->self, path, base);
 | 
			
		||||
		if (cat)
 | 
			
		||||
		{
 | 
			
		||||
			ld_category_add_child (data->cat, cat);
 | 
			
		||||
			g_object_unref (cat);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if (data->load_symbols
 | 
			
		||||
		&& ld_lua_check_file (data->self->priv->lua, path))
 | 
			
		||||
	{
 | 
			
		||||
		ld_lua_load_file (data->self->priv->lua, path,
 | 
			
		||||
			load_category_symbol_cb, data->cat);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data->changed = TRUE;
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -239,30 +239,13 @@ load_category_cb (const gchar *base, const gchar *filename, gpointer userdata)
 | 
			
		||||
static void
 | 
			
		||||
load_category_symbol_cb (LdSymbol *symbol, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	const gchar *name;
 | 
			
		||||
	LdSymbolCategory *cat;
 | 
			
		||||
	const GSList *children, *iter;
 | 
			
		||||
	LdCategory *cat;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL (symbol));
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL_CATEGORY (user_data));
 | 
			
		||||
	g_return_if_fail (LD_IS_CATEGORY (user_data));
 | 
			
		||||
 | 
			
		||||
	cat = LD_SYMBOL_CATEGORY (user_data);
 | 
			
		||||
	name = ld_symbol_get_name (symbol);
 | 
			
		||||
 | 
			
		||||
	/* Check for name collisions with other symbols. */
 | 
			
		||||
	children = ld_symbol_category_get_children (cat);
 | 
			
		||||
	for (iter = children; iter; iter = iter->next)
 | 
			
		||||
	{
 | 
			
		||||
		if (!LD_IS_SYMBOL (iter->data))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (!strcmp (name, ld_symbol_get_name (LD_SYMBOL (iter->data))))
 | 
			
		||||
		{
 | 
			
		||||
			g_warning ("attempted to insert multiple `%s' symbols into"
 | 
			
		||||
				" category `%s'", name, ld_symbol_category_get_name (cat));
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ld_symbol_category_insert_child (cat, G_OBJECT (symbol), -1);
 | 
			
		||||
	cat = LD_CATEGORY (user_data);
 | 
			
		||||
	ld_category_insert_symbol (cat, symbol, -1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -323,18 +306,6 @@ read_human_name_from_file_end:
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LibraryLoadData:
 | 
			
		||||
 *
 | 
			
		||||
 * Data shared between ld_library_load() and ld_library_load_cb().
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	LdLibrary *self;
 | 
			
		||||
	gboolean changed;
 | 
			
		||||
}
 | 
			
		||||
LibraryLoadData;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_load:
 | 
			
		||||
 * @self: an #LdLibrary object.
 | 
			
		||||
@@ -345,46 +316,34 @@ LibraryLoadData;
 | 
			
		||||
gboolean
 | 
			
		||||
ld_library_load (LdLibrary *self, const gchar *directory)
 | 
			
		||||
{
 | 
			
		||||
	LibraryLoadData data;
 | 
			
		||||
	LoadCategoryData data;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (LD_IS_LIBRARY (self), FALSE);
 | 
			
		||||
	g_return_val_if_fail (directory != NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
	/* Almost like load_category(). */
 | 
			
		||||
	data.self = self;
 | 
			
		||||
	data.cat = self->priv->root;
 | 
			
		||||
	data.load_symbols = FALSE;
 | 
			
		||||
	data.changed = FALSE;
 | 
			
		||||
	foreach_dir (directory, ld_library_load_cb, &data, NULL);
 | 
			
		||||
	foreach_dir (directory, load_category_cb, &data, NULL);
 | 
			
		||||
 | 
			
		||||
	/* XXX: It might also make sense to just forward the "children-changed"
 | 
			
		||||
	 *      signal of the root category but we'd have to block it here anyway,
 | 
			
		||||
	 *      so that we don't unnecessarily fire events for every single change.
 | 
			
		||||
	 *
 | 
			
		||||
	 *      The user code isn't supposed to make changes to / and it's its own
 | 
			
		||||
	 *      problem if it keeps reloading something a hundred times in a row.
 | 
			
		||||
	 *
 | 
			
		||||
	 *      That said, it'd be possible to add change grouping methods to
 | 
			
		||||
	 *      LdCategory and so delay the signal emission until an `unblock'.
 | 
			
		||||
	 */
 | 
			
		||||
	if (data.changed)
 | 
			
		||||
		g_signal_emit (self, LD_LIBRARY_GET_CLASS (self)->changed_signal, 0);
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ld_library_load_cb:
 | 
			
		||||
 *
 | 
			
		||||
 * A callback that's called for each file in the root directory.
 | 
			
		||||
 */
 | 
			
		||||
static gboolean
 | 
			
		||||
ld_library_load_cb (const gchar *base, const gchar *filename, gpointer userdata)
 | 
			
		||||
{
 | 
			
		||||
	LdSymbolCategory *cat;
 | 
			
		||||
	LibraryLoadData *data;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (base != NULL, FALSE);
 | 
			
		||||
	g_return_val_if_fail (filename != NULL, FALSE);
 | 
			
		||||
	g_return_val_if_fail (userdata != NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
	data = (LibraryLoadData *) userdata;
 | 
			
		||||
 | 
			
		||||
	cat = load_category (data->self, filename, base);
 | 
			
		||||
	if (cat)
 | 
			
		||||
		ld_library_insert_child (data->self, G_OBJECT (cat), -1);
 | 
			
		||||
 | 
			
		||||
	data->changed = TRUE;
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_find_symbol:
 | 
			
		||||
 * @self: an #LdLibrary object.
 | 
			
		||||
@@ -394,12 +353,12 @@ ld_library_load_cb (const gchar *base, const gchar *filename, gpointer userdata)
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: a symbol object if found, %NULL otherwise.
 | 
			
		||||
 */
 | 
			
		||||
/* XXX: With this level of indentation, this function is really ugly. */
 | 
			
		||||
LdSymbol *
 | 
			
		||||
ld_library_find_symbol (LdLibrary *self, const gchar *identifier)
 | 
			
		||||
{
 | 
			
		||||
	gchar **id_el_start, **id_el;
 | 
			
		||||
	const GSList *list, *list_el;
 | 
			
		||||
	LdCategory *cat;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
 | 
			
		||||
	g_return_val_if_fail (identifier != NULL, NULL);
 | 
			
		||||
@@ -408,117 +367,64 @@ ld_library_find_symbol (LdLibrary *self, const gchar *identifier)
 | 
			
		||||
	if (!id_el_start)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	list = ld_library_get_children (self);
 | 
			
		||||
	for (id_el = id_el_start; id_el[0]; id_el++)
 | 
			
		||||
	/* 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)
 | 
			
		||||
	{
 | 
			
		||||
		LdSymbolCategory *cat;
 | 
			
		||||
		LdSymbol *symbol;
 | 
			
		||||
		gboolean found = FALSE;
 | 
			
		||||
 | 
			
		||||
		list = ld_category_get_children (cat);
 | 
			
		||||
		for (list_el = list; list_el; list_el = g_slist_next (list_el))
 | 
			
		||||
		{
 | 
			
		||||
			/* If the current identifier element is a category (not last)
 | 
			
		||||
			 * and this list element is a category.
 | 
			
		||||
			 */
 | 
			
		||||
			if (id_el[1] && LD_IS_SYMBOL_CATEGORY (list_el->data))
 | 
			
		||||
			cat = LD_CATEGORY (list_el->data);
 | 
			
		||||
			if (!strcmp (*id_el, ld_category_get_name (cat)))
 | 
			
		||||
			{
 | 
			
		||||
				cat = LD_SYMBOL_CATEGORY (list_el->data);
 | 
			
		||||
				if (strcmp (id_el[0], ld_symbol_category_get_name (cat)))
 | 
			
		||||
					continue;
 | 
			
		||||
 | 
			
		||||
				list = ld_symbol_category_get_children (cat);
 | 
			
		||||
				found = TRUE;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			/* If the current identifier element is a symbol (last)
 | 
			
		||||
			 * and this list element is a symbol.
 | 
			
		||||
			 */
 | 
			
		||||
			else if (!id_el[1] && LD_IS_SYMBOL (list_el->data))
 | 
			
		||||
			{
 | 
			
		||||
				symbol = LD_SYMBOL (list_el->data);
 | 
			
		||||
				if (strcmp (id_el[0], ld_symbol_get_name (symbol)))
 | 
			
		||||
					continue;
 | 
			
		||||
 | 
			
		||||
				g_strfreev (id_el_start);
 | 
			
		||||
				return symbol;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!found)
 | 
			
		||||
			goto ld_library_find_symbol_error;
 | 
			
		||||
 | 
			
		||||
		if (!(id_el++)[2])
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* And then the actual symbol. */
 | 
			
		||||
	list = ld_category_get_symbols (cat);
 | 
			
		||||
	for (list_el = list; list_el; list_el = g_slist_next (list_el))
 | 
			
		||||
	{
 | 
			
		||||
		LdSymbol *symbol;
 | 
			
		||||
 | 
			
		||||
		symbol = LD_SYMBOL (list_el->data);
 | 
			
		||||
		if (!strcmp (*id_el, ld_symbol_get_name (symbol)))
 | 
			
		||||
		{
 | 
			
		||||
			g_strfreev (id_el_start);
 | 
			
		||||
			return symbol;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
ld_library_find_symbol_error:
 | 
			
		||||
	g_strfreev (id_el_start);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_clear:
 | 
			
		||||
 * ld_library_get_root:
 | 
			
		||||
 * @self: an #LdLibrary object.
 | 
			
		||||
 *
 | 
			
		||||
 * Clear all the contents.
 | 
			
		||||
 * Return value: (transfer none): the root category. Do not modify.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_library_clear (LdLibrary *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY (self));
 | 
			
		||||
 | 
			
		||||
	g_slist_foreach (self->priv->children, (GFunc) g_object_unref, NULL);
 | 
			
		||||
	g_slist_free (self->priv->children);
 | 
			
		||||
	self->priv->children = NULL;
 | 
			
		||||
 | 
			
		||||
	g_signal_emit (self,
 | 
			
		||||
		LD_LIBRARY_GET_CLASS (self)->changed_signal, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_insert_child:
 | 
			
		||||
 * @self: an #LdLibrary object.
 | 
			
		||||
 * @child: the child to be inserted.
 | 
			
		||||
 * @pos: the position at which the child will be inserted.
 | 
			
		||||
 *       Negative values will append to the end of list.
 | 
			
		||||
 *
 | 
			
		||||
 * Insert a child into the library.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_library_insert_child (LdLibrary *self, GObject *child, gint pos)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY (self));
 | 
			
		||||
	g_return_if_fail (G_IS_OBJECT (child));
 | 
			
		||||
 | 
			
		||||
	g_object_ref (child);
 | 
			
		||||
	self->priv->children = g_slist_insert (self->priv->children, child, pos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_remove_child:
 | 
			
		||||
 * @self: an #LdLibrary object.
 | 
			
		||||
 * @child: the child to be removed.
 | 
			
		||||
 *
 | 
			
		||||
 * Remove a child from the library.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_library_remove_child (LdLibrary *self, GObject *child)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_LIBRARY (self));
 | 
			
		||||
	g_return_if_fail (G_IS_OBJECT (child));
 | 
			
		||||
 | 
			
		||||
	if (g_slist_find (self->priv->children, child))
 | 
			
		||||
	{
 | 
			
		||||
		g_object_unref (child);
 | 
			
		||||
		self->priv->children = g_slist_remove (self->priv->children, child);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_library_get_children:
 | 
			
		||||
 * @self: an #LdLibrary object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (element-type GObject): a list of children. Do not modify.
 | 
			
		||||
 */
 | 
			
		||||
const GSList *
 | 
			
		||||
ld_library_get_children (LdLibrary *self)
 | 
			
		||||
LdCategory *
 | 
			
		||||
ld_library_get_root (LdLibrary *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
 | 
			
		||||
	return self->priv->children;
 | 
			
		||||
	return self->priv->root;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-library.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -60,11 +60,7 @@ GType ld_library_get_type (void) G_GNUC_CONST;
 | 
			
		||||
LdLibrary *ld_library_new (void);
 | 
			
		||||
gboolean ld_library_load (LdLibrary *self, const gchar *directory);
 | 
			
		||||
LdSymbol *ld_library_find_symbol (LdLibrary *self, const gchar *identifier);
 | 
			
		||||
void ld_library_clear (LdLibrary *self);
 | 
			
		||||
 | 
			
		||||
void ld_library_insert_child (LdLibrary *self, GObject *child, gint pos);
 | 
			
		||||
void ld_library_remove_child (LdLibrary *self, GObject *child);
 | 
			
		||||
const GSList *ld_library_get_children (LdLibrary *self);
 | 
			
		||||
LdCategory *ld_library_get_root (LdLibrary *self);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-lua-private.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010. All rights reserved.
 | 
			
		||||
 * Copyright 2010 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-lua-symbol-private.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-lua-symbol.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-lua-symbol.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010. All rights reserved.
 | 
			
		||||
 * Copyright 2010 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-lua.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -44,9 +44,10 @@ struct _LdLuaPrivate
 | 
			
		||||
 *   -> The rendering function
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define LD_LUA_LIBRARY_NAME "logdiag"
 | 
			
		||||
#define LD_LUA_DATA_INDEX LD_LUA_LIBRARY_NAME "_data"
 | 
			
		||||
#define LD_LUA_SYMBOLS_INDEX LD_LUA_LIBRARY_NAME "_symbols"
 | 
			
		||||
#define LD_LUA_LIBRARY_NAME   "logdiag"
 | 
			
		||||
#define LD_LUA_DATA_INDEX     LD_LUA_LIBRARY_NAME "_data"
 | 
			
		||||
#define LD_LUA_SYMBOLS_INDEX  LD_LUA_LIBRARY_NAME "_symbols"
 | 
			
		||||
#define LD_LUA_META_INDEX     LD_LUA_LIBRARY_NAME "_meta"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LdLuaData:
 | 
			
		||||
@@ -88,7 +89,6 @@ static gboolean read_symbol_area (lua_State *L, int index, LdRectangle *area);
 | 
			
		||||
static gboolean read_terminals (lua_State *L, int index,
 | 
			
		||||
	LdPointArray **terminals);
 | 
			
		||||
 | 
			
		||||
static void push_cairo_object (lua_State *L, LdLuaDrawData *draw_data);
 | 
			
		||||
static gdouble get_cairo_scale (cairo_t *cr);
 | 
			
		||||
static int ld_lua_cairo_save (lua_State *L);
 | 
			
		||||
static int ld_lua_cairo_restore (lua_State *L);
 | 
			
		||||
@@ -163,6 +163,24 @@ ld_lua_class_init (LdLuaClass *klass)
 | 
			
		||||
	g_type_class_add_private (klass, sizeof (LdLuaPrivate));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
push_cairo_metatable (lua_State *L)
 | 
			
		||||
{
 | 
			
		||||
	luaL_Reg *fn;
 | 
			
		||||
 | 
			
		||||
	luaL_newmetatable (L, LD_LUA_META_INDEX);
 | 
			
		||||
 | 
			
		||||
	/* Create a method table. */
 | 
			
		||||
	lua_newtable (L);
 | 
			
		||||
	for (fn = ld_lua_cairo_table; fn->name; fn++)
 | 
			
		||||
	{
 | 
			
		||||
		lua_pushcfunction (L, fn->func);
 | 
			
		||||
		lua_setfield (L, -2, fn->name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lua_setfield (L, -2, "__index");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_lua_init (LdLua *self)
 | 
			
		||||
{
 | 
			
		||||
@@ -175,23 +193,20 @@ ld_lua_init (LdLua *self)
 | 
			
		||||
	L = self->priv->L = lua_newstate (ld_lua_alloc, NULL);
 | 
			
		||||
	g_return_if_fail (L != NULL);
 | 
			
		||||
 | 
			
		||||
	/* TODO: lua_atpanic () */
 | 
			
		||||
	/* XXX: Might not be a bad idea to use lua_atpanic(). */
 | 
			
		||||
 | 
			
		||||
	/* Load some safe libraries. */
 | 
			
		||||
	lua_pushcfunction (L, luaopen_string);
 | 
			
		||||
	lua_call (L, 0, 0);
 | 
			
		||||
 | 
			
		||||
	lua_pushcfunction (L, luaopen_table);
 | 
			
		||||
	lua_call (L, 0, 0);
 | 
			
		||||
 | 
			
		||||
	lua_pushcfunction (L, luaopen_math);
 | 
			
		||||
	lua_call (L, 0, 0);
 | 
			
		||||
	luaL_requiref (L, "string", luaopen_string, TRUE);
 | 
			
		||||
	luaL_requiref (L, "table",  luaopen_table,  TRUE);
 | 
			
		||||
	luaL_requiref (L, "math",   luaopen_math,   TRUE);
 | 
			
		||||
	lua_pop (L, 3);
 | 
			
		||||
 | 
			
		||||
	/* Load the application library. */
 | 
			
		||||
	luaL_register (L, LD_LUA_LIBRARY_NAME, ld_lua_logdiag_lib);
 | 
			
		||||
	luaL_newlib (L, ld_lua_logdiag_lib);
 | 
			
		||||
	lua_setglobal (L, LD_LUA_LIBRARY_NAME);
 | 
			
		||||
 | 
			
		||||
	/* Store user data to the registry. */
 | 
			
		||||
	ud = lua_newuserdata (L, sizeof (LdLuaData));
 | 
			
		||||
	ud = lua_newuserdata (L, sizeof *ud);
 | 
			
		||||
	ud->self = self;
 | 
			
		||||
	ud->load_callback = NULL;
 | 
			
		||||
	ud->load_user_data = NULL;
 | 
			
		||||
@@ -201,6 +216,8 @@ ld_lua_init (LdLua *self)
 | 
			
		||||
	/* Create an empty symbol table. */
 | 
			
		||||
	lua_newtable (L);
 | 
			
		||||
	lua_setfield (L, LUA_REGISTRYINDEX, LD_LUA_SYMBOLS_INDEX);
 | 
			
		||||
 | 
			
		||||
	push_cairo_metatable (L);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -278,7 +295,7 @@ ld_lua_load_file (LdLua *self, const gchar *filename,
 | 
			
		||||
	g_return_val_if_fail (filename != NULL, FALSE);
 | 
			
		||||
	g_return_val_if_fail (callback != NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
	/* XXX: If something from the following fails, Lua will call exit(). */
 | 
			
		||||
	/* XXX: If something from the following fails, Lua will panic. */
 | 
			
		||||
	lua_getfield (self->priv->L, LUA_REGISTRYINDEX, LD_LUA_DATA_INDEX);
 | 
			
		||||
	ud = lua_touserdata (self->priv->L, -1);
 | 
			
		||||
	lua_pop (self->priv->L, 1);
 | 
			
		||||
@@ -331,7 +348,9 @@ ld_lua_private_draw (LdLua *self, LdLuaSymbol *symbol, cairo_t *cr)
 | 
			
		||||
	data.cr = cr;
 | 
			
		||||
	data.save_count = 0;
 | 
			
		||||
 | 
			
		||||
	if (lua_cpcall (self->priv->L, ld_lua_private_draw_cb, &data))
 | 
			
		||||
	lua_pushcfunction (self->priv->L, ld_lua_private_draw_cb);
 | 
			
		||||
	lua_pushlightuserdata (self->priv->L, &data);
 | 
			
		||||
	if (lua_pcall (self->priv->L, 1, 0, 0))
 | 
			
		||||
	{
 | 
			
		||||
		g_warning ("Lua error: %s", lua_tostring (self->priv->L, -1));
 | 
			
		||||
		lua_pop (self->priv->L, 1);
 | 
			
		||||
@@ -344,7 +363,7 @@ ld_lua_private_draw (LdLua *self, LdLuaSymbol *symbol, cairo_t *cr)
 | 
			
		||||
static int
 | 
			
		||||
ld_lua_private_draw_cb (lua_State *L)
 | 
			
		||||
{
 | 
			
		||||
	LdLuaDrawData *data;
 | 
			
		||||
	LdLuaDrawData *data, *luadata;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, -1);
 | 
			
		||||
 | 
			
		||||
@@ -357,9 +376,28 @@ ld_lua_private_draw_cb (lua_State *L)
 | 
			
		||||
	lua_getfield (L, -1, "render");
 | 
			
		||||
	luaL_checktype (L, -1, LUA_TFUNCTION);
 | 
			
		||||
 | 
			
		||||
	/* Call the function do draw the symbol. */
 | 
			
		||||
	push_cairo_object (L, data);
 | 
			
		||||
	lua_pcall (L, 1, 0, 0);
 | 
			
		||||
	/* Create a Cairo wrapper object. */
 | 
			
		||||
	luadata = lua_newuserdata (L, sizeof *data);
 | 
			
		||||
	memcpy (luadata, data, sizeof *data);
 | 
			
		||||
	lua_getfield (L, LUA_REGISTRYINDEX, LD_LUA_META_INDEX);
 | 
			
		||||
	lua_setmetatable (L, -2);
 | 
			
		||||
 | 
			
		||||
	/* Force it to stay alive for a bit longer. */
 | 
			
		||||
	lua_pushvalue (L, -1);
 | 
			
		||||
	lua_insert (L, 1);
 | 
			
		||||
 | 
			
		||||
	/* Draw the symbol. */
 | 
			
		||||
	if (lua_pcall (L, 1, 0, 0))
 | 
			
		||||
	{
 | 
			
		||||
		g_warning ("Lua error: %s", lua_tostring (L, -1));
 | 
			
		||||
		lua_pop (L, 1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Copy the userdata back and invalidate it, so that malicious Lua
 | 
			
		||||
	 * scripts won't succeed at drawing onto a long invalid Cairo context.
 | 
			
		||||
	 */
 | 
			
		||||
	memcpy (data, luadata, sizeof *data);
 | 
			
		||||
	memset (luadata, 0, sizeof *data);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -376,7 +414,9 @@ ld_lua_private_unregister (LdLua *self, LdLuaSymbol *symbol)
 | 
			
		||||
	g_return_if_fail (LD_IS_LUA (self));
 | 
			
		||||
	g_return_if_fail (LD_IS_LUA_SYMBOL (symbol));
 | 
			
		||||
 | 
			
		||||
	if (lua_cpcall (self->priv->L, ld_lua_private_unregister_cb, symbol))
 | 
			
		||||
	lua_pushcfunction (self->priv->L, ld_lua_private_unregister_cb);
 | 
			
		||||
	lua_pushlightuserdata (self->priv->L, symbol);
 | 
			
		||||
	if (lua_pcall (self->priv->L, 1, 0, 0))
 | 
			
		||||
	{
 | 
			
		||||
		g_warning ("Lua error: %s", lua_tostring (self->priv->L, -1));
 | 
			
		||||
		lua_pop (self->priv->L, 1);
 | 
			
		||||
@@ -453,6 +493,7 @@ static int
 | 
			
		||||
process_registration (lua_State *L)
 | 
			
		||||
{
 | 
			
		||||
	LdLuaSymbol *symbol;
 | 
			
		||||
	const gchar *name;
 | 
			
		||||
	gchar *human_name;
 | 
			
		||||
 | 
			
		||||
	int i, type, types[] =
 | 
			
		||||
@@ -469,7 +510,10 @@ process_registration (lua_State *L)
 | 
			
		||||
				lua_typename (L, types[i]), lua_typename (L, type));
 | 
			
		||||
 | 
			
		||||
	symbol = LD_LUA_SYMBOL (lua_touserdata (L, lua_upvalueindex (1)));
 | 
			
		||||
	symbol->priv->name = g_strdup (lua_tostring (L, 1));
 | 
			
		||||
	name = lua_tostring (L, 1);
 | 
			
		||||
	if (g_strstr_len (name, -1, LD_LIBRARY_IDENTIFIER_SEPARATOR))
 | 
			
		||||
		return luaL_error (L, "Invalid symbol name.");
 | 
			
		||||
	symbol->priv->name = g_strdup (name);
 | 
			
		||||
 | 
			
		||||
	human_name = get_translation (L, 2);
 | 
			
		||||
	if (!human_name)
 | 
			
		||||
@@ -537,7 +581,7 @@ read_symbol_area (lua_State *L, int index, LdRectangle *area)
 | 
			
		||||
{
 | 
			
		||||
	lua_Number x1, x2, y1, y2;
 | 
			
		||||
 | 
			
		||||
	if (lua_objlen (L, index) != 4)
 | 
			
		||||
	if (lua_rawlen (L, index) != 4)
 | 
			
		||||
		return FALSE;
 | 
			
		||||
 | 
			
		||||
	lua_rawgeti (L, index, 1);
 | 
			
		||||
@@ -562,7 +606,7 @@ read_symbol_area (lua_State *L, int index, LdRectangle *area)
 | 
			
		||||
 | 
			
		||||
	area->x = MIN (x1, x2);
 | 
			
		||||
	area->y = MIN (y1, y2);
 | 
			
		||||
	area->width = ABS (x2 - x1);
 | 
			
		||||
	area->width  = ABS (x2 - x1);
 | 
			
		||||
	area->height = ABS (y2 - y1);
 | 
			
		||||
 | 
			
		||||
	lua_pop (L, 4);
 | 
			
		||||
@@ -585,7 +629,7 @@ read_terminals (lua_State *L, int index, LdPointArray **terminals)
 | 
			
		||||
	LdPointArray *points;
 | 
			
		||||
	size_t num_points;
 | 
			
		||||
 | 
			
		||||
	num_points = lua_objlen (L, index);
 | 
			
		||||
	num_points = lua_rawlen (L, index);
 | 
			
		||||
	points = ld_point_array_sized_new (num_points);
 | 
			
		||||
 | 
			
		||||
	lua_pushnil (L);
 | 
			
		||||
@@ -593,7 +637,7 @@ read_terminals (lua_State *L, int index, LdPointArray **terminals)
 | 
			
		||||
	{
 | 
			
		||||
		g_assert (points->length < points->size);
 | 
			
		||||
 | 
			
		||||
		if (!lua_istable (L, -1) || lua_objlen (L, -1) != 2)
 | 
			
		||||
		if (!lua_istable (L, -1) || lua_rawlen (L, -1) != 2)
 | 
			
		||||
			goto read_terminals_fail;
 | 
			
		||||
 | 
			
		||||
		lua_rawgeti (L, -1, 1);
 | 
			
		||||
@@ -622,32 +666,6 @@ read_terminals_fail:
 | 
			
		||||
 | 
			
		||||
/* ===== Cairo ============================================================= */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
push_cairo_object (lua_State *L, LdLuaDrawData *draw_data)
 | 
			
		||||
{
 | 
			
		||||
	luaL_Reg *fn;
 | 
			
		||||
 | 
			
		||||
	/* Create a table. */
 | 
			
		||||
	lua_newtable (L);
 | 
			
		||||
 | 
			
		||||
	/* Add methods. */
 | 
			
		||||
	/* XXX: The light user data pointer gets invalid after the end of
 | 
			
		||||
	 *      "render" function invocation. If the script stores the "cr" object
 | 
			
		||||
	 *      in some global variable and then tries to reuse it the next time,
 | 
			
		||||
	 *      the application may go SIGSEGV.
 | 
			
		||||
	 *
 | 
			
		||||
	 *      The solution is creating a full user data instead, referencing
 | 
			
		||||
	 *      the cairo object and dereferencing it upon garbage collection
 | 
			
		||||
	 *      of the user data object.
 | 
			
		||||
	 */
 | 
			
		||||
	for (fn = ld_lua_cairo_table; fn->name; fn++)
 | 
			
		||||
	{
 | 
			
		||||
		lua_pushlightuserdata (L, draw_data);
 | 
			
		||||
		lua_pushcclosure (L, fn->func, 1);
 | 
			
		||||
		lua_setfield (L, -2, fn->name);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gdouble
 | 
			
		||||
get_cairo_scale (cairo_t *cr)
 | 
			
		||||
{
 | 
			
		||||
@@ -657,6 +675,11 @@ get_cairo_scale (cairo_t *cr)
 | 
			
		||||
	return dx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define LD_LUA_CAIRO_GET_DATA \
 | 
			
		||||
	data = luaL_checkudata (L, 1, LD_LUA_META_INDEX); \
 | 
			
		||||
	if (!data->cr) \
 | 
			
		||||
		return luaL_error (L, "Tried to use an invalid Cairo object");
 | 
			
		||||
 | 
			
		||||
#define LD_LUA_CAIRO_BEGIN(name) \
 | 
			
		||||
static int \
 | 
			
		||||
ld_lua_cairo_ ## name (lua_State *L) \
 | 
			
		||||
@@ -669,7 +692,7 @@ ld_lua_cairo_ ## name (lua_State *L) \
 | 
			
		||||
 | 
			
		||||
#define LD_LUA_CAIRO_TRIVIAL(name) \
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (name) \
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1)); \
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA \
 | 
			
		||||
	cairo_ ## name (data->cr); \
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
 | 
			
		||||
@@ -685,7 +708,7 @@ LD_LUA_CAIRO_TRIVIAL (clip)
 | 
			
		||||
LD_LUA_CAIRO_TRIVIAL (clip_preserve)
 | 
			
		||||
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (save)
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	if (data->save_count + 1)
 | 
			
		||||
	{
 | 
			
		||||
		data->save_count++;
 | 
			
		||||
@@ -694,7 +717,7 @@ LD_LUA_CAIRO_BEGIN (save)
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (restore)
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	if (data->save_count)
 | 
			
		||||
	{
 | 
			
		||||
		data->save_count--;
 | 
			
		||||
@@ -703,24 +726,23 @@ LD_LUA_CAIRO_BEGIN (restore)
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (get_line_width)
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	lua_pushnumber (L, cairo_get_line_width (data->cr)
 | 
			
		||||
		* get_cairo_scale (data->cr));
 | 
			
		||||
LD_LUA_CAIRO_END (1)
 | 
			
		||||
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (set_line_width)
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
	cairo_set_line_width (data->cr, luaL_checknumber (L, 1)
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	cairo_set_line_width (data->cr, luaL_checknumber (L, 2)
 | 
			
		||||
		/ get_cairo_scale (data->cr));
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (translate)
 | 
			
		||||
	lua_Number x, y;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
 | 
			
		||||
	x = luaL_checknumber (L, 1);
 | 
			
		||||
	y = luaL_checknumber (L, 2);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	x = luaL_checknumber (L, 2);
 | 
			
		||||
	y = luaL_checknumber (L, 3);
 | 
			
		||||
 | 
			
		||||
	cairo_translate (data->cr, x, y);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
@@ -728,10 +750,9 @@ LD_LUA_CAIRO_END (0)
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (scale)
 | 
			
		||||
	lua_Number sx, sy;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
 | 
			
		||||
	sx = luaL_checknumber (L, 1);
 | 
			
		||||
	sy = luaL_checknumber (L, 2);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	sx = luaL_checknumber (L, 2);
 | 
			
		||||
	sy = luaL_checknumber (L, 3);
 | 
			
		||||
 | 
			
		||||
	cairo_scale (data->cr, sx, sy);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
@@ -739,18 +760,17 @@ LD_LUA_CAIRO_END (0)
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (rotate)
 | 
			
		||||
	lua_Number angle;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
	angle = luaL_checknumber (L, 1);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	angle = luaL_checknumber (L, 2);
 | 
			
		||||
	cairo_rotate (data->cr, angle);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (move_to)
 | 
			
		||||
	lua_Number x, y;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
 | 
			
		||||
	x = luaL_checknumber (L, 1);
 | 
			
		||||
	y = luaL_checknumber (L, 2);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	x = luaL_checknumber (L, 2);
 | 
			
		||||
	y = luaL_checknumber (L, 3);
 | 
			
		||||
 | 
			
		||||
	cairo_move_to (data->cr, x, y);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
@@ -758,10 +778,9 @@ LD_LUA_CAIRO_END (0)
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (line_to)
 | 
			
		||||
	lua_Number x, y;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
 | 
			
		||||
	x = luaL_checknumber (L, 1);
 | 
			
		||||
	y = luaL_checknumber (L, 2);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	x = luaL_checknumber (L, 2);
 | 
			
		||||
	y = luaL_checknumber (L, 3);
 | 
			
		||||
 | 
			
		||||
	cairo_line_to (data->cr, x, y);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
@@ -769,14 +788,13 @@ LD_LUA_CAIRO_END (0)
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (curve_to)
 | 
			
		||||
	lua_Number x1, y1, x2, y2, x3, y3;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
 | 
			
		||||
	x1 = luaL_checknumber (L, 1);
 | 
			
		||||
	y1 = luaL_checknumber (L, 2);
 | 
			
		||||
	x2 = luaL_checknumber (L, 3);
 | 
			
		||||
	y2 = luaL_checknumber (L, 4);
 | 
			
		||||
	x3 = luaL_checknumber (L, 5);
 | 
			
		||||
	y3 = luaL_checknumber (L, 6);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	x1 = luaL_checknumber (L, 2);
 | 
			
		||||
	y1 = luaL_checknumber (L, 3);
 | 
			
		||||
	x2 = luaL_checknumber (L, 4);
 | 
			
		||||
	y2 = luaL_checknumber (L, 5);
 | 
			
		||||
	x3 = luaL_checknumber (L, 6);
 | 
			
		||||
	y3 = luaL_checknumber (L, 7);
 | 
			
		||||
 | 
			
		||||
	cairo_curve_to (data->cr, x1, y1, x2, y2, x3, y3);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
@@ -784,13 +802,12 @@ LD_LUA_CAIRO_END (0)
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (arc)
 | 
			
		||||
	lua_Number xc, yc, radius, angle1, angle2;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
 | 
			
		||||
	xc = luaL_checknumber (L, 1);
 | 
			
		||||
	yc = luaL_checknumber (L, 2);
 | 
			
		||||
	radius = luaL_checknumber (L, 3);
 | 
			
		||||
	angle1 = luaL_checknumber (L, 4);
 | 
			
		||||
	angle2 = luaL_checknumber (L, 5);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	xc = luaL_checknumber (L, 2);
 | 
			
		||||
	yc = luaL_checknumber (L, 3);
 | 
			
		||||
	radius = luaL_checknumber (L, 4);
 | 
			
		||||
	angle1 = luaL_checknumber (L, 5);
 | 
			
		||||
	angle2 = luaL_checknumber (L, 6);
 | 
			
		||||
 | 
			
		||||
	cairo_arc (data->cr, xc, yc, radius, angle1, angle2);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
@@ -798,33 +815,38 @@ LD_LUA_CAIRO_END (0)
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (arc_negative)
 | 
			
		||||
	lua_Number xc, yc, radius, angle1, angle2;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
 | 
			
		||||
	xc = luaL_checknumber (L, 1);
 | 
			
		||||
	yc = luaL_checknumber (L, 2);
 | 
			
		||||
	radius = luaL_checknumber (L, 3);
 | 
			
		||||
	angle1 = luaL_checknumber (L, 4);
 | 
			
		||||
	angle2 = luaL_checknumber (L, 5);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	xc = luaL_checknumber (L, 2);
 | 
			
		||||
	yc = luaL_checknumber (L, 3);
 | 
			
		||||
	radius = luaL_checknumber (L, 4);
 | 
			
		||||
	angle1 = luaL_checknumber (L, 5);
 | 
			
		||||
	angle2 = luaL_checknumber (L, 6);
 | 
			
		||||
 | 
			
		||||
	cairo_arc_negative (data->cr, xc, yc, radius, angle1, angle2);
 | 
			
		||||
LD_LUA_CAIRO_END (0)
 | 
			
		||||
 | 
			
		||||
LD_LUA_CAIRO_BEGIN (show_text)
 | 
			
		||||
	const char *text;
 | 
			
		||||
	GtkStyle *style;
 | 
			
		||||
	GtkStyleContext *style;
 | 
			
		||||
	const PangoFontDescription *orig_font_desc;
 | 
			
		||||
	PangoFontDescription *font_desc;
 | 
			
		||||
	PangoLayout *layout;
 | 
			
		||||
	int width, height;
 | 
			
		||||
	double x, y;
 | 
			
		||||
 | 
			
		||||
	data = lua_touserdata (L, lua_upvalueindex (1));
 | 
			
		||||
	text = luaL_checkstring (L, 1);
 | 
			
		||||
	LD_LUA_CAIRO_GET_DATA
 | 
			
		||||
	text = luaL_checkstring (L, 2);
 | 
			
		||||
 | 
			
		||||
	layout = pango_cairo_create_layout (data->cr);
 | 
			
		||||
	pango_layout_set_text (layout, text, -1);
 | 
			
		||||
 | 
			
		||||
	style = gtk_style_new ();
 | 
			
		||||
	pango_font_description_set_size (style->font_desc, 1 * PANGO_SCALE);
 | 
			
		||||
	pango_layout_set_font_description (layout, style->font_desc);
 | 
			
		||||
	style = gtk_style_context_new ();
 | 
			
		||||
	gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL,
 | 
			
		||||
		GTK_STYLE_PROPERTY_FONT, &orig_font_desc, NULL);
 | 
			
		||||
	font_desc = pango_font_description_copy (orig_font_desc);
 | 
			
		||||
	pango_font_description_set_size (font_desc, 1 * PANGO_SCALE);
 | 
			
		||||
	pango_layout_set_font_description (layout, font_desc);
 | 
			
		||||
	pango_font_description_free (font_desc);
 | 
			
		||||
	g_object_unref (style);
 | 
			
		||||
 | 
			
		||||
	pango_layout_get_size (layout, &width, &height);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-lua.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010. All rights reserved.
 | 
			
		||||
 * Copyright 2010 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,339 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-symbol-category.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "liblogdiag.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:ld-symbol-category
 | 
			
		||||
 * @short_description: A category of symbols
 | 
			
		||||
 * @see_also: #LdSymbol, #LdLibrary
 | 
			
		||||
 *
 | 
			
		||||
 * #LdSymbolCategory represents a category of #LdSymbol objects.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LdSymbolCategoryPrivate:
 | 
			
		||||
 * @name: the name of this category.
 | 
			
		||||
 * @image_path: path to the image for this category.
 | 
			
		||||
 * @children: children of this category.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdSymbolCategoryPrivate
 | 
			
		||||
{
 | 
			
		||||
	gchar *name;
 | 
			
		||||
	gchar *human_name;
 | 
			
		||||
	gchar *image_path;
 | 
			
		||||
	GSList *children;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	PROP_0,
 | 
			
		||||
	PROP_NAME,
 | 
			
		||||
	PROP_HUMAN_NAME,
 | 
			
		||||
	PROP_IMAGE_PATH
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ld_symbol_category_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_symbol_category_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec);
 | 
			
		||||
static void ld_symbol_category_finalize (GObject *gobject);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (LdSymbolCategory, ld_symbol_category, G_TYPE_OBJECT);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_symbol_category_class_init (LdSymbolCategoryClass *klass)
 | 
			
		||||
{
 | 
			
		||||
	GObjectClass *object_class;
 | 
			
		||||
	GParamSpec *pspec;
 | 
			
		||||
 | 
			
		||||
	object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
	object_class->get_property = ld_symbol_category_get_property;
 | 
			
		||||
	object_class->set_property = ld_symbol_category_set_property;
 | 
			
		||||
	object_class->finalize = ld_symbol_category_finalize;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdSymbolCategory:name:
 | 
			
		||||
 *
 | 
			
		||||
 * The name of this symbol category.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_string ("name", "Name",
 | 
			
		||||
		"The name of this symbol category.",
 | 
			
		||||
		"", G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_NAME, pspec);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdSymbolCategory:human-name:
 | 
			
		||||
 *
 | 
			
		||||
 * The localized human name of this symbol category.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_string ("human-name", "Human name",
 | 
			
		||||
		"The localized human name of this symbol category.",
 | 
			
		||||
		"", G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_HUMAN_NAME, pspec);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdSymbolCategory:image-path:
 | 
			
		||||
 *
 | 
			
		||||
 * Path to an image file representing this category.
 | 
			
		||||
 */
 | 
			
		||||
	pspec = g_param_spec_string ("image-path", "Image path",
 | 
			
		||||
		"Path to an image file representing this category.",
 | 
			
		||||
		"", G_PARAM_READWRITE);
 | 
			
		||||
	g_object_class_install_property (object_class, PROP_IMAGE_PATH, pspec);
 | 
			
		||||
 | 
			
		||||
	g_type_class_add_private (klass, sizeof (LdSymbolCategoryPrivate));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_symbol_category_init (LdSymbolCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	self->priv = G_TYPE_INSTANCE_GET_PRIVATE
 | 
			
		||||
		(self, LD_TYPE_SYMBOL_CATEGORY, LdSymbolCategoryPrivate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_symbol_category_get_property (GObject *object, guint property_id,
 | 
			
		||||
	GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	LdSymbolCategory *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_SYMBOL_CATEGORY (object);
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_NAME:
 | 
			
		||||
		g_value_set_string (value, ld_symbol_category_get_name (self));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_HUMAN_NAME:
 | 
			
		||||
		g_value_set_string (value, ld_symbol_category_get_human_name (self));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_IMAGE_PATH:
 | 
			
		||||
		g_value_set_string (value, ld_symbol_category_get_image_path (self));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_symbol_category_set_property (GObject *object, guint property_id,
 | 
			
		||||
	const GValue *value, GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
	LdSymbolCategory *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_SYMBOL_CATEGORY (object);
 | 
			
		||||
	switch (property_id)
 | 
			
		||||
	{
 | 
			
		||||
	case PROP_NAME:
 | 
			
		||||
		ld_symbol_category_set_name (self, g_value_get_string (value));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_HUMAN_NAME:
 | 
			
		||||
		ld_symbol_category_set_human_name (self, g_value_get_string (value));
 | 
			
		||||
		break;
 | 
			
		||||
	case PROP_IMAGE_PATH:
 | 
			
		||||
		ld_symbol_category_set_image_path (self, g_value_get_string (value));
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ld_symbol_category_finalize (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
	LdSymbolCategory *self;
 | 
			
		||||
 | 
			
		||||
	self = LD_SYMBOL_CATEGORY (gobject);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->name)
 | 
			
		||||
		g_free (self->priv->name);
 | 
			
		||||
	if (self->priv->human_name)
 | 
			
		||||
		g_free (self->priv->human_name);
 | 
			
		||||
	if (self->priv->image_path)
 | 
			
		||||
		g_free (self->priv->image_path);
 | 
			
		||||
 | 
			
		||||
	g_slist_foreach (self->priv->children, (GFunc) g_object_unref, NULL);
 | 
			
		||||
	g_slist_free (self->priv->children);
 | 
			
		||||
 | 
			
		||||
	/* Chain up to the parent class. */
 | 
			
		||||
	G_OBJECT_CLASS (ld_symbol_category_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_new:
 | 
			
		||||
 * @name: the name of the new category.
 | 
			
		||||
 * @human_name: the localized human name of the new category.
 | 
			
		||||
 *
 | 
			
		||||
 * Create an instance.
 | 
			
		||||
 */
 | 
			
		||||
LdSymbolCategory *
 | 
			
		||||
ld_symbol_category_new (const gchar *name, const gchar *human_name)
 | 
			
		||||
{
 | 
			
		||||
	LdSymbolCategory *cat;
 | 
			
		||||
 | 
			
		||||
	g_return_val_if_fail (name != NULL, NULL);
 | 
			
		||||
	g_return_val_if_fail (human_name != NULL, NULL);
 | 
			
		||||
 | 
			
		||||
	cat = g_object_new (LD_TYPE_SYMBOL_CATEGORY, NULL);
 | 
			
		||||
	cat->priv->name = g_strdup (name);
 | 
			
		||||
	cat->priv->human_name = g_strdup (human_name);
 | 
			
		||||
 | 
			
		||||
	return cat;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_set_name:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 * @name: the new name for this category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_symbol_category_set_name (LdSymbolCategory *self, const gchar *name)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (name != NULL);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->name)
 | 
			
		||||
		g_free (self->priv->name);
 | 
			
		||||
	self->priv->name = g_strdup (name);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "name");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_get_name:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return the name of this category.
 | 
			
		||||
 */
 | 
			
		||||
const gchar *
 | 
			
		||||
ld_symbol_category_get_name (LdSymbolCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_SYMBOL_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_set_human_name:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 * @human_name: the new localized human name for this category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_symbol_category_set_human_name (LdSymbolCategory *self,
 | 
			
		||||
	const gchar *human_name)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (human_name != NULL);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->human_name)
 | 
			
		||||
		g_free (self->priv->human_name);
 | 
			
		||||
	self->priv->human_name = g_strdup (human_name);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "human-name");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_get_human_name:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return the localized human name of this category.
 | 
			
		||||
 */
 | 
			
		||||
const gchar *
 | 
			
		||||
ld_symbol_category_get_human_name (LdSymbolCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_SYMBOL_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->human_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_set_image_path:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 * @image_path: (allow-none): The new path to the image for this category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_symbol_category_set_image_path (LdSymbolCategory *self,
 | 
			
		||||
	const gchar *image_path)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL_CATEGORY (self));
 | 
			
		||||
 | 
			
		||||
	if (self->priv->image_path)
 | 
			
		||||
		g_free (self->priv->image_path);
 | 
			
		||||
	self->priv->image_path = g_strdup (image_path);
 | 
			
		||||
 | 
			
		||||
	g_object_notify (G_OBJECT (self), "image-path");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_get_image_path:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (allow-none): filesystem path to the image for this category.
 | 
			
		||||
 */
 | 
			
		||||
const gchar *
 | 
			
		||||
ld_symbol_category_get_image_path (LdSymbolCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_SYMBOL_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->image_path;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_insert_child:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 * @child: the child to be inserted.
 | 
			
		||||
 * @pos: the position at which the child will be inserted.
 | 
			
		||||
 *       Negative values will append to the end of list.
 | 
			
		||||
 *
 | 
			
		||||
 * Insert a child into the category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_symbol_category_insert_child (LdSymbolCategory *self,
 | 
			
		||||
	GObject *child, gint pos)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (G_IS_OBJECT (child));
 | 
			
		||||
 | 
			
		||||
	g_object_ref (child);
 | 
			
		||||
	self->priv->children = g_slist_insert (self->priv->children, child, pos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_remove_child:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 * @child: the child to be removed.
 | 
			
		||||
 *
 | 
			
		||||
 * Removes a child from the category.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ld_symbol_category_remove_child (LdSymbolCategory *self,
 | 
			
		||||
	GObject *child)
 | 
			
		||||
{
 | 
			
		||||
	g_return_if_fail (LD_IS_SYMBOL_CATEGORY (self));
 | 
			
		||||
	g_return_if_fail (G_IS_OBJECT (child));
 | 
			
		||||
 | 
			
		||||
	g_object_unref (child);
 | 
			
		||||
	self->priv->children = g_slist_remove (self->priv->children, child);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ld_symbol_category_get_children:
 | 
			
		||||
 * @self: an #LdSymbolCategory object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (element-type GObject): a list of children. Do not modify.
 | 
			
		||||
 */
 | 
			
		||||
const GSList *
 | 
			
		||||
ld_symbol_category_get_children (LdSymbolCategory *self)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail (LD_IS_SYMBOL_CATEGORY (self), NULL);
 | 
			
		||||
	return self->priv->children;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1,79 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ld-symbol-category.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LD_SYMBOL_CATEGORY_H__
 | 
			
		||||
#define __LD_SYMBOL_CATEGORY_H__
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define LD_TYPE_SYMBOL_CATEGORY (ld_symbol_category_get_type ())
 | 
			
		||||
#define LD_SYMBOL_CATEGORY(obj) (G_TYPE_CHECK_INSTANCE_CAST \
 | 
			
		||||
	((obj), LD_TYPE_SYMBOL_CATEGORY, LdSymbolCategory))
 | 
			
		||||
#define LD_SYMBOL_CATEGORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
 | 
			
		||||
	((klass), LD_TYPE_SYMBOL_CATEGORY, LdSymbolCategoryClass))
 | 
			
		||||
#define LD_IS_SYMBOL_CATEGORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
 | 
			
		||||
	((obj), LD_TYPE_SYMBOL_CATEGORY))
 | 
			
		||||
#define LD_IS_SYMBOL_CATEGORY_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
 | 
			
		||||
	((klass), LD_TYPE_SYMBOL_CATEGORY))
 | 
			
		||||
#define LD_SYMBOL_CATEGORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
 | 
			
		||||
	((obj), LD_SYMBOL_CATEGORY, LdSymbolCategoryClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _LdSymbolCategory LdSymbolCategory;
 | 
			
		||||
typedef struct _LdSymbolCategoryPrivate LdSymbolCategoryPrivate;
 | 
			
		||||
typedef struct _LdSymbolCategoryClass LdSymbolCategoryClass;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * LdSymbolCategory:
 | 
			
		||||
 */
 | 
			
		||||
struct _LdSymbolCategory
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GObject parent_instance;
 | 
			
		||||
	LdSymbolCategoryPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* TODO: If required sometime, categories (and maybe symbols) should implement
 | 
			
		||||
 *       a "changed" signal. This can be somewhat tricky. The library might be
 | 
			
		||||
 *       a good candidate for what they call a proxy. See GtkUIManager.
 | 
			
		||||
 */
 | 
			
		||||
struct _LdSymbolCategoryClass
 | 
			
		||||
{
 | 
			
		||||
/*< private >*/
 | 
			
		||||
	GObjectClass parent_class;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GType ld_symbol_category_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
LdSymbolCategory *ld_symbol_category_new (const gchar *name,
 | 
			
		||||
	const gchar *human_name);
 | 
			
		||||
 | 
			
		||||
void ld_symbol_category_set_name (LdSymbolCategory *self, const gchar *name);
 | 
			
		||||
const gchar *ld_symbol_category_get_name (LdSymbolCategory *self);
 | 
			
		||||
void ld_symbol_category_set_human_name (LdSymbolCategory *self,
 | 
			
		||||
	const gchar *human_name);
 | 
			
		||||
const gchar *ld_symbol_category_get_human_name (LdSymbolCategory *self);
 | 
			
		||||
void ld_symbol_category_set_image_path (LdSymbolCategory *self,
 | 
			
		||||
	const gchar *image_path);
 | 
			
		||||
const gchar *ld_symbol_category_get_image_path (LdSymbolCategory *self);
 | 
			
		||||
 | 
			
		||||
void ld_symbol_category_insert_child (LdSymbolCategory *self,
 | 
			
		||||
	GObject *child, gint pos);
 | 
			
		||||
void ld_symbol_category_remove_child (LdSymbolCategory *self,
 | 
			
		||||
	GObject *child);
 | 
			
		||||
const GSList *ld_symbol_category_get_children (LdSymbolCategory *self);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* ! __LD_SYMBOL_CATEGORY_H__ */
 | 
			
		||||
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-symbol.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-symbol.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-types.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-types.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010, 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-undo-action.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * ld-undo-action.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2011 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * liblogdiag.h
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2011, 2012 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
@@ -11,6 +11,15 @@
 | 
			
		||||
#ifndef __LIBLOGDIAG_H__
 | 
			
		||||
#define __LIBLOGDIAG_H__
 | 
			
		||||
 | 
			
		||||
/* Whatever, I don't care, someone should at least appreciate my effort of
 | 
			
		||||
 * porting it to GTK+ 3 in the first place.  You make me work for free!
 | 
			
		||||
 */
 | 
			
		||||
#ifdef GDK_VERSION_3_8
 | 
			
		||||
#define GDK_VERSION_MIN_REQUIRED GDK_VERSION_3_8
 | 
			
		||||
#else  // ! GDK_VERSION_3_8
 | 
			
		||||
#define GDK_VERSION_MIN_REQUIRED GDK_VERSION_3_4
 | 
			
		||||
#endif  // ! GDK_VERSION_3_8
 | 
			
		||||
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
#include <json-glib/json-glib.h>
 | 
			
		||||
 | 
			
		||||
@@ -18,7 +27,7 @@
 | 
			
		||||
#include "ld-types.h"
 | 
			
		||||
 | 
			
		||||
#include "ld-symbol.h"
 | 
			
		||||
#include "ld-symbol-category.h"
 | 
			
		||||
#include "ld-category.h"
 | 
			
		||||
#include "ld-library.h"
 | 
			
		||||
 | 
			
		||||
#include "ld-undo-action.h"
 | 
			
		||||
@@ -28,7 +37,9 @@
 | 
			
		||||
#include "ld-diagram.h"
 | 
			
		||||
 | 
			
		||||
#include "ld-diagram-view.h"
 | 
			
		||||
#include "ld-library-toolbar.h"
 | 
			
		||||
#include "ld-category-view.h"
 | 
			
		||||
#include "ld-category-symbol-view.h"
 | 
			
		||||
#include "ld-category-tree-view.h"
 | 
			
		||||
 | 
			
		||||
#include "ld-lua.h"
 | 
			
		||||
#include "ld-lua-symbol.h"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										164
									
								
								po/cs.po
									
									
									
									
									
								
							
							
						
						@@ -1,226 +1,250 @@
 | 
			
		||||
# Czech translation for logdiag.
 | 
			
		||||
# Copyright (C) 2011 Přemysl Janouch
 | 
			
		||||
# Copyright (C) 2011 Přemysl Eric Janouch
 | 
			
		||||
# This file is distributed under the same license as the logdiag package.
 | 
			
		||||
# Přemysl Janouch <p.janouch@gmail.com>, 2011.
 | 
			
		||||
# Přemysl Eric Janouch <p@janouch.name>, 2011.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: logdiag\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2011-03-06 16:14+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-06 16:24+0100\n"
 | 
			
		||||
"Last-Translator: Přemysl Janouch <p.janouch@gmail.com>\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"
 | 
			
		||||
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
 | 
			
		||||
"Language-Team: Czech <cs@li.org>\n"
 | 
			
		||||
"Language: \n"
 | 
			
		||||
"Language: cs\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Generator: Poedit 3.0\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:769
 | 
			
		||||
#: ../src/ld-window-main.c:937
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%d%%"
 | 
			
		||||
msgstr "%d %%"
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:147
 | 
			
		||||
msgid "- Schematic editor"
 | 
			
		||||
msgstr "- Editor schémat"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:861
 | 
			
		||||
msgid "Close _without Saving"
 | 
			
		||||
msgstr "Zavřít _bez uložení"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:122
 | 
			
		||||
#: ../src/ld-window-main.c:128
 | 
			
		||||
msgid "Create a new diagram"
 | 
			
		||||
msgstr "Vytvoří nový diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:155
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
msgid "Delete the contents of the selection"
 | 
			
		||||
msgstr "Odstraní obsah výběru"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:637
 | 
			
		||||
#: ../src/ld-window-main.c:354
 | 
			
		||||
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."
 | 
			
		||||
 | 
			
		||||
#: ../liblogdiag/ld-category-tree-view.c:138
 | 
			
		||||
msgid "Empty"
 | 
			
		||||
msgstr "Prázdné"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:707
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open file `%s': Invalid contents."
 | 
			
		||||
msgstr "Nelze otevřít soubor \"%s\": Neplatný obsah."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:698
 | 
			
		||||
msgid "Failed to open the file"
 | 
			
		||||
msgstr "Nelze otevřít soubor"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:602
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
msgid "Failed to save the diagram"
 | 
			
		||||
msgstr "Nelze uložit diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:767
 | 
			
		||||
#: ../src/ld-window-main.c:859
 | 
			
		||||
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:662
 | 
			
		||||
#: ../src/ld-window-main.c:738
 | 
			
		||||
msgid "Logdiag Diagrams (*.ldd)"
 | 
			
		||||
msgstr "Diagramy logdiag (*.ldd)"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:125
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
msgid "Open a diagram"
 | 
			
		||||
msgstr "Otevře diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:683
 | 
			
		||||
#: ../src/ld-window-main.c:759
 | 
			
		||||
msgid "Open..."
 | 
			
		||||
msgstr "Otevřít..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:139
 | 
			
		||||
#: ../src/ld-window-main.c:145
 | 
			
		||||
msgid "Quit the application"
 | 
			
		||||
msgstr "Ukončí aplikaci"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:147
 | 
			
		||||
#: ../src/ld-window-main.c:153
 | 
			
		||||
msgid "Redo the last undone action"
 | 
			
		||||
msgstr "Provede posledně vrácenou akci"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
#: ../src/ld-window-main.c:175
 | 
			
		||||
msgid "Reset zoom level back to the default"
 | 
			
		||||
msgstr "Vrátí přiblížení na výchozí hodnotu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:714
 | 
			
		||||
#: ../src/ld-window-main.c:792
 | 
			
		||||
msgid "Save As..."
 | 
			
		||||
msgstr "Uložit jako..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
#: ../src/ld-window-main.c:136
 | 
			
		||||
msgid "Save _As..."
 | 
			
		||||
msgstr "Uložit _jako..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:557
 | 
			
		||||
#: ../src/ld-window-main.c:623
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Save the changes to diagram \"%s\" before closing it and creating a new one?"
 | 
			
		||||
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:679
 | 
			
		||||
#: ../src/ld-window-main.c:755
 | 
			
		||||
#, 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žit změny v diagramu \"%s\" před jeho zavřením a otevřením jiného?"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:807
 | 
			
		||||
#: ../src/ld-window-main.c:899
 | 
			
		||||
#, 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:128
 | 
			
		||||
#: ../src/ld-window-main.c:134
 | 
			
		||||
msgid "Save the current diagram"
 | 
			
		||||
msgstr "Uloží stávající diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
#: ../src/ld-window-main.c:137
 | 
			
		||||
msgid "Save the current diagram with another name"
 | 
			
		||||
msgstr "Uloží stávající diagram pod jiným jménem"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:157
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
msgid "Select _All"
 | 
			
		||||
msgstr "Vybrat _vše"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:158
 | 
			
		||||
#: ../src/ld-window-main.c:164
 | 
			
		||||
msgid "Select all objects in the diagram"
 | 
			
		||||
msgstr "Vybere všechny objekty v diagramu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
#: ../src/ld-window-main.c:192
 | 
			
		||||
msgid "Show _Grid"
 | 
			
		||||
msgstr "Zobrazit _mřížku"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
msgid "Show a dialog about this application"
 | 
			
		||||
msgstr "Zobrazí dialog o této aplikaci"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:640
 | 
			
		||||
msgid "The file is probably corrupted."
 | 
			
		||||
msgstr "Soubor je pravděpodobně poškozen."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
#: ../src/ld-window-main.c:193
 | 
			
		||||
msgid "Toggle displaying of the grid"
 | 
			
		||||
msgstr "Přepne zobrazování mřížky"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:184
 | 
			
		||||
msgid "Toggle displaying of the library toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:190
 | 
			
		||||
msgid "Toggle displaying of the library pane"
 | 
			
		||||
msgstr "Přepne zobrazování panelu knihovny"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:181
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
msgid "Toggle displaying of the main toolbar"
 | 
			
		||||
msgstr "Přepne zobrazování hlavního panelu nástrojů"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:605
 | 
			
		||||
#: ../src/ld-window-main.c:665
 | 
			
		||||
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:144
 | 
			
		||||
#: ../src/ld-window-main.c:150
 | 
			
		||||
msgid "Undo the last action"
 | 
			
		||||
msgstr "Vrátí poslední akci"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:525
 | 
			
		||||
#: ../src/ld-window-main.c:591
 | 
			
		||||
msgid "Unsaved Diagram"
 | 
			
		||||
msgstr "Neuložený diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:165
 | 
			
		||||
#: ../src/ld-window-main.c:806
 | 
			
		||||
msgid "Untitled diagram"
 | 
			
		||||
msgstr "Nepojmenovaný diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:171
 | 
			
		||||
msgid "Zoom _Out"
 | 
			
		||||
msgstr "_Oddálit"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
msgid "Zoom into the diagram"
 | 
			
		||||
msgstr "Přiblíží diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:166
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
msgid "Zoom out of the diagram"
 | 
			
		||||
msgstr "Oddálí diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:42
 | 
			
		||||
msgid "[FILE] - Schematic editor"
 | 
			
		||||
msgstr "[SOUBOR] - Editor schémat"
 | 
			
		||||
#: ../src/logdiag.c:106
 | 
			
		||||
msgid "[FILE...]"
 | 
			
		||||
msgstr "[SOUBOR...]"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:173
 | 
			
		||||
#: ../src/ld-window-main.c:179
 | 
			
		||||
msgid "_About"
 | 
			
		||||
msgstr "_O programu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:154
 | 
			
		||||
#: ../src/ld-window-main.c:160
 | 
			
		||||
msgid "_Delete"
 | 
			
		||||
msgstr "_Smazat"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:142
 | 
			
		||||
#: ../src/ld-window-main.c:148
 | 
			
		||||
msgid "_Edit"
 | 
			
		||||
msgstr "_Úpravy"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:120
 | 
			
		||||
#: ../src/ld-window-main.c:126
 | 
			
		||||
msgid "_File"
 | 
			
		||||
msgstr "_Soubor"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
#: ../src/ld-window-main.c:178
 | 
			
		||||
msgid "_Help"
 | 
			
		||||
msgstr "_Nápověda"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:183
 | 
			
		||||
msgid "_Library Toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:189
 | 
			
		||||
msgid "_Library Pane"
 | 
			
		||||
msgstr "Panel _knihovny"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
msgid "_Main Toolbar"
 | 
			
		||||
msgstr "_Hlavní panel nástrojů"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:121
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
msgid "_New"
 | 
			
		||||
msgstr "_Nový"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
msgid "_Normal Size"
 | 
			
		||||
msgstr "_Normální velikost"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:124
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
msgid "_Open..."
 | 
			
		||||
msgstr "_Otevřít..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:138
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
msgid "_Quit"
 | 
			
		||||
msgstr "U_končit"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:146
 | 
			
		||||
#: ../src/ld-window-main.c:152
 | 
			
		||||
msgid "_Redo"
 | 
			
		||||
msgstr "Z_novu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
#: ../src/ld-window-main.c:133
 | 
			
		||||
msgid "_Save"
 | 
			
		||||
msgstr "_Uložit"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:143
 | 
			
		||||
#: ../src/ld-window-main.c:149
 | 
			
		||||
msgid "_Undo"
 | 
			
		||||
msgstr "_Zpět"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
#: ../src/ld-window-main.c:167
 | 
			
		||||
msgid "_View"
 | 
			
		||||
msgstr "_Zobrazení"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:162
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
msgid "_Zoom In"
 | 
			
		||||
msgstr "_Přiblížit"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:894
 | 
			
		||||
#: ../src/ld-window-main.c:983
 | 
			
		||||
msgid "translator-credits"
 | 
			
		||||
msgstr "Přemysl Janouch <p.janouch@gmail.com>"
 | 
			
		||||
msgstr "Přemysl Eric Janouch <p@janouch.name>"
 | 
			
		||||
 | 
			
		||||
#~ msgid "The file is probably corrupted."
 | 
			
		||||
#~ msgstr "Soubor je pravděpodobně poškozen."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										432
									
								
								po/de.po
									
									
									
									
									
								
							
							
						
						@@ -1,225 +1,257 @@
 | 
			
		||||
# German translation for logdiag.
 | 
			
		||||
# Copyright (C) 2011 Přemysl Janouch
 | 
			
		||||
# Copyright (C) 2011 Přemysl Eric Janouch
 | 
			
		||||
# This file is distributed under the same license as the logdiag package.
 | 
			
		||||
# Andy J., 2011.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: logdiag\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2011-03-06 16:14+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-07 05:55+0100\n"
 | 
			
		||||
"Last-Translator: Andy J.\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"
 | 
			
		||||
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
 | 
			
		||||
"Language-Team: German <de@li.org>\n"
 | 
			
		||||
"Language: \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"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:120
 | 
			
		||||
msgid "_File"
 | 
			
		||||
msgstr "_Datei"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:121
 | 
			
		||||
msgid "_New"
 | 
			
		||||
msgstr "_Neu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:122
 | 
			
		||||
msgid "Create a new diagram"
 | 
			
		||||
msgstr "Neues Diagramm erstellen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:124
 | 
			
		||||
msgid "_Open..."
 | 
			
		||||
msgstr "_Öffnen..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:125
 | 
			
		||||
msgid "Open a diagram"
 | 
			
		||||
msgstr "Diagramm öffnen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
msgid "_Save"
 | 
			
		||||
msgstr "_Speichern"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:128
 | 
			
		||||
msgid "Save the current diagram"
 | 
			
		||||
msgstr "Speichern des aktuellen Diagramms"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
msgid "Save _As..."
 | 
			
		||||
msgstr "Speichern _unter..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
msgid "Save the current diagram with another name"
 | 
			
		||||
msgstr "Aktuelles Diagramm unter anderem Namen speichern"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:138
 | 
			
		||||
msgid "_Quit"
 | 
			
		||||
msgstr "_Beenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:139
 | 
			
		||||
msgid "Quit the application"
 | 
			
		||||
msgstr "Anwendung beenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:142
 | 
			
		||||
msgid "_Edit"
 | 
			
		||||
msgstr "_Ändern"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:143
 | 
			
		||||
msgid "_Undo"
 | 
			
		||||
msgstr "_Rückgängig"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
msgid "Undo the last action"
 | 
			
		||||
msgstr "Letzte Aktion rückgangig machen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:146
 | 
			
		||||
msgid "_Redo"
 | 
			
		||||
msgstr "_Wiederholen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:147
 | 
			
		||||
msgid "Redo the last undone action"
 | 
			
		||||
msgstr "Letzte nicht abgeschlossene Aktion wiederholen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:154
 | 
			
		||||
msgid "_Delete"
 | 
			
		||||
msgstr "_Löschen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:155
 | 
			
		||||
msgid "Delete the contents of the selection"
 | 
			
		||||
msgstr "Inhalt der markierten Einträge löschen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:157
 | 
			
		||||
msgid "Select _All"
 | 
			
		||||
msgstr "_Alles Auswählen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:158
 | 
			
		||||
msgid "Select all objects in the diagram"
 | 
			
		||||
msgstr "Alle Objekte im Diagramm auswählen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
msgid "_View"
 | 
			
		||||
msgstr "_Ansicht"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:162
 | 
			
		||||
msgid "_Zoom In"
 | 
			
		||||
msgstr "_Hineinzoomen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
msgid "Zoom into the diagram"
 | 
			
		||||
msgstr "In das Diagramm zoomen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:165
 | 
			
		||||
msgid "Zoom _Out"
 | 
			
		||||
msgstr "Zoom _heraus"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:166
 | 
			
		||||
msgid "Zoom out of the diagram"
 | 
			
		||||
msgstr "Aus dem Diagramm zoomen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
msgid "_Normal Size"
 | 
			
		||||
msgstr "_Normale Größe"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
msgid "Reset zoom level back to the default"
 | 
			
		||||
msgstr "Zoom Bereich zurücksetzen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
msgid "_Help"
 | 
			
		||||
msgstr "_Hilfe"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:173
 | 
			
		||||
msgid "_About"
 | 
			
		||||
msgstr "_Über"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
msgid "Show a dialog about this application"
 | 
			
		||||
msgstr "Zeige einen Dialog über diese Anwendung"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
msgid "_Main Toolbar"
 | 
			
		||||
msgstr "_Symbolleiste"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:181
 | 
			
		||||
msgid "Toggle displaying of the main toolbar"
 | 
			
		||||
msgstr "Symbolleiste ein-/ausblenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:183
 | 
			
		||||
msgid "_Library Toolbar"
 | 
			
		||||
msgstr "_Bibliothek Menüleiste"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:184
 | 
			
		||||
msgid "Toggle displaying of the library toolbar"
 | 
			
		||||
msgstr "Bibliothek ein-/ausblenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
msgid "Show _Grid"
 | 
			
		||||
msgstr "_Gitter anzeigen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
msgid "Toggle displaying of the grid"
 | 
			
		||||
msgstr "Gitter ein-/ausblenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:525
 | 
			
		||||
msgid "Unsaved Diagram"
 | 
			
		||||
msgstr "Ungespeichertes Diagramm"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:557
 | 
			
		||||
#: ../src/ld-window-main.c:937
 | 
			
		||||
#, 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?"
 | 
			
		||||
msgid "%d%%"
 | 
			
		||||
msgstr "%d %%"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:602
 | 
			
		||||
msgid "Failed to save the diagram"
 | 
			
		||||
msgstr "Fehler beim Speichern des Diagramms"
 | 
			
		||||
#: ../src/logdiag.c:147
 | 
			
		||||
msgid "- Schematic editor"
 | 
			
		||||
msgstr "- Schema Editor"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:605
 | 
			
		||||
msgid "Try again or save it under another name."
 | 
			
		||||
msgstr "Erneuter Versuch oder unter anderem Namen speichern."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:637
 | 
			
		||||
msgid "Failed to open the file"
 | 
			
		||||
msgstr "Fehler beim Öffnen der Datei"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:640
 | 
			
		||||
msgid "The file is probably corrupted."
 | 
			
		||||
msgstr "Die Datei ist vermutlich beschädigt."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
msgid "Logdiag Diagrams (*.ldd)"
 | 
			
		||||
msgstr "Diagramme logdiag (.ldd)"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:679
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Save the changes to diagram \"%s\" before closing it and opening another one?"
 | 
			
		||||
msgstr "Änderungen im Diagramm \"%s\" speichern bevor es beendet und ein Weiteres geöffnet wird?"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:683
 | 
			
		||||
msgid "Open..."
 | 
			
		||||
msgstr "Öffnen..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:714
 | 
			
		||||
msgid "Save As..."
 | 
			
		||||
msgstr "Speichern unter..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:767
 | 
			
		||||
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:769
 | 
			
		||||
#: ../src/ld-window-main.c:861
 | 
			
		||||
msgid "Close _without Saving"
 | 
			
		||||
msgstr "Schließen _ohne Speichern"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:807
 | 
			
		||||
#: ../src/ld-window-main.c:128
 | 
			
		||||
msgid "Create a new diagram"
 | 
			
		||||
msgstr "Neues Diagramm erstellen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
msgid "Delete the contents of the selection"
 | 
			
		||||
msgstr "Inhalt der markierten Einträge löschen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:354
 | 
			
		||||
msgid "Drag symbols from the library pane to add them to the diagram."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ziehen Sie Symbole aus dem Bibliotheksfenster, um sie dem Diagramm "
 | 
			
		||||
"hinzuzufügen."
 | 
			
		||||
 | 
			
		||||
#: ../liblogdiag/ld-category-tree-view.c:138
 | 
			
		||||
msgid "Empty"
 | 
			
		||||
msgstr "Leere"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:707
 | 
			
		||||
#, 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
 | 
			
		||||
msgid "Failed to open the file"
 | 
			
		||||
msgstr "Fehler beim Öffnen der Datei"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
msgid "Failed to save the diagram"
 | 
			
		||||
msgstr "Fehler beim Speichern des Diagramms"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:859
 | 
			
		||||
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
 | 
			
		||||
msgid "Logdiag Diagrams (*.ldd)"
 | 
			
		||||
msgstr "Diagramme logdiag (.ldd)"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
msgid "Open a diagram"
 | 
			
		||||
msgstr "Diagramm öffnen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:759
 | 
			
		||||
msgid "Open..."
 | 
			
		||||
msgstr "Öffnen..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:145
 | 
			
		||||
msgid "Quit the application"
 | 
			
		||||
msgstr "Anwendung beenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:153
 | 
			
		||||
msgid "Redo the last undone action"
 | 
			
		||||
msgstr "Letzte nicht abgeschlossene Aktion wiederholen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:175
 | 
			
		||||
msgid "Reset zoom level back to the default"
 | 
			
		||||
msgstr "Zoom Bereich zurücksetzen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:792
 | 
			
		||||
msgid "Save As..."
 | 
			
		||||
msgstr "Speichern unter..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:136
 | 
			
		||||
msgid "Save _As..."
 | 
			
		||||
msgstr "Speichern _unter..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:623
 | 
			
		||||
#, 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
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Save the changes to diagram \"%s\" before closing it and opening another one?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Änderungen im Diagramm \"%s\" speichern bevor es beendet und ein Weiteres "
 | 
			
		||||
"geöffnet wird?"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:899
 | 
			
		||||
#, 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:894
 | 
			
		||||
#: ../src/ld-window-main.c:134
 | 
			
		||||
msgid "Save the current diagram"
 | 
			
		||||
msgstr "Speichern des aktuellen Diagramms"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:137
 | 
			
		||||
msgid "Save the current diagram with another name"
 | 
			
		||||
msgstr "Aktuelles Diagramm unter anderem Namen speichern"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
msgid "Select _All"
 | 
			
		||||
msgstr "_Alles Auswählen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:164
 | 
			
		||||
msgid "Select all objects in the diagram"
 | 
			
		||||
msgstr "Alle Objekte im Diagramm auswählen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:192
 | 
			
		||||
msgid "Show _Grid"
 | 
			
		||||
msgstr "_Gitter anzeigen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
msgid "Show a dialog about this application"
 | 
			
		||||
msgstr "Zeige einen Dialog über diese Anwendung"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:193
 | 
			
		||||
msgid "Toggle displaying of the grid"
 | 
			
		||||
msgstr "Gitter ein-/ausblenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:190
 | 
			
		||||
msgid "Toggle displaying of the library pane"
 | 
			
		||||
msgstr "Bibliothek ein-/ausblenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
msgid "Toggle displaying of the main toolbar"
 | 
			
		||||
msgstr "Symbolleiste ein-/ausblenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:665
 | 
			
		||||
msgid "Try again or save it under another name."
 | 
			
		||||
msgstr "Erneuter Versuch oder unter anderem Namen speichern."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:150
 | 
			
		||||
msgid "Undo the last action"
 | 
			
		||||
msgstr "Letzte Aktion rückgangig machen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:591
 | 
			
		||||
msgid "Unsaved Diagram"
 | 
			
		||||
msgstr "Ungespeichertes Diagramm"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:806
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Untitled diagram"
 | 
			
		||||
msgstr "Ungespeichertes Diagramm"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:171
 | 
			
		||||
msgid "Zoom _Out"
 | 
			
		||||
msgstr "Zoom _heraus"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
msgid "Zoom into the diagram"
 | 
			
		||||
msgstr "In das Diagramm zoomen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
msgid "Zoom out of the diagram"
 | 
			
		||||
msgstr "Aus dem Diagramm zoomen"
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:106
 | 
			
		||||
msgid "[FILE...]"
 | 
			
		||||
msgstr "[DATEI...]"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:179
 | 
			
		||||
msgid "_About"
 | 
			
		||||
msgstr "_Über"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:160
 | 
			
		||||
msgid "_Delete"
 | 
			
		||||
msgstr "_Löschen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:148
 | 
			
		||||
msgid "_Edit"
 | 
			
		||||
msgstr "_Ändern"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:126
 | 
			
		||||
msgid "_File"
 | 
			
		||||
msgstr "_Datei"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:178
 | 
			
		||||
msgid "_Help"
 | 
			
		||||
msgstr "_Hilfe"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:189
 | 
			
		||||
msgid "_Library Pane"
 | 
			
		||||
msgstr "_Bibliothek Menüleiste"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
msgid "_Main Toolbar"
 | 
			
		||||
msgstr "_Symbolleiste"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
msgid "_New"
 | 
			
		||||
msgstr "_Neu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
msgid "_Normal Size"
 | 
			
		||||
msgstr "_Normale Größe"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
msgid "_Open..."
 | 
			
		||||
msgstr "_Öffnen..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
msgid "_Quit"
 | 
			
		||||
msgstr "_Beenden"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:152
 | 
			
		||||
msgid "_Redo"
 | 
			
		||||
msgstr "_Wiederholen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:133
 | 
			
		||||
msgid "_Save"
 | 
			
		||||
msgstr "_Speichern"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:149
 | 
			
		||||
msgid "_Undo"
 | 
			
		||||
msgstr "_Rückgängig"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:167
 | 
			
		||||
msgid "_View"
 | 
			
		||||
msgstr "_Ansicht"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
msgid "_Zoom In"
 | 
			
		||||
msgstr "_Hineinzoomen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:983
 | 
			
		||||
msgid "translator-credits"
 | 
			
		||||
msgstr "Andy J."
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:42
 | 
			
		||||
msgid "[FILE] - Schematic editor"
 | 
			
		||||
msgstr "[DATEI] - Schema Editor"
 | 
			
		||||
 | 
			
		||||
#~ msgid "The file is probably corrupted."
 | 
			
		||||
#~ msgstr "Die Datei ist vermutlich beschädigt."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										142
									
								
								po/logdiag.pot
									
									
									
									
									
								
							
							
						
						@@ -1,14 +1,14 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Přemysl Janouch
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# Copyright (C) YEAR Přemysl Eric Janouch
 | 
			
		||||
# This file is distributed under the same license as the logdiag package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: logdiag \n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2011-03-06 16:14+0100\n"
 | 
			
		||||
"Project-Id-Version: logdiag 0.2.0\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: YEAR-MO-DA HO:MI+ZONE\n"
 | 
			
		||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
			
		||||
@@ -17,211 +17,233 @@ msgstr ""
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:120
 | 
			
		||||
#: ../src/ld-window-main.c:126
 | 
			
		||||
msgid "_File"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:121
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
msgid "_New"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:122
 | 
			
		||||
#: ../src/ld-window-main.c:128
 | 
			
		||||
msgid "Create a new diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:124
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
msgid "_Open..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:125
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
msgid "Open a diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
#: ../src/ld-window-main.c:133
 | 
			
		||||
msgid "_Save"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:128
 | 
			
		||||
#: ../src/ld-window-main.c:134
 | 
			
		||||
msgid "Save the current diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
#: ../src/ld-window-main.c:136
 | 
			
		||||
msgid "Save _As..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
#: ../src/ld-window-main.c:137
 | 
			
		||||
msgid "Save the current diagram with another name"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:138
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
msgid "_Quit"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:139
 | 
			
		||||
#: ../src/ld-window-main.c:145
 | 
			
		||||
msgid "Quit the application"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:142
 | 
			
		||||
#: ../src/ld-window-main.c:148
 | 
			
		||||
msgid "_Edit"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:143
 | 
			
		||||
#: ../src/ld-window-main.c:149
 | 
			
		||||
msgid "_Undo"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
#: ../src/ld-window-main.c:150
 | 
			
		||||
msgid "Undo the last action"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:146
 | 
			
		||||
#: ../src/ld-window-main.c:152
 | 
			
		||||
msgid "_Redo"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:147
 | 
			
		||||
#: ../src/ld-window-main.c:153
 | 
			
		||||
msgid "Redo the last undone action"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:154
 | 
			
		||||
#: ../src/ld-window-main.c:160
 | 
			
		||||
msgid "_Delete"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:155
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
msgid "Delete the contents of the selection"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:157
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
msgid "Select _All"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:158
 | 
			
		||||
#: ../src/ld-window-main.c:164
 | 
			
		||||
msgid "Select all objects in the diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
#: ../src/ld-window-main.c:167
 | 
			
		||||
msgid "_View"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:162
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
msgid "_Zoom In"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
msgid "Zoom into the diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:165
 | 
			
		||||
#: ../src/ld-window-main.c:171
 | 
			
		||||
msgid "Zoom _Out"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:166
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
msgid "Zoom out of the diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
msgid "_Normal Size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
#: ../src/ld-window-main.c:175
 | 
			
		||||
msgid "Reset zoom level back to the default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
#: ../src/ld-window-main.c:178
 | 
			
		||||
msgid "_Help"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:173
 | 
			
		||||
#: ../src/ld-window-main.c:179
 | 
			
		||||
msgid "_About"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
msgid "Show a dialog about this application"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
msgid "_Main Toolbar"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:181
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
msgid "Toggle displaying of the main toolbar"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:183
 | 
			
		||||
msgid "_Library Toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:189
 | 
			
		||||
msgid "_Library Pane"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:184
 | 
			
		||||
msgid "Toggle displaying of the library toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:190
 | 
			
		||||
msgid "Toggle displaying of the library pane"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
#: ../src/ld-window-main.c:192
 | 
			
		||||
msgid "Show _Grid"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
#: ../src/ld-window-main.c:193
 | 
			
		||||
msgid "Toggle displaying of the grid"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:525
 | 
			
		||||
#: ../src/ld-window-main.c:354
 | 
			
		||||
msgid "Drag symbols from the library pane to add them to the diagram."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:591
 | 
			
		||||
msgid "Unsaved Diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:557
 | 
			
		||||
#: ../src/ld-window-main.c:623
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Save the changes to diagram \"%s\" before closing it and creating a new one?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:602
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
msgid "Failed to save the diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:605
 | 
			
		||||
#: ../src/ld-window-main.c:665
 | 
			
		||||
msgid "Try again or save it under another name."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:637
 | 
			
		||||
#: ../src/ld-window-main.c:698
 | 
			
		||||
msgid "Failed to open the file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:640
 | 
			
		||||
msgid "The file is probably corrupted."
 | 
			
		||||
#: ../src/ld-window-main.c:707
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open file `%s': Invalid contents."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
#: ../src/ld-window-main.c:738
 | 
			
		||||
msgid "Logdiag Diagrams (*.ldd)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:679
 | 
			
		||||
#: ../src/ld-window-main.c:755
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Save the changes to diagram \"%s\" before closing it and opening another one?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:683
 | 
			
		||||
#: ../src/ld-window-main.c:759
 | 
			
		||||
msgid "Open..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:714
 | 
			
		||||
#: ../src/ld-window-main.c:792
 | 
			
		||||
msgid "Save As..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:767
 | 
			
		||||
#: ../src/ld-window-main.c:806
 | 
			
		||||
msgid "Untitled diagram"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:859
 | 
			
		||||
msgid "If you don't save, changes will be permanently lost."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:769
 | 
			
		||||
#: ../src/ld-window-main.c:861
 | 
			
		||||
msgid "Close _without Saving"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:807
 | 
			
		||||
#: ../src/ld-window-main.c:899
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Save the changes to diagram \"%s\" before closing?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:894
 | 
			
		||||
#: ../src/ld-window-main.c:937
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%d%%"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:983
 | 
			
		||||
msgid "translator-credits"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:42
 | 
			
		||||
msgid "[FILE] - Schematic editor"
 | 
			
		||||
#: ../src/logdiag.c:106
 | 
			
		||||
msgid "[FILE...]"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:147
 | 
			
		||||
msgid "- Schematic editor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../liblogdiag/ld-category-tree-view.c:138
 | 
			
		||||
msgid "Empty"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -1,36 +1,21 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
# This script makes a translation template
 | 
			
		||||
# The reason for this not being inside CMakeLists.txt
 | 
			
		||||
# is that the translator should not need to run
 | 
			
		||||
# the whole configure process to get this single stupid file.
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
# This shell script generates the translation template.
 | 
			
		||||
#
 | 
			
		||||
# The reason for this not being inside CMakeLists.txt is that the translator
 | 
			
		||||
# should not need to run the whole configuration process just to get this file.
 | 
			
		||||
dir=$(dirname $0)
 | 
			
		||||
 | 
			
		||||
# Source files
 | 
			
		||||
SOURCES=$(echo ../{src,liblogdiag}/*.c)
 | 
			
		||||
export LC_ALL=C
 | 
			
		||||
 | 
			
		||||
# Get the package name from CMakeLists.txt
 | 
			
		||||
PACKAGE=$(sed -n '/^[ \t]*[pP][rR][oO][jJ][eE][cC][tT][ \t]*([ \t]*\([^ \t)]\{1,\}\).*).*/{s//\1/p;q}' \
 | 
			
		||||
	../CMakeLists.txt)
 | 
			
		||||
 | 
			
		||||
# Get the package version from CMakeLists.txt
 | 
			
		||||
EXP_BEG='/^[ \t]*[sS][eE][tT][ \t]*([ \t]*'$PACKAGE'_VERSION_'
 | 
			
		||||
EXP_END='[ \t]\{1,\}"\{0,1\}\([^)"]\{1,\}\)"\{0,1\}).*/{s//\1/p;q}'
 | 
			
		||||
 | 
			
		||||
MAJOR=$(sed -n "${EXP_BEG}MAJOR${EXP_END}" ../CMakeLists.txt)
 | 
			
		||||
MINOR=$(sed -n "${EXP_BEG}MINOR${EXP_END}" ../CMakeLists.txt)
 | 
			
		||||
PATCH=$(sed -n "${EXP_BEG}PATCH${EXP_END}" ../CMakeLists.txt)
 | 
			
		||||
 | 
			
		||||
if [ "$MAJOR" != "" ]; then
 | 
			
		||||
	VERSION=$MAJOR
 | 
			
		||||
	if [ "$MINOR" != "" ]; then
 | 
			
		||||
		VERSION=$VERSION.$MINOR
 | 
			
		||||
		if [ "$PATCH" != "" ]; then
 | 
			
		||||
			VERSION=$VERSION.$PATCH
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
re='^[ \t]*project *( *\([^ \t)]\{1,\}\) \{1,\}VERSION \{1,\}\([^ \t)]\{1,\}\).*'
 | 
			
		||||
package=$(sed -n "s/$re/\\1/p" "$dir/../CMakeLists.txt")
 | 
			
		||||
version=$(sed -n "s/$re/\\2/p" "$dir/../CMakeLists.txt")
 | 
			
		||||
if [ -z "$package" -o -z "$version" ]; then
 | 
			
		||||
	echo "Failed to get information from CMakeLists.txt"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Finally make the template
 | 
			
		||||
xgettext -LC -k_ -kN_ $SOURCES -o "$PACKAGE".pot \
 | 
			
		||||
	--package-name="$PACKAGE" --package-version="$VERSION" \
 | 
			
		||||
	--copyright-holder="Přemysl Janouch"
 | 
			
		||||
 | 
			
		||||
xgettext -LC -k_ -kN_ "$dir"/../{src,liblogdiag}/*.c -o "$dir/$package.pot" \
 | 
			
		||||
	--package-name="$package" --package-version="$version" \
 | 
			
		||||
	--copyright-holder="Přemysl Eric Janouch" \
 | 
			
		||||
	--msgid-bugs-address="https://git.janouch.name/p/$package/issues"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										155
									
								
								po/pl.po
									
									
									
									
									
								
							
							
						
						@@ -1,228 +1,255 @@
 | 
			
		||||
# Polish translation for logdiag.
 | 
			
		||||
# Copyright (C) 2011 Přemysl Janouch
 | 
			
		||||
# Copyright (C) 2011 Přemysl Eric Janouch
 | 
			
		||||
# This file is distributed under the same license as the logdiag package.
 | 
			
		||||
# Robert Svoboda <ravath@gmail.com>, 2011.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: logdiag\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2011-03-06 16:14+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-02-13 20:36+0100\n"
 | 
			
		||||
"Last-Translator: Robert Svoboda <ravath@gmail.com>\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"
 | 
			
		||||
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
 | 
			
		||||
"Language-Team: Polish <pl@li.org>\n"
 | 
			
		||||
"Language: \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"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:769
 | 
			
		||||
#: ../src/ld-window-main.c:937
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%d%%"
 | 
			
		||||
msgstr "%d%%"
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:147
 | 
			
		||||
msgid "- Schematic editor"
 | 
			
		||||
msgstr "- Edytor schematów"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:861
 | 
			
		||||
msgid "Close _without Saving"
 | 
			
		||||
msgstr "Zamknąć _bez zapisu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:122
 | 
			
		||||
#: ../src/ld-window-main.c:128
 | 
			
		||||
msgid "Create a new diagram"
 | 
			
		||||
msgstr "Stworzenie nowego wykresu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:155
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
msgid "Delete the contents of the selection"
 | 
			
		||||
msgstr "Usuń zawartość wyboru"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:637
 | 
			
		||||
#: ../src/ld-window-main.c:354
 | 
			
		||||
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."
 | 
			
		||||
 | 
			
		||||
#: ../liblogdiag/ld-category-tree-view.c:138
 | 
			
		||||
msgid "Empty"
 | 
			
		||||
msgstr "Puste"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:707
 | 
			
		||||
#, 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
 | 
			
		||||
msgid "Failed to open the file"
 | 
			
		||||
msgstr "Pliku nie da się otworzyć"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:602
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
msgid "Failed to save the diagram"
 | 
			
		||||
msgstr "Nie udało się zapisać wykresu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:767
 | 
			
		||||
#: ../src/ld-window-main.c:859
 | 
			
		||||
msgid "If you don't save, changes will be permanently lost."
 | 
			
		||||
msgstr "Jeżeli nie zapiszesz zmian, zostaną one trwale utracone"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
#: ../src/ld-window-main.c:738
 | 
			
		||||
msgid "Logdiag Diagrams (*.ldd)"
 | 
			
		||||
msgstr "Wykresy logdiag (*.ldd)"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:125
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
msgid "Open a diagram"
 | 
			
		||||
msgstr "Otwórz wykres"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:683
 | 
			
		||||
#: ../src/ld-window-main.c:759
 | 
			
		||||
msgid "Open..."
 | 
			
		||||
msgstr "Otworzyć..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:139
 | 
			
		||||
#: ../src/ld-window-main.c:145
 | 
			
		||||
msgid "Quit the application"
 | 
			
		||||
msgstr "Zamknie aplikację"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:147
 | 
			
		||||
#: ../src/ld-window-main.c:153
 | 
			
		||||
msgid "Redo the last undone action"
 | 
			
		||||
msgstr "Powtórzy ostatnio cofniętą akcję"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
#: ../src/ld-window-main.c:175
 | 
			
		||||
msgid "Reset zoom level back to the default"
 | 
			
		||||
msgstr "Przywróci poziom zbliżenia na poziom wyjściowy"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:714
 | 
			
		||||
#: ../src/ld-window-main.c:792
 | 
			
		||||
msgid "Save As..."
 | 
			
		||||
msgstr "Zapisz jako..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
#: ../src/ld-window-main.c:136
 | 
			
		||||
msgid "Save _As..."
 | 
			
		||||
msgstr "Zapisz _jako..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:557
 | 
			
		||||
#: ../src/ld-window-main.c:623
 | 
			
		||||
#, 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?"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:679
 | 
			
		||||
#: ../src/ld-window-main.c:755
 | 
			
		||||
#, 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?"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:807
 | 
			
		||||
#: ../src/ld-window-main.c:899
 | 
			
		||||
#, 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:128
 | 
			
		||||
#: ../src/ld-window-main.c:134
 | 
			
		||||
msgid "Save the current diagram"
 | 
			
		||||
msgstr "Zapisz aktywny wykres"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
#: ../src/ld-window-main.c:137
 | 
			
		||||
msgid "Save the current diagram with another name"
 | 
			
		||||
msgstr "Zapisać aktywny wykres pod inną nazwą"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:157
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
msgid "Select _All"
 | 
			
		||||
msgstr "Wybierz _wszystko"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:158
 | 
			
		||||
#: ../src/ld-window-main.c:164
 | 
			
		||||
msgid "Select all objects in the diagram"
 | 
			
		||||
msgstr "Wybierze wszystkie obietky w wykresie"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
#: ../src/ld-window-main.c:192
 | 
			
		||||
msgid "Show _Grid"
 | 
			
		||||
msgstr "Pokaż _Siatkę"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
msgid "Show a dialog about this application"
 | 
			
		||||
msgstr "Pokaże informacje o tej aplikacji"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:640
 | 
			
		||||
msgid "The file is probably corrupted."
 | 
			
		||||
msgstr "Plik jest prawdopodobnie uszkodzony."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
#: ../src/ld-window-main.c:193
 | 
			
		||||
msgid "Toggle displaying of the grid"
 | 
			
		||||
msgstr "Przełączy pokazywanie siatki"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:184
 | 
			
		||||
msgid "Toggle displaying of the library toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:190
 | 
			
		||||
msgid "Toggle displaying of the library pane"
 | 
			
		||||
msgstr "Przełączy pokazywanie panelu biblioteki"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:181
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
msgid "Toggle displaying of the main toolbar"
 | 
			
		||||
msgstr "Przełączy pokazywanie głównego panelu narzędzi"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:605
 | 
			
		||||
#: ../src/ld-window-main.c:665
 | 
			
		||||
msgid "Try again or save it under another name."
 | 
			
		||||
msgstr "Spróbuj ponownie, bądź zapisz pod inną nazwą."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
#: ../src/ld-window-main.c:150
 | 
			
		||||
msgid "Undo the last action"
 | 
			
		||||
msgstr "Cofnie ostatnią akcję"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:525
 | 
			
		||||
#: ../src/ld-window-main.c:591
 | 
			
		||||
msgid "Unsaved Diagram"
 | 
			
		||||
msgstr "Niezapisany Wykres"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:165
 | 
			
		||||
#: ../src/ld-window-main.c:806
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Untitled diagram"
 | 
			
		||||
msgstr "Niezapisany Wykres"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:171
 | 
			
		||||
msgid "Zoom _Out"
 | 
			
		||||
msgstr "_Oddalić widok"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
msgid "Zoom into the diagram"
 | 
			
		||||
msgstr "Przybliżyć widok"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:166
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
msgid "Zoom out of the diagram"
 | 
			
		||||
msgstr "Oddalić widok"
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:42
 | 
			
		||||
msgid "[FILE] - Schematic editor"
 | 
			
		||||
msgstr "[SOUBOR] - Edytor schematów"
 | 
			
		||||
#: ../src/logdiag.c:106
 | 
			
		||||
msgid "[FILE...]"
 | 
			
		||||
msgstr "[PLIK...]"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:173
 | 
			
		||||
#: ../src/ld-window-main.c:179
 | 
			
		||||
msgid "_About"
 | 
			
		||||
msgstr "_O programie"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:154
 | 
			
		||||
#: ../src/ld-window-main.c:160
 | 
			
		||||
msgid "_Delete"
 | 
			
		||||
msgstr "_Usuń"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:142
 | 
			
		||||
#: ../src/ld-window-main.c:148
 | 
			
		||||
msgid "_Edit"
 | 
			
		||||
msgstr "_Edycja"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:120
 | 
			
		||||
#: ../src/ld-window-main.c:126
 | 
			
		||||
msgid "_File"
 | 
			
		||||
msgstr "_Plik"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
#: ../src/ld-window-main.c:178
 | 
			
		||||
msgid "_Help"
 | 
			
		||||
msgstr "_Pomoc"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:183
 | 
			
		||||
msgid "_Library Toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:189
 | 
			
		||||
msgid "_Library Pane"
 | 
			
		||||
msgstr "Panel _biblioteki"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
msgid "_Main Toolbar"
 | 
			
		||||
msgstr "_Główny panel narzędzi"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:121
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
msgid "_New"
 | 
			
		||||
msgstr "_Nowy"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
msgid "_Normal Size"
 | 
			
		||||
msgstr "_Normalna Wielkość"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:124
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
msgid "_Open..."
 | 
			
		||||
msgstr "_Otwórz..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:138
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
msgid "_Quit"
 | 
			
		||||
msgstr "_Zakończ"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:146
 | 
			
		||||
#: ../src/ld-window-main.c:152
 | 
			
		||||
msgid "_Redo"
 | 
			
		||||
msgstr "_Powtórz"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
#: ../src/ld-window-main.c:133
 | 
			
		||||
msgid "_Save"
 | 
			
		||||
msgstr "Z_apisz"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:143
 | 
			
		||||
#: ../src/ld-window-main.c:149
 | 
			
		||||
msgid "_Undo"
 | 
			
		||||
msgstr "_Wróć"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
#: ../src/ld-window-main.c:167
 | 
			
		||||
msgid "_View"
 | 
			
		||||
msgstr "_Widok"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:162
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
msgid "_Zoom In"
 | 
			
		||||
msgstr "_Przybliżyć"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:894
 | 
			
		||||
#: ../src/ld-window-main.c:983
 | 
			
		||||
msgid "translator-credits"
 | 
			
		||||
msgstr "Robert Svoboda <ravath@gmail.com>"
 | 
			
		||||
 | 
			
		||||
#~ msgid "The file is probably corrupted."
 | 
			
		||||
#~ msgstr "Plik jest prawdopodobnie uszkodzony."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										155
									
								
								po/sk.po
									
									
									
									
									
								
							
							
						
						@@ -1,227 +1,254 @@
 | 
			
		||||
# Slovak translation for logdiag.
 | 
			
		||||
# Copyright (C) 2011 Přemysl Janouch
 | 
			
		||||
# Copyright (C) 2011 Přemysl Eric Janouch
 | 
			
		||||
# This file is distributed under the same license as the logdiag package.
 | 
			
		||||
# Miroslav Rigler <itsgoingd@luzer.sk>, 2011.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: logdiag\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2011-03-06 16:14+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-06 16:26+0100\n"
 | 
			
		||||
"Last-Translator: Přemysl Janouch <p.janouch@gmail.com>\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"
 | 
			
		||||
"Last-Translator: Přemysl Eric Janouch <p@janouch.name>\n"
 | 
			
		||||
"Language-Team: Slovak <sk@li.org>\n"
 | 
			
		||||
"Language: \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"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:769
 | 
			
		||||
#: ../src/ld-window-main.c:937
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%d%%"
 | 
			
		||||
msgstr "%d %%"
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:147
 | 
			
		||||
msgid "- Schematic editor"
 | 
			
		||||
msgstr "- Editor schém"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:861
 | 
			
		||||
msgid "Close _without Saving"
 | 
			
		||||
msgstr "Zatvoriť _bez uloženia"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:122
 | 
			
		||||
#: ../src/ld-window-main.c:128
 | 
			
		||||
msgid "Create a new diagram"
 | 
			
		||||
msgstr "Vytvorí nový diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:155
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
msgid "Delete the contents of the selection"
 | 
			
		||||
msgstr "Odstráni obsah výberu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:637
 | 
			
		||||
#: ../src/ld-window-main.c:354
 | 
			
		||||
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."
 | 
			
		||||
 | 
			
		||||
#: ../liblogdiag/ld-category-tree-view.c:138
 | 
			
		||||
msgid "Empty"
 | 
			
		||||
msgstr "Prázdne"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:707
 | 
			
		||||
#, 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
 | 
			
		||||
msgid "Failed to open the file"
 | 
			
		||||
msgstr "Nepodarilo sa otvoriť súbor"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:602
 | 
			
		||||
#: ../src/ld-window-main.c:662
 | 
			
		||||
msgid "Failed to save the diagram"
 | 
			
		||||
msgstr "Nepodarilo sa uložiť diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:767
 | 
			
		||||
#: ../src/ld-window-main.c:859
 | 
			
		||||
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:662
 | 
			
		||||
#: ../src/ld-window-main.c:738
 | 
			
		||||
msgid "Logdiag Diagrams (*.ldd)"
 | 
			
		||||
msgstr "Diagramy logdiag (*.ldd)"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:125
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
msgid "Open a diagram"
 | 
			
		||||
msgstr "Otvorí diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:683
 | 
			
		||||
#: ../src/ld-window-main.c:759
 | 
			
		||||
msgid "Open..."
 | 
			
		||||
msgstr "Otvoriť..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:139
 | 
			
		||||
#: ../src/ld-window-main.c:145
 | 
			
		||||
msgid "Quit the application"
 | 
			
		||||
msgstr "Ukončí aplikáciu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:147
 | 
			
		||||
#: ../src/ld-window-main.c:153
 | 
			
		||||
msgid "Redo the last undone action"
 | 
			
		||||
msgstr "Vykoná naposledy vrátenú akciu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
#: ../src/ld-window-main.c:175
 | 
			
		||||
msgid "Reset zoom level back to the default"
 | 
			
		||||
msgstr "Vráti priblíženie na východiskovú hodnotu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:714
 | 
			
		||||
#: ../src/ld-window-main.c:792
 | 
			
		||||
msgid "Save As..."
 | 
			
		||||
msgstr "Uložiť ako..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
#: ../src/ld-window-main.c:136
 | 
			
		||||
msgid "Save _As..."
 | 
			
		||||
msgstr "Uložiť _ako..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:557
 | 
			
		||||
#: ../src/ld-window-main.c:623
 | 
			
		||||
#, 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?"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:679
 | 
			
		||||
#: ../src/ld-window-main.c:755
 | 
			
		||||
#, c-format
 | 
			
		||||
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:807
 | 
			
		||||
#: ../src/ld-window-main.c:899
 | 
			
		||||
#, 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:128
 | 
			
		||||
#: ../src/ld-window-main.c:134
 | 
			
		||||
msgid "Save the current diagram"
 | 
			
		||||
msgstr "Uloží aktuálny diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:131
 | 
			
		||||
#: ../src/ld-window-main.c:137
 | 
			
		||||
msgid "Save the current diagram with another name"
 | 
			
		||||
msgstr "Uloží aktuálny diagram pod iným menom"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:157
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
msgid "Select _All"
 | 
			
		||||
msgstr "Vybrať _všetko"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:158
 | 
			
		||||
#: ../src/ld-window-main.c:164
 | 
			
		||||
msgid "Select all objects in the diagram"
 | 
			
		||||
msgstr "Vyberie všetky objekty v diagrame"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
#: ../src/ld-window-main.c:192
 | 
			
		||||
msgid "Show _Grid"
 | 
			
		||||
msgstr "Zobraziť _mriežku"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
msgid "Show a dialog about this application"
 | 
			
		||||
msgstr "Zobrazí dialóg o tejto aplikácii"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:640
 | 
			
		||||
msgid "The file is probably corrupted."
 | 
			
		||||
msgstr "Súbor je pravdepodobne poškodený."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
#: ../src/ld-window-main.c:193
 | 
			
		||||
msgid "Toggle displaying of the grid"
 | 
			
		||||
msgstr "Prepne zobrazovanie mriežky"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:184
 | 
			
		||||
msgid "Toggle displaying of the library toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:190
 | 
			
		||||
msgid "Toggle displaying of the library pane"
 | 
			
		||||
msgstr "Prepne zobrazovanie panelu knižnice"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:181
 | 
			
		||||
#: ../src/ld-window-main.c:187
 | 
			
		||||
msgid "Toggle displaying of the main toolbar"
 | 
			
		||||
msgstr "Prepne zobrazovanie hlavného panelu nástrojov"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:605
 | 
			
		||||
#: ../src/ld-window-main.c:665
 | 
			
		||||
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:144
 | 
			
		||||
#: ../src/ld-window-main.c:150
 | 
			
		||||
msgid "Undo the last action"
 | 
			
		||||
msgstr "Vráti poslednú akciu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:525
 | 
			
		||||
#: ../src/ld-window-main.c:591
 | 
			
		||||
msgid "Unsaved Diagram"
 | 
			
		||||
msgstr "Neuložený diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:165
 | 
			
		||||
#: ../src/ld-window-main.c:806
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Untitled diagram"
 | 
			
		||||
msgstr "Neuložený diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:171
 | 
			
		||||
msgid "Zoom _Out"
 | 
			
		||||
msgstr "_Oddialiť"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:163
 | 
			
		||||
#: ../src/ld-window-main.c:169
 | 
			
		||||
msgid "Zoom into the diagram"
 | 
			
		||||
msgstr "Priblíži diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:166
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
msgid "Zoom out of the diagram"
 | 
			
		||||
msgstr "Oddiali diagram"
 | 
			
		||||
 | 
			
		||||
#: ../src/logdiag.c:42
 | 
			
		||||
msgid "[FILE] - Schematic editor"
 | 
			
		||||
msgstr "[SÚBOR] - Editor schém"
 | 
			
		||||
#: ../src/logdiag.c:106
 | 
			
		||||
msgid "[FILE...]"
 | 
			
		||||
msgstr "[SÚBOR...]"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:173
 | 
			
		||||
#: ../src/ld-window-main.c:179
 | 
			
		||||
msgid "_About"
 | 
			
		||||
msgstr "_O programe"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:154
 | 
			
		||||
#: ../src/ld-window-main.c:160
 | 
			
		||||
msgid "_Delete"
 | 
			
		||||
msgstr "_Zmazať"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:142
 | 
			
		||||
#: ../src/ld-window-main.c:148
 | 
			
		||||
msgid "_Edit"
 | 
			
		||||
msgstr "_Úpravy"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:120
 | 
			
		||||
#: ../src/ld-window-main.c:126
 | 
			
		||||
msgid "_File"
 | 
			
		||||
msgstr "_Súbor"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:172
 | 
			
		||||
#: ../src/ld-window-main.c:178
 | 
			
		||||
msgid "_Help"
 | 
			
		||||
msgstr "_Nápoveda"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:183
 | 
			
		||||
msgid "_Library Toolbar"
 | 
			
		||||
#: ../src/ld-window-main.c:189
 | 
			
		||||
msgid "_Library Pane"
 | 
			
		||||
msgstr "Panel _knižnice"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:180
 | 
			
		||||
#: ../src/ld-window-main.c:186
 | 
			
		||||
msgid "_Main Toolbar"
 | 
			
		||||
msgstr "_Hlavný panel nástrojov"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:121
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
msgid "_New"
 | 
			
		||||
msgstr "_Nový"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
#: ../src/ld-window-main.c:174
 | 
			
		||||
msgid "_Normal Size"
 | 
			
		||||
msgstr "_Normálna veľkosť"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:124
 | 
			
		||||
#: ../src/ld-window-main.c:130
 | 
			
		||||
msgid "_Open..."
 | 
			
		||||
msgstr "_Otvoriť..."
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:138
 | 
			
		||||
#: ../src/ld-window-main.c:144
 | 
			
		||||
msgid "_Quit"
 | 
			
		||||
msgstr "U_končiť"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:146
 | 
			
		||||
#: ../src/ld-window-main.c:152
 | 
			
		||||
msgid "_Redo"
 | 
			
		||||
msgstr "Z_novu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:127
 | 
			
		||||
#: ../src/ld-window-main.c:133
 | 
			
		||||
msgid "_Save"
 | 
			
		||||
msgstr "_Uložiť"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:143
 | 
			
		||||
#: ../src/ld-window-main.c:149
 | 
			
		||||
msgid "_Undo"
 | 
			
		||||
msgstr "_Späť"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:161
 | 
			
		||||
#: ../src/ld-window-main.c:167
 | 
			
		||||
msgid "_View"
 | 
			
		||||
msgstr "_Zobrazenie"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:162
 | 
			
		||||
#: ../src/ld-window-main.c:168
 | 
			
		||||
msgid "_Zoom In"
 | 
			
		||||
msgstr "_Priblížiť"
 | 
			
		||||
 | 
			
		||||
#: ../src/ld-window-main.c:894
 | 
			
		||||
#: ../src/ld-window-main.c:983
 | 
			
		||||
msgid "translator-credits"
 | 
			
		||||
msgstr "Miroslav Rigler <itsgoingd@luzer.sk>"
 | 
			
		||||
 | 
			
		||||
#~ msgid "The file is probably corrupted."
 | 
			
		||||
#~ msgstr "Súbor je pravdepodobne poškodený."
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
		</menu>
 | 
			
		||||
		<menu name="ViewMenu" action="ViewMenu">
 | 
			
		||||
			<menuitem action="MainToolbar" />
 | 
			
		||||
			<menuitem action="LibraryToolbar" />
 | 
			
		||||
			<menuitem action="LibraryPane" />
 | 
			
		||||
			<separator />
 | 
			
		||||
			<menuitem action="ShowGrid" />
 | 
			
		||||
			<separator />
 | 
			
		||||
 
 | 
			
		||||
@@ -26,50 +26,50 @@ local terminals = {{-2, 0}, {2, 2}, {2, -2}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-2, 0)
 | 
			
		||||
	cr.line_to (0, 0)
 | 
			
		||||
	cr:move_to (-2, 0)
 | 
			
		||||
	cr:line_to (0, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, 0.5)
 | 
			
		||||
	cr.line_to (2, 2)
 | 
			
		||||
	cr:move_to (0, 0.5)
 | 
			
		||||
	cr:line_to (2, 2)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, -0.5)
 | 
			
		||||
	cr.line_to (2, -2)
 | 
			
		||||
	cr:move_to (0, -0.5)
 | 
			
		||||
	cr:line_to (2, -2)
 | 
			
		||||
 | 
			
		||||
	-- The ohmic connection
 | 
			
		||||
	cr.move_to (0, -1)
 | 
			
		||||
	cr.line_to (0, 1)
 | 
			
		||||
	cr:move_to (0, -1)
 | 
			
		||||
	cr:line_to (0, 1)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_npn = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr.translate (0, 0.5)
 | 
			
		||||
	cr.rotate (math.atan2 (-2, 1.5))
 | 
			
		||||
	cr:save ()
 | 
			
		||||
	cr:translate (0, 0.5)
 | 
			
		||||
	cr:rotate (math.atan2 (-2, 1.5))
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-0.4, 0.8)
 | 
			
		||||
	cr.line_to (0, 1.4)
 | 
			
		||||
	cr.line_to (0.4, 0.8)
 | 
			
		||||
	cr:move_to (-0.4, 0.8)
 | 
			
		||||
	cr:line_to (0, 1.4)
 | 
			
		||||
	cr:line_to (0.4, 0.8)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_pnp = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr.translate (2, -2)
 | 
			
		||||
	cr.rotate (math.atan2 (2, 1.5))
 | 
			
		||||
	cr:save ()
 | 
			
		||||
	cr:translate (2, -2)
 | 
			
		||||
	cr:rotate (math.atan2 (2, 1.5))
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-0.4, 1.3)
 | 
			
		||||
	cr.line_to (0, 1.9)
 | 
			
		||||
	cr.line_to (0.4, 1.3)
 | 
			
		||||
	cr:move_to (-0.4, 1.3)
 | 
			
		||||
	cr:line_to (0, 1.9)
 | 
			
		||||
	cr:line_to (0.4, 1.3)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbols
 | 
			
		||||
 
 | 
			
		||||
@@ -1,53 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   width="128"
 | 
			
		||||
   height="128"
 | 
			
		||||
   id="svg2">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     transform="translate(-3,-1)"
 | 
			
		||||
     id="g3774"
 | 
			
		||||
     style="fill:none;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">
 | 
			
		||||
    <path
 | 
			
		||||
       d="m 20,63 45,0"
 | 
			
		||||
       id="path3764"
 | 
			
		||||
       style="fill:none;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    <path
 | 
			
		||||
       d="m 65,38 0,50"
 | 
			
		||||
       id="path3766"
 | 
			
		||||
       style="fill:none;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    <path
 | 
			
		||||
       d="M 65,53 110,23"
 | 
			
		||||
       id="path3768"
 | 
			
		||||
       style="fill:none;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    <path
 | 
			
		||||
       d="m 65,73 45,30"
 | 
			
		||||
       id="path3770"
 | 
			
		||||
       style="fill:none;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    <path
 | 
			
		||||
       d="M 78,92 93,92 88,77"
 | 
			
		||||
       id="path3772"
 | 
			
		||||
       style="fill:none;stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.7 KiB  | 
@@ -27,59 +27,59 @@ local terminals_p = {{-2, -1}, {2, 1}, {2, 0}, {2, -1}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-0.3, 1)
 | 
			
		||||
	cr.line_to (-0.3, -1)
 | 
			
		||||
	cr:move_to (-0.3, 1)
 | 
			
		||||
	cr:line_to (-0.3, -1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, 1)
 | 
			
		||||
	cr.line_to (2, 1)
 | 
			
		||||
	cr:move_to (0, 1)
 | 
			
		||||
	cr:line_to (2, 1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, 0)
 | 
			
		||||
	cr.line_to (2, 0)
 | 
			
		||||
	cr:move_to (0, 0)
 | 
			
		||||
	cr:line_to (2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, -1)
 | 
			
		||||
	cr.line_to (2, -1)
 | 
			
		||||
	cr:move_to (0, -1)
 | 
			
		||||
	cr:line_to (2, -1)
 | 
			
		||||
 | 
			
		||||
	-- Source, gate, drain
 | 
			
		||||
	cr.move_to (0, -1.5)
 | 
			
		||||
	cr.line_to (0, -0.5)
 | 
			
		||||
	cr:move_to (0, -1.5)
 | 
			
		||||
	cr:line_to (0, -0.5)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, -0.3)
 | 
			
		||||
	cr.line_to (0, 0.3)
 | 
			
		||||
	cr:move_to (0, -0.3)
 | 
			
		||||
	cr:line_to (0, 0.3)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, 0.5)
 | 
			
		||||
	cr.line_to (0, 1.5)
 | 
			
		||||
	cr:move_to (0, 0.5)
 | 
			
		||||
	cr:line_to (0, 1.5)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_n = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The left-side terminal
 | 
			
		||||
	cr.move_to (-2, 1)
 | 
			
		||||
	cr.line_to (-0.3, 1)
 | 
			
		||||
	cr:move_to (-2, 1)
 | 
			
		||||
	cr:line_to (-0.3, 1)
 | 
			
		||||
 | 
			
		||||
	-- The arrow
 | 
			
		||||
	cr.move_to (0.9, -0.4)
 | 
			
		||||
	cr.line_to (0.4, 0)
 | 
			
		||||
	cr.line_to (0.9, 0.4)
 | 
			
		||||
	cr:move_to (0.9, -0.4)
 | 
			
		||||
	cr:line_to (0.4, 0)
 | 
			
		||||
	cr:line_to (0.9, 0.4)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_p = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The left-side terminal
 | 
			
		||||
	cr.move_to (-2, -1)
 | 
			
		||||
	cr.line_to (-0.3, -1)
 | 
			
		||||
	cr:move_to (-2, -1)
 | 
			
		||||
	cr:line_to (-0.3, -1)
 | 
			
		||||
 | 
			
		||||
	-- The arrow
 | 
			
		||||
	cr.move_to (0.4, -0.4)
 | 
			
		||||
	cr.line_to (0.9, 0)
 | 
			
		||||
	cr.line_to (0.4, 0.4)
 | 
			
		||||
	cr:move_to (0.4, -0.4)
 | 
			
		||||
	cr:line_to (0.9, 0)
 | 
			
		||||
	cr:line_to (0.4, 0.4)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbols
 | 
			
		||||
 
 | 
			
		||||
@@ -27,47 +27,47 @@ local terminals_p = {{-2, -1}, {2, 1}, {2, -1}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (0, 1)
 | 
			
		||||
	cr.line_to (2, 1)
 | 
			
		||||
	cr:move_to (0, 1)
 | 
			
		||||
	cr:line_to (2, 1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, -1)
 | 
			
		||||
	cr.line_to (2, -1)
 | 
			
		||||
	cr:move_to (0, -1)
 | 
			
		||||
	cr:line_to (2, -1)
 | 
			
		||||
 | 
			
		||||
	-- The ohmic connection
 | 
			
		||||
	cr.move_to (0, -1.5)
 | 
			
		||||
	cr.line_to (0, 1.5)
 | 
			
		||||
	cr:move_to (0, -1.5)
 | 
			
		||||
	cr:line_to (0, 1.5)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_n = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The left-side terminal
 | 
			
		||||
	cr.move_to (-2, 1)
 | 
			
		||||
	cr.line_to (0, 1)
 | 
			
		||||
	cr:move_to (-2, 1)
 | 
			
		||||
	cr:line_to (0, 1)
 | 
			
		||||
 | 
			
		||||
	-- The arrow
 | 
			
		||||
	cr.move_to (-1, 0.6)
 | 
			
		||||
	cr.line_to (-0.5, 1)
 | 
			
		||||
	cr.line_to (-1, 1.4)
 | 
			
		||||
	cr:move_to (-1, 0.6)
 | 
			
		||||
	cr:line_to (-0.5, 1)
 | 
			
		||||
	cr:line_to (-1, 1.4)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_p = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The left-side terminal
 | 
			
		||||
	cr.move_to (-2, -1)
 | 
			
		||||
	cr.line_to (0, -1)
 | 
			
		||||
	cr:move_to (-2, -1)
 | 
			
		||||
	cr:line_to (0, -1)
 | 
			
		||||
 | 
			
		||||
	-- The arrow
 | 
			
		||||
	cr.move_to (-0.4, -0.6)
 | 
			
		||||
	cr.line_to (-1, -1)
 | 
			
		||||
	cr.line_to (-0.4, -1.4)
 | 
			
		||||
	cr:move_to (-0.4, -0.6)
 | 
			
		||||
	cr:line_to (-1, -1)
 | 
			
		||||
	cr:line_to (-0.4, -1.4)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbols
 | 
			
		||||
 
 | 
			
		||||
@@ -17,23 +17,23 @@ local terminals = {{-4, -1}, {-4, 1}, {5, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The main shape
 | 
			
		||||
	cr.move_to (-2, -2)
 | 
			
		||||
	cr.line_to (1, -2)
 | 
			
		||||
	cr.arc (1, 0, 2, math.pi * 1.5, math.pi * 0.5)
 | 
			
		||||
	cr.line_to (-2, 2)
 | 
			
		||||
	cr.close_path ()
 | 
			
		||||
	cr:move_to (-2, -2)
 | 
			
		||||
	cr:line_to (1, -2)
 | 
			
		||||
	cr:arc (1, 0, 2, math.pi * 1.5, math.pi * 0.5)
 | 
			
		||||
	cr:line_to (-2, 2)
 | 
			
		||||
	cr:close_path ()
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-4, -1)
 | 
			
		||||
	cr.line_to (-2, -1)
 | 
			
		||||
	cr:move_to (-4, -1)
 | 
			
		||||
	cr:line_to (-2, -1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-4, 1)
 | 
			
		||||
	cr.line_to (-2, 1)
 | 
			
		||||
	cr:move_to (-4, 1)
 | 
			
		||||
	cr:line_to (-2, 1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (3, 0)
 | 
			
		||||
	cr.line_to (5, 0)
 | 
			
		||||
	cr:move_to (3, 0)
 | 
			
		||||
	cr:line_to (5, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   width="128"
 | 
			
		||||
   height="128"
 | 
			
		||||
   id="svg2">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     transform="translate(0,-924.36218)"
 | 
			
		||||
     id="layer1">
 | 
			
		||||
    <g
 | 
			
		||||
       transform="translate(-10,-60)"
 | 
			
		||||
       id="g3016">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 25,1030.3622 20,0"
 | 
			
		||||
         id="path3008"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 25,1014.3622 20,0"
 | 
			
		||||
         id="path3010"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 45,118 0,-40 25,0 c 0,0 20,0 20,20 0,20 -20,20 -20,20 z"
 | 
			
		||||
         transform="translate(0,924.36218)"
 | 
			
		||||
         id="path3012"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 90,98 20,0"
 | 
			
		||||
         transform="translate(0,924.36218)"
 | 
			
		||||
         id="path3014"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       transform="translate(5,-5)"
 | 
			
		||||
       id="g3016-8">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 25,1022.3622 20,0"
 | 
			
		||||
         id="path3010-0"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="M 45,118 45,78 75,98 z"
 | 
			
		||||
         transform="translate(0,924.36218)"
 | 
			
		||||
         id="path3012-9"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 87.5,1022.3622 17.5,0"
 | 
			
		||||
         id="path3014-6"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 100,93 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z"
 | 
			
		||||
         transform="matrix(0.5,0,0,0.5,37,975.86218)"
 | 
			
		||||
         id="path3820"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 2.9 KiB  | 
@@ -17,23 +17,23 @@ local terminals = {{-4, 0}, {4, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The triangle
 | 
			
		||||
	cr.move_to (-2, -2)
 | 
			
		||||
	cr.line_to (2, 0)
 | 
			
		||||
	cr.line_to (-2, 2)
 | 
			
		||||
	cr.close_path ()
 | 
			
		||||
	cr:move_to (-2, -2)
 | 
			
		||||
	cr:line_to (2, 0)
 | 
			
		||||
	cr:line_to (-2, 2)
 | 
			
		||||
	cr:close_path ()
 | 
			
		||||
 | 
			
		||||
	-- The circle
 | 
			
		||||
	cr.new_sub_path ()
 | 
			
		||||
	cr.arc (2.25, 0, 0.25, 0, 2 * math.pi)
 | 
			
		||||
	cr:new_sub_path ()
 | 
			
		||||
	cr:arc (2.25, 0, 0.25, 0, 2 * math.pi)
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-4, 0)
 | 
			
		||||
	cr.line_to (-2, 0)
 | 
			
		||||
	cr:move_to (-4, 0)
 | 
			
		||||
	cr:line_to (-2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (2.5, 0)
 | 
			
		||||
	cr.line_to (4, 0)
 | 
			
		||||
	cr:move_to (2.5, 0)
 | 
			
		||||
	cr:line_to (4, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -17,38 +17,38 @@ local terminals = {{-4, -1}, {-4, 1}, {5, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The main shape
 | 
			
		||||
	cr.move_to (-2, -2)
 | 
			
		||||
	cr.line_to (0, -2)
 | 
			
		||||
	cr.curve_to (2, -2, 3, 0, 3, 0)
 | 
			
		||||
	cr.curve_to (3, 0, 2, 2, 0, 2)
 | 
			
		||||
	cr.line_to (-2, 2)
 | 
			
		||||
	cr.curve_to (-1, 1, -1, -1, -2, -2)
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:move_to (-2, -2)
 | 
			
		||||
	cr:line_to (0, -2)
 | 
			
		||||
	cr:curve_to (2, -2, 3, 0, 3, 0)
 | 
			
		||||
	cr:curve_to (3, 0, 2, 2, 0, 2)
 | 
			
		||||
	cr:line_to (-2, 2)
 | 
			
		||||
	cr:curve_to (-1, 1, -1, -1, -2, -2)
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr:save ()
 | 
			
		||||
 | 
			
		||||
	-- Crop the contacts according to
 | 
			
		||||
	-- the left side of the main shape
 | 
			
		||||
	cr.move_to (-4, 2)
 | 
			
		||||
	cr.line_to (-2, 2)
 | 
			
		||||
	cr.curve_to (-1, 1, -1, -1, -2, -2)
 | 
			
		||||
	cr.line_to (-4, -2)
 | 
			
		||||
	cr.close_path ()
 | 
			
		||||
	cr.clip ()
 | 
			
		||||
	cr:move_to (-4, 2)
 | 
			
		||||
	cr:line_to (-2, 2)
 | 
			
		||||
	cr:curve_to (-1, 1, -1, -1, -2, -2)
 | 
			
		||||
	cr:line_to (-4, -2)
 | 
			
		||||
	cr:close_path ()
 | 
			
		||||
	cr:clip ()
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-4, -1)
 | 
			
		||||
	cr.line_to (-1, -1)
 | 
			
		||||
	cr:move_to (-4, -1)
 | 
			
		||||
	cr:line_to (-1, -1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-4, 1)
 | 
			
		||||
	cr.line_to (-1, 1)
 | 
			
		||||
	cr:move_to (-4, 1)
 | 
			
		||||
	cr:line_to (-1, 1)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
 | 
			
		||||
	cr.move_to (3, 0)
 | 
			
		||||
	cr.line_to (5, 0)
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:move_to (3, 0)
 | 
			
		||||
	cr:line_to (5, 0)
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -17,20 +17,20 @@ local terminals = {{-1, 0}, {1, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The vertical lines
 | 
			
		||||
	cr.move_to (-0.2, -1)
 | 
			
		||||
	cr.line_to (-0.2, 1)
 | 
			
		||||
	cr:move_to (-0.2, -1)
 | 
			
		||||
	cr:line_to (-0.2, 1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0.2, -2)
 | 
			
		||||
	cr.line_to (0.2, 2)
 | 
			
		||||
	cr:move_to (0.2, -2)
 | 
			
		||||
	cr:line_to (0.2, 2)
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-1, 0)
 | 
			
		||||
	cr.line_to (-0.2, 0)
 | 
			
		||||
	cr:move_to (-1, 0)
 | 
			
		||||
	cr:line_to (-0.2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0.2, 0)
 | 
			
		||||
	cr.line_to (1, 0)
 | 
			
		||||
	cr:move_to (0.2, 0)
 | 
			
		||||
	cr:line_to (1, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -17,20 +17,20 @@ local terminals = {{0, -1}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The vertical line
 | 
			
		||||
	cr.move_to (0, -1)
 | 
			
		||||
	cr.line_to (0, 0.5)
 | 
			
		||||
	cr:move_to (0, -1)
 | 
			
		||||
	cr:line_to (0, 0.5)
 | 
			
		||||
 | 
			
		||||
	-- The horizontal lines
 | 
			
		||||
	cr.move_to (-1, 0.5)
 | 
			
		||||
	cr.line_to (1, 0.5)
 | 
			
		||||
	cr:move_to (-1, 0.5)
 | 
			
		||||
	cr:line_to (1, 0.5)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-0.75, 1.1)
 | 
			
		||||
	cr.line_to (0.75, 1.1)
 | 
			
		||||
	cr:move_to (-0.75, 1.1)
 | 
			
		||||
	cr:line_to (0.75, 1.1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-0.5, 1.7)
 | 
			
		||||
	cr.line_to (0.5, 1.7)
 | 
			
		||||
	cr:move_to (-0.5, 1.7)
 | 
			
		||||
	cr:line_to (0.5, 1.7)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -1,78 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   width="128"
 | 
			
		||||
   height="128"
 | 
			
		||||
   id="svg2">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     id="g3837">
 | 
			
		||||
    <g
 | 
			
		||||
       transform="translate(120,-10)"
 | 
			
		||||
       id="g3771"
 | 
			
		||||
       style="fill:none">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 140,48 a 25,25 0 1 1 -50,0 25,25 0 1 1 50,0 z"
 | 
			
		||||
         transform="translate(-180,0)"
 | 
			
		||||
         id="path2991"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m -90,48 -15,0"
 | 
			
		||||
         id="path3761"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m -40,48 15,0"
 | 
			
		||||
         id="path3763"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m -80,33 30,30"
 | 
			
		||||
         id="path3767"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="M -50,33 -80,63"
 | 
			
		||||
         id="path3769"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       transform="translate(0,5)"
 | 
			
		||||
       id="g3786"
 | 
			
		||||
       style="fill:none">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 90,57 0,20"
 | 
			
		||||
         id="path3778"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 65,77 50,0"
 | 
			
		||||
         id="path3780"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 70,93 40,0"
 | 
			
		||||
         id="path3782"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 75,109 30,0"
 | 
			
		||||
         id="path3784"
 | 
			
		||||
         style="stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 2.8 KiB  | 
@@ -17,8 +17,8 @@ local terminals = {}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The disk
 | 
			
		||||
	cr.arc (0, 0, 0.3, 0, math.pi * 2)
 | 
			
		||||
	cr.fill ()
 | 
			
		||||
	cr:arc (0, 0, 0.3, 0, math.pi * 2)
 | 
			
		||||
	cr:fill ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -17,29 +17,29 @@ local terminals = {{-2, 0}, {2, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The circle
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr:save ()
 | 
			
		||||
 | 
			
		||||
	cr.arc (0, 0, 1, 0, 2 * math.pi)
 | 
			
		||||
	cr.stroke_preserve ()
 | 
			
		||||
	cr.clip ()
 | 
			
		||||
	cr:arc (0, 0, 1, 0, 2 * math.pi)
 | 
			
		||||
	cr:stroke_preserve ()
 | 
			
		||||
	cr:clip ()
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-1, -1)
 | 
			
		||||
	cr.line_to (1, 1)
 | 
			
		||||
	cr:move_to (-1, -1)
 | 
			
		||||
	cr:line_to (1, 1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (1, -1)
 | 
			
		||||
	cr.line_to (-1, 1)
 | 
			
		||||
	cr:move_to (1, -1)
 | 
			
		||||
	cr:line_to (-1, 1)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-2, 0)
 | 
			
		||||
	cr.line_to (-1, 0)
 | 
			
		||||
	cr:move_to (-2, 0)
 | 
			
		||||
	cr:line_to (-1, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (1, 0)
 | 
			
		||||
	cr.line_to (2, 0)
 | 
			
		||||
	cr:move_to (1, 0)
 | 
			
		||||
	cr:line_to (2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -35,45 +35,45 @@ local terminals = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render_A = function (cr)
 | 
			
		||||
	-- The circle
 | 
			
		||||
	cr.arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
	cr:arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
 | 
			
		||||
	-- The letter A
 | 
			
		||||
	cr.move_to (-0.4, 0.5)
 | 
			
		||||
	cr.line_to (0, -0.5)
 | 
			
		||||
	cr.line_to (0.4, 0.5)
 | 
			
		||||
	cr:move_to (-0.4, 0.5)
 | 
			
		||||
	cr:line_to (0, -0.5)
 | 
			
		||||
	cr:line_to (0.4, 0.5)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-0.3, 0.25)
 | 
			
		||||
	cr.line_to (0.3, 0.25)
 | 
			
		||||
	cr:move_to (-0.3, 0.25)
 | 
			
		||||
	cr:line_to (0.3, 0.25)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_V = function (cr)
 | 
			
		||||
	-- The circle
 | 
			
		||||
	cr.arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
	cr:arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
 | 
			
		||||
	-- The letter V
 | 
			
		||||
	cr.move_to (-0.4, -0.5)
 | 
			
		||||
	cr.line_to (0, 0.5)
 | 
			
		||||
	cr.line_to (0.4, -0.5)
 | 
			
		||||
	cr:move_to (-0.4, -0.5)
 | 
			
		||||
	cr:line_to (0, 0.5)
 | 
			
		||||
	cr:line_to (0.4, -0.5)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_ohm = function (cr)
 | 
			
		||||
	-- The circle
 | 
			
		||||
	cr.arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
	cr:arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
 | 
			
		||||
	-- The capital letter omega
 | 
			
		||||
	cr.move_to (-0.5, 0.5)
 | 
			
		||||
	cr.line_to (-0.15, 0.5)
 | 
			
		||||
	cr.curve_to (-0.15, 0.5, -0.4, 0.3, -0.4, 0)
 | 
			
		||||
	cr.curve_to (-0.4, -0.25, -0.25, -0.5, 0, -0.5)
 | 
			
		||||
	cr.curve_to (0.25, -0.5, 0.4, -0.25, 0.4, 0)
 | 
			
		||||
	cr.curve_to (0.4, 0.3, 0.15, 0.5, 0.15, 0.5)
 | 
			
		||||
	cr.line_to (0.5, 0.5)
 | 
			
		||||
	cr:move_to (-0.5, 0.5)
 | 
			
		||||
	cr:line_to (-0.15, 0.5)
 | 
			
		||||
	cr:curve_to (-0.15, 0.5, -0.4, 0.3, -0.4, 0)
 | 
			
		||||
	cr:curve_to (-0.4, -0.25, -0.25, -0.5, 0, -0.5)
 | 
			
		||||
	cr:curve_to (0.25, -0.5, 0.4, -0.25, 0.4, 0)
 | 
			
		||||
	cr:curve_to (0.4, 0.3, 0.15, 0.5, 0.15, 0.5)
 | 
			
		||||
	cr:line_to (0.5, 0.5)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbols
 | 
			
		||||
 
 | 
			
		||||
@@ -26,21 +26,21 @@ local terminals = {}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render_plus = function (cr)
 | 
			
		||||
	-- The plus sign
 | 
			
		||||
	cr.move_to (0, -0.4)
 | 
			
		||||
	cr.line_to (0, 0.4)
 | 
			
		||||
	cr:move_to (0, -0.4)
 | 
			
		||||
	cr:line_to (0, 0.4)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-0.4, 0)
 | 
			
		||||
	cr.line_to (0.4, 0)
 | 
			
		||||
	cr:move_to (-0.4, 0)
 | 
			
		||||
	cr:line_to (0.4, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_minus = function (cr)
 | 
			
		||||
	-- The minus sign
 | 
			
		||||
	cr.move_to (-0.4, 0)
 | 
			
		||||
	cr.line_to (0.4, 0)
 | 
			
		||||
	cr:move_to (-0.4, 0)
 | 
			
		||||
	cr:line_to (0.4, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbols
 | 
			
		||||
 
 | 
			
		||||
@@ -17,17 +17,17 @@ local terminals = {{-2, 0}, {2, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The switch contact
 | 
			
		||||
	cr.move_to (1.3, -1.3)
 | 
			
		||||
	cr.line_to (-1, 0)
 | 
			
		||||
	cr:move_to (1.3, -1.3)
 | 
			
		||||
	cr:line_to (-1, 0)
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-2, 0)
 | 
			
		||||
	cr.line_to (-1, 0)
 | 
			
		||||
	cr:move_to (-2, 0)
 | 
			
		||||
	cr:line_to (-1, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (1, 0)
 | 
			
		||||
	cr.line_to (2, 0)
 | 
			
		||||
	cr:move_to (1, 0)
 | 
			
		||||
	cr:line_to (2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -17,13 +17,13 @@ local terminals = {{-1, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The circle
 | 
			
		||||
	cr.arc (0, 0, 0.3, 0, math.pi * 2)
 | 
			
		||||
	cr:arc (0, 0, 0.3, 0, math.pi * 2)
 | 
			
		||||
 | 
			
		||||
	-- The contact
 | 
			
		||||
	cr.move_to (-1, 0)
 | 
			
		||||
	cr.line_to (-0.3, 0)
 | 
			
		||||
	cr:move_to (-1, 0)
 | 
			
		||||
	cr:line_to (-0.3, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -26,35 +26,35 @@ local terminals = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The circle
 | 
			
		||||
	cr.arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
	cr:arc (0, 0, 2, 0, math.pi * 2)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_ac = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The AC symbol
 | 
			
		||||
	cr.move_to (-1, 0.25)
 | 
			
		||||
	cr.curve_to (-0.4, -1.5, 0.4, 1.5, 1, -0.25)
 | 
			
		||||
	cr:move_to (-1, 0.25)
 | 
			
		||||
	cr:curve_to (-0.4, -1.5, 0.4, 1.5, 1, -0.25)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_dc = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The DC symbol
 | 
			
		||||
	cr.move_to (-1, -0.25)
 | 
			
		||||
	cr.line_to (1, -0.25)
 | 
			
		||||
	cr:move_to (-1, -0.25)
 | 
			
		||||
	cr:line_to (1, -0.25)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-1, 0.25)
 | 
			
		||||
	cr.line_to (-0.2, 0.25)
 | 
			
		||||
	cr:move_to (-1, 0.25)
 | 
			
		||||
	cr:line_to (-0.2, 0.25)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0.2, 0.25)
 | 
			
		||||
	cr.line_to (1, 0.25)
 | 
			
		||||
	cr:move_to (0.2, 0.25)
 | 
			
		||||
	cr:line_to (1, 0.25)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbols
 | 
			
		||||
 
 | 
			
		||||
@@ -17,20 +17,20 @@ local terminals = {{-2, 0}, {2, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The vertical lines
 | 
			
		||||
	cr.move_to (-0.2, -1)
 | 
			
		||||
	cr.line_to (-0.2, 1)
 | 
			
		||||
	cr:move_to (-0.2, -1)
 | 
			
		||||
	cr:line_to (-0.2, 1)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0.2, -1)
 | 
			
		||||
	cr.line_to (0.2, 1)
 | 
			
		||||
	cr:move_to (0.2, -1)
 | 
			
		||||
	cr:line_to (0.2, 1)
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-2, 0)
 | 
			
		||||
	cr.line_to (-0.2, 0)
 | 
			
		||||
	cr:move_to (-2, 0)
 | 
			
		||||
	cr:line_to (-0.2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0.2, 0)
 | 
			
		||||
	cr.line_to (2, 0)
 | 
			
		||||
	cr:move_to (0.2, 0)
 | 
			
		||||
	cr:line_to (2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -45,79 +45,79 @@ local terminals = {{-2, 0}, {2, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The triangle
 | 
			
		||||
	cr.move_to (-1, -1)
 | 
			
		||||
	cr.line_to (1, 0)
 | 
			
		||||
	cr.line_to (-1, 1)
 | 
			
		||||
	cr.line_to (-1, -1)
 | 
			
		||||
	cr:move_to (-1, -1)
 | 
			
		||||
	cr:line_to (1, 0)
 | 
			
		||||
	cr:line_to (-1, 1)
 | 
			
		||||
	cr:line_to (-1, -1)
 | 
			
		||||
 | 
			
		||||
	-- The vertical line
 | 
			
		||||
	cr.move_to (1, 1)
 | 
			
		||||
	cr.line_to (1, -1)
 | 
			
		||||
	cr:move_to (1, 1)
 | 
			
		||||
	cr:line_to (1, -1)
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-2, 0)
 | 
			
		||||
	cr.line_to (2, 0)
 | 
			
		||||
	cr:move_to (-2, 0)
 | 
			
		||||
	cr:line_to (2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_zener = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (1, 1)
 | 
			
		||||
	cr.line_to (0.5, 1)
 | 
			
		||||
	cr:move_to (1, 1)
 | 
			
		||||
	cr:line_to (0.5, 1)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_arrow = function (cr)
 | 
			
		||||
	cr.move_to (0, 0)
 | 
			
		||||
	cr.line_to (0, -1.5)
 | 
			
		||||
	cr:move_to (0, 0)
 | 
			
		||||
	cr:line_to (0, -1.5)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
 | 
			
		||||
	cr.move_to (-0.3, -0.7)
 | 
			
		||||
	cr.line_to (0, -1.5)
 | 
			
		||||
	cr.line_to (0.3, -0.7)
 | 
			
		||||
	cr.close_path ()
 | 
			
		||||
	cr:move_to (-0.3, -0.7)
 | 
			
		||||
	cr:line_to (0, -1.5)
 | 
			
		||||
	cr:line_to (0.3, -0.7)
 | 
			
		||||
	cr:close_path ()
 | 
			
		||||
 | 
			
		||||
	cr.fill ()
 | 
			
		||||
	cr:fill ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_radiation = function (cr)
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr.translate (-0.4, 0)
 | 
			
		||||
	cr:save ()
 | 
			
		||||
	cr:translate (-0.4, 0)
 | 
			
		||||
	render_arrow (cr)
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr.translate (0.4, 0)
 | 
			
		||||
	cr:save ()
 | 
			
		||||
	cr:translate (0.4, 0)
 | 
			
		||||
	render_arrow (cr)
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_led = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr.translate (-0.3, -1.0)
 | 
			
		||||
	cr.rotate (math.atan2 (1, 1))
 | 
			
		||||
	cr:save ()
 | 
			
		||||
	cr:translate (-0.3, -1.0)
 | 
			
		||||
	cr:rotate (math.atan2 (1, 1))
 | 
			
		||||
 | 
			
		||||
	render_radiation (cr)
 | 
			
		||||
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_photo = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr.translate (0.75, -2.05)
 | 
			
		||||
	cr.rotate (math.atan2 (-1, -1))
 | 
			
		||||
	cr:save ()
 | 
			
		||||
	cr:translate (0.75, -2.05)
 | 
			
		||||
	cr:rotate (math.atan2 (-1, -1))
 | 
			
		||||
 | 
			
		||||
	render_radiation (cr)
 | 
			
		||||
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -1,56 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   width="128"
 | 
			
		||||
   height="128"
 | 
			
		||||
   id="svg2">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     transform="translate(0,-924.36218)"
 | 
			
		||||
     id="layer1">
 | 
			
		||||
    <g
 | 
			
		||||
       transform="translate(0,9.75)"
 | 
			
		||||
       id="g3784">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 15,960.11218 25,0 0,0"
 | 
			
		||||
         id="path2985"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 42,935.11218 0,50"
 | 
			
		||||
         id="path2987"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 85,960.11218 -25,0 0,0"
 | 
			
		||||
         id="path2985-2"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 58,935.11216 0,50.00002"
 | 
			
		||||
         id="path2987-7"
 | 
			
		||||
         style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <path
 | 
			
		||||
       d="m 29,1031.3622 15,0 c 0,0 0,-13 10,-13 10,0 10,15 10,15 0,0 0,-15 10,-15 10,0 10,15 10,15 0,0 0,-15 10,-15 10,0 10,13 10,13 l 15,0"
 | 
			
		||||
       id="path3782"
 | 
			
		||||
       style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 2.1 KiB  | 
@@ -26,22 +26,22 @@ local terminals = {{-2, 0}, {2, 0}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The arcs
 | 
			
		||||
	cr.arc (-1.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
	cr.arc (-0.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
	cr.arc (0.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
	cr.arc (1.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
	cr:arc (-1.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
	cr:arc (-0.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
	cr:arc (0.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
	cr:arc (1.5, 0, 0.5, math.pi, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_core = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The core
 | 
			
		||||
	cr.move_to (-2, -1)
 | 
			
		||||
	cr.line_to (2, -1)
 | 
			
		||||
	cr:move_to (-2, -1)
 | 
			
		||||
	cr:line_to (2, -1)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbols
 | 
			
		||||
 
 | 
			
		||||
@@ -38,63 +38,63 @@ local terminals_pot = {{-2, 0}, {2, 0}, {2, -2}}
 | 
			
		||||
-- Rendering
 | 
			
		||||
local render = function (cr)
 | 
			
		||||
	-- The rectangle
 | 
			
		||||
	cr.move_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.line_to (-1.5, -0.5)
 | 
			
		||||
	cr:move_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:line_to (-1.5, -0.5)
 | 
			
		||||
 | 
			
		||||
	-- The terminals
 | 
			
		||||
	cr.move_to (-2, 0)
 | 
			
		||||
	cr.line_to (-1.5, 0)
 | 
			
		||||
	cr:move_to (-2, 0)
 | 
			
		||||
	cr:line_to (-1.5, 0)
 | 
			
		||||
 | 
			
		||||
	cr.move_to (1.5, 0)
 | 
			
		||||
	cr.line_to (2, 0)
 | 
			
		||||
	cr:move_to (1.5, 0)
 | 
			
		||||
	cr:line_to (2, 0)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_adj = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The arrow
 | 
			
		||||
	cr.move_to (-1, 1)
 | 
			
		||||
	cr.line_to (1, -1)
 | 
			
		||||
	cr:move_to (-1, 1)
 | 
			
		||||
	cr:line_to (1, -1)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
 | 
			
		||||
	cr.save ()
 | 
			
		||||
	cr.translate (1.5, -1.5)
 | 
			
		||||
	cr.rotate (math.atan2 (1, 1))
 | 
			
		||||
	cr:save ()
 | 
			
		||||
	cr:translate (1.5, -1.5)
 | 
			
		||||
	cr:rotate (math.atan2 (1, 1))
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, 0)
 | 
			
		||||
	cr.line_to (0.3, 0.8)
 | 
			
		||||
	cr.line_to (-0.3, 0.8)
 | 
			
		||||
	cr.close_path ()
 | 
			
		||||
	cr:move_to (0, 0)
 | 
			
		||||
	cr:line_to (0.3, 0.8)
 | 
			
		||||
	cr:line_to (-0.3, 0.8)
 | 
			
		||||
	cr:close_path ()
 | 
			
		||||
 | 
			
		||||
	cr.fill ()
 | 
			
		||||
	cr.restore ()
 | 
			
		||||
	cr:fill ()
 | 
			
		||||
	cr:restore ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local render_pot = function (cr)
 | 
			
		||||
	render (cr)
 | 
			
		||||
 | 
			
		||||
	-- The contact
 | 
			
		||||
	cr.move_to (0, -2)
 | 
			
		||||
	cr.line_to (2, -2)
 | 
			
		||||
	cr:move_to (0, -2)
 | 
			
		||||
	cr:line_to (2, -2)
 | 
			
		||||
 | 
			
		||||
	-- The arrow
 | 
			
		||||
	cr.move_to (0, -2)
 | 
			
		||||
	cr.line_to (0, -1)
 | 
			
		||||
	cr:move_to (0, -2)
 | 
			
		||||
	cr:line_to (0, -1)
 | 
			
		||||
 | 
			
		||||
	cr.stroke ()
 | 
			
		||||
	cr:stroke ()
 | 
			
		||||
 | 
			
		||||
	cr.move_to (0, -0.5)
 | 
			
		||||
	cr.line_to (0.3, -1.3)
 | 
			
		||||
	cr.line_to (-0.3, -1.3)
 | 
			
		||||
	cr.close_path ()
 | 
			
		||||
	cr:move_to (0, -0.5)
 | 
			
		||||
	cr:line_to (0.3, -1.3)
 | 
			
		||||
	cr:line_to (-0.3, -1.3)
 | 
			
		||||
	cr:close_path ()
 | 
			
		||||
 | 
			
		||||
	cr.fill ()
 | 
			
		||||
	cr:fill ()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Register the symbol
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ GenericName[sk]=Editor schém
 | 
			
		||||
GenericName[pl]=Edytor schematów
 | 
			
		||||
GenericName[de]=Schema Editor
 | 
			
		||||
Icon=logdiag
 | 
			
		||||
Exec=logdiag %f
 | 
			
		||||
Exec=logdiag %F
 | 
			
		||||
StartupNotify=true
 | 
			
		||||
MimeType=application/x-logdiag-diagram;
 | 
			
		||||
Categories=Graphics;VectorGraphics;Electricity;Engineering;GTK;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								share/org.logdiag.gschema.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
			
		||||
<schemalist>
 | 
			
		||||
	<schema id="org.logdiag" path="/org/logdiag/" gettext-domain="logdiag">
 | 
			
		||||
		<key name="show-main-toolbar" type="b">
 | 
			
		||||
			<default>true</default>
 | 
			
		||||
			<summary>Whether to show the main toolbar</summary>
 | 
			
		||||
		</key>
 | 
			
		||||
		<key name="show-library-pane" type="b">
 | 
			
		||||
			<default>true</default>
 | 
			
		||||
			<summary>Whether to show the library pane</summary>
 | 
			
		||||
		</key>
 | 
			
		||||
		<key name="show-grid" type="b">
 | 
			
		||||
			<default>true</default>
 | 
			
		||||
			<summary>Whether to show the grid</summary>
 | 
			
		||||
		</key>
 | 
			
		||||
	</schema>
 | 
			
		||||
</schemalist>
 | 
			
		||||
 | 
			
		||||
@@ -2,14 +2,12 @@
 | 
			
		||||
 * ld-window-main.c
 | 
			
		||||
 *
 | 
			
		||||
 * This file is a part of logdiag.
 | 
			
		||||
 * Copyright Přemysl Janouch 2010 - 2011. All rights reserved.
 | 
			
		||||
 * Copyright 2010 - 2021 Přemysl Eric Janouch
 | 
			
		||||
 *
 | 
			
		||||
 * See the file LICENSE for licensing information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
 | 
			
		||||
#include <liblogdiag/liblogdiag.h>
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
@@ -18,14 +16,18 @@
 | 
			
		||||
 | 
			
		||||
struct _LdWindowMainPrivate
 | 
			
		||||
{
 | 
			
		||||
	GSettings *settings;
 | 
			
		||||
	GtkUIManager *ui_manager;
 | 
			
		||||
	GtkActionGroup *action_group;
 | 
			
		||||
 | 
			
		||||
	GtkWidget *vbox;
 | 
			
		||||
	GtkWidget *hbox;
 | 
			
		||||
	GtkWidget *paned;
 | 
			
		||||
	GtkWidget *menu;
 | 
			
		||||
	GtkWidget *toolbar;
 | 
			
		||||
	GtkWidget *library_toolbar;
 | 
			
		||||
 | 
			
		||||
	GtkWidget *library_view;
 | 
			
		||||
	GtkWidget *lv_window;
 | 
			
		||||
	GtkWidget *lv_viewport;
 | 
			
		||||
 | 
			
		||||
	LdLibrary *library;
 | 
			
		||||
 | 
			
		||||
@@ -36,14 +38,19 @@ struct _LdWindowMainPrivate
 | 
			
		||||
	LdDiagramView *view;
 | 
			
		||||
 | 
			
		||||
	GtkWidget *statusbar;
 | 
			
		||||
	GtkWidget *zoom_label;
 | 
			
		||||
	guint statusbar_symbol_context_id;
 | 
			
		||||
	guint statusbar_menu_context_id;
 | 
			
		||||
	guint statusbar_hint_context_id;
 | 
			
		||||
 | 
			
		||||
	guint statusbar_hint_drag;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ===== Local functions =================================================== */
 | 
			
		||||
 | 
			
		||||
static void ld_window_main_finalize (GObject *gobject);
 | 
			
		||||
static void load_library_directories (LdLibrary *library);
 | 
			
		||||
 | 
			
		||||
static void on_ui_proxy_connected (GtkUIManager *ui, GtkAction *action,
 | 
			
		||||
	GtkWidget *proxy, LdWindowMain *window);
 | 
			
		||||
@@ -51,7 +58,7 @@ static void on_ui_proxy_disconnected (GtkUIManager *ui, GtkAction *action,
 | 
			
		||||
	GtkWidget *proxy, LdWindowMain *window);
 | 
			
		||||
 | 
			
		||||
static void on_menu_item_selected (GtkWidget *item, LdWindowMain *window);
 | 
			
		||||
static void on_menu_item_deselected (GtkItem *item, LdWindowMain *window);
 | 
			
		||||
static void on_menu_item_deselected (GtkMenuItem *item, LdWindowMain *window);
 | 
			
		||||
 | 
			
		||||
static gboolean on_delete (LdWindowMain *self, GdkEvent *event,
 | 
			
		||||
	gpointer user_data);
 | 
			
		||||
@@ -72,7 +79,8 @@ static gchar *diagram_get_name (LdWindowMain *self);
 | 
			
		||||
static void diagram_set_filename (LdWindowMain *self, gchar *filename);
 | 
			
		||||
static void diagram_new (LdWindowMain *self);
 | 
			
		||||
static gboolean diagram_open (LdWindowMain *self, const gchar *filename);
 | 
			
		||||
static void diagram_save (LdWindowMain *self);
 | 
			
		||||
static gboolean diagram_save (LdWindowMain *self, GtkWindow *dialog_parent,
 | 
			
		||||
	const gchar *filename);
 | 
			
		||||
 | 
			
		||||
static GtkFileFilter *diagram_get_file_filter (void);
 | 
			
		||||
static void diagram_show_open_dialog (LdWindowMain *self);
 | 
			
		||||
@@ -82,12 +90,10 @@ static gboolean may_close_diagram (LdWindowMain *self,
 | 
			
		||||
	const gchar *dialog_message);
 | 
			
		||||
static gboolean may_quit (LdWindowMain *self);
 | 
			
		||||
 | 
			
		||||
static void on_symbol_selected (LdLibraryToolbar *toolbar, LdSymbol *symbol,
 | 
			
		||||
	const gchar *klass, LdWindowMain *self);
 | 
			
		||||
static void on_symbol_deselected (LdLibraryToolbar *toolbar, LdSymbol *symbol,
 | 
			
		||||
	const gchar *klass, LdWindowMain *self);
 | 
			
		||||
static void on_symbol_chosen (LdLibraryToolbar *toolbar, LdSymbol *symbol,
 | 
			
		||||
	const gchar *klass, LdWindowMain *self);
 | 
			
		||||
static void on_symbol_selected (LdCategoryView *view,
 | 
			
		||||
	LdSymbol *symbol, const gchar *path, LdWindowMain *self);
 | 
			
		||||
static void on_symbol_deselected (LdCategoryView *view,
 | 
			
		||||
	LdSymbol *symbol, const gchar *path, LdWindowMain *self);
 | 
			
		||||
 | 
			
		||||
static void on_action_new (GtkAction *action, LdWindowMain *self);
 | 
			
		||||
static void on_action_open (GtkAction *action, LdWindowMain *self);
 | 
			
		||||
@@ -103,7 +109,7 @@ static void on_action_select_all (GtkAction *action, LdWindowMain *self);
 | 
			
		||||
 | 
			
		||||
static void on_action_main_toolbar (GtkToggleAction *action,
 | 
			
		||||
	LdWindowMain *self);
 | 
			
		||||
static void on_action_library_toolbar (GtkToggleAction *action,
 | 
			
		||||
static void on_action_library_pane (GtkToggleAction *action,
 | 
			
		||||
	LdWindowMain *self);
 | 
			
		||||
static void on_action_grid (GtkToggleAction *action, LdWindowMain *self);
 | 
			
		||||
 | 
			
		||||
@@ -180,9 +186,9 @@ static GtkToggleActionEntry wm_toggle_action_entries[] =
 | 
			
		||||
	{"MainToolbar", NULL, N_("_Main Toolbar"), NULL,
 | 
			
		||||
		N_("Toggle displaying of the main toolbar"),
 | 
			
		||||
		G_CALLBACK (on_action_main_toolbar), TRUE},
 | 
			
		||||
	{"LibraryToolbar", NULL, N_("_Library Toolbar"), NULL,
 | 
			
		||||
		N_("Toggle displaying of the library toolbar"),
 | 
			
		||||
		G_CALLBACK (on_action_library_toolbar), TRUE},
 | 
			
		||||
	{"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,
 | 
			
		||||
		N_("Toggle displaying of the grid"),
 | 
			
		||||
		G_CALLBACK (on_action_grid), TRUE}
 | 
			
		||||
@@ -215,13 +221,10 @@ static void
 | 
			
		||||
ld_window_main_class_init (LdWindowMainClass *klass)
 | 
			
		||||
{
 | 
			
		||||
	GObjectClass *object_class;
 | 
			
		||||
	GtkWidgetClass *widget_class;
 | 
			
		||||
 | 
			
		||||
	object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
	object_class->finalize = ld_window_main_finalize;
 | 
			
		||||
 | 
			
		||||
	widget_class = GTK_WIDGET_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
	g_type_class_add_private (klass, sizeof (LdWindowMainPrivate));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -267,10 +270,7 @@ ld_window_main_init (LdWindowMain *self)
 | 
			
		||||
	priv->toolbar = gtk_ui_manager_get_widget (priv->ui_manager, "/Toolbar");
 | 
			
		||||
 | 
			
		||||
	/* Create the remaining widgets. */
 | 
			
		||||
	priv->library_toolbar = ld_library_toolbar_new ();
 | 
			
		||||
	/* XXX: For GTK 2.16+, s/toolbar/orientable/ */
 | 
			
		||||
	gtk_toolbar_set_orientation (GTK_TOOLBAR (priv->library_toolbar),
 | 
			
		||||
		GTK_ORIENTATION_VERTICAL);
 | 
			
		||||
	priv->library_view = ld_category_tree_view_new (NULL);
 | 
			
		||||
 | 
			
		||||
	priv->view = LD_DIAGRAM_VIEW (ld_diagram_view_new ());
 | 
			
		||||
	priv->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
 | 
			
		||||
@@ -284,29 +284,41 @@ ld_window_main_init (LdWindowMain *self)
 | 
			
		||||
		(GTK_STATUSBAR (priv->statusbar), "menu");
 | 
			
		||||
	priv->statusbar_symbol_context_id = gtk_statusbar_get_context_id
 | 
			
		||||
		(GTK_STATUSBAR (priv->statusbar), "symbol");
 | 
			
		||||
	priv->statusbar_hint_context_id = gtk_statusbar_get_context_id
 | 
			
		||||
		(GTK_STATUSBAR (priv->statusbar), "hint");
 | 
			
		||||
 | 
			
		||||
	priv->lv_viewport = gtk_viewport_new (NULL, NULL);
 | 
			
		||||
	gtk_viewport_set_shadow_type
 | 
			
		||||
		(GTK_VIEWPORT (priv->lv_viewport), GTK_SHADOW_NONE);
 | 
			
		||||
	gtk_container_add (GTK_CONTAINER (priv->lv_viewport), priv->library_view);
 | 
			
		||||
 | 
			
		||||
	priv->lv_window = gtk_scrolled_window_new (NULL, NULL);
 | 
			
		||||
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->lv_window),
 | 
			
		||||
		GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
 | 
			
		||||
	gtk_container_add (GTK_CONTAINER (priv->lv_window), priv->lv_viewport);
 | 
			
		||||
 | 
			
		||||
	priv->paned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
 | 
			
		||||
	gtk_paned_pack1 (GTK_PANED (priv->paned),
 | 
			
		||||
		priv->lv_window, FALSE, FALSE);
 | 
			
		||||
	gtk_paned_pack2 (GTK_PANED (priv->paned),
 | 
			
		||||
		priv->scrolled_window, TRUE, TRUE);
 | 
			
		||||
	gtk_paned_set_position (GTK_PANED (priv->paned), 180);
 | 
			
		||||
 | 
			
		||||
	/* Pack all widgets into the window. */
 | 
			
		||||
	priv->hbox = gtk_hbox_new (FALSE, 0);
 | 
			
		||||
	gtk_box_pack_start (GTK_BOX (priv->hbox), priv->library_toolbar,
 | 
			
		||||
		FALSE, FALSE, 0);
 | 
			
		||||
	gtk_box_pack_start (GTK_BOX (priv->hbox), priv->scrolled_window,
 | 
			
		||||
		TRUE, TRUE, 0);
 | 
			
		||||
 | 
			
		||||
	priv->vbox = gtk_vbox_new (FALSE, 0);
 | 
			
		||||
	priv->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 | 
			
		||||
	gtk_box_pack_start (GTK_BOX (priv->vbox), priv->menu, FALSE, FALSE, 0);
 | 
			
		||||
	gtk_box_pack_start (GTK_BOX (priv->vbox), priv->toolbar, FALSE, FALSE, 0);
 | 
			
		||||
	gtk_box_pack_start (GTK_BOX (priv->vbox), priv->hbox, TRUE, TRUE, 0);
 | 
			
		||||
	gtk_box_pack_start (GTK_BOX (priv->vbox), priv->paned, TRUE, TRUE, 0);
 | 
			
		||||
	gtk_box_pack_end (GTK_BOX (priv->vbox), priv->statusbar, FALSE, FALSE, 0);
 | 
			
		||||
 | 
			
		||||
	gtk_container_add (GTK_CONTAINER (self), priv->vbox);
 | 
			
		||||
 | 
			
		||||
	/* Configure the window. */
 | 
			
		||||
	g_signal_connect (self, "destroy", G_CALLBACK (gtk_main_quit), NULL);
 | 
			
		||||
	g_signal_connect (self, "delete-event", G_CALLBACK (on_delete), NULL);
 | 
			
		||||
 | 
			
		||||
	gtk_window_add_accel_group (GTK_WINDOW (self),
 | 
			
		||||
		gtk_ui_manager_get_accel_group (priv->ui_manager));
 | 
			
		||||
	gtk_window_set_default_size (GTK_WINDOW (self), 500, 400);
 | 
			
		||||
	gtk_window_set_default_size (GTK_WINDOW (self), 640, 440);
 | 
			
		||||
	gtk_window_set_position (GTK_WINDOW (self), GTK_WIN_POS_CENTER);
 | 
			
		||||
 | 
			
		||||
	/* Initialize the backend. */
 | 
			
		||||
@@ -322,28 +334,34 @@ ld_window_main_init (LdWindowMain *self)
 | 
			
		||||
		G_CALLBACK (on_diagram_selection_changed), self);
 | 
			
		||||
 | 
			
		||||
	priv->library = ld_library_new ();
 | 
			
		||||
	ld_library_load (priv->library, PROJECT_SHARE_DIR "library");
 | 
			
		||||
	load_library_directories (priv->library);
 | 
			
		||||
 | 
			
		||||
	ld_diagram_view_set_diagram (priv->view, priv->diagram);
 | 
			
		||||
	ld_diagram_view_set_library (priv->view, priv->library);
 | 
			
		||||
 | 
			
		||||
	g_signal_connect (priv->view, "notify::zoom",
 | 
			
		||||
		G_CALLBACK (on_view_zoom_changed), self);
 | 
			
		||||
	ld_category_view_set_category (LD_CATEGORY_VIEW (priv->library_view),
 | 
			
		||||
		ld_library_get_root (priv->library));
 | 
			
		||||
 | 
			
		||||
	ld_library_toolbar_set_library (LD_LIBRARY_TOOLBAR (priv->library_toolbar),
 | 
			
		||||
		priv->library);
 | 
			
		||||
	ld_library_toolbar_set_view (LD_LIBRARY_TOOLBAR (priv->library_toolbar),
 | 
			
		||||
		priv->view);
 | 
			
		||||
 | 
			
		||||
	g_signal_connect_after (priv->library_toolbar, "symbol-selected",
 | 
			
		||||
	g_signal_connect_after (priv->library_view, "symbol-selected",
 | 
			
		||||
		G_CALLBACK (on_symbol_selected), self);
 | 
			
		||||
	g_signal_connect_after (priv->library_toolbar, "symbol-deselected",
 | 
			
		||||
	g_signal_connect_after (priv->library_view, "symbol-deselected",
 | 
			
		||||
		G_CALLBACK (on_symbol_deselected), self);
 | 
			
		||||
	g_signal_connect_after (priv->library_toolbar, "symbol-chosen",
 | 
			
		||||
		G_CALLBACK (on_symbol_chosen), self);
 | 
			
		||||
 | 
			
		||||
	diagram_set_filename (self, NULL);
 | 
			
		||||
 | 
			
		||||
	priv->statusbar_hint_drag = gtk_statusbar_push
 | 
			
		||||
		(GTK_STATUSBAR (priv->statusbar), priv->statusbar_hint_context_id,
 | 
			
		||||
		_("Drag symbols from the library pane to add them to the diagram."));
 | 
			
		||||
 | 
			
		||||
	priv->zoom_label = gtk_label_new ("");
 | 
			
		||||
	gtk_label_set_single_line_mode (GTK_LABEL (priv->zoom_label), TRUE);
 | 
			
		||||
	gtk_box_pack_end (GTK_BOX (gtk_statusbar_get_message_area
 | 
			
		||||
		(GTK_STATUSBAR (priv->statusbar))), priv->zoom_label, FALSE, FALSE, 0);
 | 
			
		||||
 | 
			
		||||
	g_signal_connect (priv->view, "notify::zoom",
 | 
			
		||||
		G_CALLBACK (on_view_zoom_changed), self);
 | 
			
		||||
	g_object_notify (G_OBJECT (priv->view), "zoom");
 | 
			
		||||
 | 
			
		||||
	action_set_sensitive (self, "Undo", FALSE);
 | 
			
		||||
	action_set_sensitive (self, "Redo", FALSE);
 | 
			
		||||
	action_set_sensitive (self, "Delete", FALSE);
 | 
			
		||||
@@ -353,6 +371,19 @@ ld_window_main_init (LdWindowMain *self)
 | 
			
		||||
 | 
			
		||||
	/* Realize the window. */
 | 
			
		||||
	gtk_widget_show_all (GTK_WIDGET (self));
 | 
			
		||||
 | 
			
		||||
	/* Set up GSettings. */
 | 
			
		||||
	priv->settings = g_settings_new ("org." PROJECT_NAME);
 | 
			
		||||
 | 
			
		||||
	g_settings_bind (priv->settings, "show-main-toolbar",
 | 
			
		||||
		gtk_action_group_get_action (priv->action_group,
 | 
			
		||||
			"MainToolbar"), "active", G_SETTINGS_BIND_DEFAULT);
 | 
			
		||||
	g_settings_bind (priv->settings, "show-library-pane",
 | 
			
		||||
		gtk_action_group_get_action (priv->action_group,
 | 
			
		||||
			"LibraryPane"), "active", G_SETTINGS_BIND_DEFAULT);
 | 
			
		||||
	g_settings_bind (priv->settings, "show-grid",
 | 
			
		||||
		gtk_action_group_get_action (priv->action_group,
 | 
			
		||||
			"ShowGrid"), "active", G_SETTINGS_BIND_DEFAULT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -369,6 +400,7 @@ ld_window_main_finalize (GObject *gobject)
 | 
			
		||||
	g_object_unref (self->priv->diagram);
 | 
			
		||||
	g_object_unref (self->priv->ui_manager);
 | 
			
		||||
	g_object_unref (self->priv->action_group);
 | 
			
		||||
	g_object_unref (self->priv->settings);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->filename)
 | 
			
		||||
		g_free (self->priv->filename);
 | 
			
		||||
@@ -377,6 +409,32 @@ ld_window_main_finalize (GObject *gobject)
 | 
			
		||||
	G_OBJECT_CLASS (ld_window_main_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
load_library_directories (LdLibrary *library)
 | 
			
		||||
{
 | 
			
		||||
	GFile *file_program, *file_user;
 | 
			
		||||
	const gchar *program_dir;
 | 
			
		||||
	gchar *user_dir;
 | 
			
		||||
 | 
			
		||||
	program_dir = PROJECT_SHARE_DIR "library";
 | 
			
		||||
	user_dir = g_build_filename (g_get_user_data_dir (),
 | 
			
		||||
		PROJECT_NAME, "library", NULL);
 | 
			
		||||
 | 
			
		||||
	file_program = g_file_new_for_path (program_dir);
 | 
			
		||||
	file_user    = g_file_new_for_path (user_dir);
 | 
			
		||||
 | 
			
		||||
	ld_library_load (library, program_dir);
 | 
			
		||||
 | 
			
		||||
	/* Don't try to load the same directory twice. */
 | 
			
		||||
	if (!g_file_equal (file_program, file_user))
 | 
			
		||||
		ld_library_load (library, user_dir);
 | 
			
		||||
 | 
			
		||||
	g_object_unref (file_user);
 | 
			
		||||
	g_object_unref (file_program);
 | 
			
		||||
 | 
			
		||||
	g_free (user_dir);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * on_delete:
 | 
			
		||||
 *
 | 
			
		||||
@@ -477,7 +535,7 @@ on_menu_item_selected (GtkWidget *item, LdWindowMain *window)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_menu_item_deselected (GtkItem *item, LdWindowMain *window)
 | 
			
		||||
on_menu_item_deselected (GtkMenuItem *item, LdWindowMain *window)
 | 
			
		||||
{
 | 
			
		||||
	gtk_statusbar_pop (GTK_STATUSBAR (window->priv->statusbar),
 | 
			
		||||
		window->priv->statusbar_menu_context_id);
 | 
			
		||||
@@ -490,6 +548,14 @@ static void
 | 
			
		||||
on_diagram_changed (LdDiagram *diagram, LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	update_title (self);
 | 
			
		||||
 | 
			
		||||
	if (self->priv->statusbar_hint_drag)
 | 
			
		||||
	{
 | 
			
		||||
		gtk_statusbar_remove (GTK_STATUSBAR (self->priv->statusbar),
 | 
			
		||||
			self->priv->statusbar_hint_context_id,
 | 
			
		||||
			self->priv->statusbar_hint_drag);
 | 
			
		||||
		self->priv->statusbar_hint_drag = 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -573,23 +639,17 @@ diagram_new (LdWindowMain *self)
 | 
			
		||||
 *
 | 
			
		||||
 * Save the current diagram.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
diagram_save (LdWindowMain *self)
 | 
			
		||||
static gboolean
 | 
			
		||||
diagram_save (LdWindowMain *self, GtkWindow *dialog_parent,
 | 
			
		||||
	const gchar *filename)
 | 
			
		||||
{
 | 
			
		||||
	GError *error;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_WINDOW_MAIN (self));
 | 
			
		||||
	g_return_val_if_fail (LD_IS_WINDOW_MAIN (self), FALSE);
 | 
			
		||||
	g_return_val_if_fail (filename != NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
	if (!self->priv->filename)
 | 
			
		||||
	{
 | 
			
		||||
		diagram_show_save_as_dialog (self);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* FIXME: If this fails, we still retain the filename. */
 | 
			
		||||
	error = NULL;
 | 
			
		||||
	ld_diagram_save_to_file (self->priv->diagram,
 | 
			
		||||
		self->priv->filename, &error);
 | 
			
		||||
	ld_diagram_save_to_file (self->priv->diagram, filename, &error);
 | 
			
		||||
	if (error)
 | 
			
		||||
	{
 | 
			
		||||
		GtkWidget *message_dialog;
 | 
			
		||||
@@ -597,7 +657,7 @@ diagram_save (LdWindowMain *self)
 | 
			
		||||
		g_warning ("saving failed: %s", error->message);
 | 
			
		||||
		g_error_free (error);
 | 
			
		||||
 | 
			
		||||
		message_dialog = gtk_message_dialog_new (GTK_WINDOW (self),
 | 
			
		||||
		message_dialog = gtk_message_dialog_new (dialog_parent,
 | 
			
		||||
			GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
 | 
			
		||||
			_("Failed to save the diagram"));
 | 
			
		||||
		gtk_message_dialog_format_secondary_text
 | 
			
		||||
@@ -605,11 +665,13 @@ diagram_save (LdWindowMain *self)
 | 
			
		||||
			_("Try again or save it under another name."));
 | 
			
		||||
		gtk_dialog_run (GTK_DIALOG (message_dialog));
 | 
			
		||||
		gtk_widget_destroy (message_dialog);
 | 
			
		||||
		return FALSE;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		ld_diagram_set_modified (self->priv->diagram, FALSE);
 | 
			
		||||
		update_title (self);
 | 
			
		||||
		return TRUE;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -630,16 +692,30 @@ diagram_open (LdWindowMain *self, const gchar *filename)
 | 
			
		||||
		GtkWidget *message_dialog;
 | 
			
		||||
 | 
			
		||||
		g_warning ("loading failed: %s", error->message);
 | 
			
		||||
		g_error_free (error);
 | 
			
		||||
 | 
			
		||||
		message_dialog = gtk_message_dialog_new (GTK_WINDOW (self),
 | 
			
		||||
			GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
 | 
			
		||||
			_("Failed to open the file"));
 | 
			
		||||
		gtk_message_dialog_format_secondary_text
 | 
			
		||||
			(GTK_MESSAGE_DIALOG (message_dialog),
 | 
			
		||||
			_("The file is probably corrupted."));
 | 
			
		||||
 | 
			
		||||
		if (error->domain != G_FILE_ERROR)
 | 
			
		||||
		{
 | 
			
		||||
			gchar *display_filename;
 | 
			
		||||
 | 
			
		||||
			display_filename = g_filename_display_name (filename);
 | 
			
		||||
			gtk_message_dialog_format_secondary_text
 | 
			
		||||
				(GTK_MESSAGE_DIALOG (message_dialog),
 | 
			
		||||
				_("Failed to open file `%s': Invalid contents."), filename);
 | 
			
		||||
			g_free (display_filename);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
			gtk_message_dialog_format_secondary_text
 | 
			
		||||
				(GTK_MESSAGE_DIALOG (message_dialog),
 | 
			
		||||
				"%s", error->message);
 | 
			
		||||
 | 
			
		||||
		gtk_dialog_run (GTK_DIALOG (message_dialog));
 | 
			
		||||
		gtk_widget_destroy (message_dialog);
 | 
			
		||||
 | 
			
		||||
		g_error_free (error);
 | 
			
		||||
		return FALSE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -708,6 +784,8 @@ static void
 | 
			
		||||
diagram_show_save_as_dialog (LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	GtkWidget *dialog;
 | 
			
		||||
	GtkFileChooser *file_chooser;
 | 
			
		||||
	gchar *filename;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (LD_IS_WINDOW_MAIN (self));
 | 
			
		||||
 | 
			
		||||
@@ -720,11 +798,25 @@ diagram_show_save_as_dialog (LdWindowMain *self)
 | 
			
		||||
	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog),
 | 
			
		||||
		diagram_get_file_filter ());
 | 
			
		||||
 | 
			
		||||
	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
 | 
			
		||||
	file_chooser = GTK_FILE_CHOOSER (dialog);
 | 
			
		||||
	if (self->priv->filename)
 | 
			
		||||
		gtk_file_chooser_set_filename (file_chooser, self->priv->filename);
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		diagram_set_filename (self,
 | 
			
		||||
			gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)));
 | 
			
		||||
		diagram_save (self);
 | 
			
		||||
		filename = g_strdup_printf ("%s.ldd", _("Untitled diagram"));
 | 
			
		||||
		gtk_file_chooser_set_current_name (file_chooser, filename);
 | 
			
		||||
		g_free (filename);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
 | 
			
		||||
	{
 | 
			
		||||
		filename = gtk_file_chooser_get_filename (file_chooser);
 | 
			
		||||
		if (diagram_save (self, GTK_WINDOW (dialog), filename))
 | 
			
		||||
		{
 | 
			
		||||
			diagram_set_filename (self, filename);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		g_free (filename);
 | 
			
		||||
	}
 | 
			
		||||
	gtk_widget_destroy (dialog);
 | 
			
		||||
}
 | 
			
		||||
@@ -780,7 +872,7 @@ may_close_diagram (LdWindowMain *self, const gchar *dialog_message)
 | 
			
		||||
	case GTK_RESPONSE_NO:
 | 
			
		||||
		return TRUE;
 | 
			
		||||
	case GTK_RESPONSE_YES:
 | 
			
		||||
		diagram_save (self);
 | 
			
		||||
		on_action_save (NULL, self);
 | 
			
		||||
		return TRUE;
 | 
			
		||||
	case GTK_RESPONSE_CANCEL:
 | 
			
		||||
	case GTK_RESPONSE_DELETE_EVENT:
 | 
			
		||||
@@ -811,8 +903,8 @@ may_quit (LdWindowMain *self)
 | 
			
		||||
/* ===== User interface actions ============================================ */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_symbol_selected (LdLibraryToolbar *toolbar, LdSymbol *symbol,
 | 
			
		||||
	const gchar *klass, LdWindowMain *self)
 | 
			
		||||
on_symbol_selected (LdCategoryView *view,
 | 
			
		||||
	LdSymbol *symbol, const gchar *path, LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	const gchar *symbol_name;
 | 
			
		||||
 | 
			
		||||
@@ -822,36 +914,30 @@ on_symbol_selected (LdLibraryToolbar *toolbar, LdSymbol *symbol,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_symbol_deselected (LdLibraryToolbar *toolbar, LdSymbol *symbol,
 | 
			
		||||
	const gchar *klass, LdWindowMain *self)
 | 
			
		||||
on_symbol_deselected (LdCategoryView *view,
 | 
			
		||||
	LdSymbol *symbol, const gchar *path, LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	gtk_statusbar_pop (GTK_STATUSBAR (self->priv->statusbar),
 | 
			
		||||
		self->priv->statusbar_menu_context_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_symbol_chosen (LdLibraryToolbar *toolbar, LdSymbol *symbol,
 | 
			
		||||
	const gchar *klass, LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	LdDiagramSymbol *diagram_symbol;
 | 
			
		||||
 | 
			
		||||
	diagram_symbol = ld_diagram_symbol_new (NULL);
 | 
			
		||||
	ld_diagram_symbol_set_class (diagram_symbol, klass);
 | 
			
		||||
 | 
			
		||||
	ld_diagram_view_add_object_begin (self->priv->view,
 | 
			
		||||
		LD_DIAGRAM_OBJECT (diagram_symbol));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_view_zoom_changed (LdDiagramView *view, GParamSpec *pspec,
 | 
			
		||||
	LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	gchar *zoom;
 | 
			
		||||
 | 
			
		||||
	action_set_sensitive (self, "ZoomIn",
 | 
			
		||||
		ld_diagram_view_can_zoom_in (self->priv->view));
 | 
			
		||||
	action_set_sensitive (self, "ZoomOut",
 | 
			
		||||
		ld_diagram_view_can_zoom_out (self->priv->view));
 | 
			
		||||
	action_set_sensitive (self, "NormalSize",
 | 
			
		||||
		ld_diagram_view_get_zoom (self->priv->view) != 1);
 | 
			
		||||
 | 
			
		||||
	zoom = g_strdup_printf (_("%d%%"),
 | 
			
		||||
		(gint) (ld_diagram_view_get_zoom (self->priv->view) * 100 + 0.5));
 | 
			
		||||
	gtk_label_set_text (GTK_LABEL (self->priv->zoom_label), zoom);
 | 
			
		||||
	g_free (zoom);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -869,7 +955,9 @@ on_action_open (GtkAction *action, LdWindowMain *self)
 | 
			
		||||
static void
 | 
			
		||||
on_action_save (GtkAction *action, LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	diagram_save (self);
 | 
			
		||||
	if (!self->priv->filename
 | 
			
		||||
	 || !diagram_save (self, GTK_WINDOW (self), self->priv->filename))
 | 
			
		||||
		diagram_show_save_as_dialog (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -890,9 +978,10 @@ on_action_about (GtkAction *action, LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	gtk_show_about_dialog (GTK_WINDOW (self),
 | 
			
		||||
		"program-name", PROJECT_NAME,
 | 
			
		||||
		"logo-icon-name", PROJECT_NAME,
 | 
			
		||||
		"version", PROJECT_VERSION,
 | 
			
		||||
		"translator-credits", _("translator-credits"),
 | 
			
		||||
		"copyright", "Copyright Přemysl Janouch 2010 - 2011",
 | 
			
		||||
		"copyright", "Copyright 2010 - 2021 Přemysl Eric Janouch",
 | 
			
		||||
		"website", PROJECT_URL,
 | 
			
		||||
		NULL);
 | 
			
		||||
}
 | 
			
		||||
@@ -929,9 +1018,9 @@ on_action_main_toolbar (GtkToggleAction *action, LdWindowMain *self)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_action_library_toolbar (GtkToggleAction *action, LdWindowMain *self)
 | 
			
		||||
on_action_library_pane (GtkToggleAction *action, LdWindowMain *self)
 | 
			
		||||
{
 | 
			
		||||
	gtk_widget_set_visible (self->priv->library_toolbar,
 | 
			
		||||
	gtk_widget_set_visible (self->priv->lv_window,
 | 
			
		||||
		gtk_toggle_action_get_active (action));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||