Compare commits

..

36 Commits

Author SHA1 Message Date
Simon De Backer
32a90493bd TEST a Merge branch 'XMLProperties'
it gets built let's test it for bugs

 Conflicts:
	sources/ElementsCollection/fileelementcollectionitem.cpp
	sources/QetGraphicsItemModeler/qetgraphicshandleritem.h
	sources/borderproperties.cpp
	sources/conductorproperties.cpp
	sources/conductorproperties.h
	sources/diagram.cpp
	sources/diagram.h
	sources/diagramprintdialog.cpp
	sources/diagramprintdialog.h
	sources/editor/graphicspart/customelementgraphicpart.cpp
	sources/editor/graphicspart/partarc.cpp
	sources/editor/graphicspart/partdynamictextfield.cpp
	sources/editor/graphicspart/partdynamictextfield.h
	sources/editor/graphicspart/partellipse.cpp
	sources/editor/graphicspart/partline.cpp
	sources/editor/graphicspart/partpolygon.cpp
	sources/editor/graphicspart/partrectangle.cpp
	sources/editor/graphicspart/partterminal.cpp
	sources/editor/graphicspart/partterminal.h
	sources/editor/graphicspart/parttext.cpp
	sources/properties/propertiesinterface.cpp
	sources/properties/propertiesinterface.h
	sources/properties/terminaldata.cpp
	sources/properties/terminaldata.h
	sources/properties/xrefproperties.cpp
	sources/properties/xrefproperties.h
	sources/qetgraphicsitem/conductor.cpp
	sources/qetgraphicsitem/conductor.h
	sources/qetgraphicsitem/conductortextitem.h
	sources/qetgraphicsitem/dynamicelementtextitem.h
	sources/qetgraphicsitem/element.cpp
	sources/qetgraphicsitem/element.h
	sources/qetgraphicsitem/elementtextitemgroup.h
	sources/qetgraphicsitem/slaveelement.cpp
	sources/qetgraphicsitem/slaveelement.h
	sources/qetgraphicsitem/terminal.cpp
	sources/qetgraphicsitem/terminal.h
	sources/qetproject.cpp
	sources/titleblockproperties.cpp
2020-10-13 22:31:58 +02:00
Martin Marmsoler
eb5494c360 Merge branch 'XMLProperties' of ssh://git.tuxfamily.org/gitroot/qet/qet into XMLProperties 2020-10-12 19:14:02 +02:00
Martin Marmsoler
c0d9bf9548 use more meaningful name 2020-10-12 19:11:01 +02:00
Martin Marmsoler
f79b1a52bb WIP 2020-10-11 11:05:22 +02:00
Martin Marmsoler
3509a1c7a5 add comments and move some initializations from the source file to the header file 2020-10-10 15:50:04 +02:00
Martin Marmsoler
0dfe0c1613 let conductor textitem export to xml, because the read is also made from it 2020-10-10 12:25:58 +02:00
Martin Marmsoler
497673d83b make createProperty methods static, because they can be used also outside of this class 2020-10-10 12:21:37 +02:00
Martin Marmsoler
f18e6bd50f remove default parameter, because it leads only to confusion and errors 2020-10-10 12:02:38 +02:00
Martin Marmsoler
9b8c0101be new method to load properties must be used, otherwise nothing valid will be read 2020-10-10 11:17:15 +02:00
Martin Marmsoler
0cc6558281 Fix issue that conductors where connected wrong. This was, because instead of reusing the id's stored in the Terminal, new id's where created 2020-10-08 19:05:30 +02:00
Martin Marmsoler
52f886e34b add comment 2020-10-08 18:39:11 +02:00
Martin Marmsoler
a1cf3711a1 Fix issues 2020-10-07 08:05:01 +02:00
Martin Marmsoler
b958848194 Update conductorproperties.cpp and conductor.cpp 2020-10-06 21:40:48 +02:00
Martin Marmsoler
2d21391a09 - AlignBottom shoud be the default
- move inital values to header file
2020-10-06 18:44:14 +02:00
Martin Marmsoler
beeeb252b4 fix problem of not showing reference labels 2020-10-06 17:07:16 +02:00
Martin Marmsoler
6d2a88e85f use default value if the parameter is not available 2020-10-06 12:48:39 +02:00
Martin Marmsoler
8ef8a71680 add comment 2020-10-05 21:54:26 +02:00
Martin Marmsoler
8829974852 add comment 2020-10-04 09:34:34 +02:00
Martin Marmsoler
871a2642f4 use m_pos as value to store 2020-10-04 09:34:25 +02:00
Martin Marmsoler
9153588c94 store position when exporting to xml, because terminalData will create the document from m_pos 2020-10-04 09:33:16 +02:00
Martin Marmsoler
f3368f159d Fix problem that not all childs were added to the xml document 2020-10-03 20:50:08 +02:00
Martin Marmsoler
9521a8aa0b WIP 2020-10-02 15:49:35 +02:00
Martin Marmsoler
c8691b243b if no uuid for the terminal is available, use write the id of the terminal to the xml file, otherwise no connection can be done after saving 2020-10-02 14:58:33 +02:00
Martin Marmsoler
9684d753ec write uuid only in partterminal to xml, because in the other case it is not needed 2020-10-02 14:57:06 +02:00
Martin Marmsoler
15ca6096ca rename f to conductor for better readability 2020-10-02 14:56:15 +02:00
Martin Marmsoler
a92683f3fa add comment 2020-10-01 16:51:17 +02:00
Martin Marmsoler
9e54137224 add explanation 2020-10-01 16:39:12 +02:00
Martin Marmsoler
91a56799a7 Solves problem that terminals are not placed at the correct place 2020-10-01 16:31:15 +02:00
Martin Marmsoler
10e767c3e0 add comments 2020-10-01 16:28:48 +02:00
Martin Marmsoler
27a63bbf2b WIP 2020-10-01 14:38:08 +02:00
Martin Marmsoler
adc28d32b9 revert saving title block properties in it's own child, because it makes more sense directly in the diagram 2020-09-28 16:29:09 +02:00
Martin Marmsoler
48cce42cfe fix wrong position of segments when loading file. This was, because not the segment property is asked, but the parent and this will not work
additionally support legacy orientation
2020-09-28 15:42:57 +02:00
Martin Marmsoler
6080a7b9c9 WIP 2020-09-14 21:21:32 +02:00
Martin Marmsoler
c5f1705745 go on with the work 2020-08-25 20:14:38 +02:00
Martin Marmsoler
a10709157d update 2020-08-24 20:34:18 +02:00
Martin Marmsoler
385d0ffd69 initial work to move everything into the propertiesinterface which is related to it 2020-08-13 23:27:11 +02:00
11002 changed files with 311027 additions and 481056 deletions

View File

@@ -1,67 +0,0 @@
---
BasedOnStyle: LLVM
AlignAfterOpenBracket: AlwaysBreak
AlignConsecutiveMacros: 'true'
AlignConsecutiveAssignments: 'true'
AlignConsecutiveDeclarations: 'true'
AlignEscapedNewlines: Right
AlignOperands: 'true'
AlignTrailingComments: 'true'
AllowAllArgumentsOnNextLine: 'false'
AllowAllConstructorInitializersOnNextLine: 'true'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortBlocksOnASingleLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'true'
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Always
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: 'true'
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: 'true'
AlwaysBreakTemplateDeclarations: 'Yes'
BinPackArguments: 'false'
BinPackParameters: 'false'
BreakAfterJavaFieldAnnotations: 'true'
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Allman
BreakBeforeTernaryOperators: 'false'
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
BreakStringLiterals: 'true'
ColumnLimit: '80'
CompactNamespaces: 'false'
ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
Cpp11BracedListStyle: 'true'
FixNamespaceComments: 'true'
IncludeBlocks: Regroup
IndentCaseLabels: 'false'
IndentPPDirectives: AfterHash
IndentWidth: '4'
JavaScriptWrapImports: 'true'
Language: Cpp
MaxEmptyLinesToKeep: '1'
NamespaceIndentation: All
PointerAlignment: Left
ReflowComments: 'true'
SortIncludes: 'true'
SortUsingDeclarations: 'true'
SpaceAfterCStyleCast: 'true'
SpaceAfterLogicalNot: 'true'
SpaceAfterTemplateKeyword: 'true'
SpaceBeforeAssignmentOperators: 'true'
SpaceBeforeCpp11BracedList: 'true'
SpaceBeforeCtorInitializerColon: 'true'
SpaceBeforeInheritanceColon: 'true'
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: 'true'
SpaceInEmptyParentheses: 'false'
SpacesInAngles: 'false'
SpacesInCStyleCastParentheses: 'false'
SpacesInContainerLiterals: 'false'
SpacesInParentheses: 'false'
SpacesInSquareBrackets: 'false'
Standard: Cpp11
TabWidth: '4'
UseTab: Always
...

View File

@@ -1,20 +0,0 @@
name: Publish Edge Snap
on:
push:
branches:
- master
jobs:
publish_amd64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: snapcore/action-build@v1
id: build
- uses: snapcore/action-publish@v1
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.STORE_LOGIN }}
with:
snap: ${{ steps.build.outputs.snap }}
release: edge

View File

@@ -1,154 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
include(cmake/hoto_update_cmake_message.cmake)
cmake_minimum_required(VERSION 3.14...3.19 FATAL_ERROR)
project(qelectrotech
VERSION 0.9.0
DESCRIPTION "QET is a CAD/CAE editor focusing on schematics drawing features."
HOMEPAGE_URL "https://qelectrotech.org/"
LANGUAGES CXX)
include(cmake/copyright_message.cmake)
set(QET_DIR ${PROJECT_SOURCE_DIR})
# Add sub directories
option(PACKAGE_TESTS "Build the tests" ON)
if(PACKAGE_TESTS)
message("Add sub directory tests")
add_subdirectory(tests)
endif()
include(cmake/paths_compilation_installation.cmake)
include(cmake/start_options.cmake)
include(cmake/developer_options.cmake)
include(cmake/git_update_submodules.cmake)
include(cmake/git_last_commit_sha.cmake)
include(cmake/fetch_kdeaddons.cmake)
include(cmake/fetch_singleapplication.cmake)
include(cmake/fetch_pugixml.cmake)
include(cmake/qet_compilation_vars.cmake)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
SET(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(
QT
NAMES
Qt6
Qt5
COMPONENTS
${QET_COMPONENTS}
REQUIRED
)
find_package(
Qt${QT_VERSION_MAJOR}
COMPONENTS
${QET_COMPONENTS}
REQUIRED)
set(CMAKE_AUTOUIC_SEARCH_PATHS ${QET_DIR}/sources/ui)
qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${QET_DIR}/lang")
qt5_add_translation(QM_FILES ${TS_FILES})
# als laatse
include(cmake/define_definitions.cmake)
add_executable(
${PROJECT_NAME}
${QET_RES_FILES}
${QET_SRC_FILES}
${QM_FILES}
${QET_DIR}/qelectrotech.qrc
)
target_link_libraries(
${PROJECT_NAME}
PUBLIC
PRIVATE
pugixml::pugixml
SingleApplication::SingleApplication
${KF5_PRIVATE_LIBRARIES}
${QET_PRIVATE_LIBRARIES}
)
target_include_directories(
${PROJECT_NAME}
PRIVATE
${QET_DIR}/sources/titleblock
${QET_DIR}/sources/ui
${QET_DIR}/sources/qetgraphicsitem
${QET_DIR}/sources/qetgraphicsitem/ViewItem
${QET_DIR}/sources/qetgraphicsitem/ViewItem/ui
${QET_DIR}/sources/richtext
${QET_DIR}/sources/factory
${QET_DIR}/sources/properties
${QET_DIR}/sources/dvevent
${QET_DIR}/sources/editor
${QET_DIR}/sources/editor/esevent
${QET_DIR}/sources/editor/graphicspart
${QET_DIR}/sources/editor/ui
${QET_DIR}/sources/editor/UndoCommand
${QET_DIR}/sources/undocommand
${QET_DIR}/sources/diagramevent
${QET_DIR}/sources/ElementsCollection
${QET_DIR}/sources/ElementsCollection/ui
${QET_DIR}/sources/autoNum
${QET_DIR}/sources/autoNum/ui
${QET_DIR}/sources/ui/configpage
${QET_DIR}/sources/SearchAndReplace
${QET_DIR}/sources/SearchAndReplace/ui
${QET_DIR}/sources/NameList
${QET_DIR}/sources/NameList/ui
${QET_DIR}/sources/utils
${QET_DIR}/sources/pugixml
${QET_DIR}/sources/dataBase
${QET_DIR}/sources/dataBase/ui
${QET_DIR}/sources/factory/ui
${QET_DIR}/sources/print
)
install(TARGETS ${PROJECT_NAME})
if (NOT MINGW)
install(DIRECTORY ico/breeze-icons/16x16 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/22x22 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/32x32 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/48x48 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/64x64 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/128x128 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/256x256 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY elements DESTINATION share/qelectrotech)
install(DIRECTORY examples DESTINATION share/qelectrotech)
install(DIRECTORY titleblocks DESTINATION share/qelectrotech)
install(FILES LICENSE ELEMENTS.LICENSE CREDIT README ChangeLog DESTINATION share/doc/qelectrotech)
install(FILES misc/qelectrotech.desktop DESTINATION share/applications)
install(FILES misc/qelectrotech.xml DESTINATION share/mime/packages)
install(FILES misc/qelectrotech.appdata.xml DESTINATION ${QET_APPDATA_PATH})
install(FILES ${QM_FILES} DESTINATION ${QET_LANG_PATH})
endif()

View File

@@ -1,67 +1,3 @@
====== ChangeLog from 0.9.0 to 0.9.1 ======
*Bug fix:
Avoid WARNING: mime_xml.path is not defined
Update *.qm translations files
Improve 20 logic elements, thanks Vbxier
*Element Editor:
Fix wrong calculation of the bounding rect of an arc
====== ChangeLog from 0.8 to 0.9 ======
*Diagram editor :
Improved QElectroTech speed (launch qet, open project, function)
A drop-down list has been added to the toolbar to change the size of the resize handles.
*Element Editor:
The "keep visual rotation" property of element texts is editable from the element editor.
Thanks to the work of antonioaja it is now possible to import a dxf directly from the element editor in a completely transparent way for the user.
In the background QElectroTech uses the dxf2elmt software. https://qelectrotech.org/forum/viewtopic.php?id=2265 https://github.com/antonioaja/dxf2elmt
Improved responsiveness when multiple shapes are selected or deleted, especially when working on a large converted DXF element.
https://qelectrotech.org/forum/viewtopic.php?pid=16612#p16612
*Other:
Add a "side project" tab in the "about" window.
In the general QElectroTech configuration, a drop down list allows to choose the scaling method for hdpi screens.
Allow open polygons (i.e. polylines) when saving in dxf format.
https://qelectrotech.org/forum/viewtopic.php?pid=16611#p16611
Added 'Other' option for slave device contact type.
https://github.com/qelectrotech/qelectrotech-source-mirror/pull/222
https://qelectrotech.org/forum/viewtopic.php?id=2264
*Logs:
Added a QElapsedTimer to calculate the time used to reload the item collection.
Improved QElapsedTimer to calculate the time used to reload the item collection in seconds instead of ms.
Added Linux pc.gpu.RAM information, but requires mesa-utils dependency on the Linux OS.
Added information about mounted disk volumes.
Added CPU architecture for which Qt was compiled in the aboutqetdialog widget and in the logs.
Added MSVC support to MachineInfo.
Added RAM information on Windows of available RAM.
Added QElectroTech version to the log file.
* Elements collection :
Improve collection 8274 elements in 1097 categories (i.e. 9371 files).
* macOS :
Fix sqlite3 database export on macOS, now I use macports with Digikam scripts instead off Homebrew Package Manager.
See: https://invent.kde.org/graphics/digikam/-/tree/master/project/bundles/macports
*Bug fix:
see: https://git.tuxfamily.org/qet/qet.git/log/?h=0.8.1
====== ChangeLog from 0.7 to 0.8 ======

View File

@@ -15,12 +15,12 @@ The main goal of the developers is to provide a libre, easy to use and effective
### Version
The current stable version is 0.80 and was released on 2021.02.21.
Once it has been officially released, the stable version is always frozen and is no longer developed.
The current stable version is 0.70 and was released on 2019.07.13.
Once it has been officialy released, the stable version is always frozen and is no longer developed.
New functionalities, bug and issue fixings are further made in the development version (currently 0.9), which can also be [downloaded](https://qelectrotech.org/download.html).
New functionalities, bug and issue fixings are further made in the development version (currently 0.8), which can also be [downloaded](https://qelectrotech.org/download.html).
Users who want to test and take benefits from the last software implementations should use the development version. But... use it at your own risk, since things are sometimes broken or only partially implemented until they are done!
Users who want to test and take benefits from the last software implementations should use the development version. But... use it at your own risk, since things are sometimes broken or only partialy implemented until they are done!
### License
@@ -28,12 +28,11 @@ The software is licensed under [GNU/GPL](https://www.gnu.org/licenses/old-licens
You are free to use, copy, modify and redistribute it under the terms of the license.
Like many other open source software, QElectroTech is provided as is, without any warranty.
Like many other open source softwares, QElectroTech is provided as it is, without any warranty.
### Development / technical choices
The development follows the classical way of free and open source software: the source code, written by a community of users, is freely accessible.
If you are reading this on Github, be aware that this is an hourly synced mirror. Our real code repository [is located here](https://git.tuxfamily.org/qet/qet.git/).
Here are the technical choices made for the software development:
@@ -154,52 +153,6 @@ Alternatively, you can export to vector (svg) or pixel (png, jpg, bmp) format im
* conductors num can be exported to csv file.
* ***
Nomenclature
A new nomenclature tool appears in the menu: project -> Add a nomenclature.
The nomenclature is presented in the form of a configurable table separated into two parts: the display (the form) and the content (the background).
- Display: the size and position of the table, the margins between text and the table cell, the alignment of the text in the cells and the font. The configuration of the table headers and the table itself are separate.
- Content: the information to display in the table and the order in which it should be displayed.
![](https://download.tuxfamily.org/qet/images_depeche_linuxfr/08/dialogue_nomenclature.png "nomenclature dialogue")
In order to speed up the establishment of a nomenclature, it is possible to export / import the display and content configurations separately. This is the "Configuration" part that can be seen in the photos above.
Behind the scenes, an SQLite database does the work, so setting up the content is nothing more or less than an SQL query created using a dialog (screenshot by right).
The SQL query is configured as follows (from top to bottom in the screenshot):
- “Available information”: the information to display;
- "Filter": filter the information (is not empty, is empty, contains, does not contain, is equal to, is not equal to) only one filter can be applied per information, it is not possible combine several;
- "Type of elements": allows you to filter on what type of element you want to obtain information.
At the bottom, a checkmark "SQL query" allows you to edit a personalized query, if the basic options are not sufficient.
When a nomenclature is too large to be contained in a single folio, it is possible to separate it on several folios, the tables of each folio are then linked together. When creating a nomenclature, this option is activated by default, which has the effect of adding the necessary number of folios, adding a table in each of them and linking them together.
Finally two buttons are available in the property panel:
- "Fit the table to the folio": positions and adjusts the size and determines the number of rows in the table in relation to the folio;
- "Apply geometry to all tables linked to this one": applies the three properties mentioned above to all linked tables in order to save time and maintain aesthetic consistency.
And to finish a table
![](https://download.tuxfamily.org/qet/images_depeche_linuxfr/08/tableau.png "table")
Summary
The old summary has been completely removed from the code in order to make room for the new one which is exactly the same as the nomenclature (a large amount of the code is common), with the exception of the SQL query (and its dialog to configure it) which offers specific information for editing a summary.
Export of the internal database
The database used by the nomenclature and the summary can be exported in a “.sqlite” file.
Currently this is irrelevant, as the function was created during development for debugging purposes, we left it.
Note that the database will become increasingly important in the future of Qet.
Export of the wiring list
In order to be able to use the wiring number printers more easily, the names of conductors can be exported in CSV format, the export respects the quantity of conductors in order to print the right quantity of numbers, for example a potential numbered 240 composed of 3 wires will give 6 × 240 (2 numbers per wire × 3 wires) in the CSV.
### Story
The QElectroTech project was founded in 2007 by two french students, Xavier and Benoit.
@@ -220,6 +173,6 @@ If you love QElectroTech, you can help developers to buy new hardware to test
and implement new features. Thanks in advance for your generous donations.
For more information, look at [Paypal](https://www.paypal.com/donate/?token=rqf80cP0Ck1F2jn4Y46G7tIPv9bq7x0crXkwt3GZ6OZYG6ihJYi8lZxmmQ8itsFwMUdd1G&country.x=GB&locale.x=GB)
or at [leetchi.com](https://www.leetchi.com/c/qelectroteck)

View File

@@ -1,98 +1,6 @@
Changelog
=========
If by accident I have forgotten to credit someone in the CHANGELOG, email me and I will fix it.
__3.3.4__
---------
* Fix compilation under Qt 6.2+ and stricter Qt compile settings. - _Christoph Cullmann_
__3.3.3__
---------
* Support for Qt 6.3+ - Fixed deprecated `QCryptographicHash::addData()` that will only support `QByteArrayView` going further. - _Moody Liu_
__3.3.2__
---------
* Fixed crash caused by sending a `writeAck` on a removed connection. - _Nicolas Werner_
__3.3.1__
---------
* Added support for _AppImage_ dynamic executable paths. - _Michael Klein_
__3.3.0__
---------
* Fixed message fragmentation issue causing crashes and incorrectly / inconsistently received messages. - _Nils Jeisecke_
__3.2.0__
---------
* Added support for Qt 6 - _Jonas Kvinge_
* Fixed warning in `Qt 5.9` with `min`/`max` functions on Windows - _Nick Korotysh_
* Fix return value of connectToPrimary() when connect is successful - _Jonas Kvinge_
* Fix build issue with MinGW GCC pedantic mode - _Iakov Kirilenko_
* Fixed conversion from `int` to `quint32` and Clang Tidy warnings - _Hennadii Chernyshchyk_
__3.1.5__
---------
* Improved library stability in edge cases and very rapid process initialisation
* Fixed Bug where the shared memory block may have been modified without a lock
* Fixed Bug causing `instanceStarted()` to not get emitted when a second instance
has been started before the primary has initiated it's `QLocalServer`.
__3.1.4__
---------
* Officially supporting and build-testing against Qt 5.15
* Fixed an MSVC C4996 warning that suggests using `strncpy_s`.
_Hennadii Chernyshchyk_
__3.1.3.1__
---------
* CMake build system improvements
* Fixed Clang Tidy warnings
_Hennadii Chernyshchyk_
__3.1.3__
---------
* Improved `CMakeLists.txt`
_Hennadii Chernyshchyk_
__3.1.2__
---------
* Fix a crash when exiting an application on Android and iOS
_Emeric Grange_
__3.1.1a__
----------
* Added currentUser() method that returns the user the current instance is running as.
_Leander Schulten_
__3.1.0a__
----------
* Added primaryUser() method that returns the user the primary instance is running as.
__3.0.19__
----------
* Fixed code warning for depricated functions in Qt 5.10 related to `QTime` and `qrand()`.
_Hennadii Chernyshchyk_
_Anton Filimonov_
_Jonas Kvinge_
__3.0.18__
----------

View File

@@ -1,50 +1,43 @@
cmake_minimum_required(VERSION 3.12.0)
cmake_minimum_required(VERSION 3.1.0)
project(SingleApplication LANGUAGES CXX)
project(SingleApplication)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
# SingleApplication base class
set(QAPPLICATION_CLASS QCoreApplication CACHE STRING "Inheritance class for SingleApplication")
set_property(CACHE QAPPLICATION_CLASS PROPERTY STRINGS QApplication QGuiApplication QCoreApplication)
# Libary target
add_library(${PROJECT_NAME} STATIC
singleapplication.cpp
singleapplication_p.cpp
)
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
if(NOT QT_DEFAULT_MAJOR_VERSION)
set(QT_DEFAULT_MAJOR_VERSION 5 CACHE STRING "Qt version to use (5 or 6), defaults to 5")
endif()
# Find dependencies
set(QT_COMPONENTS Core Network)
set(QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Core Qt${QT_DEFAULT_MAJOR_VERSION}::Network)
find_package(Qt5Network)
if(QAPPLICATION_CLASS STREQUAL QApplication)
list(APPEND QT_COMPONENTS Widgets)
list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Widgets)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication)
list(APPEND QT_COMPONENTS Gui)
list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Gui)
find_package(Qt5 COMPONENTS Gui REQUIRED)
else()
set(QAPPLICATION_CLASS QCoreApplication)
find_package(Qt5 COMPONENTS Core REQUIRED)
endif()
add_compile_definitions(QAPPLICATION_CLASS=${QAPPLICATION_CLASS})
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS ${QT_COMPONENTS} REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC ${QT_LIBRARIES})
# Link dependencies
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Network)
if(QAPPLICATION_CLASS STREQUAL QApplication)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)
elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Gui)
else()
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core)
endif()
if(WIN32)
target_link_libraries(${PROJECT_NAME} PRIVATE advapi32)
endif()
target_compile_definitions(${PROJECT_NAME} PUBLIC QAPPLICATION_CLASS=${QAPPLICATION_CLASS})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_definitions(${PROJECT_NAME} PRIVATE
QT_NO_CAST_TO_ASCII
QT_NO_CAST_FROM_ASCII
QT_NO_URL_CAST_FROM_STRING
QT_NO_CAST_FROM_BYTEARRAY
QT_USE_QSTRINGBUILDER
QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
QT_NO_KEYWORDS
QT_NO_FOREACH
)

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) Itay Grudev 2015 - 2020
Copyright (c) Itay Grudev 2015 - 2016
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,8 +1,7 @@
SingleApplication
=================
[![CI](https://github.com/itay-grudev/SingleApplication/workflows/CI:%20Build%20Test/badge.svg)](https://github.com/itay-grudev/SingleApplication/actions)
This is a replacement of the QtSingleApplication for `Qt5` and `Qt6`.
This is a replacement of the QtSingleApplication for `Qt5`.
Keeps the Primary Instance of your Application and kills each subsequent
instances. It can (if enabled) spawn secondary (non-related to the primary)
@@ -16,6 +15,18 @@ class you specify via the `QAPPLICATION_CLASS` macro (`QCoreApplication` is the
default). Further usage is similar to the use of the `Q[Core|Gui]Application`
classes.
The library sets up a `QLocalServer` and a `QSharedMemory` block. The first
instance of your Application is your Primary Instance. It would check if the
shared memory block exists and if not it will start a `QLocalServer` and listen
for connections. Each subsequent instance of your application would check if the
shared memory block exists and if it does, it will connect to the QLocalServer
to notify the primary instance that a new instance had been started, after which
it would terminate with status code `0`. In the Primary Instance
`SingleApplication` would emit the `instanceStarted()` signal upon detecting
that a new instance had been started.
The library uses `stdlib` to terminate the program with the `exit()` function.
You can use the library as if you use any other `QCoreApplication` derived
class:
@@ -32,10 +43,11 @@ int main( int argc, char* argv[] )
```
To include the library files I would recommend that you add it as a git
submodule to your project. Here is how:
submodule to your project and include it's contents with a `.pri` file. Here is
how:
```bash
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplication
git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication
```
**Qmake:**
@@ -54,27 +66,13 @@ Then include the subdirectory in your `CMakeLists.txt` project file.
```cmake
set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication")
add_subdirectory(src/third-party/singleapplication)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)
```
The library sets up a `QLocalServer` and a `QSharedMemory` block. The first
instance of your Application is your Primary Instance. It would check if the
shared memory block exists and if not it will start a `QLocalServer` and listen
for connections. Each subsequent instance of your application would check if the
shared memory block exists and if it does, it will connect to the QLocalServer
to notify the primary instance that a new instance had been started, after which
it would terminate with status code `0`. In the Primary Instance
`SingleApplication` would emit the `instanceStarted()` signal upon detecting
that a new instance had been started.
The library uses `stdlib` to terminate the program with the `exit()` function.
Also don't forget to specify which `QCoreApplication` class your app is using if it
is not `QCoreApplication` as in examples above.
The `Instance Started` signal
-----------------------------
------------------------
The SingleApplication class implements a `instanceStarted()` signal. You can
bind to that signal to raise your application's window when a new instance had
@@ -139,22 +137,13 @@ app.isSecondary();
*__Note:__ If your Primary Instance is terminated a newly launched instance
will replace the Primary one even if the Secondary flag has been set.*
Examples
--------
There are three examples provided in this repository:
* Basic example that prevents a secondary instance from starting [`examples/basic`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/basic)
* An example of a graphical application raising it's parent window [`examples/calculator`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/calculator)
* A console application sending the primary instance it's command line parameters [`examples/sending_arguments`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/sending_arguments)
API
---
### Members
```cpp
SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100, QString userData = QString() )
SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100 )
```
Depending on whether `allowSecondary` is set, this constructor may terminate
@@ -163,7 +152,7 @@ can be specified to set whether the SingleApplication block should work
user-wide or system-wide. Additionally the `Mode::SecondaryNotification` may be
used to notify the primary instance whenever a secondary instance had been
started (disabled by default). `timeout` specifies the maximum time in
milliseconds to wait for blocking operations. Setting `userData` provides additional data that will isolate this instance from other instances that do not have the same (or any) user data set.
milliseconds to wait for blocking operations.
*__Note:__ `argc` and `argv` may be changed as Qt removes arguments that it
recognizes.*
@@ -182,8 +171,7 @@ bool SingleApplication::sendMessage( QByteArray message, int timeout = 100 )
```
Sends `message` to the Primary Instance. Uses `timeout` as a the maximum timeout
in milliseconds for blocking functions. Returns `true` if the message has been sent
successfully. If the message can't be sent or the function timeouts - returns `false`.
in milliseconds for blocking functions
---
@@ -216,22 +204,6 @@ qint64 SingleApplication::primaryPid()
Returns the process ID (PID) of the primary instance.
---
```cpp
QString SingleApplication::primaryUser()
```
Returns the username the primary instance is running as.
---
```cpp
QString SingleApplication::currentUser()
```
Returns the username the current instance is running as.
### Signals
```cpp

View File

@@ -1 +0,0 @@
#include "singleapplication.h"

View File

@@ -1,12 +0,0 @@
cmake_minimum_required(VERSION 3.7.0)
project(basic LANGUAGES CXX)
# SingleApplication base class
set(QAPPLICATION_CLASS QCoreApplication)
add_subdirectory(../.. SingleApplication)
add_executable(basic main.cpp)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)

View File

@@ -2,9 +2,8 @@
int main(int argc, char *argv[])
{
// Allow secondary instances
SingleApplication app( argc, argv );
qWarning() << "Started a new instance";
return app.exec();
}

View File

@@ -1,21 +0,0 @@
cmake_minimum_required(VERSION 3.7.0)
project(calculator LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
# SingleApplication base class
set(QAPPLICATION_CLASS QApplication)
add_subdirectory(../.. SingleApplication)
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED)
add_executable(${PROJECT_NAME}
button.h
calculator.h
button.cpp
calculator.cpp
main.cpp
)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)

View File

@@ -82,27 +82,27 @@ Calculator::Calculator(QWidget *parent)
digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked()));
}
Button *pointButton = createButton(".", SLOT(pointClicked()));
Button *changeSignButton = createButton("\302\261", SLOT(changeSignClicked()));
Button *pointButton = createButton(tr("."), SLOT(pointClicked()));
Button *changeSignButton = createButton(tr("\302\261"), SLOT(changeSignClicked()));
Button *backspaceButton = createButton("Backspace", SLOT(backspaceClicked()));
Button *clearButton = createButton("Clear", SLOT(clear()));
Button *clearAllButton = createButton("Clear All", SLOT(clearAll()));
Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked()));
Button *clearButton = createButton(tr("Clear"), SLOT(clear()));
Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll()));
Button *clearMemoryButton = createButton("MC", SLOT(clearMemory()));
Button *readMemoryButton = createButton("MR", SLOT(readMemory()));
Button *setMemoryButton = createButton("MS", SLOT(setMemory()));
Button *addToMemoryButton = createButton("M+", SLOT(addToMemory()));
Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory()));
Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory()));
Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory()));
Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory()));
Button *divisionButton = createButton("\303\267", SLOT(multiplicativeOperatorClicked()));
Button *timesButton = createButton("\303\227", SLOT(multiplicativeOperatorClicked()));
Button *minusButton = createButton("-", SLOT(additiveOperatorClicked()));
Button *plusButton = createButton("+", SLOT(additiveOperatorClicked()));
Button *divisionButton = createButton(tr("\303\267"), SLOT(multiplicativeOperatorClicked()));
Button *timesButton = createButton(tr("\303\227"), SLOT(multiplicativeOperatorClicked()));
Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked()));
Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked()));
Button *squareRootButton = createButton("Sqrt", SLOT(unaryOperatorClicked()));
Button *powerButton = createButton("x\302\262", SLOT(unaryOperatorClicked()));
Button *reciprocalButton = createButton("1/x", SLOT(unaryOperatorClicked()));
Button *equalButton = createButton("=", SLOT(equalClicked()));
Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked()));
Button *powerButton = createButton(tr("x\302\262"), SLOT(unaryOperatorClicked()));
Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked()));
Button *equalButton = createButton(tr("="), SLOT(equalClicked()));
//! [4]
//! [5]
@@ -140,7 +140,7 @@ Calculator::Calculator(QWidget *parent)
mainLayout->addWidget(equalButton, 5, 5);
setLayout(mainLayout);
setWindowTitle("Calculator");
setWindowTitle(tr("Calculator"));
}
//! [6]
@@ -169,15 +169,15 @@ void Calculator::unaryOperatorClicked()
double operand = display->text().toDouble();
double result = 0.0;
if (clickedOperator == "Sqrt") {
if (clickedOperator == tr("Sqrt")) {
if (operand < 0.0) {
abortOperation();
return;
}
result = std::sqrt(operand);
} else if (clickedOperator == "x\302\262") {
} else if (clickedOperator == tr("x\302\262")) {
result = std::pow(operand, 2.0);
} else if (clickedOperator == "1/x") {
} else if (clickedOperator == tr("1/x")) {
if (operand == 0.0) {
abortOperation();
return;
@@ -287,7 +287,7 @@ void Calculator::pointClicked()
if (waitingForOperand)
display->setText("0");
if (!display->text().contains('.'))
display->setText(display->text() + ".");
display->setText(display->text() + tr("."));
waitingForOperand = false;
}
//! [22]
@@ -299,7 +299,7 @@ void Calculator::changeSignClicked()
double value = text.toDouble();
if (value > 0.0) {
text.prepend("-");
text.prepend(tr("-"));
} else if (value < 0.0) {
text.remove(0, 1);
}
@@ -383,20 +383,20 @@ Button *Calculator::createButton(const QString &text, const char *member)
void Calculator::abortOperation()
{
clearAll();
display->setText("####");
display->setText(tr("####"));
}
//! [36]
//! [38]
bool Calculator::calculate(double rightOperand, const QString &pendingOperator)
{
if (pendingOperator == "+") {
if (pendingOperator == tr("+")) {
sumSoFar += rightOperand;
} else if (pendingOperator == "-") {
} else if (pendingOperator == tr("-")) {
sumSoFar -= rightOperand;
} else if (pendingOperator == "\303\227") {
} else if (pendingOperator == tr("\303\227")) {
factorSoFar *= rightOperand;
} else if (pendingOperator == "\303\267") {
} else if (pendingOperator == tr("\303\267")) {
if (rightOperand == 0.0)
return false;
factorSoFar /= rightOperand;

View File

@@ -1,20 +0,0 @@
cmake_minimum_required(VERSION 3.7.0)
project(sending_arguments LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
# SingleApplication base class
set(QAPPLICATION_CLASS QCoreApplication)
add_subdirectory(../.. SingleApplication)
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED)
add_executable(${PROJECT_NAME}
main.cpp
messagereceiver.cpp
messagereceiver.h
main.cpp
)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)

View File

@@ -11,9 +11,6 @@ int main(int argc, char *argv[])
// If this is a secondary instance
if( app.isSecondary() ) {
app.sendMessage( app.arguments().join(' ').toUtf8() );
qDebug() << "App already running.";
qDebug() << "Primary instance PID: " << app.primaryPid();
qDebug() << "Primary instance user: " << app.primaryUser();
return 0;
} else {
QObject::connect(

View File

@@ -1,6 +1,6 @@
// The MIT License (MIT)
//
// Copyright (c) Itay Grudev 2015 - 2020
// Copyright (c) Itay Grudev 2015 - 2018
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@@ -20,23 +20,29 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <QtCore/QElapsedTimer>
#include <QtCore/QTime>
#include <QtCore/QThread>
#include <QtCore/QDateTime>
#include <QtCore/QByteArray>
#include <QtCore/QSharedMemory>
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) // ### Qt 6: remove
#else
#if TODO_LIST
#pragma message("@TODO remove code for QT 5.10 or later")
#endif
#include <QRandomGenerator>
#endif
#include "singleapplication.h"
#include "singleapplication_p.h"
/**
* @brief Constructor. Checks and fires up LocalServer or closes the program
* if another instance already exists
* @param argc
* @param argv
* @param allowSecondary Whether to enable secondary instance support
* @param options Optional flags to toggle specific behaviour
* @param timeout Maximum time blocking functions are allowed during app load
@brief Constructor. Checks and fires up LocalServer or closes the program
if another instance already exists
@param argc
@param argv
@param {bool} allowSecondaryInstances
*/
SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary, Options options, int timeout, const QString &userData )
SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary, Options options, int timeout )
: app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) )
{
Q_D(SingleApplication);
@@ -51,18 +57,10 @@ SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSeconda
// Store the current mode of the program
d->options = options;
// Add any unique user data
if ( ! userData.isEmpty() )
d->addAppData( userData );
// Generating an application ID used for identifying the shared memory
// block and QLocalServer
d->genBlockServerName();
// To mitigate QSharedMemory issues with large amount of processes
// attempting to attach at the same time
SingleApplicationPrivate::randomSleep();
#ifdef Q_OS_UNIX
// By explicitly attaching it and then deleting it we make sure that the
// memory is deleted even after the process has crashed on Unix.
@@ -76,84 +74,69 @@ SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSeconda
// Create a shared memory block
if( d->memory->create( sizeof( InstancesInfo ) ) ) {
// Initialize the shared memory block
if( ! d->memory->lock() ){
qCritical() << "SingleApplication: Unable to lock memory block after create.";
abortSafely();
}
d->memory->lock();
d->initializeMemoryBlock();
d->memory->unlock();
} else {
if( d->memory->error() == QSharedMemory::AlreadyExists ){
// Attempt to attach to the memory segment
if( ! d->memory->attach() ) {
qCritical() << "SingleApplication: Unable to attach to shared memory block.";
abortSafely();
}
if( ! d->memory->lock() ){
qCritical() << "SingleApplication: Unable to lock memory block after attach.";
abortSafely();
}
} else {
qCritical() << "SingleApplication: Unable to create block.";
abortSafely();
qCritical() << d->memory->errorString();
delete d;
::exit( EXIT_FAILURE );
}
}
auto *inst = static_cast<InstancesInfo*>( d->memory->data() );
InstancesInfo* inst = static_cast<InstancesInfo*>( d->memory->data() );
QElapsedTimer time;
time.start();
// Make sure the shared memory block is initialised and in consistent state
while( true ) {
// If the shared memory block's checksum is valid continue
d->memory->lock();
if( d->blockChecksum() == inst->checksum ) break;
// If more than 5s have elapsed, assume the primary instance crashed and
// assume it's position
if( time.elapsed() > 5000 ) {
qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure.";
d->initializeMemoryBlock();
}
// Otherwise wait for a random period and try again. The random sleep here
// limits the probability of a collision between two racing apps and
// allows the app to initialise faster
if( ! d->memory->unlock() ){
qDebug() << "SingleApplication: Unable to unlock memory for random wait.";
qDebug() << d->memory->errorString();
}
SingleApplicationPrivate::randomSleep();
if( ! d->memory->lock() ){
qCritical() << "SingleApplication: Unable to lock memory after random wait.";
abortSafely();
}
d->memory->unlock();
// Random sleep here limits the probability of a collision between two racing apps
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) // ### Qt 6: remove
qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits<uint>::max() );
QThread::sleep( 8 + static_cast <unsigned long>( static_cast <float>( qrand() ) / RAND_MAX * 10 ) );
#else
#if TODO_LIST
#pragma message("@TODO remove code for QT 5.10 or later")
#endif
quint32 value = QRandomGenerator::global()->generate();
QThread::sleep( 8 + static_cast <unsigned long>( static_cast <float>( value ) / RAND_MAX * 10 ) );
#endif
}
if( inst->primary == false) {
d->startPrimary();
if( ! d->memory->unlock() ){
qDebug() << "SingleApplication: Unable to unlock memory after primary start.";
qDebug() << d->memory->errorString();
}
d->memory->unlock();
return;
}
// Check if another instance can be started
if( allowSecondary ) {
inst->secondary += 1;
inst->checksum = d->blockChecksum();
d->instanceNumber = inst->secondary;
d->startSecondary();
if( d->options & Mode::SecondaryNotification ) {
d->connectToPrimary( timeout, SingleApplicationPrivate::SecondaryInstance );
}
if( ! d->memory->unlock() ){
qDebug() << "SingleApplication: Unable to unlock memory after secondary start.";
qDebug() << d->memory->errorString();
}
d->memory->unlock();
return;
}
if( ! d->memory->unlock() ){
qDebug() << "SingleApplication: Unable to unlock memory at end of execution.";
qDebug() << d->memory->errorString();
}
d->memory->unlock();
d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance );
@@ -162,82 +145,40 @@ SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSeconda
::exit( EXIT_SUCCESS );
}
/**
@brief Destructor
*/
SingleApplication::~SingleApplication()
{
Q_D(SingleApplication);
delete d;
}
/**
* Checks if the current application instance is primary.
* @return Returns true if the instance is primary, false otherwise.
*/
bool SingleApplication::isPrimary() const
bool SingleApplication::isPrimary()
{
Q_D( const SingleApplication );
Q_D(SingleApplication);
return d->server != nullptr;
}
/**
* Checks if the current application instance is secondary.
* @return Returns true if the instance is secondary, false otherwise.
*/
bool SingleApplication::isSecondary() const
bool SingleApplication::isSecondary()
{
Q_D( const SingleApplication );
Q_D(SingleApplication);
return d->server == nullptr;
}
/**
* Allows you to identify an instance by returning unique consecutive instance
* ids. It is reset when the first (primary) instance of your app starts and
* only incremented afterwards.
* @return Returns a unique instance id.
*/
quint32 SingleApplication::instanceId() const
quint32 SingleApplication::instanceId()
{
Q_D( const SingleApplication );
Q_D(SingleApplication);
return d->instanceNumber;
}
/**
* Returns the OS PID (Process Identifier) of the process running the primary
* instance. Especially useful when SingleApplication is coupled with OS.
* specific APIs.
* @return Returns the primary instance PID.
*/
qint64 SingleApplication::primaryPid() const
qint64 SingleApplication::primaryPid()
{
Q_D( const SingleApplication );
Q_D(SingleApplication);
return d->primaryPid();
}
/**
* Returns the username the primary instance is running as.
* @return Returns the username the primary instance is running as.
*/
QString SingleApplication::primaryUser() const
{
Q_D( const SingleApplication );
return d->primaryUser();
}
/**
* Returns the username the current instance is running as.
* @return Returns the username the current instance is running as.
*/
QString SingleApplication::currentUser() const
{
return SingleApplicationPrivate::getUsername();
}
/**
* Sends message to the Primary Instance.
* @param message The message to send.
* @param timeout the maximum timeout in milliseconds for blocking functions.
* @return true if the message was sent successfully, false otherwise.
*/
bool SingleApplication::sendMessage( const QByteArray &message, int timeout )
bool SingleApplication::sendMessage( QByteArray message, int timeout )
{
Q_D(SingleApplication);
@@ -245,27 +186,10 @@ bool SingleApplication::sendMessage( const QByteArray &message, int timeout )
if( isPrimary() ) return false;
// Make sure the socket is connected
if( ! d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ) )
return false;
d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect );
return d->writeConfirmedMessage( timeout, message );
}
/**
* Cleans up the shared memory block and exits with a failure.
* This function halts program execution.
*/
void SingleApplication::abortSafely()
{
Q_D( SingleApplication );
qCritical() << "SingleApplication: " << d->memory->error() << d->memory->errorString();
delete d;
::exit( EXIT_FAILURE );
}
QStringList SingleApplication::userData() const
{
Q_D( const SingleApplication );
return d->appData();
d->socket->write( message );
bool dataWritten = d->socket->waitForBytesWritten( timeout );
d->socket->flush();
return dataWritten;
}

View File

@@ -25,6 +25,7 @@
#include <QtCore/QtGlobal>
#include <QtNetwork/QLocalSocket>
#include <QElapsedTimer>
#ifndef QAPPLICATION_CLASS
#define QAPPLICATION_CLASS QCoreApplication
@@ -35,26 +36,26 @@
class SingleApplicationPrivate;
/**
* @brief The SingleApplication class handles multiple instances of the same
* Application
* @see QCoreApplication
@brief The SingleApplication class handles multiple instances of the same
Application
@see QCoreApplication
*/
class SingleApplication : public QAPPLICATION_CLASS
{
Q_OBJECT
using app_t = QAPPLICATION_CLASS;
typedef QAPPLICATION_CLASS app_t;
public:
/**
* @brief Mode of operation of SingleApplication.
* Whether the block should be user-wide or system-wide and whether the
* primary instance should be notified when a secondary instance had been
* started.
* @note Operating system can restrict the shared memory blocks to the same
* user, in which case the User/System modes will have no effect and the
* block will be user wide.
* @enum
@brief Mode of operation of SingleApplication.
Whether the block should be user-wide or system-wide and whether the
primary instance should be notified when a secondary instance had been
started.
@note Operating system can restrict the shared memory blocks to the same
user, in which case the User/System modes will have no effect and the
block will be user wide.
@enum
*/
enum Mode {
User = 1 << 0,
@@ -66,78 +67,60 @@ public:
Q_DECLARE_FLAGS(Options, Mode)
/**
* @brief Intitializes a SingleApplication instance with argc command line
* arguments in argv
* @arg {int &} argc - Number of arguments in argv
* @arg {const char *[]} argv - Supplied command line arguments
* @arg {bool} allowSecondary - Whether to start the instance as secondary
* if there is already a primary instance.
* @arg {Mode} mode - Whether for the SingleApplication block to be applied
* User wide or System wide.
* @arg {int} timeout - Timeout to wait in milliseconds.
* @note argc and argv may be changed as Qt removes arguments that it
* recognizes
* @note Mode::SecondaryNotification only works if set on both the primary
* instance and the secondary instance.
* @note The timeout is just a hint for the maximum time of blocking
* operations. It does not guarantee that the SingleApplication
* initialisation will be completed in given time, though is a good hint.
* Usually 4*timeout would be the worst case (fail) scenario.
* @see See the corresponding QAPPLICATION_CLASS constructor for reference
@brief Intitializes a SingleApplication instance with argc command line
arguments in argv
@arg {int &} argc - Number of arguments in argv
@arg {const char *[]} argv - Supplied command line arguments
@arg {bool} allowSecondary - Whether to start the instance as secondary
if there is already a primary instance.
@arg {Mode} mode - Whether for the SingleApplication block to be applied
User wide or System wide.
@arg {int} timeout - Timeout to wait in milliseconds.
@note argc and argv may be changed as Qt removes arguments that it
recognizes
@note Mode::SecondaryNotification only works if set on both the primary
instance and the secondary instance.
@note The timeout is just a hint for the maximum time of blocking
operations. It does not guarantee that the SingleApplication
initialisation will be completed in given time, though is a good hint.
Usually 4*timeout would be the worst case (fail) scenario.
@see See the corresponding QAPPLICATION_CLASS constructor for reference
*/
explicit SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 1000, const QString &userData = {} );
~SingleApplication() override;
explicit SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 1000 );
~SingleApplication();
/**
* @brief Returns if the instance is the primary instance
* @returns {bool}
@brief Returns if the instance is the primary instance
@returns {bool}
*/
bool isPrimary() const;
bool isPrimary();
/**
* @brief Returns if the instance is a secondary instance
* @returns {bool}
@brief Returns if the instance is a secondary instance
@returns {bool}
*/
bool isSecondary() const;
bool isSecondary();
/**
* @brief Returns a unique identifier for the current instance
* @returns {qint32}
@brief Returns a unique identifier for the current instance
@returns {qint32}
*/
quint32 instanceId() const;
quint32 instanceId();
/**
* @brief Returns the process ID (PID) of the primary instance
* @returns {qint64}
@brief Returns the process ID (PID) of the primary instance
@returns {qint64}
*/
qint64 primaryPid() const;
qint64 primaryPid();
/**
* @brief Returns the username of the user running the primary instance
* @returns {QString}
@brief Sends a message to the primary instance. Returns true on success.
@param {int} timeout - Timeout for connecting
@returns {bool}
@note sendMessage() will return false if invoked from the primary
instance.
*/
QString primaryUser() const;
/**
* @brief Returns the username of the current user
* @returns {QString}
*/
QString currentUser() const;
/**
* @brief Sends a message to the primary instance. Returns true on success.
* @param {int} timeout - Timeout for connecting
* @returns {bool}
* @note sendMessage() will return false if invoked from the primary
* instance.
*/
bool sendMessage( const QByteArray &message, int timeout = 100 );
/**
* @brief Get the set user data.
* @returns {QStringList}
*/
QStringList userData() const;
bool sendMessage( QByteArray message, int timeout = 100 );
Q_SIGNALS:
void instanceStarted();
@@ -146,7 +129,6 @@ Q_SIGNALS:
private:
SingleApplicationPrivate *d_ptr;
Q_DECLARE_PRIVATE(SingleApplication)
void abortSafely();
};
Q_DECLARE_OPERATORS_FOR_FLAGS(SingleApplication::Options)

View File

@@ -1,8 +1,7 @@
QT += core network
CONFIG += c++11
CONFIG += c++17
HEADERS += $$PWD/SingleApplication \
$$PWD/singleapplication.h \
HEADERS += $$PWD/singleapplication.h \
$$PWD/singleapplication_p.h
SOURCES += $$PWD/singleapplication.cpp \
$$PWD/singleapplication_p.cpp

View File

@@ -1,6 +1,6 @@
// The MIT License (MIT)
//
// Copyright (c) Itay Grudev 2015 - 2020
// Copyright (c) Itay Grudev 2015 - 2018
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@@ -33,20 +33,12 @@
#include <cstddef>
#include <QtCore/QDir>
#include <QtCore/QThread>
#include <QtCore/QByteArray>
#include <QtCore/QDataStream>
#include <QtCore/QElapsedTimer>
#include <QtCore/QCryptographicHash>
#include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket>
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
#include <QtCore/QRandomGenerator>
#else
#include <QtCore/QDateTime>
#endif
#include "singleapplication.h"
#include "singleapplication_p.h"
@@ -57,9 +49,6 @@
#endif
#ifdef Q_OS_WIN
#ifndef NOMINMAX
#define NOMINMAX 1
#endif
#include <windows.h>
#include <lmcons.h>
#endif
@@ -70,7 +59,7 @@ SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr )
server = nullptr;
socket = nullptr;
memory = nullptr;
instanceNumber = 0;
instanceNumber = -1;
}
SingleApplicationPrivate::~SingleApplicationPrivate()
@@ -80,85 +69,35 @@ SingleApplicationPrivate::~SingleApplicationPrivate()
delete socket;
}
if( memory != nullptr ){
memory->lock();
auto *inst = static_cast<InstancesInfo*>(memory->data());
InstancesInfo* inst = static_cast<InstancesInfo*>(memory->data());
if( server != nullptr ) {
server->close();
delete server;
inst->primary = false;
inst->primaryPid = -1;
inst->primaryUser[0] = '\0';
inst->checksum = blockChecksum();
}
memory->unlock();
delete memory;
}
}
QString SingleApplicationPrivate::getUsername()
{
#ifdef Q_OS_WIN
wchar_t username[UNLEN + 1];
// Specifies size of the buffer on input
DWORD usernameLength = UNLEN + 1;
if( GetUserNameW( username, &usernameLength ) )
return QString::fromWCharArray( username );
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
return QString::fromLocal8Bit( qgetenv( "USERNAME" ) );
#else
return qEnvironmentVariable( "USERNAME" );
#endif
#endif
#ifdef Q_OS_UNIX
QString username;
uid_t uid = geteuid();
struct passwd *pw = getpwuid( uid );
if( pw )
username = QString::fromLocal8Bit( pw->pw_name );
if ( username.isEmpty() ){
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
username = QString::fromLocal8Bit( qgetenv( "USER" ) );
#else
username = qEnvironmentVariable( "USER" );
#endif
}
return username;
#endif
}
void SingleApplicationPrivate::genBlockServerName()
{
QCryptographicHash appData( QCryptographicHash::Sha256 );
#if QT_VERSION < QT_VERSION_CHECK(6, 3, 0)
appData.addData( "SingleApplication", 17 );
#else
appData.addData( QByteArrayView{"SingleApplication"} );
#endif
appData.addData( SingleApplication::app_t::applicationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() );
if ( ! appDataList.isEmpty() )
appData.addData( appDataList.join(QString()).toUtf8() );
if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) {
appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() );
}
if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) {
#if defined(Q_OS_WIN)
#ifdef Q_OS_WIN
appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() );
#elif defined(Q_OS_LINUX)
// If the application is running as an AppImage then the APPIMAGE env var should be used
// instead of applicationPath() as each instance is launched with its own executable path
const QByteArray appImagePath = qgetenv( "APPIMAGE" );
if( appImagePath.isEmpty() ){ // Not running as AppImage: use path to executable file
appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() );
} else { // Running as AppImage: Use absolute path to AppImage file
appData.addData( appImagePath );
};
#else
appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() );
#endif
@@ -166,34 +105,48 @@ void SingleApplicationPrivate::genBlockServerName()
// User level block requires a user specific data in the hash
if( options & SingleApplication::Mode::User ) {
appData.addData( getUsername().toUtf8() );
#ifdef Q_OS_WIN
wchar_t username [ UNLEN + 1 ];
// Specifies size of the buffer on input
DWORD usernameLength = UNLEN + 1;
if( GetUserNameW( username, &usernameLength ) ) {
appData.addData( QString::fromWCharArray(username).toUtf8() );
} else {
appData.addData( qgetenv("USERNAME") );
}
#endif
#ifdef Q_OS_UNIX
QByteArray username;
uid_t uid = geteuid();
struct passwd *pw = getpwuid(uid);
if( pw ) {
username = pw->pw_name;
}
if( username.isEmpty() ) {
username = qgetenv("USER");
}
appData.addData(username);
#endif
}
// Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with
// server naming requirements.
blockServerName = QString::fromUtf8(appData.result().toBase64().replace("/", "_"));
blockServerName = appData.result().toBase64().replace("/", "_");
}
void SingleApplicationPrivate::initializeMemoryBlock() const
void SingleApplicationPrivate::initializeMemoryBlock()
{
auto *inst = static_cast<InstancesInfo*>( memory->data() );
InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
inst->primary = false;
inst->secondary = 0;
inst->primaryPid = -1;
inst->primaryUser[0] = '\0';
inst->checksum = blockChecksum();
}
void SingleApplicationPrivate::startPrimary()
{
// Reset the number of connections
auto *inst = static_cast <InstancesInfo*>( memory->data() );
Q_Q(SingleApplication);
inst->primary = true;
inst->primaryPid = QCoreApplication::applicationPid();
qstrncpy( inst->primaryUser, getUsername().toUtf8().data(), sizeof(inst->primaryUser) );
inst->checksum = blockChecksum();
instanceNumber = 0;
// Successful creation means that no main process exists
// So we start a QLocalServer to listen for connections
QLocalServer::removeServer( blockServerName );
@@ -214,51 +167,47 @@ void SingleApplicationPrivate::startPrimary()
this,
&SingleApplicationPrivate::slotConnectionEstablished
);
// Reset the number of connections
InstancesInfo* inst = static_cast <InstancesInfo*>( memory->data() );
inst->primary = true;
inst->primaryPid = q->applicationPid();
inst->checksum = blockChecksum();
instanceNumber = 0;
}
void SingleApplicationPrivate::startSecondary()
{
auto *inst = static_cast <InstancesInfo*>( memory->data() );
inst->secondary += 1;
inst->checksum = blockChecksum();
instanceNumber = inst->secondary;
}
bool SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType )
void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType )
{
QElapsedTimer time;
time.start();
// Connect to the Local Server of the Primary Instance if not already
// connected.
if( socket == nullptr ) {
socket = new QLocalSocket();
}
if( socket->state() == QLocalSocket::ConnectedState ) return true;
// If already connected - we are done;
if( socket->state() == QLocalSocket::ConnectedState )
return;
if( socket->state() != QLocalSocket::ConnectedState ){
while( true ){
randomSleep();
if( socket->state() != QLocalSocket::ConnectingState )
// If not connect
if( socket->state() == QLocalSocket::UnconnectedState ||
socket->state() == QLocalSocket::ClosingState ) {
socket->connectToServer( blockServerName );
}
// Wait for being connected
if( socket->state() == QLocalSocket::ConnectingState ) {
socket->waitForConnected( static_cast<int>(msecs - time.elapsed()) );
}
// If connected break out of the loop
if( socket->state() == QLocalSocket::ConnectedState ) break;
// If elapsed time since start is longer than the method timeout return
if( time.elapsed() >= msecs ) return false;
}
socket->waitForConnected( msecs );
}
// Initialisation message according to the SingleApplication protocol
if( socket->state() == QLocalSocket::ConnectedState ) {
// Notify the parent that a new instance had been started;
QByteArray initMsg;
QDataStream writeStream(&initMsg, QIODevice::WriteOnly);
@@ -269,127 +218,105 @@ bool SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType conne
writeStream << blockServerName.toLatin1();
writeStream << static_cast<quint8>(connectionType);
writeStream << instanceNumber;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
quint16 checksum = qChecksum(QByteArray(initMsg.constData(), static_cast<quint32>(initMsg.length())));
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
quint16 checksum =
qChecksum(
initMsg.constData(),
static_cast<quint32>(initMsg.length()));
#else
quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length()));
#if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif
quint16 checksum =
qChecksum(
QByteArrayView(
initMsg.constData(),
static_cast<quint32>(initMsg.length())));
#endif
writeStream << checksum;
return writeConfirmedMessage( static_cast<int>(msecs - time.elapsed()), initMsg );
}
void SingleApplicationPrivate::writeAck( QLocalSocket *sock ) {
sock->putChar('\n');
}
bool SingleApplicationPrivate::writeConfirmedMessage (int msecs, const QByteArray &msg)
{
QElapsedTimer time;
time.start();
// Frame 1: The header indicates the message length that follows
// The header indicates the message length that follows
QByteArray header;
QDataStream headerStream(&header, QIODevice::WriteOnly);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
headerStream.setVersion(QDataStream::Qt_5_6);
#endif
headerStream << static_cast <quint64>( msg.length() );
headerStream << static_cast <quint64>( initMsg.length() );
if( ! writeConfirmedFrame( static_cast<int>(msecs - time.elapsed()), header ))
return false;
// Frame 2: The message
return writeConfirmedFrame( static_cast<int>(msecs - time.elapsed()), msg );
}
bool SingleApplicationPrivate::writeConfirmedFrame( int msecs, const QByteArray &msg )
{
socket->write( msg );
socket->write( header );
socket->write( initMsg );
socket->flush();
bool result = socket->waitForReadyRead( msecs ); // await ack byte
if (result) {
socket->read( 1 );
return true;
socket->waitForBytesWritten( msecs );
}
}
return false;
}
quint16 SingleApplicationPrivate::blockChecksum() const
quint16 SingleApplicationPrivate::blockChecksum()
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
quint16 checksum = qChecksum(QByteArray(static_cast<const char*>(memory->constData()), offsetof(InstancesInfo, checksum)));
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
return qChecksum(
static_cast <const char *>( memory->data() ),
offsetof( InstancesInfo, checksum )
);
#else
quint16 checksum = qChecksum(static_cast<const char*>(memory->constData()), offsetof(InstancesInfo, checksum));
#if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif
return qChecksum(
QByteArrayView(
static_cast <const char *>( memory->data() ),
offsetof( InstancesInfo, checksum )));
#endif
return checksum;
}
qint64 SingleApplicationPrivate::primaryPid() const
qint64 SingleApplicationPrivate::primaryPid()
{
qint64 pid;
memory->lock();
auto *inst = static_cast<InstancesInfo*>( memory->data() );
InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
pid = inst->primaryPid;
memory->unlock();
return pid;
}
QString SingleApplicationPrivate::primaryUser() const
{
QByteArray username;
memory->lock();
auto *inst = static_cast<InstancesInfo*>( memory->data() );
username = inst->primaryUser;
memory->unlock();
return QString::fromUtf8( username );
}
/**
* @brief Executed when a connection has been made to the LocalServer
@brief Executed when a connection has been made to the LocalServer
*/
void SingleApplicationPrivate::slotConnectionEstablished()
{
QLocalSocket *nextConnSocket = server->nextPendingConnection();
connectionMap.insert(nextConnSocket, ConnectionInfo());
QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose, this,
QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose,
[nextConnSocket, this]() {
auto &info = connectionMap[nextConnSocket];
this->slotClientConnectionClosed( nextConnSocket, info.instanceId );
Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId );
}
);
QObject::connect(nextConnSocket, &QLocalSocket::disconnected, nextConnSocket, &QLocalSocket::deleteLater);
QObject::connect(nextConnSocket, &QLocalSocket::destroyed, this,
QObject::connect(nextConnSocket, &QLocalSocket::disconnected,
[nextConnSocket, this](){
connectionMap.remove(nextConnSocket);
nextConnSocket->deleteLater();
}
);
QObject::connect(nextConnSocket, &QLocalSocket::readyRead, this,
QObject::connect(nextConnSocket, &QLocalSocket::readyRead,
[nextConnSocket, this]() {
auto &info = connectionMap[nextConnSocket];
switch(info.stage) {
case StageInitHeader:
readMessageHeader( nextConnSocket, StageInitBody );
case StageHeader:
readInitMessageHeader(nextConnSocket);
break;
case StageInitBody:
case StageBody:
readInitMessageBody(nextConnSocket);
break;
case StageConnectedHeader:
readMessageHeader( nextConnSocket, StageConnectedBody );
break;
case StageConnectedBody:
this->slotDataAvailable( nextConnSocket, info.instanceId );
case StageConnected:
Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId );
break;
default:
break;
@@ -398,7 +325,7 @@ void SingleApplicationPrivate::slotConnectionEstablished()
);
}
void SingleApplicationPrivate::readMessageHeader( QLocalSocket *sock, SingleApplicationPrivate::ConnectionStage nextStage )
void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock )
{
if (!connectionMap.contains( sock )) {
return;
@@ -418,35 +345,29 @@ void SingleApplicationPrivate::readMessageHeader( QLocalSocket *sock, SingleAppl
quint64 msgLen = 0;
headerStream >> msgLen;
ConnectionInfo &info = connectionMap[sock];
info.stage = nextStage;
info.stage = StageBody;
info.msgLen = msgLen;
writeAck( sock );
if ( sock->bytesAvailable() >= (qint64) msgLen ) {
readInitMessageBody( sock );
}
bool SingleApplicationPrivate::isFrameComplete( QLocalSocket *sock )
{
if (!connectionMap.contains( sock )){
return false;
}
ConnectionInfo &info = connectionMap[sock];
if( sock->bytesAvailable() < ( qint64 )info.msgLen ){
return false;
}
return true;
}
void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
{
Q_Q(SingleApplication);
if( !isFrameComplete( sock ) )
if (!connectionMap.contains( sock )) {
return;
}
ConnectionInfo &info = connectionMap[sock];
if( sock->bytesAvailable() < ( qint64 )info.msgLen ) {
return;
}
// Read the message body
QByteArray msgBytes = sock->readAll();
QByteArray msgBytes = sock->read(info.msgLen);
QDataStream readStream(msgBytes);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
@@ -471,12 +392,21 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
quint16 msgChecksum = 0;
readStream >> msgChecksum;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
const quint16 actualChecksum = qChecksum(QByteArray(msgBytes.constData(), static_cast<quint32>(msgBytes.length() - sizeof(quint16))));
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
const quint16 actualChecksum =
qChecksum(
msgBytes.constData(),
static_cast<quint32>( msgBytes.length() - sizeof( quint16 ) ) );
#else
const quint16 actualChecksum = qChecksum(msgBytes.constData(), static_cast<quint32>(msgBytes.length() - sizeof(quint16)));
#if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif
const quint16 actualChecksum =
qChecksum(
QByteArrayView(
msgBytes.constData(),
static_cast<quint32>(msgBytes.length() - sizeof(quint16))));
#endif
bool isValid = readStream.status() == QDataStream::Ok &&
QLatin1String(latin1Name) == blockServerName &&
msgChecksum == actualChecksum;
@@ -486,9 +416,8 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
return;
}
ConnectionInfo &info = connectionMap[sock];
info.instanceId = instanceId;
info.stage = StageConnectedHeader;
info.stage = StageConnected;
if( connectionType == NewInstance ||
( connectionType == SecondaryInstance &&
@@ -497,48 +426,19 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
Q_EMIT q->instanceStarted();
}
writeAck( sock );
if (sock->bytesAvailable() > 0) {
Q_EMIT this->slotDataAvailable( sock, instanceId );
}
}
void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId )
{
Q_Q(SingleApplication);
if ( !isFrameComplete( dataSocket ) )
return;
const QByteArray message = dataSocket->readAll();
writeAck( dataSocket );
ConnectionInfo &info = connectionMap[dataSocket];
info.stage = StageConnectedHeader;
Q_EMIT q->receivedMessage( instanceId, message);
Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() );
}
void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId )
{
if( closedSocket->bytesAvailable() > 0 )
slotDataAvailable( closedSocket, instanceId );
}
void SingleApplicationPrivate::randomSleep()
{
#if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 )
QThread::msleep( QRandomGenerator::global()->bounded( 8u, 18u ));
#else
qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits<uint>::max() );
QThread::msleep( qrand() % 11 + 8);
#endif
}
void SingleApplicationPrivate::addAppData(const QString &data)
{
appDataList.push_back(data);
}
QStringList SingleApplicationPrivate::appData() const
{
return appDataList;
Q_EMIT slotDataAvailable( closedSocket, instanceId );
}

View File

@@ -1,6 +1,6 @@
// The MIT License (MIT)
//
// Copyright (c) Itay Grudev 2015 - 2020
// Copyright (c) Itay Grudev 2015 - 2016
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@@ -41,14 +41,15 @@ struct InstancesInfo {
bool primary;
quint32 secondary;
qint64 primaryPid;
char primaryUser[128];
quint16 checksum; // Must be the last field
quint16 checksum;
};
struct ConnectionInfo {
qint64 msgLen = 0;
quint32 instanceId = 0;
quint8 stage = 0;
explicit ConnectionInfo() :
msgLen(0), instanceId(0), stage(0) {}
qint64 msgLen;
quint32 instanceId;
quint8 stage;
};
class SingleApplicationPrivate : public QObject {
@@ -61,34 +62,24 @@ public:
Reconnect = 3
};
enum ConnectionStage : quint8 {
StageInitHeader = 0,
StageInitBody = 1,
StageConnectedHeader = 2,
StageConnectedBody = 3,
StageHeader = 0,
StageBody = 1,
StageConnected = 2,
};
Q_DECLARE_PUBLIC(SingleApplication)
SingleApplicationPrivate( SingleApplication *q_ptr );
~SingleApplicationPrivate() override;
~SingleApplicationPrivate();
static QString getUsername();
void genBlockServerName();
void initializeMemoryBlock() const;
void initializeMemoryBlock();
void startPrimary();
void startSecondary();
bool connectToPrimary( int msecs, ConnectionType connectionType );
quint16 blockChecksum() const;
qint64 primaryPid() const;
QString primaryUser() const;
bool isFrameComplete(QLocalSocket *sock);
void readMessageHeader(QLocalSocket *socket, ConnectionStage nextStage);
void connectToPrimary(int msecs, ConnectionType connectionType );
quint16 blockChecksum();
qint64 primaryPid();
void readInitMessageHeader(QLocalSocket *socket);
void readInitMessageBody(QLocalSocket *socket);
void writeAck(QLocalSocket *sock);
bool writeConfirmedFrame(int msecs, const QByteArray &msg);
bool writeConfirmedMessage(int msecs, const QByteArray &msg);
static void randomSleep();
void addAppData(const QString &data);
QStringList appData() const;
SingleApplication *q_ptr;
QSharedMemory *memory;
@@ -98,7 +89,6 @@ public:
QString blockServerName;
SingleApplication::Options options;
QMap<QLocalSocket*, ConnectionInfo> connectionMap;
QStringList appDataList;
public Q_SLOTS:
void slotConnectionEstablished();

View File

@@ -1,7 +1,7 @@
{
"id": "org.qelectrotech.QElectroTech",
"runtime": "org.kde.Platform",
"runtime-version": "5.15",
"runtime-version": "5.14",
"sdk": "org.kde.Sdk",
"command": "qelectrotech",
"rename-desktop-file": "qelectrotech.desktop",
@@ -10,63 +10,17 @@
"copy-icon": true,
"finish-args": [
"--socket=wayland",
"--socket=fallback-x11",
"--socket=x11",
"--device=dri",
"--share=ipc",
"--share=network",
"--socket=cups",
"--filesystem=host"
],
"modules": [
{
"name": "tkinter",
"buildsystem": "simple",
"build-commands": [
"pip3 install --prefix=${FLATPAK_DEST} ."
],
"sources": [
{
"type": "git",
"url": "https://github.com/iwalton3/tkinter-standalone",
"commit": "2301112d142ebaf7532b25600c77d1a2edc9ef04"
}
],
"modules": [
{
"name": "tcl",
"sources": [
{
"type": "archive",
"url": "https://sourceforge.net/projects/tcl/files/Tcl/8.6.11/tcl8.6.11-src.tar.gz",
"sha256": "8c0486668586672c5693d7d95817cb05a18c5ecca2f40e2836b9578064088258"
}
],
"subdir": "unix",
"post-install": [
"chmod +w ${FLATPAK_DEST}/lib/libtcl8.6.so"
]
},
{
"name": "tk",
"sources": [
{
"type": "archive",
"url": "https://sourceforge.net/projects/tcl/files/Tcl/8.6.11/tk8.6.11-src.tar.gz",
"sha256": "5228a8187a7f70fa0791ef0f975270f068ba9557f57456f51eb02d9d4ea31282"
}
],
"subdir": "unix",
"post-install": [
"chmod +w ${FLATPAK_DEST}/lib/libtk8.6.so"
]
}
]
},
{
"name": "qelectrotech",
"buildsystem": "qmake",
"post-install": [
"mv ${FLATPAK_DEST}/share/mime/packages/qelectrotech.xml ${FLATPAK_DEST}/share/mime/packages/org.qelectrotech.QElectroTech.xml"
"mv /app/share/mime/packages/qelectrotech.xml /app/share/mime/packages/org.qelectrotech.QElectroTech.xml"
],
"sources": [
{
@@ -78,34 +32,6 @@
"path": "patches/0001-build-Fix-the-installation-paths.patch"
}
]
},
{
"name": "python3-PySimpleGUI",
"buildsystem": "simple",
"build-commands": [
"pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} PySimpleGUI"
],
"sources": [
{
"type": "file",
"url": "https://files.pythonhosted.org/packages/d0/c3/c1ce811a1e48d5e0f2df0b393ff189fae4842ec840bb6e4db79c8da55e74/PySimpleGUI-4.41.2.tar.gz",
"sha256": "cf42d9f61f28c8e790a9c031ce900a9cee5fd2f950da2f055ed36bbc487dcf11"
}
]
},
{
"name": "python3-qet-tb-generator",
"buildsystem": "simple",
"build-commands": [
"pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} qet-tb-generator"
],
"sources": [
{
"type": "file",
"url": "https://files.pythonhosted.org/packages/70/aa/ebde0dddfbde799a4e8cf0564e52f95089105a7f562739ee1d16ff5a495a/qet_tb_generator-1.3.1.tar.gz",
"sha256": "52c9836387d54bc30ea29272068ec156fc65c3905e0cb863afd9418abc3c0907"
}
]
}
]
}

View File

@@ -1,17 +1,17 @@
From 14f0685ddcf3a7d64bb85a3e9a9ac97c369bb508 Mon Sep 17 00:00:00 2001
From 2a390b5188fe070295090b1bd37273d12963b371 Mon Sep 17 00:00:00 2001
From: Laurent Trinques <scorpio@qelectrotech.org>
Date: Sat, 26 Sep 2020 22:52:52 +0200
Subject: [PATCH] build: Fix the installation paths
---
qelectrotech.pro | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
qelectrotech.pro | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/qelectrotech.pro b/qelectrotech.pro
index 7baddbb08..5dcda04b6 100644
index 2901a30d5..1019a9870 100644
--- a/qelectrotech.pro
+++ b/qelectrotech.pro
@@ -5,18 +5,18 @@
@@ -5,20 +5,20 @@
# Chemins utilises pour la compilation et l'installation de QET
unix {
# Chemins UNIX
@@ -25,8 +25,12 @@ index 7baddbb08..5dcda04b6 100644
QET_LANG_PATH = 'share/qelectrotech/lang/'
QET_EXAMPLES_PATH = 'share/qelectrotech/examples/'
- QET_LICENSE_PATH = 'doc/qelectrotech/'
- QET_MIME_XML_PATH = '../share/mime/application/'
- QET_MIME_DESKTOP_PATH = '../share/mimelnk/application/'
- QET_MIME_PACKAGE_PATH = '../share/mime/packages/'
+ QET_LICENSE_PATH = 'share/doc/qelectrotech/'
+ QET_MIME_XML_PATH = 'share/mime/application/'
+ QET_MIME_DESKTOP_PATH = 'share/mimelnk/application/'
+ QET_MIME_PACKAGE_PATH = 'share/mime/packages/'
QET_DESKTOP_PATH = 'share/applications/'
QET_ICONS_PATH = 'share/icons/hicolor/'
@@ -36,5 +40,5 @@ index 7baddbb08..5dcda04b6 100644
}
win32 {
--
2.35.1
2.28.0

18
build-aux/snap/local/launchers/qelectrotech-launch Normal file → Executable file
View File

@@ -1,5 +1,15 @@
#!/bin/sh
# a KDE session forces the KDE Plasma platformtheme which is incompatible with QET
# unset the ENV vars in that case to prevent loading of the theme
if [ ! -z "$KDE_FULL_SESSION" ]; then
unset KDE_FULL_SESSION
fi
if echo "$XDG_CURRENT_DESKTOP" | grep -q KDE; then
unset XDG_CURRENT_DESKTOP
fi
# migrate .qet directory from SNAP_USER_DATA to SNAP_USER_COMMON
from="$SNAP_USER_DATA/.qet"
to="$SNAP_USER_COMMON/.qet"
@@ -13,4 +23,12 @@ fi
mkdir -p "$HOME/.qet"
ln -snf "$SNAP/bin/DXFtoQET" "$HOME/.qet/DXFtoQET"
# start desktop portal. Open & save dialogs might fail if it is not running
dbus-send --print-reply \
--dest=org.freedesktop.DBus \
/org/freedesktop/DBus \
org.freedesktop.DBus.StartServiceByName \
string:org.freedesktop.portal.Desktop \
uint32:0
exec "${@}"

View File

@@ -1,6 +1,6 @@
name: qelectrotech
title: QElectroTech
base: core20
base: core18
adopt-info: qelectrotech
license: GPL-2.0
summary: Electrical diagram editor
@@ -10,7 +10,6 @@ description: |
grade: stable
confinement: strict
compression: lzo
architectures:
- build-on: amd64
@@ -31,14 +30,15 @@ apps:
extensions: [kde-neon]
plugs: &plugs [opengl, unity7, home, removable-media, gsettings, network, cups-control]
environment: &env
__EGL_VENDOR_LIBRARY_DIRS: $SNAP/kf5/usr/share/glvnd/egl_vendor.d:$SNAP/usr/share/glvnd/egl_vendor.d
TCL_LIBRARY: $SNAP/usr/share/tcltk/tcl8.6
QT_QPA_PLATFORMTHEME: gtk3
QT_AUTO_SCREEN_SCALE_FACTOR: 1
HOME: $SNAP_USER_COMMON
PYTHONPATH: $SNAP:$SNAP/lib/python3.8/site-packages:$SNAP/usr/lib/python3.8:$SNAP/usr/lib/python3.8/lib-dynload
PYTHONPATH: $SNAP:$SNAP/lib/python3.6/site-packages:$SNAP/usr/lib/python3.6:$SNAP/usr/lib/python3.6/lib-dynload
qet-tb-generator:
command: bin/qet_tb_generator
command-chain:
- bin/qelectrotech-launch
command: bin/qelectrotech-launch $SNAP/bin/qet_tb_generator
extensions: [kde-neon]
plugs: *plugs
environment: *env
@@ -58,8 +58,8 @@ parts:
qet-tb-generator:
plugin: python
source: https://github.com/raulroda/qet_tb_generator-plugin.git
python-packages: [PySimpleGUI]
python-version: python3
source: https://github.com/qelectrotech/qet_tb_generator.git
stage-packages:
- python3-lxml
- python3-tk
@@ -68,14 +68,14 @@ parts:
kde-sdk-setup:
plugin: nil
build-snaps:
- kde-frameworks-5-qt-5-15-3-core20-sdk
- kde-frameworks-5-core18-sdk
build-packages:
- g++
- mesa-common-dev
- libglvnd-dev
- rsync
override-build: |
rsync -a --ignore-existing /snap/kde-frameworks-5-qt-5-15-3-core20-sdk/current/ /
rsync -a --ignore-existing /snap/kde-frameworks-5-core18-sdk/current/ /
dxf-to-qet:
after: [kde-sdk-setup]
@@ -91,18 +91,19 @@ parts:
after: [kde-sdk-setup]
plugin: nil
source: .
stage-packages: [ git, sqlite3, xdg-user-dirs ]
stage-packages: [ git, sqlite3 ]
build-packages:
- git
- libsqlite3-dev
override-build: |
displayed_version=$(grep "displayedVersion" sources/qet.h | tr -d "\";" | cut -d" " -f5)
snap_version="${displayed_version}-g$(git rev-parse --short=8 HEAD)"
modified_displayed_version="${snap_version}.snap"
override-pull: |
snapcraftctl pull
snap_version=$(git describe --dirty)
modified_displayed_version=$snap_version".snap"
sed -i -E "s|const QString displayedVersion =.*|const QString displayedVersion =\"$modified_displayed_version\";|" sources/qet.h
snapcraftctl set-version "$snap_version"
override-build: |
qmake "$SNAPCRAFT_PART_SRC/qelectrotech.pro"
make -j${SNAPCRAFT_PARALLEL_BUILD_COUNT}
make -j$(nproc)
make install INSTALL_ROOT="$SNAPCRAFT_PART_INSTALL"
override-stage: |
snapcraftctl stage
@@ -113,14 +114,11 @@ parts:
cleanup:
after: [qelectrotech, dxf-to-qet, qet-tb-generator]
plugin: nil
build-snaps: [kde-frameworks-5-qt-5-15-3-core20]
build-snaps: [core18, kde-frameworks-5-core18]
override-prime: |
# Remove all files from snap that are already included in the base snap or in
# any connected content snaps
set -eux
for snap in "kde-frameworks-5-qt-5-15-3-core20"; do # List all content-snaps you're using here
cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" "$SNAPCRAFT_PRIME/usr/{}" \;
for snap in "core18" "kde-frameworks-5-core18"; do # List all content-snaps and base snaps you're using here
cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" \;
done
for cruft in bug lintian man; do
rm -rf $SNAPCRAFT_PRIME/usr/share/$cruft
done
find $SNAPCRAFT_PRIME/usr/share/doc/ -type f -not -name 'copyright' -delete
find $SNAPCRAFT_PRIME/usr/share -type d -empty -delete

0
build-aux/windows/Lancer QET.bat Executable file → Normal file
View File

View File

@@ -1,34 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(
"_____________________________________________________________________"
"\nCopyright 2006 The QElectroTech Team"
"\nThis file is part of QElectroTech."
"\n\nQElectroTech is free software: you can redistribute it and/or modify"
"\nit under the terms of the GNU General Public License as published by"
"\nthe Free Software Foundation, either version 2 of the License, or"
"\n(at your option) any later version."
"\nQElectroTech is distributed in the hope that it will be useful,"
"\nbut WITHOUT ANY WARRANTY; without even the implied warranty of"
"\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"
"\nGNU General Public License for more details."
"\n\nYou should have received a copy of the GNU General Public License"
"\nalong with QElectroTech. If not, see <http://www.gnu.org/licenses/>.\n"
"_____________________________________________________________________")

View File

@@ -1,71 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
# Paths used for compilation and installation of QET
message(" - define_definitions")
message("Paths used for compilation and installation of QET")
message("--------------------------------------------------")
message("COMPIL_PREFIX " ${COMPIL_PREFIX})
message("INSTALL_PREFIX " ${INSTALL_PREFIX})
message("QET_BINARY_PATH " ${QET_BINARY_PATH})
if(${QET_COMMON_COLLECTION_PATH} STRGREATER "")
message("QET_COMMON_COLLECTION_PATH " ${INSTALL_PREFIX}${QET_COMMON_COLLECTION_PATH})
add_definitions(-DQET_COMMON_COLLECTION_PATH=${INSTALL_PREFIX}${QET_COMMON_COLLECTION_PATH})
endif()
if(${QET_COMMON_TBT_PATH} STRGREATER "")
message("QET_COMMON_TBT_PATH " ${INSTALL_PREFIX}${QET_COMMON_TBT_PATH})
add_definitions(-DQET_COMMON_TBT_PATH=${INSTALL_PREFIX}${QET_COMMON_TBT_PATH})
endif()
if(${QET_LANG_PATH_RELATIVE_TO_BINARY_PATH})
add_definitions(-DQET_LANG_PATH_RELATIVE_TO_BINARY_PATH)
endif()
if(${QET_LANG_PATH} STRGREATER "")
message("QET_LANG_PATH " ${INSTALL_PREFIX}${QET_LANG_PATH})
add_definitions(-DQET_LANG_PATH=${INSTALL_PREFIX}${QET_LANG_PATH})
endif()
if (NOT MINGW)
if(${QET_EXAMPLES_PATH} STRGREATER "")
message("QET_EXAMPLES_PATH " ${INSTALL_PREFIX}${QET_EXAMPLES_PATH})
add_definitions(-DQET_EXAMPLES_PATH=${INSTALL_PREFIX}${QET_EXAMPLES_PATH})
endif()
endif()
message("QET_LICENSE_PATH " ${QET_LICENSE_PATH})
message("QET_MIME_PACKAGE_PATH " ${QET_MIME_PACKAGE_PATH})
message("QET_DESKTOP_PATH " ${QET_DESKTOP_PATH})
message("QET_ICONS_PATH " ${QET_ICONS_PATH})
message("QET_MAN_PATH " ${QET_MAN_PATH})
message("QET_APPDATA_PATH " ${QET_APPDATA_PATH})
message("ICON " ${ICON})
message("--------------------------------------------------")
message("PROJECT_NAME :" ${PROJECT_NAME})
message("PROJECT_VERSION :" ${PROJECT_VERSION})
message("PROJECT_DESCRIPTION :" ${PROJECT_DESCRIPTION})
message("PROJECT_HOMEPAGE_URL :" ${PROJECT_HOMEPAGE_URL})
message("PROJECT_SOURCE_DIR :" ${PROJECT_SOURCE_DIR})
message("QET_DIR :" ${QET_DIR})
message("GIT_COMMIT_SHA :" ${GIT_COMMIT_SHA})
if(BUILD_WITH_KF5)
message("KF5_GIT_TAG :" ${KF5_GIT_TAG})
else()
add_definitions(-DBUILD_WITHOUT_KF5)
endif()
message("QET_COMPONENTS :" ${QET_COMPONENTS})
message("QT_VERSION_MAJOR :" ${QT_VERSION_MAJOR})

View File

@@ -1,35 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - developer_options")
# warn on *any* usage of deprecated APIs
add_definitions(-DQT_DEPRECATED_WARNINGS)
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# disables all the APIs deprecated before Qt 6.0.0
#add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x060000)
# to enable function names and line numbers even for release builds
add_definitions(-DQT_MESSAGELOGCONTEXT)
# You can make your code warn on compile time for the TODO's
# In order to do so, uncomment the following line.
#add_definitions(-DTODO_LIST)
# Build with KF5
option(BUILD_WITH_KF5 "Build with KF5" ON)

View File

@@ -1,67 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - fetch_kdeaddons")
if(DEFINED BUILD_WITH_KF5)
Include(FetchContent)
option(BUILD_KF5 "Build KF5 libraries, use system ones otherwise" YES)
if(BUILD_KF5)
if(NOT DEFINED KF5_GIT_TAG)
#https://qelectrotech.org/forum/viewtopic.php?pid=13924#p13924
set(KF5_GIT_TAG v5.77.0)
endif()
# Fix stop the run autotests of kcoreaddons
# see
# https://invent.kde.org/frameworks/kcoreaddons/-/blob/master/CMakeLists.txt#L98
# issue:
# CMake Error at /usr/share/ECM/modules/ECMAddTests.cmake:89 (add_executable):
# Cannot find source file:
# see
# https://qelectrotech.org/forum/viewtopic.php?pid=13929#p13929
set(KDE_SKIP_TEST_SETTINGS "TRUE")
set(BUILD_TESTING "0")
FetchContent_Declare(
ecm
GIT_REPOSITORY https://invent.kde.org/frameworks/extra-cmake-modules.git
GIT_TAG ${KF5_GIT_TAG})
FetchContent_MakeAvailable(ecm)
FetchContent_Declare(
kcoreaddons
GIT_REPOSITORY https://invent.kde.org/frameworks/kcoreaddons.git
GIT_TAG ${KF5_GIT_TAG})
FetchContent_MakeAvailable(kcoreaddons)
FetchContent_Declare(
kwidgetsaddons
GIT_REPOSITORY https://invent.kde.org/frameworks/kwidgetsaddons.git
GIT_TAG ${KF5_GIT_TAG})
FetchContent_MakeAvailable(kwidgetsaddons)
else()
find_package(KF5CoreAddons REQUIRED)
find_package(KF5WidgetsAddons REQUIRED)
endif()
set(KF5_PRIVATE_LIBRARIES
KF5::WidgetsAddons
KF5::CoreAddons
)
endif()

View File

@@ -1,33 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - fetch_pugixml")
Include(FetchContent)
option(BUILD_PUGIXML "Build pugixml library, use system one otherwise" YES)
if(BUILD_PUGIXML)
FetchContent_Declare(
pugixml
GIT_REPOSITORY https://github.com/zeux/pugixml.git
GIT_TAG v1.11.4)
FetchContent_MakeAvailable(pugixml)
else()
find_package(pugixml REQUIRED)
endif()

View File

@@ -1,31 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - fetch_singleapplication")
# https://github.com/itay-grudev/SingleApplication/issues/18
#qmake
#DEFINES += QAPPLICATION_CLASS=QGuiApplication
set(QAPPLICATION_CLASS QApplication)
Include(FetchContent)
FetchContent_Declare(
SingleApplication
GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication.git
GIT_TAG v3.2.0)
FetchContent_MakeAvailable(SingleApplication)

View File

@@ -1,41 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - git_last_commit_sha")
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
#get GIT COMMIT SHA
execute_process(
COMMAND ${GIT_EXECUTABLE} -C ${QET_DIR} rev-parse --verify HEAD
OUTPUT_VARIABLE GIT_COMMIT_SHA
RESULT_VARIABLE GIT_COMMIT_RESULT)
# This strips terminating newline in the variable
string(REGEX REPLACE "\n$" "" GIT_COMMIT_SHA "${GIT_COMMIT_SHA}")
if(NOT GIT_COMMIT_RESULT EQUAL "0")
message(
FATAL_ERROR
"git rev-parse --verify HEAD failed with "
${GIT_COMMIT_RESULT}
", please check")
endif()
endif()
# This adds to definitions => .cpp
add_definitions(-DGIT_COMMIT_SHA="${GIT_COMMIT_SHA}")

View File

@@ -1,35 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - git_update_submodules")
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
# updates all git submodules
execute_process(
COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_SUBMOD_RESULT)
if(NOT GIT_SUBMOD_RESULT EQUAL "0")
message(
FATAL_ERROR
"git submodule update --init failed with "
${GIT_SUBMOD_RESULT}
", please checkout submodules")
endif()
endif()

View File

@@ -1,25 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
if(${CMAKE_VERSION} VERSION_LESS 3.14)
message(
"_____________________________________________________________________")
message("to update Cmake on linux:")
message("https://github.com/Kitware/CMake/")
message("linux => cmake-3.19.1-Linux-x86_64.sh")
message(" sudo ./cmake.sh --prefix=/usr/local/ --exclude-subdir")
message("windows good luck :)")
endif()

View File

@@ -1,65 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
# Paths used for compilation and installation of QET
message(" - paths_compilation_installation")
if(UNIX AND NOT APPLE)
# for Linux, BSD, Solaris, Minix
set(COMPIL_PREFIX "/usr/local/")
set(INSTALL_PREFIX "/usr/local/")
set(QET_BINARY_PATH "bin/")
set(QET_COMMON_COLLECTION_PATH "share/qelectrotech/elements/")
set(QET_COMMON_TBT_PATH "share/qelectrotech/titleblocks/")
set(QET_LANG_PATH "share/qelectrotech/lang/")
set(QET_EXAMPLES_PATH "share/qelectrotech/examples/")
set(QET_LICENSE_PATH "doc/qelectrotech/")
set(QET_MIME_PACKAGE_PATH "../share/mime/packages/")
set(QET_DESKTOP_PATH "share/applications/")
set(QET_ICONS_PATH "share/icons/hicolor/")
set(QET_MAN_PATH "man/")
set(QET_APPDATA_PATH "share/appdata")
endif()
if(APPLE)
# for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
set(COMPIL_PREFIX "./")
set(INSTALL_PREFIX "/usr/local/")
set(QET_BINARY_PATH "bin/")
set(QET_COMMON_COLLECTION_PATH "../Resources/elements/")
set(QET_COMMON_TBT_PATH "../Resources/titleblocks/")
set(QET_LANG_PATH "../Resources/lang/")
set(QET_EXAMPLES_PATH "share/qelectrotech/examples/")
set(QET_LICENSE_PATH "doc/qelectrotech/")
set(QET_DESKTOP_PATH "share/applications/")
set(QET_ICONS_PATH "share/icons/hicolor/")
set(QET_MAN_PATH "man/")
set(ICON "ico/mac_icon/qelectrotech.icns")
endif()
if(WIN32)
# for Windows operating system in general
set(COMPIL_PREFIX "./")
set(INSTALL_PREFIX "./")
set(QET_BINARY_PATH "./")
set(QET_COMMON_COLLECTION_PATH "elements/")
set(QET_COMMON_TBT_PATH "titleblocks/")
set(QET_LANG_PATH "l10n/")
set(QET_LICENSE_PATH "./")
# Liste des ressources Windows
#RC_FILE = qelectrotech.rc
endif()

View File

@@ -1,644 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - qet_compilation_vars")
set(QET_COMPONENTS
LinguistTools
PrintSupport
Xml
Svg
Sql
Network
Widgets
Concurrent)
set(QET_PRIVATE_LIBRARIES
Qt::PrintSupport
Qt::Gui
Qt::Xml
Qt::Svg
Qt::Sql
Qt::Network
Qt::Widgets
Qt::Concurrent
)
set(QET_RES_FILES
${QET_DIR}/sources/autoNum/ui/autonumberingdockwidget.ui
${QET_DIR}/sources/autoNum/ui/autonumberingmanagementw.ui
${QET_DIR}/sources/autoNum/ui/folioautonumbering.ui
${QET_DIR}/sources/autoNum/ui/formulaautonumberingw.ui
${QET_DIR}/sources/autoNum/ui/numparteditorw.ui
${QET_DIR}/sources/autoNum/ui/selectautonumw.ui
${QET_DIR}/sources/dataBase/ui/elementquerywidget.ui
${QET_DIR}/sources/dataBase/ui/summaryquerywidget.ui
${QET_DIR}/sources/editor/ui/dynamictextfieldeditor.ui
${QET_DIR}/sources/editor/ui/elementpropertieseditorwidget.ui
${QET_DIR}/sources/editor/ui/ellipseeditor.ui
${QET_DIR}/sources/editor/ui/lineeditor.ui
${QET_DIR}/sources/editor/ui/polygoneditor.ui
${QET_DIR}/sources/editor/ui/rectangleeditor.ui
${QET_DIR}/sources/editor/ui/qetelementeditor.ui
${QET_DIR}/sources/editor/ui/terminaleditor.ui
${QET_DIR}/sources/ElementsCollection/ui/renamedialog.ui
${QET_DIR}/sources/factory/ui/addtabledialog.ui
${QET_DIR}/sources/NameList/ui/namelistdialog.ui
${QET_DIR}/sources/NameList/ui/namelistwidget.ui
${QET_DIR}/sources/print/projectprintwindow.ui
${QET_DIR}/sources/PropertiesEditor/propertieseditordockwidget.ui
${QET_DIR}/sources/richtext/addlinkdialog.ui
${QET_DIR}/sources/SearchAndReplace/ui/replaceadvanceddialog.ui
${QET_DIR}/sources/SearchAndReplace/ui/replaceconductordialog.ui
${QET_DIR}/sources/SearchAndReplace/ui/replaceelementdialog.ui
${QET_DIR}/sources/SearchAndReplace/ui/replacefoliowidget.ui
${QET_DIR}/sources/SearchAndReplace/ui/searchandreplacewidget.ui
${QET_DIR}/sources/ui/aboutqetdialog.ui
${QET_DIR}/sources/ui/alignmenttextdialog.ui
${QET_DIR}/sources/ui/bomexportdialog.ui
${QET_DIR}/sources/ui/borderpropertieswidget.ui
${QET_DIR}/sources/ui/compositetexteditdialog.ui
${QET_DIR}/sources/ui/conductorpropertiesdialog.ui
${QET_DIR}/sources/ui/conductorpropertieswidget.ui
${QET_DIR}/sources/ui/configsaveloaderwidget.ui
${QET_DIR}/sources/ui/diagramcontextwidget.ui
${QET_DIR}/sources/ui/diagramselection.ui
${QET_DIR}/sources/ui/dialogwaiting.ui
${QET_DIR}/sources/ui/dynamicelementtextitemeditor.ui
${QET_DIR}/sources/ui/elementinfopartwidget.ui
${QET_DIR}/sources/ui/elementinfowidget.ui
${QET_DIR}/sources/ui/formulaassistantdialog.ui
${QET_DIR}/sources/ui/imagepropertieswidget.ui
${QET_DIR}/sources/ui/importelementdialog.ui
${QET_DIR}/sources/ui/importelementtextpatterndialog.ui
${QET_DIR}/sources/ui/linksingleelementwidget.ui
${QET_DIR}/sources/ui/marginseditdialog.ui
${QET_DIR}/sources/ui/masterpropertieswidget.ui
${QET_DIR}/sources/ui/multipastedialog.ui
${QET_DIR}/sources/ui/potentialselectordialog.ui
${QET_DIR}/sources/ui/reportpropertiewidget.ui
${QET_DIR}/sources/ui/shapegraphicsitempropertieswidget.ui
${QET_DIR}/sources/ui/titleblockpropertieswidget.ui
${QET_DIR}/sources/ui/xrefpropertieswidget.ui
${QET_DIR}/sources/ui/configpage/generalconfigurationpage.ui
)
set(QET_SRC_FILES
${QET_DIR}/sources/borderproperties.cpp
${QET_DIR}/sources/borderproperties.h
${QET_DIR}/sources/bordertitleblock.cpp
${QET_DIR}/sources/bordertitleblock.h
${QET_DIR}/sources/conductorautonumerotation.cpp
${QET_DIR}/sources/conductorautonumerotation.h
${QET_DIR}/sources/conductornumexport.cpp
${QET_DIR}/sources/conductornumexport.h
${QET_DIR}/sources/conductorprofile.cpp
${QET_DIR}/sources/conductorprofile.h
${QET_DIR}/sources/conductorproperties.cpp
${QET_DIR}/sources/conductorproperties.h
${QET_DIR}/sources/conductorsegment.cpp
${QET_DIR}/sources/conductorsegment.h
${QET_DIR}/sources/conductorsegmentprofile.h
${QET_DIR}/sources/configdialog.cpp
${QET_DIR}/sources/configdialog.h
${QET_DIR}/sources/createdxf.cpp
${QET_DIR}/sources/createdxf.h
${QET_DIR}/sources/diagramcommands.cpp
${QET_DIR}/sources/diagramcommands.h
${QET_DIR}/sources/diagramcontent.cpp
${QET_DIR}/sources/diagramcontent.h
${QET_DIR}/sources/diagramcontext.cpp
${QET_DIR}/sources/diagramcontext.h
${QET_DIR}/sources/diagram.cpp
${QET_DIR}/sources/diagram.h
${QET_DIR}/sources/diagramposition.cpp
${QET_DIR}/sources/diagramposition.h
${QET_DIR}/sources/diagramview.cpp
${QET_DIR}/sources/diagramview.h
${QET_DIR}/sources/elementdialog.cpp
${QET_DIR}/sources/elementdialog.h
${QET_DIR}/sources/elementprovider.cpp
${QET_DIR}/sources/elementprovider.h
${QET_DIR}/sources/elementscategoryeditor.cpp
${QET_DIR}/sources/elementscategoryeditor.h
${QET_DIR}/sources/elementscollectioncache.cpp
${QET_DIR}/sources/elementscollectioncache.h
${QET_DIR}/sources/elementsmover.cpp
${QET_DIR}/sources/elementsmover.h
${QET_DIR}/sources/elementspanel.cpp
${QET_DIR}/sources/elementspanel.h
${QET_DIR}/sources/elementspanelwidget.cpp
${QET_DIR}/sources/elementspanelwidget.h
${QET_DIR}/sources/elementtextpattern.cpp
${QET_DIR}/sources/elementtextpattern.h
${QET_DIR}/sources/elementtextsmover.cpp
${QET_DIR}/sources/elementtextsmover.h
${QET_DIR}/sources/exportdialog.cpp
${QET_DIR}/sources/exportdialog.h
${QET_DIR}/sources/exportproperties.cpp
${QET_DIR}/sources/exportproperties.h
${QET_DIR}/sources/exportpropertieswidget.cpp
${QET_DIR}/sources/exportpropertieswidget.h
${QET_DIR}/sources/genericpanel.cpp
${QET_DIR}/sources/genericpanel.h
${QET_DIR}/sources/machine_info.cpp
${QET_DIR}/sources/machine_info.h
${QET_DIR}/sources/main.cpp
${QET_DIR}/sources/newelementwizard.cpp
${QET_DIR}/sources/newelementwizard.h
${QET_DIR}/sources/projectview.cpp
${QET_DIR}/sources/projectview.h
${QET_DIR}/sources/qetapp.cpp
${QET_DIR}/sources/qetapp.h
${QET_DIR}/sources/qetarguments.cpp
${QET_DIR}/sources/qetarguments.h
${QET_DIR}/sources/qet.cpp
${QET_DIR}/sources/qetdiagrameditor.cpp
${QET_DIR}/sources/qetdiagrameditor.h
${QET_DIR}/sources/qet.h
${QET_DIR}/sources/qeticons.cpp
${QET_DIR}/sources/qeticons.h
${QET_DIR}/sources/qetinformation.cpp
${QET_DIR}/sources/qetinformation.h
${QET_DIR}/sources/qetmainwindow.cpp
${QET_DIR}/sources/qetmainwindow.h
${QET_DIR}/sources/qetmessagebox.cpp
${QET_DIR}/sources/qetmessagebox.h
${QET_DIR}/sources/qetproject.cpp
${QET_DIR}/sources/qetproject.h
${QET_DIR}/sources/qetregexpvalidator.cpp
${QET_DIR}/sources/qetregexpvalidator.h
${QET_DIR}/sources/qetresult.cpp
${QET_DIR}/sources/qetresult.h
${QET_DIR}/sources/qetxml.cpp
${QET_DIR}/sources/qetxml.h
${QET_DIR}/sources/qfilenameedit.cpp
${QET_DIR}/sources/qfilenameedit.h
${QET_DIR}/sources/qgimanager.cpp
${QET_DIR}/sources/qgimanager.h
${QET_DIR}/sources/qtextorientationspinboxwidget.cpp
${QET_DIR}/sources/qtextorientationspinboxwidget.h
${QET_DIR}/sources/qtextorientationwidget.cpp
${QET_DIR}/sources/qtextorientationwidget.h
${QET_DIR}/sources/recentfiles.cpp
${QET_DIR}/sources/recentfiles.h
${QET_DIR}/sources/titleblockcell.cpp
${QET_DIR}/sources/titleblockcell.h
${QET_DIR}/sources/titleblockproperties.cpp
${QET_DIR}/sources/titleblockproperties.h
${QET_DIR}/sources/titleblocktemplate.cpp
${QET_DIR}/sources/titleblocktemplate.h
${QET_DIR}/sources/titleblocktemplaterenderer.cpp
${QET_DIR}/sources/titleblocktemplaterenderer.h
${QET_DIR}/sources/autoNum/assignvariables.cpp
${QET_DIR}/sources/autoNum/assignvariables.h
${QET_DIR}/sources/autoNum/numerotationcontextcommands.cpp
${QET_DIR}/sources/autoNum/numerotationcontextcommands.h
${QET_DIR}/sources/autoNum/numerotationcontext.cpp
${QET_DIR}/sources/autoNum/numerotationcontext.h
${QET_DIR}/sources/autoNum/ui/autonumberingdockwidget.cpp
${QET_DIR}/sources/autoNum/ui/autonumberingdockwidget.h
${QET_DIR}/sources/autoNum/ui/autonumberingmanagementw.cpp
${QET_DIR}/sources/autoNum/ui/autonumberingmanagementw.h
${QET_DIR}/sources/autoNum/ui/folioautonumbering.cpp
${QET_DIR}/sources/autoNum/ui/folioautonumbering.h
${QET_DIR}/sources/autoNum/ui/formulaautonumberingw.cpp
${QET_DIR}/sources/autoNum/ui/formulaautonumberingw.h
${QET_DIR}/sources/autoNum/ui/numparteditorw.cpp
${QET_DIR}/sources/autoNum/ui/numparteditorw.h
${QET_DIR}/sources/autoNum/ui/selectautonumw.cpp
${QET_DIR}/sources/autoNum/ui/selectautonumw.h
${QET_DIR}/sources/dataBase/projectdatabase.cpp
${QET_DIR}/sources/dataBase/projectdatabase.h
${QET_DIR}/sources/dataBase/ui/elementquerywidget.cpp
${QET_DIR}/sources/dataBase/ui/elementquerywidget.h
${QET_DIR}/sources/dataBase/ui/summaryquerywidget.cpp
${QET_DIR}/sources/dataBase/ui/summaryquerywidget.h
${QET_DIR}/sources/diagramevent/diagrameventaddelement.cpp
${QET_DIR}/sources/diagramevent/diagrameventaddelement.h
${QET_DIR}/sources/diagramevent/diagrameventaddimage.cpp
${QET_DIR}/sources/diagramevent/diagrameventaddimage.h
${QET_DIR}/sources/diagramevent/diagrameventaddshape.cpp
${QET_DIR}/sources/diagramevent/diagrameventaddshape.h
${QET_DIR}/sources/diagramevent/diagrameventaddtext.cpp
${QET_DIR}/sources/diagramevent/diagrameventaddtext.h
${QET_DIR}/sources/diagramevent/diagrameventinterface.cpp
${QET_DIR}/sources/diagramevent/diagrameventinterface.h
${QET_DIR}/sources/dvevent/dveventinterface.cpp
${QET_DIR}/sources/dvevent/dveventinterface.h
${QET_DIR}/sources/editor/arceditor.cpp
${QET_DIR}/sources/editor/arceditor.h
${QET_DIR}/sources/editor/editorcommands.cpp
${QET_DIR}/sources/editor/editorcommands.h
${QET_DIR}/sources/editor/elementcontent.h
${QET_DIR}/sources/editor/elementitemeditor.cpp
${QET_DIR}/sources/editor/elementitemeditor.h
${QET_DIR}/sources/editor/elementprimitivedecorator.cpp
${QET_DIR}/sources/editor/elementprimitivedecorator.h
${QET_DIR}/sources/editor/elementscene.cpp
${QET_DIR}/sources/editor/elementscene.h
${QET_DIR}/sources/editor/elementview.cpp
${QET_DIR}/sources/editor/elementview.h
${QET_DIR}/sources/editor/styleeditor.cpp
${QET_DIR}/sources/editor/styleeditor.h
${QET_DIR}/sources/editor/esevent/eseventaddarc.cpp
${QET_DIR}/sources/editor/esevent/eseventaddarc.h
${QET_DIR}/sources/editor/esevent/eseventadddynamictextfield.cpp
${QET_DIR}/sources/editor/esevent/eseventadddynamictextfield.h
${QET_DIR}/sources/editor/esevent/eseventaddellipse.cpp
${QET_DIR}/sources/editor/esevent/eseventaddellipse.h
${QET_DIR}/sources/editor/esevent/eseventaddline.cpp
${QET_DIR}/sources/editor/esevent/eseventaddline.h
${QET_DIR}/sources/editor/esevent/eseventaddpolygon.cpp
${QET_DIR}/sources/editor/esevent/eseventaddpolygon.h
${QET_DIR}/sources/editor/esevent/eseventaddrect.cpp
${QET_DIR}/sources/editor/esevent/eseventaddrect.h
${QET_DIR}/sources/editor/esevent/eseventaddterminal.cpp
${QET_DIR}/sources/editor/esevent/eseventaddterminal.h
${QET_DIR}/sources/editor/esevent/eseventaddtext.cpp
${QET_DIR}/sources/editor/esevent/eseventaddtext.h
${QET_DIR}/sources/editor/esevent/eseventinterface.cpp
${QET_DIR}/sources/editor/esevent/eseventinterface.h
${QET_DIR}/sources/editor/graphicspart/abstractpartellipse.cpp
${QET_DIR}/sources/editor/graphicspart/abstractpartellipse.h
${QET_DIR}/sources/editor/graphicspart/customelementgraphicpart.cpp
${QET_DIR}/sources/editor/graphicspart/customelementgraphicpart.h
${QET_DIR}/sources/editor/graphicspart/customelementpart.cpp
${QET_DIR}/sources/editor/graphicspart/customelementpart.h
${QET_DIR}/sources/editor/graphicspart/partarc.cpp
${QET_DIR}/sources/editor/graphicspart/partarc.h
${QET_DIR}/sources/editor/graphicspart/partdynamictextfield.cpp
${QET_DIR}/sources/editor/graphicspart/partdynamictextfield.h
${QET_DIR}/sources/editor/graphicspart/partellipse.cpp
${QET_DIR}/sources/editor/graphicspart/partellipse.h
${QET_DIR}/sources/editor/graphicspart/partline.cpp
${QET_DIR}/sources/editor/graphicspart/partline.h
${QET_DIR}/sources/editor/graphicspart/partpolygon.cpp
${QET_DIR}/sources/editor/graphicspart/partpolygon.h
${QET_DIR}/sources/editor/graphicspart/partrectangle.cpp
${QET_DIR}/sources/editor/graphicspart/partrectangle.h
${QET_DIR}/sources/editor/graphicspart/partterminal.cpp
${QET_DIR}/sources/editor/graphicspart/partterminal.h
${QET_DIR}/sources/editor/graphicspart/parttext.cpp
${QET_DIR}/sources/editor/graphicspart/parttext.h
${QET_DIR}/sources/editor/ui/dynamictextfieldeditor.cpp
${QET_DIR}/sources/editor/ui/dynamictextfieldeditor.h
${QET_DIR}/sources/editor/ui/elementpropertieseditorwidget.cpp
${QET_DIR}/sources/editor/ui/elementpropertieseditorwidget.h
${QET_DIR}/sources/editor/ui/ellipseeditor.cpp
${QET_DIR}/sources/editor/ui/ellipseeditor.h
${QET_DIR}/sources/editor/ui/lineeditor.cpp
${QET_DIR}/sources/editor/ui/lineeditor.h
${QET_DIR}/sources/editor/ui/polygoneditor.cpp
${QET_DIR}/sources/editor/ui/polygoneditor.h
${QET_DIR}/sources/editor/ui/rectangleeditor.cpp
${QET_DIR}/sources/editor/ui/rectangleeditor.h
${QET_DIR}/sources/editor/ui/terminaleditor.cpp
${QET_DIR}/sources/editor/ui/terminaleditor.h
${QET_DIR}/sources/editor/ui/texteditor.cpp
${QET_DIR}/sources/editor/ui/texteditor.h
${QET_DIR}/sources/editor/ui/qetelementeditor.h
${QET_DIR}/sources/editor/ui/qetelementeditor.cpp
${QET_DIR}/sources/editor/UndoCommand/pastepartscommand.cpp
${QET_DIR}/sources/editor/UndoCommand/pastepartscommand.h
${QET_DIR}/sources/ElementsCollection/elementcollectionhandler.cpp
${QET_DIR}/sources/ElementsCollection/elementcollectionhandler.h
${QET_DIR}/sources/ElementsCollection/elementcollectionitem.cpp
${QET_DIR}/sources/ElementsCollection/elementcollectionitem.h
${QET_DIR}/sources/ElementsCollection/elementscollectionmodel.cpp
${QET_DIR}/sources/ElementsCollection/elementscollectionmodel.h
${QET_DIR}/sources/ElementsCollection/elementscollectionwidget.cpp
${QET_DIR}/sources/ElementsCollection/elementscollectionwidget.h
${QET_DIR}/sources/ElementsCollection/elementslocation.cpp
${QET_DIR}/sources/ElementsCollection/elementslocation.h
${QET_DIR}/sources/ElementsCollection/elementstreeview.cpp
${QET_DIR}/sources/ElementsCollection/elementstreeview.h
${QET_DIR}/sources/ElementsCollection/fileelementcollectionitem.cpp
${QET_DIR}/sources/ElementsCollection/fileelementcollectionitem.h
${QET_DIR}/sources/ElementsCollection/xmlelementcollection.cpp
${QET_DIR}/sources/ElementsCollection/xmlelementcollection.h
${QET_DIR}/sources/ElementsCollection/xmlprojectelementcollectionitem.cpp
${QET_DIR}/sources/ElementsCollection/xmlprojectelementcollectionitem.h
${QET_DIR}/sources/ElementsCollection/ui/renamedialog.cpp
${QET_DIR}/sources/ElementsCollection/ui/renamedialog.h
${QET_DIR}/sources/factory/elementfactory.cpp
${QET_DIR}/sources/factory/elementfactory.h
${QET_DIR}/sources/factory/elementpicturefactory.cpp
${QET_DIR}/sources/factory/elementpicturefactory.h
${QET_DIR}/sources/factory/propertieseditorfactory.cpp
${QET_DIR}/sources/factory/propertieseditorfactory.h
${QET_DIR}/sources/factory/qetgraphicstablefactory.cpp
${QET_DIR}/sources/factory/qetgraphicstablefactory.h
${QET_DIR}/sources/factory/ui/addtabledialog.cpp
${QET_DIR}/sources/factory/ui/addtabledialog.h
${QET_DIR}/sources/NameList/nameslist.cpp
${QET_DIR}/sources/NameList/nameslist.h
${QET_DIR}/sources/NameList/ui/namelistdialog.cpp
${QET_DIR}/sources/NameList/ui/namelistdialog.h
${QET_DIR}/sources/NameList/ui/namelistwidget.cpp
${QET_DIR}/sources/NameList/ui/namelistwidget.h
${QET_DIR}/sources/print/projectprintwindow.cpp
${QET_DIR}/sources/print/projectprintwindow.h
${QET_DIR}/sources/properties/elementdata.cpp
${QET_DIR}/sources/properties/elementdata.h
${QET_DIR}/sources/properties/propertiesinterface.cpp
${QET_DIR}/sources/properties/propertiesinterface.h
${QET_DIR}/sources/properties/reportproperties.cpp
${QET_DIR}/sources/properties/reportproperties.h
${QET_DIR}/sources/properties/terminaldata.cpp
${QET_DIR}/sources/properties/terminaldata.h
${QET_DIR}/sources/properties/xrefproperties.cpp
${QET_DIR}/sources/properties/xrefproperties.h
${QET_DIR}/sources/properties/userproperties.cpp
${QET_DIR}/sources/properties/userproperties.h
${QET_DIR}/sources/PropertiesEditor/propertieseditordialog.h
${QET_DIR}/sources/PropertiesEditor/propertieseditordockwidget.cpp
${QET_DIR}/sources/PropertiesEditor/propertieseditordockwidget.h
${QET_DIR}/sources/PropertiesEditor/propertieseditorwidget.cpp
${QET_DIR}/sources/PropertiesEditor/propertieseditorwidget.h
${QET_DIR}/sources/pugixml/pugiconfig.hpp
${QET_DIR}/sources/pugixml/pugixml.cpp
${QET_DIR}/sources/pugixml/pugixml.hpp
${QET_DIR}/sources/qetgraphicsitem/conductor.cpp
${QET_DIR}/sources/qetgraphicsitem/conductor.h
${QET_DIR}/sources/qetgraphicsitem/conductortextitem.cpp
${QET_DIR}/sources/qetgraphicsitem/conductortextitem.h
${QET_DIR}/sources/qetgraphicsitem/crossrefitem.cpp
${QET_DIR}/sources/qetgraphicsitem/crossrefitem.h
${QET_DIR}/sources/qetgraphicsitem/diagramimageitem.cpp
${QET_DIR}/sources/qetgraphicsitem/diagramimageitem.h
${QET_DIR}/sources/qetgraphicsitem/diagramtextitem.cpp
${QET_DIR}/sources/qetgraphicsitem/diagramtextitem.h
${QET_DIR}/sources/qetgraphicsitem/dynamicelementtextitem.cpp
${QET_DIR}/sources/qetgraphicsitem/dynamicelementtextitem.h
${QET_DIR}/sources/qetgraphicsitem/element.cpp
${QET_DIR}/sources/qetgraphicsitem/element.h
${QET_DIR}/sources/qetgraphicsitem/elementtextitemgroup.cpp
${QET_DIR}/sources/qetgraphicsitem/elementtextitemgroup.h
${QET_DIR}/sources/qetgraphicsitem/independenttextitem.cpp
${QET_DIR}/sources/qetgraphicsitem/independenttextitem.h
${QET_DIR}/sources/qetgraphicsitem/masterelement.cpp
${QET_DIR}/sources/qetgraphicsitem/masterelement.h
${QET_DIR}/sources/qetgraphicsitem/qetgraphicsitem.cpp
${QET_DIR}/sources/qetgraphicsitem/qetgraphicsitem.h
${QET_DIR}/sources/qetgraphicsitem/qetshapeitem.cpp
${QET_DIR}/sources/qetgraphicsitem/qetshapeitem.h
${QET_DIR}/sources/qetgraphicsitem/qgraphicsitemutility.cpp
${QET_DIR}/sources/qetgraphicsitem/qgraphicsitemutility.h
${QET_DIR}/sources/qetgraphicsitem/reportelement.cpp
${QET_DIR}/sources/qetgraphicsitem/reportelement.h
${QET_DIR}/sources/qetgraphicsitem/simpleelement.cpp
${QET_DIR}/sources/qetgraphicsitem/simpleelement.h
${QET_DIR}/sources/qetgraphicsitem/slaveelement.cpp
${QET_DIR}/sources/qetgraphicsitem/slaveelement.h
${QET_DIR}/sources/qetgraphicsitem/terminal.cpp
${QET_DIR}/sources/qetgraphicsitem/terminalelement.cpp
${QET_DIR}/sources/qetgraphicsitem/terminalelement.h
${QET_DIR}/sources/qetgraphicsitem/terminal.h
${QET_DIR}/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp
${QET_DIR}/sources/qetgraphicsitem/ViewItem/projectdbmodel.h
${QET_DIR}/sources/qetgraphicsitem/ViewItem/qetgraphicsheaderitem.cpp
${QET_DIR}/sources/qetgraphicsitem/ViewItem/qetgraphicsheaderitem.h
${QET_DIR}/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp
${QET_DIR}/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.h
${QET_DIR}/sources/qetgraphicsitem/ViewItem/ui/graphicstablepropertieseditor.cpp
${QET_DIR}/sources/qetgraphicsitem/ViewItem/ui/graphicstablepropertieseditor.h
${QET_DIR}/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.cpp
${QET_DIR}/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.h
${QET_DIR}/sources/QetGraphicsItemModeler/qetgraphicshandleritem.cpp
${QET_DIR}/sources/QetGraphicsItemModeler/qetgraphicshandleritem.h
${QET_DIR}/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp
${QET_DIR}/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h
${QET_DIR}/sources/QPropertyUndoCommand/qpropertyundocommand.cpp
${QET_DIR}/sources/QPropertyUndoCommand/qpropertyundocommand.h
${QET_DIR}/sources/QWidgetAnimation/qwidgetanimation.cpp
${QET_DIR}/sources/QWidgetAnimation/qwidgetanimation.h
${QET_DIR}/sources/richtext/richtexteditor.cpp
${QET_DIR}/sources/richtext/richtexteditor_p.h
${QET_DIR}/sources/richtext/ui_addlinkdialog.h
${QET_DIR}/sources/SearchAndReplace/searchandreplaceworker.cpp
${QET_DIR}/sources/SearchAndReplace/searchandreplaceworker.h
${QET_DIR}/sources/SearchAndReplace/ui/replaceadvanceddialog.cpp
${QET_DIR}/sources/SearchAndReplace/ui/replaceadvanceddialog.h
${QET_DIR}/sources/SearchAndReplace/ui/replaceconductordialog.cpp
${QET_DIR}/sources/SearchAndReplace/ui/replaceconductordialog.h
${QET_DIR}/sources/SearchAndReplace/ui/replaceelementdialog.cpp
${QET_DIR}/sources/SearchAndReplace/ui/replaceelementdialog.h
${QET_DIR}/sources/SearchAndReplace/ui/replacefoliowidget.cpp
${QET_DIR}/sources/SearchAndReplace/ui/replacefoliowidget.h
${QET_DIR}/sources/SearchAndReplace/ui/searchandreplacewidget.cpp
${QET_DIR}/sources/SearchAndReplace/ui/searchandreplacewidget.h
${QET_DIR}/sources/titleblock/dimension.cpp
${QET_DIR}/sources/titleblock/dimension.h
${QET_DIR}/sources/titleblock/dimensionwidget.cpp
${QET_DIR}/sources/titleblock/dimensionwidget.h
${QET_DIR}/sources/titleblock/gridlayoutanimation.cpp
${QET_DIR}/sources/titleblock/gridlayoutanimation.h
${QET_DIR}/sources/titleblock/helpercell.cpp
${QET_DIR}/sources/titleblock/helpercell.h
${QET_DIR}/sources/titleblock/integrationmovetemplateshandler.cpp
${QET_DIR}/sources/titleblock/integrationmovetemplateshandler.h
${QET_DIR}/sources/titleblock/movetemplateshandler.h
${QET_DIR}/sources/titleblock/qettemplateeditor.cpp
${QET_DIR}/sources/titleblock/qettemplateeditor.h
${QET_DIR}/sources/titleblock/splittedhelpercell.cpp
${QET_DIR}/sources/titleblock/splittedhelpercell.h
${QET_DIR}/sources/titleblock/templatecellsset.cpp
${QET_DIR}/sources/titleblock/templatecellsset.h
${QET_DIR}/sources/titleblock/templatecellwidget.cpp
${QET_DIR}/sources/titleblock/templatecellwidget.h
${QET_DIR}/sources/titleblock/templatecommands.cpp
${QET_DIR}/sources/titleblock/templatecommands.h
${QET_DIR}/sources/titleblock/templatedeleter.cpp
${QET_DIR}/sources/titleblock/templatedeleter.h
${QET_DIR}/sources/titleblock/templatelocationchooser.cpp
${QET_DIR}/sources/titleblock/templatelocationchooser.h
${QET_DIR}/sources/titleblock/templatelocation.cpp
${QET_DIR}/sources/titleblock/templatelocation.h
${QET_DIR}/sources/titleblock/templatelocationsaver.cpp
${QET_DIR}/sources/titleblock/templatelocationsaver.h
${QET_DIR}/sources/titleblock/templatelogomanager.cpp
${QET_DIR}/sources/titleblock/templatelogomanager.h
${QET_DIR}/sources/titleblock/templatescollection.cpp
${QET_DIR}/sources/titleblock/templatescollection.h
${QET_DIR}/sources/titleblock/templateview.cpp
${QET_DIR}/sources/titleblock/templateview.h
${QET_DIR}/sources/titleblock/templatevisualcell.cpp
${QET_DIR}/sources/titleblock/templatevisualcell.h
${QET_DIR}/sources/ui/aboutqetdialog.cpp
${QET_DIR}/sources/ui/aboutqetdialog.h
${QET_DIR}/sources/ui/abstractelementpropertieseditorwidget.cpp
${QET_DIR}/sources/ui/abstractelementpropertieseditorwidget.h
${QET_DIR}/sources/ui/alignmenttextdialog.cpp
${QET_DIR}/sources/ui/alignmenttextdialog.h
${QET_DIR}/sources/ui/bomexportdialog.cpp
${QET_DIR}/sources/ui/bomexportdialog.h
${QET_DIR}/sources/ui/borderpropertieswidget.cpp
${QET_DIR}/sources/ui/borderpropertieswidget.h
${QET_DIR}/sources/ui/compositetexteditdialog.cpp
${QET_DIR}/sources/ui/compositetexteditdialog.h
${QET_DIR}/sources/ui/conductorpropertiesdialog.cpp
${QET_DIR}/sources/ui/conductorpropertiesdialog.h
${QET_DIR}/sources/ui/conductorpropertieswidget.cpp
${QET_DIR}/sources/ui/conductorpropertieswidget.h
${QET_DIR}/sources/ui/configsaveloaderwidget.cpp
${QET_DIR}/sources/ui/configsaveloaderwidget.h
${QET_DIR}/sources/ui/diagramcontextwidget.cpp
${QET_DIR}/sources/ui/diagramcontextwidget.h
${QET_DIR}/sources/ui/diagrampropertiesdialog.cpp
${QET_DIR}/sources/ui/diagrampropertiesdialog.h
${QET_DIR}/sources/ui/diagrampropertieseditordockwidget.cpp
${QET_DIR}/sources/ui/diagrampropertieseditordockwidget.h
${QET_DIR}/sources/ui/diagramselection.cpp
${QET_DIR}/sources/ui/diagramselection.h
${QET_DIR}/sources/ui/dialogwaiting.cpp
${QET_DIR}/sources/ui/dialogwaiting.h
${QET_DIR}/sources/ui/dynamicelementtextitemeditor.cpp
${QET_DIR}/sources/ui/dynamicelementtextitemeditor.h
${QET_DIR}/sources/ui/dynamicelementtextmodel.cpp
${QET_DIR}/sources/ui/dynamicelementtextmodel.h
${QET_DIR}/sources/ui/elementinfopartwidget.cpp
${QET_DIR}/sources/ui/elementinfopartwidget.h
${QET_DIR}/sources/ui/elementinfowidget.cpp
${QET_DIR}/sources/ui/elementinfowidget.h
${QET_DIR}/sources/ui/elementpropertieswidget.cpp
${QET_DIR}/sources/ui/elementpropertieswidget.h
${QET_DIR}/sources/ui/formulaassistantdialog.cpp
${QET_DIR}/sources/ui/formulaassistantdialog.h
${QET_DIR}/sources/ui/imagepropertieswidget.cpp
${QET_DIR}/sources/ui/imagepropertieswidget.h
${QET_DIR}/sources/ui/importelementdialog.cpp
${QET_DIR}/sources/ui/importelementdialog.h
${QET_DIR}/sources/ui/importelementtextpatterndialog.cpp
${QET_DIR}/sources/ui/importelementtextpatterndialog.h
${QET_DIR}/sources/ui/inditextpropertieswidget.cpp
${QET_DIR}/sources/ui/inditextpropertieswidget.h
${QET_DIR}/sources/ui/linksingleelementwidget.cpp
${QET_DIR}/sources/ui/linksingleelementwidget.h
${QET_DIR}/sources/ui/marginseditdialog.cpp
${QET_DIR}/sources/ui/marginseditdialog.h
${QET_DIR}/sources/ui/masterpropertieswidget.cpp
${QET_DIR}/sources/ui/masterpropertieswidget.h
${QET_DIR}/sources/ui/multipastedialog.cpp
${QET_DIR}/sources/ui/multipastedialog.h
${QET_DIR}/sources/ui/potentialselectordialog.cpp
${QET_DIR}/sources/ui/potentialselectordialog.h
${QET_DIR}/sources/ui/projectpropertiesdialog.cpp
${QET_DIR}/sources/ui/projectpropertiesdialog.h
${QET_DIR}/sources/ui/reportpropertiewidget.cpp
${QET_DIR}/sources/ui/reportpropertiewidget.h
${QET_DIR}/sources/ui/shapegraphicsitempropertieswidget.cpp
${QET_DIR}/sources/ui/shapegraphicsitempropertieswidget.h
${QET_DIR}/sources/ui/titleblockpropertieswidget.cpp
${QET_DIR}/sources/ui/titleblockpropertieswidget.h
${QET_DIR}/sources/ui/xrefpropertieswidget.cpp
${QET_DIR}/sources/ui/xrefpropertieswidget.h
${QET_DIR}/sources/ui/configpage/configpage.h
${QET_DIR}/sources/ui/configpage/configpages.cpp
${QET_DIR}/sources/ui/configpage/configpages.h
${QET_DIR}/sources/ui/configpage/generalconfigurationpage.cpp
${QET_DIR}/sources/ui/configpage/generalconfigurationpage.h
${QET_DIR}/sources/ui/configpage/projectconfigpages.cpp
${QET_DIR}/sources/ui/configpage/projectconfigpages.h
${QET_DIR}/sources/undocommand/addelementtextcommand.cpp
${QET_DIR}/sources/undocommand/addelementtextcommand.h
${QET_DIR}/sources/undocommand/addgraphicsobjectcommand.cpp
${QET_DIR}/sources/undocommand/addgraphicsobjectcommand.h
${QET_DIR}/sources/undocommand/changeelementinformationcommand.cpp
${QET_DIR}/sources/undocommand/changeelementinformationcommand.h
${QET_DIR}/sources/undocommand/changetitleblockcommand.cpp
${QET_DIR}/sources/undocommand/changetitleblockcommand.h
${QET_DIR}/sources/undocommand/deleteqgraphicsitemcommand.cpp
${QET_DIR}/sources/undocommand/deleteqgraphicsitemcommand.h
${QET_DIR}/sources/undocommand/itemmodelcommand.cpp
${QET_DIR}/sources/undocommand/itemmodelcommand.h
${QET_DIR}/sources/undocommand/linkelementcommand.cpp
${QET_DIR}/sources/undocommand/linkelementcommand.h
${QET_DIR}/sources/undocommand/rotateselectioncommand.cpp
${QET_DIR}/sources/undocommand/rotateselectioncommand.h
${QET_DIR}/sources/undocommand/rotatetextscommand.cpp
${QET_DIR}/sources/undocommand/rotatetextscommand.h
${QET_DIR}/sources/utils/conductorcreator.cpp
${QET_DIR}/sources/utils/conductorcreator.h
${QET_DIR}/sources/utils/macosxopenevent.cpp
${QET_DIR}/sources/utils/macosxopenevent.h
${QET_DIR}/sources/utils/qetutils.cpp
${QET_DIR}/sources/utils/qetutils.h
)
set(TS_FILES
${QET_DIR}/lang/qet_ca.ts
${QET_DIR}/lang/qet_de.ts
${QET_DIR}/lang/qet_es.ts
${QET_DIR}/lang/qet_fr.ts
${QET_DIR}/lang/qet_it.ts
${QET_DIR}/lang/qet_mn.ts
${QET_DIR}/lang/qet_pt_br.ts
${QET_DIR}/lang/qet_ru.ts
${QET_DIR}/lang/qet_sr.ts
${QET_DIR}/lang/qet_zh.ts
${QET_DIR}/lang/qet_be.ts
${QET_DIR}/lang/qet_da.ts
${QET_DIR}/lang/qet_en.ts
${QET_DIR}/lang/qet_fi.ts
${QET_DIR}/lang/qet_hu.ts
${QET_DIR}/lang/qet_nl.ts
${QET_DIR}/lang/qet_pl.ts
${QET_DIR}/lang/qet_ro.ts
${QET_DIR}/lang/qet_sk.ts
${QET_DIR}/lang/qet_ar.ts
${QET_DIR}/lang/qet_cs.ts
${QET_DIR}/lang/qet_el.ts
${QET_DIR}/lang/qet_hr.ts
${QET_DIR}/lang/qet_ja.ts
${QET_DIR}/lang/qet_nb.ts
${QET_DIR}/lang/qet_no.ts
${QET_DIR}/lang/qet_pt.ts
${QET_DIR}/lang/qet_sl.ts
${QET_DIR}/lang/qet_tr.ts
)

View File

@@ -1,29 +0,0 @@
# Copyright 2006 The QElectroTech Team
# This file is part of QElectroTech.
#
# QElectroTech is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# QElectroTech is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
message(" - start_options")
# Comment the line below to deactivate the --common-elements-dir option
add_definitions(-DQET_ALLOW_OVERRIDE_CED_OPTION)
# Comment the line below to disable the --common-tbt-dir option
add_definitions(-DQET_ALLOW_OVERRIDE_CTBTD_OPTION)
# Comment the line below to deactivate the --config-dir option
add_definitions(-DQET_ALLOW_OVERRIDE_CD_OPTION)
#comment the line below to disable the project database export
#add_definitions(-DQET_EXPORT_PROJECT_DB) #error Todo

View File

@@ -1,28 +1,24 @@
<definition height="20" version="0.80" width="30" hotspot_x="8" link_type="previous_report" hotspot_y="10" type="element">
<uuid uuid="{994d5b97-25b5-49aa-93ae-c1857ab866ea}"/>
<names>
<name lang="ar">الصفحة السابقة</name>
<definition width="70" version="0.3" hotspot_x="49" hotspot_y="15" height="30" type="element" ic="true" orientation="dyyy"
link_type="previous_report">
<uuid uuid="{F549BEFB-F0CF-44ED-A948-F6F796BFB421}"/><names>
<name lang="ru">Предыдущая страница</name>
<name lang="es">folio anterior</name>
<name lang="it">Foglio precedente</name>
<name lang="ar">الصفحة السابقة</name>
<name lang="de">Vorherige Folie</name>
<name lang="el">Προηγούμενη σελίδα</name>
<name lang="en">Coming arrow</name>
<name lang="cs">Předchozí list</name>
<name lang="it">Foglio precedente</name>
<name lang="fr">Folio précédent</name>
<name lang="pl">Wejście adresowe</name>
<name lang="hu">Beérkező hivatkozás</name>
<name lang="es">folio anterior</name>
<name lang="cs">Předchozí list</name>
<name lang="nl">Referentie Vorig</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<polygon x2="-1" y2="4" y4="-4" x1="-1" x3="9" y3="0" closed="false" style="line-style:normal;line-weight:normal;filling:black;color:black" y1="-4" x4="-1" antialias="true"/>
<line length2="1.5" x2="12" end2="none" y2="0" length1="1.5" x1="9" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" end1="none" antialias="false"/>
<dynamic_text x="-44" rotation="0" uuid="{8ec41ce2-36d6-4fe3-b299-c8a48cb2182c}" Halignment="AlignLeft" font="Sans Serif,9,-1,5,50,0,0,0,0,0" text_from="ElementInfo" y="-11.5" Valignment="AlignTop" z="3" frame="false" text_width="-1">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<terminal x="13" uuid="{d7fd0bec-9f05-4651-a50b-29d7ffabeb41}" name="" y="0" orientation="e"/>
<polygon x4="-1" antialias="true" style="line-style:normal;line-weight:normal;filling:black;color:black" closed="false" y1="-4" x1="-1" y2="4" x2="-1" y3="0" x3="9" y4="-4"/>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" x1="9" y2="0" x2="12"/>
<input x="-44" y="0" size="9" rotate="true" text="/"/>
<terminal x="13" y="0" nameHidden="0" number="" name="" orientation="e"/>
</description>
</definition>

View File

@@ -1,28 +1,24 @@
<definition hotspot_x="21" hotspot_y="10" version="0.80" type="element" height="20" link_type="next_report" width="30">
<uuid uuid="{2e596a05-ef45-4895-b826-942d28c2d038}"/>
<names>
<name lang="de">Nächste Folie</name>
<definition width="40" version="0.3" hotspot_x="18" hotspot_y="15" height="30" type="element" ic="true"
link_type="next_report">
<uuid uuid="{717352A1-F3C7-49C7-9A06-51620AB5CA00}"/><names>
<name lang="ru">Следующая страница</name>
<name lang="ar">الصفحة التالية</name>
<name lang="fr">Folio suivant</name>
<name lang="hu">Elmenő hivatkozás</name>
<name lang="it">Foglio successivo</name>
<name lang="de">Nächste Folie</name>
<name lang="el">Επόμενη σελίδα</name>
<name lang="en">Going arrow</name>
<name lang="es">Folio siguiente</name>
<name lang="nl">Referentie volgend</name>
<name lang="it">Foglio successivo</name>
<name lang="fr">Folio suivant</name>
<name lang="pl">Wyjście adresowe</name>
<name lang="ru">Следующая страница</name>
<name lang="es">Folio siguiente</name>
<name lang="cs">Další list</name>
<name lang="nl">Referentie volgend</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<polygon y3="0" y2="4" x4="-9" x3="2" x1="-9" x2="-9" y4="-4" style="line-style:normal;line-weight:normal;filling:black;color:black" y1="-4" closed="false" antialias="true"/>
<line y2="0" x1="-9" x2="-12" length1="1.5" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" end1="none" length2="1.5" antialias="false"/>
<dynamic_text Valignment="AlignTop" Halignment="AlignLeft" rotation="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" uuid="{93888a84-3ffd-438d-acef-5396acba0750}" text_width="-1" x="6" frame="false" z="3" y="-11.5" text_from="ElementInfo">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<terminal uuid="{975add6f-4ba5-44af-a4c0-e1f1c2024601}" name="" x="-13" orientation="w" y="0"/>
<polygon x4="-9" antialias="true" style="line-style:normal;line-weight:normal;filling:black;color:black" closed="false" y1="-4" x1="-9" y2="4" x2="-9" y3="0" x3="2" y4="-4"/>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" x1="-9" y2="0" x2="-12"/>
<input x="6" y="0" size="9" rotate="true" text="/"/>
<terminal x="-13" y="0" nameHidden="0" number="" name="" orientation="w"/>
</description>
</definition>

View File

@@ -2,18 +2,16 @@
<names>
<name lang="ru">Точки разрыва</name>
<name lang="ar">إحالات</name>
<name lang="cs">Odkazování listů</name>
<name lang="cs">Výstupy</name>
<name lang="de">Folienverweise</name>
<name lang="el">Αναφορές σελίδας</name>
<name lang="en">Folio referencing</name>
<name lang="fr">Reports de folio</name>
<name lang="it">Riferimenti</name>
<name lang="pl">Odsyłacze</name>
<name lang="pt_br">Referências</name>
<name lang="es">Referencias</name>
<name lang="nl">Referenties</name>
<name lang="da">Ark henvisninger</name>
<name lang="ja">フォリオ参照</name>
<name lang="hu">Tervlap hivatkozások</name>
</names>
</qet-directory>

View File

@@ -11,8 +11,7 @@
<name lang="ru">Трёхполюсный + PEN</name>
<name lang="fr">Source tripolaire + PEN</name>
<name lang="ar">مصدر ثلاثي القطبيّة + PEN</name>
<name lang="cs">Přípojnice 3f+PEN pravá</name>
<name lang="hu">3F + PEN</name>
<name lang="cs">3 fáze + PEN pravý</name>
</names>
<elementInformations/>
<informations>Author: The QElectroTech team

View File

@@ -1,7 +1,7 @@
<definition type="element" height="100" hotspot_y="40" version="0.70" width="40" hotspot_x="20" link_type="simple">
<uuid uuid="{b4b70d3d-8784-4323-b17b-d8ff3677cdc1}"/>
<names>
<name lang="en">Three-pole source + N + PE</name>
<name lang="en">Three-pole source + PEN</name>
<name lang="el">Τριφασικό + PEN</name>
<name lang="es">Fuente tripolar + PEN</name>
<name lang="nl">driefasen + aardenul</name>
@@ -11,8 +11,7 @@
<name lang="ru">Трёхполюсный + PEN</name>
<name lang="fr">Source tripolaire + PEN</name>
<name lang="ar">مصدر ثلاثي القطبيّة + PEN</name>
<name lang="cs">Přípojnice 3f+N+PE pravá</name>
<name lang="hu">3F + N + PE</name>
<name lang="cs">3 fáze + N+PE pravý</name>
</names>
<elementInformations/>
<informations>Author: The QElectroTech team

View File

@@ -14,7 +14,6 @@
<name lang="es">Masa</name>
<name lang="ar">هيكل معدني</name>
<name lang="fr">Masse</name>
<name lang="hu">Test</name>
</names>
<elementInformations>
<elementInformation name="comment" show="1"></elementInformation>
@@ -29,7 +28,7 @@
<elementInformation name="plant" show="1"></elementInformation>
<elementInformation name="label" show="1"></elementInformation>
</elementInformations>
<informations>titus
<informations>titus&#xd;
titus0818@yahoo.com</informations>
<description>
<line y1="-16" x1="0" style="line-style:normal;line-weight:hight;filling:none;color:black" end2="none" y2="13" length2="1.5" length1="1.5" x2="0" end1="none" antialias="false"/>

View File

@@ -13,7 +13,6 @@
<name lang="en">Chassis</name>
<name lang="fr">Masse</name>
<name lang="ru">Шасси</name>
<name lang="hu">Vázszerkezet</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -5,14 +5,12 @@
<name lang="fr">Sources réseau</name>
<name lang="it">Alimentazione da rete</name>
<name lang="pl">Sieć elektroenergetyczna</name>
<name lang="pt_br">Alimentação</name>
<name lang="de">Netzquellen</name>
<name lang="el">Παροχές δικτύου</name>
<name lang="nl">Netvoedingen</name>
<name lang="cs">Napájení</name>
<name lang="cs">Síťové zdroje</name>
<name lang="es">Fuentes de red</name>
<name lang="da">Netværkskilder</name>
<name lang="ja">電源網</name>
<name lang="hu">Hálózati források</name>
</names>
</qet-directory>

View File

@@ -5,14 +5,13 @@
<name lang="nl">1 fase + aarde + nul</name>
<name lang="el">Μονοφασικό +N +PE</name>
<name lang="de">Wechselstrom + PE +N</name>
<name lang="cs">Přípojnice 1f+N+PE</name>
<name lang="cs">1 fáze + PE +N</name>
<name lang="pl">Linia jednofazowa (trójprzewodowa)</name>
<name lang="it">Sorgente unipolare + PE +N</name>
<name lang="ar">مصدر وحيد القطبية + أرضي PE + محايد N</name>
<name lang="en">Single-pole source + PE +N</name>
<name lang="fr">Source unipolaire + PE +N</name>
<name lang="ru">Однополюсный + PE +N</name>
<name lang="hu">F + N + PE</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -5,14 +5,13 @@
<name lang="nl">1 fase + aardenul</name>
<name lang="el">Μονοφασικό +PEN</name>
<name lang="de">Wechselstrom + PEN</name>
<name lang="cs">Přípojnice 1f+PEN</name>
<name lang="cs">1 fáze + PEN</name>
<name lang="pl">Linia jednofazowa (TN-C)</name>
<name lang="it">Sorgente unipolare + PEN</name>
<name lang="ar">مصدر وحيد القطبية +PEN</name>
<name lang="en">Single-pole source +PEN</name>
<name lang="fr">Source unipolaire + PEN</name>
<name lang="ru">Однополюсный + PEN</name>
<name lang="hu">F + PEN</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -6,16 +6,15 @@
<name lang="nl">Wisselspanning L + nul N</name>
<name lang="el">Μονοφασικό + Ουδέτερος</name>
<name lang="de">Wechselstrom L + N</name>
<name lang="cs">Přípojnice 1f+N</name>
<name lang="cs">Jednopólový zdroj + nulový</name>
<name lang="pl">Linia jednofazowa (dwuprzewodowa)</name>
<name lang="it">Sorgente unipolare + neutro</name>
<name lang="ar">مصدر وحيد القطبية + محايد N</name>
<name lang="en">Single-pole source + neutral</name>
<name lang="fr">Source unipolaire + neutre</name>
<name lang="ru">Однополюсный + нейтраль</name>
<name lang="hu">F + N</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<input x="-5" y="-25.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -6,16 +6,15 @@
<name lang="nl">3fasen</name>
<name lang="el">Τριφασικό</name>
<name lang="de">Drehstrom</name>
<name lang="cs">Přípojnice 3f</name>
<name lang="cs">Třípólový zdroj</name>
<name lang="pl">Linia trójfazowa (trójprzewodowa)</name>
<name lang="it">Sorgente tripolare</name>
<name lang="ar">مصدر ثلاثي القطبيّة</name>
<name lang="en">Three-pole source</name>
<name lang="fr">Source tripolaire</name>
<name lang="ru">Трёхполюсный</name>
<name lang="hu">3F</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<input x="-2" y="-34.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -5,14 +5,13 @@
<name lang="nl">driefase + aarde + nul</name>
<name lang="el">Τριφασικό +N +PE</name>
<name lang="de">Drehstrom + PE +N</name>
<name lang="cs">Přípojnice 3f+N+PE</name>
<name lang="cs">3 fáze + PE +N</name>
<name lang="pl">Linia trójfazowa (pięcioprzewodowa)</name>
<name lang="it">Sorgente tripolare +PE + N</name>
<name lang="ar">مصدر ثلاثي القطبية + PE + N</name>
<name lang="en">Three-pole source + PE +N</name>
<name lang="fr">Source tripolaire + PE +N</name>
<name lang="ru">Трёхполюсный + PE +N</name>
<name lang="hu">3F + N + PE</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -5,14 +5,13 @@
<name lang="nl">driefasen + aardenul</name>
<name lang="el">Τριφασικό + PEN</name>
<name lang="de">Drehstrom + PEN</name>
<name lang="cs">Přípojnice 3f+PEN</name>
<name lang="cs">3 fáze + PEN</name>
<name lang="pl">Linia trójfazowa (PEN)</name>
<name lang="it">Sorgente tripolare + PEN</name>
<name lang="ar">مصدر ثلاثي القطبيّة + PEN</name>
<name lang="en">Three-pole source + PEN</name>
<name lang="fr">Source tripolaire + PEN</name>
<name lang="ru">Трёхполюсный + PEN</name>
<name lang="hu">3F + PEN</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -6,16 +6,15 @@
<name lang="nl">Driefasen + nul</name>
<name lang="el">Τριφασικό + Ουδέτερος</name>
<name lang="de">Dreiphasig + Neutral</name>
<name lang="cs">Přípojnice 3f+N</name>
<name lang="cs">Třípólový zdroj + nulový</name>
<name lang="pl">Linia trójfazowa (czteroprzewodowa)</name>
<name lang="it">Sorgente tripolare + neutro</name>
<name lang="ar">مصدر ثلاثي القطبيّة + محايد</name>
<name lang="en">Three-pole source + neutral</name>
<name lang="fr">Source tripolaire + neutre</name>
<name lang="ru">Трёхполюсный + нейтраль</name>
<name lang="hu">3F + N</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<input x="-7" y="-44.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -6,14 +6,13 @@
<name lang="nl">Nul voeding</name>
<name lang="el">Ουδέτερος</name>
<name lang="de">Neutralleiter</name>
<name lang="cs">Přípojnice N</name>
<name lang="cs">Nulový zdroj</name>
<name lang="pl">Przewód neutralny</name>
<name lang="it">Sorgente neutro</name>
<name lang="ar">مصدر محايد</name>
<name lang="en">Neutral source</name>
<name lang="fr">Source neutre</name>
<name lang="ru">Нейтраль</name>
<name lang="hu">N</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -6,16 +6,15 @@
<name lang="nl">Fase</name>
<name lang="el">Φάση</name>
<name lang="de">Phase</name>
<name lang="cs">Přípojnice L</name>
<name lang="cs">Fázový zdroj</name>
<name lang="pl">Przewód liniowy</name>
<name lang="it">Sorgente fase</name>
<name lang="ar">مصدر وجه</name>
<name lang="en">Phase source</name>
<name lang="fr">Source phase</name>
<name lang="ru">Фаза</name>
<name lang="hu">F</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<input x="-6" y="-14.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -11,7 +11,6 @@
<name lang="en">Distribution point TN-C >TN-S</name>
<name lang="fr">Point de distribution TN-C >TN-S</name>
<name lang="ru">Распределительный пункт TN-C >TN-S</name>
<name lang="hu">3F + PEN szétválasztva TN-C-ről TN-S-re</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -2,7 +2,7 @@
<uuid uuid="{e4e753a8-9fde-4e8e-9256-0cf99d67e3de}"/>
<names>
<name lang="pt">Terra</name>
<name lang="cs">Uzemnění</name>
<name lang="cs">Země</name>
<name lang="it">Terra</name>
<name lang="el">Γείωση</name>
<name lang="nl">Aarde</name>
@@ -13,7 +13,6 @@
<name lang="es">Tierra</name>
<name lang="ar">تأريض</name>
<name lang="fr">Terre</name>
<name lang="hu">Földelő</name>
</names>
<elementInformations>
<elementInformation name="comment" show="1"></elementInformation>
@@ -28,7 +27,7 @@
<elementInformation name="plant" show="1"></elementInformation>
<elementInformation name="label" show="1"></elementInformation>
</elementInformations>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<dynamic_text uuid="{0af57a27-1887-4576-8b51-200ca996e582}" Halignment="AlignLeft" frame="false" x="2" Valignment="AlignTop" text_from="ElementInfo" y="-22.5" font="Sans Serif,9,-1,5,50,0,0,0,0,0" z="1" rotation="0" text_width="-1">

View File

@@ -1,23 +1,15 @@
<definition width="20" version="0.90" type="element" height="20" hotspot_y="9" link_type="simple" hotspot_x="9">
<uuid uuid="{1eefef79-1c23-413b-873a-3d84f4aa5c25}"/>
<definition width="20" height="20" hotspot_y="9" type="element" link_type="simple" hotspot_x="9" version="0.60">
<uuid uuid="{079913f8-18b5-4524-84bd-aadf75dfefbf}"/>
<names>
<name lang="fr">connexion</name>
<name lang="en">connection</name>
<name lang="cs">Bod</name>
<name lang="de">Verbindung</name>
<name lang="hu">Keresztezés pont alakzatban</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<circle y="-2" style="line-style:normal;line-weight:normal;filling:black;color:black" antialias="false" diameter="4" x="-2"/>
<dynamic_text y="-14.5" Valignment="AlignTop" keep_visual_rotation="false" text_from="ElementInfo" uuid="{2aef950d-c62d-4d3c-939b-3e81653d5244}" Halignment="AlignLeft" x="-11" font="Sans Serif,9,-1,5,50,0,0,0,0,0" rotation="0" z="2" text_width="-1" frame="false">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<terminal y="0" type="Generic" uuid="{9cc2fc56-976f-49ac-a0f8-63eb85f716c2}" orientation="e" x="2" name=""/>
<terminal y="0" type="Generic" uuid="{3c4b4f5e-98a2-4daa-9a47-40b8e018166e}" orientation="w" x="-2" name=""/>
<terminal y="2" type="Generic" uuid="{8d99aa04-def0-4573-a0e8-41229ed2f1dc}" orientation="s" x="0" name=""/>
<terminal y="-2" type="Generic" uuid="{f2e49ff6-ee59-492e-a6ad-82708479afd6}" orientation="n" x="0" name=""/>
<circle diameter="4" style="line-style:normal;line-weight:normal;filling:black;color:black" antialias="false" y="-2" x="-2"/>
<input rotate="true" text=" " tagg="label" size="9" y="-3" x="-11"/>
<terminal orientation="e" y="0" x="2"/>
<terminal orientation="w" y="0" x="-2"/>
<terminal orientation="s" y="2" x="0"/>
<terminal orientation="n" y="-2" x="0"/>
</description>
</definition>

View File

@@ -2,7 +2,6 @@
<uuid uuid="{141e7e1e-4f7f-456d-9f04-52c32109b969}"/>
<names>
<name lang="en">Combine</name>
<name lang="de">Klemmstelle (2)</name>
<name lang="fr">Jonction</name>
<name lang="es">Unión</name>
<name lang="it">Collegamento</name>
@@ -10,7 +9,6 @@
<name lang="ar">وصلة</name>
<name lang="ru">Соединение</name>
<name lang="cs">Spoj</name>
<name lang="hu">Egyesítő három vezetékhez</name>
</names>
<elementInformations/>
<informations></informations>

View File

@@ -1,25 +1,22 @@
<definition link_type="terminal" width="20" height="20" hotspot_y="7" type="element" version="0.80" hotspot_x="11">
<uuid uuid="{95725a69-d9bf-4186-938c-1f1b9256530b}"/>
<definition hotspot_y="7" width="20" type="element" height="20" version="0.70" hotspot_x="11" link_type="terminal">
<uuid uuid="{2d505b61-db0f-4784-9b9c-189366058272}"/>
<names>
<name lang="it">Angolo</name>
<name lang="es">Esquina</name>
<name lang="en">Corner</name>
<name lang="cs">Roh</name>
<name lang="fr">Coin</name>
<name lang="ru">Угол</name>
<name lang="pl">Narożnik</name>
<name lang="ar">ركن</name>
<name lang="es">Esquina</name>
<name lang="ru">Угол</name>
<name lang="en">Corner</name>
<name lang="de">Ecke</name>
<name lang="cs">Roh</name>
<name lang="hu">Sarok</name>
<name lang="it">Angolo</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<dynamic_text rotation="0" font="Sans Serif,9,-1,5,0,0,0,0,0,0,normal" text_width="-1" x="-0.5" z="1" Halignment="AlignLeft" Valignment="AlignTop" text_from="UserText" frame="false" y="-5.45" uuid="{9b8dd22d-096a-4989-b6f7-1de9e0339f53}">
<dynamic_text rotation="0" x="-0.5" y="-5.45" uuid="{9b8dd22d-096a-4989-b6f7-1de9e0339f53}" font_size="1" z="1" frame="false" text_from="UserText" text_width="-1">
<text>_</text>
</dynamic_text>
<polygon style="line-style:normal;line-weight:normal;filling:none;color:black" x1="-4" y2="0" y1="0" antialias="false" x2="0" x3="0" y3="4" closed="false"/>
<terminal name="" orientation="w" x="-4" y="0" uuid="{e1ea331a-7456-47f0-b991-0a2299d3023c}"/>
<terminal name="" orientation="s" x="0" y="4" uuid="{eacfd29f-4682-41c2-9783-cedb80773f13}"/>
<terminal x="0" y="4" orientation="s"/>
<terminal x="-4" y="0" orientation="w"/>
</description>
</definition>

View File

@@ -1,29 +1,25 @@
<definition hotspot_y="9" link_type="terminal" height="20" hotspot_x="9" version="0.80" type="element" width="20">
<uuid uuid="{30794dcd-a269-4b6b-8231-c88d89a91e27}"/>
<definition height="20" link_type="terminal" hotspot_x="9" width="20" hotspot_y="9" version="0.70" type="element">
<uuid uuid="{8c0d3e9c-dc37-41d7-bfd5-fe4dbf8dc4fb}"/>
<names>
<name lang="cs">Kříž</name>
<name lang="ar">صليب</name>
<name lang="hu">Kereszt alakú</name>
<name lang="it">Croce</name>
<name lang="pl">Połączenie 2</name>
<name lang="ru">Пересечение</name>
<name lang="fr">Croix</name>
<name lang="de">Kreuz</name>
<name lang="en">Cross</name>
<name lang="cs">Kříž</name>
<name lang="pl">Połączenie 2</name>
<name lang="it">Croce</name>
<name lang="es">Cruzar</name>
<name lang="en">Cross</name>
<name lang="ar">صليب</name>
<name lang="fr">Croix</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<circle y="-1" x="-1" antialias="true" diameter="2" style="line-style:normal;line-weight:normal;filling:black;color:black"/>
<dynamic_text y="-9.45" text_width="-1" x="-0.5" text_from="UserText" Valignment="AlignTop" rotation="0" Halignment="AlignLeft" z="2" frame="false" font="Sans Serif,9,-1,5,0,0,0,0,0,0,normal" uuid="{fc5c039b-1fca-40d9-a6ff-a9e1775de38b}">
<circle y="-1" style="line-style:normal;line-weight:normal;filling:black;color:black" x="-1" antialias="true" diameter="2"/>
<dynamic_text uuid="{fc5c039b-1fca-40d9-a6ff-a9e1775de38b}" text_width="-1" frame="false" y="-9.45" font_size="1" x="-0.5" z="2" rotation="0" text_from="UserText">
<text>_</text>
</dynamic_text>
<line y1="0" y2="0" x1="-4" antialias="false" end1="none" length1="1.5" length2="1.5" x2="4" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black"/>
<line y1="-4" y2="4" x1="0" antialias="false" end1="none" length1="1.5" length2="1.5" x2="0" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black"/>
<terminal y="-4" name="" x="0" orientation="n" uuid="{667d83d2-8840-40ec-bf41-8dc659926fe2}"/>
<terminal y="4" name="" x="0" orientation="s" uuid="{c9b40e74-5d24-4cd5-9dc7-3be318007661}"/>
<terminal y="0" name="" x="-4" orientation="w" uuid="{935e3f1e-3dc0-4b41-8252-6e7ee9f1a3e1}"/>
<terminal y="0" name="" x="4" orientation="e" uuid="{340c983a-1f7e-4939-b844-c50c8e28302d}"/>
<terminal y="0" orientation="e" x="4"/>
<terminal y="4" orientation="s" x="0"/>
<terminal y="-4" orientation="n" x="0"/>
<terminal y="0" orientation="w" x="-4"/>
</description>
</definition>

View File

@@ -2,7 +2,6 @@
<uuid uuid="{b5abb4c2-455d-45ff-95f2-328521f4e2e1}"/>
<names>
<name lang="en">Jump</name>
<name lang="de">Sprung</name>
<name lang="fr">Saut</name>
<name lang="ar">قفز</name>
<name lang="cs">Skok</name>
@@ -10,7 +9,6 @@
<name lang="pl">Brak połączenia</name>
<name lang="ru">Перемычка</name>
<name lang="es">Puente</name>
<name lang="hu">Átugrás összekötés nélkül</name>
</names>
<elementInformations/>
<informations></informations>

View File

@@ -1,24 +1,19 @@
<definition type="element" width="30" hotspot_y="12" version="0.90" height="30" link_type="simple" hotspot_x="14">
<uuid uuid="{9b3513fd-694f-4fc7-8b7e-66b733b9b4e1}"/>
<definition version="0.70" height="30" type="element" width="30" hotspot_x="14" link_type="simple" hotspot_y="12">
<uuid uuid="{3015326e-2599-495e-8ef0-c12ff5313dd0}"/>
<names>
<name lang="de">Klemmstelle (3)</name>
<name lang="cs">Všestranný spoj</name>
<name lang="hu">Egyesítő négy vezetékhez</name>
<name lang="fr">
Connecteur pour quatre fils</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<dynamic_text frame="false" text_width="-1" rotation="0" Halignment="AlignLeft" y="-12" x="-13" keep_visual_rotation="true" uuid="{14c0b70c-c028-49ef-bf72-3c3c9cd64669}" Valignment="AlignTop" z="2" font="Sans Serif,9,-1,5,50,0,0,0,0,0" text_from="ElementInfo">
<polygon x6="6" x2="-5" x8="6" y5="5" y2="0" closed="false" x10="0" x3="0" x7="10" y7="0" y4="10" y11="-5" antialias="false" x9="0" x11="0" style="line-style:normal;line-weight:normal;filling:none;color:black" x5="0" y9="5" y10="-5" y1="0" y6="0" x4="0" x1="-10" y8="0" y3="5"/>
<dynamic_text font="Sans Serif,9,-1,5,50,0,0,0,0,0" frame="false" x="-13" text_from="ElementInfo" y="-12" z="2" rotation="0" Valignment="AlignTop" text_width="-1" uuid="{14c0b70c-c028-49ef-bf72-3c3c9cd64669}" Halignment="AlignLeft">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<polygon x1="-10" y2="0" x4="5" y3="5" x3="0" x5="10" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" y4="0" antialias="false" x2="-5" y5="0" closed="false"/>
<line x1="0" y2="10" length2="1.5" end1="none" length1="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" y1="-5" antialias="false" x2="0"/>
<terminal type="Generic" name="" y="0" x="10" uuid="{06bf5c9f-6986-45bf-b11f-02e876abc4b8}" orientation="e"/>
<terminal type="Generic" name="" y="-5" x="0" uuid="{33c03677-8555-4b42-ae2c-4b4308978086}" orientation="n"/>
<terminal type="Generic" name="" y="0" x="-10" uuid="{95bef6e9-343e-45d7-9705-4aa81f62bed0}" orientation="w"/>
<terminal type="Generic" name="" y="10" x="0" uuid="{e9329e22-255b-4763-9dc6-65da277e1ac7}" orientation="s"/>
<terminal x="0" y="-5" orientation="n"/>
<terminal x="0" y="10" orientation="s"/>
<terminal x="-10" y="0" orientation="w"/>
<terminal x="10" y="0" orientation="e"/>
</description>
</definition>

View File

@@ -0,0 +1,17 @@
<definition type="element" hotspot_x="35" version="0.80" width="70" height="80" hotspot_y="46" link_type="simple">
<uuid uuid="{e5a46987-e259-4ca4-9e40-eedc3652f738}"/>
<names>
<name lang="cs">Pokus</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<rect width="60" x="-30" style="line-style:normal;line-weight:normal;filling:none;color:black" height="65" rx="0" y="-35" antialias="false" ry="0"/>
<dynamic_text z="3" font="Sans Serif,9,-1,5,0,0,0,0,0,0,normal" Valignment="AlignTop" uuid="{cec75afa-b854-41b8-aed8-6edba82c76ff}" text_from="ElementInfo" x="-45" text_width="-1" y="-20" frame="false" rotation="0" Halignment="AlignLeft">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<terminal orientation="n" x="20" y="-40"/>
<terminal orientation="n" x="-20" y="-40"/>
</description>
</definition>

View File

@@ -6,13 +6,11 @@
<name lang="fr">Connections</name>
<name lang="it">Collegamenti</name>
<name lang="pl">Połączenia</name>
<name lang="pt_br">Conexões</name>
<name lang="cs">Spojení</name>
<name lang="el">Ενώσεις</name>
<name lang="nl">Verbindingen</name>
<name lang="es">Conexiones</name>
<name lang="da">Forbindelser</name>
<name lang="ja">接続</name>
<name lang="hu">Csatlakozások</name>
</names>
</qet-directory>

View File

@@ -1,26 +1,25 @@
<definition width="30" version="0.80" hotspot_x="17" hotspot_y="4" link_type="terminal" type="element" height="20">
<uuid uuid="{5a3d6c01-db95-45ec-be2c-dd861938525b}"/>
<definition type="element" height="20" width="30" version="0.70" hotspot_y="4" link_type="terminal" hotspot_x="17">
<uuid uuid="{709e6400-adc2-4faf-ba46-aa513d1dcaf1}"/>
<names>
<name lang="fr">Epissure</name>
<name lang="cs">Spojka</name>
<name lang="es">Empalme</name>
<name lang="pl">Połączenie 3</name>
<name lang="it">Spaziatura</name>
<name lang="cs">Spojka</name>
<name lang="en">Splice</name>
<name lang="de">Spleiß</name>
<name lang="hu">Egyesítő három vezetékhez</name>
<name lang="it">Spaziatura</name>
<name lang="ru">Сращивание</name>
<name lang="es">Empalme</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<dynamic_text Valignment="AlignTop" y="-1.45" text_width="-1" frame="false" x="1.5" Halignment="AlignLeft" uuid="{b653b162-d4c8-4660-a5ca-e6ca05a56de9}" text_from="ElementInfo" font="Sans Serif,9,-1,5,0,0,0,0,0,0,normal" rotation="0" z="1">
<dynamic_text text_width="-1" x="1.5" rotation="0" frame="false" uuid="{b653b162-d4c8-4660-a5ca-e6ca05a56de9}" font_size="1" z="1" text_from="ElementInfo" y="-1.45">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<polygon y1="0" y2="0" style="line-style:normal;line-weight:normal;filling:none;color:black" x4="0" y4="5" x3="-5" antialias="false" x2="-10" y5="10" x5="0" closed="false" x1="4" y3="0"/>
<terminal y="10" x="0" uuid="{1d3bb613-e8e2-4bcd-8515-ff9a0459b3c3}" name="" orientation="s"/>
<terminal y="0" x="-10" uuid="{367dd739-791b-4d8f-9e49-4a70fd990b19}" name="" orientation="w"/>
<terminal y="0" x="4" uuid="{f75b8c8d-508b-4346-a6df-8cda82201d98}" name="" orientation="e"/>
<line x2="-6" antialias="false" x1="0" end2="none" y2="0" end1="none" length2="1.5" length1="1.5" y1="6" style="line-style:normal;line-weight:normal;filling:none;color:black"/>
<line x2="-5" antialias="false" x1="1" end2="none" y2="0" end1="none" length2="1.5" length1="1.5" y1="0" style="line-style:normal;line-weight:normal;filling:none;color:black"/>
<terminal x="0" orientation="s" y="10"/>
<terminal x="-10" orientation="w" y="0"/>
<terminal x="4" orientation="e" y="0"/>
</description>
</definition>

View File

@@ -1,27 +1,25 @@
<definition height="20" version="0.80" hotspot_x="17" link_type="terminal" width="30" type="element" hotspot_y="4">
<uuid uuid="{3dd412d9-6882-42ae-9f5f-eb04f2224214}"/>
<definition hotspot_y="4" height="20" hotspot_x="17" type="element" width="30" link_type="terminal" version="0.70">
<uuid uuid="{9e88368e-1b20-4a56-8941-5d17a4cce2d4}"/>
<names>
<name lang="hu">Balra továbbmenő leágazás</name>
<name lang="es">A la izquierda</name>
<name lang="ar">ربط يسار</name>
<name lang="pl">Połączenie 4</name>
<name lang="it">Collegamento sinistro</name>
<name lang="ru">Справа налево</name>
<name lang="de">Abzweig links</name>
<name lang="en">Thru left</name>
<name lang="fr">Liaison gauche</name>
<name lang="cs">Levé spojení</name>
<name lang="ru">Справа налево</name>
<name lang="fr">Liaison gauche</name>
<name lang="en">Thru left</name>
<name lang="ar">ربط يسار</name>
<name lang="it">Collegamento sinistro</name>
<name lang="pl">Połączenie 4</name>
<name lang="es">A la izquierda</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<dynamic_text text_width="-1" text_from="UserText" Valignment="AlignTop" x="1.5" frame="false" rotation="0" uuid="{5ff9bef8-b6a8-4cf8-ba82-4dabe7b1820f}" z="1" y="-1.45" Halignment="AlignLeft" font="Sans Serif,9,-1,5,0,0,0,0,0,0,normal">
<dynamic_text font_size="1" rotation="0" uuid="{5ff9bef8-b6a8-4cf8-ba82-4dabe7b1820f}" text_width="-1" frame="false" text_from="UserText" z="1" x="1.5" y="-1.45">
<text>_</text>
</dynamic_text>
<polygon y1="0" x4="0" x2="-5" x3="0" antialias="false" y2="0" y3="5" style="line-style:normal;line-weight:normal;filling:none;color:black" y4="10" x1="-10" closed="false"/>
<polygon y1="10" x2="0" x3="4" antialias="false" y2="0" y3="0" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="0" closed="false"/>
<terminal x="0" uuid="{46980c8f-3fb1-4993-b1ec-6f3b60832fab}" orientation="s" name="" y="10"/>
<terminal x="-10" uuid="{401a02b0-a3d8-4f09-bd65-c4a6ad782686}" orientation="w" name="" y="0"/>
<terminal x="4" uuid="{223e7aaa-f9ff-47e6-b901-89471848b8de}" orientation="e" name="" y="0"/>
<line x1="0" length1="1.5" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="6" y2="0" end1="none" antialias="false" x2="-6"/>
<line x1="0" length1="1.5" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" y2="5" end1="none" antialias="false" x2="0"/>
<terminal x="4" orientation="e" y="0"/>
<terminal x="-10" orientation="w" y="0"/>
<terminal x="0" orientation="s" y="10"/>
</description>
</definition>

View File

@@ -1,27 +1,26 @@
<definition width="30" type="element" hotspot_x="14" version="0.80" hotspot_y="4" height="20" link_type="terminal">
<uuid uuid="{8e68cb1a-e9d8-42e4-aa67-aca8b6e6b32d}"/>
<definition link_type="terminal" width="30" hotspot_x="14" height="20" version="0.70" hotspot_y="4" type="element">
<uuid uuid="{6e40fff3-691c-4622-b9aa-4ff930a5b981}"/>
<names>
<name lang="it">Collegamento destro</name>
<name lang="fr">Liaison droite</name>
<name lang="ru">Слева направо</name>
<name lang="hu">Jobbra továbbmenő leágazás</name>
<name lang="cs">Pravé spojení</name>
<name lang="de">Abzweig rechts</name>
<name lang="en">Thru right</name>
<name lang="ru">Слева направо</name>
<name lang="cs">Pravé spojení</name>
<name lang="fr">Liaison droite</name>
<name lang="it">Collegamento destro</name>
<name lang="es">A la derecha</name>
<name lang="pl">Połączenie 5</name>
<name lang="ar">ربط يمين</name>
<name lang="pl">Połączenie 5</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<dynamic_text z="1" Halignment="AlignLeft" text_width="-1" y="-0.45" uuid="{ab829572-e7d6-4e5c-9c6e-a0852fea788e}" font="Sans Serif,9,-1,5,0,0,0,0,0,0,normal" Valignment="AlignTop" text_from="UserText" x="5.5" frame="false" rotation="0">
<dynamic_text text_width="-1" y="-0.45" rotation="0" uuid="{ab829572-e7d6-4e5c-9c6e-a0852fea788e}" x="5.5" frame="false" text_from="UserText" font_size="1" z="1">
<text>_</text>
</dynamic_text>
<polygon y4="0" x4="10" x1="0" y2="5" style="line-style:normal;line-weight:normal;filling:none;color:black" x3="5" closed="false" y1="10" y3="0" x2="0" antialias="false"/>
<polygon x1="0" y2="0" style="line-style:normal;line-weight:normal;filling:none;color:black" x3="-10" closed="false" y1="10" y3="0" x2="0" antialias="false"/>
<terminal y="0" uuid="{53d9bb7f-b045-4581-bc2d-7a9198286e89}" name="" orientation="w" x="-10"/>
<terminal y="10" uuid="{7883adda-c1cd-4e21-93f5-330d9c7461ea}" name="" orientation="s" x="0"/>
<terminal y="0" uuid="{053ce092-f1df-46a5-8960-e4c6fcea95d1}" name="" orientation="e" x="10"/>
<line antialias="false" x1="0" y1="0" style="line-style:normal;line-weight:normal;filling:none;color:black" length1="1.5" end2="none" end1="none" y2="0" length2="1.5" x2="-6"/>
<line antialias="false" x1="0" y1="0" style="line-style:normal;line-weight:normal;filling:none;color:black" length1="1.5" end2="none" end1="none" y2="5" length2="1.5" x2="0"/>
<line antialias="false" x1="6" y1="0" style="line-style:normal;line-weight:normal;filling:none;color:black" length1="1.5" end2="none" end1="none" y2="6" length2="1.5" x2="0"/>
<terminal orientation="s" y="10" x="0"/>
<terminal orientation="w" y="0" x="-10"/>
<terminal orientation="e" y="0" x="10"/>
</description>
</definition>

View File

@@ -0,0 +1,25 @@
<definition width="120" version="0.3" hotspot_x="71" hotspot_y="10" height="40" type="element">
<names>
<name lang="ar">كايبل طورين + تأريض</name>
<name lang="de">Kabel 3G</name>
<name lang="ru">Кабель 2 жилы + PE</name>
<name lang="it">Cavo 2 fasi + terra</name>
<name lang="fr">Cable 2 phases+terre</name>
<name lang="pl">Oznaczenie przewodu czterożyłowego</name>
<name lang="es">Cable 2 fases+tierra</name>
<name lang="cs">Označení drátového propojení - 2 fáze + země</name>
</names>
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<text x="12" y="9" size="4" text="2"/>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="26.95" y2="11.95" x2="30.95"/>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="8" x1="8" y2="12" x2="12"/>
<text x="30.5" y="8.55" size="4" text="GNYE"/>
<input x="-68" y="17" size="3" rotate="true" text="210007&#xa;4G1,5 mm²&#xa; 4m"/>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="10" x1="-39.9373" y2="10" x2="37.932"/>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="8" x1="-32" y2="12" x2="-28"/>
<text x="-28" y="9" size="4" text="1"/>
<input x="-61" y="1" size="5" rotate="true" text="+"/>
</description>
</definition>

View File

@@ -7,10 +7,9 @@
<name lang="fr">Cable 3 phases+terre</name>
<name lang="pl">Oznaczenie przewodu czterożyłowego</name>
<name lang="es">Cable 3 fases+tierra</name>
<name lang="cs">Kabel 4G</name>
<name lang="hu">Kábel 3 + PE</name>
<name lang="cs">Označení drátového propojení - 3 fáze + země</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="-12.05" y2="11.95" x2="-8.05"/>

View File

@@ -7,10 +7,9 @@
<name lang="fr">Cable 2 phases+terre</name>
<name lang="pl">Oznaczenie przewodu czterożyłowego</name>
<name lang="es">Cable 2 fases+tierra</name>
<name lang="cs">Kabel 3G</name>
<name lang="hu">Kábel 2 + PE</name>
<name lang="cs">Označení drátového propojení - 2 fáze + země</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="17.95" y2="11.95" x2="21.95"/>

View File

@@ -5,10 +5,8 @@
<name lang="fr">Cable 4G</name>
<name lang="pl">Przewód czterożyłowy</name>
<name lang="es">Cable 4G</name>
<name lang="cs">Kabel 4G</name>
<name lang="hu">Kábel 3 + PE</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="-33.05" y2="11.95" x2="-29.05"/>

View File

@@ -5,10 +5,8 @@
<name lang="it">Cavo Type 5G</name>
<name lang="es">Cable 5G</name>
<name lang="pl">Przewód pięciożyłowy</name>
<name lang="cs">Kabel 5G</name>
<name lang="hu">Kábel 4 + N + PE</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line end1="none" x1="-42.05" y1="7.95" x2="-38.05" length1="1.5" y2="11.95" antialias="true" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black"/>

View File

@@ -5,10 +5,8 @@
<name lang="fr">Cable 3G</name>
<name lang="es">Cable 3G</name>
<name lang="pl">Przewód trójżyłowy</name>
<name lang="cs">Kabel 3G</name>
<name lang="hu">Kábel 2 + PE</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line end1="none" x1="-23.05" y1="7.95" x2="-19.05" length1="1.5" y2="11.95" antialias="true" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black"/>

View File

@@ -2,14 +2,13 @@
<uuid uuid="{4b9a04b1-0d35-4d54-b5cb-b573ed3a9b0d}"/>
<names>
<name lang="de">Kabel 3x</name>
<name lang="cs">Kabel 3x</name>
<name lang="cs">Označení drátového propojení 3 vodiče</name>
<name lang="pl">Oznaczenie przewodu trójżyłowego</name>
<name lang="it">Cavo a 3 conduttori</name>
<name lang="en">Cable 3 wires</name>
<name lang="es">Cable 3 alambres</name>
<name lang="fr">Cable 3 brins</name>
<name lang="ru">Кабель 3 жилы</name>
<name lang="hu">Kábel 3 + PE</name>
</names>
<informations></informations>
<description>

View File

@@ -4,7 +4,7 @@
<name lang="nl">Scherm</name>
<name lang="el">Πλέγμα</name>
<name lang="de">Schirm</name>
<name lang="cs">Stínění</name>
<name lang="cs">Obrazovka</name>
<name lang="pl">Ekran 3</name>
<name lang="it">Schermo</name>
<name lang="ar">شاشة</name>
@@ -12,7 +12,6 @@
<name lang="es">Pantalla</name>
<name lang="fr">Ecran</name>
<name lang="ru">Экран</name>
<name lang="hu">Árnyékolás</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -2,14 +2,13 @@
<uuid uuid="{6ac285f9-6492-40cb-be58-9ba565ea1921}"/>
<names>
<name lang="de">Kabelader</name>
<name lang="cs">Vodič kabelu</name>
<name lang="cs">Vedení kabelu</name>
<name lang="pl">Połączenie przewodu</name>
<name lang="it">Conduttore di un cavo</name>
<name lang="en">Wire of cable</name>
<name lang="es">Alambre del cable</name>
<name lang="fr">Fil de cable</name>
<name lang="ru">Жила кабеля</name>
<name lang="hu">Kábelér</name>
</names>
<informations></informations>
<description>

View File

@@ -2,13 +2,12 @@
<uuid uuid="{374ed6b3-7329-4cad-ac8c-200b17508460}"/>
<names>
<name lang="de">Verdrahtung</name>
<name lang="cs">Vodič kabelu</name>
<name lang="cs">Drátové propojení</name>
<name lang="pl">Oznaczenie przewodu</name>
<name lang="it">Conduttura</name>
<name lang="en">Wiring</name>
<name lang="es">Alambrado</name>
<name lang="fr">Filerie</name>
<name lang="hu">Vezeték</name>
</names>
<informations></informations>
<description>

View File

@@ -4,10 +4,9 @@
<name lang="de">Kabel 3G</name>
<name lang="fr">Cable 3G</name>
<name lang="cs">Kabel 3G</name>
<name lang="hu">Kábel 2 + PE</name>
</names>
<elementInformations/>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line x2="1.95" end1="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05" length2="1.5" antialias="true" y2="1.95" end2="none" x1="-2.05" length1="1.5"/>

View File

@@ -8,9 +8,8 @@
<name lang="es">Cable 3 fases+tierra</name>
<name lang="it">Cavo 3 fasi + terra</name>
<name lang="fr">Cable 3 phases+terre</name>
<name lang="hu">Kábel 3 + PE</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line x1="-2.05" y1="-2.05" end1="none" style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" length1="1.5" length2="1.5" x2="1.95" y2="1.95" antialias="true"/>

View File

@@ -8,9 +8,8 @@
<name lang="es">Cable 6 fases+tierra</name>
<name lang="it">Cavo fasi + terra</name>
<name lang="fr">Cable 6 phases+terre</name>
<name lang="hu">Kábel 6 + PE</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<input size="4" tagg="none" rotate="true" x="38" y="-4" text="6"/>

View File

@@ -5,13 +5,12 @@
<name lang="es">Clasificación de sección</name>
<name lang="nl">Doorsnede</name>
<name lang="de">Verdrahtungsquerschnitt</name>
<name lang="cs">Průřez vodiče</name>
<name lang="cs">Průřez drátovým propojením</name>
<name lang="pl">Pole przekróju przewodu</name>
<name lang="it">Sezione della nomenclatura</name>
<name lang="ar">تسمية مساحة المقطع </name>
<name lang="en">Wiring section</name>
<name lang="fr">Section de fil</name>
<name lang="hu">Vezeték keresztmetszet</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -0,0 +1,16 @@
<qet-directory>
<names>
<name lang="ru">Кабели и провода</name>
<name lang="en">Cables and wiring</name>
<name lang="es">Cables y alambres</name>
<name lang="fr">Câbles et filerie</name>
<name lang="it">Cavi e collegamenti</name>
<name lang="pl">Przewody i kable</name>
<name lang="de">Kabel und Verdrahtung</name>
<name lang="el">Καλώδια και καλωδίωση</name>
<name lang="nl">Kabels en draden</name>
<name lang="cs">Kabely a drátové propojení</name>
<name lang="da">Kabler og ledninger</name>
<name lang="ja">ケーブルと配線</name>
</names>
</qet-directory>

View File

@@ -2,14 +2,13 @@
<uuid uuid="{b96a76a6-a798-497b-a044-dd933756d175}"/>
<names>
<name lang="de">Verdrahtungsdefinition 1 Leiter</name>
<name lang="cs">Označení vodiče</name>
<name lang="cs">Označení drátového propojení 1 vodič</name>
<name lang="pl">Oznaczenie pola przekroju przewodu jednożyłowego</name>
<name lang="it">Sezione 1 conduttore</name>
<name lang="fr">Section 1 conducteur</name>
<name lang="es">Sección 1 conductor</name>
<name lang="hu">1 ér keresztmetszet</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line antialias="false" length1="1.5" x2="9.91885" end2="none" x1="-10.8483" end1="none" y2="0" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0"/>

View File

@@ -2,14 +2,13 @@
<uuid uuid="{448ac784-f459-4f8f-bd3f-d911802b3369}"/>
<names>
<name lang="de">Verdrahtungsdefinition 2 Leiter</name>
<name lang="cs">Označení žil 2 vodiče</name>
<name lang="cs">Označení drátového propojení 2 vodiče</name>
<name lang="pl">Oznaczenie pola przekroju przewodu dwużyłowego</name>
<name lang="it">Sezione 2 conduttori</name>
<name lang="fr">Section 2 conducteurs</name>
<name lang="es">Sección 2 conductores</name>
<name lang="hu">2 ér keresztmetszet</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line antialias="true" length1="1.5" x2="41.95" end2="none" x1="37.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/>

View File

@@ -2,14 +2,13 @@
<uuid uuid="{c94d9e16-e3bb-4117-b037-466a15edcb14}"/>
<names>
<name lang="de">Verdrahtungsdefinition 2 Leiter</name>
<name lang="cs">Označení žil 2 vodiče</name>
<name lang="cs">Označení drátového propojení 2 vodiče</name>
<name lang="pl">Oznaczenie pola przekroju przewodu dwużyłowego</name>
<name lang="it">Sezione 2 conduttori</name>
<name lang="fr">Section 2 conducteurs</name>
<name lang="es">Sección 2 conductores</name>
<name lang="hu">2 ér keresztmetszet</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line antialias="true" length1="1.5" x2="21.95" end2="none" x1="17.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/>

View File

@@ -2,14 +2,13 @@
<uuid uuid="{9d939952-9c2b-4b12-898f-262abc91e845}"/>
<names>
<name lang="de">Verdrahtungsdefinition 3 Leiter</name>
<name lang="cs">Označení žil 3 vodiče</name>
<name lang="cs">Označení drátového propojení 3 vodiče</name>
<name lang="pl">Oznaczenie pola przekroju przewodu trójżyłowego</name>
<name lang="it">Sezione 3 conduttori</name>
<name lang="fr">Section 3 conducteurs</name>
<name lang="es">Sección 3 conductores</name>
<name lang="hu">3 ér keresztmetszet</name>
</names>
<informations>Author: The QElectroTech team
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<line antialias="true" length1="1.5" x2="41.95" end2="none" x1="37.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/>

View File

@@ -1,26 +0,0 @@
<definition width="120" version="0.3" hotspot_x="71" hotspot_y="10" height="40" type="element">
<names>
<name lang="ar">كايبل طورين + تأريض</name>
<name lang="de">Kabel 3G</name>
<name lang="ru">Кабель 2 жилы + PE</name>
<name lang="it">Cavo 2 fasi + terra</name>
<name lang="fr">Cable 2 phases+terre</name>
<name lang="pl">Oznaczenie przewodu czterożyłowego</name>
<name lang="es">Cable 2 fases+tierra</name>
<name lang="cs">Kabel 3G</name>
<name lang="hu">Kábel 2 + PE</name>
</names>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<text x="12" y="9" size="4" text="2"/>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="26.95" y2="11.95" x2="30.95"/>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="8" x1="8" y2="12" x2="12"/>
<text x="30.5" y="8.55" size="4" text="GNYE"/>
<input x="-68" y="17" size="3" rotate="true" text="210007&#xa;4G1,5 mm²&#xa; 4m"/>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="10" x1="-39.9373" y2="10" x2="37.932"/>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="8" x1="-32" y2="12" x2="-28"/>
<text x="-28" y="9" size="4" text="1"/>
<input x="-61" y="1" size="5" rotate="true" text="+"/>
</description>
</definition>

View File

@@ -1,18 +0,0 @@
<qet-directory>
<names>
<name lang="ru">Кабели и провода</name>
<name lang="en">Cables and wiring</name>
<name lang="es">Cables y alambres</name>
<name lang="fr">Câbles et filerie</name>
<name lang="it">Cavi e collegamenti</name>
<name lang="pl">Przewody i kable</name>
<name lang="pt_br">Cabos e fiação</name>
<name lang="de">Kabel und Verdrahtung</name>
<name lang="el">Καλώδια και καλωδίωση</name>
<name lang="nl">Kabels en draden</name>
<name lang="cs">Kabely a vodiče</name>
<name lang="da">Kabler og ledninger</name>
<name lang="ja">ケーブルと配線</name>
<name lang="hu">Kábelek és vezetékek</name>
</names>
</qet-directory>

View File

@@ -6,8 +6,6 @@
<name lang="fr">Label de bornier</name>
<name lang="de">Klemmleisten-BMK</name>
<name lang="pl">Etykieta listwy zaciskowej</name>
<name lang="cs">Štítek svorkovnice</name>
<name lang="hu">Sorkapocstömb jelölő</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Terminal (feed-through)</name>
<name lang="es">Clema (introducción atravesada)</name>
<name lang="pl">Zacisk</name>
<name lang="cs">Svorka průchozí</name>
<name lang="hu">Sorkapocs átmenő</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Terminal (Grounding)</name>
<name lang="es">Clema (Aterrizada)</name>
<name lang="pl">Zacisk uziemiający</name>
<name lang="cs">Svorka zemnící</name>
<name lang="hu">Sorkapocs földelő</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Discontinuation terminal strip</name>
<name lang="es">Clema de descontinuación</name>
<name lang="it">Morsettiera d'interruzione</name>
<name lang="cs">Přerušení svorkovnice</name>
<name lang="hu">Sorkapocstömb megszakítása</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Terminal double-level (feed-through)</name>
<name lang="es">Clema de doble nivel (Introducción atravesada)</name>
<name lang="it">Morsettiera a doppio livello (interconnesso)</name>
<name lang="cs">Dvoupatrová svorkovnice</name>
<name lang="hu">Kétemeletes sorkapocs</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Insertion bridge</name>
<name lang="es">Puente de inserción</name>
<name lang="it">Barra di connessione</name>
<name lang="cs">Propojka svorkovnic</name>
<name lang="hu">Sorkapocs áthidalás</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="de">Einlegebrücke (doppelte Breite)</name>
<name lang="fr">Barette de pontage (largeur double)</name>
<name lang="it">Barra di connessione (larghezza doppia)</name>
<name lang="cs">Propojka svorkovnic (dvojitá šířka)</name>
<name lang="hu">Sorkapocs áthidalás dupla széles</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="es">Conector de 25 pins</name>
<name lang="de">Stecker 25-polig</name>
<name lang="it">Connettore 25 poli</name>
<name lang="cs">Konektor 25 pinů</name>
<name lang="hu">25 tűs áthidalás</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Device (connection on bottom)</name>
<name lang="es">Dispositivo (conexión por debajo)</name>
<name lang="it">Dispositivo (connessione in basso)</name>
<name lang="cs">Zařízení (připojení zdola)</name>
<name lang="hu">Eszköz (alsó csatlakozás)</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Device (connection on top)</name>
<name lang="es">Dispositivo (conexión por encima)</name>
<name lang="it">Dispositivo (connessione in alto)</name>
<name lang="cs">Zařízení (připojení shora)</name>
<name lang="hu">Eszköz (felső csatlakozás)</name>
</names>
<informations/>
<description>

View File

@@ -6,8 +6,6 @@
<name lang="en">Device (connection on bottom) - beginning</name>
<name lang="es">Dispositivo (conexión por debajo)- iniciando</name>
<name lang="it">Dispositivo (connessione in basso) iniziale</name>
<name lang="cs">Zařízení (připojení zdola) začátek</name>
<name lang="hu">Eszköz (alsó csatlakozás) kezdő tag</name>
</names>
<informations/>
<description>

Some files were not shown because too many files have changed in this diff Show More