Compare commits
124 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d4f968348 | |||
| 6f669e1074 | |||
| b1466ec649 | |||
| 5c3aeb598d | |||
| baab669b25 | |||
| 5704d67d7d | |||
| b0ad485c10 | |||
| 8ac216bd6b | |||
| ae9380a9c9 | |||
| 0f07174734 | |||
| e53a57bdac | |||
| f46bafa706 | |||
| ba856c2fff | |||
| 9c835ce362 | |||
| e720af44db | |||
| 22455aa506 | |||
| a2b6516eb3 | |||
| bbf156c489 | |||
| 946aa37e78 | |||
| b8c85f9e96 | |||
| ee8114d42c | |||
| 0abfecd891 | |||
| a434575857 | |||
| fc7d8f5f6f | |||
| 1d451a6490 | |||
| 0118d94d4e | |||
| b80875c583 | |||
| b54327e649 | |||
| e046b8289d | |||
| 941efe6405 | |||
| 07e11ea659 | |||
| 387f96b556 | |||
| 0832ef47a8 | |||
| bc7f852f79 | |||
| d1e10afd61 | |||
| 8aa384d305 | |||
| b321460116 | |||
| 416ec501fe | |||
| 145810f33a | |||
| 4f70468a29 | |||
| f60acad3b3 | |||
| ee65142b65 | |||
| 03bb97b529 | |||
| a4b90f3cc7 | |||
| d57a219977 | |||
| 03afa9e318 | |||
| 37cec4afce | |||
| 12f04a7b08 | |||
| ba77b3dabb | |||
| 2e6953bbd0 | |||
| c4e05f817c | |||
| eb8f859038 | |||
| 16650ed6af | |||
| 3b3171dc93 | |||
| 500c42c86b | |||
| 2f3e46e488 | |||
| 290ef97ec2 | |||
| f0923e7560 | |||
| b32de35afd | |||
| 8aad1c0cab | |||
| d365e19619 | |||
| 27b977e9f3 | |||
| 54e19f4074 | |||
| 8af1fd708f | |||
| a64e414d63 | |||
| 2ed8d76e2d | |||
| 679647f52a | |||
| a82f6de23b | |||
| 6452e03cdc | |||
| 51725d9d8e | |||
| a45a7d4e4d | |||
| bc9173d726 | |||
| 19712d72ef | |||
| f23ec620dc | |||
| 47d2107d99 | |||
| 0a4c3f4601 | |||
| ab24b74c72 | |||
| 380d12e675 | |||
| d0d3194afa | |||
| b18f5f5e41 | |||
| 8a1b0575ab | |||
| 67ec648706 | |||
| 9b77b4d4fa | |||
| 225edec091 | |||
| 62dbaddab2 | |||
| f5857bb1fd | |||
| 825eeb77e4 | |||
| 780cf8b054 | |||
| 605392cf9b | |||
| 3795ddb1f5 | |||
| ecee2209e6 | |||
| 246dd0a42f | |||
| 89a4aaac28 | |||
| 79edc3fbb7 | |||
| 52f61ab500 | |||
| 1bbb374094 | |||
| c220d84fcb | |||
| 4834d41432 | |||
| 378aa8899f | |||
| 0cd71cbe16 | |||
| 9344515d2a | |||
| 9149128f7a | |||
| 5296c1b478 | |||
| b4c8af55d3 | |||
| cb47094a1f | |||
| 3f1db24d6d | |||
| 1af0c1ca8b | |||
| bea1fb4353 | |||
| 2f69716e3c | |||
| 277fa087bc | |||
| 9693df4252 | |||
| 6b80fbb08d | |||
| 7425c83231 | |||
| 0b91318749 | |||
| 1ba97c7e92 | |||
| cd09fc0d32 | |||
| 924fe082fb | |||
| ad37b0f9a5 | |||
| fedc1cb092 | |||
| 5f318e09c8 | |||
| 27afeaefe2 | |||
| ab2f933fdf | |||
| 7f718f672f | |||
| 9ec02bc088 |
@@ -1,8 +1,8 @@
|
|||||||
name: Auto-build doxygen docs
|
name: Auto-build doxygen docs
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
tags:
|
||||||
- master
|
- '**'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
name: Publish Edge Snap
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish_amd64:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Checkout submodules
|
|
||||||
run: git submodule update --init --recursive
|
|
||||||
- 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: stable
|
|
||||||
@@ -0,0 +1,288 @@
|
|||||||
|
name: Windows Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-windows:
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install MSYS2
|
||||||
|
uses: msys2/setup-msys2@v2
|
||||||
|
with:
|
||||||
|
msystem: UCRT64
|
||||||
|
update: true
|
||||||
|
cache: true
|
||||||
|
install: >-
|
||||||
|
mingw-w64-ucrt-x86_64-gcc
|
||||||
|
mingw-w64-ucrt-x86_64-cmake
|
||||||
|
mingw-w64-ucrt-x86_64-ninja
|
||||||
|
mingw-w64-ucrt-x86_64-qt5-base
|
||||||
|
mingw-w64-ucrt-x86_64-qt5-svg
|
||||||
|
mingw-w64-ucrt-x86_64-qt5-tools
|
||||||
|
mingw-w64-ucrt-x86_64-qt5-translations
|
||||||
|
mingw-w64-ucrt-x86_64-sqlite3
|
||||||
|
mingw-w64-ucrt-x86_64-pkg-config
|
||||||
|
mingw-w64-ucrt-x86_64-kwidgetsaddons
|
||||||
|
mingw-w64-ucrt-x86_64-kcoreaddons
|
||||||
|
mingw-w64-ucrt-x86_64-extra-cmake-modules
|
||||||
|
mingw-w64-ucrt-x86_64-nsis
|
||||||
|
mingw-w64-ucrt-x86_64-angleproject
|
||||||
|
|
||||||
|
- name: Force Qt5 — supprimer Qt6 cmake + tools
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf /ucrt64/lib/cmake/Qt6
|
||||||
|
pacman -R --noconfirm mingw-w64-ucrt-x86_64-qt6-tools 2>/dev/null || true
|
||||||
|
echo "=== windeployqt binaries ==="
|
||||||
|
ls /ucrt64/bin/windeployqt* || echo "AUCUN windeployqt trouve !"
|
||||||
|
|
||||||
|
- name: Build with cmake
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
cd "$GITHUB_WORKSPACE"
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake -G Ninja \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_PREFIX_PATH=/ucrt64 \
|
||||||
|
-DQt5_DIR=/ucrt64/lib/cmake/Qt5 \
|
||||||
|
-DQT_VERSION_MAJOR=5 \
|
||||||
|
-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON \
|
||||||
|
-DBUILD_TESTING=OFF \
|
||||||
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||||
|
..
|
||||||
|
ninja
|
||||||
|
|
||||||
|
- name: Verify exe was built
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
EXE=$(find "$GITHUB_WORKSPACE/build" -maxdepth 3 -iname "qelectrotech.exe" | head -1)
|
||||||
|
if [ -z "$EXE" ]; then
|
||||||
|
echo "ERROR: aucun qelectrotech.exe trouve dans build/"
|
||||||
|
find "$GITHUB_WORKSPACE/build" -maxdepth 3 -name "*.exe" || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
SIZE=$(stat -c%s "$EXE")
|
||||||
|
echo "Exe trouve : $EXE ($SIZE octets)"
|
||||||
|
[ "$SIZE" -gt 100000 ] || { echo "ERROR: exe trop petit"; exit 1; }
|
||||||
|
|
||||||
|
- name: Deploy — copie exe + windeployqt + DLLs
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
NSIS_ROOT="$GITHUB_WORKSPACE/nsis_root"
|
||||||
|
FILES="$NSIS_ROOT/files"
|
||||||
|
BIN="$FILES/bin"
|
||||||
|
mkdir -p "$BIN"
|
||||||
|
|
||||||
|
EXE=$(find "$GITHUB_WORKSPACE/build" -maxdepth 3 -iname "qelectrotech.exe" | head -1)
|
||||||
|
echo "Copie exe : $EXE -> $BIN/QElectroTech.exe"
|
||||||
|
cp "$EXE" "$BIN/QElectroTech.exe"
|
||||||
|
|
||||||
|
cd "$BIN"
|
||||||
|
/ucrt64/bin/windeployqt-qt5 \
|
||||||
|
--release \
|
||||||
|
--no-translations \
|
||||||
|
--no-compiler-runtime \
|
||||||
|
--no-opengl-sw \
|
||||||
|
./QElectroTech.exe || true
|
||||||
|
ls -lh "$BIN/QElectroTech.exe" || { echo "ERROR: exe absent de bin/"; exit 1; }
|
||||||
|
DLL_COUNT=$(find "$BIN" -name "*.dll" | wc -l)
|
||||||
|
echo "DLLs presentes : $DLL_COUNT"
|
||||||
|
[ "$DLL_COUNT" -gt 5 ] || { echo "ERROR: trop peu de DLLs"; exit 1; }
|
||||||
|
cd "$GITHUB_WORKSPACE"
|
||||||
|
|
||||||
|
# --- DLLs runtime compilateur (non copiées par windeployqt) ---
|
||||||
|
# --- DLLs runtime : copie automatique via ldd ---
|
||||||
|
# On copie d'abord les DLLs garanties (runtime GCC + KF5 + ICU)
|
||||||
|
# car ldd ne les liste pas toujours toutes (chargement dynamique).
|
||||||
|
echo "=== Copie DLLs runtime garanties ==="
|
||||||
|
UCRT=/ucrt64/bin
|
||||||
|
for dll in \
|
||||||
|
libgcc_s_seh-1.dll \
|
||||||
|
libstdc++-6.dll \
|
||||||
|
libwinpthread-1.dll \
|
||||||
|
libgomp-1.dll; do
|
||||||
|
[ -f "$UCRT/$dll" ] && cp -v "$UCRT/$dll" "$BIN/" || echo "WARN: $dll non trouve"
|
||||||
|
done
|
||||||
|
cp -v "$UCRT"/libicu*.dll "$BIN/" 2>/dev/null || echo "WARN: libicu*.dll non trouvees"
|
||||||
|
cp -v "$UCRT"/KF5*.dll "$BIN/" 2>/dev/null || echo "WARN: KF5*.dll non trouvees"
|
||||||
|
|
||||||
|
# Copie automatique de toutes les dependances UCRT64 detectees par ldd
|
||||||
|
echo "=== Copie automatique dependances ldd ==="
|
||||||
|
ldd "$BIN/QElectroTech.exe" \
|
||||||
|
| grep -i '/ucrt64/bin/' \
|
||||||
|
| awk '{print $3}' \
|
||||||
|
| while read -r dep; do
|
||||||
|
cp -v "$dep" "$BIN/" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
|
||||||
|
# Passe recursive : certaines DLLs ont elles-memes des dependances UCRT64
|
||||||
|
echo "=== Passe recursive sur les DLLs copiees ==="
|
||||||
|
find "$BIN" -maxdepth 1 -name "*.dll" | while read -r lib; do
|
||||||
|
ldd "$lib" 2>/dev/null \
|
||||||
|
| grep -i '/ucrt64/bin/' \
|
||||||
|
| awk '{print $3}' \
|
||||||
|
| while read -r dep; do
|
||||||
|
[ -f "$BIN/$(basename "$dep")" ] || cp -v "$dep" "$BIN/" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "DLLs totales apres runtime : $(find "$BIN" -name '*.dll' | wc -l)"
|
||||||
|
|
||||||
|
# --- Diagnostic final ---
|
||||||
|
echo "=== ldd — dependances non resolues ==="
|
||||||
|
ldd "$BIN/QElectroTech.exe" | grep -i "not found" || echo "Aucune dependance manquante detectee"
|
||||||
|
|
||||||
|
cp -r "$GITHUB_WORKSPACE/elements" "$FILES/elements" || true
|
||||||
|
cp -r "$GITHUB_WORKSPACE/lang" "$FILES/lang" || true
|
||||||
|
cp -r "$GITHUB_WORKSPACE/titleblocks" "$FILES/titleblocks" || true
|
||||||
|
cp -r "$GITHUB_WORKSPACE/examples" "$FILES/examples" || true
|
||||||
|
cp -r "$GITHUB_WORKSPACE/fonts" "$FILES/fonts" || true
|
||||||
|
cp -r "$GITHUB_WORKSPACE/ico" "$FILES/ico" || true
|
||||||
|
|
||||||
|
for f in LICENSE ChangeLog CREDIT README ELEMENTS.LICENSE \
|
||||||
|
qet_uninstall_file_associations.reg register_filetypes.bat; do
|
||||||
|
cp "$GITHUB_WORKSPACE/$f" "$FILES/$f" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
|
||||||
|
cp "$GITHUB_WORKSPACE/build-aux/windows/QET64.nsi" "$NSIS_ROOT/"
|
||||||
|
cp "$GITHUB_WORKSPACE/build-aux/windows/lang_extra.nsh" "$NSIS_ROOT/" || true
|
||||||
|
cp "$GITHUB_WORKSPACE/build-aux/windows/lang_extra_fr.nsh" "$NSIS_ROOT/" || true
|
||||||
|
cp "$GITHUB_WORKSPACE/build-aux/windows/lang_extra_missing.nsh" "$NSIS_ROOT/" || true
|
||||||
|
cp -r "$GITHUB_WORKSPACE/build-aux/windows/images" "$NSIS_ROOT/" || true
|
||||||
|
|
||||||
|
if [ -f "$GITHUB_WORKSPACE/build-aux/windows/Lancer QET.bat" ]; then
|
||||||
|
cp "$GITHUB_WORKSPACE/build-aux/windows/Lancer QET.bat" "$NSIS_ROOT/"
|
||||||
|
else
|
||||||
|
printf '@echo off\r\nstart "" "%%~dp0bin\\QElectroTech.exe" %%*\r\n' \
|
||||||
|
> "$NSIS_ROOT/Lancer QET.bat"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Ensure NSIS images (wizard.bmp + header.bmp)
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
IMG_SRC="$GITHUB_WORKSPACE/build-aux/windows/images"
|
||||||
|
IMG_DST="$GITHUB_WORKSPACE/nsis_root/images"
|
||||||
|
mkdir -p "$IMG_DST"
|
||||||
|
|
||||||
|
if [ -f "$IMG_SRC/wizard.bmp" ] && [ -f "$IMG_SRC/header.bmp" ]; then
|
||||||
|
echo "Images trouvees dans le repo, copie directe."
|
||||||
|
cp "$IMG_SRC/wizard.bmp" "$IMG_DST/wizard.bmp"
|
||||||
|
cp "$IMG_SRC/header.bmp" "$IMG_DST/header.bmp"
|
||||||
|
else
|
||||||
|
echo "Images absentes du repo — generation avec ImageMagick."
|
||||||
|
# wizard.bmp : 164x314 px, fond bleu QET, texte blanc
|
||||||
|
convert \
|
||||||
|
-size 164x314 \
|
||||||
|
gradient:"#1a3a5c"-"#2e6da4" \
|
||||||
|
-gravity Center \
|
||||||
|
-fill white \
|
||||||
|
-pointsize 13 \
|
||||||
|
-annotate 0 "QElectroTech" \
|
||||||
|
-type TrueColor \
|
||||||
|
BMP3:"$IMG_DST/wizard.bmp"
|
||||||
|
# header.bmp : 150x57 px, même palette
|
||||||
|
convert \
|
||||||
|
-size 150x57 \
|
||||||
|
gradient:"#1a3a5c"-"#2e6da4" \
|
||||||
|
-gravity Center \
|
||||||
|
-fill white \
|
||||||
|
-pointsize 11 \
|
||||||
|
-annotate 0 "QElectroTech" \
|
||||||
|
-type TrueColor \
|
||||||
|
BMP3:"$IMG_DST/header.bmp"
|
||||||
|
echo "BMPs generes."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Contenu de nsis_root/images/ :"
|
||||||
|
ls -lh "$IMG_DST/"
|
||||||
|
|
||||||
|
- name: Extract version for installer name
|
||||||
|
shell: msys2 {0}
|
||||||
|
id: qet_version
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
VERSION=$(grep -A5 '^project(' "$GITHUB_WORKSPACE/CMakeLists.txt" \
|
||||||
|
| grep -oP '(?<=VERSION )[0-9]+\.[0-9]+[0-9.]*' | head -1 || true)
|
||||||
|
[ -z "$VERSION" ] && VERSION="dev"
|
||||||
|
GIT_SHORT=$(git -C "$GITHUB_WORKSPACE" rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
||||||
|
FULL_VERSION="${VERSION}+git${GIT_SHORT}_x86_64-win64"
|
||||||
|
echo "version=$FULL_VERSION" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Detected version: $FULL_VERSION"
|
||||||
|
|
||||||
|
- name: Patch QET64.nsi — version uniquement
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
VERSION="${{ steps.qet_version.outputs.version }}"
|
||||||
|
NSI="$GITHUB_WORKSPACE/nsis_root/QET64.nsi"
|
||||||
|
|
||||||
|
# Patch version uniquement.
|
||||||
|
# Tous les chemins du .nsi sont relatifs (./files/, .\images\) et
|
||||||
|
# sont resolus par makensis depuis nsis_root/ — aucun patch necessaire.
|
||||||
|
sed -i "s|!define SOFT_VERSION .*|!define SOFT_VERSION \"${VERSION}\"|" "$NSI"
|
||||||
|
|
||||||
|
echo '=== SOFT_VERSION ==='
|
||||||
|
grep 'SOFT_VERSION' "$NSI"
|
||||||
|
echo '=== Structure nsis_root ==='
|
||||||
|
ls "$GITHUB_WORKSPACE/nsis_root/"
|
||||||
|
echo '=== Contenu files/bin (premiers fichiers) ==='
|
||||||
|
ls "$GITHUB_WORKSPACE/nsis_root/files/bin/" | head -10
|
||||||
|
|
||||||
|
- name: Build NSIS installer
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
cd "$GITHUB_WORKSPACE/nsis_root"
|
||||||
|
makensis QET64.nsi
|
||||||
|
|
||||||
|
- name: Move installer to dist/
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
mkdir -p "$GITHUB_WORKSPACE/dist"
|
||||||
|
mv "$GITHUB_WORKSPACE/nsis_root"/Installer_QElectroTech-*.exe \
|
||||||
|
"$GITHUB_WORKSPACE/dist/"
|
||||||
|
|
||||||
|
- name: Upload build logs on failure
|
||||||
|
if: failure()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-logs
|
||||||
|
path: |
|
||||||
|
build/CMakeFiles/*.log
|
||||||
|
nsis_root/files/bin/
|
||||||
|
if-no-files-found: warn
|
||||||
|
|
||||||
|
- name: Upload portable (files/ sans installeur)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: qelectrotech-windows-portable
|
||||||
|
path: nsis_root/files/
|
||||||
|
retention-days: 14
|
||||||
|
|
||||||
|
- name: Upload NSIS installer
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: qelectrotech-windows-installer
|
||||||
|
path: dist/Installer_QElectroTech-*.exe
|
||||||
|
retention-days: 14
|
||||||
@@ -14,12 +14,10 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
include(cmake/hoto_update_cmake_message.cmake)
|
cmake_minimum_required(VERSION 3.5...4.2)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.14...3.19 FATAL_ERROR)
|
|
||||||
|
|
||||||
project(qelectrotech
|
project(qelectrotech
|
||||||
VERSION 0.9.0
|
VERSION 0.100.0
|
||||||
DESCRIPTION "QET is a CAD/CAE editor focusing on schematics drawing features."
|
DESCRIPTION "QET is a CAD/CAE editor focusing on schematics drawing features."
|
||||||
HOMEPAGE_URL "https://qelectrotech.org/"
|
HOMEPAGE_URL "https://qelectrotech.org/"
|
||||||
LANGUAGES CXX)
|
LANGUAGES CXX)
|
||||||
@@ -27,9 +25,16 @@ project(qelectrotech
|
|||||||
include(cmake/copyright_message.cmake)
|
include(cmake/copyright_message.cmake)
|
||||||
|
|
||||||
set(QET_DIR ${PROJECT_SOURCE_DIR})
|
set(QET_DIR ${PROJECT_SOURCE_DIR})
|
||||||
|
include(cmake/qet_compilation_vars.cmake)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
find_package(Qt6 REQUIRED COMPONENTS ${QET_COMPONENTS})
|
||||||
|
qt_standard_project_setup()
|
||||||
|
|
||||||
# Add sub directories
|
# Add sub directories
|
||||||
option(PACKAGE_TESTS "Build the tests" ON)
|
option(PACKAGE_TESTS "Build the tests" NO)
|
||||||
if(PACKAGE_TESTS)
|
if(PACKAGE_TESTS)
|
||||||
message("Add sub directory tests")
|
message("Add sub directory tests")
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
@@ -43,42 +48,16 @@ include(cmake/git_last_commit_sha.cmake)
|
|||||||
include(cmake/fetch_kdeaddons.cmake)
|
include(cmake/fetch_kdeaddons.cmake)
|
||||||
include(cmake/fetch_singleapplication.cmake)
|
include(cmake/fetch_singleapplication.cmake)
|
||||||
include(cmake/fetch_pugixml.cmake)
|
include(cmake/fetch_pugixml.cmake)
|
||||||
include(cmake/qet_compilation_vars.cmake)
|
|
||||||
|
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
|
||||||
set(CMAKE_AUTOMOC ON)
|
|
||||||
set(CMAKE_AUTORCC 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)
|
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)
|
include(cmake/define_definitions.cmake)
|
||||||
|
|
||||||
add_executable(
|
qt_add_executable(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
${QET_RES_FILES}
|
${QET_RES_FILES}
|
||||||
${QET_SRC_FILES}
|
${QET_SRC_FILES}
|
||||||
@@ -86,13 +65,24 @@ add_executable(
|
|||||||
${QET_DIR}/qelectrotech.qrc
|
${QET_DIR}/qelectrotech.qrc
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(QMFILES_AS_RESOURCE)
|
||||||
|
qt_add_translations(${PROJECT_NAME} TS_FILES ${TS_FILES} RESOURCE_PREFIX "/lang")
|
||||||
|
else()
|
||||||
|
qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
|
||||||
|
set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${QET_DIR}/lang")
|
||||||
|
qt_add_translation(QM_FILES ${TS_FILES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(SQLite3 REQUIRED)
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
PUBLIC
|
PUBLIC
|
||||||
PRIVATE
|
PRIVATE
|
||||||
pugixml::pugixml
|
pugixml::pugixml
|
||||||
SingleApplication::SingleApplication
|
SingleApplication::SingleApplication
|
||||||
${KF5_PRIVATE_LIBRARIES}
|
SQLite::SQLite3
|
||||||
|
${KF6_PRIVATE_LIBRARIES}
|
||||||
${QET_PRIVATE_LIBRARIES}
|
${QET_PRIVATE_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -125,11 +115,11 @@ target_include_directories(
|
|||||||
${QET_DIR}/sources/NameList
|
${QET_DIR}/sources/NameList
|
||||||
${QET_DIR}/sources/NameList/ui
|
${QET_DIR}/sources/NameList/ui
|
||||||
${QET_DIR}/sources/utils
|
${QET_DIR}/sources/utils
|
||||||
${QET_DIR}/pugixml/src
|
|
||||||
${QET_DIR}/sources/dataBase
|
${QET_DIR}/sources/dataBase
|
||||||
${QET_DIR}/sources/dataBase/ui
|
${QET_DIR}/sources/dataBase/ui
|
||||||
${QET_DIR}/sources/factory/ui
|
${QET_DIR}/sources/factory/ui
|
||||||
${QET_DIR}/sources/print
|
${QET_DIR}/sources/print
|
||||||
|
${QET_DIR}/sources/svg
|
||||||
)
|
)
|
||||||
|
|
||||||
install(TARGETS ${PROJECT_NAME})
|
install(TARGETS ${PROJECT_NAME})
|
||||||
@@ -149,6 +139,7 @@ install(FILES LICENSE ELEMENTS.LICENSE CREDIT README ChangeLog DESTINATION share
|
|||||||
install(FILES misc/org.qelectrotech.qelectrotech.desktop DESTINATION share/applications)
|
install(FILES misc/org.qelectrotech.qelectrotech.desktop DESTINATION share/applications)
|
||||||
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})
|
if(NOT QMFILES_AS_RESOURCE)
|
||||||
|
install(FILES ${QM_FILES} DESTINATION ${QET_LANG_PATH})
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ The main goal of the developers is to provide a libre, easy to use and effective
|
|||||||
|
|
||||||
### Version
|
### Version
|
||||||
|
|
||||||
The current stable version is 0.90 and was released on 2023.01.06.
|
The current stable version is 0.100 and was released on 2026.01.25.
|
||||||
Once it has been officially released, the stable version is always frozen and is no longer developed.
|
Once it has been officially 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.100), which can also be [downloaded](https://qelectrotech.org/download.php).
|
New functionalities, bug and issue fixings are further made in the development version (currently 0.100.1 or 0.200.0 if based on new Qt6 port), which can also be [downloaded](https://qelectrotech.org/download.php).
|
||||||
|
|
||||||
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 partially implemented until they are done!
|
||||||
|
|
||||||
@@ -59,6 +59,9 @@ Here are the technical choices made for the software development:
|
|||||||
|
|
||||||
If you wish to be informed of the latest developments, browse the [archive](https://listengine.tuxfamily.org/lists.tuxfamily.org/qet/) of the project mailing list where all commits (changes) are registered. This archive is publicly available, you don't need any account to access it.
|
If you wish to be informed of the latest developments, browse the [archive](https://listengine.tuxfamily.org/lists.tuxfamily.org/qet/) of the project mailing list where all commits (changes) are registered. This archive is publicly available, you don't need any account to access it.
|
||||||
|
|
||||||
|
### Build QElectroTech under Windows
|
||||||
|
To build QElectroTech under microsoft Windows, please follow [these instructions (french)](md/fr/fr_window_build_summary.md)
|
||||||
|
|
||||||
|
|
||||||
# Features
|
# Features
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "org.qelectrotech.QElectroTech",
|
"id": "org.qelectrotech.QElectroTech",
|
||||||
"base-version": "5.15-23.08",
|
|
||||||
"runtime": "org.kde.Platform",
|
"runtime": "org.kde.Platform",
|
||||||
"runtime-version": "5.15-23.08",
|
"runtime-version": "5.15-25.08",
|
||||||
"sdk": "org.kde.Sdk",
|
"sdk": "org.kde.Sdk",
|
||||||
"command": "qelectrotech",
|
"command": "qelectrotech",
|
||||||
"rename-desktop-file": "org.qelectrotech.qelectrotech.desktop",
|
"rename-desktop-file": "org.qelectrotech.qelectrotech.desktop",
|
||||||
@@ -18,51 +17,17 @@
|
|||||||
"--socket=cups",
|
"--socket=cups",
|
||||||
"--filesystem=host"
|
"--filesystem=host"
|
||||||
],
|
],
|
||||||
|
"cleanup": [
|
||||||
|
"/include",
|
||||||
|
"/man",
|
||||||
|
"/share/doc",
|
||||||
|
"/share/man",
|
||||||
|
"*.la",
|
||||||
|
"*.a"
|
||||||
|
],
|
||||||
"modules": [
|
"modules": [
|
||||||
{
|
"tkinter.json",
|
||||||
"name": "tkinter",
|
"pypi-dependencies.json",
|
||||||
"buildsystem": "simple",
|
|
||||||
"build-commands": [
|
|
||||||
"pip3 install --prefix=${FLATPAK_DEST} ."
|
|
||||||
],
|
|
||||||
"sources": [
|
|
||||||
{
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/iwalton3/tkinter-standalone",
|
|
||||||
"commit": "23c793bad2429f4a81eee9f50e2d07ae845b7785"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"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",
|
"name": "qelectrotech",
|
||||||
"buildsystem": "qmake",
|
"buildsystem": "qmake",
|
||||||
@@ -76,37 +41,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "patch",
|
"type": "patch",
|
||||||
"path": "patches/0001-build-Fix-the-installation-paths.patch"
|
"paths": [
|
||||||
|
"patches/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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
From 5cb80674cec7363ed00bab5248b3674ca5241c2f Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Sabri=20=C3=9Cnal?= <yakushabb@gmail.com>
|
||||||
|
Date: Fri, 20 Feb 2026 22:56:52 +0300
|
||||||
|
Subject: [PATCH] Fix appdata paper cuts
|
||||||
|
|
||||||
|
---
|
||||||
|
misc/qelectrotech.appdata.xml | 26 ++++++++++++++++++++------
|
||||||
|
1 file changed, 20 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/misc/qelectrotech.appdata.xml b/misc/qelectrotech.appdata.xml
|
||||||
|
index dd06ab7..eb02119 100644
|
||||||
|
--- a/misc/qelectrotech.appdata.xml
|
||||||
|
+++ b/misc/qelectrotech.appdata.xml
|
||||||
|
@@ -1,7 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright 2006-2023 The QElectroTech Team -->
|
||||||
|
-<application>
|
||||||
|
- <id type="desktop">qelectrotech.desktop</id>
|
||||||
|
+<component type="desktop-application">
|
||||||
|
+ <id>org.qelectrotech.QElectroTech</id>
|
||||||
|
+ <launchable type="desktop-id">qelectrotech.desktop</launchable>
|
||||||
|
<metadata_license>MIT</metadata_license>
|
||||||
|
<project_license>GPL-2.0-or-later</project_license>
|
||||||
|
<name>QElectroTech</name>
|
||||||
|
@@ -83,9 +84,22 @@
|
||||||
|
QET は要素と回路図に XML 形式を利用し、回路図エディタ、要素エディタ、表題欄エディタを含みます。
|
||||||
|
</p>
|
||||||
|
</description>
|
||||||
|
- <url type="homepage">http://qelectrotech.org</url>
|
||||||
|
+ <url type="homepage">https://qelectrotech.org</url>
|
||||||
|
+ <url type="bugtracker">https://qelectrotech.org/bugtracker</url>
|
||||||
|
+ <url type="vcs-browser">https://github.com/qelectrotech/qelectrotech-source-mirror</url>
|
||||||
|
+ <developer id="org.qelectrotech">
|
||||||
|
+ <name>QElectroTech</name>
|
||||||
|
+ </developer>
|
||||||
|
<screenshots>
|
||||||
|
- <screenshot type="default">http://download.tuxfamily.org/qet/screens/qelectrotech5.png</screenshot>
|
||||||
|
+ <screenshot type="default">
|
||||||
|
+ <image>https://qelectrotech.org/screenshots/qet_overview04.png</image>
|
||||||
|
+ </screenshot>
|
||||||
|
+ <screenshot>
|
||||||
|
+ <image>https://qelectrotech.org/screenshots/qet_overview06.png</image>
|
||||||
|
+ </screenshot>
|
||||||
|
+ <screenshot>
|
||||||
|
+ <image>https://qelectrotech.org/screenshots/qet_overview09.png</image>
|
||||||
|
+ </screenshot>
|
||||||
|
</screenshots>
|
||||||
|
- <updatecontact>qet@lists.tuxfamily.org</updatecontact>
|
||||||
|
-</application>
|
||||||
|
+ <update_contact>qet@lists.tuxfamily.org</update_contact>
|
||||||
|
+</component>
|
||||||
|
--
|
||||||
|
2.53.0
|
||||||
|
|
||||||
@@ -1,16 +1,6 @@
|
|||||||
From 14f0685ddcf3a7d64bb85a3e9a9ac97c369bb508 Mon Sep 17 00:00:00 2001
|
diff -ruN a/qelectrotech.pro b/qelectrotech.pro
|
||||||
From: Laurent Trinques <scorpio@qelectrotech.org>
|
--- a/qelectrotech.pro 2023-04-20 11:47:07.695847458 +0200
|
||||||
Date: Sat, 26 Sep 2020 22:52:52 +0200
|
+++ b/qelectrotech.pro 2023-04-20 11:51:14.843611898 +0200
|
||||||
Subject: [PATCH] build: Fix the installation paths
|
|
||||||
|
|
||||||
---
|
|
||||||
qelectrotech.pro | 10 +++++-----
|
|
||||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/qelectrotech.pro b/qelectrotech.pro
|
|
||||||
index 7baddbb08..5dcda04b6 100644
|
|
||||||
--- a/qelectrotech.pro
|
|
||||||
+++ b/qelectrotech.pro
|
|
||||||
@@ -5,18 +5,18 @@
|
@@ -5,18 +5,18 @@
|
||||||
# Chemins utilises pour la compilation et l'installation de QET
|
# Chemins utilises pour la compilation et l'installation de QET
|
||||||
unix {
|
unix {
|
||||||
@@ -35,6 +25,3 @@ index 7baddbb08..5dcda04b6 100644
|
|||||||
QET_APPDATA_PATH = 'share/appdata'
|
QET_APPDATA_PATH = 'share/appdata'
|
||||||
}
|
}
|
||||||
win32 {
|
win32 {
|
||||||
--
|
|
||||||
2.35.1
|
|
||||||
|
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
commit 3bbb09a0598fc976d2bf8dac932b27740086c1bd
|
||||||
|
Author: Hubert Figuière <hub@figuiere.net>
|
||||||
|
Date: Sun Dec 21 17:49:43 2025 -0500
|
||||||
|
|
||||||
|
Port to Python 3.13
|
||||||
|
|
||||||
|
Signed-off-by: Hubert Figuière <hub@figuiere.net>
|
||||||
|
|
||||||
|
diff --git a/_tkinter.c b/_tkinter.c
|
||||||
|
index e537707..dfc5789 100644
|
||||||
|
--- a/_tkinter.c
|
||||||
|
+++ b/_tkinter.c
|
||||||
|
@@ -21,7 +21,6 @@ Copyright (C) 1994 Steen Lumholt.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
-#define PY_SSIZE_T_CLEAN
|
||||||
|
#ifndef Py_BUILD_CORE_BUILTIN
|
||||||
|
# define Py_BUILD_CORE_MODULE 1
|
||||||
|
#endif
|
||||||
|
@@ -32,6 +31,9 @@ Copyright (C) 1994 Steen Lumholt.
|
||||||
|
# include "pycore_fileutils.h" // _Py_stat()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#include "pycore_long.h" // _PyLong_IsNegative()
|
||||||
|
+#include "pycore_sysmodule.h" // _PySys_GetOptionalAttrString()
|
||||||
|
+
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
@@ -135,7 +137,7 @@ _get_tcl_lib_path()
|
||||||
|
struct stat stat_buf;
|
||||||
|
int stat_return_value;
|
||||||
|
|
||||||
|
- prefix = PyUnicode_FromWideChar(Py_GetPrefix(), -1);
|
||||||
|
+ (void) _PySys_GetOptionalAttrString("base_prefix", &prefix);
|
||||||
|
if (prefix == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@@ -143,9 +145,11 @@ _get_tcl_lib_path()
|
||||||
|
/* Check expected location for an installed Python first */
|
||||||
|
tcl_library_path = PyUnicode_FromString("\\tcl\\tcl" TCL_VERSION);
|
||||||
|
if (tcl_library_path == NULL) {
|
||||||
|
+ Py_DECREF(prefix);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
tcl_library_path = PyUnicode_Concat(prefix, tcl_library_path);
|
||||||
|
+ Py_DECREF(prefix);
|
||||||
|
if (tcl_library_path == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@@ -959,7 +963,8 @@ AsObj(PyObject *value)
|
||||||
|
(unsigned char *)(void *)&wideValue,
|
||||||
|
sizeof(wideValue),
|
||||||
|
PY_LITTLE_ENDIAN,
|
||||||
|
- /* signed */ 1) == 0) {
|
||||||
|
+ /* signed */ 1,
|
||||||
|
+ /* with_exceptions */ 1) == 0) {
|
||||||
|
return Tcl_NewWideIntObj(wideValue);
|
||||||
|
}
|
||||||
|
PyErr_Clear();
|
||||||
|
@@ -1988,7 +1993,7 @@ _tkinter_tkapp_getboolean(TkappObject *self, PyObject *arg)
|
||||||
|
int v;
|
||||||
|
|
||||||
|
if (PyLong_Check(arg)) { /* int or bool */
|
||||||
|
- return PyBool_FromLong(Py_SIZE(arg) != 0);
|
||||||
|
+ return PyBool_FromLong(!_PyLong_IsZero((PyLongObject *)arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PyTclObject_Check(arg)) {
|
||||||
|
diff --git a/clinic/_tkinter.c.h b/clinic/_tkinter.c.h
|
||||||
|
index 9103565..f43510d 100644
|
||||||
|
--- a/clinic/_tkinter.c.h
|
||||||
|
+++ b/clinic/_tkinter.c.h
|
||||||
|
@@ -2,6 +2,8 @@
|
||||||
|
preserve
|
||||||
|
[clinic start generated code]*/
|
||||||
|
|
||||||
|
+#include "pycore_modsupport.h" // _PyArg_BadArgument()
|
||||||
|
+
|
||||||
|
PyDoc_STRVAR(_tkinter_tkapp_eval__doc__,
|
||||||
|
"eval($self, script, /)\n"
|
||||||
|
"--\n"
|
||||||
|
@@ -426,7 +428,7 @@ _tkinter_tkapp_createfilehandler(TkappObject *self, PyObject *const *args, Py_ss
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
file = args[0];
|
||||||
|
- mask = _PyLong_AsInt(args[1]);
|
||||||
|
+ mask = PyLong_AsInt(args[1]);
|
||||||
|
if (mask == -1 && PyErr_Occurred()) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
@@ -490,7 +492,7 @@ _tkinter_tkapp_createtimerhandler(TkappObject *self, PyObject *const *args, Py_s
|
||||||
|
if (!_PyArg_CheckPositional("createtimerhandler", nargs, 2, 2)) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
- milliseconds = _PyLong_AsInt(args[0]);
|
||||||
|
+ milliseconds = PyLong_AsInt(args[0]);
|
||||||
|
if (milliseconds == -1 && PyErr_Occurred()) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
@@ -524,7 +526,7 @@ _tkinter_tkapp_mainloop(TkappObject *self, PyObject *const *args, Py_ssize_t nar
|
||||||
|
if (nargs < 1) {
|
||||||
|
goto skip_optional;
|
||||||
|
}
|
||||||
|
- threshold = _PyLong_AsInt(args[0]);
|
||||||
|
+ threshold = PyLong_AsInt(args[0]);
|
||||||
|
if (threshold == -1 && PyErr_Occurred()) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
@@ -558,7 +560,7 @@ _tkinter_tkapp_dooneevent(TkappObject *self, PyObject *const *args, Py_ssize_t n
|
||||||
|
if (nargs < 1) {
|
||||||
|
goto skip_optional;
|
||||||
|
}
|
||||||
|
- flags = _PyLong_AsInt(args[0]);
|
||||||
|
+ flags = PyLong_AsInt(args[0]);
|
||||||
|
if (flags == -1 && PyErr_Occurred()) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
@@ -741,29 +743,29 @@ _tkinter_create(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
|
||||||
|
if (nargs < 4) {
|
||||||
|
goto skip_optional;
|
||||||
|
}
|
||||||
|
- interactive = _PyLong_AsInt(args[3]);
|
||||||
|
- if (interactive == -1 && PyErr_Occurred()) {
|
||||||
|
+ interactive = PyObject_IsTrue(args[3]);
|
||||||
|
+ if (interactive < 0) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (nargs < 5) {
|
||||||
|
goto skip_optional;
|
||||||
|
}
|
||||||
|
- wantobjects = _PyLong_AsInt(args[4]);
|
||||||
|
- if (wantobjects == -1 && PyErr_Occurred()) {
|
||||||
|
+ wantobjects = PyObject_IsTrue(args[4]);
|
||||||
|
+ if (wantobjects < 0) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (nargs < 6) {
|
||||||
|
goto skip_optional;
|
||||||
|
}
|
||||||
|
- wantTk = _PyLong_AsInt(args[5]);
|
||||||
|
- if (wantTk == -1 && PyErr_Occurred()) {
|
||||||
|
+ wantTk = PyObject_IsTrue(args[5]);
|
||||||
|
+ if (wantTk < 0) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (nargs < 7) {
|
||||||
|
goto skip_optional;
|
||||||
|
}
|
||||||
|
- sync = _PyLong_AsInt(args[6]);
|
||||||
|
- if (sync == -1 && PyErr_Occurred()) {
|
||||||
|
+ sync = PyObject_IsTrue(args[6]);
|
||||||
|
+ if (sync < 0) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (nargs < 8) {
|
||||||
|
@@ -814,7 +816,7 @@ _tkinter_setbusywaitinterval(PyObject *module, PyObject *arg)
|
||||||
|
PyObject *return_value = NULL;
|
||||||
|
int new_val;
|
||||||
|
|
||||||
|
- new_val = _PyLong_AsInt(arg);
|
||||||
|
+ new_val = PyLong_AsInt(arg);
|
||||||
|
if (new_val == -1 && PyErr_Occurred()) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
diff --git a/setup.py b/setup.py
|
||||||
|
index f379305..cf7b6ad 100644
|
||||||
|
--- a/setup.py
|
||||||
|
+++ b/setup.py
|
||||||
|
@@ -3,11 +3,11 @@ from distutils.core import setup, Extension
|
||||||
|
module1 = Extension('_tkinter',
|
||||||
|
libraries=['tcl8.6', 'tk8.6'],
|
||||||
|
sources=['_tkinter.c'],
|
||||||
|
- include_dirs=['/app/include/'])
|
||||||
|
+ include_dirs=['/app/include/', '/usr/include/python3.13/internal/'])
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='tkinter-standalone',
|
||||||
|
- version='3.11',
|
||||||
|
+ version='3.13',
|
||||||
|
description='Tkinter packaged as an external package for flatpak.',
|
||||||
|
ext_modules=[module1],
|
||||||
|
packages=["tkinter"]
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "pypi-dependencies",
|
||||||
|
"buildsystem": "simple",
|
||||||
|
"build-commands": [],
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"name": "python3-PySimpleGUI",
|
||||||
|
"buildsystem": "simple",
|
||||||
|
"build-commands": [
|
||||||
|
"pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"PySimpleGUI\" --no-build-isolation"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"url": "https://files.pythonhosted.org/packages/4d/d9/3de4b7ca71a7779e4f4a160088621b072a29d9b814a7fa9b5411571f4849/pysimplegui-5.0.8.3-py3-none-any.whl",
|
||||||
|
"sha256": "67e35ad6dd76e9369051261114f4711308e87815a0488f7fa28b37c29a546f8b"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "python3-qet-tb-generator",
|
||||||
|
"buildsystem": "simple",
|
||||||
|
"build-commands": [
|
||||||
|
"pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"qet-tb-generator\" --no-build-isolation"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"url": "https://files.pythonhosted.org/packages/4d/d9/3de4b7ca71a7779e4f4a160088621b072a29d9b814a7fa9b5411571f4849/pysimplegui-5.0.8.3-py3-none-any.whl",
|
||||||
|
"sha256": "67e35ad6dd76e9369051261114f4711308e87815a0488f7fa28b37c29a546f8b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"url": "https://files.pythonhosted.org/packages/63/d6/81de49a3ccec259583241fec4d79c668eff4acf9eb4d0226db36e1399f2d/qet_tb_generator-1.3.1-py3-none-any.whl",
|
||||||
|
"sha256": "80fb4af229edfd5774e61f96fa387ff394d5060abd0ca45c3c74d29de1ce9b53"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"//note": "The `tkinter` module is missing from the Freedesktop Sdk's Python installation",
|
||||||
|
"name": "tkinter",
|
||||||
|
"buildsystem": "simple",
|
||||||
|
"build-commands": [
|
||||||
|
"pip3 install --prefix=${FLATPAK_DEST} --no-build-isolation ."
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/iwalton3/tkinter-standalone",
|
||||||
|
"commit": "88aa05075d90d393a29a484bce676e237d311082"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patch",
|
||||||
|
"path": "patches/tkinter-build.patch"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"name": "tcl",
|
||||||
|
"buildsystem": "autotools",
|
||||||
|
"subdir": "unix",
|
||||||
|
"post-install": [
|
||||||
|
"chmod 755 /app/lib/libtcl*.so"
|
||||||
|
],
|
||||||
|
"cleanup": [
|
||||||
|
"/bin"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"type": "archive",
|
||||||
|
"url": "https://prdownloads.sourceforge.net/tcl/tcl8.6.17-src.tar.gz",
|
||||||
|
"sha256": "a3903371efcce8a405c5c245d029e9f6850258a60fa3761c4d58995610949b31"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tk",
|
||||||
|
"buildsystem": "autotools",
|
||||||
|
"subdir": "unix",
|
||||||
|
"post-install": [
|
||||||
|
"chmod 755 /app/lib/libtk*.so"
|
||||||
|
],
|
||||||
|
"cleanup": [
|
||||||
|
"/bin",
|
||||||
|
"/lib/tk*/demos"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"type": "archive",
|
||||||
|
"url": "https://prdownloads.sourceforge.net/tcl/tk8.6.17-src.tar.gz",
|
||||||
|
"sha256": "e4982df6f969c08bf9dd858a6891059b4a3f50dc6c87c10abadbbe2fc4838946"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,191 +0,0 @@
|
|||||||
# Header, don't edit
|
|
||||||
NLF v6
|
|
||||||
# Start editing here
|
|
||||||
# Language ID
|
|
||||||
2067
|
|
||||||
# Font and size - dash (-) means default
|
|
||||||
-
|
|
||||||
-
|
|
||||||
# Codepage - dash (-) means ANSI code page
|
|
||||||
1252
|
|
||||||
# RTL - anything else than RTL means LTR
|
|
||||||
-
|
|
||||||
# Translation by Ronny Desmedt (any credits should go here)
|
|
||||||
# ^Branding
|
|
||||||
Nullsoft Install System %s
|
|
||||||
# ^SetupCaption
|
|
||||||
$(^Name) Installatie
|
|
||||||
# ^UninstallCaption
|
|
||||||
$(^Name) Deïnstallatie
|
|
||||||
# ^LicenseSubCaption
|
|
||||||
: Licentie overeenkomst
|
|
||||||
# ^ComponentsSubCaption
|
|
||||||
: Installatie Opties
|
|
||||||
# ^DirSubCaption
|
|
||||||
: Installatie Map
|
|
||||||
# ^InstallingSubCaption
|
|
||||||
: Installeren
|
|
||||||
# ^CompletedSubCaption
|
|
||||||
: Voltooid
|
|
||||||
# ^UnComponentsSubCaption
|
|
||||||
: Deïnstallatie Opties
|
|
||||||
# ^UnDirSubCaption
|
|
||||||
: Deïnstallatie Map
|
|
||||||
# ^ConfirmSubCaption
|
|
||||||
: Bevestigen
|
|
||||||
# ^UninstallingSubCaption
|
|
||||||
: Deïnstalleren
|
|
||||||
# ^UnCompletedSubCaption
|
|
||||||
: Voltooid
|
|
||||||
# ^BackBtn
|
|
||||||
< &Terug
|
|
||||||
# ^NextBtn
|
|
||||||
&Volgende >
|
|
||||||
# ^AgreeBtn
|
|
||||||
Ik ben &Akkoord
|
|
||||||
# ^AcceptBtn
|
|
||||||
Ik &Accepteer de licentie overeenkomst
|
|
||||||
# ^DontAcceptBtn
|
|
||||||
Ik &Accepteer de licentie overeenkomst niet
|
|
||||||
# ^InstallBtn
|
|
||||||
&Installeer
|
|
||||||
# ^UninstallBtn
|
|
||||||
&Deïnstalleer
|
|
||||||
# ^CancelBtn
|
|
||||||
Afbreken
|
|
||||||
# ^CloseBtn
|
|
||||||
&Sluiten
|
|
||||||
# ^BrowseBtn
|
|
||||||
B&laderen...
|
|
||||||
# ^ShowDetailsBtn
|
|
||||||
Toon &details
|
|
||||||
# ^ClickNext
|
|
||||||
Klik op volgende om verder te gaan.
|
|
||||||
# ^ClickInstall
|
|
||||||
Klik op installeren om de installatie te starten.
|
|
||||||
# ^ClickUninstall
|
|
||||||
Klik op deïnstalleren om de installatie te verwijderen.
|
|
||||||
# ^Name
|
|
||||||
Naam
|
|
||||||
# ^Completed
|
|
||||||
Voltooid
|
|
||||||
# ^LicenseText
|
|
||||||
Gelieve de licentie overeenkomst te lezen alvorens $(^NameDA) te installeren. Als u akkord bent met de licentie overeenkomst, klik op akkoord.
|
|
||||||
# ^LicenseTextCB
|
|
||||||
Gelieve de licentie overeenkomst te lezen alvorens $(^NameDA) te installeren. Als u akkord bent met de licentie overeenkomst, klik op onderstaande selectievakje. $_CLICK
|
|
||||||
# ^LicenseTextRB
|
|
||||||
Gelieve de licentie overeenkomst te lezen alvorens $(^NameDA) te installeren. Als u akkord bent met de licentie overeenkomst, selecteer de eerste onderstaande optie. $_CLICK
|
|
||||||
# ^UnLicenseText
|
|
||||||
Gelieve de licentie overeenkomst te lezen alvorens $(^NameDA) te deïnstalleren. Als u akkord bent met de licentie overeenkomst, klik op akkoord.
|
|
||||||
# ^UnLicenseTextCB
|
|
||||||
Gelieve de licentie overeenkomst te lezen alvorens $(^NameDA) te deïnstalleren. Als u akkord bent met de licentie overeenkomst, klik op onderstaande selectievakje. $_CLICK
|
|
||||||
# ^UnLicenseTextRB
|
|
||||||
Gelieve de licentie overeenkomst te lezen alvorens $(^NameDA) te deïnstalleren. Als u akkord bent met de licentie overeenkomst, selecteer de eerste onderstaande optie. $_CLICK
|
|
||||||
# ^Custom
|
|
||||||
Aangepast
|
|
||||||
# ^ComponentsText
|
|
||||||
Selecteer de onderdelen die u wilt installeren en deselecteer de onderdelen die u niet wilt installeren. $_CLICK
|
|
||||||
# ^ComponentsSubText1
|
|
||||||
Selecteer een installatie type:
|
|
||||||
# ^ComponentsSubText2_NoInstTypes
|
|
||||||
Selecteer de onderdelen om te installeren:
|
|
||||||
# ^ComponentsSubText2
|
|
||||||
Of, selecteer optionelen onderdelen die u wilt installeren:
|
|
||||||
# ^UnComponentsText
|
|
||||||
Selecteer de onderdelen die u wilt deïnstalleren en deselecteer de onderdelen die u niet wilt deïinstalleren. $_CLICK
|
|
||||||
# ^UnComponentsSubText1
|
|
||||||
Selecteer een deïnstallatie type:
|
|
||||||
# ^UnComponentsSubText2_NoInstTypes
|
|
||||||
Selecteer de onderdelen om te deïnstalleren:
|
|
||||||
# ^UnComponentsSubText2
|
|
||||||
Of, selecteer optionelen onderdelen die u wilt deïnstalleren:
|
|
||||||
# ^DirText
|
|
||||||
De installatie van $(^NameDA) wordt in volgende map uitgevoerd. Om in een andere map te installeren, klik op bladeren om een andere map te selecteren. $_CLICK
|
|
||||||
# ^DirSubText
|
|
||||||
Installatie map
|
|
||||||
# ^DirBrowseText
|
|
||||||
Selecteerd de map om $(^NameDA) in te installeren:
|
|
||||||
# ^UnDirText
|
|
||||||
De deïnstallatie van $(^NameDA) in de volgende map. Om een andere map te deïnstalleren, klik op bladren om een andere map te selecteren. $_CLICK
|
|
||||||
# ^UnDirSubText
|
|
||||||
""
|
|
||||||
# ^UnDirBrowseText
|
|
||||||
Selecteer en map om $(^NameDA) van te deînstalleren:
|
|
||||||
# ^SpaceAvailable
|
|
||||||
"Beschikbare ruimte: "
|
|
||||||
# ^SpaceRequired
|
|
||||||
"Benodigde ruimte: "
|
|
||||||
# ^UninstallingText
|
|
||||||
$(^NameDA) wordt gedeïnstalleerd uit volgende map. $_CLICK
|
|
||||||
# ^UninstallingSubText
|
|
||||||
Deïnstalleren van:
|
|
||||||
# ^FileError
|
|
||||||
Fout bij openen van bestand om te schrijven: \r\n\r\n$0\r\n\r\nKlik op afbreken om de installatie te stoppen,\r\nOpnieuw om te proberen, of\r\nNegeren om dit bestand over te slaan.
|
|
||||||
# ^FileError_NoIgnore
|
|
||||||
Fout bij openen van bestand om te schrijven: \r\n\r\n$0\r\n\r\nOpnieuw om te proberen, of\r\nAfbreken om de installatie te stoppen.
|
|
||||||
# ^CantWrite
|
|
||||||
"Kan niet schrijven: "
|
|
||||||
# ^CopyFailed
|
|
||||||
Kopieren mislukt
|
|
||||||
# ^CopyTo
|
|
||||||
"Copier naar "
|
|
||||||
# ^Registering
|
|
||||||
"Registreren: "
|
|
||||||
# ^Unregistering
|
|
||||||
"Deregistreren: "
|
|
||||||
# ^SymbolNotFound
|
|
||||||
"Kan symbool niet vinden: "
|
|
||||||
# ^CouldNotLoad
|
|
||||||
"Kan niet laden: "
|
|
||||||
# ^CreateFolder
|
|
||||||
"Map maken: "
|
|
||||||
# ^CreateShortcut
|
|
||||||
"Snelkoppeling maken: "
|
|
||||||
# ^CreatedUninstaller
|
|
||||||
"Doe deïnstallatie: "
|
|
||||||
# ^Delete
|
|
||||||
"Verwijder bestanden: "
|
|
||||||
# ^DeleteOnReboot
|
|
||||||
Verwijder bij herstarten: "
|
|
||||||
# ^ErrorCreatingShortcut
|
|
||||||
"Fout bij maken snelkoppeling: "
|
|
||||||
# ^ErrorCreating
|
|
||||||
"Fout bij maken: "
|
|
||||||
# ^ErrorDecompressing
|
|
||||||
Fout bij uitpakken gegevens! Beschadigd bestand?
|
|
||||||
# ^ErrorRegistering
|
|
||||||
Fout bij registreren DLL
|
|
||||||
# ^ExecShell
|
|
||||||
"ExecShell: "
|
|
||||||
# ^Exec
|
|
||||||
"Uitvoeren: "
|
|
||||||
# ^Extract
|
|
||||||
"Extract: "
|
|
||||||
# ^ErrorWriting
|
|
||||||
Fout: fout bij schrijven naar bestand "
|
|
||||||
# ^InvalidOpcode
|
|
||||||
Installie beschadigd: niet toegestane opcode
|
|
||||||
# ^NoOLE
|
|
||||||
"Geen OLE voor: "
|
|
||||||
# ^OutputFolder
|
|
||||||
"Bestemmings map: "
|
|
||||||
# ^RemoveFolder
|
|
||||||
"Verwijder mapr: "
|
|
||||||
# ^RenameOnReboot
|
|
||||||
"Hernoem bij opstarten: "
|
|
||||||
# ^Rename
|
|
||||||
"Hernoem: "
|
|
||||||
# ^Skipped
|
|
||||||
Overgeslagen: "
|
|
||||||
# ^CopyDetails
|
|
||||||
Copier details naar klembord
|
|
||||||
# ^LogInstall
|
|
||||||
Log instaltie proces
|
|
||||||
# ^Byte
|
|
||||||
B
|
|
||||||
# ^Kilo
|
|
||||||
K
|
|
||||||
# ^Mega
|
|
||||||
M
|
|
||||||
# ^Giga
|
|
||||||
G
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
;Language:Dutch_Belgium (2067)
|
|
||||||
;By Ronny Desmedt
|
|
||||||
|
|
||||||
!insertmacro LANGFILE "Dutch_Belgium" "Dutch_Belgium"
|
|
||||||
|
|
||||||
!ifdef MUI_WELCOMEPAGE
|
|
||||||
${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welkom bij $(^NameDA) installatie Wizard"
|
|
||||||
${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Deze wizard zal u begeleiden bij de installatie van $(^NameDA).$\r$\n$\r$\nHet is aanbevol dat u alle andere programmas afsluit voordat u deze installatie uitvoerd. Dit geeft de mogelijkheid om relevante systeem bestanden bij te werken zonder dat uw systeem terug moet opstarten.$\r$\n$\r$\n$_CLICK"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNWELCOMEPAGE
|
|
||||||
${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welkom bij de $(^NameDA) deïnstallatie wizard"
|
|
||||||
${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Deze wizard zal u begeleiden bij de deïnstallatie van $(^NameDA).$\r$\n$\r$\nControleer of $(^NameDA) is afgesloten alvorens de deïnstallatie te starten.$\r$\n$\r$\n$_CLICK"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_LICENSEPAGE
|
|
||||||
${LangFileString} MUI_TEXT_LICENSE_TITLE "Licentie overeenkomst"
|
|
||||||
${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Gelieve de licentie te lezen alvorens U $(^NameDA) installeert."
|
|
||||||
${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Klik op akkoord om de overeenkomst te aanvaarden. U moet de overeenkomst aanvaarden om $(^NameDA) te installeren."
|
|
||||||
${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Als u de voorwaarden van de overeenkomst aanvaard, Klik op onderstaande selectievakje. U moet de overeenkomst aanvaarden om $(^NameDA) te installeren. $_CLICK"
|
|
||||||
${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Als u de voorwaarden van de overeenkomst aanvaard, selecteer de eerste onderstaande optie. U moet de overeenkomst aanvaarden om $(^NameDA) te installeren. $_CLICK"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNLICENSEPAGE
|
|
||||||
${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licentie overeenkomst"
|
|
||||||
${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Gelieve de licentie overeenkomst te herlezen alvorens met de deïnstallatie van $(^NameDA) verder te doen."
|
|
||||||
${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Klik op akkoord om de overeenkomst te aanvaarden. U moet de overeenkomst aanvaarden om $(^NameDA) te deïnstalleren."
|
|
||||||
${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Als u de voorwaarden van de overeenkomst aanvaard, Klik op onderstaande selectievakje. U moet de overeenkomst aanvaarden om $(^NameDA) te deïnstalleren. $_CLICK"
|
|
||||||
${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Als u de voorwaarden van de overeenkomst aanvaard, selecteer de eerste onderstaande optie. U moet de overeenkomst aanvaarden om $(^NameDA) te deïnstalleren. $_CLICK"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
|
|
||||||
${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Gebruik pagina neer om de rest van de overeenkomst te lezen."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_COMPONENTSPAGE
|
|
||||||
${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Kies onderdelen"
|
|
||||||
${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Kies de onderdelen van $(^NameDA) die u wilt installeren."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNCOMPONENTSPAGE
|
|
||||||
${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Kies onderdelen"
|
|
||||||
${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Kies de onderdelen van $(^NameDA) die u wilt deïnstalleren."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
|
|
||||||
${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschrijving"
|
|
||||||
!ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
|
|
||||||
${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg de muisaanwijzer over de onderdelen om de beschrijving te zien."
|
|
||||||
!else
|
|
||||||
${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg de muisaanwijzer over de onderdelen om de beschrijving te zien."
|
|
||||||
!endif
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_DIRECTORYPAGE
|
|
||||||
${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Kies een installatie locatie"
|
|
||||||
${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Kies een map waar U $(^NameDA) wilt installeren."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNDIRECTORYPAGE
|
|
||||||
${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Kies een deïnstallatie locatie"
|
|
||||||
${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Kies een map waar U $(^NameDA) wilt deïnstalleren."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_INSTFILESPAGE
|
|
||||||
${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installeren"
|
|
||||||
${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Even gedult terwijl $(^NameDA) wordt geinstalleerd."
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_TITLE "Installatie voltooid"
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_SUBTITLE "De installatie is succesvol afgerond."
|
|
||||||
${LangFileString} MUI_TEXT_ABORT_TITLE "Installatie is afgebroken"
|
|
||||||
${LangFileString} MUI_TEXT_ABORT_SUBTITLE "De installatie is niet voltooid."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNINSTFILESPAGE
|
|
||||||
${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "DeïnEven geduld terwijl $(^NameDA) wordt gedeïnstalleerd."
|
|
||||||
${LangFileString} MUI_UNTEXT_FINISH_TITLE "Deïnstallatie voltooid"
|
|
||||||
${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Deïnstallatie succesvol afgerond."
|
|
||||||
${LangFileString} MUI_UNTEXT_ABORT_TITLE "Deïnstallatie onderbroken"
|
|
||||||
${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Deïnstallatie is niet voltooid."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_FINISHPAGE
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA) installatie Wizard"
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) is geinstalleerd op uw computer.$\r$\n$\r$\nKlik op einde om de installatie wizard af te sluiten."
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Uw computer moet herstarten op de installatie van $(^NameDA) te voltooien. Wilt u nu opnieuw opstarten?"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNFINISHPAGE
|
|
||||||
${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA) deïnstallatie wizard"
|
|
||||||
${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) is gedeïnstalleerd op uw computer.$\r$\n$\r$\nKlik op einde om de installatie wizard af te sluiten."
|
|
||||||
${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Uw computer moet herstarten op de deïnstallatie van $(^NameDA)te voltooien. Wilt u nu opnieuw opstarten?"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Nu herstarten"
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ik wil later herstarten"
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_RUN "&Starten $(^NameDA)"
|
|
||||||
${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Toon leesmij"
|
|
||||||
${LangFileString} MUI_BUTTONTEXT_FINISH "&Einde"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_STARTMENUPAGE
|
|
||||||
${LangFileString} MUI_TEXT_STARTMENU_TITLE "Kies start menu map"
|
|
||||||
${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Kies een map in start menu voor de snelkoppeling van $(^NameDA)."
|
|
||||||
${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Kies een map in start menu waar u de programma snelkoppelingen wilt aanmaken. U kan ook de naam van een nieuwe map opgeven."
|
|
||||||
${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Maak geen snelkoppelingen"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNCONFIRMPAGE
|
|
||||||
${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Deïnstalleer$(^NameDA)"
|
|
||||||
${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Verwijder $(^NameDA) van uw computer."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_ABORTWARNING
|
|
||||||
${LangFileString} MUI_TEXT_ABORTWARNING "Weet u zeker dat U installatie van $(^Name) wilt afbreken?"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MUI_UNABORTWARNING
|
|
||||||
${LangFileString} MUI_UNTEXT_ABORTWARNING "Weet u zeker dat U de deïnstallatie van $(^Name)wilt afbreken?"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef MULTIUSER_INSTALLMODEPAGE
|
|
||||||
${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Kies gebruikers"
|
|
||||||
${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Kies voor welke gebruikers U $(^NameDA) wilt installeren."
|
|
||||||
${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Kies of U $(^NameDA) alleen voor u zelf of voor alle gebruikers op deze computer wilt installeren. $(^ClickNext)"
|
|
||||||
${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installeer voor iedereen die deze computer gebruikt"
|
|
||||||
${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installeer alleen voor mij"
|
|
||||||
!endif
|
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
# Migration NSIS 2.x → 3.x — QElectroTech
|
||||||
|
|
||||||
|
## Fichiers modifiés
|
||||||
|
|
||||||
|
| Fichier | Changement |
|
||||||
|
|---|---|
|
||||||
|
| `QET64.nsi` | Migration complète (voir détails ci-dessous) |
|
||||||
|
| `lang_extra_fr.nsh` | Réencodé ISO-8859-1 → UTF-8 |
|
||||||
|
| `lang_extra.nsh` | Inchangé (déjà UTF-8) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Détail des changements dans `QET64.nsi`
|
||||||
|
|
||||||
|
### 1. `SetCompressor` déplacé en tête de fichier
|
||||||
|
**NSIS 3 exige** que `SetCompressor` apparaisse avant toute `Section` ou `Function`.
|
||||||
|
Avant il était après les `!include` et `!define` — cela fonctionnait en NSIS 2 mais
|
||||||
|
génère un avertissement/erreur en NSIS 3.
|
||||||
|
|
||||||
|
```nsis
|
||||||
|
; ✅ NSIS 3 — en tout premier
|
||||||
|
SetCompressor /FINAL /SOLID lzma
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. `XPStyle on` supprimé → remplacé par `ManifestSupportedOS`
|
||||||
|
`XPStyle on` est **retiré en NSIS 3**. Il était utilisé pour activer les styles visuels
|
||||||
|
Windows XP/Vista. NSIS 3 gère cela via le manifeste de l'exécutable :
|
||||||
|
|
||||||
|
```nsis
|
||||||
|
; ✅ NSIS 3
|
||||||
|
ManifestSupportedOS all
|
||||||
|
ManifestDPIAware true
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. `Var /GLOBAL` déclarées au niveau global
|
||||||
|
En NSIS 2, des `Var /GLOBAL` à l'intérieur d'une `Section` compilaient sans erreur.
|
||||||
|
En NSIS 3, les variables doivent être déclarées **au niveau du script** (avant toute section).
|
||||||
|
|
||||||
|
```nsis
|
||||||
|
; ✅ NSIS 3 — déclaration globale
|
||||||
|
Var final_qet_exe
|
||||||
|
Var final_project_ico
|
||||||
|
Var final_element_ico
|
||||||
|
Var final_titleblock_ico
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. `SetRegView 64` ajouté dans `.onInit`, section cachée, et `un.onInit`
|
||||||
|
En NSIS 3, sur un système 64 bits, **la redirection de registre WOW6432Node est active
|
||||||
|
par défaut**. Sans `SetRegView 64`, les clés HKLM atterrissent dans
|
||||||
|
`HKLM\SOFTWARE\Wow6432Node\` au lieu de `HKLM\SOFTWARE\`.
|
||||||
|
|
||||||
|
Ajouté à trois endroits :
|
||||||
|
- `Function .onInit` → pour lire la clé d'installation existante
|
||||||
|
- Section cachée (registry/shortcuts) → avant les `WriteRegStr`
|
||||||
|
- `Section "Uninstall"` → pour supprimer les bonnes clés
|
||||||
|
- `Function un.onInit` → cohérence avec l'installation
|
||||||
|
|
||||||
|
### 5. Icônes MUI mises à jour
|
||||||
|
Les icônes `XPUI-install.ico` / `XPUI-uninstall.ico` sont remplacées par les nouvelles
|
||||||
|
icônes NSIS 3 :
|
||||||
|
|
||||||
|
```nsis
|
||||||
|
; ✅ NSIS 3
|
||||||
|
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-install.ico"
|
||||||
|
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico"
|
||||||
|
```
|
||||||
|
> Les anciennes icônes XPUI sont encore présentes pour compatibilité ascendante, mais
|
||||||
|
> les nouvelles sont recommandées.
|
||||||
|
|
||||||
|
### 6. `${IfNot} ${RunningX64}` — syntaxe clarifiée
|
||||||
|
Remplacement du bloc `${If}/${Else}/${EndIf}` moins lisible par `${IfNot}` plus concis :
|
||||||
|
|
||||||
|
```nsis
|
||||||
|
; ✅ NSIS 3 — idiome recommandé
|
||||||
|
${IfNot} ${RunningX64}
|
||||||
|
MessageBox MB_OK|MB_ICONSTOP $(wrongArch)
|
||||||
|
Abort
|
||||||
|
${EndIf}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. URLs HTTP → HTTPS
|
||||||
|
Les URLs `http://qelectrotech.org/` ont été mises à jour en `https://qelectrotech.org/`
|
||||||
|
(cosmétique, sans impact sur la compilation).
|
||||||
|
|
||||||
|
### 8. `lang_extra_fr.nsh` — Réencodage ISO-8859-1 → UTF-8
|
||||||
|
NSIS 3 est **Unicode natif** : tous les fichiers `.nsh` doivent être encodés en UTF-8
|
||||||
|
(avec ou sans BOM). Le fichier `lang_extra_fr.nsh` était en ISO-8859-1 — il a été
|
||||||
|
converti en UTF-8.
|
||||||
|
|
||||||
|
> **Commande utilisée :** `iconv -f ISO-8859-1 -t UTF-8 lang_extra_fr.nsh`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ce qui N'A PAS changé (déjà compatible NSIS 3)
|
||||||
|
|
||||||
|
- `!include "MUI2.nsh"` — inchangé ✅
|
||||||
|
- `!define MUI_LANGDLL_ALLLANGUAGES` — toujours supporté ✅
|
||||||
|
- `!insertmacro MUI_RESERVEFILE_LANGDLL` — inchangé ✅
|
||||||
|
- `FileFunc.nsh` / macro `Locate` — inchangé ✅
|
||||||
|
- `RequestExecutionLevel admin` — inchangé ✅
|
||||||
|
- `InstallDir "$PROGRAMFILES64\..."` — inchangé ✅
|
||||||
|
- Structure Sections / SubSections — inchangée ✅
|
||||||
|
- `!insertmacro MUI_FUNCTION_DESCRIPTION_*` — inchangé ✅
|
||||||
|
- Toutes les `LangString` — inchangées ✅
|
||||||
|
- `Dutch_Belgium` via `Contrib/` — inchangé ✅
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist avant compilation avec NSIS 3
|
||||||
|
|
||||||
|
- [ ] NSIS 3.x installé (https://nsis.sourceforge.io/)
|
||||||
|
- [ ] Tous les plugins utilisés sont la version Unicode/NSIS3
|
||||||
|
- `FileFunc.nsh` : fourni avec NSIS 3 ✅
|
||||||
|
- `x64.nsh` : fourni avec NSIS 3 ✅
|
||||||
|
- `MUI2.nsh` : fourni avec NSIS 3 ✅
|
||||||
|
- [ ] `lang_extra.nsh` et `lang_extra_fr.nsh` encodés en UTF-8
|
||||||
|
- [ ] Le fichier `Contrib/Dutch_Belgium.nlf` / `.nsh` est placé dans
|
||||||
|
`%NSIS%\Contrib\Language files\` ou référencé via un chemin relatif
|
||||||
@@ -1,410 +1,505 @@
|
|||||||
; this file is part of installer for QElectroTech
|
; this file is part of installer for QElectroTech
|
||||||
; Copyright (C)2015 QElectroTech Team <scorpio@qelectrotech.org>
|
; Copyright (C)2015 QElectroTech Team <scorpio@qelectrotech.org>
|
||||||
;
|
;
|
||||||
; This program is free software; you can redistribute it and/or
|
; This program is free software; you can redistribute it and/or
|
||||||
; modify it under the terms of the GNU General Public License
|
; modify it under the terms of the GNU General Public License
|
||||||
; as published by the Free Software Foundation; either
|
; as published by the Free Software Foundation; either
|
||||||
; version 2 of the License, or (at your option) any later version.
|
; version 2 of the License, or (at your option) any later version.
|
||||||
;
|
;
|
||||||
; This program is distributed in the hope that it will be useful,
|
; This program is distributed in the hope that it will be useful,
|
||||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
; GNU General Public License for more details.
|
; GNU General Public License for more details.
|
||||||
;
|
;
|
||||||
; You should have received a copy of the GNU General Public License
|
; You should have received a copy of the GNU General Public License
|
||||||
; along with this program; if not, write to the Free Software
|
; along with this program; if not, write to the Free Software
|
||||||
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
; WebSite : http://qelectrotech.org/
|
; WebSite : https://qelectrotech.org/
|
||||||
|
|
||||||
;--------------------------------
|
;==============================================================================
|
||||||
;Include Modern UI
|
; NSIS 3.x compatibility notes:
|
||||||
!include x64.nsh
|
; - Unicode is native in NSIS 3 (no need for Unicode installer plugin)
|
||||||
!include "MUI2.nsh"
|
; - XPStyle is deprecated/removed; ManifestSupportedOS replaces it
|
||||||
!include "FileFunc.nsh"
|
; - SetCompressor must appear before any Section/Function
|
||||||
!insertmacro Locate
|
; - SetRegView 64 moved to top of the hidden section (before WriteRegStr)
|
||||||
!include FileFunc.nsh
|
; - x64.nsh is still available but ${RunningX64} is now also in x64.nsh
|
||||||
!insertmacro GetParameters
|
; - MUI2.nsh is unchanged; MUI_LANGDLL_ALLLANGUAGES is still valid
|
||||||
!insertmacro GetOptions
|
; - FileFunc.nsh / Locate macro: unchanged
|
||||||
|
; - Var /GLOBAL must be declared at global scope, not inside a Section
|
||||||
|
;==============================================================================
|
||||||
!ifndef PROC
|
|
||||||
!define PROC 32 ;
|
;--------------------------------
|
||||||
!endif
|
; NSIS 3 requires SetCompressor BEFORE any Section or Function
|
||||||
|
SetCompressor /FINAL /SOLID lzma
|
||||||
|
|
||||||
|
;--------------------------------
|
||||||
; MUI Settings
|
; Includes
|
||||||
;--------------------------------
|
!include x64.nsh
|
||||||
;General
|
!include "MUI2.nsh"
|
||||||
; General Product Description Definitions
|
!include "FileFunc.nsh"
|
||||||
!define SOFT_NAME "QElectroTech"
|
!insertmacro Locate
|
||||||
!define SOFT_VERSION "0.5-dev_x86_64-win64+4094"
|
!insertmacro GetParameters
|
||||||
!define SOFT_WEB_SITE "http://qelectrotech.org/"
|
!insertmacro GetOptions
|
||||||
!define SOFT_BUILD "1"
|
|
||||||
|
;--------------------------------
|
||||||
|
; NSIS 3: Unicode is the default. The installer binary will be Unicode.
|
||||||
SetCompressor /final /solid lzma
|
; No extra plugin needed.
|
||||||
CRCCheck force
|
|
||||||
XPStyle on
|
!ifndef PROC
|
||||||
BrandingText "${SOFT_NAME}-${SOFT_VERSION}-${SOFT_BUILD}" ; Shows in the Bottom Left of the installer
|
!define PROC 64
|
||||||
|
!endif
|
||||||
|
|
||||||
;Name and file
|
;--------------------------------
|
||||||
Name "${SOFT_NAME} ${SOFT_VERSION}"
|
; General Product Description Definitions
|
||||||
OutFile "Installer_${SOFT_NAME}-${SOFT_VERSION}-${SOFT_BUILD}.exe"
|
!define SOFT_NAME "QElectroTech"
|
||||||
|
!define SOFT_VERSION "0.5-dev_x86_64-win64+4094"
|
||||||
;Default installation folder
|
!define SOFT_WEB_SITE "https://qelectrotech.org/"
|
||||||
InstallDir "$PROGRAMFILES64\${SOFT_NAME}"
|
!define SOFT_BUILD "1"
|
||||||
|
|
||||||
;Get installation folder from registry if available
|
;--------------------------------
|
||||||
InstallDirRegKey HKCU "Software\${SOFT_NAME}" ""
|
; General settings
|
||||||
|
CRCCheck force
|
||||||
;Request application privileges for Windows Vista
|
BrandingText "${SOFT_NAME}-${SOFT_VERSION}-${SOFT_BUILD}"
|
||||||
; we request for admin because we write stuff into the registry
|
|
||||||
RequestExecutionLevel admin
|
; NSIS 3: XPStyle is removed. Use ManifestSupportedOS to declare modern OS support.
|
||||||
|
; This replaces "XPStyle on" and enables proper DPI awareness + visual styles.
|
||||||
;--------------------------------
|
ManifestSupportedOS all
|
||||||
;Interface Settings
|
ManifestDPIAware true
|
||||||
!define MUI_ABORTWARNING
|
|
||||||
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\XPUI-install.ico"
|
; Name and output file
|
||||||
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\XPUI-uninstall.ico"
|
Name "${SOFT_NAME} ${SOFT_VERSION}"
|
||||||
|
OutFile "Installer_${SOFT_NAME}-${SOFT_VERSION}-${SOFT_BUILD}.exe"
|
||||||
!define MUI_WELCOMEFINISHPAGE_BITMAP ".\images\wizard.bmp"
|
|
||||||
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
|
; Default installation folder
|
||||||
|
InstallDir "$PROGRAMFILES64\${SOFT_NAME}"
|
||||||
!define MUI_HEADERIMAGE
|
|
||||||
!define MUI_HEADERIMAGE_BITMAP ".\images\header.bmp" ; optional
|
; Get installation folder from registry if available
|
||||||
;--------------------------------
|
; NSIS 3: InstallDirRegKey still works, but SetRegView 64 must be set at
|
||||||
;Language Selection Dialog Settings
|
; runtime (in .onInit) to read 64-bit registry hive correctly.
|
||||||
|
InstallDirRegKey HKCU "Software\${SOFT_NAME}" ""
|
||||||
;Remember the installer language
|
|
||||||
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
|
; Request admin privileges (required for HKLM / file associations)
|
||||||
!define MUI_LANGDLL_REGISTRY_KEY "Software\${SOFT_NAME}"
|
RequestExecutionLevel admin
|
||||||
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
|
|
||||||
|
;--------------------------------
|
||||||
;--------------------------------
|
; Declare global variables at script scope (NSIS 3 requirement)
|
||||||
;Pages
|
; In NSIS 2 these could be declared inside a Section; that still compiles
|
||||||
|
; in NSIS 3 but triggers a warning. Declare them here.
|
||||||
!define MUI_COMPONENTSPAGE_SMALLDESC
|
Var final_qet_exe
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
Var final_project_ico
|
||||||
!insertmacro MUI_PAGE_LICENSE "files\LICENSE"
|
Var final_element_ico
|
||||||
!insertmacro MUI_PAGE_COMPONENTS
|
Var final_titleblock_ico
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES
|
;--------------------------------
|
||||||
|
; MUI Interface Settings
|
||||||
!insertmacro MUI_UNPAGE_CONFIRM
|
!define MUI_ABORTWARNING
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES
|
|
||||||
|
; NSIS 3 ships updated icons; XPUI icons are still present for compatibility.
|
||||||
; Finish page and checkbox to run QElectroTech
|
; You may switch to the modern ones:
|
||||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\Lancer QET.bat"
|
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-install.ico"
|
||||||
!define MUI_FINISHPAGE_RUN_NOTCHECKED
|
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico"
|
||||||
!define MUI_FINISHPAGE_RUN_TEXT "$(Check)"
|
|
||||||
!insertmacro MUI_PAGE_FINISH
|
!define MUI_WELCOMEFINISHPAGE_BITMAP ".\images\wizard.bmp"
|
||||||
;--------------------------------
|
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
|
||||||
;Languages
|
|
||||||
;Since NSIS 2.26, the language selection dialog of Modern UI hides languages unsupported by the user's selected codepage by default.
|
!define MUI_HEADERIMAGE
|
||||||
;To revert to the old behavior and display all languages, no matter what the user will see when they're selected, use MUI_LANGDLL_ALLLANGUAGES.
|
!define MUI_HEADERIMAGE_BITMAP ".\images\header.bmp"
|
||||||
!define MUI_LANGDLL_ALLLANGUAGES
|
|
||||||
|
;--------------------------------
|
||||||
; For consistency, we limit the installer to languages supported by QElectroTech itself
|
; Language Selection Dialog Settings (remember chosen language in registry)
|
||||||
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
|
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
|
||||||
!insertmacro MUI_LANGUAGE "Korean"
|
!define MUI_LANGDLL_REGISTRY_KEY "Software\${SOFT_NAME}"
|
||||||
!insertmacro MUI_LANGUAGE "French"
|
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
|
||||||
!insertmacro MUI_LANGUAGE "Spanish"
|
|
||||||
!insertmacro MUI_LANGUAGE "Russian"
|
;--------------------------------
|
||||||
!insertmacro MUI_LANGUAGE "Portuguese"
|
; Pages
|
||||||
!insertmacro MUI_LANGUAGE "Czech"
|
!define MUI_COMPONENTSPAGE_SMALLDESC
|
||||||
!insertmacro MUI_LANGUAGE "Polish"
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
!insertmacro MUI_LANGUAGE "Greek"
|
!insertmacro MUI_PAGE_LICENSE "files\LICENSE"
|
||||||
!insertmacro MUI_LANGUAGE "Arabic"
|
!insertmacro MUI_PAGE_COMPONENTS
|
||||||
!insertmacro MUI_LANGUAGE "German"
|
!insertmacro MUI_PAGE_DIRECTORY
|
||||||
!insertmacro MUI_LANGUAGE "Italian"
|
!insertmacro MUI_PAGE_INSTFILES
|
||||||
!insertmacro MUI_LANGUAGE "Romanian"
|
|
||||||
!insertmacro MUI_LANGUAGE "Catalan"
|
!insertmacro MUI_UNPAGE_CONFIRM
|
||||||
!insertmacro MUI_LANGUAGE "Croatian"
|
!insertmacro MUI_UNPAGE_INSTFILES
|
||||||
!insertmacro MUI_LANGUAGE "Dutch"
|
|
||||||
!insertmacro MUI_LANGUAGE "Dutch_Belgium"
|
; Finish page – checkbox to launch QElectroTech
|
||||||
!insertmacro MUI_LANGUAGE "Danish"
|
!define MUI_FINISHPAGE_RUN "$INSTDIR\Lancer QET.bat"
|
||||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
!define MUI_FINISHPAGE_RUN_NOTCHECKED
|
||||||
|
!define MUI_FINISHPAGE_RUN_TEXT "$(Check)"
|
||||||
!include lang_extra.nsh
|
!insertmacro MUI_PAGE_FINISH
|
||||||
!include lang_extra_fr.nsh
|
|
||||||
|
;--------------------------------
|
||||||
|
; Languages
|
||||||
|
; NSIS 3: MUI_LANGDLL_ALLLANGUAGES is still supported and works as before.
|
||||||
SetOverwrite on
|
!define MUI_LANGDLL_ALLLANGUAGES
|
||||||
Section "Main Program"
|
|
||||||
SectionIn RO ; Read only, always installed
|
!insertmacro MUI_LANGUAGE "English" ; first = default
|
||||||
|
!insertmacro MUI_LANGUAGE "Korean"
|
||||||
Setoutpath "$INSTDIR\bin\"
|
!insertmacro MUI_LANGUAGE "French"
|
||||||
File "./files/bin/${SOFT_NAME}.exe"
|
!insertmacro MUI_LANGUAGE "Spanish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Russian"
|
||||||
Setoutpath "$INSTDIR"
|
!insertmacro MUI_LANGUAGE "Portuguese"
|
||||||
File "./files/ChangeLog"
|
!insertmacro MUI_LANGUAGE "Czech"
|
||||||
File "./files/CREDIT"
|
!insertmacro MUI_LANGUAGE "Polish"
|
||||||
File "./files/ELEMENTS.LICENSE"
|
!insertmacro MUI_LANGUAGE "Greek"
|
||||||
File "./files/LICENSE"
|
!insertmacro MUI_LANGUAGE "Arabic"
|
||||||
File "./files/qet_uninstall_file_associations.reg"
|
!insertmacro MUI_LANGUAGE "German"
|
||||||
File "./files/README"
|
!insertmacro MUI_LANGUAGE "Italian"
|
||||||
File "./files/register_filetypes.bat"
|
!insertmacro MUI_LANGUAGE "Romanian"
|
||||||
File "Lancer QET.bat"
|
!insertmacro MUI_LANGUAGE "Catalan"
|
||||||
|
!insertmacro MUI_LANGUAGE "Croatian"
|
||||||
SetOutPath "$INSTDIR"
|
!insertmacro MUI_LANGUAGE "Dutch"
|
||||||
File /r "./files/ico"
|
!insertmacro MUI_LANGUAGE "Danish"
|
||||||
|
!insertmacro MUI_LANGUAGE "Hungarian"
|
||||||
SectionEnd
|
!insertmacro MUI_LANGUAGE "Japanese"
|
||||||
|
!insertmacro MUI_LANGUAGE "Mongolian"
|
||||||
;---------------------------
|
!insertmacro MUI_LANGUAGE "Norwegian"
|
||||||
SetOverwrite on
|
!insertmacro MUI_LANGUAGE "PortugueseBR"
|
||||||
SubSection "$(Elements)" SEC01
|
!insertmacro MUI_LANGUAGE "Serbian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Slovak"
|
||||||
SetOverwrite on
|
!insertmacro MUI_LANGUAGE "Slovenian"
|
||||||
Section "$(Electric)"
|
!insertmacro MUI_LANGUAGE "Swedish"
|
||||||
SetOutPath "$INSTDIR\elements"
|
!insertmacro MUI_LANGUAGE "Turkish"
|
||||||
File /r "./files/elements/10_electric"
|
!insertmacro MUI_LANGUAGE "Ukrainian"
|
||||||
SectionEnd
|
!insertmacro MUI_LANGUAGE "SimpChinese"
|
||||||
|
!insertmacro MUI_RESERVEFILE_LANGDLL
|
||||||
SetOverwrite on
|
|
||||||
Section "$(Logic)"
|
; Language strings for all supported locales
|
||||||
SetOutPath "$INSTDIR\elements"
|
!include lang_extra.nsh
|
||||||
File /r "./files/elements/20_logic"
|
!include lang_extra_fr.nsh
|
||||||
SectionEnd
|
!include lang_extra_missing.nsh
|
||||||
|
; NOTE: The string "uninstFailed" must be defined in lang_extra.nsh and
|
||||||
SetOverwrite on
|
; lang_extra_fr.nsh (and any other lang_extra_*.nsh) like so:
|
||||||
Section "$(Hydraulic)"
|
; LangString uninstFailed ${LANG_ENGLISH} "Uninstallation of the previous version failed.$\nPlease uninstall QElectroTech manually before continuing."
|
||||||
SetOutPath "$INSTDIR\elements"
|
; LangString uninstFailed ${LANG_FRENCH} "La désinstallation de la version précédente a échoué.$\nVeuillez désinstaller QElectroTech manuellement avant de continuer."
|
||||||
File /r "./files/elements/30_hydraulic"
|
|
||||||
SectionEnd
|
;==============================================================================
|
||||||
|
; SECTIONS
|
||||||
|
;==============================================================================
|
||||||
SetOverwrite on
|
|
||||||
Section "$(Pneumatic)"
|
SetOverwrite on
|
||||||
SetOutPath "$INSTDIR\elements"
|
|
||||||
File /r "./files/elements/50_pneumatic"
|
Section "Main Program"
|
||||||
SectionEnd
|
SectionIn RO ; Read-only – always installed
|
||||||
|
|
||||||
|
SetOutPath "$INSTDIR\bin\"
|
||||||
;---------------------------------
|
File "./files/bin/${SOFT_NAME}.exe"
|
||||||
SubSection "$(Energy)"
|
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
SetOverwrite on
|
File "./files/ChangeLog"
|
||||||
Section "$(water)"
|
File "./files/CREDIT"
|
||||||
SetOutPath "$INSTDIR\elements\60_energy"
|
File "./files/ELEMENTS.LICENSE"
|
||||||
File /r "./files/elements/60_energy/11_water"
|
File "./files/LICENSE"
|
||||||
File /r "./files/elements/60_energy/"
|
File "./files/qet_uninstall_file_associations.reg"
|
||||||
SectionEnd
|
File "./files/README"
|
||||||
|
File "./files/register_filetypes.bat"
|
||||||
SetOverwrite on
|
File "Lancer QET.bat"
|
||||||
Section "$(Refrigeration)"
|
|
||||||
SetOutPath "$INSTDIR\elements\60_energy"
|
SetOutPath "$INSTDIR"
|
||||||
File /r "./files/elements/60_energy/21_refrigeration"
|
File /r "./files/ico"
|
||||||
File /r "./files/elements/60_energy/"
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
SetOverwrite on
|
;---------------------------
|
||||||
Section "$(Solar_thermal)"
|
SetOverwrite on
|
||||||
SetOutPath "$INSTDIR\elements\60_energy"
|
SubSection "$(Elements)" SEC01
|
||||||
File /r "./files/elements/60_energy/31_solar_thermal"
|
|
||||||
File /r "./files/elements/60_energy/"
|
SetOverwrite on
|
||||||
SectionEnd
|
Section "$(Electric)"
|
||||||
|
SetOutPath "$INSTDIR\elements"
|
||||||
SubSectionEnd
|
File /r "./files/elements/10_electric"
|
||||||
SubSectionEnd
|
SectionEnd
|
||||||
;-------------------------------
|
|
||||||
|
SetOverwrite on
|
||||||
SetOverwrite on
|
Section "$(Logic)"
|
||||||
Section "$(Lang)" SEC02
|
SetOutPath "$INSTDIR\elements"
|
||||||
SetOutPath "$INSTDIR\lang"
|
File /r "./files/elements/20_logic"
|
||||||
File "./files/lang/*.qm"
|
SectionEnd
|
||||||
SectionEnd
|
|
||||||
|
SetOverwrite on
|
||||||
SetOverwrite on
|
Section "$(Hydraulic)"
|
||||||
Section "$(Titleblocks)" SEC03
|
SetOutPath "$INSTDIR\elements"
|
||||||
SetOutPath "$INSTDIR"
|
File /r "./files/elements/30_hydraulic"
|
||||||
File /r "./files/titleblocks"
|
SectionEnd
|
||||||
SectionEnd
|
|
||||||
|
SetOverwrite on
|
||||||
SetOverwrite on
|
Section "$(Pneumatic)"
|
||||||
Section "$(Examples)" SEC04
|
SetOutPath "$INSTDIR\elements"
|
||||||
SetOutPath "$INSTDIR"
|
File /r "./files/elements/50_pneumatic"
|
||||||
File /r "./files/examples"
|
SectionEnd
|
||||||
SectionEnd
|
|
||||||
|
;---------------------------------
|
||||||
;--------------------------------
|
SubSection "$(Energy)"
|
||||||
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
|
||||||
!insertmacro MUI_DESCRIPTION_TEXT ${SEC01} $(var1)
|
SetOverwrite on
|
||||||
!insertmacro MUI_DESCRIPTION_TEXT ${SEC02} $(var2)
|
Section "$(water)"
|
||||||
!insertmacro MUI_DESCRIPTION_TEXT ${SEC03} $(var3)
|
SetOutPath "$INSTDIR\elements\60_energy"
|
||||||
!insertmacro MUI_DESCRIPTION_TEXT ${SEC04} $(var4)
|
File /r "./files/elements/60_energy/11_water"
|
||||||
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
File /r "./files/elements/60_energy/"
|
||||||
;--------------------------------
|
SectionEnd
|
||||||
|
|
||||||
;Installer Sections
|
SetOverwrite on
|
||||||
|
Section "$(Refrigeration)"
|
||||||
Section ""
|
SetOutPath "$INSTDIR\elements\60_energy"
|
||||||
SetOutPath "$INSTDIR"
|
File /r "./files/elements/60_energy/21_refrigeration"
|
||||||
;Store installation folder
|
File /r "./files/elements/60_energy/"
|
||||||
WriteRegStr HKCU "Software\${SOFT_NAME}" "" $INSTDIR
|
SectionEnd
|
||||||
; write uninstall strings
|
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}" "DisplayName" "${SOFT_NAME} (remove only)"
|
SetOverwrite on
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}" "UninstallString" '"$INSTDIR\Uninstall.exe"'
|
Section "$(Solar_thermal)"
|
||||||
;Create uninstaller
|
SetOutPath "$INSTDIR\elements\60_energy"
|
||||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
File /r "./files/elements/60_energy/31_solar_thermal"
|
||||||
SetRegView 64
|
File /r "./files/elements/60_energy/"
|
||||||
|
SectionEnd
|
||||||
; get the final path for the icons and the launch script
|
|
||||||
Var /GLOBAL final_qet_exe
|
SubSectionEnd
|
||||||
Var /GLOBAL final_project_ico
|
|
||||||
Var /GLOBAL final_element_ico
|
SubSectionEnd
|
||||||
Var /GLOBAL final_titleblock_ico
|
|
||||||
|
;-------------------------------
|
||||||
StrCpy $final_qet_exe "$INSTDIR\Lancer QET.bat"
|
SetOverwrite on
|
||||||
StrCpy $final_project_ico "$INSTDIR\ico\application-x-qet-project.ico"
|
Section "$(Lang)" SEC02
|
||||||
StrCpy $final_element_ico "$INSTDIR\ico\application-x-qet-element.ico"
|
SetOutPath "$INSTDIR\lang"
|
||||||
StrCpy $final_titleblock_ico "$INSTDIR\ico\application-x-qet-titleblock.ico"
|
File "./files/lang/*.qm"
|
||||||
|
SectionEnd
|
||||||
; write file associations registry keys
|
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "Applications\qelectrotech.exe\shell\open\command" "" "$\"$final_qet_exe$\" $\"%1$\""
|
SetOverwrite on
|
||||||
WriteRegStr HKEY_CLASSES_ROOT ".qet" "" "qet_diagram_file"
|
Section "$(Titleblocks)" SEC03
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_diagram_file" "" "Diagram QET"
|
SetOutPath "$INSTDIR"
|
||||||
WriteRegDWORD HKEY_CLASSES_ROOT "qet_diagram_file" "EditFlags" 0x00000000
|
File /r "./files/titleblocks"
|
||||||
WriteRegDWORD HKEY_CLASSES_ROOT "qet_diagram_file" "BrowserFlags" 0x00000008
|
SectionEnd
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_diagram_file\DefaultIcon" "" "$final_project_ico"
|
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_diagram_file\shell\open\command" "" "$\"$final_qet_exe$\" $\"%1$\""
|
SetOverwrite on
|
||||||
WriteRegStr HKEY_CLASSES_ROOT ".elmt" "" "qet_element_file"
|
Section "$(Examples)" SEC04
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_element_file" "" "Element QET"
|
SetOutPath "$INSTDIR"
|
||||||
WriteRegDWORD HKEY_CLASSES_ROOT "qet_element_file" "EditFlags" 0x00000000
|
File /r "./files/examples"
|
||||||
WriteRegDWORD HKEY_CLASSES_ROOT "qet_element_file" "BrowserFlags" 0x00000008
|
SectionEnd
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_element_file\DefaultIcon" "" "$final_element_ico"
|
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_element_file\shell\open\command" "" "$\"$final_qet_exe$\" $\"%1$\""
|
SetOverwrite on
|
||||||
WriteRegStr HKEY_CLASSES_ROOT ".titleblock" "" "qet_titleblock_file"
|
Section "$(Fonts)" SEC05
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_titleblock_file" "" "Titleblock QET"
|
SetOutPath "$INSTDIR"
|
||||||
WriteRegDWORD HKEY_CLASSES_ROOT "qet_titleblock_file" "EditFlags" 0x00000000
|
File /r "./files/fonts"
|
||||||
WriteRegDWORD HKEY_CLASSES_ROOT "qet_titleblock_file" "BrowserFlags" 0x00000008
|
SectionEnd
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_titleblock_file\DefaultIcon" "" "$final_titleblock_ico"
|
|
||||||
WriteRegStr HKEY_CLASSES_ROOT "qet_titleblock_file\shell\open\command" "" "$\"$final_qet_exe$\" $\"%1$\""
|
;--------------------------------
|
||||||
|
; Component descriptions
|
||||||
SetShellVarContext all ; all users
|
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
||||||
; shortcuts in the start menu
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC01} $(var1)
|
||||||
CreateDirectory "$SMPROGRAMS\${SOFT_NAME}"
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC02} $(var2)
|
||||||
CreateDirectory "$SMPROGRAMS\${SOFT_NAME}\Manual"
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC03} $(var3)
|
||||||
CreateDirectory "$SMPROGRAMS\${SOFT_NAME}\Upgrade"
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC04} $(var4)
|
||||||
CreateShortCut "$SMPROGRAMS\${SOFT_NAME}\QElectroTech.lnk" "$INSTDIR\Lancer QET.bat" 0 "$INSTDIR\ico\qelectrotech.ico"
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC05} $(var5)
|
||||||
CreateShortCut "$SMPROGRAMS\${SOFT_NAME}\Uninstall QElectroTech.lnk" "$INSTDIR\Uninstall.exe"
|
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
||||||
; TODO : add the QuickStart Guide (or any other documentation) when available
|
|
||||||
|
;--------------------------------
|
||||||
; shortcut on the desktop
|
; Hidden section: registry, shortcuts, file associations
|
||||||
CreateShortCut "$DESKTOP\QElectroTech.lnk" "$INSTDIR\Lancer QET.bat" 0 "$INSTDIR\ico\qelectrotech.ico"
|
Section ""
|
||||||
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Manual\Manual_English.url" "InternetShortcut" "URL" "https://download.qelectrotech.org/qet/manual_0.7/build/index.html"
|
SetOutPath "$INSTDIR"
|
||||||
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Manual\Manual_Russian.url" "InternetShortcut" "URL" "https://download.qelectrotech.org/qet/joshua/html/QET_ru.html"
|
|
||||||
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Upgrade\Download.url" "InternetShortcut" "URL" "https://download.qelectrotech.org/qet/builds/nightly/"
|
; NSIS 3 on 64-bit Windows: set 64-bit registry view BEFORE any WriteRegStr
|
||||||
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Donate.url" "InternetShortcut" "URL" "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZZHC9D7C3MDPC"
|
; so keys land in HKLM\SOFTWARE (not the Wow6432Node redirect).
|
||||||
|
SetRegView 64
|
||||||
;changing $INSTDIR\elements\ *.elmt to read-only attribute
|
|
||||||
|
; Store installation folder
|
||||||
${Locate} "$INSTDIR\elements\" "/L=FD /M=*.elmt" "LocateCallback"
|
WriteRegStr HKCU "Software\${SOFT_NAME}" "" $INSTDIR
|
||||||
IfErrors 0 +2
|
|
||||||
;MessageBox MB_OK "Error"
|
; Uninstall registry entries
|
||||||
SectionEnd
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}" \
|
||||||
|
"DisplayName" "${SOFT_NAME} (remove only)"
|
||||||
Function LocateCallback
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}" \
|
||||||
SetFileAttributes $R9 FILE_ATTRIBUTE_READONLY
|
"UninstallString" '"$INSTDIR\Uninstall.exe"'
|
||||||
Push $0
|
|
||||||
FunctionEnd
|
; Create uninstaller
|
||||||
|
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||||
;--------------------------------
|
|
||||||
;Installer Functions
|
; Build paths for icons and launch script
|
||||||
|
StrCpy $final_qet_exe "$INSTDIR\Lancer QET.bat"
|
||||||
Function .onInit
|
StrCpy $final_project_ico "$INSTDIR\ico\application-x-qet-project.ico"
|
||||||
!insertmacro MUI_LANGDLL_DISPLAY
|
StrCpy $final_element_ico "$INSTDIR\ico\application-x-qet-element.ico"
|
||||||
|
StrCpy $final_titleblock_ico "$INSTDIR\ico\application-x-qet-titleblock.ico"
|
||||||
${If} ${RunningX64}
|
|
||||||
${Else}
|
; File associations – .qet
|
||||||
|
WriteRegStr HKEY_CLASSES_ROOT "Applications\qelectrotech.exe\shell\open\command" "" \
|
||||||
MessageBox MB_OK|MB_ICONSTOP $(wrongArch)
|
'"$final_qet_exe" "%1"'
|
||||||
Abort $(wrongArch)
|
WriteRegStr HKEY_CLASSES_ROOT ".qet" "" "qet_diagram_file"
|
||||||
${EndIf}
|
WriteRegStr HKEY_CLASSES_ROOT "qet_diagram_file" "" "Diagram QET"
|
||||||
|
WriteRegDWORD HKEY_CLASSES_ROOT "qet_diagram_file" "EditFlags" 0x00000000
|
||||||
;Auto-uninstall old before installing new
|
WriteRegDWORD HKEY_CLASSES_ROOT "qet_diagram_file" "BrowserFlags" 0x00000008
|
||||||
ReadRegStr $R0 HKLM \
|
WriteRegStr HKEY_CLASSES_ROOT "qet_diagram_file\DefaultIcon" "" "$final_project_ico"
|
||||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}" \
|
WriteRegStr HKEY_CLASSES_ROOT "qet_diagram_file\shell\open\command" "" '"$final_qet_exe" "%1"'
|
||||||
"UninstallString"
|
|
||||||
StrCmp $R0 "" done
|
; File associations – .elmt
|
||||||
|
WriteRegStr HKEY_CLASSES_ROOT ".elmt" "" "qet_element_file"
|
||||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
|
WriteRegStr HKEY_CLASSES_ROOT "qet_element_file" "" "Element QET"
|
||||||
"$(installed)" \
|
WriteRegDWORD HKEY_CLASSES_ROOT "qet_element_file" "EditFlags" 0x00000000
|
||||||
IDOK uninst
|
WriteRegDWORD HKEY_CLASSES_ROOT "qet_element_file" "BrowserFlags" 0x00000008
|
||||||
Abort
|
WriteRegStr HKEY_CLASSES_ROOT "qet_element_file\DefaultIcon" "" "$final_element_ico"
|
||||||
|
WriteRegStr HKEY_CLASSES_ROOT "qet_element_file\shell\open\command" "" '"$final_qet_exe" "%1"'
|
||||||
;Run the uninstaller
|
|
||||||
uninst:
|
; File associations – .titleblock
|
||||||
ClearErrors
|
WriteRegStr HKEY_CLASSES_ROOT ".titleblock" "" "qet_titleblock_file"
|
||||||
ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file
|
WriteRegStr HKEY_CLASSES_ROOT "qet_titleblock_file" "" "Titleblock QET"
|
||||||
|
WriteRegDWORD HKEY_CLASSES_ROOT "qet_titleblock_file" "EditFlags" 0x00000000
|
||||||
IfErrors no_remove_uninstaller done
|
WriteRegDWORD HKEY_CLASSES_ROOT "qet_titleblock_file" "BrowserFlags" 0x00000008
|
||||||
;You can either use Delete /REBOOTOK in the uninstaller or add some code
|
WriteRegStr HKEY_CLASSES_ROOT "qet_titleblock_file\DefaultIcon" "" "$final_titleblock_ico"
|
||||||
;here to remove the uninstaller. Use a registry key to check
|
WriteRegStr HKEY_CLASSES_ROOT "qet_titleblock_file\shell\open\command" "" '"$final_qet_exe" "%1"'
|
||||||
;whether the user has chosen to uninstall. If you are using an uninstaller
|
|
||||||
;components page, make sure all sections are uninstalled.
|
SetShellVarContext all ; apply shortcuts for all users
|
||||||
no_remove_uninstaller:
|
|
||||||
|
; Start Menu shortcuts
|
||||||
done:
|
CreateDirectory "$SMPROGRAMS\${SOFT_NAME}"
|
||||||
|
CreateDirectory "$SMPROGRAMS\${SOFT_NAME}\Manual"
|
||||||
FunctionEnd
|
CreateDirectory "$SMPROGRAMS\${SOFT_NAME}\Upgrade"
|
||||||
|
CreateShortCut "$SMPROGRAMS\${SOFT_NAME}\QElectroTech.lnk" \
|
||||||
;--------------------------------
|
"$INSTDIR\Lancer QET.bat" 0 "$INSTDIR\ico\qelectrotech.ico"
|
||||||
;Descriptions
|
CreateShortCut "$SMPROGRAMS\${SOFT_NAME}\Uninstall QElectroTech.lnk" \
|
||||||
|
"$INSTDIR\Uninstall.exe"
|
||||||
;USE A LANGUAGE STRING IF YOU WANT YOUR DESCRIPTIONS TO BE LANGAUGE SPECIFIC
|
|
||||||
|
; Desktop shortcut
|
||||||
;Assign descriptions to sections
|
CreateShortCut "$DESKTOP\QElectroTech.lnk" \
|
||||||
;!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
"$INSTDIR\Lancer QET.bat" 0 "$INSTDIR\ico\qelectrotech.ico"
|
||||||
; !insertmacro MUI_DESCRIPTION_TEXT ${CopyFiles} "CopyFiles"
|
|
||||||
;!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
; Internet shortcuts
|
||||||
|
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Manual\Manual_English.url" \
|
||||||
;--------------------------------
|
"InternetShortcut" "URL" "https://download.qelectrotech.org/qet/manual_0.7/build/index.html"
|
||||||
;Uninstaller Section
|
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Manual\Manual_Russian.url" \
|
||||||
|
"InternetShortcut" "URL" "https://download.qelectrotech.org/qet/joshua/html/QET_ru.html"
|
||||||
Section "Uninstall"
|
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Upgrade\Download.url" \
|
||||||
SetShellVarContext all ; all users
|
"InternetShortcut" "URL" "https://download.qelectrotech.org/qet/builds/nightly/"
|
||||||
; remove start menu shortcuts
|
WriteINIStr "$SMPROGRAMS\${SOFT_NAME}\Donate.url" \
|
||||||
RMDir /r "$SMPROGRAMS\${SOFT_NAME}"
|
"InternetShortcut" "URL" "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZZHC9D7C3MDPC"
|
||||||
; remove shortcut on the desktop
|
|
||||||
Delete "$DESKTOP\QElectroTech.lnk"
|
; Mark installed elements as read-only
|
||||||
|
${Locate} "$INSTDIR\elements\" "/L=FD /M=*.elmt" "LocateCallback"
|
||||||
; remove the application files
|
IfErrors 0 +2
|
||||||
Delete "$INSTDIR\*.*"
|
; MessageBox MB_OK "Error in Locate" ; uncomment for debugging
|
||||||
RMDir /r "$INSTDIR"
|
|
||||||
|
SectionEnd
|
||||||
;remove installation registry keys
|
|
||||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}"
|
;--------------------------------
|
||||||
DeleteRegKey /ifempty HKCU "Software\${SOFT_NAME}"
|
; Locate callback – sets FILE_ATTRIBUTE_READONLY on each .elmt file
|
||||||
|
Function LocateCallback
|
||||||
; remove file associations registry keys
|
SetFileAttributes $R9 FILE_ATTRIBUTE_READONLY
|
||||||
DeleteRegKey HKEY_CLASSES_ROOT "Applications\qelectrotech.exe"
|
Push $0
|
||||||
DeleteRegKey HKEY_CLASSES_ROOT ".qet"
|
FunctionEnd
|
||||||
DeleteRegKey HKEY_CLASSES_ROOT "qet_diagram_file"
|
|
||||||
DeleteRegKey HKEY_CLASSES_ROOT ".elmt"
|
;==============================================================================
|
||||||
DeleteRegKey HKEY_CLASSES_ROOT "qet_element_file"
|
; INSTALLER FUNCTIONS
|
||||||
DeleteRegKey HKEY_CLASSES_ROOT ".titleblock"
|
;==============================================================================
|
||||||
DeleteRegKey HKEY_CLASSES_ROOT "qet_titleblock_file"
|
|
||||||
|
Function .onInit
|
||||||
IfFileExists "$INSTDIR" 0 NoErrorMsg
|
; NSIS 3: SetRegView in .onInit ensures InstallDirRegKey reads the right hive
|
||||||
;MessageBox MB_OK "Note: $INSTDIR could not be removed!" IDOK 0 ; skipped if file doesn't exist
|
SetRegView 64
|
||||||
NoErrorMsg:
|
|
||||||
SectionEnd
|
!insertmacro MUI_LANGDLL_DISPLAY
|
||||||
|
|
||||||
;--------------------------------
|
; Abort if not running on a 64-bit OS
|
||||||
;Uninstaller Functions
|
${IfNot} ${RunningX64}
|
||||||
|
MessageBox MB_OK|MB_ICONSTOP $(wrongArch)
|
||||||
Function un.onInit
|
Abort
|
||||||
|
${EndIf}
|
||||||
!insertmacro MUI_UNGETLANGUAGE
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
FunctionEnd
|
; Auto-uninstall previous version before installing new one
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
ReadRegStr $R0 HKLM \
|
||||||
|
"Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}" \
|
||||||
|
"UninstallString"
|
||||||
|
|
||||||
|
; No previous installation found → proceed normally
|
||||||
|
StrCmp $R0 "" done
|
||||||
|
|
||||||
|
; Also read the install dir of the previous version
|
||||||
|
ReadRegStr $R1 HKCU "Software\${SOFT_NAME}" ""
|
||||||
|
|
||||||
|
; Ask user whether to uninstall the existing version
|
||||||
|
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(installed)" IDOK uninst
|
||||||
|
Abort ; user clicked Cancel → stop the installer
|
||||||
|
|
||||||
|
uninst:
|
||||||
|
; Remove surrounding quotes from the UninstallString if present
|
||||||
|
; (some installers write: "C:\path\Uninstall.exe" — ExecWait needs clean path)
|
||||||
|
StrCpy $R2 $R0 1 ; first character
|
||||||
|
StrCmp $R2 '"' 0 unquoted
|
||||||
|
; Strip leading and trailing quote
|
||||||
|
StrCpy $R0 $R0 "" 1 ; remove leading "
|
||||||
|
StrLen $R3 $R0
|
||||||
|
IntOp $R3 $R3 - 1
|
||||||
|
StrCpy $R0 $R0 $R3 ; remove trailing "
|
||||||
|
unquoted:
|
||||||
|
|
||||||
|
; Run the uninstaller silently, keeping it in its own directory
|
||||||
|
; _?= prevents NSIS from copying the uninstaller to a temp folder,
|
||||||
|
; so it can delete itself and the whole $INSTDIR tree.
|
||||||
|
ClearErrors
|
||||||
|
${If} $R1 != ""
|
||||||
|
ExecWait '"$R0" /S _?=$R1' ; silent uninstall using saved install dir
|
||||||
|
${Else}
|
||||||
|
ExecWait '"$R0" /S' ; fallback if install dir unknown
|
||||||
|
${EndIf}
|
||||||
|
|
||||||
|
IfErrors uninstall_failed
|
||||||
|
|
||||||
|
; Verify the old installation is gone before continuing
|
||||||
|
${If} $R1 != ""
|
||||||
|
IfFileExists "$R1\${SOFT_NAME}.exe" uninstall_failed
|
||||||
|
IfFileExists "$R1\bin\${SOFT_NAME}.exe" uninstall_failed
|
||||||
|
${EndIf}
|
||||||
|
|
||||||
|
Goto done
|
||||||
|
|
||||||
|
uninstall_failed:
|
||||||
|
MessageBox MB_OK|MB_ICONSTOP "$(uninstFailed)"
|
||||||
|
Abort
|
||||||
|
|
||||||
|
done:
|
||||||
|
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
;==============================================================================
|
||||||
|
; UNINSTALLER SECTION
|
||||||
|
;==============================================================================
|
||||||
|
|
||||||
|
Section "Uninstall"
|
||||||
|
SetRegView 64 ; NSIS 3: required so we delete from the correct hive
|
||||||
|
SetShellVarContext all
|
||||||
|
|
||||||
|
; Remove Start Menu shortcuts
|
||||||
|
RMDir /r "$SMPROGRAMS\${SOFT_NAME}"
|
||||||
|
|
||||||
|
; Remove Desktop shortcut
|
||||||
|
Delete "$DESKTOP\QElectroTech.lnk"
|
||||||
|
|
||||||
|
; Remove application files
|
||||||
|
Delete "$INSTDIR\*.*"
|
||||||
|
RMDir /r "$INSTDIR"
|
||||||
|
|
||||||
|
; Remove installation registry keys
|
||||||
|
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SOFT_NAME}"
|
||||||
|
DeleteRegKey /ifempty HKCU "Software\${SOFT_NAME}"
|
||||||
|
|
||||||
|
; Remove file associations registry keys
|
||||||
|
DeleteRegKey HKEY_CLASSES_ROOT "Applications\qelectrotech.exe"
|
||||||
|
DeleteRegKey HKEY_CLASSES_ROOT ".qet"
|
||||||
|
DeleteRegKey HKEY_CLASSES_ROOT "qet_diagram_file"
|
||||||
|
DeleteRegKey HKEY_CLASSES_ROOT ".elmt"
|
||||||
|
DeleteRegKey HKEY_CLASSES_ROOT "qet_element_file"
|
||||||
|
DeleteRegKey HKEY_CLASSES_ROOT ".titleblock"
|
||||||
|
DeleteRegKey HKEY_CLASSES_ROOT "qet_titleblock_file"
|
||||||
|
|
||||||
|
IfFileExists "$INSTDIR" 0 NoErrorMsg
|
||||||
|
; MessageBox MB_OK "Note: $INSTDIR could not be removed!"
|
||||||
|
NoErrorMsg:
|
||||||
|
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
;==============================================================================
|
||||||
|
; UNINSTALLER FUNCTIONS
|
||||||
|
;==============================================================================
|
||||||
|
|
||||||
|
Function un.onInit
|
||||||
|
SetRegView 64 ; NSIS 3: match the view used during install
|
||||||
|
!insertmacro MUI_UNGETLANGUAGE
|
||||||
|
FunctionEnd
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
LangString Refrigeration ${LANG_ENGLISH} "Refrigeration"
|
LangString Refrigeration ${LANG_ENGLISH} "Refrigeration"
|
||||||
LangString Solar_thermal ${LANG_ENGLISH} "Solar_thermal"
|
LangString Solar_thermal ${LANG_ENGLISH} "Solar_thermal"
|
||||||
LangString Lang ${LANG_ENGLISH} "Lang"
|
LangString Lang ${LANG_ENGLISH} "Lang"
|
||||||
|
LangString Fonts ${LANG_ENGLISH} "Fonts"
|
||||||
LangString Titleblocks ${LANG_ENGLISH} "Titleblocks"
|
LangString Titleblocks ${LANG_ENGLISH} "Titleblocks"
|
||||||
LangString Examples ${LANG_ENGLISH} "Examples"
|
LangString Examples ${LANG_ENGLISH} "Examples"
|
||||||
LangString Check ${LANG_ENGLISH} "Check to start ${SOFT_NAME}"
|
LangString Check ${LANG_ENGLISH} "Check to start ${SOFT_NAME}"
|
||||||
@@ -17,6 +18,8 @@
|
|||||||
LangString var2 ${LANG_ENGLISH} "languagues files"
|
LangString var2 ${LANG_ENGLISH} "languagues files"
|
||||||
LangString var3 ${LANG_ENGLISH} "Examples of cartridges"
|
LangString var3 ${LANG_ENGLISH} "Examples of cartridges"
|
||||||
LangString var4 ${LANG_ENGLISH} "Examples of diagrams"
|
LangString var4 ${LANG_ENGLISH} "Examples of diagrams"
|
||||||
|
LangString var5 ${LANG_ENGLISH} "Fonts"
|
||||||
|
LangString uninstFailed ${LANG_ENGLISH} "Uninstallation of the previous version failed.$\nPlease uninstall ${SOFT_NAME} manually before continuing."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_KOREAN} "${SOFT_NAME}이(가) 이미 설치되어 있습니다. $\n$\n이전 버전을 제거하려면 `OK`를, 업그레이드를 취소하려면 `Cancel`을 클릭하세요."
|
LangString installed ${LANG_KOREAN} "${SOFT_NAME}이(가) 이미 설치되어 있습니다. $\n$\n이전 버전을 제거하려면 `OK`를, 업그레이드를 취소하려면 `Cancel`을 클릭하세요."
|
||||||
@@ -31,6 +34,7 @@
|
|||||||
LangString Refrigeration ${LANG_KOREAN} "냉동"
|
LangString Refrigeration ${LANG_KOREAN} "냉동"
|
||||||
LangString Solar_thermal ${LANG_KOREAN} "태양열"
|
LangString Solar_thermal ${LANG_KOREAN} "태양열"
|
||||||
LangString Lang ${LANG_KOREAN} "언어"
|
LangString Lang ${LANG_KOREAN} "언어"
|
||||||
|
LangString Fonts ${LANG_KOREAN} "글꼴"
|
||||||
LangString Titleblocks ${LANG_KOREAN} "표제란"
|
LangString Titleblocks ${LANG_KOREAN} "표제란"
|
||||||
LangString Examples ${LANG_KOREAN} "예제"
|
LangString Examples ${LANG_KOREAN} "예제"
|
||||||
LangString Check ${LANG_KOREAN} "${SOFT_NAME} 실행"
|
LangString Check ${LANG_KOREAN} "${SOFT_NAME} 실행"
|
||||||
@@ -38,6 +42,8 @@
|
|||||||
LangString var2 ${LANG_KOREAN} "언어 파일"
|
LangString var2 ${LANG_KOREAN} "언어 파일"
|
||||||
LangString var3 ${LANG_KOREAN} "표제란 예제"
|
LangString var3 ${LANG_KOREAN} "표제란 예제"
|
||||||
LangString var4 ${LANG_KOREAN} "도면 예제"
|
LangString var4 ${LANG_KOREAN} "도면 예제"
|
||||||
|
LangString var5 ${LANG_KOREAN} "글꼴"
|
||||||
|
LangString uninstFailed ${LANG_KOREAN} "이전 버전을 제거하지 못했습니다.$\n계속하기 전에 ${SOFT_NAME}을(를) 수동으로 제거해 주세요."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_POLISH} "${SOFT_NAME} jest już zainstalowany. $\n$\nKliknij `OK` aby odinstalować poprzednią wersję lub `Anuluj` aby przerwać aktualizację."
|
LangString installed ${LANG_POLISH} "${SOFT_NAME} jest już zainstalowany. $\n$\nKliknij `OK` aby odinstalować poprzednią wersję lub `Anuluj` aby przerwać aktualizację."
|
||||||
@@ -52,13 +58,16 @@
|
|||||||
LangString Refrigeration ${LANG_POLISH} "Chłodnictwo"
|
LangString Refrigeration ${LANG_POLISH} "Chłodnictwo"
|
||||||
LangString Solar_thermal ${LANG_POLISH} "Energia słoneczna"
|
LangString Solar_thermal ${LANG_POLISH} "Energia słoneczna"
|
||||||
LangString Lang ${LANG_POLISH} "Język"
|
LangString Lang ${LANG_POLISH} "Język"
|
||||||
|
LangString Fonts ${LANG_POLISH} "Czcionki"
|
||||||
LangString Titleblocks ${LANG_POLISH} "Tabliczki rysunkowe"
|
LangString Titleblocks ${LANG_POLISH} "Tabliczki rysunkowe"
|
||||||
LangString Examples ${LANG_POLISH} "Przykłady"
|
LangString Examples ${LANG_POLISH} "Przykłady"
|
||||||
LangString Check ${LANG_POLISH} "Check to start ${SOFT_NAME}"
|
LangString Check ${LANG_POLISH} "Zaznacz, aby uruchomić ${SOFT_NAME}"
|
||||||
LangString var1 ${LANG_POLISH} "Elements of the official collection"
|
LangString var1 ${LANG_POLISH} "Elementy oficjalnej kolekcji"
|
||||||
LangString var2 ${LANG_POLISH} "languagues files"
|
LangString var2 ${LANG_POLISH} "Pliki językowe"
|
||||||
LangString var3 ${LANG_POLISH} "Examples of cartridges"
|
LangString var3 ${LANG_POLISH} "Przykłady tabliczek rysunkowych"
|
||||||
LangString var4 ${LANG_POLISH} "Examples of diagrams"
|
LangString var4 ${LANG_POLISH} "Przykłady schematów"
|
||||||
|
LangString var5 ${LANG_POLISH} "Czcionki"
|
||||||
|
LangString uninstFailed ${LANG_POLISH} "Odinstalowanie poprzedniej wersji nie powiodło się.$\nPrzed kontynuowaniem odinstaluj ręcznie program ${SOFT_NAME}."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_GREEK} "${SOFT_NAME} είναι ήδη εγκατεστημένο. $\n$\nΠάτησε `OK` για αφαίρεση της προηγούμενης έκδοσης ή `Cancel` για ακύρωση της αναβάθμισης."
|
LangString installed ${LANG_GREEK} "${SOFT_NAME} είναι ήδη εγκατεστημένο. $\n$\nΠάτησε `OK` για αφαίρεση της προηγούμενης έκδοσης ή `Cancel` για ακύρωση της αναβάθμισης."
|
||||||
@@ -73,55 +82,64 @@
|
|||||||
LangString Refrigeration ${LANG_GREEK} "Ψύξη"
|
LangString Refrigeration ${LANG_GREEK} "Ψύξη"
|
||||||
LangString Solar_thermal ${LANG_GREEK} "Ηλιοθερμία"
|
LangString Solar_thermal ${LANG_GREEK} "Ηλιοθερμία"
|
||||||
LangString Lang ${LANG_GREEK} "Γλώσσα"
|
LangString Lang ${LANG_GREEK} "Γλώσσα"
|
||||||
|
LangString Fonts ${LANG_GREEK} "Γραμματοσειρές"
|
||||||
LangString Titleblocks ${LANG_GREEK} "Πινακίδες"
|
LangString Titleblocks ${LANG_GREEK} "Πινακίδες"
|
||||||
LangString Examples ${LANG_GREEK} "Παραδείγματα"
|
LangString Examples ${LANG_GREEK} "Παραδείγματα"
|
||||||
LangString Check ${LANG_GREEK} "Επιλέξτε για εκκίνηση ${SOFT_NAME}"
|
LangString Check ${LANG_GREEK} "Επιλέξτε για εκκίνηση ${SOFT_NAME}"
|
||||||
LangString var1 ${LANG_GREEK} "Στοιχεία της επίσημης συλλογής"
|
LangString var1 ${LANG_GREEK} "Στοιχεία της επίσημης συλλογής"
|
||||||
LangString var2 ${LANG_GREEK} "Αρχεία γλωσσών"
|
LangString var2 ${LANG_GREEK} "Αρχεία γλωσσών"
|
||||||
LangString var3 ${LANG_GREEK} "Examples of cartridges"
|
LangString var3 ${LANG_GREEK} "Παραδείγματα πινακίδων"
|
||||||
LangString var4 ${LANG_GREEK} "Παραδείγματα διαγραμμάτων"
|
LangString var4 ${LANG_GREEK} "Παραδείγματα διαγραμμάτων"
|
||||||
|
LangString var5 ${LANG_GREEK} "Γραμματοσειρές"
|
||||||
|
LangString uninstFailed ${LANG_GREEK} "Η απεγκατάσταση της προηγούμενης έκδοσης απέτυχε.$\nΠαρακαλώ απεγκαταστήστε χειροκίνητα το ${SOFT_NAME} πριν συνεχίσετε."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_CZECH} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
LangString installed ${LANG_CZECH} "${SOFT_NAME} je již nainstalován. $\n$\nKlikněte na `OK` pro odebrání předchozí verze nebo na `Zrušit` pro zrušení tohoto upgradu."
|
||||||
LangString wrongArch ${LANG_CZECH} "This distribution is for 64 bits computers only."
|
LangString wrongArch ${LANG_CZECH} "Tato distribuce je určena pouze pro 64bitové počítače."
|
||||||
LangString Elements ${LANG_CZECH} "Elements"
|
LangString Elements ${LANG_CZECH} "Prvky"
|
||||||
LangString Electric ${LANG_CZECH} "Electric"
|
LangString Electric ${LANG_CZECH} "Elektrika"
|
||||||
LangString Logic ${LANG_CZECH} "Logic"
|
LangString Logic ${LANG_CZECH} "Logika"
|
||||||
LangString Hydraulic ${LANG_CZECH} "Hydraulic"
|
LangString Hydraulic ${LANG_CZECH} "Hydraulika"
|
||||||
LangString Pneumatic ${LANG_CZECH} "Pneumatic"
|
LangString Pneumatic ${LANG_CZECH} "Pneumatika"
|
||||||
LangString Energy ${LANG_CZECH} "Energy"
|
LangString Energy ${LANG_CZECH} "Energie"
|
||||||
LangString water ${LANG_CZECH} "Water"
|
LangString water ${LANG_CZECH} "Voda"
|
||||||
LangString Refrigeration ${LANG_CZECH} "Refrigeration"
|
LangString Refrigeration ${LANG_CZECH} "Chlazení"
|
||||||
LangString Solar_thermal ${LANG_CZECH} "Solar_thermal"
|
LangString Solar_thermal ${LANG_CZECH} "Solární_teplo"
|
||||||
LangString Lang ${LANG_CZECH} "Lang"
|
LangString Lang ${LANG_CZECH} "Jazyk"
|
||||||
LangString Titleblocks ${LANG_CZECH} "Titleblocks"
|
LangString Fonts ${LANG_CZECH} "Písma"
|
||||||
LangString Examples ${LANG_CZECH} "Examples"
|
LangString Titleblocks ${LANG_CZECH} "Popisová pole"
|
||||||
LangString Check ${LANG_CZECH} "Check to start ${SOFT_NAME}"
|
LangString Examples ${LANG_CZECH} "Příklady"
|
||||||
LangString var1 ${LANG_CZECH} "Elements of the official collection"
|
LangString Check ${LANG_CZECH} "Zaškrtněte pro spuštění ${SOFT_NAME}"
|
||||||
LangString var2 ${LANG_CZECH} "languagues files"
|
LangString var1 ${LANG_CZECH} "Prvky oficiální kolekce"
|
||||||
LangString var3 ${LANG_CZECH} "Examples of cartridges"
|
LangString var2 ${LANG_CZECH} "Jazykové soubory"
|
||||||
LangString var4 ${LANG_CZECH} "Examples of diagrams"
|
LangString var3 ${LANG_CZECH} "Příklady popisových polí"
|
||||||
|
LangString var4 ${LANG_CZECH} "Příklady schémat"
|
||||||
|
LangString var5 ${LANG_CZECH} "Písma"
|
||||||
|
LangString uninstFailed ${LANG_CZECH} "Odinstalování předchozí verze se nezdařilo.$\nPřed pokračováním prosím odinstalujte ${SOFT_NAME} ručně."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_SPANISH} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
LangString installed ${LANG_SPANISH} "${SOFT_NAME} ya está instalado. $\n$\nHaga clic en `Aceptar` para eliminar la versión anterior o en `Cancelar` para cancelar esta actualización."
|
||||||
LangString wrongArch ${LANG_SPANISH} "This distribution is for 64 bits computers only."
|
LangString wrongArch ${LANG_SPANISH} "Esta distribución es solo para ordenadores de 64 bits."
|
||||||
LangString Elements ${LANG_SPANISH} "Elements"
|
LangString Elements ${LANG_SPANISH} "Elementos"
|
||||||
LangString Electric ${LANG_SPANISH} "Electric"
|
LangString Electric ${LANG_SPANISH} "Eléctrico"
|
||||||
LangString Logic ${LANG_SPANISH} "Logic"
|
LangString Logic ${LANG_SPANISH} "Lógica"
|
||||||
LangString Hydraulic ${LANG_SPANISH} "Hydraulic"
|
LangString Hydraulic ${LANG_SPANISH} "Hidráulica"
|
||||||
LangString Pneumatic ${LANG_SPANISH} "Pneumatic"
|
LangString Pneumatic ${LANG_SPANISH} "Neumática"
|
||||||
LangString Energy ${LANG_SPANISH} "Energy"
|
LangString Energy ${LANG_SPANISH} "Energía"
|
||||||
LangString water ${LANG_SPANISH} "Water"
|
LangString water ${LANG_SPANISH} "Agua"
|
||||||
LangString Refrigeration ${LANG_SPANISH} "Refrigeration"
|
LangString Refrigeration ${LANG_SPANISH} "Refrigeración"
|
||||||
LangString Solar_thermal ${LANG_SPANISH} "Solar_thermal"
|
LangString Solar_thermal ${LANG_SPANISH} "Solar_térmico"
|
||||||
LangString Lang ${LANG_SPANISH} "Lang"
|
LangString Lang ${LANG_SPANISH} "Idioma"
|
||||||
LangString Titleblocks ${LANG_SPANISH} "Titleblocks"
|
LangString Fonts ${LANG_SPANISH} "Fuentes"
|
||||||
LangString Examples ${LANG_SPANISH} "Examples"
|
LangString Titleblocks ${LANG_SPANISH} "Cartelas"
|
||||||
LangString Check ${LANG_SPANISH} "Check to start ${SOFT_NAME}"
|
LangString Examples ${LANG_SPANISH} "Ejemplos"
|
||||||
LangString var1 ${LANG_SPANISH} "Elements of the official collection"
|
LangString Check ${LANG_SPANISH} "Marcar para iniciar ${SOFT_NAME}"
|
||||||
LangString var2 ${LANG_SPANISH} "languagues files"
|
LangString var1 ${LANG_SPANISH} "Elementos de la colección oficial"
|
||||||
LangString var3 ${LANG_SPANISH} "Examples of cartridges"
|
LangString var2 ${LANG_SPANISH} "Archivos de idioma"
|
||||||
LangString var4 ${LANG_SPANISH} "Examples of diagrams"
|
LangString var3 ${LANG_SPANISH} "Ejemplos de cartelas"
|
||||||
|
LangString var4 ${LANG_SPANISH} "Ejemplos de esquemas"
|
||||||
|
LangString var5 ${LANG_SPANISH} "Fuentes"
|
||||||
|
LangString uninstFailed ${LANG_SPANISH} "La desinstalación de la versión anterior ha fallado.$\nPor favor, desinstale ${SOFT_NAME} manualmente antes de continuar."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_GERMAN} "${SOFT_NAME} ist bereits installiert. $\n$\nKlicken Sie auf `OK`, um die alte Version zu deinstallieren, oder auf `Abbrechen`, um das Upgrade abzubrechen."
|
LangString installed ${LANG_GERMAN} "${SOFT_NAME} ist bereits installiert. $\n$\nKlicken Sie auf `OK`, um die alte Version zu deinstallieren, oder auf `Abbrechen`, um das Upgrade abzubrechen."
|
||||||
@@ -136,6 +154,7 @@
|
|||||||
LangString Refrigeration ${LANG_GERMAN} "Kältetechnik"
|
LangString Refrigeration ${LANG_GERMAN} "Kältetechnik"
|
||||||
LangString Solar_thermal ${LANG_GERMAN} "Solar-Wärmetechnik"
|
LangString Solar_thermal ${LANG_GERMAN} "Solar-Wärmetechnik"
|
||||||
LangString Lang ${LANG_GERMAN} "Sprachen"
|
LangString Lang ${LANG_GERMAN} "Sprachen"
|
||||||
|
LangString Fonts ${LANG_GERMAN} "Schriften"
|
||||||
LangString Titleblocks ${LANG_GERMAN} "Schriftfelder"
|
LangString Titleblocks ${LANG_GERMAN} "Schriftfelder"
|
||||||
LangString Examples ${LANG_GERMAN} "Beispiele"
|
LangString Examples ${LANG_GERMAN} "Beispiele"
|
||||||
LangString Check ${LANG_GERMAN} "Ankreuzen zum Starten von ${SOFT_NAME}"
|
LangString Check ${LANG_GERMAN} "Ankreuzen zum Starten von ${SOFT_NAME}"
|
||||||
@@ -143,6 +162,8 @@
|
|||||||
LangString var2 ${LANG_GERMAN} "Sprachdateien"
|
LangString var2 ${LANG_GERMAN} "Sprachdateien"
|
||||||
LangString var3 ${LANG_GERMAN} "Schriftfeld-Beispiele"
|
LangString var3 ${LANG_GERMAN} "Schriftfeld-Beispiele"
|
||||||
LangString var4 ${LANG_GERMAN} "Schaltplan-Beispiele"
|
LangString var4 ${LANG_GERMAN} "Schaltplan-Beispiele"
|
||||||
|
LangString var5 ${LANG_GERMAN} "Schriften"
|
||||||
|
LangString uninstFailed ${LANG_GERMAN} "Die Deinstallation der vorherigen Version ist fehlgeschlagen.$\nBitte deinstallieren Sie ${SOFT_NAME} manuell, bevor Sie fortfahren."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_RUSSIAN} "${SOFT_NAME} уже установлен. $\n$\nДля удаления предыдущей версии нажмите `OK` или `Cancel` для отмены обновления."
|
LangString installed ${LANG_RUSSIAN} "${SOFT_NAME} уже установлен. $\n$\nДля удаления предыдущей версии нажмите `OK` или `Cancel` для отмены обновления."
|
||||||
@@ -157,6 +178,7 @@
|
|||||||
LangString Refrigeration ${LANG_RUSSIAN} "Холодильная техника"
|
LangString Refrigeration ${LANG_RUSSIAN} "Холодильная техника"
|
||||||
LangString Solar_thermal ${LANG_RUSSIAN} "Солнечная-тепловая"
|
LangString Solar_thermal ${LANG_RUSSIAN} "Солнечная-тепловая"
|
||||||
LangString Lang ${LANG_RUSSIAN} "Язык"
|
LangString Lang ${LANG_RUSSIAN} "Язык"
|
||||||
|
LangString Fonts ${LANG_RUSSIAN} "Шрифты"
|
||||||
LangString Titleblocks ${LANG_RUSSIAN} "Штампы"
|
LangString Titleblocks ${LANG_RUSSIAN} "Штампы"
|
||||||
LangString Examples ${LANG_RUSSIAN} "Примеры"
|
LangString Examples ${LANG_RUSSIAN} "Примеры"
|
||||||
LangString Check ${LANG_RUSSIAN} "Нажмите для запуска ${SOFT_NAME}"
|
LangString Check ${LANG_RUSSIAN} "Нажмите для запуска ${SOFT_NAME}"
|
||||||
@@ -164,48 +186,56 @@
|
|||||||
LangString var2 ${LANG_RUSSIAN} "языковые файлы"
|
LangString var2 ${LANG_RUSSIAN} "языковые файлы"
|
||||||
LangString var3 ${LANG_RUSSIAN} "Примеры штампов"
|
LangString var3 ${LANG_RUSSIAN} "Примеры штампов"
|
||||||
LangString var4 ${LANG_RUSSIAN} "Примеры схем"
|
LangString var4 ${LANG_RUSSIAN} "Примеры схем"
|
||||||
|
LangString var5 ${LANG_RUSSIAN} "Шрифты"
|
||||||
|
LangString uninstFailed ${LANG_RUSSIAN} "Удаление предыдущей версии завершилось с ошибкой.$\nПожалуйста, удалите ${SOFT_NAME} вручную перед продолжением."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_ARABIC} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
LangString installed ${LANG_ARABIC} "${SOFT_NAME} مثبَّت بالفعل. $\n$\nانقر على `موافق` لإزالة الإصدار السابق أو على `إلغاء` لإلغاء هذا التحديث."
|
||||||
LangString wrongArch ${LANG_ARABIC} "This distribution is for 64 bits computers only."
|
LangString wrongArch ${LANG_ARABIC} "هذا التوزيع مخصص لأجهزة الكمبيوتر 64 بت فقط."
|
||||||
LangString Elements ${LANG_ARABIC} "Elements"
|
LangString Elements ${LANG_ARABIC} "العناصر"
|
||||||
LangString Electric ${LANG_ARABIC} "Electric"
|
LangString Electric ${LANG_ARABIC} "الكهرباء"
|
||||||
LangString Logic ${LANG_ARABIC} "Logic"
|
LangString Logic ${LANG_ARABIC} "المنطق"
|
||||||
LangString Hydraulic ${LANG_ARABIC} "Hydraulic"
|
LangString Hydraulic ${LANG_ARABIC} "الهيدروليك"
|
||||||
LangString Pneumatic ${LANG_ARABIC} "Pneumatic"
|
LangString Pneumatic ${LANG_ARABIC} "الهواء المضغوط"
|
||||||
LangString Energy ${LANG_ARABIC} "Energy"
|
LangString Energy ${LANG_ARABIC} "الطاقة"
|
||||||
LangString water ${LANG_ARABIC} "Water"
|
LangString water ${LANG_ARABIC} "الماء"
|
||||||
LangString Refrigeration ${LANG_ARABIC} "Refrigeration"
|
LangString Refrigeration ${LANG_ARABIC} "التبريد"
|
||||||
LangString Solar_thermal ${LANG_ARABIC} "Solar_thermal"
|
LangString Solar_thermal ${LANG_ARABIC} "الطاقة_الشمسية_الحرارية"
|
||||||
LangString Lang ${LANG_ARABIC} "Lang"
|
LangString Lang ${LANG_ARABIC} "اللغة"
|
||||||
LangString Titleblocks ${LANG_ARABIC} "Titleblocks"
|
LangString Fonts ${LANG_ARABIC} "الخطوط"
|
||||||
LangString Examples ${LANG_ARABIC} "Examples"
|
LangString Titleblocks ${LANG_ARABIC} "كتل العنوان"
|
||||||
LangString Check ${LANG_ARABIC} "Check to start ${SOFT_NAME}"
|
LangString Examples ${LANG_ARABIC} "أمثلة"
|
||||||
LangString var1 ${LANG_ARABIC} "Elements of the official collection"
|
LangString Check ${LANG_ARABIC} "حدد لتشغيل ${SOFT_NAME}"
|
||||||
LangString var2 ${LANG_ARABIC} "languagues files"
|
LangString var1 ${LANG_ARABIC} "عناصر المجموعة الرسمية"
|
||||||
LangString var3 ${LANG_ARABIC} "Examples of cartridges"
|
LangString var2 ${LANG_ARABIC} "ملفات اللغة"
|
||||||
LangString var4 ${LANG_ARABIC} "Examples of diagrams"
|
LangString var3 ${LANG_ARABIC} "أمثلة على كتل العنوان"
|
||||||
|
LangString var4 ${LANG_ARABIC} "أمثلة على المخططات"
|
||||||
|
LangString var5 ${LANG_ARABIC} "الخطوط"
|
||||||
|
LangString uninstFailed ${LANG_ARABIC} "فشل إلغاء تثبيت الإصدار السابق. يرجى إلغاء تثبيت ${SOFT_NAME} يدويًا قبل المتابعة."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_CATALAN} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
LangString installed ${LANG_CATALAN} "${SOFT_NAME} ja està instal·lat. $\n$\nFeu clic a `D'acord` per eliminar la versió anterior o a `Cancel·la` per cancel·lar aquesta actualització."
|
||||||
LangString wrongArch ${LANG_CATALAN} "This distribution is for 64 bits computers only."
|
LangString wrongArch ${LANG_CATALAN} "Aquesta distribució és només per a ordinadors de 64 bits."
|
||||||
LangString Elements ${LANG_CATALAN} "Elements"
|
LangString Elements ${LANG_CATALAN} "Elements"
|
||||||
LangString Electric ${LANG_CATALAN} "Electric"
|
LangString Electric ${LANG_CATALAN} "Elèctric"
|
||||||
LangString Logic ${LANG_CATALAN} "Logic"
|
LangString Logic ${LANG_CATALAN} "Lògica"
|
||||||
LangString Hydraulic ${LANG_CATALAN} "Hydraulic"
|
LangString Hydraulic ${LANG_CATALAN} "Hidràulica"
|
||||||
LangString Pneumatic ${LANG_CATALAN} "Pneumatic"
|
LangString Pneumatic ${LANG_CATALAN} "Pneumàtica"
|
||||||
LangString Energy ${LANG_CATALAN} "Energy"
|
LangString Energy ${LANG_CATALAN} "Energia"
|
||||||
LangString water ${LANG_CATALAN} "Water"
|
LangString water ${LANG_CATALAN} "Aigua"
|
||||||
LangString Refrigeration ${LANG_CATALAN} "Refrigeration"
|
LangString Refrigeration ${LANG_CATALAN} "Refrigeració"
|
||||||
LangString Solar_thermal ${LANG_CATALAN} "Solar_thermal"
|
LangString Solar_thermal ${LANG_CATALAN} "Solar_tèrmic"
|
||||||
LangString Lang ${LANG_CATALAN} "Lang"
|
LangString Lang ${LANG_CATALAN} "Idioma"
|
||||||
LangString Titleblocks ${LANG_CATALAN} "Titleblocks"
|
LangString Fonts ${LANG_CATALAN} "Tipus de lletra"
|
||||||
LangString Examples ${LANG_CATALAN} "Examples"
|
LangString Titleblocks ${LANG_CATALAN} "Cartutxos"
|
||||||
LangString Check ${LANG_CATALAN} "Check to start ${SOFT_NAME}"
|
LangString Examples ${LANG_CATALAN} "Exemples"
|
||||||
LangString var1 ${LANG_CATALAN} "Elements of the official collection"
|
LangString Check ${LANG_CATALAN} "Marca per iniciar ${SOFT_NAME}"
|
||||||
LangString var2 ${LANG_CATALAN} "languagues files"
|
LangString var1 ${LANG_CATALAN} "Elements de la col·lecció oficial"
|
||||||
LangString var3 ${LANG_CATALAN} "Examples of cartridges"
|
LangString var2 ${LANG_CATALAN} "Fitxers d'idioma"
|
||||||
LangString var4 ${LANG_CATALAN} "Examples of diagrams"
|
LangString var3 ${LANG_CATALAN} "Exemples de cartutxos"
|
||||||
|
LangString var4 ${LANG_CATALAN} "Exemples d'esquemes"
|
||||||
|
LangString var5 ${LANG_CATALAN} "Tipus de lletra"
|
||||||
|
LangString uninstFailed ${LANG_CATALAN} "La desinstal·lació de la versió anterior ha fallat.$\nSi us plau, desinstal·leu ${SOFT_NAME} manualment abans de continuar."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_ITALIAN} "${SOFT_NAME} è già installato. $\n$\nFare click su `OK` per rimuovere la versione precedente o su `Annulla` per annullare questo aggiornamento."
|
LangString installed ${LANG_ITALIAN} "${SOFT_NAME} è già installato. $\n$\nFare click su `OK` per rimuovere la versione precedente o su `Annulla` per annullare questo aggiornamento."
|
||||||
@@ -220,6 +250,7 @@
|
|||||||
LangString Refrigeration ${LANG_ITALIAN} "Refrigerazione"
|
LangString Refrigeration ${LANG_ITALIAN} "Refrigerazione"
|
||||||
LangString Solar_thermal ${LANG_ITALIAN} "Solare_termico"
|
LangString Solar_thermal ${LANG_ITALIAN} "Solare_termico"
|
||||||
LangString Lang ${LANG_ITALIAN} "Lingua"
|
LangString Lang ${LANG_ITALIAN} "Lingua"
|
||||||
|
LangString Fonts ${LANG_ITALIAN} "Caratteri"
|
||||||
LangString Titleblocks ${LANG_ITALIAN} "Cartigli"
|
LangString Titleblocks ${LANG_ITALIAN} "Cartigli"
|
||||||
LangString Examples ${LANG_ITALIAN} "Esempi"
|
LangString Examples ${LANG_ITALIAN} "Esempi"
|
||||||
LangString Check ${LANG_ITALIAN} "Avvia ${SOFT_NAME}"
|
LangString Check ${LANG_ITALIAN} "Avvia ${SOFT_NAME}"
|
||||||
@@ -227,69 +258,80 @@
|
|||||||
LangString var2 ${LANG_ITALIAN} "File della lingua"
|
LangString var2 ${LANG_ITALIAN} "File della lingua"
|
||||||
LangString var3 ${LANG_ITALIAN} "Cartigli di esempio"
|
LangString var3 ${LANG_ITALIAN} "Cartigli di esempio"
|
||||||
LangString var4 ${LANG_ITALIAN} "Schemi di esempio"
|
LangString var4 ${LANG_ITALIAN} "Schemi di esempio"
|
||||||
|
LangString var5 ${LANG_ITALIAN} "Caratteri"
|
||||||
|
LangString uninstFailed ${LANG_ITALIAN} "La disinstallazione della versione precedente non è riuscita.$\nSi prega di disinstallare ${SOFT_NAME} manualmente prima di continuare."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_PORTUGUESE} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
LangString installed ${LANG_PORTUGUESE} "${SOFT_NAME} já está instalado. $\n$\nClique em `OK` para remover a versão anterior ou em `Cancelar` para cancelar esta atualização."
|
||||||
LangString wrongArch ${LANG_PORTUGUESE} "This distribution is for 64 bits computers only."
|
LangString wrongArch ${LANG_PORTUGUESE} "Esta distribuição é apenas para computadores de 64 bits."
|
||||||
LangString Elements ${LANG_PORTUGUESE} "Elements"
|
LangString Elements ${LANG_PORTUGUESE} "Elementos"
|
||||||
LangString Electric ${LANG_PORTUGUESE} "Electric"
|
LangString Electric ${LANG_PORTUGUESE} "Elétrica"
|
||||||
LangString Logic ${LANG_PORTUGUESE} "Logic"
|
LangString Logic ${LANG_PORTUGUESE} "Lógica"
|
||||||
LangString Hydraulic ${LANG_PORTUGUESE} "Hydraulic"
|
LangString Hydraulic ${LANG_PORTUGUESE} "Hidráulica"
|
||||||
LangString Pneumatic ${LANG_PORTUGUESE} "Pneumatic"
|
LangString Pneumatic ${LANG_PORTUGUESE} "Pneumática"
|
||||||
LangString Energy ${LANG_PORTUGUESE} "Energy"
|
LangString Energy ${LANG_PORTUGUESE} "Energia"
|
||||||
LangString water ${LANG_PORTUGUESE} "Water"
|
LangString water ${LANG_PORTUGUESE} "Água"
|
||||||
LangString Refrigeration ${LANG_PORTUGUESE} "Refrigeration"
|
LangString Refrigeration ${LANG_PORTUGUESE} "Refrigeração"
|
||||||
LangString Solar_thermal ${LANG_PORTUGUESE} "Solar_thermal"
|
LangString Solar_thermal ${LANG_PORTUGUESE} "Solar_térmico"
|
||||||
LangString Lang ${LANG_PORTUGUESE} "Lang"
|
LangString Lang ${LANG_PORTUGUESE} "Idioma"
|
||||||
LangString Titleblocks ${LANG_PORTUGUESE} "Titleblocks"
|
LangString Fonts ${LANG_PORTUGUESE} "Fontes"
|
||||||
LangString Examples ${LANG_PORTUGUESE} "Examples"
|
LangString Titleblocks ${LANG_PORTUGUESE} "Legendas"
|
||||||
LangString Check ${LANG_PORTUGUESE} "Avviare ${SOFT_NAME}"
|
LangString Examples ${LANG_PORTUGUESE} "Exemplos"
|
||||||
LangString var1 ${LANG_PORTUGUESE} "Elements of the official collection"
|
LangString Check ${LANG_PORTUGUESE} "Marcar para iniciar ${SOFT_NAME}"
|
||||||
LangString var2 ${LANG_PORTUGUESE} "languagues files"
|
LangString var1 ${LANG_PORTUGUESE} "Elementos da coleção oficial"
|
||||||
LangString var3 ${LANG_PORTUGUESE} "Examples of cartridges"
|
LangString var2 ${LANG_PORTUGUESE} "Arquivos de idioma"
|
||||||
LangString var4 ${LANG_PORTUGUESE} "Examples of diagrams"
|
LangString var3 ${LANG_PORTUGUESE} "Exemplos de legendas"
|
||||||
|
LangString var4 ${LANG_PORTUGUESE} "Exemplos de esquemas"
|
||||||
|
LangString var5 ${LANG_PORTUGUESE} "Fontes"
|
||||||
|
LangString uninstFailed ${LANG_PORTUGUESE} "A desinstalação da versão anterior falhou.$\nPor favor, desinstale ${SOFT_NAME} manualmente antes de continuar."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_ROMANIAN} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
LangString installed ${LANG_ROMANIAN} "${SOFT_NAME} este deja instalat. $\n$\nFaceți clic pe `OK` pentru a elimina versiunea anterioară sau pe `Anulare` pentru a anula această actualizare."
|
||||||
LangString wrongArch ${LANG_ROMANIAN} "This distribution is for 64 bits computers only."
|
LangString wrongArch ${LANG_ROMANIAN} "Această distribuție este destinată numai computerelor pe 64 de biți."
|
||||||
LangString Elements ${LANG_ROMANIAN} "Elements"
|
LangString Elements ${LANG_ROMANIAN} "Elemente"
|
||||||
LangString Electric ${LANG_ROMANIAN} "Electric"
|
LangString Electric ${LANG_ROMANIAN} "Electric"
|
||||||
LangString Logic ${LANG_ROMANIAN} "Logic"
|
LangString Logic ${LANG_ROMANIAN} "Logică"
|
||||||
LangString Hydraulic ${LANG_ROMANIAN} "Hydraulic"
|
LangString Hydraulic ${LANG_ROMANIAN} "Hidraulică"
|
||||||
LangString Pneumatic ${LANG_ROMANIAN} "Pneumatic"
|
LangString Pneumatic ${LANG_ROMANIAN} "Pneumatică"
|
||||||
LangString Energy ${LANG_ROMANIAN} "Energy"
|
LangString Energy ${LANG_ROMANIAN} "Energie"
|
||||||
LangString water ${LANG_ROMANIAN} "Water"
|
LangString water ${LANG_ROMANIAN} "Apă"
|
||||||
LangString Refrigeration ${LANG_ROMANIAN} "Refrigeration"
|
LangString Refrigeration ${LANG_ROMANIAN} "Refrigerare"
|
||||||
LangString Solar_thermal ${LANG_ROMANIAN} "Solar_thermal"
|
LangString Solar_thermal ${LANG_ROMANIAN} "Solar_termic"
|
||||||
LangString Lang ${LANG_ROMANIAN} "Lang"
|
LangString Lang ${LANG_ROMANIAN} "Limbă"
|
||||||
LangString Titleblocks ${LANG_ROMANIAN} "Titleblocks"
|
LangString Fonts ${LANG_ROMANIAN} "Fonturi"
|
||||||
LangString Examples ${LANG_ROMANIAN} "Examples"
|
LangString Titleblocks ${LANG_ROMANIAN} "Cartușe"
|
||||||
LangString Check ${LANG_ROMANIAN} "Check to start ${SOFT_NAME}"
|
LangString Examples ${LANG_ROMANIAN} "Exemple"
|
||||||
LangString var1 ${LANG_ROMANIAN} "Elements of the official collection"
|
LangString Check ${LANG_ROMANIAN} "Bifați pentru a porni ${SOFT_NAME}"
|
||||||
LangString var2 ${LANG_ROMANIAN} "languagues files"
|
LangString var1 ${LANG_ROMANIAN} "Elemente din colecția oficială"
|
||||||
LangString var3 ${LANG_ROMANIAN} "Examples of cartridges"
|
LangString var2 ${LANG_ROMANIAN} "Fișiere de limbă"
|
||||||
LangString var4 ${LANG_ROMANIAN} "Examples of diagrams"
|
LangString var3 ${LANG_ROMANIAN} "Exemple de cartușe"
|
||||||
|
LangString var4 ${LANG_ROMANIAN} "Exemple de scheme"
|
||||||
|
LangString var5 ${LANG_ROMANIAN} "Fonturi"
|
||||||
|
LangString uninstFailed ${LANG_ROMANIAN} "Dezinstalarea versiunii anterioare a eșuat.$\nVă rugăm să dezinstalați ${SOFT_NAME} manual înainte de a continua."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_CROATIAN} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
LangString installed ${LANG_CROATIAN} "${SOFT_NAME} je već instaliran. $\n$\nKliknite `U redu` za uklanjanje prethodne verzije ili `Odustani` za odustajanje od nadogradnje."
|
||||||
LangString wrongArch ${LANG_CROATIAN} "This distribution is for 64 bits computers only."
|
LangString wrongArch ${LANG_CROATIAN} "Ova distribucija namijenjena je samo za 64-bitna računala."
|
||||||
LangString Elements ${LANG_CROATIAN} "Elements"
|
LangString Elements ${LANG_CROATIAN} "Elementi"
|
||||||
LangString Electric ${LANG_CROATIAN} "Electric"
|
LangString Electric ${LANG_CROATIAN} "Elektrika"
|
||||||
LangString Logic ${LANG_CROATIAN} "Logic"
|
LangString Logic ${LANG_CROATIAN} "Logika"
|
||||||
LangString Hydraulic ${LANG_CROATIAN} "Hydraulic"
|
LangString Hydraulic ${LANG_CROATIAN} "Hidraulika"
|
||||||
LangString Pneumatic ${LANG_CROATIAN} "Pneumatic"
|
LangString Pneumatic ${LANG_CROATIAN} "Pneumatika"
|
||||||
LangString Energy ${LANG_CROATIAN} "Energy"
|
LangString Energy ${LANG_CROATIAN} "Energija"
|
||||||
LangString water ${LANG_CROATIAN} "Water"
|
LangString water ${LANG_CROATIAN} "Voda"
|
||||||
LangString Refrigeration ${LANG_CROATIAN} "Refrigeration"
|
LangString Refrigeration ${LANG_CROATIAN} "Hlađenje"
|
||||||
LangString Solar_thermal ${LANG_CROATIAN} "Solar_thermal"
|
LangString Solar_thermal ${LANG_CROATIAN} "Solarno_toplinsko"
|
||||||
LangString Lang ${LANG_CROATIAN} "Lang"
|
LangString Lang ${LANG_CROATIAN} "Jezik"
|
||||||
LangString Titleblocks ${LANG_CROATIAN} "Titleblocks"
|
LangString Fonts ${LANG_CROATIAN} "Fontovi"
|
||||||
LangString Examples ${LANG_CROATIAN} "Examples"
|
LangString Titleblocks ${LANG_CROATIAN} "Zaglavlja"
|
||||||
LangString Check ${LANG_CROATIAN} "Check to start ${SOFT_NAME}"
|
LangString Examples ${LANG_CROATIAN} "Primjeri"
|
||||||
LangString var1 ${LANG_CROATIAN} "Elements of the official collection"
|
LangString Check ${LANG_CROATIAN} "Označite za pokretanje ${SOFT_NAME}"
|
||||||
LangString var2 ${LANG_CROATIAN} "languagues files"
|
LangString var1 ${LANG_CROATIAN} "Elementi službene zbirke"
|
||||||
LangString var3 ${LANG_CROATIAN} "Examples of cartridges"
|
LangString var2 ${LANG_CROATIAN} "Jezične datoteke"
|
||||||
LangString var4 ${LANG_CROATIAN} "Examples of diagrams"
|
LangString var3 ${LANG_CROATIAN} "Primjeri zaglavlja"
|
||||||
|
LangString var4 ${LANG_CROATIAN} "Primjeri shema"
|
||||||
|
LangString var5 ${LANG_CROATIAN} "Fontovi"
|
||||||
|
LangString uninstFailed ${LANG_CROATIAN} "Deinstalacija prethodne verzije nije uspjela.$\nMolimo deinstalirajte ${SOFT_NAME} ručno prije nastavka."
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_DUTCH} "${SOFT_NAME} is al geinstalleerd. $\n$\nklik `OK` om vorige versie te verwijderen of `annuleer` om deze upgrade te annuleren."
|
LangString installed ${LANG_DUTCH} "${SOFT_NAME} is al geinstalleerd. $\n$\nklik `OK` om vorige versie te verwijderen of `annuleer` om deze upgrade te annuleren."
|
||||||
@@ -304,34 +346,16 @@
|
|||||||
LangString Refrigeration ${LANG_DUTCH} "Koelinstallaties"
|
LangString Refrigeration ${LANG_DUTCH} "Koelinstallaties"
|
||||||
LangString Solar_thermal ${LANG_DUTCH} "Zonne_warmte"
|
LangString Solar_thermal ${LANG_DUTCH} "Zonne_warmte"
|
||||||
LangString Lang ${LANG_DUTCH} "Taal"
|
LangString Lang ${LANG_DUTCH} "Taal"
|
||||||
|
LangString Fonts ${LANG_DUTCH} "Lettertypen"
|
||||||
LangString Titleblocks ${LANG_DUTCH} "Titelblok"
|
LangString Titleblocks ${LANG_DUTCH} "Titelblok"
|
||||||
LangString Examples ${LANG_DUTCH} "Voorbeelden"
|
LangString Examples ${LANG_DUTCH} "Voorbeelden"
|
||||||
LangString Check ${LANG_DUTCH} "Check to start ${SOFT_NAME}"
|
LangString Check ${LANG_DUTCH} "Aanvinken om ${SOFT_NAME} te starten"
|
||||||
LangString Check ${LANG_DUTCH} "Check to start ${SOFT_NAME}"
|
LangString var1 ${LANG_DUTCH} "Elementen van de officiële verzameling"
|
||||||
LangString var1 ${LANG_DUTCH} "Elements of the official collection"
|
LangString var2 ${LANG_DUTCH} "Taalbestanden"
|
||||||
LangString var2 ${LANG_DUTCH} "languagues files"
|
LangString var3 ${LANG_DUTCH} "Voorbeelden van titelblokken"
|
||||||
LangString var3 ${LANG_DUTCH} "Examples of cartridges"
|
LangString var4 ${LANG_DUTCH} "Voorbeelden van schema's"
|
||||||
LangString var4 ${LANG_DUTCH} "Examples of diagrams"
|
LangString var5 ${LANG_DUTCH} "Lettertypen"
|
||||||
|
LangString uninstFailed ${LANG_DUTCH} "Het verwijderen van de vorige versie is mislukt.$\nVerwijder ${SOFT_NAME} handmatig voordat u verdergaat."
|
||||||
LangString installed ${LANG_DUTCH_BELGIUM} "${SOFT_NAME} is reeds geinstallerd. $\n$\nKlik`OK` om vorige versie te verwijderen of `Afbreken` om de upgrade niet uit te voeren."
|
|
||||||
LangString wrongArch ${LANG_DUTCH_BELGIUM} "Deze distributie werkt enkel op 64 bits computers."
|
|
||||||
LangString Elements ${LANG_DUTCH_BELGIUM} "Elementen"
|
|
||||||
LangString Electric ${LANG_DUTCH_BELGIUM} "Electrisch"
|
|
||||||
LangString Logic ${LANG_DUTCH_BELGIUM} "Logica"
|
|
||||||
LangString Hydraulic ${LANG_DUTCH_BELGIUM} "Hydraulisch"
|
|
||||||
LangString Pneumatic ${LANG_DUTCH_BELGIUM} "Pneumatisch"
|
|
||||||
LangString Energy ${LANG_DUTCH_BELGIUM} "Energie"
|
|
||||||
LangString water ${LANG_DUTCH_BELGIUM} "Water"
|
|
||||||
LangString Refrigeration ${LANG_DUTCH_BELGIUM} "Klimatisatie"
|
|
||||||
LangString Solar_thermal ${LANG_DUTCH_BELGIUM} "Termisch & zonlicht"
|
|
||||||
LangString Lang ${LANG_DUTCH_BELGIUM} "Taal"
|
|
||||||
LangString Titleblocks ${LANG_DUTCH_BELGIUM} "Titelhoek"
|
|
||||||
LangString Examples ${LANG_DUTCH_BELGIUM} "Voorbeelden"
|
|
||||||
LangString Check ${LANG_DUTCH_BELGIUM} "Controleer om te beginnen ${SOFT_NAME}"
|
|
||||||
LangString var1 ${LANG_DUTCH_BELGIUM} "Symbolen van de officielen verzameling"
|
|
||||||
LangString var2 ${LANG_DUTCH_BELGIUM} "taal bestanden"
|
|
||||||
LangString var3 ${LANG_DUTCH_BELGIUM} "Voorbeel titelhoeken"
|
|
||||||
LangString var4 ${LANG_DUTCH_BELGIUM} "Voorbeeld schema's"
|
|
||||||
|
|
||||||
|
|
||||||
LangString installed ${LANG_DANISH} "${SOFT_NAME} er allerede installeret. $\n$\nKlik `Ok` for at fjerne foregående version eller `Annuller` for at annullere opgraderingen."
|
LangString installed ${LANG_DANISH} "${SOFT_NAME} er allerede installeret. $\n$\nKlik `Ok` for at fjerne foregående version eller `Annuller` for at annullere opgraderingen."
|
||||||
@@ -346,6 +370,7 @@
|
|||||||
LangString Refrigeration ${LANG_DANISH} "Køle teknik"
|
LangString Refrigeration ${LANG_DANISH} "Køle teknik"
|
||||||
LangString Solar_thermal ${LANG_DANISH} "Sol & varme teknik"
|
LangString Solar_thermal ${LANG_DANISH} "Sol & varme teknik"
|
||||||
LangString Lang ${LANG_DANISH} "Sprog"
|
LangString Lang ${LANG_DANISH} "Sprog"
|
||||||
|
LangString Fonts ${LANG_DANISH} "Skrifttyper"
|
||||||
LangString Titleblocks ${LANG_DANISH} "Titel blokke"
|
LangString Titleblocks ${LANG_DANISH} "Titel blokke"
|
||||||
LangString Examples ${LANG_DANISH} "Eksempler"
|
LangString Examples ${LANG_DANISH} "Eksempler"
|
||||||
LangString Check ${LANG_DANISH} "Vælg for at starte ${SOFT_NAME}"
|
LangString Check ${LANG_DANISH} "Vælg for at starte ${SOFT_NAME}"
|
||||||
@@ -353,5 +378,8 @@
|
|||||||
LangString var2 ${LANG_DANISH} "Sprog filer"
|
LangString var2 ${LANG_DANISH} "Sprog filer"
|
||||||
LangString var3 ${LANG_DANISH} "Titel blokke eksempler"
|
LangString var3 ${LANG_DANISH} "Titel blokke eksempler"
|
||||||
LangString var4 ${LANG_DANISH} "Diagram eksempler"
|
LangString var4 ${LANG_DANISH} "Diagram eksempler"
|
||||||
|
LangString var5 ${LANG_DANISH} "Skrifttyper"
|
||||||
|
LangString uninstFailed ${LANG_DANISH} "Afinstallation af den tidligere version mislykkedes.$\nAfinstaller venligst ${SOFT_NAME} manuelt, inden du fortsætter."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
LangString wrongArch ${LANG_FRENCH} "Ce programme est pour Windows 64 bits seulement."
|
LangString wrongArch ${LANG_FRENCH} "Ce programme est pour Windows 64 bits seulement."
|
||||||
LangString installed ${LANG_FRENCH} "${SOFT_NAME} est déja installé. $\n$\nCliquer sur `OK` pour désinstaller l'ancienne version `Annuler` pour annuler cet upgrade."
|
LangString installed ${LANG_FRENCH} "${SOFT_NAME} est déja installé. $\n$\nCliquer sur `OK` pour désinstaller l'ancienne version `Annuler` pour annuler cet upgrade."
|
||||||
LangString Elements ${LANG_FRENCH} "Eléments"
|
LangString Elements ${LANG_FRENCH} "Eléments"
|
||||||
LangString Electric ${LANG_FRENCH} "Electrique"
|
LangString Electric ${LANG_FRENCH} "Electrique"
|
||||||
LangString Logic ${LANG_FRENCH} "Logique"
|
LangString Logic ${LANG_FRENCH} "Logique"
|
||||||
LangString Hydraulic ${LANG_FRENCH} "Hydraulique"
|
LangString Hydraulic ${LANG_FRENCH} "Hydraulique"
|
||||||
@@ -10,10 +10,13 @@
|
|||||||
LangString Refrigeration ${LANG_FRENCH} "Climatisation"
|
LangString Refrigeration ${LANG_FRENCH} "Climatisation"
|
||||||
LangString Solar_thermal ${LANG_FRENCH} "Thermique & solaire"
|
LangString Solar_thermal ${LANG_FRENCH} "Thermique & solaire"
|
||||||
LangString Lang ${LANG_FRENCH} "Langues"
|
LangString Lang ${LANG_FRENCH} "Langues"
|
||||||
|
LangString Fonts ${LANG_FRENCH} "Polices"
|
||||||
LangString Titleblocks ${LANG_FRENCH} "Cartouches"
|
LangString Titleblocks ${LANG_FRENCH} "Cartouches"
|
||||||
LangString Examples ${LANG_FRENCH} "Exemples"
|
LangString Examples ${LANG_FRENCH} "Exemples"
|
||||||
LangString Check ${LANG_FRENCH} "Cocher pour lancer ${SOFT_NAME}"
|
LangString Check ${LANG_FRENCH} "Cocher pour lancer ${SOFT_NAME}"
|
||||||
LangString var1 ${LANG_FRENCH} "Eléments de la collection officielle"
|
LangString var1 ${LANG_FRENCH} "Eléments de la collection officielle"
|
||||||
LangString var2 ${LANG_FRENCH} "Fichiers de langues"
|
LangString var2 ${LANG_FRENCH} "Fichiers de langues"
|
||||||
LangString var3 ${LANG_FRENCH} "Exemples de cartouches"
|
LangString var3 ${LANG_FRENCH} "Exemples de cartouches"
|
||||||
LangString var4 ${LANG_FRENCH} "Exemples de schémas"
|
LangString var4 ${LANG_FRENCH} "Exemples de schémas"
|
||||||
|
LangString var5 ${LANG_FRENCH} "Polices"
|
||||||
|
LangString uninstFailed ${LANG_FRENCH} "La désinstallation de la version précédente a échoué.$\nVeuillez désinstaller ${SOFT_NAME} manuellement avant de continuer."
|
||||||
|
|||||||
@@ -0,0 +1,335 @@
|
|||||||
|
; Missing language translations for QElectroTech installer
|
||||||
|
; Languages added: hu, ja, mn, nb, nl_BE, nl_NL, pt_BR, rs/sr, sk, sl, sv, tr, uk, zh
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Hungarian (LANG_HUNGARIAN)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_HUNGARIAN} "${SOFT_NAME} már telepítve van. $\n$\nKattintson az `OK` gombra az előző verzió eltávolításához, vagy a `Mégse` gombra a frissítés megszakításához."
|
||||||
|
LangString wrongArch ${LANG_HUNGARIAN} "Ez a terjesztés csak 64 bites számítógépekre való."
|
||||||
|
LangString Elements ${LANG_HUNGARIAN} "Elemek"
|
||||||
|
LangString Electric ${LANG_HUNGARIAN} "Elektromos"
|
||||||
|
LangString Logic ${LANG_HUNGARIAN} "Logika"
|
||||||
|
LangString Hydraulic ${LANG_HUNGARIAN} "Hidraulika"
|
||||||
|
LangString Pneumatic ${LANG_HUNGARIAN} "Pneumatika"
|
||||||
|
LangString Energy ${LANG_HUNGARIAN} "Energia"
|
||||||
|
LangString water ${LANG_HUNGARIAN} "Víz"
|
||||||
|
LangString Refrigeration ${LANG_HUNGARIAN} "Hűtés"
|
||||||
|
LangString Solar_thermal ${LANG_HUNGARIAN} "Nap_hőenergia"
|
||||||
|
LangString Lang ${LANG_HUNGARIAN} "Nyelv"
|
||||||
|
LangString Fonts ${LANG_HUNGARIAN} "Betűtípusok"
|
||||||
|
LangString Titleblocks ${LANG_HUNGARIAN} "Rajzfejlécek"
|
||||||
|
LangString Examples ${LANG_HUNGARIAN} "Példák"
|
||||||
|
LangString Check ${LANG_HUNGARIAN} "Jelölje be a ${SOFT_NAME} indításához"
|
||||||
|
LangString var1 ${LANG_HUNGARIAN} "A hivatalos gyűjtemény elemei"
|
||||||
|
LangString var2 ${LANG_HUNGARIAN} "Nyelvfájlok"
|
||||||
|
LangString var3 ${LANG_HUNGARIAN} "Rajzfejléc-példák"
|
||||||
|
LangString var4 ${LANG_HUNGARIAN} "Kapcsolási rajz példák"
|
||||||
|
LangString var5 ${LANG_HUNGARIAN} "Betűtípusok"
|
||||||
|
LangString uninstFailed ${LANG_HUNGARIAN} "Az előző verzió eltávolítása nem sikerült.$\nKérjük, távolítsa el manuálisan a ${SOFT_NAME} programot, mielőtt folytatná."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Japanese (LANG_JAPANESE)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_JAPANESE} "${SOFT_NAME} はすでにインストールされています。$\n$\n前のバージョンを削除するには `OK` をクリックし、このアップグレードをキャンセルするには `キャンセル` をクリックしてください。"
|
||||||
|
LangString wrongArch ${LANG_JAPANESE} "この配布パッケージは64ビットコンピュータ専用です。"
|
||||||
|
LangString Elements ${LANG_JAPANESE} "部品"
|
||||||
|
LangString Electric ${LANG_JAPANESE} "電気"
|
||||||
|
LangString Logic ${LANG_JAPANESE} "論理"
|
||||||
|
LangString Hydraulic ${LANG_JAPANESE} "油圧"
|
||||||
|
LangString Pneumatic ${LANG_JAPANESE} "空圧"
|
||||||
|
LangString Energy ${LANG_JAPANESE} "エネルギー"
|
||||||
|
LangString water ${LANG_JAPANESE} "水"
|
||||||
|
LangString Refrigeration ${LANG_JAPANESE} "冷凍"
|
||||||
|
LangString Solar_thermal ${LANG_JAPANESE} "太陽熱"
|
||||||
|
LangString Lang ${LANG_JAPANESE} "言語"
|
||||||
|
LangString Fonts ${LANG_JAPANESE} "フォント"
|
||||||
|
LangString Titleblocks ${LANG_JAPANESE} "表題欄"
|
||||||
|
LangString Examples ${LANG_JAPANESE} "例"
|
||||||
|
LangString Check ${LANG_JAPANESE} "${SOFT_NAME} を起動するにはチェックを入れてください"
|
||||||
|
LangString var1 ${LANG_JAPANESE} "公式コレクションの部品"
|
||||||
|
LangString var2 ${LANG_JAPANESE} "言語ファイル"
|
||||||
|
LangString var3 ${LANG_JAPANESE} "表題欄の例"
|
||||||
|
LangString var4 ${LANG_JAPANESE} "回路図の例"
|
||||||
|
LangString var5 ${LANG_JAPANESE} "フォント"
|
||||||
|
LangString uninstFailed ${LANG_JAPANESE} "前のバージョンのアンインストールに失敗しました。$\n続行する前に、${SOFT_NAME} を手動でアンインストールしてください。"
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Mongolian (LANG_MONGOLIAN)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_MONGOLIAN} "${SOFT_NAME} аль хэдийн суулгасан байна. $\n$\nӨмнөх хувилбарыг устгахын тулд `OK` дарна уу эсвэл энэ шинэчлэлтийг цуцлахын тулд `Цуцлах` дарна уу."
|
||||||
|
LangString wrongArch ${LANG_MONGOLIAN} "Энэ тарилга нь зөвхөн 64 битийн компьютерт зориулагдсан."
|
||||||
|
LangString Elements ${LANG_MONGOLIAN} "Элементүүд"
|
||||||
|
LangString Electric ${LANG_MONGOLIAN} "Цахилгаан"
|
||||||
|
LangString Logic ${LANG_MONGOLIAN} "Логик"
|
||||||
|
LangString Hydraulic ${LANG_MONGOLIAN} "Гидравлик"
|
||||||
|
LangString Pneumatic ${LANG_MONGOLIAN} "Пневматик"
|
||||||
|
LangString Energy ${LANG_MONGOLIAN} "Эрчим хүч"
|
||||||
|
LangString water ${LANG_MONGOLIAN} "Ус"
|
||||||
|
LangString Refrigeration ${LANG_MONGOLIAN} "Хөргөлт"
|
||||||
|
LangString Solar_thermal ${LANG_MONGOLIAN} "Нарны_дулаан"
|
||||||
|
LangString Lang ${LANG_MONGOLIAN} "Хэл"
|
||||||
|
LangString Fonts ${LANG_MONGOLIAN} "Фонт"
|
||||||
|
LangString Titleblocks ${LANG_MONGOLIAN} "Гарчгийн блокууд"
|
||||||
|
LangString Examples ${LANG_MONGOLIAN} "Жишээнүүд"
|
||||||
|
LangString Check ${LANG_MONGOLIAN} "${SOFT_NAME} эхлүүлэхийн тулд тэмдэглэнэ үү"
|
||||||
|
LangString var1 ${LANG_MONGOLIAN} "Албан ёсны цуглуулгын элементүүд"
|
||||||
|
LangString var2 ${LANG_MONGOLIAN} "Хэлний файлууд"
|
||||||
|
LangString var3 ${LANG_MONGOLIAN} "Гарчгийн блокын жишээнүүд"
|
||||||
|
LangString var4 ${LANG_MONGOLIAN} "Схемийн жишээнүүд"
|
||||||
|
LangString var5 ${LANG_MONGOLIAN} "Фонт"
|
||||||
|
LangString uninstFailed ${LANG_MONGOLIAN} "Өмнөх хувилбарыг устгаж чадсангүй.$\nҮргэлжлүүлэхийн өмнө ${SOFT_NAME}-г гараар устгана уу."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Norwegian Bokmål (LANG_NORWEGIAN)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_NORWEGIAN} "${SOFT_NAME} er allerede installert. $\n$\nKlikk `OK` for å fjerne forrige versjon, eller `Avbryt` for å avbryte denne oppgraderingen."
|
||||||
|
LangString wrongArch ${LANG_NORWEGIAN} "Denne distribusjonen er kun for 64-biters datamaskiner."
|
||||||
|
LangString Elements ${LANG_NORWEGIAN} "Elementer"
|
||||||
|
LangString Electric ${LANG_NORWEGIAN} "Elektrisk"
|
||||||
|
LangString Logic ${LANG_NORWEGIAN} "Logikk"
|
||||||
|
LangString Hydraulic ${LANG_NORWEGIAN} "Hydraulikk"
|
||||||
|
LangString Pneumatic ${LANG_NORWEGIAN} "Pneumatikk"
|
||||||
|
LangString Energy ${LANG_NORWEGIAN} "Energi"
|
||||||
|
LangString water ${LANG_NORWEGIAN} "Vann"
|
||||||
|
LangString Refrigeration ${LANG_NORWEGIAN} "Kjøling"
|
||||||
|
LangString Solar_thermal ${LANG_NORWEGIAN} "Solvarme"
|
||||||
|
LangString Lang ${LANG_NORWEGIAN} "Språk"
|
||||||
|
LangString Fonts ${LANG_NORWEGIAN} "Skrifttyper"
|
||||||
|
LangString Titleblocks ${LANG_NORWEGIAN} "Titelblokker"
|
||||||
|
LangString Examples ${LANG_NORWEGIAN} "Eksempler"
|
||||||
|
LangString Check ${LANG_NORWEGIAN} "Kryss av for å starte ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_NORWEGIAN} "Elementer fra den offisielle samlingen"
|
||||||
|
LangString var2 ${LANG_NORWEGIAN} "Språkfiler"
|
||||||
|
LangString var3 ${LANG_NORWEGIAN} "Eksempler på titelblokker"
|
||||||
|
LangString var4 ${LANG_NORWEGIAN} "Eksempler på skjemaer"
|
||||||
|
LangString var5 ${LANG_NORWEGIAN} "Skrifttyper"
|
||||||
|
LangString uninstFailed ${LANG_NORWEGIAN} "Avinstallasjon av forrige versjon mislyktes.$\nVennligst avinstaller ${SOFT_NAME} manuelt før du fortsetter."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Dutch Belgium (LANG_DUTCH / nl_BE — same LANG_DUTCH constant, Belgian variant)
|
||||||
|
; Note: NSIS uses a single LANG_DUTCH constant for both nl_BE and nl_NL.
|
||||||
|
; If your build distinguishes them via a custom constant, replace accordingly.
|
||||||
|
; The block below is already covered by LANG_DUTCH in lang_extra.nsh.
|
||||||
|
; Included here for completeness / override if needed.
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; (nl_BE uses the same LANG_DUTCH strings already defined in lang_extra.nsh)
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Portuguese Brazil (LANG_PORTUGUESEBR)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_PORTUGUESEBR} "${SOFT_NAME} já está instalado. $\n$\nClique em `OK` para remover a versão anterior ou em `Cancelar` para cancelar esta atualização."
|
||||||
|
LangString wrongArch ${LANG_PORTUGUESEBR} "Esta distribuição é apenas para computadores de 64 bits."
|
||||||
|
LangString Elements ${LANG_PORTUGUESEBR} "Elementos"
|
||||||
|
LangString Electric ${LANG_PORTUGUESEBR} "Elétrico"
|
||||||
|
LangString Logic ${LANG_PORTUGUESEBR} "Lógica"
|
||||||
|
LangString Hydraulic ${LANG_PORTUGUESEBR} "Hidráulica"
|
||||||
|
LangString Pneumatic ${LANG_PORTUGUESEBR} "Pneumática"
|
||||||
|
LangString Energy ${LANG_PORTUGUESEBR} "Energia"
|
||||||
|
LangString water ${LANG_PORTUGUESEBR} "Água"
|
||||||
|
LangString Refrigeration ${LANG_PORTUGUESEBR} "Refrigeração"
|
||||||
|
LangString Solar_thermal ${LANG_PORTUGUESEBR} "Solar_térmico"
|
||||||
|
LangString Lang ${LANG_PORTUGUESEBR} "Idioma"
|
||||||
|
LangString Fonts ${LANG_PORTUGUESEBR} "Fontes"
|
||||||
|
LangString Titleblocks ${LANG_PORTUGUESEBR} "Legendas"
|
||||||
|
LangString Examples ${LANG_PORTUGUESEBR} "Exemplos"
|
||||||
|
LangString Check ${LANG_PORTUGUESEBR} "Marcar para iniciar ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_PORTUGUESEBR} "Elementos da coleção oficial"
|
||||||
|
LangString var2 ${LANG_PORTUGUESEBR} "Arquivos de idioma"
|
||||||
|
LangString var3 ${LANG_PORTUGUESEBR} "Exemplos de legendas"
|
||||||
|
LangString var4 ${LANG_PORTUGUESEBR} "Exemplos de esquemas"
|
||||||
|
LangString var5 ${LANG_PORTUGUESEBR} "Fontes"
|
||||||
|
LangString uninstFailed ${LANG_PORTUGUESEBR} "A desinstalação da versão anterior falhou.$\nPor favor, desinstale ${SOFT_NAME} manualmente antes de continuar."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Serbian (LANG_SERBIAN) — covers rs/sr
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_SERBIAN} "${SOFT_NAME} је већ инсталиран. $\n$\nКликните `OK` да уклоните претходну верзију или `Откажи` да откажете надоградњу."
|
||||||
|
LangString wrongArch ${LANG_SERBIAN} "Ова дистрибуција је намењена само за 64-битна рачунала."
|
||||||
|
LangString Elements ${LANG_SERBIAN} "Елементи"
|
||||||
|
LangString Electric ${LANG_SERBIAN} "Електрика"
|
||||||
|
LangString Logic ${LANG_SERBIAN} "Логика"
|
||||||
|
LangString Hydraulic ${LANG_SERBIAN} "Хидраулика"
|
||||||
|
LangString Pneumatic ${LANG_SERBIAN} "Пнеуматика"
|
||||||
|
LangString Energy ${LANG_SERBIAN} "Енергија"
|
||||||
|
LangString water ${LANG_SERBIAN} "Вода"
|
||||||
|
LangString Refrigeration ${LANG_SERBIAN} "Хлађење"
|
||||||
|
LangString Solar_thermal ${LANG_SERBIAN} "Соларно_топлотно"
|
||||||
|
LangString Lang ${LANG_SERBIAN} "Језик"
|
||||||
|
LangString Fonts ${LANG_SERBIAN} "Фонтови"
|
||||||
|
LangString Titleblocks ${LANG_SERBIAN} "Заглавља"
|
||||||
|
LangString Examples ${LANG_SERBIAN} "Примери"
|
||||||
|
LangString Check ${LANG_SERBIAN} "Означите за покретање ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_SERBIAN} "Елементи службене збирке"
|
||||||
|
LangString var2 ${LANG_SERBIAN} "Језичке датотеке"
|
||||||
|
LangString var3 ${LANG_SERBIAN} "Примери заглавља"
|
||||||
|
LangString var4 ${LANG_SERBIAN} "Примери шема"
|
||||||
|
LangString var5 ${LANG_SERBIAN} "Фонтови"
|
||||||
|
LangString uninstFailed ${LANG_SERBIAN} "Деинсталација претходне верзије није успела.$\nМолимо деинсталирајте ${SOFT_NAME} ручно пре наставка."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Slovak (LANG_SLOVAK)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_SLOVAK} "${SOFT_NAME} je už nainštalovaný. $\n$\nKliknutím na `OK` odstráňte predchádzajúcu verziu alebo kliknite na `Zrušiť` pre zrušenie tohto upgradu."
|
||||||
|
LangString wrongArch ${LANG_SLOVAK} "Táto distribúcia je určená len pre 64-bitové počítače."
|
||||||
|
LangString Elements ${LANG_SLOVAK} "Prvky"
|
||||||
|
LangString Electric ${LANG_SLOVAK} "Elektrika"
|
||||||
|
LangString Logic ${LANG_SLOVAK} "Logika"
|
||||||
|
LangString Hydraulic ${LANG_SLOVAK} "Hydraulika"
|
||||||
|
LangString Pneumatic ${LANG_SLOVAK} "Pneumatika"
|
||||||
|
LangString Energy ${LANG_SLOVAK} "Energia"
|
||||||
|
LangString water ${LANG_SLOVAK} "Voda"
|
||||||
|
LangString Refrigeration ${LANG_SLOVAK} "Chladenie"
|
||||||
|
LangString Solar_thermal ${LANG_SLOVAK} "Solarne_teplo"
|
||||||
|
LangString Lang ${LANG_SLOVAK} "Jazyk"
|
||||||
|
LangString Fonts ${LANG_SLOVAK} "Písma"
|
||||||
|
LangString Titleblocks ${LANG_SLOVAK} "Popisové polia"
|
||||||
|
LangString Examples ${LANG_SLOVAK} "Príklady"
|
||||||
|
LangString Check ${LANG_SLOVAK} "Začiarknite pre spustenie ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_SLOVAK} "Prvky oficiálnej zbierky"
|
||||||
|
LangString var2 ${LANG_SLOVAK} "Jazykové súbory"
|
||||||
|
LangString var3 ${LANG_SLOVAK} "Príklady popisových polí"
|
||||||
|
LangString var4 ${LANG_SLOVAK} "Príklady schém"
|
||||||
|
LangString var5 ${LANG_SLOVAK} "Písma"
|
||||||
|
LangString uninstFailed ${LANG_SLOVAK} "Odinštalovanie predchádzajúcej verzie zlyhalo.$\nPred pokračovaním odinštalujte ${SOFT_NAME} ručne."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Slovenian (LANG_SLOVENIAN)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_SLOVENIAN} "${SOFT_NAME} je že nameščen. $\n$\nKliknite `OK` za odstranitev prejšnje različice ali `Prekliči` za preklic te nadgradnje."
|
||||||
|
LangString wrongArch ${LANG_SLOVENIAN} "Ta distribucija je namenjena samo za 64-bitne računalnike."
|
||||||
|
LangString Elements ${LANG_SLOVENIAN} "Elementi"
|
||||||
|
LangString Electric ${LANG_SLOVENIAN} "Elektrika"
|
||||||
|
LangString Logic ${LANG_SLOVENIAN} "Logika"
|
||||||
|
LangString Hydraulic ${LANG_SLOVENIAN} "Hidravlika"
|
||||||
|
LangString Pneumatic ${LANG_SLOVENIAN} "Pnevmatika"
|
||||||
|
LangString Energy ${LANG_SLOVENIAN} "Energija"
|
||||||
|
LangString water ${LANG_SLOVENIAN} "Voda"
|
||||||
|
LangString Refrigeration ${LANG_SLOVENIAN} "Hlajenje"
|
||||||
|
LangString Solar_thermal ${LANG_SLOVENIAN} "Solarno_toplotno"
|
||||||
|
LangString Lang ${LANG_SLOVENIAN} "Jezik"
|
||||||
|
LangString Fonts ${LANG_SLOVENIAN} "Pisave"
|
||||||
|
LangString Titleblocks ${LANG_SLOVENIAN} "Glave risb"
|
||||||
|
LangString Examples ${LANG_SLOVENIAN} "Primeri"
|
||||||
|
LangString Check ${LANG_SLOVENIAN} "Označite za zagon ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_SLOVENIAN} "Elementi uradne zbirke"
|
||||||
|
LangString var2 ${LANG_SLOVENIAN} "Jezikovne datoteke"
|
||||||
|
LangString var3 ${LANG_SLOVENIAN} "Primeri glav risb"
|
||||||
|
LangString var4 ${LANG_SLOVENIAN} "Primeri shem"
|
||||||
|
LangString var5 ${LANG_SLOVENIAN} "Pisave"
|
||||||
|
LangString uninstFailed ${LANG_SLOVENIAN} "Odstranitev prejšnje različice ni uspela.$\nPred nadaljevanjem ročno odstranite ${SOFT_NAME}."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Swedish (LANG_SWEDISH)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_SWEDISH} "${SOFT_NAME} är redan installerat. $\n$\nKlicka på `OK` för att ta bort den tidigare versionen eller `Avbryt` för att avbryta uppgraderingen."
|
||||||
|
LangString wrongArch ${LANG_SWEDISH} "Den här distributionen är endast för 64-bitars datorer."
|
||||||
|
LangString Elements ${LANG_SWEDISH} "Element"
|
||||||
|
LangString Electric ${LANG_SWEDISH} "Elektrisk"
|
||||||
|
LangString Logic ${LANG_SWEDISH} "Logik"
|
||||||
|
LangString Hydraulic ${LANG_SWEDISH} "Hydraulik"
|
||||||
|
LangString Pneumatic ${LANG_SWEDISH} "Pneumatik"
|
||||||
|
LangString Energy ${LANG_SWEDISH} "Energi"
|
||||||
|
LangString water ${LANG_SWEDISH} "Vatten"
|
||||||
|
LangString Refrigeration ${LANG_SWEDISH} "Kylning"
|
||||||
|
LangString Solar_thermal ${LANG_SWEDISH} "Solvarme"
|
||||||
|
LangString Lang ${LANG_SWEDISH} "Språk"
|
||||||
|
LangString Fonts ${LANG_SWEDISH} "Teckensnitt"
|
||||||
|
LangString Titleblocks ${LANG_SWEDISH} "Ritningshuvuden"
|
||||||
|
LangString Examples ${LANG_SWEDISH} "Exempel"
|
||||||
|
LangString Check ${LANG_SWEDISH} "Markera för att starta ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_SWEDISH} "Element från den officiella samlingen"
|
||||||
|
LangString var2 ${LANG_SWEDISH} "Språkfiler"
|
||||||
|
LangString var3 ${LANG_SWEDISH} "Exempel på ritningshuvuden"
|
||||||
|
LangString var4 ${LANG_SWEDISH} "Exempel på scheman"
|
||||||
|
LangString var5 ${LANG_SWEDISH} "Teckensnitt"
|
||||||
|
LangString uninstFailed ${LANG_SWEDISH} "Avinstallationen av den föregående versionen misslyckades.$\nAvinstallera ${SOFT_NAME} manuellt innan du fortsätter."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Turkish (LANG_TURKISH)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_TURKISH} "${SOFT_NAME} zaten yüklü. $\n$\nÖnceki sürümü kaldırmak için `Tamam`'a, bu yükseltmeyi iptal etmek için `İptal`'e tıklayın."
|
||||||
|
LangString wrongArch ${LANG_TURKISH} "Bu dağıtım yalnızca 64 bit bilgisayarlar içindir."
|
||||||
|
LangString Elements ${LANG_TURKISH} "Elemanlar"
|
||||||
|
LangString Electric ${LANG_TURKISH} "Elektrik"
|
||||||
|
LangString Logic ${LANG_TURKISH} "Mantık"
|
||||||
|
LangString Hydraulic ${LANG_TURKISH} "Hidrolik"
|
||||||
|
LangString Pneumatic ${LANG_TURKISH} "Pnömatik"
|
||||||
|
LangString Energy ${LANG_TURKISH} "Enerji"
|
||||||
|
LangString water ${LANG_TURKISH} "Su"
|
||||||
|
LangString Refrigeration ${LANG_TURKISH} "Soğutma"
|
||||||
|
LangString Solar_thermal ${LANG_TURKISH} "Gunes_Is"
|
||||||
|
LangString Lang ${LANG_TURKISH} "Dil"
|
||||||
|
LangString Fonts ${LANG_TURKISH} "Yazı Tipleri"
|
||||||
|
LangString Titleblocks ${LANG_TURKISH} "Başlık Bloğu"
|
||||||
|
LangString Examples ${LANG_TURKISH} "Örnekler"
|
||||||
|
LangString Check ${LANG_TURKISH} "${SOFT_NAME}'i başlatmak için işaretleyin"
|
||||||
|
LangString var1 ${LANG_TURKISH} "Resmi koleksiyonun elemanları"
|
||||||
|
LangString var2 ${LANG_TURKISH} "Dil dosyaları"
|
||||||
|
LangString var3 ${LANG_TURKISH} "Başlık bloğu örnekleri"
|
||||||
|
LangString var4 ${LANG_TURKISH} "Şema örnekleri"
|
||||||
|
LangString var5 ${LANG_TURKISH} "Yazı Tipleri"
|
||||||
|
LangString uninstFailed ${LANG_TURKISH} "Önceki sürümün kaldırılması başarısız oldu.$\nDevam etmeden önce lütfen ${SOFT_NAME}'i manuel olarak kaldırın."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Ukrainian (LANG_UKRAINIAN)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_UKRAINIAN} "${SOFT_NAME} вже встановлено. $\n$\nНатисніть `OK` для видалення попередньої версії або `Скасувати` для скасування оновлення."
|
||||||
|
LangString wrongArch ${LANG_UKRAINIAN} "Цей дистрибутив призначений лише для 64-розрядних комп'ютерів."
|
||||||
|
LangString Elements ${LANG_UKRAINIAN} "Елементи"
|
||||||
|
LangString Electric ${LANG_UKRAINIAN} "Електрика"
|
||||||
|
LangString Logic ${LANG_UKRAINIAN} "Логіка"
|
||||||
|
LangString Hydraulic ${LANG_UKRAINIAN} "Гідравліка"
|
||||||
|
LangString Pneumatic ${LANG_UKRAINIAN} "Пневматика"
|
||||||
|
LangString Energy ${LANG_UKRAINIAN} "Енергетика"
|
||||||
|
LangString water ${LANG_UKRAINIAN} "Водопостачання"
|
||||||
|
LangString Refrigeration ${LANG_UKRAINIAN} "Холодильна техніка"
|
||||||
|
LangString Solar_thermal ${LANG_UKRAINIAN} "Сонячно-теплова"
|
||||||
|
LangString Lang ${LANG_UKRAINIAN} "Мова"
|
||||||
|
LangString Fonts ${LANG_UKRAINIAN} "Шрифти"
|
||||||
|
LangString Titleblocks ${LANG_UKRAINIAN} "Штампи"
|
||||||
|
LangString Examples ${LANG_UKRAINIAN} "Приклади"
|
||||||
|
LangString Check ${LANG_UKRAINIAN} "Позначте для запуску ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_UKRAINIAN} "Елементи офіційної колекції"
|
||||||
|
LangString var2 ${LANG_UKRAINIAN} "Мовні файли"
|
||||||
|
LangString var3 ${LANG_UKRAINIAN} "Приклади штампів"
|
||||||
|
LangString var4 ${LANG_UKRAINIAN} "Приклади схем"
|
||||||
|
LangString var5 ${LANG_UKRAINIAN} "Шрифти"
|
||||||
|
LangString uninstFailed ${LANG_UKRAINIAN} "Видалення попередньої версії завершилося помилкою.$\nБудь ласка, видаліть ${SOFT_NAME} вручну перед продовженням."
|
||||||
|
|
||||||
|
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
; Chinese Simplified (LANG_SIMPCHINESE)
|
||||||
|
; ----------------------------------------------------------------
|
||||||
|
LangString installed ${LANG_SIMPCHINESE} "${SOFT_NAME} 已经安装。$\n$\n单击 $\"确定$\" 删除旧版本,或单击 $\"取消$\" 取消本次升级。"
|
||||||
|
LangString wrongArch ${LANG_SIMPCHINESE} "本安装包仅适用于 64 位计算机。"
|
||||||
|
LangString Elements ${LANG_SIMPCHINESE} "元件"
|
||||||
|
LangString Electric ${LANG_SIMPCHINESE} "电气"
|
||||||
|
LangString Logic ${LANG_SIMPCHINESE} "逻辑"
|
||||||
|
LangString Hydraulic ${LANG_SIMPCHINESE} "液压"
|
||||||
|
LangString Pneumatic ${LANG_SIMPCHINESE} "气动"
|
||||||
|
LangString Energy ${LANG_SIMPCHINESE} "能源"
|
||||||
|
LangString water ${LANG_SIMPCHINESE} "水"
|
||||||
|
LangString Refrigeration ${LANG_SIMPCHINESE} "制冷"
|
||||||
|
LangString Solar_thermal ${LANG_SIMPCHINESE} "太阳能热"
|
||||||
|
LangString Lang ${LANG_SIMPCHINESE} "语言"
|
||||||
|
LangString Fonts ${LANG_SIMPCHINESE} "字体"
|
||||||
|
LangString Titleblocks ${LANG_SIMPCHINESE} "标题栏"
|
||||||
|
LangString Examples ${LANG_SIMPCHINESE} "示例"
|
||||||
|
LangString Check ${LANG_SIMPCHINESE} "勾选以启动 ${SOFT_NAME}"
|
||||||
|
LangString var1 ${LANG_SIMPCHINESE} "官方库元件"
|
||||||
|
LangString var2 ${LANG_SIMPCHINESE} "语言文件"
|
||||||
|
LangString var3 ${LANG_SIMPCHINESE} "标题栏示例"
|
||||||
|
LangString var4 ${LANG_SIMPCHINESE} "图纸示例"
|
||||||
|
LangString var5 ${LANG_SIMPCHINESE} "字体"
|
||||||
|
LangString uninstFailed ${LANG_SIMPCHINESE} "卸载旧版本失败。$\n请在继续之前手动卸载 ${SOFT_NAME}。"
|
||||||
@@ -62,10 +62,15 @@ message("PROJECT_SOURCE_DIR :" ${PROJECT_SOURCE_DIR})
|
|||||||
message("QET_DIR :" ${QET_DIR})
|
message("QET_DIR :" ${QET_DIR})
|
||||||
message("GIT_COMMIT_SHA :" ${GIT_COMMIT_SHA})
|
message("GIT_COMMIT_SHA :" ${GIT_COMMIT_SHA})
|
||||||
|
|
||||||
if(BUILD_WITH_KF5)
|
if(BUILD_WITH_KF6 AND BUILD_KF6)
|
||||||
message("KF5_GIT_TAG :" ${KF5_GIT_TAG})
|
message("KF6_GIT_TAG :" ${KF6_GIT_TAG})
|
||||||
else()
|
endif()
|
||||||
add_definitions(-DBUILD_WITHOUT_KF5)
|
if(NOT BUILD_WITH_KF6)
|
||||||
|
add_definitions(-DBUILD_WITHOUT_KF6)
|
||||||
endif()
|
endif()
|
||||||
message("QET_COMPONENTS :" ${QET_COMPONENTS})
|
message("QET_COMPONENTS :" ${QET_COMPONENTS})
|
||||||
message("QT_VERSION_MAJOR :" ${QT_VERSION_MAJOR})
|
message("Qt version :" ${Qt6_VERSION})
|
||||||
|
|
||||||
|
if(QMFILES_AS_RESOURCE)
|
||||||
|
add_definitions(-DQMFILES_AS_RESOURCE)
|
||||||
|
endif()
|
||||||
|
|||||||
@@ -31,5 +31,8 @@ add_definitions(-DQT_MESSAGELOGCONTEXT)
|
|||||||
# In order to do so, uncomment the following line.
|
# In order to do so, uncomment the following line.
|
||||||
#add_definitions(-DTODO_LIST)
|
#add_definitions(-DTODO_LIST)
|
||||||
|
|
||||||
# Build with KF5
|
# Build with KF6
|
||||||
option(BUILD_WITH_KF5 "Build with KF5" ON)
|
option(BUILD_WITH_KF6 "Build with KF6" ON)
|
||||||
|
|
||||||
|
# Use translations as a Qt resource
|
||||||
|
option(QMFILES_AS_RESOURCE "Use .qm files as Qt resource" ON)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2006 The QElectroTech Team
|
# Copyright 2006-2026 The QElectroTech Team
|
||||||
# This file is part of QElectroTech.
|
# This file is part of QElectroTech.
|
||||||
#
|
#
|
||||||
# QElectroTech is free software: you can redistribute it and/or modify
|
# QElectroTech is free software: you can redistribute it and/or modify
|
||||||
@@ -14,54 +14,42 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
message(" - fetch_kdeaddons")
|
option(BUILD_KF6 "Build KF6 libraries, use system ones otherwise" OFF)
|
||||||
|
if(BUILD_KF6)
|
||||||
|
block(PROPAGATE KF6_GIT_TAG)
|
||||||
|
message(STATUS " - fetch_kdeaddons")
|
||||||
|
set(KDE_SKIP_TEST_SETTINGS ON)
|
||||||
|
set(KCOREADDONS_USE_QML OFF)
|
||||||
|
set(KWIDGETSADDONS_USE_QML OFF)
|
||||||
|
set(BUILD_TESTING OFF)
|
||||||
|
set(BUILD_DESIGNERPLUGIN OFF)
|
||||||
|
set(BUILD_QCH OFF)
|
||||||
|
set(BUILD_SHARED_LIBS OFF)
|
||||||
|
|
||||||
if(DEFINED BUILD_WITH_KF5)
|
Include(FetchContent)
|
||||||
Include(FetchContent)
|
|
||||||
|
|
||||||
option(BUILD_KF5 "Build KF5 libraries, use system ones otherwise" YES)
|
if(NOT DEFINED KF6_GIT_TAG)
|
||||||
|
set(KF6_GIT_TAG v6.22.0)
|
||||||
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()
|
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(
|
FetchContent_Declare(
|
||||||
kcoreaddons
|
kcoreaddons
|
||||||
GIT_REPOSITORY https://invent.kde.org/frameworks/kcoreaddons.git
|
GIT_REPOSITORY https://invent.kde.org/frameworks/kcoreaddons.git
|
||||||
GIT_TAG ${KF5_GIT_TAG})
|
GIT_TAG ${KF6_GIT_TAG})
|
||||||
FetchContent_MakeAvailable(kcoreaddons)
|
FetchContent_MakeAvailable(kcoreaddons)
|
||||||
|
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
kwidgetsaddons
|
kwidgetsaddons
|
||||||
GIT_REPOSITORY https://invent.kde.org/frameworks/kwidgetsaddons.git
|
GIT_REPOSITORY https://invent.kde.org/frameworks/kwidgetsaddons.git
|
||||||
GIT_TAG ${KF5_GIT_TAG})
|
GIT_TAG ${KF6_GIT_TAG})
|
||||||
FetchContent_MakeAvailable(kwidgetsaddons)
|
FetchContent_MakeAvailable(kwidgetsaddons)
|
||||||
else()
|
endblock()
|
||||||
find_package(KF5CoreAddons REQUIRED)
|
else()
|
||||||
find_package(KF5WidgetsAddons REQUIRED)
|
find_package(KF6CoreAddons REQUIRED)
|
||||||
endif()
|
find_package(KF6WidgetsAddons REQUIRED)
|
||||||
|
|
||||||
set(KF5_PRIVATE_LIBRARIES
|
|
||||||
KF5::WidgetsAddons
|
|
||||||
KF5::CoreAddons
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(KF6_PRIVATE_LIBRARIES
|
||||||
|
KF6::CoreAddons
|
||||||
|
KF6::WidgetsAddons
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2006 The QElectroTech Team
|
# Copyright 2006-2026 The QElectroTech Team
|
||||||
# This file is part of QElectroTech.
|
# This file is part of QElectroTech.
|
||||||
#
|
#
|
||||||
# QElectroTech is free software: you can redistribute it and/or modify
|
# QElectroTech is free software: you can redistribute it and/or modify
|
||||||
@@ -14,18 +14,14 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
# along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
message(" - fetch_pugixml")
|
option(BUILD_PUGIXML "Build pugixml library, use system one otherwise" OFF)
|
||||||
|
|
||||||
Include(FetchContent)
|
|
||||||
|
|
||||||
option(BUILD_PUGIXML "Build pugixml library, use system one otherwise" YES)
|
|
||||||
|
|
||||||
if(BUILD_PUGIXML)
|
if(BUILD_PUGIXML)
|
||||||
|
Include(FetchContent)
|
||||||
|
message(" - fetch pugixml")
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
pugixml
|
pugixml
|
||||||
GIT_REPOSITORY https://github.com/zeux/pugixml.git
|
GIT_REPOSITORY https://github.com/zeux/pugixml.git
|
||||||
GIT_TAG v1.11.4)
|
GIT_TAG v1.15)
|
||||||
|
|
||||||
FetchContent_MakeAvailable(pugixml)
|
FetchContent_MakeAvailable(pugixml)
|
||||||
else()
|
else()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2006 The QElectroTech Team
|
# Copyright 2006-2026 The QElectroTech Team
|
||||||
# This file is part of QElectroTech.
|
# This file is part of QElectroTech.
|
||||||
#
|
#
|
||||||
# QElectroTech is free software: you can redistribute it and/or modify
|
# QElectroTech is free software: you can redistribute it and/or modify
|
||||||
@@ -16,9 +16,6 @@
|
|||||||
|
|
||||||
message(" - fetch_singleapplication")
|
message(" - fetch_singleapplication")
|
||||||
|
|
||||||
# https://github.com/itay-grudev/SingleApplication/issues/18
|
|
||||||
#qmake
|
|
||||||
#DEFINES += QAPPLICATION_CLASS=QGuiApplication
|
|
||||||
set(QAPPLICATION_CLASS QApplication)
|
set(QAPPLICATION_CLASS QApplication)
|
||||||
|
|
||||||
Include(FetchContent)
|
Include(FetchContent)
|
||||||
@@ -26,6 +23,6 @@ Include(FetchContent)
|
|||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
SingleApplication
|
SingleApplication
|
||||||
GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication.git
|
GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication.git
|
||||||
GIT_TAG v3.2.0)
|
GIT_TAG v3.5.4)
|
||||||
|
|
||||||
FetchContent_MakeAvailable(SingleApplication)
|
FetchContent_MakeAvailable(SingleApplication)
|
||||||
|
|||||||
@@ -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()
|
|
||||||
@@ -17,6 +17,8 @@
|
|||||||
message(" - qet_compilation_vars")
|
message(" - qet_compilation_vars")
|
||||||
|
|
||||||
set(QET_COMPONENTS
|
set(QET_COMPONENTS
|
||||||
|
Core
|
||||||
|
Gui
|
||||||
LinguistTools
|
LinguistTools
|
||||||
PrintSupport
|
PrintSupport
|
||||||
Xml
|
Xml
|
||||||
@@ -88,6 +90,7 @@ set(QET_RES_FILES
|
|||||||
${QET_DIR}/sources/ui/dynamicelementtextitemeditor.ui
|
${QET_DIR}/sources/ui/dynamicelementtextitemeditor.ui
|
||||||
${QET_DIR}/sources/ui/elementinfopartwidget.ui
|
${QET_DIR}/sources/ui/elementinfopartwidget.ui
|
||||||
${QET_DIR}/sources/ui/elementinfowidget.ui
|
${QET_DIR}/sources/ui/elementinfowidget.ui
|
||||||
|
${QET_DIR}/sources/ui/terminalnumberingdialog.ui
|
||||||
${QET_DIR}/sources/ui/formulaassistantdialog.ui
|
${QET_DIR}/sources/ui/formulaassistantdialog.ui
|
||||||
${QET_DIR}/sources/ui/imagepropertieswidget.ui
|
${QET_DIR}/sources/ui/imagepropertieswidget.ui
|
||||||
${QET_DIR}/sources/ui/importelementdialog.ui
|
${QET_DIR}/sources/ui/importelementdialog.ui
|
||||||
@@ -109,9 +112,17 @@ set(QET_SRC_FILES
|
|||||||
${QET_DIR}/sources/borderproperties.h
|
${QET_DIR}/sources/borderproperties.h
|
||||||
${QET_DIR}/sources/bordertitleblock.cpp
|
${QET_DIR}/sources/bordertitleblock.cpp
|
||||||
${QET_DIR}/sources/bordertitleblock.h
|
${QET_DIR}/sources/bordertitleblock.h
|
||||||
|
# ${QET_DIR}/sources/colorbutton.cpp
|
||||||
|
# ${QET_DIR}/sources/colorbutton.h
|
||||||
|
# ${QET_DIR}/sources/colorcombobox.cpp
|
||||||
|
# ${QET_DIR}/sources/colorcombobox.h
|
||||||
|
# ${QET_DIR}/sources/colorcomboboxdelegate.cpp
|
||||||
|
# ${QET_DIR}/sources/colorcomboboxdelegate.h
|
||||||
${QET_DIR}/sources/conductorautonumerotation.cpp
|
${QET_DIR}/sources/conductorautonumerotation.cpp
|
||||||
${QET_DIR}/sources/conductorautonumerotation.h
|
${QET_DIR}/sources/conductorautonumerotation.h
|
||||||
${QET_DIR}/sources/conductornumexport.cpp
|
${QET_DIR}/sources/conductornumexport.cpp
|
||||||
|
${QET_DIR}/sources/wiringlistexport.h
|
||||||
|
${QET_DIR}/sources/wiringlistexport.cpp
|
||||||
${QET_DIR}/sources/conductornumexport.h
|
${QET_DIR}/sources/conductornumexport.h
|
||||||
${QET_DIR}/sources/conductorprofile.cpp
|
${QET_DIR}/sources/conductorprofile.cpp
|
||||||
${QET_DIR}/sources/conductorprofile.h
|
${QET_DIR}/sources/conductorprofile.h
|
||||||
@@ -251,6 +262,8 @@ set(QET_SRC_FILES
|
|||||||
${QET_DIR}/sources/diagramevent/diagrameventaddtext.h
|
${QET_DIR}/sources/diagramevent/diagrameventaddtext.h
|
||||||
${QET_DIR}/sources/diagramevent/diagrameventinterface.cpp
|
${QET_DIR}/sources/diagramevent/diagrameventinterface.cpp
|
||||||
${QET_DIR}/sources/diagramevent/diagrameventinterface.h
|
${QET_DIR}/sources/diagramevent/diagrameventinterface.h
|
||||||
|
${QET_DIR}/sources/diagramevent/diagrameventaddmacro.cpp
|
||||||
|
${QET_DIR}/sources/diagramevent/diagrameventaddmacro.h
|
||||||
|
|
||||||
${QET_DIR}/sources/dvevent/dveventinterface.cpp
|
${QET_DIR}/sources/dvevent/dveventinterface.cpp
|
||||||
${QET_DIR}/sources/dvevent/dveventinterface.h
|
${QET_DIR}/sources/dvevent/dveventinterface.h
|
||||||
@@ -413,10 +426,6 @@ set(QET_SRC_FILES
|
|||||||
${QET_DIR}/sources/PropertiesEditor/propertieseditorwidget.cpp
|
${QET_DIR}/sources/PropertiesEditor/propertieseditorwidget.cpp
|
||||||
${QET_DIR}/sources/PropertiesEditor/propertieseditorwidget.h
|
${QET_DIR}/sources/PropertiesEditor/propertieseditorwidget.h
|
||||||
|
|
||||||
${QET_DIR}/pugixml/src/pugiconfig.hpp
|
|
||||||
${QET_DIR}/pugixml/src/pugixml.cpp
|
|
||||||
${QET_DIR}/pugixml/src/pugixml.hpp
|
|
||||||
|
|
||||||
${QET_DIR}/sources/qetgraphicsitem/conductor.cpp
|
${QET_DIR}/sources/qetgraphicsitem/conductor.cpp
|
||||||
${QET_DIR}/sources/qetgraphicsitem/conductor.h
|
${QET_DIR}/sources/qetgraphicsitem/conductor.h
|
||||||
${QET_DIR}/sources/qetgraphicsitem/conductortextitem.cpp
|
${QET_DIR}/sources/qetgraphicsitem/conductortextitem.cpp
|
||||||
@@ -495,6 +504,9 @@ set(QET_SRC_FILES
|
|||||||
${QET_DIR}/sources/SearchAndReplace/ui/searchandreplacewidget.cpp
|
${QET_DIR}/sources/SearchAndReplace/ui/searchandreplacewidget.cpp
|
||||||
${QET_DIR}/sources/SearchAndReplace/ui/searchandreplacewidget.h
|
${QET_DIR}/sources/SearchAndReplace/ui/searchandreplacewidget.h
|
||||||
|
|
||||||
|
${QET_DIR}/sources/svg/qetsvg.cpp
|
||||||
|
${QET_DIR}/sources/svg/qetsvg.h
|
||||||
|
|
||||||
${QET_DIR}/sources/titleblock/dimension.cpp
|
${QET_DIR}/sources/titleblock/dimension.cpp
|
||||||
${QET_DIR}/sources/titleblock/dimension.h
|
${QET_DIR}/sources/titleblock/dimension.h
|
||||||
${QET_DIR}/sources/titleblock/dimensionwidget.cpp
|
${QET_DIR}/sources/titleblock/dimensionwidget.cpp
|
||||||
@@ -630,6 +642,8 @@ set(QET_SRC_FILES
|
|||||||
${QET_DIR}/sources/ui/elementinfopartwidget.h
|
${QET_DIR}/sources/ui/elementinfopartwidget.h
|
||||||
${QET_DIR}/sources/ui/elementinfowidget.cpp
|
${QET_DIR}/sources/ui/elementinfowidget.cpp
|
||||||
${QET_DIR}/sources/ui/elementinfowidget.h
|
${QET_DIR}/sources/ui/elementinfowidget.h
|
||||||
|
${QET_DIR}/sources/ui/terminalnumberingdialog.cpp
|
||||||
|
${QET_DIR}/sources/ui/terminalnumberingdialog.h
|
||||||
${QET_DIR}/sources/ui/elementpropertieswidget.cpp
|
${QET_DIR}/sources/ui/elementpropertieswidget.cpp
|
||||||
${QET_DIR}/sources/ui/elementpropertieswidget.h
|
${QET_DIR}/sources/ui/elementpropertieswidget.h
|
||||||
${QET_DIR}/sources/ui/formulaassistantdialog.cpp
|
${QET_DIR}/sources/ui/formulaassistantdialog.cpp
|
||||||
@@ -706,6 +720,8 @@ set(QET_SRC_FILES
|
|||||||
|
|
||||||
${QET_DIR}/sources/xml/terminalstripitemxml.cpp
|
${QET_DIR}/sources/xml/terminalstripitemxml.cpp
|
||||||
${QET_DIR}/sources/xml/terminalstripitemxml.h
|
${QET_DIR}/sources/xml/terminalstripitemxml.h
|
||||||
|
${QET_DIR}/sources/xml/terminalstriplayoutpatternxml.cpp
|
||||||
|
${QET_DIR}/sources/xml/terminalstriplayoutpatternxml.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(TS_FILES
|
set(TS_FILES
|
||||||
@@ -726,19 +742,17 @@ set(TS_FILES
|
|||||||
${QET_DIR}/lang/qet_mn.ts
|
${QET_DIR}/lang/qet_mn.ts
|
||||||
${QET_DIR}/lang/qet_nb.ts
|
${QET_DIR}/lang/qet_nb.ts
|
||||||
${QET_DIR}/lang/qet_nl.ts
|
${QET_DIR}/lang/qet_nl.ts
|
||||||
${QET_DIR}/lang/qet_nl_BE.ts
|
${QET_DIR}/lang/qet_nl_BE.ts
|
||||||
${QET_DIR}/lang/qet_no.ts
|
${QET_DIR}/lang/qet_no.ts
|
||||||
${QET_DIR}/lang/qet_pl.ts
|
${QET_DIR}/lang/qet_pl.ts
|
||||||
${QET_DIR}/lang/qet_pt.ts
|
${QET_DIR}/lang/qet_pt.ts
|
||||||
${QET_DIR}/lang/qet_pt_BR.ts
|
${QET_DIR}/lang/qet_pt_BR.ts
|
||||||
${QET_DIR}/lang/qet_ro.ts
|
${QET_DIR}/lang/qet_ro.ts
|
||||||
${QET_DIR}/lang/qet_rs.ts
|
|
||||||
${QET_DIR}/lang/qet_ru.ts
|
${QET_DIR}/lang/qet_ru.ts
|
||||||
${QET_DIR}/lang/qet_sk.ts
|
${QET_DIR}/lang/qet_sk.ts
|
||||||
${QET_DIR}/lang/qet_sl.ts
|
${QET_DIR}/lang/qet_sl.ts
|
||||||
${QET_DIR}/lang/qet_sr.ts
|
${QET_DIR}/lang/qet_sr.ts
|
||||||
${QET_DIR}/lang/qet_sv.ts
|
${QET_DIR}/lang/qet_sv.ts
|
||||||
${QET_DIR}/lang/qet_tr.ts
|
${QET_DIR}/lang/qet_tr.ts
|
||||||
${QET_DIR}/lang/qet_uk.ts
|
|
||||||
${QET_DIR}/lang/qet_zh.ts
|
${QET_DIR}/lang/qet_zh.ts
|
||||||
)
|
)
|
||||||
|
|||||||
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 49 KiB |
@@ -0,0 +1,101 @@
|
|||||||
|
Compiler QElectroTech sous microsoft Windows 10 et 11 avec MSYS2
|
||||||
|
================================
|
||||||
|
Ce document décrit les étapes nécessaire afin de compilé QElectroTech sous Windows avec Qt6 et cmake en utilisant MSYS2.
|
||||||
|
|
||||||
|
# MSYS2
|
||||||
|
L'ensemble des outils nécessaire au développement et à la compilation de QElectroTech sous Windows sera installé par l’intermédiaire de [MSYS2](https://www.msys2.org/). Cela comprend entre autre le framework [Qt6](https://www.qt.io/development/qt-framework/qt6), les outils cmake, les dépendances ([kde framework](https://develop.kde.org/docs/), [sqlite](https://sqlite.org/), [pugixml](https://pugixml.org/)), les outils de compilation [minGW](https://www.mingw-w64.org/)...
|
||||||
|
|
||||||
|
>Il sera nécessaire d'utiliser [winget](https://learn.microsoft.com/fr-fr/windows/package-manager/winget/), celui-ci est présent par défaut sous Windows 11, dans le cas de Windows 10, winget peut necessité d'être activé manuellement
|
||||||
|
|
||||||
|
# Installer GIT et MSYS2 avec winget
|
||||||
|
Avec power shell.
|
||||||
|
```
|
||||||
|
winget install Git.Git
|
||||||
|
```
|
||||||
|
puis
|
||||||
|
```
|
||||||
|
winget install MSYS2.MSYS2
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Mise à jour de MSYS2
|
||||||
|
Lors de la première utilisation de MSYS2 il est nécessaire de mettre celui-ci à jour.
|
||||||
|
|
||||||
|
Lancer "MSYS2 MSYS" depuis le menu démarré de Windows.
|
||||||
|
Une fenêtre avec un shell s'ouvre, dans celui-ci lancer la commande :
|
||||||
|
```
|
||||||
|
pacman -Syu
|
||||||
|
```
|
||||||
|
A la fin de la mise à jour MSYS2 MSYS se fermera automatiquement. Ouvrez le à nouveau et relancé la commande
|
||||||
|
```
|
||||||
|
pacman -Syu
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation des outils de devellopement
|
||||||
|
Toujours dans le shell MSYS2 MSYS lancer la commande suivante.
|
||||||
|
```
|
||||||
|
pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-qt6-svg mingw-w64-ucrt-x86_64-qt6-base mingw-w64-ucrt-x86_64-sqlite3 mingw-w64-ucrt-x86_64-pugixml mingw-w64-ucrt-x86_64-kcoreaddons mingw-w64-ucrt-x86_64-kwidgetsaddons mingw-w64-ucrt-x86_64-extra-cmake-modules mingw-w64-ucrt-x86_64-gdb mingw-w64-ucrt-x86_64-qt6-translations mingw-w64-ucrt-x86_64-qt6-tools
|
||||||
|
```
|
||||||
|
> La quantité de paquets à installer est conséquent, en fonction de votre connexion internet cela peut prendre plusieurs dizaine de minute
|
||||||
|
|
||||||
|
L'ensemble des outils est mantenant installé 😀
|
||||||
|
|
||||||
|
# Installer Qt creator
|
||||||
|
Télécharger [l'installateur online de Qt](https://www.qt.io/development/download-qt-installer-oss) et lancer l'installation en suivant les indications de ce dernier.
|
||||||
|
|
||||||
|
>Dans le cas où vous comptez utilisé Qt Creator uniquement pour développez QElectroTech, lors de l'installation choisissez l'option "installation personnalisée" puis dans la page suivante sélectionné uniquement Qt Creator.
|
||||||
|
|
||||||
|
## Configurer Qt creator
|
||||||
|
Ouvrir Qt creator puis rendez vous dans "édition -> préférence -> kit"
|
||||||
|
|
||||||
|
### Versions de Qt
|
||||||
|
|
||||||
|
- Cliquer sur _ajouter_
|
||||||
|
- Renseigner _Chemin de qmake_ (exemple C:\\msys64\\ucrt64\\bin\\qmake.exe).
|
||||||
|
- Dans le champ _Nom :_ ajouter (msys2).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Compilateurs
|
||||||
|
- Cliquer sur _ajouter_ puis choisir _MinGW_.
|
||||||
|
- Renseigner _Emplacement du compilateur C_ (exemple C:\\msys64\\ucrt64\\bin\\g++.exe).
|
||||||
|
- Dans le champ _Nom :_ ajouter (msys2).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Débogueurs
|
||||||
|
- Cliquer sur _ajouter_
|
||||||
|
- Renseigner _Chemin :_ (exemple C:\\msys64\\ucrt64\\bin\\gdb.exe).
|
||||||
|
- Dans le champ _Nom :_ ajouter (msys2).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### cmake
|
||||||
|
- Outils -> _Ajouter_
|
||||||
|
- Renseigner _Chemin :_ (exemple C:\\msys64\\ucrt64\\bin\\cmake.exe).
|
||||||
|
- Dans le champ _Nom :_ ajouter (msys2).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### KIT
|
||||||
|
Maintenant que tous les prérequis sont fait nous allons crée un kit utilisant les outils fournis par MSYS2. Cliquer sur _Ajouter_, un nouveau kit _manuel_ apparaît, nommer celui-ci par exemple _Qt6 msys2_ puis renseigner le compilateur, le débogueur, la version de Qt et Outils CMake en choisissant à chaque fois ceux que nous venons de créer.
|
||||||
|
puis cliquer sur _appliquer_.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bravo 🥳🥳 vous avez terminé l'installation de la totalité des outils de développement.
|
||||||
|
|
||||||
|
# Clonez le dépôts de QElectrotech
|
||||||
|
Clonez le dépôt de QElectroTech comme vous le faite habituellement, sinon utilisez les commandes suivante dans power shell.
|
||||||
|
|
||||||
|
Crée et/ou se rendre dans le dossier dans lequel vous voulez clonez le dépôt (dans l'exemple nous allons crée un dossier QElectroTech dans C:)
|
||||||
|
|
||||||
|
```
|
||||||
|
mkdir C:\QElectroTech
|
||||||
|
cd C:\QElectroTech
|
||||||
|
|
||||||
|
git clone --recursive https://github.com/qelectrotech/qelectrotech-source-mirror.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Une fois le dépôt cloné lancer Qt creator puis choisir d'ouvrir un projet existant, en choisissant le _CMakeLists.txt_ se trouvant à la racine du projet QElectroTech, enfin dans l'assistant de création de projet choisir comme kit le kit que nous avons créer précédemment.
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
Compiler QElectroTech sous microsoft Windows 10 et 11
|
||||||
|
================================
|
||||||
|
Compiler QElectroTech pour et/ou sous Windows peut être effectué avec plusieurs méthode différente.
|
||||||
|
Ce document énumère uniquement les différentes méthode possible
|
||||||
|
|
||||||
|
N'est mentionné que les étapes nécessaire afin de compilé QElectroTech sous Windows avec Qt6 et cmake. Ce document ne traite pas la compilation avec Qt5 et qmake.
|
||||||
|
|
||||||
|
>QElectroTech 0.100 est la dernière version à utiliser Qt5. Les version suivante sont développé avec Qt6 et utilise cmake au lieu de qmake.
|
||||||
|
|
||||||
|
Il existe deux méthodes pour cela :
|
||||||
|
|
||||||
|
1. [Utiliser msys2 (méthode recommandé)](fr_window_build_msys2.md)
|
||||||
|
2. Télécharger et compiler l'ensemble des dépendances (non rédigé)
|
||||||
@@ -7,7 +7,7 @@ Icon=qelectrotech
|
|||||||
Terminal=false
|
Terminal=false
|
||||||
Type=Application
|
Type=Application
|
||||||
MimeType=application/x-qet-project;application/x-qet-element;application/x-qet-titleblock;
|
MimeType=application/x-qet-project;application/x-qet-element;application/x-qet-titleblock;
|
||||||
Categories=Graphics;Qt;VectorGraphics;Science;Electricity;Engineering;
|
Categories=Graphics;
|
||||||
Keywords=Graphics;Science;Electricity;Engineering;
|
Keywords=Graphics;Science;Electricity;Engineering;
|
||||||
Comment=Edit electrical diagrams.
|
Comment=Edit electrical diagrams.
|
||||||
Comment[ar]=تحرير مخططات كهربائية
|
Comment[ar]=تحرير مخططات كهربائية
|
||||||
@@ -28,6 +28,17 @@ Comment[pl]=Edycja schematów elektrycznych
|
|||||||
Comment[pt]=Criar esquemas eléctricos.
|
Comment[pt]=Criar esquemas eléctricos.
|
||||||
Comment[ru]=Создание и редактирование электрических схем.
|
Comment[ru]=Создание и редактирование электрических схем.
|
||||||
Comment[sk]=Úprava elektrických schém.
|
Comment[sk]=Úprava elektrických schém.
|
||||||
|
Comment[hu]=Elektromos kapcsolási rajzok szerkesztése.
|
||||||
|
Comment[mn]=Цахилгааны схем засварлах.
|
||||||
|
Comment[nb]=Rediger elektriske diagrammer.
|
||||||
|
Comment[pt_BR]=Editar diagramas elétricos.
|
||||||
|
Comment[ro]=Editați diagrame electrice.
|
||||||
|
Comment[sl]=Uredite električne sheme.
|
||||||
|
Comment[sr]=Уређивање електричних дијаграма.
|
||||||
|
Comment[sv]=Redigera elektriska diagram.
|
||||||
|
Comment[tr]=Elektrik şemalarını düzenleyin.
|
||||||
|
Comment[uk]=Редагування електричних схем.
|
||||||
|
Comment[zh]=编辑电气图。
|
||||||
GenericName=Electrical diagram editor
|
GenericName=Electrical diagram editor
|
||||||
GenericName[ar]=مُحرّر مخططات كهربائية
|
GenericName[ar]=مُحرّر مخططات كهربائية
|
||||||
GenericName[be]=Elektrische schema editor
|
GenericName[be]=Elektrische schema editor
|
||||||
@@ -47,3 +58,14 @@ GenericName[pl]=Edytor schematów elektrycznych
|
|||||||
GenericName[pt]=Editor de esquemas eléctricos.
|
GenericName[pt]=Editor de esquemas eléctricos.
|
||||||
GenericName[ru]=Редактор электрических схем
|
GenericName[ru]=Редактор электрических схем
|
||||||
GenericName[sk]=Editor elektrických schém
|
GenericName[sk]=Editor elektrických schém
|
||||||
|
GenericName[hu]=Elektromos kapcsolási rajz szerkesztő
|
||||||
|
GenericName[mn]=Цахилгааны схемийн засварлагч
|
||||||
|
GenericName[nb]=Elektrisk diagram editor
|
||||||
|
GenericName[pt_BR]=Editor de diagramas elétricos
|
||||||
|
GenericName[ro]=Editor de diagrame electrice
|
||||||
|
GenericName[sl]=Urejevalnik električnih shem
|
||||||
|
GenericName[sr]=Уређивач електричних дијаграма
|
||||||
|
GenericName[sv]=Elektriskt diagramredigerare
|
||||||
|
GenericName[tr]=Elektrik şeması düzenleyici
|
||||||
|
GenericName[uk]=Редактор електричних схем
|
||||||
|
GenericName[zh]=电气图编辑器
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Copyright 2006-2026 The QElectroTech Team -->
|
<!-- Copyright 2006-2026 The QElectroTech Team -->
|
||||||
<application>
|
<component type="desktop-application">
|
||||||
<id type="desktop">qelectrotech.desktop</id>
|
<id>org.qelectrotech.QElectroTech</id>
|
||||||
|
<launchable type="desktop-id">org.qelectrotech.QElectroTech.desktop</launchable>
|
||||||
<metadata_license>MIT</metadata_license>
|
<metadata_license>MIT</metadata_license>
|
||||||
<project_license>GPL-2.0-or-later</project_license>
|
<project_license>GPL-2.0-or-later</project_license>
|
||||||
<name>QElectroTech</name>
|
<name>QElectroTech</name>
|
||||||
@@ -23,9 +24,22 @@
|
|||||||
<summary xml:lang="pl">Edytor schematów elektrycznych</summary>
|
<summary xml:lang="pl">Edytor schematów elektrycznych</summary>
|
||||||
<summary xml:lang="pt">Editor de esquemas eléctricos</summary>
|
<summary xml:lang="pt">Editor de esquemas eléctricos</summary>
|
||||||
<summary xml:lang="ru">Редактор электрических схем</summary>
|
<summary xml:lang="ru">Редактор электрических схем</summary>
|
||||||
|
<summary xml:lang="en">Electrical diagram editor</summary>
|
||||||
|
<summary xml:lang="hu">Elektromos kapcsolási rajz szerkesztő</summary>
|
||||||
|
<summary xml:lang="mn">Цахилгааны схемийн засварлагч</summary>
|
||||||
|
<summary xml:lang="nb">Elektrisk diagram editor</summary>
|
||||||
|
<summary xml:lang="pt_BR">Editor de diagramas elétricos</summary>
|
||||||
|
<summary xml:lang="ro">Editor de diagrame electrice</summary>
|
||||||
|
<summary xml:lang="sk">Editor elektrických schém</summary>
|
||||||
|
<summary xml:lang="sl">Urejevalnik električnih shem</summary>
|
||||||
|
<summary xml:lang="sr">Уређивач електричних дијаграма</summary>
|
||||||
|
<summary xml:lang="sv">Elektriskt diagramredigerare</summary>
|
||||||
|
<summary xml:lang="tr">Elektrik şeması düzenleyici</summary>
|
||||||
|
<summary xml:lang="uk">Редактор електричних схем</summary>
|
||||||
|
<summary xml:lang="zh">电气图编辑器</summary>
|
||||||
<content_rating type="oars-1.1"/>
|
<content_rating type="oars-1.1"/>
|
||||||
<releases>
|
<releases>
|
||||||
<release version="0.9-dev" date="2021-02-21"/>
|
<release version="0.100.1-dev" date="2026"/>
|
||||||
</releases>
|
</releases>
|
||||||
<description>
|
<description>
|
||||||
<p>
|
<p>
|
||||||
@@ -92,10 +106,73 @@
|
|||||||
QElectroTech - приложение написанное на Qt5 и предназначено для разработки электрических схем.
|
QElectroTech - приложение написанное на Qt5 и предназначено для разработки электрических схем.
|
||||||
Приложение использует для хранения проектов и библиотек элементов файлы в XML формате. Приложение помимо редактора электричесих схем, содержит также редакторы элементов и редактор шаблонов листов.
|
Приложение использует для хранения проектов и библиотек элементов файлы в XML формате. Приложение помимо редактора электричесих схем, содержит также редакторы элементов и редактор шаблонов листов.
|
||||||
</p>
|
</p>
|
||||||
|
<p xml:lang="hr">
|
||||||
|
QElectroTech je Qt5 aplikacija za projektiranje elektro shema.
|
||||||
|
Koristi XML datoteke za elemente i sheme, te uključuje uređivač shema, uređivač elemenata i uređivač zaglavlja.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="hu">
|
||||||
|
A QElectroTech egy Qt5 alapú alkalmazás elektromos kapcsolási rajzok tervezéséhez.
|
||||||
|
XML fájlokat használ az elemekhez és rajzokhoz, és tartalmaz egy rajzszerkesztőt, egy elemszerkesztőt és egy fejlécszerkesztőt.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="mn">
|
||||||
|
QElectroTech нь Qt5 дээр суурилсан цахилгааны схем зохиох програм юм.
|
||||||
|
Элемент болон схемүүдэд XML файл ашигладаг бөгөөд схем засварлагч, элемент засварлагч, гарчгийн блок засварлагчийг агуулдаг.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="nb">
|
||||||
|
QElectroTech er et Qt5-program for å lage elektriske skjemaer.
|
||||||
|
Det bruker XML-filer for elementer og skjemaer, og inkluderer en skjemaeditor, en elementeditor og en tittelblokkreditor.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="pt_BR">
|
||||||
|
QElectroTech é uma aplicação Qt5 para desenhar diagramas elétricos.
|
||||||
|
Utiliza arquivos XML para os elementos e diagramas, e inclui um editor de diagramas, um editor de elementos e um editor de cartuchos.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="ro">
|
||||||
|
QElectroTech este o aplicație Qt5 pentru proiectarea schemelor electrice.
|
||||||
|
Utilizează fișiere XML pentru elemente și scheme, și include un editor de scheme, un editor de elemente și un editor de cartușe.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="sk">
|
||||||
|
QElectroTech je Qt5 aplikácia na navrhovanie elektrických schém.
|
||||||
|
Pre prvky a schémy používa súbory XML a zahŕňa editor schém, editor prvkov a editor titulkových blokov.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="sl">
|
||||||
|
QElectroTech je aplikacija Qt5 za načrtovanje električnih shem.
|
||||||
|
Za elemente in sheme uporablja datoteke XML ter vključuje urejevalnik shem, urejevalnik elementov in urejevalnik naslovnih blokov.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="sr">
|
||||||
|
QElectroTech је Qt5 апликација за пројектовање електричних шема.
|
||||||
|
Користи XML датотеке за елементе и шеме, и укључује уређивач шема, уређивач елемената и уређивач заглавља.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="sv">
|
||||||
|
QElectroTech är ett Qt5-program för att rita elektriska schema.
|
||||||
|
Det använder XML-filer för element och schema, och inkluderar en schemaredigerare, en elementredigerare och en titelblocksredigerare.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="tr">
|
||||||
|
QElectroTech, elektrik şemaları tasarlamak için bir Qt5 uygulamasıdır.
|
||||||
|
Elemanlar ve şemalar için XML dosyaları kullanır; şema düzenleyicisi, eleman düzenleyicisi ve başlık bloğu düzenleyicisini içerir.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="uk">
|
||||||
|
QElectroTech — це Qt5 застосунок для проектування електричних схем.
|
||||||
|
Використовує XML-файли для елементів і схем, і включає редактор схем, редактор елементів та редактор основних написів.
|
||||||
|
</p>
|
||||||
|
<p xml:lang="zh">
|
||||||
|
QElectroTech 是一款基于 Qt5 的电气图设计应用程序。
|
||||||
|
它使用 XML 文件存储元件和图纸,包含图纸编辑器、元件编辑器和标题栏编辑器。
|
||||||
|
</p>
|
||||||
</description>
|
</description>
|
||||||
<url type="homepage">http://qelectrotech.org</url>
|
<url type="homepage">https://qelectrotech.org</url>
|
||||||
<screenshots>
|
<url type="bugtracker">https://qelectrotech.org/bugtracker</url>
|
||||||
<screenshot type="default">http://download.tuxfamily.org/qet/screens/qelectrotech5.png</screenshot>
|
<url type="vcs-browser">https://github.com/qelectrotech/qelectrotech-source-mirror</url>
|
||||||
</screenshots>
|
<developer id="org.qelectrotech">
|
||||||
<updatecontact>qet@lists.tuxfamily.org</updatecontact>
|
<name>QElectroTech</name>
|
||||||
</application>
|
</developer>
|
||||||
|
<screenshot type="default">
|
||||||
|
<image>https://qelectrotech.org/screenshots/qet_overview04.png</image>
|
||||||
|
</screenshot>
|
||||||
|
<screenshot>
|
||||||
|
<image>https://qelectrotech.org/screenshots/qet_overview06.png</image>
|
||||||
|
</screenshot>
|
||||||
|
<screenshot>
|
||||||
|
<image>https://qelectrotech.org/screenshots/qet_overview09.png</image>
|
||||||
|
</screenshot>
|
||||||
|
<update_contact>scorpio@qelectrotech.org</update_contact>
|
||||||
|
</component>
|
||||||
|
|||||||
@@ -19,6 +19,19 @@
|
|||||||
<comment xml:lang="pl">Plik projektu QElectrotech</comment>
|
<comment xml:lang="pl">Plik projektu QElectrotech</comment>
|
||||||
<comment xml:lang="pt">Ficheiro de projecto QElectroTech</comment>
|
<comment xml:lang="pt">Ficheiro de projecto QElectroTech</comment>
|
||||||
<comment xml:lang="ru">Файл проекта QElectroTech</comment>
|
<comment xml:lang="ru">Файл проекта QElectroTech</comment>
|
||||||
|
<comment xml:lang="hr">QElectroTech datoteka projekta</comment>
|
||||||
|
<comment xml:lang="hu">QElectroTech projektfájl</comment>
|
||||||
|
<comment xml:lang="mn">QElectroTech төслийн файл</comment>
|
||||||
|
<comment xml:lang="nb">QElectroTech prosjektfil</comment>
|
||||||
|
<comment xml:lang="pt_BR">Arquivo de projeto QElectroTech</comment>
|
||||||
|
<comment xml:lang="ro">Fișier proiect QElectroTech</comment>
|
||||||
|
<comment xml:lang="sk">Súbor projektu QElectroTech</comment>
|
||||||
|
<comment xml:lang="sl">Datoteka projekta QElectroTech</comment>
|
||||||
|
<comment xml:lang="sr">QElectroTech датотека пројекта</comment>
|
||||||
|
<comment xml:lang="sv">QElectroTech projektfil</comment>
|
||||||
|
<comment xml:lang="tr">QElectroTech proje dosyası</comment>
|
||||||
|
<comment xml:lang="uk">Файл проєкту QElectroTech</comment>
|
||||||
|
<comment xml:lang="zh">QElectroTech 项目文件</comment>
|
||||||
<glob pattern="*.qet" />
|
<glob pattern="*.qet" />
|
||||||
</mime-type>
|
</mime-type>
|
||||||
<mime-type type="application/x-qet-element">
|
<mime-type type="application/x-qet-element">
|
||||||
@@ -40,6 +53,19 @@
|
|||||||
<comment xml:lang="pl">Plik elementu QElectroTech</comment>
|
<comment xml:lang="pl">Plik elementu QElectroTech</comment>
|
||||||
<comment xml:lang="pt">Ficheiro de projecto QElectroTech</comment>
|
<comment xml:lang="pt">Ficheiro de projecto QElectroTech</comment>
|
||||||
<comment xml:lang="ru">Файл элемента QElectroTech</comment>
|
<comment xml:lang="ru">Файл элемента QElectroTech</comment>
|
||||||
|
<comment xml:lang="hr">QElectroTech datoteka elementa</comment>
|
||||||
|
<comment xml:lang="hu">QElectroTech elemfájl</comment>
|
||||||
|
<comment xml:lang="mn">QElectroTech элементийн файл</comment>
|
||||||
|
<comment xml:lang="nb">QElectroTech elementfil</comment>
|
||||||
|
<comment xml:lang="pt_BR">Arquivo de elemento QElectroTech</comment>
|
||||||
|
<comment xml:lang="ro">Fișier element QElectroTech</comment>
|
||||||
|
<comment xml:lang="sk">Súbor prvku QElectroTech</comment>
|
||||||
|
<comment xml:lang="sl">Datoteka elementa QElectroTech</comment>
|
||||||
|
<comment xml:lang="sr">QElectroTech датотека елемента</comment>
|
||||||
|
<comment xml:lang="sv">QElectroTech elementfil</comment>
|
||||||
|
<comment xml:lang="tr">QElectroTech eleman dosyası</comment>
|
||||||
|
<comment xml:lang="uk">Файл елемента QElectroTech</comment>
|
||||||
|
<comment xml:lang="zh">QElectroTech 元件文件</comment>
|
||||||
<glob pattern="*.elmt" />
|
<glob pattern="*.elmt" />
|
||||||
</mime-type>
|
</mime-type>
|
||||||
<mime-type type="application/x-qet-titleblock">
|
<mime-type type="application/x-qet-titleblock">
|
||||||
@@ -61,6 +87,19 @@
|
|||||||
<comment xml:lang="pl">Szablon tabliczki rysunkowej QElectroTech</comment>
|
<comment xml:lang="pl">Szablon tabliczki rysunkowej QElectroTech</comment>
|
||||||
<comment xml:lang="pt">Modelo de moldura QElectroTech</comment>
|
<comment xml:lang="pt">Modelo de moldura QElectroTech</comment>
|
||||||
<comment xml:lang="ru">Файл шаблона основной надписи листа QElectroTech</comment>
|
<comment xml:lang="ru">Файл шаблона основной надписи листа QElectroTech</comment>
|
||||||
|
<comment xml:lang="hr">QElectroTech predložak zaglavlja datoteke</comment>
|
||||||
|
<comment xml:lang="hu">QElectroTech fejlécsablon fájl</comment>
|
||||||
|
<comment xml:lang="mn">QElectroTech гарчгийн блокын загварын файл</comment>
|
||||||
|
<comment xml:lang="nb">QElectroTech tittelblokk malfil</comment>
|
||||||
|
<comment xml:lang="pt_BR">Arquivo de modelo de cartuco QElectroTech</comment>
|
||||||
|
<comment xml:lang="ro">Fișier șablon cartus QElectroTech</comment>
|
||||||
|
<comment xml:lang="sk">Súbor šablóny titulkového bloku QElectroTech</comment>
|
||||||
|
<comment xml:lang="sl">Datoteka predloge naslovnega bloka QElectroTech</comment>
|
||||||
|
<comment xml:lang="sr">QElectroTech датотека шаблона заглавља</comment>
|
||||||
|
<comment xml:lang="sv">QElectroTech titelblocksmall-fil</comment>
|
||||||
|
<comment xml:lang="tr">QElectroTech başlık bloğu şablon dosyası</comment>
|
||||||
|
<comment xml:lang="uk">Файл шаблону основного напису QElectroTech</comment>
|
||||||
|
<comment xml:lang="zh">QElectroTech 标题栏模板文件</comment>
|
||||||
<glob pattern="*.titleblock" />
|
<glob pattern="*.titleblock" />
|
||||||
</mime-type>
|
</mime-type>
|
||||||
</mime-info>
|
</mime-info>
|
||||||
|
|||||||
@@ -243,18 +243,18 @@ if [[ $a == "Y" || $a == "y" ]]; then
|
|||||||
cd $DEFAULT_DIR
|
cd $DEFAULT_DIR
|
||||||
cp -r nsis_base nsis_base64$HEAD
|
cp -r nsis_base nsis_base64$HEAD
|
||||||
cd qelectrotech-$VERSION.r$HEAD/
|
cd qelectrotech-$VERSION.r$HEAD/
|
||||||
cp -r {elements,examples,titleblocks} /$DEFAULT_DIR/nsis_base64$HEAD/files
|
cp -r {elements,examples,titleblocks,fonts} /$DEFAULT_DIR/nsis_base64$HEAD/files
|
||||||
cp -r lang/*.qm /$DEFAULT_DIR/nsis_base64$HEAD/files/lang
|
cp -r lang/*.qm /$DEFAULT_DIR/nsis_base64$HEAD/files/lang
|
||||||
|
|
||||||
cd $DEFAULT_DIR
|
cd $DEFAULT_DIR
|
||||||
cd qelectrotech-$VERSION.r$HEAD/build-aux/windows/
|
cd qelectrotech-$VERSION.r$HEAD/build-aux/windows/
|
||||||
cp {lang_extra.nsh,QET64.nsi,lang_extra_fr.nsh} /$DEFAULT_DIR/nsis_base64$HEAD/
|
cp {lang_extra.nsh,QET64.nsi,lang_extra_fr.nsh,lang_extra_missing.nsh} /$DEFAULT_DIR/nsis_base64$HEAD/
|
||||||
|
|
||||||
#copy and update folders of readytouse_base skeleton
|
#copy and update folders of readytouse_base skeleton
|
||||||
cd $DEFAULT_DIR
|
cd $DEFAULT_DIR
|
||||||
cp -r readytouse_base qelectrotech-$VERSION+git$HEAD-x86-win64-readytouse
|
cp -r readytouse_base qelectrotech-$VERSION+git$HEAD-x86-win64-readytouse
|
||||||
cd qelectrotech-$VERSION.r$HEAD/
|
cd qelectrotech-$VERSION.r$HEAD/
|
||||||
cp -r {elements,examples,titleblocks} /$DEFAULT_DIR/qelectrotech-$VERSION+git$HEAD-x86-win64-readytouse
|
cp -r {elements,examples,titleblocks,fonts} /$DEFAULT_DIR/qelectrotech-$VERSION+git$HEAD-x86-win64-readytouse
|
||||||
cp -r lang/*.qm /$DEFAULT_DIR/qelectrotech-$VERSION+git$HEAD-x86-win64-readytouse/lang
|
cp -r lang/*.qm /$DEFAULT_DIR/qelectrotech-$VERSION+git$HEAD-x86-win64-readytouse/lang
|
||||||
|
|
||||||
export PATH=/home/laurent/digikam3333/project/bundles/mxe/build.win64/usr/bin:$PATH
|
export PATH=/home/laurent/digikam3333/project/bundles/mxe/build.win64/usr/bin:$PATH
|
||||||
|
|||||||
@@ -119,8 +119,8 @@ int ElementCollectionItem::rowForInsertItem(const QString &name)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
QList <ElementCollectionItem *> child;
|
QList <ElementCollectionItem *> child;
|
||||||
//The item to insert is an element we search from element child
|
//The item to insert is an element/template we search from element child
|
||||||
if (name.endsWith(".elmt"))
|
if (name.endsWith(".elmt") || name.endsWith(".qetmak"))
|
||||||
{
|
{
|
||||||
child = elementsDirectChild();
|
child = elementsDirectChild();
|
||||||
//There isn't element, we insert at last position
|
//There isn't element, we insert at last position
|
||||||
|
|||||||
@@ -26,12 +26,7 @@
|
|||||||
#include "xmlprojectelementcollectionitem.h"
|
#include "xmlprojectelementcollectionitem.h"
|
||||||
|
|
||||||
#include <QFutureWatcher>
|
#include <QFutureWatcher>
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
|
|
||||||
#include <QtConcurrentMap>
|
#include <QtConcurrentMap>
|
||||||
#else
|
|
||||||
#include <QtConcurrentRun>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief ElementsCollectionModel::ElementsCollectionModel
|
@brief ElementsCollectionModel::ElementsCollectionModel
|
||||||
Constructor
|
Constructor
|
||||||
@@ -264,10 +259,12 @@ bool ElementsCollectionModel::dropMimeData(const QMimeData *data,
|
|||||||
@param projects : list of projects to load
|
@param projects : list of projects to load
|
||||||
*/
|
*/
|
||||||
void ElementsCollectionModel::loadCollections(bool common_collection,
|
void ElementsCollectionModel::loadCollections(bool common_collection,
|
||||||
bool company_collection,
|
bool company_collection,
|
||||||
bool custom_collection,
|
bool custom_collection,
|
||||||
QList<QETProject *> projects)
|
QList<QETProject *> projects)
|
||||||
{
|
{
|
||||||
|
clear();
|
||||||
|
|
||||||
m_items_list_to_setUp.clear();
|
m_items_list_to_setUp.clear();
|
||||||
|
|
||||||
if (common_collection)
|
if (common_collection)
|
||||||
@@ -280,17 +277,17 @@ void ElementsCollectionModel::loadCollections(bool common_collection,
|
|||||||
if (common_collection || company_collection || custom_collection)
|
if (common_collection || company_collection || custom_collection)
|
||||||
m_items_list_to_setUp.append(items());
|
m_items_list_to_setUp.append(items());
|
||||||
|
|
||||||
|
|
||||||
for (QETProject *project : projects)
|
for (QETProject *project : projects)
|
||||||
{
|
{
|
||||||
addProject(project, false);
|
addProject(project, false);
|
||||||
m_items_list_to_setUp.append(projectItems(project));
|
m_items_list_to_setUp.append(projectItems(project));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto *watcher = new QFutureWatcher<void>();
|
auto *watcher = new QFutureWatcher<void>();
|
||||||
connect(watcher, &QFutureWatcher<void>::progressValueChanged,
|
connect(watcher, &QFutureWatcher<void>::progressValueChanged,
|
||||||
this, &ElementsCollectionModel::loadingProgressValueChanged);
|
this, &ElementsCollectionModel::loadingProgressValueChanged);
|
||||||
connect(watcher, &QFutureWatcher<void>::progressRangeChanged,
|
connect(watcher, &QFutureWatcher<void>::progressRangeChanged,
|
||||||
this, &ElementsCollectionModel::loadingProgressRangeChanged);
|
this, &ElementsCollectionModel::loadingProgressRangeChanged);
|
||||||
connect(watcher, &QFutureWatcher<void>::finished,
|
connect(watcher, &QFutureWatcher<void>::finished,
|
||||||
this, &ElementsCollectionModel::loadingFinished);
|
this, &ElementsCollectionModel::loadingFinished);
|
||||||
connect(
|
connect(
|
||||||
@@ -298,18 +295,46 @@ void ElementsCollectionModel::loadCollections(bool common_collection,
|
|||||||
&QFutureWatcher<void>::finished,
|
&QFutureWatcher<void>::finished,
|
||||||
watcher,
|
watcher,
|
||||||
&QFutureWatcher<void>::deleteLater);
|
&QFutureWatcher<void>::deleteLater);
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
|
|
||||||
m_future = QtConcurrent::map(m_items_list_to_setUp, setUpData);
|
m_future = QtConcurrent::map(m_items_list_to_setUp, setUpData);
|
||||||
#else
|
|
||||||
# if TODO_LIST
|
|
||||||
# pragma message("@TODO remove code for QT 6 or later")
|
|
||||||
# endif
|
|
||||||
qDebug() << "Help code for QT 6 or later"
|
|
||||||
<< "QtConcurrent::run its backwards now...function, object, args";
|
|
||||||
#endif
|
|
||||||
watcher->setFuture(m_future);
|
watcher->setFuture(m_future);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ElementsCollectionModel::loadMacrosCollection
|
||||||
|
* Load the macros collection synchronously to avoid thread-collisions.
|
||||||
|
*/
|
||||||
|
void ElementsCollectionModel::loadMacrosCollection()
|
||||||
|
{
|
||||||
|
m_items_list_to_setUp.clear();
|
||||||
|
addMacrosCollection(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ElementsCollectionModel::addMacrosCollection
|
||||||
|
* Add the user macros collection to this model
|
||||||
|
* @param set_data
|
||||||
|
*/
|
||||||
|
void ElementsCollectionModel::addMacrosCollection(bool set_data)
|
||||||
|
{
|
||||||
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
qDebug() << "=== MAKRO PFAD CHECK ===" << macrosPath;
|
||||||
|
if (macrosPath.endsWith("/")) {
|
||||||
|
macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileElementCollectionItem *feci = new FileElementCollectionItem();
|
||||||
|
if (feci->setRootPath(macrosPath,
|
||||||
|
set_data,
|
||||||
|
m_hide_element)) {
|
||||||
|
invisibleRootItem()->appendRow(feci);
|
||||||
|
if (set_data)
|
||||||
|
feci->setUpData();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
delete feci;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief ElementsCollectionModel::addCommonCollection
|
@brief ElementsCollectionModel::addCommonCollection
|
||||||
Add the common elements collection to this model
|
Add the common elements collection to this model
|
||||||
@@ -368,11 +393,11 @@ void ElementsCollectionModel::addCustomCollection(bool set_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief ElementsCollectionModel::addLocation
|
* @brief ElementsCollectionModel::addLocation
|
||||||
Add the element or directory to this model.
|
* Add the element or directory to this model.
|
||||||
If the location is already managed by this model, do nothing.
|
* If the location is already managed by this model, do nothing.
|
||||||
@param location
|
* @param location
|
||||||
*/
|
*/
|
||||||
void ElementsCollectionModel::addLocation(const ElementsLocation& location)
|
void ElementsCollectionModel::addLocation(const ElementsLocation& location)
|
||||||
{
|
{
|
||||||
QModelIndex index = indexFromLocation(location);
|
QModelIndex index = indexFromLocation(location);
|
||||||
@@ -387,14 +412,15 @@ void ElementsCollectionModel::addLocation(const ElementsLocation& location)
|
|||||||
|
|
||||||
if (project) {
|
if (project) {
|
||||||
XmlProjectElementCollectionItem *xpeci =
|
XmlProjectElementCollectionItem *xpeci =
|
||||||
m_project_hash.value(project);
|
m_project_hash.value(project);
|
||||||
|
|
||||||
last_item = xpeci->lastItemForPath(
|
last_item = xpeci->lastItemForPath(
|
||||||
location.collectionPath(false),
|
location.collectionPath(false),
|
||||||
collection_name);
|
collection_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (location.isCustomCollection()) {
|
// ANPASSUNG: Makros und Custom Collection werden hier behandelt!
|
||||||
|
else if (location.isCustomCollection() || location.isMacrosCollection()) {
|
||||||
QList <ElementCollectionItem *> child_list;
|
QList <ElementCollectionItem *> child_list;
|
||||||
|
|
||||||
for (int i=0 ; i<rowCount() ; i++)
|
for (int i=0 ; i<rowCount() ; i++)
|
||||||
@@ -404,15 +430,18 @@ void ElementsCollectionModel::addLocation(const ElementsLocation& location)
|
|||||||
|
|
||||||
if (eci->type() == FileElementCollectionItem::Type) {
|
if (eci->type() == FileElementCollectionItem::Type) {
|
||||||
FileElementCollectionItem *feci =
|
FileElementCollectionItem *feci =
|
||||||
static_cast<FileElementCollectionItem *>(eci);
|
static_cast<FileElementCollectionItem *>(eci);
|
||||||
|
|
||||||
|
// Wir prüfen explizit, ob es Custom ODER Macros ist, und weisen es richtig zu.
|
||||||
|
if ((location.isCustomCollection() && feci->isCustomCollection()) ||
|
||||||
|
(location.isMacrosCollection() && feci->isMacrosCollection())) {
|
||||||
|
|
||||||
if (feci->isCustomCollection()) {
|
|
||||||
last_item = feci->lastItemForPath(
|
last_item = feci->lastItemForPath(
|
||||||
location.collectionPath(false),
|
location.collectionPath(false),
|
||||||
collection_name);
|
collection_name);
|
||||||
if(last_item)
|
if(last_item)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -574,14 +603,14 @@ void ElementsCollectionModel::hideElement()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief ElementsCollectionModel::indexFromLocation
|
* @brief ElementsCollectionModel::indexFromLocation
|
||||||
Return the index who represent location.
|
* Return the index who represent location.
|
||||||
Index can be non valid
|
* Index can be non valid
|
||||||
@param location
|
* @param location
|
||||||
@return
|
* @return
|
||||||
*/
|
*/
|
||||||
QModelIndex ElementsCollectionModel::indexFromLocation(
|
QModelIndex ElementsCollectionModel::indexFromLocation(
|
||||||
const ElementsLocation &location)
|
const ElementsLocation &location)
|
||||||
{
|
{
|
||||||
QList <ElementCollectionItem *> child_list;
|
QList <ElementCollectionItem *> child_list;
|
||||||
|
|
||||||
@@ -589,30 +618,34 @@ QModelIndex ElementsCollectionModel::indexFromLocation(
|
|||||||
child_list.append(static_cast<ElementCollectionItem *>(item(i)));
|
child_list.append(static_cast<ElementCollectionItem *>(item(i)));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(ElementCollectionItem *eci, child_list) {
|
foreach(ElementCollectionItem *eci, child_list) {
|
||||||
|
|
||||||
ElementCollectionItem *match_eci = nullptr;
|
ElementCollectionItem *match_eci = nullptr;
|
||||||
|
|
||||||
if (eci->type() == FileElementCollectionItem::Type) {
|
if (eci->type() == FileElementCollectionItem::Type) {
|
||||||
if (FileElementCollectionItem *feci = static_cast<FileElementCollectionItem *>(eci)) {
|
if (FileElementCollectionItem *feci = static_cast<FileElementCollectionItem *>(eci)) {
|
||||||
if ( (location.isCommonCollection() && feci->isCommonCollection()) ||
|
|
||||||
(location.isCompanyCollection() && feci->isCompanyCollection()) ||
|
// ANPASSUNG: Makro-Prüfung hinzugefügt, damit das Modell den Pfad im Baum findet!
|
||||||
(location.isCustomCollection() && !feci->isCommonCollection()) ) {
|
if ( (location.isCommonCollection() && feci->isCommonCollection()) ||
|
||||||
match_eci = feci->itemAtPath(location.collectionPath(false));
|
(location.isCompanyCollection() && feci->isCompanyCollection()) ||
|
||||||
|
(location.isMacrosCollection() && feci->isMacrosCollection()) ||
|
||||||
|
(location.isCustomCollection() && feci->isCustomCollection()) ) {
|
||||||
|
|
||||||
|
match_eci = feci->itemAtPath(location.collectionPath(false));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (eci->type() == XmlProjectElementCollectionItem::Type) {
|
}
|
||||||
if (XmlProjectElementCollectionItem *xpeci = static_cast<XmlProjectElementCollectionItem *>(eci)) {
|
else if (eci->type() == XmlProjectElementCollectionItem::Type) {
|
||||||
match_eci = xpeci->itemAtPath(location.collectionPath(false));
|
if (XmlProjectElementCollectionItem *xpeci = static_cast<XmlProjectElementCollectionItem *>(eci)) {
|
||||||
}
|
match_eci = xpeci->itemAtPath(location.collectionPath(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match_eci)
|
|
||||||
return indexFromItem(match_eci);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return QModelIndex();
|
if (match_eci)
|
||||||
|
return indexFromItem(match_eci);
|
||||||
|
}
|
||||||
|
|
||||||
|
return QModelIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ class ElementsCollectionModel : public QStandardItemModel
|
|||||||
void addCommonCollection(bool set_data = true);
|
void addCommonCollection(bool set_data = true);
|
||||||
void addCompanyCollection(bool set_data = true);
|
void addCompanyCollection(bool set_data = true);
|
||||||
void addCustomCollection(bool set_data = true);
|
void addCustomCollection(bool set_data = true);
|
||||||
|
void addMacrosCollection(bool set_data = true);
|
||||||
|
void loadMacrosCollection();
|
||||||
void addLocation(const ElementsLocation& location);
|
void addLocation(const ElementsLocation& location);
|
||||||
|
|
||||||
void addProject(QETProject *project, bool set_data = true);
|
void addProject(QETProject *project, bool set_data = true);
|
||||||
|
|||||||
@@ -93,10 +93,7 @@ void ElementsCollectionWidget::addProject(QETProject *project)
|
|||||||
{
|
{
|
||||||
if (m_model)
|
if (m_model)
|
||||||
{
|
{
|
||||||
m_progress_bar->show();
|
m_model->addProject(project, true);
|
||||||
m_tree_view->setDisabled(true);
|
|
||||||
QList <QETProject *> prj; prj.append(project);
|
|
||||||
m_model->loadCollections(false, false, false, prj);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_waiting_project.append(project);
|
m_waiting_project.append(project);
|
||||||
@@ -176,16 +173,14 @@ void ElementsCollectionWidget::setUpAction()
|
|||||||
*/
|
*/
|
||||||
void ElementsCollectionWidget::setUpWidget()
|
void ElementsCollectionWidget::setUpWidget()
|
||||||
{
|
{
|
||||||
//Setup the main layout
|
|
||||||
m_main_vlayout = new QVBoxLayout(this);
|
m_main_vlayout = new QVBoxLayout(this);
|
||||||
this->setLayout(m_main_vlayout);
|
m_main_vlayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
m_main_vlayout->setSpacing(2);
|
||||||
|
|
||||||
m_search_field = new QLineEdit(this);
|
m_search_field = new QLineEdit(this);
|
||||||
m_search_field->setPlaceholderText(tr("Rechercher"));
|
m_search_field->setPlaceholderText(tr("Rechercher..."));
|
||||||
m_search_field->setClearButtonEnabled(true);
|
m_search_field->setClearButtonEnabled(true);
|
||||||
m_main_vlayout->addWidget(m_search_field);
|
|
||||||
|
|
||||||
//Setup the tree view
|
|
||||||
m_tree_view = new ElementsTreeView(this);
|
m_tree_view = new ElementsTreeView(this);
|
||||||
m_tree_view->setHeaderHidden(true);
|
m_tree_view->setHeaderHidden(true);
|
||||||
m_tree_view->setIconSize(QSize(50, 50));
|
m_tree_view->setIconSize(QSize(50, 50));
|
||||||
@@ -195,12 +190,29 @@ void ElementsCollectionWidget::setUpWidget()
|
|||||||
m_tree_view->setAnimated(true);
|
m_tree_view->setAnimated(true);
|
||||||
m_tree_view->setMouseTracking(true);
|
m_tree_view->setMouseTracking(true);
|
||||||
m_tree_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
m_tree_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||||
m_main_vlayout->addWidget(m_tree_view);
|
|
||||||
|
|
||||||
//Setup the progress bar
|
//Setup the macros tree view
|
||||||
|
m_macros_tree_view = new ElementsTreeView(this);
|
||||||
|
m_macros_tree_view->setHeaderHidden(true);
|
||||||
|
m_macros_tree_view->setIconSize(QSize(50, 50));
|
||||||
|
m_macros_tree_view->setDragDropMode(QAbstractItemView::DragDrop);
|
||||||
|
m_macros_tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
m_macros_tree_view->setAutoExpandDelay(500);
|
||||||
|
m_macros_tree_view->setAnimated(true);
|
||||||
|
m_macros_tree_view->setMouseTracking(true);
|
||||||
|
m_macros_tree_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||||
|
|
||||||
|
m_tab_widget = new QTabWidget(this);
|
||||||
|
m_tab_widget->setDocumentMode(true);
|
||||||
|
m_tab_widget->setTabPosition(QTabWidget::North);
|
||||||
|
m_tab_widget->addTab(m_tree_view, tr("Collections"));
|
||||||
|
m_tab_widget->addTab(m_macros_tree_view, tr("Modèles"));
|
||||||
|
|
||||||
|
m_main_vlayout->addWidget(m_search_field);
|
||||||
|
m_main_vlayout->addWidget(m_tab_widget);
|
||||||
|
|
||||||
m_progress_bar = new QProgressBar(this);
|
m_progress_bar = new QProgressBar(this);
|
||||||
m_progress_bar->setFormat(QObject::tr("chargement %p% (%v sur %m)"));
|
m_progress_bar->setFormat(QObject::tr("chargement %p% (%v sur %m)"));
|
||||||
|
|
||||||
m_main_vlayout->addWidget(m_progress_bar);
|
m_main_vlayout->addWidget(m_progress_bar);
|
||||||
m_progress_bar->hide();
|
m_progress_bar->hide();
|
||||||
|
|
||||||
@@ -243,11 +255,15 @@ void ElementsCollectionWidget::setUpConnection()
|
|||||||
this, &ElementsCollectionWidget::dirProperties);
|
this, &ElementsCollectionWidget::dirProperties);
|
||||||
|
|
||||||
connect(m_tree_view, &QTreeView::doubleClicked,
|
connect(m_tree_view, &QTreeView::doubleClicked,
|
||||||
[this](const QModelIndex &index)
|
[this](const QModelIndex &index)
|
||||||
{
|
{
|
||||||
this->m_index_at_context_menu = index ;
|
this->m_index_at_context_menu = index ;
|
||||||
this->editElement();
|
ElementCollectionItem *eci = elementCollectionItemForIndex(index);
|
||||||
});
|
if (eci && eci->collectionPath().endsWith(".qetmak")) {
|
||||||
|
return; // Do nothing on double click for macros
|
||||||
|
}
|
||||||
|
this->editElement();
|
||||||
|
});
|
||||||
|
|
||||||
connect(m_tree_view, &QTreeView::entered,
|
connect(m_tree_view, &QTreeView::entered,
|
||||||
[this] (const QModelIndex &index) {
|
[this] (const QModelIndex &index) {
|
||||||
@@ -256,37 +272,64 @@ void ElementsCollectionWidget::setUpConnection()
|
|||||||
if (qde && eci)
|
if (qde && eci)
|
||||||
qde->statusBar()->showMessage(eci->localName());
|
qde->statusBar()->showMessage(eci->localName());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(m_macros_tree_view, &QTreeView::customContextMenuRequested,
|
||||||
|
this, &ElementsCollectionWidget::customContextMenu);
|
||||||
|
|
||||||
|
connect(m_macros_tree_view, &QTreeView::doubleClicked,
|
||||||
|
[this](const QModelIndex &index)
|
||||||
|
{
|
||||||
|
this->m_index_at_context_menu = index ;
|
||||||
|
ElementCollectionItem *eci = elementCollectionItemForIndex(index);
|
||||||
|
if (eci && eci->collectionPath().endsWith(".qetmak")) {
|
||||||
|
return; // Do nothing on double click for macros
|
||||||
|
}
|
||||||
|
this->editElement();
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(m_macros_tree_view, &QTreeView::entered,
|
||||||
|
[this] (const QModelIndex &index) {
|
||||||
|
QETDiagramEditor *qde = QETApp::diagramEditorAncestorOf(this);
|
||||||
|
ElementCollectionItem *eci = elementCollectionItemForIndex(index);
|
||||||
|
if (qde && eci)
|
||||||
|
qde->statusBar()->showMessage(eci->localName());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief ElementsCollectionWidget::customContextMenu
|
* @brief ElementsCollectionWidget::customContextMenu
|
||||||
Display the context menu of this widget at point
|
* Display the context menu of this widget at point
|
||||||
@param point
|
* @param point
|
||||||
*/
|
*/
|
||||||
void ElementsCollectionWidget::customContextMenu(const QPoint &point)
|
void ElementsCollectionWidget::customContextMenu(const QPoint &point)
|
||||||
{
|
{
|
||||||
m_index_at_context_menu = m_tree_view->indexAt(point);
|
QTreeView *clicked_tree = qobject_cast<QTreeView *>(sender());
|
||||||
|
if (!clicked_tree) clicked_tree = m_tree_view; // Fallback
|
||||||
|
|
||||||
|
m_index_at_context_menu = clicked_tree->indexAt(point);
|
||||||
if (!m_index_at_context_menu.isValid()) return;
|
if (!m_index_at_context_menu.isValid()) return;
|
||||||
|
|
||||||
m_context_menu->clear();
|
m_context_menu->clear();
|
||||||
|
|
||||||
ElementCollectionItem *eci = elementCollectionItemForIndex(
|
ElementCollectionItem *eci = elementCollectionItemForIndex(
|
||||||
m_index_at_context_menu);
|
m_index_at_context_menu);
|
||||||
bool add_open_dir = false;
|
bool add_open_dir = false;
|
||||||
|
|
||||||
if (eci->isElement())
|
if (eci->isElement() && !eci->collectionPath().endsWith(".qetmak"))
|
||||||
m_context_menu->addAction(m_edit_element);
|
m_context_menu->addAction(m_edit_element);
|
||||||
|
|
||||||
if (eci->type() == FileElementCollectionItem::Type)
|
if (eci->type() == FileElementCollectionItem::Type)
|
||||||
{
|
{
|
||||||
add_open_dir = true;
|
add_open_dir = true;
|
||||||
FileElementCollectionItem *feci =
|
FileElementCollectionItem *feci =
|
||||||
static_cast<FileElementCollectionItem*>(eci);
|
static_cast<FileElementCollectionItem*>(eci);
|
||||||
if (!feci->isCommonCollection())
|
if (!feci->isCommonCollection())
|
||||||
{
|
{
|
||||||
if (feci->isDir())
|
if (feci->isDir())
|
||||||
{
|
{
|
||||||
m_context_menu->addAction(m_new_element);
|
if (!feci->isMacrosCollection()) {
|
||||||
|
m_context_menu->addAction(m_new_element);
|
||||||
|
}
|
||||||
m_context_menu->addAction(m_new_directory);
|
m_context_menu->addAction(m_new_directory);
|
||||||
if (!feci->isCollectionRoot())
|
if (!feci->isCollectionRoot())
|
||||||
{
|
{
|
||||||
@@ -301,7 +344,7 @@ void ElementsCollectionWidget::customContextMenu(const QPoint &point)
|
|||||||
if (eci->type() == XmlProjectElementCollectionItem::Type)
|
if (eci->type() == XmlProjectElementCollectionItem::Type)
|
||||||
{
|
{
|
||||||
XmlProjectElementCollectionItem *xpeci =
|
XmlProjectElementCollectionItem *xpeci =
|
||||||
static_cast<XmlProjectElementCollectionItem *>(eci);
|
static_cast<XmlProjectElementCollectionItem *>(eci);
|
||||||
if (xpeci->isCollectionRoot())
|
if (xpeci->isCollectionRoot())
|
||||||
add_open_dir = true;
|
add_open_dir = true;
|
||||||
}
|
}
|
||||||
@@ -320,7 +363,7 @@ void ElementsCollectionWidget::customContextMenu(const QPoint &point)
|
|||||||
m_context_menu->addAction(m_open_dir);
|
m_context_menu->addAction(m_open_dir);
|
||||||
m_context_menu->addAction(m_reload);
|
m_context_menu->addAction(m_reload);
|
||||||
|
|
||||||
m_context_menu->popup(mapToGlobal(m_tree_view->mapToParent(point)));
|
m_context_menu->popup(mapToGlobal(clicked_tree->mapToParent(point)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -360,6 +403,9 @@ void ElementsCollectionWidget::editElement()
|
|||||||
|
|
||||||
if ( !(eci && eci->isElement()) ) return;
|
if ( !(eci && eci->isElement()) ) return;
|
||||||
|
|
||||||
|
// Prevent the element editor from opening for macros
|
||||||
|
if (eci->collectionPath().endsWith(".qetmak")) return;
|
||||||
|
|
||||||
ElementsLocation location(eci->collectionPath());
|
ElementsLocation location(eci->collectionPath());
|
||||||
|
|
||||||
QETApp *app = QETApp::instance();
|
QETApp *app = QETApp::instance();
|
||||||
@@ -384,11 +430,15 @@ void ElementsCollectionWidget::deleteElement()
|
|||||||
if (!eci) return;
|
if (!eci) return;
|
||||||
|
|
||||||
ElementsLocation loc(eci->collectionPath());
|
ElementsLocation loc(eci->collectionPath());
|
||||||
if (! (loc.isElement()
|
|
||||||
&& loc.exist()
|
bool isDeletableFile = loc.isElement() || eci->collectionPath().endsWith(".qetmak");
|
||||||
&& loc.isFileSystem()
|
|
||||||
&& (loc.collectionPath().startsWith("company://")
|
if (! (isDeletableFile
|
||||||
|| loc.collectionPath().startsWith("custom://"))) ) return;
|
&& loc.exist()
|
||||||
|
&& loc.isFileSystem()
|
||||||
|
&& (loc.collectionPath().startsWith("company://")
|
||||||
|
|| loc.collectionPath().startsWith("custom://")
|
||||||
|
|| loc.collectionPath().startsWith("macros://"))) ) return;
|
||||||
|
|
||||||
if (QET::QetMessageBox::question(
|
if (QET::QetMessageBox::question(
|
||||||
this,
|
this,
|
||||||
@@ -400,9 +450,10 @@ void ElementsCollectionWidget::deleteElement()
|
|||||||
QFile file(loc.fileSystemPath());
|
QFile file(loc.fileSystemPath());
|
||||||
if (file.remove())
|
if (file.remove())
|
||||||
{
|
{
|
||||||
m_model->removeRows(m_index_at_context_menu.row(),
|
QAbstractItemModel *clicked_model = const_cast<QAbstractItemModel*>(m_index_at_context_menu.model());
|
||||||
1,
|
if (clicked_model) {
|
||||||
m_index_at_context_menu.parent());
|
clicked_model->removeRows(m_index_at_context_menu.row(), 1, m_index_at_context_menu.parent());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -429,10 +480,11 @@ void ElementsCollectionWidget::deleteDirectory()
|
|||||||
|
|
||||||
ElementsLocation loc (eci->collectionPath());
|
ElementsLocation loc (eci->collectionPath());
|
||||||
if (! (loc.isDirectory()
|
if (! (loc.isDirectory()
|
||||||
&& loc.exist()
|
&& loc.exist()
|
||||||
&& loc.isFileSystem()
|
&& loc.isFileSystem()
|
||||||
&& (loc.collectionPath().startsWith("company://")
|
&& (loc.collectionPath().startsWith("company://")
|
||||||
|| loc.collectionPath().startsWith("custom://"))) ) return;
|
|| loc.collectionPath().startsWith("custom://")
|
||||||
|
|| loc.collectionPath().startsWith("macros://"))) ) return;
|
||||||
|
|
||||||
if (QET::QetMessageBox::question(
|
if (QET::QetMessageBox::question(
|
||||||
this,
|
this,
|
||||||
@@ -445,9 +497,10 @@ void ElementsCollectionWidget::deleteDirectory()
|
|||||||
QDir dir (loc.fileSystemPath());
|
QDir dir (loc.fileSystemPath());
|
||||||
if (dir.removeRecursively())
|
if (dir.removeRecursively())
|
||||||
{
|
{
|
||||||
m_model->removeRows(m_index_at_context_menu.row(),
|
QAbstractItemModel *clicked_model = const_cast<QAbstractItemModel*>(m_index_at_context_menu.model());
|
||||||
1,
|
if (clicked_model) {
|
||||||
m_index_at_context_menu.parent());
|
clicked_model->removeRows(m_index_at_context_menu.row(), 1, m_index_at_context_menu.parent());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -489,19 +542,29 @@ void ElementsCollectionWidget::editDirectory()
|
|||||||
*/
|
*/
|
||||||
void ElementsCollectionWidget::newDirectory()
|
void ElementsCollectionWidget::newDirectory()
|
||||||
{
|
{
|
||||||
ElementCollectionItem *eci = elementCollectionItemForIndex(
|
ElementCollectionItem *eci = elementCollectionItemForIndex(m_index_at_context_menu);
|
||||||
m_index_at_context_menu);
|
|
||||||
|
|
||||||
if (eci->type() != FileElementCollectionItem::Type) return;
|
if (!eci || eci->type() != FileElementCollectionItem::Type) return;
|
||||||
|
|
||||||
FileElementCollectionItem *feci =
|
FileElementCollectionItem *feci = static_cast<FileElementCollectionItem*>(eci);
|
||||||
static_cast<FileElementCollectionItem*>(eci);
|
|
||||||
if(feci->isCommonCollection()) return;
|
if(feci->isCommonCollection()) return;
|
||||||
|
|
||||||
ElementsLocation location(feci->collectionPath());
|
ElementsLocation location(feci->collectionPath());
|
||||||
ElementsCategoryEditor new_dir_editor(location, false, this);
|
ElementsCategoryEditor new_dir_editor(location, false, this);
|
||||||
if (new_dir_editor.exec() == QDialog::Accepted)
|
|
||||||
m_model->addLocation(new_dir_editor.createdLocation());
|
if (new_dir_editor.exec() == QDialog::Accepted) {
|
||||||
|
ElementsLocation new_loc = new_dir_editor.createdLocation();
|
||||||
|
|
||||||
|
if (new_loc.isMacrosCollection()) {
|
||||||
|
if (m_macros_model) {
|
||||||
|
m_macros_model->addLocation(new_loc);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (m_model) {
|
||||||
|
m_model->addLocation(new_loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -662,12 +725,19 @@ void ElementsCollectionWidget::reload()
|
|||||||
&ElementsCollectionWidget::loadingFinished);
|
&ElementsCollectionWidget::loadingFinished);
|
||||||
|
|
||||||
m_new_model->loadCollections(true, true, true, project_list);
|
m_new_model->loadCollections(true, true, true, project_list);
|
||||||
|
|
||||||
|
if (m_macros_model) {
|
||||||
|
m_macros_model->deleteLater();
|
||||||
|
}
|
||||||
|
m_macros_model = new ElementsCollectionModel(m_macros_tree_view);
|
||||||
|
m_macros_tree_view->setModel(m_macros_model);
|
||||||
|
m_macros_model->loadMacrosCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief ElementsCollectionWidget::loadingFinished
|
* @brief ElementsCollectionWidget::loadingFinished
|
||||||
Process when collection finished to be loaded
|
* Process when collection finished to be loaded
|
||||||
*/
|
*/
|
||||||
void ElementsCollectionWidget::loadingFinished()
|
void ElementsCollectionWidget::loadingFinished()
|
||||||
{
|
{
|
||||||
if (m_new_model)
|
if (m_new_model)
|
||||||
@@ -765,14 +835,8 @@ void ElementsCollectionWidget::search()
|
|||||||
}
|
}
|
||||||
|
|
||||||
hideCollection(true);
|
hideCollection(true);
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
|
||||||
const QStringList text_list = text.split("+", QString::SkipEmptyParts);
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 5.14 or later")
|
|
||||||
#endif
|
|
||||||
const QStringList text_list = text.split("+", Qt::SkipEmptyParts);
|
const QStringList text_list = text.split("+", Qt::SkipEmptyParts);
|
||||||
#endif
|
|
||||||
QModelIndexList match_index;
|
QModelIndexList match_index;
|
||||||
for (QString txt : text_list) {
|
for (QString txt : text_list) {
|
||||||
match_index << m_model->match(m_showed_index.isValid()
|
match_index << m_model->match(m_showed_index.isValid()
|
||||||
@@ -842,15 +906,21 @@ void ElementsCollectionWidget::showAndExpandItem(const QModelIndex &index,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief ElementsCollectionWidget::elementCollectionItemForIndex
|
* @brief ElementsCollectionWidget::elementCollectionItemForIndex
|
||||||
@param index
|
* @param index
|
||||||
@return The internal pointer of index casted to ElementCollectionItem;
|
* @return The internal pointer of index casted to ElementCollectionItem;
|
||||||
*/
|
*/
|
||||||
ElementCollectionItem *ElementsCollectionWidget::elementCollectionItemForIndex(
|
ElementCollectionItem *ElementsCollectionWidget::elementCollectionItemForIndex(const QModelIndex &index)
|
||||||
const QModelIndex &index) {
|
{
|
||||||
if (!index.isValid())
|
if (!index.isValid()) return nullptr;
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return static_cast<ElementCollectionItem*>(
|
if (m_macros_model && index.model() == m_macros_model) {
|
||||||
m_model->itemFromIndex(index));
|
return static_cast<ElementCollectionItem *>(m_macros_model->itemFromIndex(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_model && index.model() == m_model) {
|
||||||
|
return static_cast<ElementCollectionItem *>(m_model->itemFromIndex(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QElapsedTimer>
|
#include <QElapsedTimer>
|
||||||
#include <QScopedPointer>
|
#include <QScopedPointer>
|
||||||
|
#include <QTabWidget>
|
||||||
|
#include <QTreeView>
|
||||||
|
|
||||||
class ElementsCollectionModel;
|
class ElementsCollectionModel;
|
||||||
class QVBoxLayout;
|
class QVBoxLayout;
|
||||||
@@ -90,9 +92,12 @@ class ElementsCollectionWidget : public QWidget
|
|||||||
private:
|
private:
|
||||||
ElementsCollectionModel *m_model = nullptr;
|
ElementsCollectionModel *m_model = nullptr;
|
||||||
ElementsCollectionModel *m_new_model = nullptr;
|
ElementsCollectionModel *m_new_model = nullptr;
|
||||||
|
ElementsCollectionModel *m_macros_model = nullptr;
|
||||||
QLineEdit *m_search_field;
|
QLineEdit *m_search_field;
|
||||||
QTimer m_search_timer;
|
QTimer m_search_timer;
|
||||||
ElementsTreeView *m_tree_view;
|
ElementsTreeView *m_tree_view;
|
||||||
|
ElementsTreeView *m_macros_tree_view = nullptr;
|
||||||
|
QTabWidget *m_tab_widget = nullptr;
|
||||||
QVBoxLayout *m_main_vlayout;
|
QVBoxLayout *m_main_vlayout;
|
||||||
QMenu *m_context_menu;
|
QMenu *m_context_menu;
|
||||||
QModelIndex m_index_at_context_menu;
|
QModelIndex m_index_at_context_menu;
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ QString ElementsLocation::collectionPath(bool protocol) const
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString path = m_collection_path;
|
QString path = m_collection_path;
|
||||||
return path.remove(QRegularExpression("common://|company://|custom://|embed://"));
|
return path.remove(QRegularExpression("common://|company://|custom://|macros://|embed://"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,54 +232,34 @@ QString ElementsLocation::path() const
|
|||||||
(start by common://, company://, custom:// or embed://) or not.
|
(start by common://, company://, custom:// or embed://) or not.
|
||||||
@param path
|
@param path
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ElementsLocation::setPath(const QString &path)
|
void ElementsLocation::setPath(const QString &path)
|
||||||
{
|
{
|
||||||
QString tmp_path = path;
|
QString tmp_path = path;
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
//On windows, we convert backslash to slash
|
|
||||||
tmp_path = QDir::fromNativeSeparators(path);
|
tmp_path = QDir::fromNativeSeparators(path);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
|
||||||
//There is a project, the path is for an embedded coolection.
|
|
||||||
if (m_project)
|
if (m_project)
|
||||||
{
|
{
|
||||||
m_collection_path = path;
|
m_collection_path = path;
|
||||||
//Add the protocol to the collection path
|
|
||||||
if (!path.startsWith("embed://"))
|
if (!path.startsWith("embed://"))
|
||||||
m_collection_path.prepend("embed://");
|
m_collection_path.prepend("embed://");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//The path start with project, we get the project and the path from the string
|
|
||||||
else if (tmp_path.startsWith("project"))
|
else if (tmp_path.startsWith("project"))
|
||||||
{
|
{
|
||||||
QRegularExpression re
|
QRegularExpression re ("^project(?<project_id>[0-9])\\+(?<collection_path>embed://*.*)$");
|
||||||
("^project(?<project_id>[0-9])\\+(?<collection_path>embed://*.*)$");
|
if (!re.isValid()) return;
|
||||||
if (!re.isValid())
|
|
||||||
{
|
|
||||||
qWarning() <<QObject::tr("this is an error in the code")
|
|
||||||
<< re.errorString()
|
|
||||||
<< re.patternErrorOffset();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QRegularExpressionMatch match = re.match(tmp_path);
|
QRegularExpressionMatch match = re.match(tmp_path);
|
||||||
if (!match.hasMatch())
|
if (!match.hasMatch()) return;
|
||||||
{
|
|
||||||
qDebug()<<"no Match => return"
|
|
||||||
<<tmp_path;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bool conv_ok;
|
bool conv_ok;
|
||||||
uint project_id = match.captured("project_id").toUInt(&conv_ok);
|
uint project_id = match.captured("project_id").toUInt(&conv_ok);
|
||||||
if (!conv_ok)
|
if (!conv_ok) return;
|
||||||
{
|
|
||||||
qWarning()<<"toUint failed"
|
|
||||||
<<match.captured("project_id")
|
|
||||||
<<re
|
|
||||||
<<tmp_path;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QETProject *project = QETApp::project(project_id);
|
QETProject *project = QETApp::project(project_id);
|
||||||
if (project)
|
if (project)
|
||||||
{
|
{
|
||||||
@@ -287,10 +267,7 @@ void ElementsLocation::setPath(const QString &path)
|
|||||||
m_project = project;
|
m_project = project;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (path.startsWith("common://") || path.startsWith("company://") || path.startsWith("custom://") || path.startsWith("macros://"))
|
||||||
// The path is in file system,
|
|
||||||
// the given path is relative to common or custom collection
|
|
||||||
else if (path.startsWith("common://") || path.startsWith("company://") || path.startsWith("custom://"))
|
|
||||||
{
|
{
|
||||||
QString p;
|
QString p;
|
||||||
if (path.startsWith("common://"))
|
if (path.startsWith("common://"))
|
||||||
@@ -303,6 +280,11 @@ void ElementsLocation::setPath(const QString &path)
|
|||||||
tmp_path.remove("company://");
|
tmp_path.remove("company://");
|
||||||
p = QETApp::companyElementsDirN() % "/" % tmp_path;
|
p = QETApp::companyElementsDirN() % "/" % tmp_path;
|
||||||
}
|
}
|
||||||
|
else if (path.startsWith("macros://"))
|
||||||
|
{
|
||||||
|
tmp_path.remove("macros://");
|
||||||
|
p = macrosPath % "/" % tmp_path;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tmp_path.remove("custom://");
|
tmp_path.remove("custom://");
|
||||||
@@ -312,11 +294,10 @@ void ElementsLocation::setPath(const QString &path)
|
|||||||
m_file_system_path = p;
|
m_file_system_path = p;
|
||||||
m_collection_path = path;
|
m_collection_path = path;
|
||||||
}
|
}
|
||||||
//In this case, the path is supposed to be relative to the file system.
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString path_ = path;
|
QString path_ = path;
|
||||||
if(path_.endsWith(".elmt"))
|
if(path_.endsWith(".elmt") || path_.endsWith(".qetmak"))
|
||||||
{
|
{
|
||||||
m_file_system_path = path_;
|
m_file_system_path = path_;
|
||||||
if (path_.startsWith(QETApp::commonElementsDirN()))
|
if (path_.startsWith(QETApp::commonElementsDirN()))
|
||||||
@@ -331,6 +312,13 @@ void ElementsLocation::setPath(const QString &path)
|
|||||||
path_.prepend("company://");
|
path_.prepend("company://");
|
||||||
m_collection_path = path_;
|
m_collection_path = path_;
|
||||||
}
|
}
|
||||||
|
else if (path_.startsWith(macrosPath))
|
||||||
|
{
|
||||||
|
QString matchPath = macrosPath + "/";
|
||||||
|
path_.remove(matchPath);
|
||||||
|
path_.prepend("macros://");
|
||||||
|
m_collection_path = path_;
|
||||||
|
}
|
||||||
else if (path_.startsWith(QETApp::customElementsDirN()))
|
else if (path_.startsWith(QETApp::customElementsDirN()))
|
||||||
{
|
{
|
||||||
path_.remove(QETApp::customElementsDirN()+="/");
|
path_.remove(QETApp::customElementsDirN()+="/");
|
||||||
@@ -353,6 +341,13 @@ void ElementsLocation::setPath(const QString &path)
|
|||||||
path_.prepend("company://");
|
path_.prepend("company://");
|
||||||
m_collection_path = path_;
|
m_collection_path = path_;
|
||||||
}
|
}
|
||||||
|
else if (path_.startsWith(macrosPath))
|
||||||
|
{
|
||||||
|
QString matchPath = macrosPath + "/";
|
||||||
|
path_.remove(matchPath);
|
||||||
|
path_.prepend("macros://");
|
||||||
|
m_collection_path = path_;
|
||||||
|
}
|
||||||
else if (path_.startsWith(QETApp::customElementsDirN()))
|
else if (path_.startsWith(QETApp::customElementsDirN()))
|
||||||
{
|
{
|
||||||
path_.remove(QETApp::customElementsDirN()+="/");
|
path_.remove(QETApp::customElementsDirN()+="/");
|
||||||
@@ -371,10 +366,11 @@ void ElementsLocation::setPath(const QString &path)
|
|||||||
*/
|
*/
|
||||||
bool ElementsLocation::addToPath(const QString &string)
|
bool ElementsLocation::addToPath(const QString &string)
|
||||||
{
|
{
|
||||||
if (m_collection_path.endsWith(".elmt", Qt::CaseInsensitive))
|
if (m_collection_path.endsWith(".elmt", Qt::CaseInsensitive) ||
|
||||||
|
m_collection_path.endsWith(".qetmak", Qt::CaseInsensitive))
|
||||||
{
|
{
|
||||||
qDebug() << "ElementsLocation::addToPath :"
|
qDebug() << "ElementsLocation::addToPath :"
|
||||||
" Can't add string to the path of an element";
|
" Can't add string to the path of an element or template";
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,7 +473,7 @@ QString ElementsLocation::toString() const
|
|||||||
*/
|
*/
|
||||||
bool ElementsLocation::isElement() const
|
bool ElementsLocation::isElement() const
|
||||||
{
|
{
|
||||||
return m_collection_path.endsWith(".elmt");
|
return m_collection_path.endsWith(".elmt") || m_collection_path.endsWith(".qetmak");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -807,13 +803,13 @@ bool ElementsLocation::setXml(const QDomDocument &xml_document) const
|
|||||||
QString path_ = collectionPath(false);
|
QString path_ = collectionPath(false);
|
||||||
QRegularExpression rx("^(.*)/(.*\\.elmt)$");
|
QRegularExpression rx("^(.*)/(.*\\.elmt)$");
|
||||||
|
|
||||||
if (rx.exactMatch(path_))
|
if (auto regex_match = rx.match(path_); regex_match.hasMatch())
|
||||||
{
|
{
|
||||||
return project()
|
return project()
|
||||||
->embeddedElementCollection()
|
->embeddedElementCollection()
|
||||||
->addElementDefinition(
|
->addElementDefinition(
|
||||||
rx.cap(1),
|
regex_match.captured(1),
|
||||||
rx.cap(2),
|
regex_match.captured(2),
|
||||||
xml_document.documentElement());
|
xml_document.documentElement());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -942,3 +938,14 @@ QDebug operator<< (QDebug debug, const ElementsLocation &location)
|
|||||||
|
|
||||||
return debug;
|
return debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ElementsLocation::isMacrosCollection
|
||||||
|
* @return True if this location represent an item from the macros collection
|
||||||
|
*/
|
||||||
|
bool ElementsLocation::isMacrosCollection() const
|
||||||
|
{
|
||||||
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
return fileSystemPath().startsWith(macrosPath);
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
#include "../NameList/nameslist.h"
|
#include "../NameList/nameslist.h"
|
||||||
#include "../diagramcontext.h"
|
#include "../diagramcontext.h"
|
||||||
#include "pugixml/src/pugixml.hpp"
|
#include "pugixml.hpp"
|
||||||
|
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
@@ -78,6 +78,7 @@ class ElementsLocation
|
|||||||
bool isCommonCollection() const;
|
bool isCommonCollection() const;
|
||||||
bool isCompanyCollection() const;
|
bool isCompanyCollection() const;
|
||||||
bool isCustomCollection() const;
|
bool isCustomCollection() const;
|
||||||
|
bool isMacrosCollection() const;
|
||||||
bool isProject() const;
|
bool isProject() const;
|
||||||
bool exist() const;
|
bool exist() const;
|
||||||
bool isWritable() const;
|
bool isWritable() const;
|
||||||
|
|||||||
@@ -22,7 +22,12 @@
|
|||||||
#include "../qeticons.h"
|
#include "../qeticons.h"
|
||||||
#include "elementcollectionitem.h"
|
#include "elementcollectionitem.h"
|
||||||
#include "elementslocation.h"
|
#include "elementslocation.h"
|
||||||
|
#include "../qetproject.h"
|
||||||
|
#include "../diagram.h"
|
||||||
|
#include "xmlelementcollection.h"
|
||||||
|
#include "../NameList/nameslist.h"
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QScopedPointer>
|
||||||
#include <QDrag>
|
#include <QDrag>
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
|
|
||||||
@@ -82,11 +87,7 @@ void ElementsTreeView::startElementDrag(const ElementsLocation &location)
|
|||||||
{
|
{
|
||||||
if (! location.exist()) return;
|
if (! location.exist()) return;
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 2, 0)
|
auto drag = new QDrag{this};
|
||||||
QDrag* drag = new QDrag(this);
|
|
||||||
#else
|
|
||||||
QScopedPointer<QDrag> drag(new QDrag(this));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QString location_str = location.toString();
|
QString location_str = location.toString();
|
||||||
QMimeData *mime_data = new QMimeData();
|
QMimeData *mime_data = new QMimeData();
|
||||||
@@ -95,9 +96,107 @@ void ElementsTreeView::startElementDrag(const ElementsLocation &location)
|
|||||||
if (location.isDirectory())
|
if (location.isDirectory())
|
||||||
{
|
{
|
||||||
mime_data->setData("application/x-qet-category-uri",
|
mime_data->setData("application/x-qet-category-uri",
|
||||||
location_str.toLatin1());
|
location_str.toLatin1());
|
||||||
drag->setPixmap(QET::Icons::Folder.pixmap(22, 22));
|
drag->setPixmap(QET::Icons::Folder.pixmap(22, 22));
|
||||||
}
|
}
|
||||||
|
else if (location.fileName().endsWith(".qetmak"))
|
||||||
|
{
|
||||||
|
mime_data->setData("application/x-qet-element-uri", location_str.toLatin1());
|
||||||
|
|
||||||
|
QPixmap macro_pixmap;
|
||||||
|
|
||||||
|
// --- MINI-RENDERER FÜR DAS MAKRO-VORSCHAUBILD ---
|
||||||
|
QFile file(location.fileSystemPath());
|
||||||
|
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
QDomDocument macro_doc;
|
||||||
|
if (macro_doc.setContent(&file)) {
|
||||||
|
QDomElement root = macro_doc.documentElement();
|
||||||
|
if (root.tagName() == "qet_macro") {
|
||||||
|
|
||||||
|
// 1. Unsichtbares Dummy-Projekt erstellen
|
||||||
|
QScopedPointer<QETProject> dummy_project(new QETProject());
|
||||||
|
|
||||||
|
// 2. Bauteile in das Dummy-Projekt laden (wie beim echten Drop)
|
||||||
|
QDomElement collection_node = root.firstChildElement("collection");
|
||||||
|
if (!collection_node.isNull()) {
|
||||||
|
QDomNodeList elements = collection_node.elementsByTagName("element");
|
||||||
|
for (int i = 0; i < elements.count(); ++i) {
|
||||||
|
QDomElement elmt_node = elements.at(i).toElement();
|
||||||
|
QString path = elmt_node.attribute("path");
|
||||||
|
QDomElement definition = elmt_node.firstChildElement("definition");
|
||||||
|
if (!path.isEmpty() && !definition.isNull()) {
|
||||||
|
int last_slash = path.lastIndexOf('/');
|
||||||
|
QString dir_path = (last_slash != -1) ? path.left(last_slash) : "";
|
||||||
|
QString file_name = (last_slash != -1) ? path.mid(last_slash + 1) : path;
|
||||||
|
|
||||||
|
if (!dir_path.isEmpty()) {
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
|
||||||
|
QStringList parts = dir_path.split('/', QString::SkipEmptyParts);
|
||||||
|
#else
|
||||||
|
QStringList parts = dir_path.split('/', Qt::SkipEmptyParts);
|
||||||
|
#endif
|
||||||
|
QString current_path = "";
|
||||||
|
for (const QString &part : parts) {
|
||||||
|
QString parent_path = current_path;
|
||||||
|
if (!current_path.isEmpty()) current_path += "/";
|
||||||
|
current_path += part;
|
||||||
|
if (current_path == "import") continue;
|
||||||
|
NamesList empty_names;
|
||||||
|
dummy_project->embeddedElementCollection()->createDir(parent_path, part, empty_names);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dummy_project->embeddedElementCollection()->addElementDefinition(dir_path, file_name, definition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Diagram *dummy_diagram = dummy_project->addNewDiagram();
|
||||||
|
|
||||||
|
// 4. Makro auf dem unsichtbaren Blatt zeichnen
|
||||||
|
QDomElement diagram_content_node = root.firstChildElement("diagram_content");
|
||||||
|
QDomElement diagram_node = diagram_content_node.firstChildElement("diagram");
|
||||||
|
if (!diagram_node.isNull()) {
|
||||||
|
QDomNodeList instances = diagram_node.elementsByTagName("element");
|
||||||
|
for (int i = 0; i < instances.count(); ++i) {
|
||||||
|
QDomElement inst = instances.at(i).toElement();
|
||||||
|
QString type = inst.attribute("type");
|
||||||
|
if (type.startsWith("macro://")) {
|
||||||
|
inst.setAttribute("type", type.replace("macro://", "embed://"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dummy_diagram->fromXml(diagram_node, QPointF(0, 0), false, nullptr);
|
||||||
|
dummy_diagram->clearSelection();
|
||||||
|
|
||||||
|
// 5. "Screenshot" (Pixmap) von den gezeichneten Elementen machen
|
||||||
|
QRectF scene_rect = dummy_diagram->itemsBoundingRect();
|
||||||
|
if (!scene_rect.isEmpty()) {
|
||||||
|
scene_rect.adjust(-5, -5, 5, 5); // Kleiner Rand
|
||||||
|
macro_pixmap = QPixmap(scene_rect.size().toSize());
|
||||||
|
macro_pixmap.fill(Qt::transparent); // Transparenter Hintergrund
|
||||||
|
|
||||||
|
QPainter painter(¯o_pixmap);
|
||||||
|
painter.setRenderHint(QPainter::Antialiasing);
|
||||||
|
dummy_diagram->render(&painter, macro_pixmap.rect(), scene_rect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (macro_pixmap.isNull()) {
|
||||||
|
macro_pixmap = QET::Icons::Project.pixmap(32, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bild verkleinern, falls das Makro gigantisch groß ist
|
||||||
|
if (macro_pixmap.width() > MAX_DND_PIXMAP_WIDTH || macro_pixmap.height() > MAX_DND_PIXMAP_HEIGHT) {
|
||||||
|
macro_pixmap = macro_pixmap.scaled(MAX_DND_PIXMAP_WIDTH, MAX_DND_PIXMAP_HEIGHT, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
}
|
||||||
|
|
||||||
|
drag->setPixmap(macro_pixmap);
|
||||||
|
// Bild zentriert an die Maus hängen
|
||||||
|
drag->setHotSpot(QPoint(macro_pixmap.width() / 2, macro_pixmap.height() / 2));
|
||||||
|
}
|
||||||
else if (location.isElement())
|
else if (location.isElement())
|
||||||
{
|
{
|
||||||
mime_data->setData("application/x-qet-element-uri",
|
mime_data->setData("application/x-qet-element-uri",
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ QString FileElementCollectionItem::dirPath() const
|
|||||||
*/
|
*/
|
||||||
bool FileElementCollectionItem::isDir() const
|
bool FileElementCollectionItem::isDir() const
|
||||||
{
|
{
|
||||||
if (m_path.endsWith(".elmt"))
|
if (m_path.endsWith(".elmt") || m_path.endsWith(".qetmak"))
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
return true;
|
return true;
|
||||||
@@ -110,9 +110,9 @@ bool FileElementCollectionItem::isElement() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief FileElementCollectionItem::localName
|
* @brief FileElementCollectionItem::localName
|
||||||
@return the located name of this item
|
* @return the located name of this item
|
||||||
*/
|
*/
|
||||||
QString FileElementCollectionItem::localName()
|
QString FileElementCollectionItem::localName()
|
||||||
{
|
{
|
||||||
if (!text().isNull())
|
if (!text().isNull())
|
||||||
@@ -120,12 +120,17 @@ QString FileElementCollectionItem::localName()
|
|||||||
|
|
||||||
else if (isDir()) {
|
else if (isDir()) {
|
||||||
if (isCollectionRoot()) {
|
if (isCollectionRoot()) {
|
||||||
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
|
||||||
if (m_path == QETApp::commonElementsDirN())
|
if (m_path == QETApp::commonElementsDirN())
|
||||||
setText(QObject::tr("Collection QET"));
|
setText(QObject::tr("Collection QET"));
|
||||||
else if (m_path == QETApp::companyElementsDirN())
|
else if (m_path == QETApp::companyElementsDirN())
|
||||||
setText(QObject::tr("Collection Company"));
|
setText(QObject::tr("Collection Company"));
|
||||||
else if (m_path == QETApp::customElementsDirN())
|
else if (m_path == QETApp::customElementsDirN())
|
||||||
setText(QObject::tr("Collection utilisateur"));
|
setText(QObject::tr("Collection utilisateur"));
|
||||||
|
else if (m_path == macrosPath)
|
||||||
|
setText(QObject::tr("Makros"));
|
||||||
else
|
else
|
||||||
setText(QObject::tr("Collection inconnue"));
|
setText(QObject::tr("Collection inconnue"));
|
||||||
}
|
}
|
||||||
@@ -136,7 +141,7 @@ QString FileElementCollectionItem::localName()
|
|||||||
if(docu.load_file(str.toStdString().c_str()))
|
if(docu.load_file(str.toStdString().c_str()))
|
||||||
{
|
{
|
||||||
if (QString(docu.document_element().name())
|
if (QString(docu.document_element().name())
|
||||||
== "qet-directory")
|
== "qet-directory")
|
||||||
{
|
{
|
||||||
NamesList nl;
|
NamesList nl;
|
||||||
nl.fromXml(docu.document_element());
|
nl.fromXml(docu.document_element());
|
||||||
@@ -147,7 +152,11 @@ QString FileElementCollectionItem::localName()
|
|||||||
}
|
}
|
||||||
else if (isElement()) {
|
else if (isElement()) {
|
||||||
ElementsLocation loc(collectionPath());
|
ElementsLocation loc(collectionPath());
|
||||||
setText(loc.name());
|
QString display_name = loc.name();
|
||||||
|
if (display_name.endsWith(".qetmak")) {
|
||||||
|
display_name.remove(".qetmak");
|
||||||
|
}
|
||||||
|
setText(display_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return text();
|
return text();
|
||||||
@@ -169,7 +178,11 @@ QString FileElementCollectionItem::localName(const ElementsLocation &location)
|
|||||||
localName();
|
localName();
|
||||||
}
|
}
|
||||||
else if (isElement()) {
|
else if (isElement()) {
|
||||||
setText(location.name());
|
QString display_name = location.name();
|
||||||
|
if (display_name.endsWith(".qetmak")) {
|
||||||
|
display_name.remove(".qetmak");
|
||||||
|
}
|
||||||
|
setText(display_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return text();
|
return text();
|
||||||
@@ -194,24 +207,29 @@ QString FileElementCollectionItem::name() const
|
|||||||
QString FileElementCollectionItem::collectionPath() const
|
QString FileElementCollectionItem::collectionPath() const
|
||||||
{
|
{
|
||||||
if (isCollectionRoot()) {
|
if (isCollectionRoot()) {
|
||||||
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
|
||||||
if (m_path == QETApp::commonElementsDirN())
|
if (m_path == QETApp::commonElementsDirN())
|
||||||
return "common://";
|
return "common://";
|
||||||
else if (m_path == QETApp::companyElementsDirN())
|
else if (m_path == QETApp::companyElementsDirN())
|
||||||
return "company://";
|
return "company://";
|
||||||
else
|
else if (m_path == macrosPath)
|
||||||
return "custom://";
|
return "macros://"; //
|
||||||
|
else
|
||||||
|
return "custom://";
|
||||||
}
|
}
|
||||||
else if (parent() && parent()->type()
|
else if (parent() && parent()->type()
|
||||||
== FileElementCollectionItem::Type) {
|
== FileElementCollectionItem::Type) {
|
||||||
ElementCollectionItem *eci =
|
ElementCollectionItem *eci =
|
||||||
static_cast<ElementCollectionItem*>(parent());
|
static_cast<ElementCollectionItem*>(parent());
|
||||||
if (eci->isCollectionRoot())
|
if (eci->isCollectionRoot())
|
||||||
return eci->collectionPath() + m_path;
|
return eci->collectionPath() + m_path;
|
||||||
else
|
else
|
||||||
return eci->collectionPath() % "/" % m_path;
|
return eci->collectionPath() % "/" % m_path;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -220,10 +238,14 @@ QString FileElementCollectionItem::collectionPath() const
|
|||||||
*/
|
*/
|
||||||
bool FileElementCollectionItem::isCollectionRoot() const
|
bool FileElementCollectionItem::isCollectionRoot() const
|
||||||
{
|
{
|
||||||
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
|
||||||
if (m_path == QETApp::commonElementsDirN()
|
if (m_path == QETApp::commonElementsDirN()
|
||||||
|| m_path == QETApp::companyElementsDirN()
|
|| m_path == QETApp::companyElementsDirN()
|
||||||
|| m_path == QETApp::customElementsDirN())
|
|| m_path == QETApp::customElementsDirN()
|
||||||
return true;
|
|| m_path == macrosPath)
|
||||||
|
return true;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -273,55 +295,63 @@ void FileElementCollectionItem::addChildAtPath(const QString &collection_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief FileElementCollectionItem::setUpData
|
* @brief FileElementCollectionItem::setUpData
|
||||||
SetUp the data of this item
|
* SetUp the data of this item
|
||||||
*/
|
*/
|
||||||
void FileElementCollectionItem::setUpData()
|
void FileElementCollectionItem::setUpData()
|
||||||
{
|
{
|
||||||
if (isDir())
|
if (isDir())
|
||||||
{
|
{
|
||||||
localName();
|
localName();
|
||||||
setFlags(Qt::ItemIsSelectable
|
setFlags(Qt::ItemIsSelectable
|
||||||
| Qt::ItemIsDragEnabled
|
| Qt::ItemIsDragEnabled
|
||||||
| Qt::ItemIsDropEnabled
|
| Qt::ItemIsDropEnabled
|
||||||
| Qt::ItemIsEnabled);
|
| Qt::ItemIsEnabled);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setFlags(Qt::ItemIsSelectable
|
setFlags(Qt::ItemIsSelectable
|
||||||
| Qt::ItemIsDragEnabled
|
| Qt::ItemIsDragEnabled
|
||||||
| Qt::ItemIsEnabled);
|
| Qt::ItemIsEnabled);
|
||||||
|
|
||||||
//Set the local name and all informations of the element
|
if (m_path.endsWith(".qetmak")) {
|
||||||
//in the data Qt::UserRole+1, these data will be use for search.
|
setData(localName());
|
||||||
ElementsLocation loc(collectionPath());
|
} else {
|
||||||
DiagramContext context = loc.elementInformations();
|
// Parse standard element information for search
|
||||||
QStringList search_list;
|
ElementsLocation loc(collectionPath());
|
||||||
for (QString& key : context.keys())
|
DiagramContext context = loc.elementInformations();
|
||||||
{ search_list.append(context.value(key).toString()); }
|
QStringList search_list;
|
||||||
search_list.append(localName(loc));
|
for (QString& key : context.keys())
|
||||||
setData(search_list.join(" "));
|
{ search_list.append(context.value(key).toString()); }
|
||||||
|
search_list.append(localName(loc));
|
||||||
|
setData(search_list.join(" "));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setToolTip(collectionPath());
|
setToolTip(collectionPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief FileElementCollectionItem::setUpIcon
|
* @brief FileElementCollectionItem::setUpIcon
|
||||||
SetUp the icon of this item.
|
* SetUp the icon of this item.
|
||||||
Because icon use several memory,
|
* Because icon use several memory,
|
||||||
we use this method for setup icon instead setUpData.
|
* we use this method for setup icon instead setUpData.
|
||||||
*/
|
*/
|
||||||
void FileElementCollectionItem::setUpIcon()
|
void FileElementCollectionItem::setUpIcon()
|
||||||
{
|
{
|
||||||
if (!icon().isNull())
|
if (!icon().isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (isCollectionRoot()) {
|
if (isCollectionRoot()) {
|
||||||
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
|
||||||
if (m_path == QETApp::commonElementsDirN())
|
if (m_path == QETApp::commonElementsDirN())
|
||||||
setIcon(QIcon(":/ico/16x16/qet.png"));
|
setIcon(QIcon(":/ico/16x16/qet.png"));
|
||||||
else if (m_path == QETApp::companyElementsDirN())
|
else if (m_path == QETApp::companyElementsDirN())
|
||||||
setIcon(QIcon(":/ico/16x16/go-company.png"));
|
setIcon(QIcon(":/ico/16x16/go-company.png"));
|
||||||
|
else if (m_path == macrosPath)
|
||||||
|
setIcon(QIcon(":/ico/16x16/go-home.png"));
|
||||||
else
|
else
|
||||||
setIcon(QIcon(":/ico/16x16/go-home.png"));
|
setIcon(QIcon(":/ico/16x16/go-home.png"));
|
||||||
}
|
}
|
||||||
@@ -330,8 +360,12 @@ void FileElementCollectionItem::setUpIcon()
|
|||||||
if (isDir()) {
|
if (isDir()) {
|
||||||
setIcon(QET::Icons::Folder);
|
setIcon(QET::Icons::Folder);
|
||||||
} else {
|
} else {
|
||||||
ElementsLocation loc(collectionPath());
|
if (m_path.endsWith(".qetmak")) {
|
||||||
setIcon(loc.icon());
|
setIcon(QET::Icons::PartRectangle);
|
||||||
|
} else {
|
||||||
|
ElementsLocation loc(collectionPath());
|
||||||
|
setIcon(loc.icon());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -347,13 +381,13 @@ void FileElementCollectionItem::setUpIcon()
|
|||||||
@param hide_element
|
@param hide_element
|
||||||
*/
|
*/
|
||||||
void FileElementCollectionItem::setPathName(const QString& path_name,
|
void FileElementCollectionItem::setPathName(const QString& path_name,
|
||||||
bool set_data,
|
bool set_data,
|
||||||
bool hide_element)
|
bool hide_element)
|
||||||
{
|
{
|
||||||
m_path = path_name;
|
m_path = path_name;
|
||||||
|
|
||||||
//This isn't an element, we create the childs
|
//This isn't an element or template, we create the childs
|
||||||
if (!path_name.endsWith(".elmt"))
|
if (!path_name.endsWith(".elmt") && !path_name.endsWith(".qetmak"))
|
||||||
populate(set_data, hide_element);
|
populate(set_data, hide_element);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,9 +416,9 @@ void FileElementCollectionItem::populate(bool set_data, bool hide_element)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
//Get all elmt file in this directory
|
//Get all elmt file in this directory
|
||||||
dir.setNameFilters(QStringList() << "*.elmt");
|
dir.setNameFilters(QStringList() << "*.elmt" << "*.qetmak");
|
||||||
for (auto& str :
|
for (auto& str :
|
||||||
dir.entryList(QDir::Files | QDir::NoDotAndDotDot, QDir::Name))
|
dir.entryList(QDir::Files | QDir::NoDotAndDotDot, QDir::Name))
|
||||||
{
|
{
|
||||||
FileElementCollectionItem *feci = new FileElementCollectionItem();
|
FileElementCollectionItem *feci = new FileElementCollectionItem();
|
||||||
appendRow(feci);
|
appendRow(feci);
|
||||||
@@ -393,3 +427,15 @@ void FileElementCollectionItem::populate(bool set_data, bool hide_element)
|
|||||||
feci->setUpData();
|
feci->setUpData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief FileElementCollectionItem::isMacrosCollection
|
||||||
|
* @return True if this item represent the macros collection
|
||||||
|
*/
|
||||||
|
bool FileElementCollectionItem::isMacrosCollection() const
|
||||||
|
{
|
||||||
|
QString macrosPath = QETApp::userMacrosDir();
|
||||||
|
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
|
||||||
|
|
||||||
|
return fileSystemPath().startsWith(macrosPath);
|
||||||
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ class FileElementCollectionItem : public ElementCollectionItem
|
|||||||
bool isCommonCollection() const;
|
bool isCommonCollection() const;
|
||||||
bool isCompanyCollection() const;
|
bool isCompanyCollection() const;
|
||||||
bool isCustomCollection() const;
|
bool isCustomCollection() const;
|
||||||
|
bool isMacrosCollection() const;
|
||||||
void addChildAtPath(const QString &collection_name) override;
|
void addChildAtPath(const QString &collection_name) override;
|
||||||
|
|
||||||
void setUpData() override;
|
void setUpData() override;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifndef NAMES_LIST_H
|
#ifndef NAMES_LIST_H
|
||||||
#define NAMES_LIST_H
|
#define NAMES_LIST_H
|
||||||
#include "pugixml/src/pugixml.hpp"
|
#include "pugixml.hpp"
|
||||||
|
|
||||||
#include <QtXml>
|
#include <QtXml>
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include "terminalstripdrawer.h"
|
#include "terminalstripdrawer.h"
|
||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
namespace TerminalStripDrawer {
|
namespace TerminalStripDrawer {
|
||||||
|
|
||||||
|
|||||||
@@ -130,12 +130,7 @@ bool PhysicalTerminal::setLevelOf(const QSharedPointer<RealTerminal> &terminal,
|
|||||||
const int i = m_real_terminal.indexOf(terminal);
|
const int i = m_real_terminal.indexOf(terminal);
|
||||||
if (i >= 0)
|
if (i >= 0)
|
||||||
{
|
{
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5,14,0)
|
m_real_terminal.swapItemsAt(i, std::min(static_cast<qsizetype>(level), m_real_terminal.size()-1));
|
||||||
m_real_terminal.swapItemsAt(i, std::min(level, m_real_terminal.size()-1));
|
|
||||||
#else
|
|
||||||
auto j = std::min(level, m_real_terminal.size()-1);
|
|
||||||
std::swap(m_real_terminal.begin()[i], m_real_terminal.begin()[j]);
|
|
||||||
#endif
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -64,11 +64,8 @@ bool TerminalStripData::fromXml(const QDomElement &xml_element)
|
|||||||
"due to wrong tag name. Expected " << this->xmlTagName() << " used " << xml_element.tagName();
|
"due to wrong tag name. Expected " << this->xmlTagName() << " used " << xml_element.tagName();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
|
||||||
m_uuid = QUuid::fromString(xml_element.attribute(QStringLiteral("uuid")));
|
m_uuid = QUuid::fromString(xml_element.attribute(QStringLiteral("uuid")));
|
||||||
#else
|
|
||||||
m_uuid = QUuid(xml_element.attribute(QStringLiteral("uuid")));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (auto &xml_info :
|
for (auto &xml_info :
|
||||||
QETXML::findInDomElement(xml_element.firstChildElement(QStringLiteral("informations")),
|
QETXML::findInDomElement(xml_element.firstChildElement(QStringLiteral("informations")),
|
||||||
|
|||||||
@@ -35,11 +35,7 @@ TerminalStripTreeDockWidget::TerminalStripTreeDockWidget(QETProject *project, QW
|
|||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setProject(project);
|
setProject(project);
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
|
|
||||||
ui->m_tree_view->expandRecursively(ui->m_tree_view->rootIndex());
|
ui->m_tree_view->expandRecursively(ui->m_tree_view->rootIndex());
|
||||||
#else
|
|
||||||
ui->m_tree_view->expandAll();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TerminalStripTreeDockWidget::~TerminalStripTreeDockWidget()
|
TerminalStripTreeDockWidget::~TerminalStripTreeDockWidget()
|
||||||
@@ -93,11 +89,7 @@ void TerminalStripTreeDockWidget::reload()
|
|||||||
|
|
||||||
buildTree();
|
buildTree();
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
|
|
||||||
ui->m_tree_view->expandRecursively(ui->m_tree_view->rootIndex());
|
ui->m_tree_view->expandRecursively(ui->m_tree_view->rootIndex());
|
||||||
#else
|
|
||||||
ui->m_tree_view->expandAll();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Reselect the tree widget item of the current edited strip
|
//Reselect the tree widget item of the current edited strip
|
||||||
auto item = m_item_strip_H.key(current_);
|
auto item = m_item_strip_H.key(current_);
|
||||||
|
|||||||
@@ -55,11 +55,7 @@ BorderTitleBlock::BorderTitleBlock(QObject *parent) :
|
|||||||
m_titleblock_template_renderer = new TitleBlockTemplateRenderer(this);
|
m_titleblock_template_renderer = new TitleBlockTemplateRenderer(this);
|
||||||
m_titleblock_template_renderer -> setTitleBlockTemplate(QETApp::defaultTitleBlockTemplate());
|
m_titleblock_template_renderer -> setTitleBlockTemplate(QETApp::defaultTitleBlockTemplate());
|
||||||
|
|
||||||
// disable the QPicture-based cache from Qt 4.8 to avoid rendering errors and crashes
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(4, 8, 0) // ### Qt 6: remove
|
|
||||||
#else
|
|
||||||
m_titleblock_template_renderer -> setUseCache(false);
|
m_titleblock_template_renderer -> setUseCache(false);
|
||||||
#endif
|
|
||||||
|
|
||||||
// dimensions par defaut du schema
|
// dimensions par defaut du schema
|
||||||
importBorder(BorderProperties());
|
importBorder(BorderProperties());
|
||||||
|
|||||||
@@ -72,14 +72,7 @@ bool ConductorNumExport::toCsv()
|
|||||||
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
|
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
QTextStream stream(&file);
|
QTextStream stream(&file);
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) // ### Qt 6: remove
|
|
||||||
stream << wiresNum() << endl;
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 5.15 or later")
|
|
||||||
#endif
|
|
||||||
stream << wiresNum() << &Qt::endl(stream);
|
stream << wiresNum() << &Qt::endl(stream);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -811,14 +811,7 @@ void ConductorProperties::readStyle(const QString &style_string) {
|
|||||||
if (style_string.isEmpty()) return;
|
if (style_string.isEmpty()) return;
|
||||||
|
|
||||||
// recupere la liste des couples style / valeur
|
// recupere la liste des couples style / valeur
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
|
||||||
QStringList styles = style_string.split(";", QString::SkipEmptyParts);
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code QString::SkipEmptyParts for QT 5.14 or later")
|
|
||||||
#endif
|
|
||||||
QStringList styles = style_string.split(";", Qt::SkipEmptyParts);
|
QStringList styles = style_string.split(";", Qt::SkipEmptyParts);
|
||||||
#endif
|
|
||||||
|
|
||||||
QRegularExpression Rx("^(?<name>[a-z-]+): (?<value>[a-z-]+)$");
|
QRegularExpression Rx("^(?<name>[a-z-]+): (?<value>[a-z-]+)$");
|
||||||
if (!Rx.isValid())
|
if (!Rx.isValid())
|
||||||
|
|||||||
@@ -47,14 +47,8 @@ ElementQueryWidget::ElementQueryWidget(QWidget *parent) :
|
|||||||
m_button_group.addButton(ui->m_coil_cb, 4);
|
m_button_group.addButton(ui->m_coil_cb, 4);
|
||||||
m_button_group.addButton(ui->m_protection_cb, 5);
|
m_button_group.addButton(ui->m_protection_cb, 5);
|
||||||
m_button_group.addButton(ui->m_thumbnail_cb, 6);
|
m_button_group.addButton(ui->m_thumbnail_cb, 6);
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) // ### Qt 6: remove
|
|
||||||
connect(&m_button_group, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), [this](int id)
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 5.15 or later")
|
|
||||||
#endif
|
|
||||||
connect(&m_button_group, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::idClicked), [this](int id)
|
connect(&m_button_group, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::idClicked), [this](int id)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
auto check_box = static_cast<QCheckBox *>(m_button_group.button(0));
|
auto check_box = static_cast<QCheckBox *>(m_button_group.button(0));
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
|
|||||||
@@ -1514,14 +1514,6 @@ bool Diagram::fromXml(QDomElement &document,
|
|||||||
if (content_ptr) {
|
if (content_ptr) {
|
||||||
content_ptr -> m_elements = added_elements;
|
content_ptr -> m_elements = added_elements;
|
||||||
content_ptr -> m_conductors_to_move = added_conductors;
|
content_ptr -> m_conductors_to_move = added_conductors;
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
|
|
||||||
content_ptr -> m_text_fields = added_texts.toSet();
|
|
||||||
content_ptr -> m_images = added_images.toSet();
|
|
||||||
content_ptr -> m_shapes = added_shapes.toSet();
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 5.14 or later")
|
|
||||||
#endif
|
|
||||||
content_ptr -> m_text_fields = QSet<IndependentTextItem *>(
|
content_ptr -> m_text_fields = QSet<IndependentTextItem *>(
|
||||||
added_texts.begin(),
|
added_texts.begin(),
|
||||||
added_texts.end());
|
added_texts.end());
|
||||||
@@ -1532,7 +1524,6 @@ bool Diagram::fromXml(QDomElement &document,
|
|||||||
added_shapes.begin(),
|
added_shapes.begin(),
|
||||||
added_shapes.end());
|
added_shapes.end());
|
||||||
content_ptr->m_terminal_strip.swap(added_strips);
|
content_ptr->m_terminal_strip.swap(added_strips);
|
||||||
#endif
|
|
||||||
content_ptr->m_tables.swap(added_tables);
|
content_ptr->m_tables.swap(added_tables);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifndef DIAGRAM_CONTEXT_H
|
#ifndef DIAGRAM_CONTEXT_H
|
||||||
#define DIAGRAM_CONTEXT_H
|
#define DIAGRAM_CONTEXT_H
|
||||||
#include "pugixml/src/pugixml.hpp"
|
#include "pugixml.hpp"
|
||||||
|
|
||||||
#include <QDomElement>
|
#include <QDomElement>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
|||||||
@@ -0,0 +1,257 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006-2026 The QElectroTech Team
|
||||||
|
* This file is part of QElectroTech.
|
||||||
|
*/
|
||||||
|
#include "diagrameventaddmacro.h"
|
||||||
|
|
||||||
|
#include "../diagram.h"
|
||||||
|
#include "../qetapp.h"
|
||||||
|
#include "../qetdiagrameditor.h"
|
||||||
|
#include "../qetproject.h"
|
||||||
|
#include "../ElementsCollection/xmlelementcollection.h"
|
||||||
|
#include "../NameList/nameslist.h"
|
||||||
|
#include "../diagramcommands.h"
|
||||||
|
#include "../diagramcontent.h"
|
||||||
|
#include <QFile>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
|
#include <QStatusBar>
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
DiagramEventAddMacro::DiagramEventAddMacro(const ElementsLocation &location, Diagram *diagram, QPointF pos) :
|
||||||
|
DiagramEventInterface(diagram),
|
||||||
|
m_location(location),
|
||||||
|
m_preview_item(nullptr)
|
||||||
|
{
|
||||||
|
if (loadMacro()) {
|
||||||
|
init();
|
||||||
|
|
||||||
|
QScopedPointer<QETProject> dummy_project(new QETProject());
|
||||||
|
QDomElement root = m_macro_doc.documentElement();
|
||||||
|
|
||||||
|
QDomElement collection_node = root.firstChildElement("collection");
|
||||||
|
if (!collection_node.isNull()) {
|
||||||
|
QDomNodeList elements = collection_node.elementsByTagName("element");
|
||||||
|
for (int i = 0; i < elements.count(); ++i) {
|
||||||
|
QDomElement elmt_node = elements.at(i).toElement();
|
||||||
|
QString path = elmt_node.attribute("path");
|
||||||
|
QDomElement definition = elmt_node.firstChildElement("definition");
|
||||||
|
|
||||||
|
if (!path.isEmpty() && !definition.isNull()) {
|
||||||
|
int last_slash = path.lastIndexOf('/');
|
||||||
|
QString dir_path = (last_slash != -1) ? path.left(last_slash) : "";
|
||||||
|
QString file_name = (last_slash != -1) ? path.mid(last_slash + 1) : path;
|
||||||
|
|
||||||
|
if (!dir_path.isEmpty()) {
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
|
||||||
|
QStringList parts = dir_path.split('/', QString::SkipEmptyParts);
|
||||||
|
#else
|
||||||
|
QStringList parts = dir_path.split('/', Qt::SkipEmptyParts);
|
||||||
|
#endif
|
||||||
|
QString current_path = "";
|
||||||
|
for (const QString &part : parts) {
|
||||||
|
QString parent_path = current_path;
|
||||||
|
if (!current_path.isEmpty()) current_path += "/";
|
||||||
|
current_path += part;
|
||||||
|
if (current_path == "import") continue;
|
||||||
|
NamesList empty_names;
|
||||||
|
dummy_project->embeddedElementCollection()->createDir(parent_path, part, empty_names);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dummy_project->embeddedElementCollection()->addElementDefinition(dir_path, file_name, definition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Diagram *dummy_diagram = dummy_project->addNewDiagram();
|
||||||
|
QDomElement diagram_node = root.firstChildElement("diagram_content").firstChildElement("diagram");
|
||||||
|
|
||||||
|
if (!diagram_node.isNull()) {
|
||||||
|
dummy_diagram->fromXml(diagram_node, QPointF(0, 0), false, nullptr);
|
||||||
|
|
||||||
|
QRectF scene_rect = dummy_diagram->itemsBoundingRect();
|
||||||
|
if (!scene_rect.isEmpty()) {
|
||||||
|
QPixmap pixmap(scene_rect.toAlignedRect().size());
|
||||||
|
pixmap.fill(Qt::transparent);
|
||||||
|
QPainter painter(&pixmap);
|
||||||
|
painter.setRenderHint(QPainter::Antialiasing);
|
||||||
|
dummy_diagram->render(&painter, QRectF(QPointF(0,0), scene_rect.size()), scene_rect);
|
||||||
|
|
||||||
|
m_preview_item = new QGraphicsPixmapItem(pixmap);
|
||||||
|
m_preview_item->setOffset(scene_rect.topLeft());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_preview_item) {
|
||||||
|
m_preview_item->setPos(Diagram::snapToGrid(pos));
|
||||||
|
m_preview_item->setOpacity(0.6);
|
||||||
|
m_diagram->addItem(m_preview_item);
|
||||||
|
m_running = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!diagram->views().isEmpty()) {
|
||||||
|
const auto qde = QETApp::diagramEditorAncestorOf(diagram->views().at(0));
|
||||||
|
if (qde) {
|
||||||
|
m_status_bar = qde->statusBar();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_status_bar.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DiagramEventAddMacro::~DiagramEventAddMacro()
|
||||||
|
{
|
||||||
|
if (m_preview_item) {
|
||||||
|
m_diagram->removeItem(m_preview_item);
|
||||||
|
delete m_preview_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_status_bar) {
|
||||||
|
m_status_bar->clearMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto view : m_diagram->views())
|
||||||
|
view->setContextMenuPolicy(Qt::DefaultContextMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiagramEventAddMacro::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
if (m_preview_item) {
|
||||||
|
const auto pos_{Diagram::snapToGrid(event->scenePos())};
|
||||||
|
m_preview_item->setPos(pos_);
|
||||||
|
|
||||||
|
if (m_status_bar) {
|
||||||
|
m_status_bar->showMessage(QString("x %1 : y %2 (Makro-Anker)").arg(QString::number(pos_.x()), QString::number(pos_.y())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event->setAccepted(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiagramEventAddMacro::mousePressEvent(QGraphicsSceneMouseEvent *event) {
|
||||||
|
event->setAccepted(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiagramEventAddMacro::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
if (m_preview_item) {
|
||||||
|
if (event->button() == Qt::RightButton) {
|
||||||
|
m_diagram->removeItem(m_preview_item);
|
||||||
|
delete m_preview_item;
|
||||||
|
m_preview_item = nullptr;
|
||||||
|
m_running = false;
|
||||||
|
emit finish();
|
||||||
|
}
|
||||||
|
else if (event->button() == Qt::LeftButton) {
|
||||||
|
addMacro(Diagram::snapToGrid(event->scenePos()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event->setAccepted(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiagramEventAddMacro::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
if (m_preview_item && (event->button() == Qt::LeftButton)) {
|
||||||
|
m_diagram->removeItem(m_preview_item);
|
||||||
|
delete m_preview_item;
|
||||||
|
m_preview_item = nullptr;
|
||||||
|
m_running = false;
|
||||||
|
emit finish();
|
||||||
|
}
|
||||||
|
event->setAccepted(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiagramEventAddMacro::keyPressEvent(QKeyEvent *event)
|
||||||
|
{
|
||||||
|
DiagramEventInterface::keyPressEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiagramEventAddMacro::init()
|
||||||
|
{
|
||||||
|
foreach(QGraphicsView *view, m_diagram->views())
|
||||||
|
view->setContextMenuPolicy(Qt::NoContextMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DiagramEventAddMacro::loadMacro()
|
||||||
|
{
|
||||||
|
QFile file(m_location.fileSystemPath());
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
qDebug() << "Error: Macro file could not be read:" << m_location.fileSystemPath();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_macro_doc.setContent(&file)) {
|
||||||
|
qDebug() << "Error: Invalid XML in macro.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDomElement root = m_macro_doc.documentElement();
|
||||||
|
if (root.tagName() != "qet_macro") return false;
|
||||||
|
|
||||||
|
QDomElement collection_node = root.firstChildElement("collection");
|
||||||
|
if (!collection_node.isNull()) {
|
||||||
|
QDomNodeList elements = collection_node.elementsByTagName("element");
|
||||||
|
for (int i = 0; i < elements.count(); ++i) {
|
||||||
|
QDomElement elmt_node = elements.at(i).toElement();
|
||||||
|
QString path = elmt_node.attribute("path");
|
||||||
|
QDomElement definition = elmt_node.firstChildElement("definition");
|
||||||
|
|
||||||
|
if (!path.isEmpty() && !definition.isNull()) {
|
||||||
|
int last_slash = path.lastIndexOf('/');
|
||||||
|
QString dir_path = (last_slash != -1) ? path.left(last_slash) : "";
|
||||||
|
QString file_name = (last_slash != -1) ? path.mid(last_slash + 1) : path;
|
||||||
|
|
||||||
|
if (!dir_path.isEmpty()) {
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
|
||||||
|
QStringList parts = dir_path.split('/', QString::SkipEmptyParts);
|
||||||
|
#else
|
||||||
|
QStringList parts = dir_path.split('/', Qt::SkipEmptyParts);
|
||||||
|
#endif
|
||||||
|
QString current_path = "";
|
||||||
|
for (const QString &part : parts) {
|
||||||
|
QString parent_path = current_path;
|
||||||
|
if (!current_path.isEmpty()) current_path += "/";
|
||||||
|
current_path += part;
|
||||||
|
if (current_path == "import") continue;
|
||||||
|
NamesList empty_names;
|
||||||
|
m_diagram->project()->embeddedElementCollection()->createDir(parent_path, part, empty_names);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_diagram->project()->embeddedElementCollection()->addElementDefinition(dir_path, file_name, definition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QDomElement diagram_node = root.firstChildElement("diagram_content").firstChildElement("diagram");
|
||||||
|
if (!diagram_node.isNull()) {
|
||||||
|
QDomNodeList instances = diagram_node.elementsByTagName("element");
|
||||||
|
for (int i = 0; i < instances.count(); ++i) {
|
||||||
|
QDomElement inst = instances.at(i).toElement();
|
||||||
|
QString type = inst.attribute("type");
|
||||||
|
if (type.startsWith("macro://")) {
|
||||||
|
inst.setAttribute("type", type.replace("macro://", "embed://"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiagramEventAddMacro::addMacro(QPointF final_pos)
|
||||||
|
{
|
||||||
|
QDomElement root = m_macro_doc.documentElement();
|
||||||
|
QDomElement diagram_node = root.firstChildElement("diagram_content").firstChildElement("diagram");
|
||||||
|
|
||||||
|
if (!diagram_node.isNull()) {
|
||||||
|
QDomElement cloned_node = diagram_node.cloneNode(true).toElement();
|
||||||
|
|
||||||
|
QPointF target_pos = final_pos;
|
||||||
|
|
||||||
|
DiagramContent pasted_content;
|
||||||
|
|
||||||
|
m_diagram->fromXml(cloned_node, target_pos, false, &pasted_content);
|
||||||
|
m_diagram->refreshContents();
|
||||||
|
|
||||||
|
m_diagram->undoStack().push(new PasteDiagramCommand(m_diagram, pasted_content));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
C opyright 2006-2026 The QEle*ctroTech Team
|
||||||
|
This file is part of QElectroTech.
|
||||||
|
*/
|
||||||
|
#ifndef DIAGRAMEVENTADDMACRO_H
|
||||||
|
#define DIAGRAMEVENTADDMACRO_H
|
||||||
|
|
||||||
|
#include "../ElementsCollection/elementslocation.h"
|
||||||
|
#include "diagrameventinterface.h"
|
||||||
|
|
||||||
|
#include <QDomDocument>
|
||||||
|
#include <QGraphicsPixmapItem>
|
||||||
|
|
||||||
|
class QStatusBar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The DiagramEventAddMacro class
|
||||||
|
*/
|
||||||
|
class DiagramEventAddMacro : public DiagramEventInterface
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
DiagramEventAddMacro(const ElementsLocation &location, Diagram *diagram, QPointF pos = QPointF(0,0));
|
||||||
|
~DiagramEventAddMacro() override;
|
||||||
|
|
||||||
|
void mouseMoveEvent (QGraphicsSceneMouseEvent *event) override;
|
||||||
|
void mousePressEvent (QGraphicsSceneMouseEvent *event) override;
|
||||||
|
void mouseReleaseEvent (QGraphicsSceneMouseEvent *event) override;
|
||||||
|
void mouseDoubleClickEvent (QGraphicsSceneMouseEvent *event) override;
|
||||||
|
void keyPressEvent (QKeyEvent *event) override;
|
||||||
|
void init() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool loadMacro();
|
||||||
|
void addMacro(QPointF final_pos);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ElementsLocation m_location;
|
||||||
|
QDomDocument m_macro_doc;
|
||||||
|
QGraphicsPixmapItem *m_preview_item;
|
||||||
|
QPointer<QStatusBar> m_status_bar;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DIAGRAMEVENTADDMACRO_H
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "QPropertyUndoCommand/qpropertyundocommand.h"
|
#include "QPropertyUndoCommand/qpropertyundocommand.h"
|
||||||
#include "diagramcommands.h"
|
#include "diagramcommands.h"
|
||||||
#include "diagramevent/diagrameventaddelement.h"
|
#include "diagramevent/diagrameventaddelement.h"
|
||||||
|
#include "diagramevent/diagrameventaddmacro.h"
|
||||||
#include "dvevent/dveventinterface.h"
|
#include "dvevent/dveventinterface.h"
|
||||||
#include "projectview.h"
|
#include "projectview.h"
|
||||||
#include "qetdiagrameditor.h"
|
#include "qetdiagrameditor.h"
|
||||||
@@ -34,7 +35,9 @@
|
|||||||
#include "utils/conductorcreator.h"
|
#include "utils/conductorcreator.h"
|
||||||
#include "undocommand/addgraphicsobjectcommand.h"
|
#include "undocommand/addgraphicsobjectcommand.h"
|
||||||
#include "diagram.h"
|
#include "diagram.h"
|
||||||
|
#include "ElementsCollection/xmlelementcollection.h"
|
||||||
|
#include "NameList/nameslist.h"
|
||||||
|
#include "elementdialog.h"
|
||||||
#include <QDropEvent>
|
#include <QDropEvent>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,6 +87,10 @@ DiagramView::DiagramView(Diagram *diagram, QWidget *parent) :
|
|||||||
d.exec();
|
d.exec();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Setup the action to create a template
|
||||||
|
m_create_template = new QAction(tr("Créer un template", "context menu action"), this);
|
||||||
|
connect(m_create_template, SIGNAL(triggered()), this, SLOT(createTemplateFromSelection()));
|
||||||
|
|
||||||
//setup three separators, to be use in context menu
|
//setup three separators, to be use in context menu
|
||||||
for(int i=0 ; i<3 ; ++i)
|
for(int i=0 ; i<3 ; ++i)
|
||||||
{
|
{
|
||||||
@@ -188,13 +195,13 @@ void DiagramView::dropEvent(QDropEvent *e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief DiagramView::handleElementDrop
|
* @brief DiagramView::handleElementDrop
|
||||||
Handle the drop of an element.
|
* Handle the drop of an element.
|
||||||
@param event the QDropEvent describing the current drag'n drop
|
* @param event the QDropEvent describing the current drag'n drop
|
||||||
*/
|
*/
|
||||||
void DiagramView::handleElementDrop(QDropEvent *event)
|
void DiagramView::handleElementDrop(QDropEvent *event)
|
||||||
{
|
{
|
||||||
//Build an element from the text of the mime data
|
//Build an element from the text of the mime data
|
||||||
ElementsLocation location(event->mimeData()->text());
|
ElementsLocation location(event->mimeData()->text());
|
||||||
|
|
||||||
if ( !(location.isElement() && location.exist()) )
|
if ( !(location.isElement() && location.exist()) )
|
||||||
@@ -203,20 +210,13 @@ void DiagramView::handleElementDrop(QDropEvent *event)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
|
if (location.path().endsWith(".qetmak")) {
|
||||||
diagram()->setEventInterface(
|
diagram()->setEventInterface(new DiagramEventAddMacro(location, diagram(), event->position()));
|
||||||
new DiagramEventAddElement(
|
} else {
|
||||||
location, diagram(), mapToScene(event->pos())));
|
diagram()->setEventInterface(new DiagramEventAddElement(location, diagram(), event->position()));
|
||||||
#else
|
}
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 6 or later")
|
|
||||||
#endif
|
|
||||||
diagram()->setEventInterface(
|
|
||||||
new DiagramEventAddElement(
|
|
||||||
location, diagram(), event->position()));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Set focus to the view to get event
|
//Set focus to the view to get event
|
||||||
this->setFocus();
|
this->setFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,17 +283,8 @@ void DiagramView::handleTextDrop(QDropEvent *e) {
|
|||||||
iti -> setHtml (e -> mimeData() -> text());
|
iti -> setHtml (e -> mimeData() -> text());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
|
|
||||||
|
|
||||||
m_diagram->undoStack().push(new AddGraphicsObjectCommand(
|
|
||||||
iti, m_diagram, mapToScene(e->pos())));
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 6 or later")
|
|
||||||
#endif
|
|
||||||
m_diagram->undoStack().push(new AddGraphicsObjectCommand(
|
m_diagram->undoStack().push(new AddGraphicsObjectCommand(
|
||||||
iti, m_diagram, e->position()));
|
iti, m_diagram, e->position()));
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -451,14 +442,7 @@ void DiagramView::mousePressEvent(QMouseEvent *e)
|
|||||||
if (m_event_interface && m_event_interface->mousePressEvent(e)) return;
|
if (m_event_interface && m_event_interface->mousePressEvent(e)) return;
|
||||||
|
|
||||||
//Start drag view when hold the middle button
|
//Start drag view when hold the middle button
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 1) // ### Qt 6: remove
|
|
||||||
if (e->button() == Qt::MidButton)
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 6 or later")
|
|
||||||
#endif
|
|
||||||
if (e->button() == Qt::MiddleButton)
|
if (e->button() == Qt::MiddleButton)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
m_drag_last_pos = e->pos();
|
m_drag_last_pos = e->pos();
|
||||||
viewport()->setCursor(Qt::ClosedHandCursor);
|
viewport()->setCursor(Qt::ClosedHandCursor);
|
||||||
@@ -508,14 +492,7 @@ void DiagramView::mouseMoveEvent(QMouseEvent *e)
|
|||||||
if (m_event_interface && m_event_interface->mouseMoveEvent(e)) return;
|
if (m_event_interface && m_event_interface->mouseMoveEvent(e)) return;
|
||||||
|
|
||||||
// Drag the view
|
// Drag the view
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 1) // ### Qt 6: remove
|
|
||||||
if (e->buttons() == Qt::MidButton)
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 6 or later")
|
|
||||||
#endif
|
|
||||||
if (e->buttons() == Qt::MiddleButton)
|
if (e->buttons() == Qt::MiddleButton)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
QScrollBar *h = horizontalScrollBar();
|
QScrollBar *h = horizontalScrollBar();
|
||||||
QScrollBar *v = verticalScrollBar();
|
QScrollBar *v = verticalScrollBar();
|
||||||
@@ -576,14 +553,7 @@ void DiagramView::mouseReleaseEvent(QMouseEvent *e)
|
|||||||
if (m_event_interface && m_event_interface->mouseReleaseEvent(e)) return;
|
if (m_event_interface && m_event_interface->mouseReleaseEvent(e)) return;
|
||||||
|
|
||||||
// Stop drag view
|
// Stop drag view
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 1) // ### Qt 6: remove
|
|
||||||
if (e->button() == Qt::MidButton)
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 6 or later")
|
|
||||||
#endif
|
|
||||||
if (e->button() == Qt::MiddleButton)
|
if (e->button() == Qt::MiddleButton)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
viewport()->setCursor(Qt::ArrowCursor);
|
viewport()->setCursor(Qt::ArrowCursor);
|
||||||
}
|
}
|
||||||
@@ -617,14 +587,7 @@ void DiagramView::mouseReleaseEvent(QMouseEvent *e)
|
|||||||
QMenu *menu = new QMenu(this);
|
QMenu *menu = new QMenu(this);
|
||||||
menu->addAction(act);
|
menu->addAction(act);
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
|
|
||||||
menu->popup(e->globalPos());
|
|
||||||
#else
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO remove code for QT 6 or later")
|
|
||||||
#endif
|
|
||||||
menu->popup(e->pos());
|
menu->popup(e->pos());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_free_rubberbanding = false;
|
m_free_rubberbanding = false;
|
||||||
@@ -1202,6 +1165,7 @@ QList<QAction *> DiagramView::contextMenuActions() const
|
|||||||
list << qde->m_copy;
|
list << qde->m_copy;
|
||||||
list << m_multi_paste;
|
list << m_multi_paste;
|
||||||
list << m_separators.at(0);
|
list << m_separators.at(0);
|
||||||
|
list << m_create_template; // Add the create template action
|
||||||
list << qde->m_conductor_reset;
|
list << qde->m_conductor_reset;
|
||||||
list << m_separators.at(1);
|
list << m_separators.at(1);
|
||||||
list << qde->m_selection_actions_group.actions();
|
list << qde->m_selection_actions_group.actions();
|
||||||
@@ -1265,6 +1229,100 @@ void DiagramView::contextMenuEvent(QContextMenuEvent *e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DiagramView::createTemplateFromSelection
|
||||||
|
* Triggered from the context menu to create a new template (macro) from the current selection.
|
||||||
|
*/
|
||||||
|
void DiagramView::createTemplateFromSelection()
|
||||||
|
{
|
||||||
|
QList<QGraphicsItem *> selected_elements = m_diagram->selectedItems();
|
||||||
|
|
||||||
|
if (selected_elements.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "Ready to create a template from" << selected_elements.size() << "elements!";
|
||||||
|
|
||||||
|
// Open the dialog to let the user select where to save the .qetmak file
|
||||||
|
ElementsLocation template_location = ElementDialog::getSaveTemplateLocation(this);
|
||||||
|
|
||||||
|
// Check if the user clicked 'Cancel' or closed the window
|
||||||
|
if (template_location.isNull()) {
|
||||||
|
qDebug() << "User canceled template creation.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "Will save template to:" << template_location.path();
|
||||||
|
|
||||||
|
QDomDocument content_xml = m_diagram->toXml(false, true);
|
||||||
|
|
||||||
|
QDomDocument macro_doc;
|
||||||
|
QDomElement root = macro_doc.createElement("qet_macro");
|
||||||
|
macro_doc.appendChild(root);
|
||||||
|
|
||||||
|
QDomElement collection_node = macro_doc.createElement("collection");
|
||||||
|
root.appendChild(collection_node);
|
||||||
|
|
||||||
|
QSet<QString> processed_types;
|
||||||
|
|
||||||
|
QDomNodeList element_nodes = content_xml.elementsByTagName("element");
|
||||||
|
for (int i = 0; i < element_nodes.count(); ++i) {
|
||||||
|
QDomElement elmt_node = element_nodes.at(i).toElement();
|
||||||
|
QString old_type = elmt_node.attribute("type");
|
||||||
|
|
||||||
|
if (old_type.isEmpty()) continue;
|
||||||
|
|
||||||
|
ElementsLocation loc(old_type, m_diagram->project());
|
||||||
|
|
||||||
|
QString clean_path = loc.collectionPath(false);
|
||||||
|
|
||||||
|
QString new_type = "macro://" + clean_path;
|
||||||
|
elmt_node.setAttribute("type", new_type);
|
||||||
|
|
||||||
|
if (!processed_types.contains(clean_path)) {
|
||||||
|
processed_types.insert(clean_path);
|
||||||
|
|
||||||
|
QDomElement definition_node = loc.xml();
|
||||||
|
|
||||||
|
if (!definition_node.isNull()) {
|
||||||
|
QDomElement collection_elmt = macro_doc.createElement("element");
|
||||||
|
collection_elmt.setAttribute("path", clean_path);
|
||||||
|
|
||||||
|
QDomNode imported_def = macro_doc.importNode(definition_node, true);
|
||||||
|
collection_elmt.appendChild(imported_def);
|
||||||
|
|
||||||
|
collection_node.appendChild(collection_elmt);
|
||||||
|
} else {
|
||||||
|
qDebug() << "Warnung: Konnte XML-Definition für" << old_type << "nicht laden.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QDomElement content_container = macro_doc.createElement("diagram_content");
|
||||||
|
root.appendChild(content_container);
|
||||||
|
|
||||||
|
QDomNode imported_node = macro_doc.importNode(content_xml.documentElement(), true);
|
||||||
|
content_container.appendChild(imported_node);
|
||||||
|
|
||||||
|
QString full_path = template_location.fileSystemPath();
|
||||||
|
|
||||||
|
QDir().mkpath(QFileInfo(full_path).absolutePath());
|
||||||
|
|
||||||
|
QFile file(full_path);
|
||||||
|
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||||
|
QTextStream out(&file);
|
||||||
|
out << macro_doc.toString(4);
|
||||||
|
file.close();
|
||||||
|
qDebug() << "Template successfully saved to:" << full_path;
|
||||||
|
|
||||||
|
QMessageBox::information(this, tr("Modèle enregistré"),
|
||||||
|
tr("Le modèle a été enregistré avec succès sous :\n%1").arg(full_path));
|
||||||
|
} else {
|
||||||
|
qDebug() << "Error: Could not open file for writing:" << full_path;
|
||||||
|
QMessageBox::critical(this, tr("Erreur"), tr("Le fichier n'a pas pu être écrit."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@return l'editeur de schemas parent ou 0
|
@return l'editeur de schemas parent ou 0
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
#ifndef DIAGRAMVIEW_H
|
#ifndef DIAGRAMVIEW_H
|
||||||
#define DIAGRAMVIEW_H
|
#define DIAGRAMVIEW_H
|
||||||
|
|
||||||
#include "ElementsCollection/elementslocation.h"
|
#include "../ElementsCollection/elementslocation.h"
|
||||||
#include "titleblock/templatelocation.h"
|
#include "titleblock/templatelocation.h"
|
||||||
|
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
@@ -53,6 +53,7 @@ class DiagramView : public QGraphicsView
|
|||||||
DVEventInterface *m_event_interface = nullptr;
|
DVEventInterface *m_event_interface = nullptr;
|
||||||
QAction *m_paste_here = nullptr;
|
QAction *m_paste_here = nullptr;
|
||||||
QAction *m_multi_paste = nullptr;
|
QAction *m_multi_paste = nullptr;
|
||||||
|
QAction *m_create_template = nullptr;
|
||||||
QPoint m_paste_here_pos;
|
QPoint m_paste_here_pos;
|
||||||
QPointF m_drag_last_pos;
|
QPointF m_drag_last_pos;
|
||||||
bool m_fresh_focus_in,
|
bool m_fresh_focus_in,
|
||||||
@@ -133,5 +134,6 @@ class DiagramView : public QGraphicsView
|
|||||||
private slots:
|
private slots:
|
||||||
void adjustGridToZoom();
|
void adjustGridToZoom();
|
||||||
void applyReadOnly();
|
void applyReadOnly();
|
||||||
|
void createTemplateFromSelection();
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||