Compare commits

..

1 Commits

Author SHA1 Message Date
joshua
de2f161566 Add a combo box to change the QPicture scale of element picture
This is a test commit to see if we can fix the wrong scale of element in
some screen size.:
Add a QComboBox into the QToolBar of the diagram editor to change the
current scale factor of the element QPicture.
2021-04-17 09:50:32 +02:00
6711 changed files with 201243 additions and 342303 deletions

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

@@ -147,6 +147,14 @@ install(DIRECTORY examples DESTINATION share/qelectrotech)
install(DIRECTORY titleblocks DESTINATION share/qelectrotech) install(DIRECTORY titleblocks DESTINATION share/qelectrotech)
install(FILES LICENSE ELEMENTS.LICENSE CREDIT README ChangeLog DESTINATION share/doc/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.desktop DESTINATION share/applications)
install(FILES misc/x-qet-element.xml
misc/x-qet-project.xml
misc/x-qet-titleblock.xml
DESTINATION share/mime/application)
install(FILES misc/x-qet-element.desktop
misc/x-qet-project.desktop
misc/x-qet-titleblock.desktop
DESTINATION share/mimelnk/application)
install(FILES misc/qelectrotech.xml DESTINATION share/mime/packages) install(FILES misc/qelectrotech.xml DESTINATION share/mime/packages)
install(FILES misc/qelectrotech.appdata.xml DESTINATION ${QET_APPDATA_PATH}) install(FILES misc/qelectrotech.appdata.xml DESTINATION ${QET_APPDATA_PATH})
install(FILES ${QM_FILES} DESTINATION ${QET_LANG_PATH}) install(FILES ${QM_FILES} DESTINATION ${QET_LANG_PATH})

View File

@@ -154,52 +154,6 @@ Alternatively, you can export to vector (svg) or pixel (png, jpg, bmp) format im
* conductors num can be exported to csv file. * 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 ### Story
The QElectroTech project was founded in 2007 by two french students, Xavier and Benoit. The QElectroTech project was founded in 2007 by two french students, Xavier and Benoit.

View File

@@ -3,31 +3,6 @@ Changelog
If by accident I have forgotten to credit someone in the CHANGELOG, email me and I will fix it. 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__ __3.2.0__
--------- ---------

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12.0) cmake_minimum_required(VERSION 3.7.0)
project(SingleApplication LANGUAGES CXX) project(SingleApplication LANGUAGES CXX)
@@ -38,13 +38,3 @@ endif()
target_compile_definitions(${PROJECT_NAME} PUBLIC QAPPLICATION_CLASS=${QAPPLICATION_CLASS}) target_compile_definitions(${PROJECT_NAME} PUBLIC QAPPLICATION_CLASS=${QAPPLICATION_CLASS})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 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

@@ -35,7 +35,7 @@ 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. Here is how:
```bash ```bash
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplication git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication
``` ```
**Qmake:** **Qmake:**
@@ -182,8 +182,7 @@ bool SingleApplication::sendMessage( QByteArray message, int timeout = 100 )
``` ```
Sends `message` to the Primary Instance. Uses `timeout` as a the maximum timeout 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 in milliseconds for blocking functions
successfully. If the message can't be sent or the function timeouts - returns `false`.
--- ---

View File

@@ -2,6 +2,7 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
// Allow secondary instances
SingleApplication app( argc, argv ); SingleApplication app( argc, argv );
qWarning() << "Started a new instance"; qWarning() << "Started a new instance";

View File

@@ -248,7 +248,10 @@ bool SingleApplication::sendMessage( const QByteArray &message, int timeout )
if( ! d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ) ) if( ! d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ) )
return false; return false;
return d->writeConfirmedMessage( timeout, message ); d->socket->write( message );
bool dataWritten = d->socket->waitForBytesWritten( timeout );
d->socket->flush();
return dataWritten;
} }
/** /**

View File

@@ -131,34 +131,21 @@ QString SingleApplicationPrivate::getUsername()
void SingleApplicationPrivate::genBlockServerName() void SingleApplicationPrivate::genBlockServerName()
{ {
QCryptographicHash appData( QCryptographicHash::Sha256 ); QCryptographicHash appData( QCryptographicHash::Sha256 );
#if QT_VERSION < QT_VERSION_CHECK(6, 3, 0)
appData.addData( "SingleApplication", 17 ); appData.addData( "SingleApplication", 17 );
#else
appData.addData( QByteArrayView{"SingleApplication"} );
#endif
appData.addData( SingleApplication::app_t::applicationName().toUtf8() ); appData.addData( SingleApplication::app_t::applicationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationName().toUtf8() ); appData.addData( SingleApplication::app_t::organizationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() ); appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() );
if ( ! appDataList.isEmpty() ) if ( ! appDataList.isEmpty() )
appData.addData( appDataList.join(QString()).toUtf8() ); appData.addData( appDataList.join( "" ).toUtf8() );
if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ){ if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ){
appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() ); appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() );
} }
if( ! (options & SingleApplication::Mode::ExcludeAppPath) ){ if( ! (options & SingleApplication::Mode::ExcludeAppPath) ){
#if defined(Q_OS_WIN) #ifdef Q_OS_WIN
appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() ); 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 #else
appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() );
#endif #endif
@@ -171,7 +158,7 @@ void SingleApplicationPrivate::genBlockServerName()
// Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with // Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with
// server naming requirements. // server naming requirements.
blockServerName = QString::fromUtf8(appData.result().toBase64().replace("/", "_")); blockServerName = appData.result().toBase64().replace("/", "_");
} }
void SingleApplicationPrivate::initializeMemoryBlock() const void SingleApplicationPrivate::initializeMemoryBlock() const
@@ -270,52 +257,26 @@ bool SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType conne
writeStream << static_cast<quint8>(connectionType); writeStream << static_cast<quint8>(connectionType);
writeStream << instanceNumber; writeStream << instanceNumber;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
quint16 checksum = qChecksum(QByteArray(initMsg.constData(), static_cast<quint32>(initMsg.length()))); quint16 checksum = qChecksum(QByteArray(initMsg, static_cast<quint32>(initMsg.length())));
#else #else
quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length())); quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length()));
#endif #endif
writeStream << checksum; writeStream << checksum;
return writeConfirmedMessage( static_cast<int>(msecs - time.elapsed()), initMsg ); // The header indicates the message length that follows
}
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
QByteArray header; QByteArray header;
QDataStream headerStream(&header, QIODevice::WriteOnly); QDataStream headerStream(&header, QIODevice::WriteOnly);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
headerStream.setVersion(QDataStream::Qt_5_6); headerStream.setVersion(QDataStream::Qt_5_6);
#endif #endif
headerStream << static_cast <quint64>( msg.length() ); headerStream << static_cast <quint64>( initMsg.length() );
if( ! writeConfirmedFrame( static_cast<int>(msecs - time.elapsed()), header )) socket->write( header );
return false; socket->write( initMsg );
bool result = socket->waitForBytesWritten( static_cast<int>(msecs - time.elapsed()) );
// 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->flush(); socket->flush();
return result;
bool result = socket->waitForReadyRead( msecs ); // await ack byte
if (result) {
socket->read( 1 );
return true;
}
return false;
} }
quint16 SingleApplicationPrivate::blockChecksum() const quint16 SingleApplicationPrivate::blockChecksum() const
@@ -360,36 +321,33 @@ void SingleApplicationPrivate::slotConnectionEstablished()
QLocalSocket *nextConnSocket = server->nextPendingConnection(); QLocalSocket *nextConnSocket = server->nextPendingConnection();
connectionMap.insert(nextConnSocket, ConnectionInfo()); connectionMap.insert(nextConnSocket, ConnectionInfo());
QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose, this, QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose,
[nextConnSocket, this](){ [nextConnSocket, this](){
auto &info = connectionMap[nextConnSocket]; 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::disconnected, nextConnSocket, &QLocalSocket::deleteLater);
QObject::connect(nextConnSocket, &QLocalSocket::destroyed, this, QObject::connect(nextConnSocket, &QLocalSocket::destroyed,
[nextConnSocket, this](){ [nextConnSocket, this](){
connectionMap.remove(nextConnSocket); connectionMap.remove(nextConnSocket);
} }
); );
QObject::connect(nextConnSocket, &QLocalSocket::readyRead, this, QObject::connect(nextConnSocket, &QLocalSocket::readyRead,
[nextConnSocket, this](){ [nextConnSocket, this](){
auto &info = connectionMap[nextConnSocket]; auto &info = connectionMap[nextConnSocket];
switch(info.stage){ switch(info.stage){
case StageInitHeader: case StageHeader:
readMessageHeader( nextConnSocket, StageInitBody ); readInitMessageHeader(nextConnSocket);
break; break;
case StageInitBody: case StageBody:
readInitMessageBody(nextConnSocket); readInitMessageBody(nextConnSocket);
break; break;
case StageConnectedHeader: case StageConnected:
readMessageHeader( nextConnSocket, StageConnectedBody ); Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId );
break;
case StageConnectedBody:
this->slotDataAvailable( nextConnSocket, info.instanceId );
break; break;
default: default:
break; break;
@@ -398,7 +356,7 @@ void SingleApplicationPrivate::slotConnectionEstablished()
); );
} }
void SingleApplicationPrivate::readMessageHeader( QLocalSocket *sock, SingleApplicationPrivate::ConnectionStage nextStage ) void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock )
{ {
if (!connectionMap.contains( sock )){ if (!connectionMap.contains( sock )){
return; return;
@@ -418,35 +376,29 @@ void SingleApplicationPrivate::readMessageHeader( QLocalSocket *sock, SingleAppl
quint64 msgLen = 0; quint64 msgLen = 0;
headerStream >> msgLen; headerStream >> msgLen;
ConnectionInfo &info = connectionMap[sock]; ConnectionInfo &info = connectionMap[sock];
info.stage = nextStage; info.stage = StageBody;
info.msgLen = msgLen; 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 ) void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
{ {
Q_Q(SingleApplication); Q_Q(SingleApplication);
if( !isFrameComplete( sock ) ) if (!connectionMap.contains( sock )){
return; return;
}
ConnectionInfo &info = connectionMap[sock];
if( sock->bytesAvailable() < ( qint64 )info.msgLen ){
return;
}
// Read the message body // Read the message body
QByteArray msgBytes = sock->readAll(); QByteArray msgBytes = sock->read(info.msgLen);
QDataStream readStream(msgBytes); QDataStream readStream(msgBytes);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
@@ -472,7 +424,7 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
readStream >> msgChecksum; readStream >> msgChecksum;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
const quint16 actualChecksum = qChecksum(QByteArray(msgBytes.constData(), static_cast<quint32>(msgBytes.length() - sizeof(quint16)))); const quint16 actualChecksum = qChecksum(QByteArray(msgBytes, static_cast<quint32>(msgBytes.length() - sizeof(quint16))));
#else #else
const quint16 actualChecksum = qChecksum(msgBytes.constData(), static_cast<quint32>(msgBytes.length() - sizeof(quint16))); const quint16 actualChecksum = qChecksum(msgBytes.constData(), static_cast<quint32>(msgBytes.length() - sizeof(quint16)));
#endif #endif
@@ -486,9 +438,8 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
return; return;
} }
ConnectionInfo &info = connectionMap[sock];
info.instanceId = instanceId; info.instanceId = instanceId;
info.stage = StageConnectedHeader; info.stage = StageConnected;
if( connectionType == NewInstance || if( connectionType == NewInstance ||
( connectionType == SecondaryInstance && ( connectionType == SecondaryInstance &&
@@ -497,30 +448,21 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
Q_EMIT q->instanceStarted(); Q_EMIT q->instanceStarted();
} }
writeAck( sock ); if (sock->bytesAvailable() > 0){
Q_EMIT this->slotDataAvailable( sock, instanceId );
}
} }
void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId ) void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId )
{ {
Q_Q(SingleApplication); Q_Q(SingleApplication);
Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() );
if ( !isFrameComplete( dataSocket ) )
return;
const QByteArray message = dataSocket->readAll();
writeAck( dataSocket );
ConnectionInfo &info = connectionMap[dataSocket];
info.stage = StageConnectedHeader;
Q_EMIT q->receivedMessage( instanceId, message);
} }
void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId ) void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId )
{ {
if( closedSocket->bytesAvailable() > 0 ) if( closedSocket->bytesAvailable() > 0 )
slotDataAvailable( closedSocket, instanceId ); Q_EMIT slotDataAvailable( closedSocket, instanceId );
} }
void SingleApplicationPrivate::randomSleep() void SingleApplicationPrivate::randomSleep()
@@ -529,7 +471,7 @@ void SingleApplicationPrivate::randomSleep()
QThread::msleep( QRandomGenerator::global()->bounded( 8u, 18u )); QThread::msleep( QRandomGenerator::global()->bounded( 8u, 18u ));
#else #else
qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits<uint>::max() ); qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits<uint>::max() );
QThread::msleep( qrand() % 11 + 8); QThread::msleep( 8 + static_cast <unsigned long>( static_cast <float>( qrand() ) / RAND_MAX * 10 ));
#endif #endif
} }

View File

@@ -61,10 +61,9 @@ public:
Reconnect = 3 Reconnect = 3
}; };
enum ConnectionStage : quint8 { enum ConnectionStage : quint8 {
StageInitHeader = 0, StageHeader = 0,
StageInitBody = 1, StageBody = 1,
StageConnectedHeader = 2, StageConnected = 2,
StageConnectedBody = 3,
}; };
Q_DECLARE_PUBLIC(SingleApplication) Q_DECLARE_PUBLIC(SingleApplication)
@@ -80,12 +79,8 @@ public:
quint16 blockChecksum() const; quint16 blockChecksum() const;
qint64 primaryPid() const; qint64 primaryPid() const;
QString primaryUser() const; QString primaryUser() const;
bool isFrameComplete(QLocalSocket *sock); void readInitMessageHeader(QLocalSocket *socket);
void readMessageHeader(QLocalSocket *socket, ConnectionStage nextStage);
void readInitMessageBody(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(); static void randomSleep();
void addAppData(const QString &data); void addAppData(const QString &data);
QStringList appData() const; QStringList appData() const;

View File

@@ -13,8 +13,6 @@
"--socket=fallback-x11", "--socket=fallback-x11",
"--device=dri", "--device=dri",
"--share=ipc", "--share=ipc",
"--share=network",
"--socket=cups",
"--filesystem=host" "--filesystem=host"
], ],
"modules": [ "modules": [
@@ -80,17 +78,18 @@
] ]
}, },
{ {
"name": "python3-PySimpleGUI", "name": "python3.6.0",
"buildsystem": "simple",
"build-commands": [
"pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} PySimpleGUI"
],
"sources": [ "sources": [
{ {
"type": "file", "type": "archive",
"url": "https://files.pythonhosted.org/packages/d0/c3/c1ce811a1e48d5e0f2df0b393ff189fae4842ec840bb6e4db79c8da55e74/PySimpleGUI-4.41.2.tar.gz", "url": "https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz",
"sha256": "cf42d9f61f28c8e790a9c031ce900a9cee5fd2f950da2f055ed36bbc487dcf11" "sha256": "b0c5f904f685e32d9232f7bdcbece9819a892929063b6e385414ad2dd6a23622"
} }
],
"config-opts": ["--enable-shared"],
"post-install": [
"chmod +w ${FLATPAK_DEST}/lib/libpython3.6m.so.1.0",
"chmod +w ${FLATPAK_DEST}/lib/libpython3.so"
] ]
}, },
{ {
@@ -102,10 +101,25 @@
"sources": [ "sources": [
{ {
"type": "file", "type": "file",
"url": "https://files.pythonhosted.org/packages/70/aa/ebde0dddfbde799a4e8cf0564e52f95089105a7f562739ee1d16ff5a495a/qet_tb_generator-1.3.1.tar.gz", "url": "https://files.pythonhosted.org/packages/9e/c3/aaad3309a5f2ca08e2fa0ab01123bb6fafb15a92854bff88042039192a67/qet_tb_generator-1.1.7.tar.gz",
"sha256": "52c9836387d54bc30ea29272068ec156fc65c3905e0cb863afd9418abc3c0907" "sha256": "f626ab7bf4d9091fc85f63d33136585e611272b347499b448ece4e33cc04eeed"
} }
] ]
},
{
"name": "DXFtoQET-2020-1",
"buildsystem": "qmake",
"sources": [
{
"type": "git",
"url": "https://github.com/qelectrotech/DXFtoQET-2020.git",
"commit": "01fbb2afe0fe66782cb1d1f901c73616c7d5299d"
}
],
"post-install": [
"mkdir -p ${FLATPAK_DEST}/bin",
"cp DXFtoQET ${FLATPAK_DEST}/bin/"
]
} }
] ]
} }

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

View File

@@ -1,5 +1,15 @@
#!/bin/sh #!/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 # migrate .qet directory from SNAP_USER_DATA to SNAP_USER_COMMON
from="$SNAP_USER_DATA/.qet" from="$SNAP_USER_DATA/.qet"
to="$SNAP_USER_COMMON/.qet" to="$SNAP_USER_COMMON/.qet"
@@ -13,4 +23,12 @@ fi
mkdir -p "$HOME/.qet" mkdir -p "$HOME/.qet"
ln -snf "$SNAP/bin/DXFtoQET" "$HOME/.qet/DXFtoQET" 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 "${@}" exec "${@}"

View File

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

View File

@@ -47,6 +47,8 @@ endif()
endif() endif()
message("QET_LICENSE_PATH " ${QET_LICENSE_PATH}) message("QET_LICENSE_PATH " ${QET_LICENSE_PATH})
message("QET_MIME_XML_PATH " ${QET_MIME_XML_PATH})
message("QET_MIME_DESKTOP_PATH " ${QET_MIME_DESKTOP_PATH})
message("QET_MIME_PACKAGE_PATH " ${QET_MIME_PACKAGE_PATH}) message("QET_MIME_PACKAGE_PATH " ${QET_MIME_PACKAGE_PATH})
message("QET_DESKTOP_PATH " ${QET_DESKTOP_PATH}) message("QET_DESKTOP_PATH " ${QET_DESKTOP_PATH})
message("QET_ICONS_PATH " ${QET_ICONS_PATH}) message("QET_ICONS_PATH " ${QET_ICONS_PATH})

View File

@@ -28,6 +28,8 @@ if(UNIX AND NOT APPLE)
set(QET_LANG_PATH "share/qelectrotech/lang/") set(QET_LANG_PATH "share/qelectrotech/lang/")
set(QET_EXAMPLES_PATH "share/qelectrotech/examples/") set(QET_EXAMPLES_PATH "share/qelectrotech/examples/")
set(QET_LICENSE_PATH "doc/qelectrotech/") set(QET_LICENSE_PATH "doc/qelectrotech/")
set(QET_MIME_XML_PATH "../share/mime/application/")
set(QET_MIME_DESKTOP_PATH "../share/mimelnk/application/")
set(QET_MIME_PACKAGE_PATH "../share/mime/packages/") set(QET_MIME_PACKAGE_PATH "../share/mime/packages/")
set(QET_DESKTOP_PATH "share/applications/") set(QET_DESKTOP_PATH "share/applications/")
set(QET_ICONS_PATH "share/icons/hicolor/") set(QET_ICONS_PATH "share/icons/hicolor/")
@@ -45,6 +47,8 @@ if(APPLE)
set(QET_LANG_PATH "../Resources/lang/") set(QET_LANG_PATH "../Resources/lang/")
set(QET_EXAMPLES_PATH "share/qelectrotech/examples/") set(QET_EXAMPLES_PATH "share/qelectrotech/examples/")
set(QET_LICENSE_PATH "doc/qelectrotech/") set(QET_LICENSE_PATH "doc/qelectrotech/")
set(QET_MIME_XML_PATH "../share/mime/application/")
set(QET_MIME_DESKTOP_PATH "../share/mimelnk/application/")
set(QET_DESKTOP_PATH "share/applications/") set(QET_DESKTOP_PATH "share/applications/")
set(QET_ICONS_PATH "share/icons/hicolor/") set(QET_ICONS_PATH "share/icons/hicolor/")
set(QET_MAN_PATH "man/") set(QET_MAN_PATH "man/")

View File

@@ -113,6 +113,9 @@ set(QET_SRC_FILES
${QET_DIR}/sources/conductorsegmentprofile.h ${QET_DIR}/sources/conductorsegmentprofile.h
${QET_DIR}/sources/configdialog.cpp ${QET_DIR}/sources/configdialog.cpp
${QET_DIR}/sources/configdialog.h ${QET_DIR}/sources/configdialog.h
${QET_DIR}/sources/configpage.h
${QET_DIR}/sources/configpages.cpp
${QET_DIR}/sources/configpages.h
${QET_DIR}/sources/createdxf.cpp ${QET_DIR}/sources/createdxf.cpp
${QET_DIR}/sources/createdxf.h ${QET_DIR}/sources/createdxf.h
${QET_DIR}/sources/diagramcommands.cpp ${QET_DIR}/sources/diagramcommands.cpp
@@ -158,6 +161,8 @@ set(QET_SRC_FILES
${QET_DIR}/sources/main.cpp ${QET_DIR}/sources/main.cpp
${QET_DIR}/sources/newelementwizard.cpp ${QET_DIR}/sources/newelementwizard.cpp
${QET_DIR}/sources/newelementwizard.h ${QET_DIR}/sources/newelementwizard.h
${QET_DIR}/sources/projectconfigpages.cpp
${QET_DIR}/sources/projectconfigpages.h
${QET_DIR}/sources/projectview.cpp ${QET_DIR}/sources/projectview.cpp
${QET_DIR}/sources/projectview.h ${QET_DIR}/sources/projectview.h
${QET_DIR}/sources/qetapp.cpp ${QET_DIR}/sources/qetapp.cpp
@@ -576,13 +581,9 @@ set(QET_SRC_FILES
${QET_DIR}/sources/ui/titleblockpropertieswidget.h ${QET_DIR}/sources/ui/titleblockpropertieswidget.h
${QET_DIR}/sources/ui/xrefpropertieswidget.cpp ${QET_DIR}/sources/ui/xrefpropertieswidget.cpp
${QET_DIR}/sources/ui/xrefpropertieswidget.h ${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.cpp
${QET_DIR}/sources/ui/configpage/generalconfigurationpage.h ${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.cpp
${QET_DIR}/sources/undocommand/addelementtextcommand.h ${QET_DIR}/sources/undocommand/addelementtextcommand.h

View File

@@ -1,23 +1,17 @@
<definition width="20" version="0.90" type="element" height="20" hotspot_y="9" link_type="simple" hotspot_x="9"> <definition width="20" height="20" hotspot_y="9" type="element" link_type="simple" hotspot_x="9" version="0.60">
<uuid uuid="{1eefef79-1c23-413b-873a-3d84f4aa5c25}"/> <uuid uuid="{079913f8-18b5-4524-84bd-aadf75dfefbf}"/>
<names> <names>
<name lang="fr">connexion</name>
<name lang="en">connection</name>
<name lang="cs">Bod</name> <name lang="cs">Bod</name>
<name lang="de">Verbindung</name> <name lang="de">Verbindung</name>
<name lang="hu">Keresztezés pont alakzatban</name> <name lang="hu">Keresztezés pont alakzatban</name>
</names> </names>
<elementInformations/>
<informations></informations> <informations></informations>
<description> <description>
<circle y="-2" style="line-style:normal;line-weight:normal;filling:black;color:black" antialias="false" diameter="4" x="-2"/> <circle diameter="4" style="line-style:normal;line-weight:normal;filling:black;color:black" antialias="false" y="-2" 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"> <input rotate="true" text=" " tagg="label" size="9" y="-3" x="-11"/>
<text></text> <terminal orientation="e" y="0" x="2"/>
<info_name>label</info_name> <terminal orientation="w" y="0" x="-2"/>
</dynamic_text> <terminal orientation="s" y="2" x="0"/>
<terminal y="0" type="Generic" uuid="{9cc2fc56-976f-49ac-a0f8-63eb85f716c2}" orientation="e" x="2" name=""/> <terminal orientation="n" y="-2" x="0"/>
<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=""/>
</description> </description>
</definition> </definition>

View File

@@ -1,24 +1,22 @@
<definition type="element" width="30" hotspot_y="12" version="0.90" height="30" link_type="simple" hotspot_x="14"> <definition hotspot_x="14" height="30" link_type="simple" width="30" version="0.80" type="element" hotspot_y="12">
<uuid uuid="{9b3513fd-694f-4fc7-8b7e-66b733b9b4e1}"/> <uuid uuid="{0b6817fe-dd44-42a8-8e7c-3c110d13b8a2}"/>
<names> <names>
<name lang="hu">Egyesítő négy vezetékhez</name>
<name lang="de">Klemmstelle (3)</name> <name lang="de">Klemmstelle (3)</name>
<name lang="cs">Všestranný spoj</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> </names>
<elementInformations/> <elementInformations/>
<informations></informations> <informations></informations>
<description> <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"> <dynamic_text Valignment="AlignTop" x="-13" text_from="ElementInfo" text_width="-1" z="2" uuid="{14c0b70c-c028-49ef-bf72-3c3c9cd64669}" y="-12" rotation="0" frame="false" Halignment="AlignLeft" font="Sans Serif,9,-1,5,50,0,0,0,0,0">
<text></text> <text></text>
<info_name>label</info_name> <info_name>label</info_name>
</dynamic_text> </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"/> <polygon x1="-10" y5="0" x3="0" x5="10" y2="0" y3="5" closed="false" style="line-style:normal;line-weight:normal;filling:none;color:black" x4="5" x2="-5" antialias="false" y4="0" y1="0"/>
<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"/> <line x1="0" end1="none" y2="10" style="line-style:normal;line-weight:normal;filling:none;color:black" x2="0" length1="1.5" antialias="false" end2="none" y1="-5" length2="1.5"/>
<terminal type="Generic" name="" y="0" x="10" uuid="{06bf5c9f-6986-45bf-b11f-02e876abc4b8}" orientation="e"/> <terminal x="10" orientation="e" uuid="{06bf5c9f-6986-45bf-b11f-02e876abc4b8}" y="0" name=""/>
<terminal type="Generic" name="" y="-5" x="0" uuid="{33c03677-8555-4b42-ae2c-4b4308978086}" orientation="n"/> <terminal x="0" orientation="n" uuid="{33c03677-8555-4b42-ae2c-4b4308978086}" y="-5" name=""/>
<terminal type="Generic" name="" y="0" x="-10" uuid="{95bef6e9-343e-45d7-9705-4aa81f62bed0}" orientation="w"/> <terminal x="-10" orientation="w" uuid="{95bef6e9-343e-45d7-9705-4aa81f62bed0}" y="0" name=""/>
<terminal type="Generic" name="" y="10" x="0" uuid="{e9329e22-255b-4763-9dc6-65da277e1ac7}" orientation="s"/> <terminal x="0" orientation="s" uuid="{e9329e22-255b-4763-9dc6-65da277e1ac7}" y="10" name=""/>
</description> </description>
</definition> </definition>

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