diff --git a/CMakeLists.txt b/CMakeLists.txt index 120f53a40..4e736c6a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,18 @@ if(WIN32) ${QET_DIR}/qelectrotech.qrc ${QET_DIR}/ico/icon-themes.qrc ) + # Our own manifest (it declares longPathAware). MSVC merges a .manifest + # listed as a source; MinGW needs it embedded through a resource file, + # and ld then keeps it ahead of the toolchain's default manifest. + set(QET_MANIFEST_FILE ${QET_DIR}/build-aux/windows/qelectrotech.exe.manifest) + if(MSVC) + target_sources(${PROJECT_NAME} PRIVATE ${QET_MANIFEST_FILE}) + else() + configure_file(${QET_DIR}/build-aux/windows/qelectrotech-manifest.rc.in + ${CMAKE_CURRENT_BINARY_DIR}/qelectrotech-manifest.rc @ONLY) + target_sources(${PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/qelectrotech-manifest.rc) + endif() else() add_executable( ${PROJECT_NAME} diff --git a/build-aux/windows/qelectrotech-manifest.rc.in b/build-aux/windows/qelectrotech-manifest.rc.in new file mode 100644 index 000000000..54304e875 --- /dev/null +++ b/build-aux/windows/qelectrotech-manifest.rc.in @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// Embeds qelectrotech.exe.manifest as the program's manifest +// (resource id 1 = CREATEPROCESS_MANIFEST_RESOURCE_ID, type 24 = RT_MANIFEST). +1 24 "@QET_MANIFEST_FILE@" diff --git a/build-aux/windows/qelectrotech.exe.manifest b/build-aux/windows/qelectrotech.exe.manifest new file mode 100644 index 000000000..1aa9ef544 --- /dev/null +++ b/build-aux/windows/qelectrotech.exe.manifest @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake index 66a810712..efe2f1992 100644 --- a/cmake/qet_compilation_vars.cmake +++ b/cmake/qet_compilation_vars.cmake @@ -179,6 +179,8 @@ set(QET_SRC_FILES ${QET_DIR}/sources/wiringlistexport.cpp ${QET_DIR}/sources/wirehops.h ${QET_DIR}/sources/wirehops.cpp + ${QET_DIR}/sources/conductorrouter.h + ${QET_DIR}/sources/conductorrouter.cpp ${QET_DIR}/sources/ui/wiringlistdialog.h ${QET_DIR}/sources/ui/wiringlistdialog.cpp ${QET_DIR}/sources/conductornumexport.h diff --git a/ico/128x128/configure-shortcuts.png b/ico/128x128/configure-shortcuts.png deleted file mode 100644 index 6046a6286..000000000 Binary files a/ico/128x128/configure-shortcuts.png and /dev/null differ diff --git a/ico/128x128/diagram.png b/ico/128x128/diagram.png deleted file mode 100644 index 75d8a18ee..000000000 Binary files a/ico/128x128/diagram.png and /dev/null differ diff --git a/ico/128x128/document-export.png b/ico/128x128/document-export.png deleted file mode 100644 index b7891a130..000000000 Binary files a/ico/128x128/document-export.png and /dev/null differ diff --git a/ico/128x128/printer.png b/ico/128x128/printer.png deleted file mode 100644 index a28ba4bba..000000000 Binary files a/ico/128x128/printer.png and /dev/null differ diff --git a/ico/128x128/settings.png b/ico/128x128/settings.png deleted file mode 100644 index 5683686e0..000000000 Binary files a/ico/128x128/settings.png and /dev/null differ diff --git a/ico/16x16/application-exit.png b/ico/16x16/application-exit.png deleted file mode 100644 index 35ec37b9d..000000000 Binary files a/ico/16x16/application-exit.png and /dev/null differ diff --git a/ico/16x16/arrow-left.png b/ico/16x16/arrow-left.png deleted file mode 100644 index cb61de837..000000000 Binary files a/ico/16x16/arrow-left.png and /dev/null differ diff --git a/ico/16x16/arrow-right.png b/ico/16x16/arrow-right.png deleted file mode 100644 index 1d5e3d9d4..000000000 Binary files a/ico/16x16/arrow-right.png and /dev/null differ diff --git a/ico/16x16/circle.png b/ico/16x16/circle.png deleted file mode 100644 index 8d1beb0c5..000000000 Binary files a/ico/16x16/circle.png and /dev/null differ diff --git a/ico/16x16/conductor.png b/ico/16x16/conductor.png deleted file mode 100644 index 63689325e..000000000 Binary files a/ico/16x16/conductor.png and /dev/null differ diff --git a/ico/16x16/configure.png b/ico/16x16/configure.png deleted file mode 100644 index 9fbee6234..000000000 Binary files a/ico/16x16/configure.png and /dev/null differ diff --git a/ico/16x16/diagram.png b/ico/16x16/diagram.png deleted file mode 100644 index ad64610d7..000000000 Binary files a/ico/16x16/diagram.png and /dev/null differ diff --git a/ico/16x16/dialog-cancel.png b/ico/16x16/dialog-cancel.png deleted file mode 100644 index c731f7ace..000000000 Binary files a/ico/16x16/dialog-cancel.png and /dev/null differ diff --git a/ico/16x16/dialog-ok.png b/ico/16x16/dialog-ok.png deleted file mode 100644 index 14d314a05..000000000 Binary files a/ico/16x16/dialog-ok.png and /dev/null differ diff --git a/ico/16x16/document-close.png b/ico/16x16/document-close.png deleted file mode 100644 index ebe8cad21..000000000 Binary files a/ico/16x16/document-close.png and /dev/null differ diff --git a/ico/16x16/document-export.png b/ico/16x16/document-export.png deleted file mode 100644 index 42060fc3a..000000000 Binary files a/ico/16x16/document-export.png and /dev/null differ diff --git a/ico/16x16/document-import.png b/ico/16x16/document-import.png deleted file mode 100644 index 48097aa36..000000000 Binary files a/ico/16x16/document-import.png and /dev/null differ diff --git a/ico/16x16/document-new.png b/ico/16x16/document-new.png deleted file mode 100644 index 3c7b13cc5..000000000 Binary files a/ico/16x16/document-new.png and /dev/null differ diff --git a/ico/16x16/document-open-recent.png b/ico/16x16/document-open-recent.png deleted file mode 100644 index 12d9726ea..000000000 Binary files a/ico/16x16/document-open-recent.png and /dev/null differ diff --git a/ico/16x16/document-open.png b/ico/16x16/document-open.png deleted file mode 100644 index a7dd1bc62..000000000 Binary files a/ico/16x16/document-open.png and /dev/null differ diff --git a/ico/16x16/document-print-frame.png b/ico/16x16/document-print-frame.png deleted file mode 100644 index aaff67f23..000000000 Binary files a/ico/16x16/document-print-frame.png and /dev/null differ diff --git a/ico/16x16/document-print.png b/ico/16x16/document-print.png deleted file mode 100644 index aaff67f23..000000000 Binary files a/ico/16x16/document-print.png and /dev/null differ diff --git a/ico/16x16/document-save-all.png b/ico/16x16/document-save-all.png deleted file mode 100644 index 7a288174d..000000000 Binary files a/ico/16x16/document-save-all.png and /dev/null differ diff --git a/ico/16x16/document-save-as.png b/ico/16x16/document-save-as.png deleted file mode 100644 index e4f0a726a..000000000 Binary files a/ico/16x16/document-save-as.png and /dev/null differ diff --git a/ico/16x16/document-save.png b/ico/16x16/document-save.png deleted file mode 100644 index 5f3e7777b..000000000 Binary files a/ico/16x16/document-save.png and /dev/null differ diff --git a/ico/16x16/edit-clear-locationbar-ltr.png b/ico/16x16/edit-clear-locationbar-ltr.png deleted file mode 100644 index 9386508fe..000000000 Binary files a/ico/16x16/edit-clear-locationbar-ltr.png and /dev/null differ diff --git a/ico/16x16/edit-clear-locationbar-rtl.png b/ico/16x16/edit-clear-locationbar-rtl.png deleted file mode 100644 index 4f3511a57..000000000 Binary files a/ico/16x16/edit-clear-locationbar-rtl.png and /dev/null differ diff --git a/ico/16x16/edit-clear.png b/ico/16x16/edit-clear.png deleted file mode 100644 index e570733a8..000000000 Binary files a/ico/16x16/edit-clear.png and /dev/null differ diff --git a/ico/16x16/edit-copy.png b/ico/16x16/edit-copy.png deleted file mode 100644 index b804d7a98..000000000 Binary files a/ico/16x16/edit-copy.png and /dev/null differ diff --git a/ico/16x16/edit-cut.png b/ico/16x16/edit-cut.png deleted file mode 100644 index e3ddef14f..000000000 Binary files a/ico/16x16/edit-cut.png and /dev/null differ diff --git a/ico/16x16/edit-delete.png b/ico/16x16/edit-delete.png deleted file mode 100644 index 21ce6f71c..000000000 Binary files a/ico/16x16/edit-delete.png and /dev/null differ diff --git a/ico/16x16/edit-download.png b/ico/16x16/edit-download.png deleted file mode 100644 index 18a931b42..000000000 Binary files a/ico/16x16/edit-download.png and /dev/null differ diff --git a/ico/16x16/edit-paste.png b/ico/16x16/edit-paste.png deleted file mode 100644 index 8fe8effbc..000000000 Binary files a/ico/16x16/edit-paste.png and /dev/null differ diff --git a/ico/16x16/edit-redo.png b/ico/16x16/edit-redo.png deleted file mode 100644 index 473fd5271..000000000 Binary files a/ico/16x16/edit-redo.png and /dev/null differ diff --git a/ico/16x16/edit-rename.png b/ico/16x16/edit-rename.png deleted file mode 100644 index c0d8e8bfd..000000000 Binary files a/ico/16x16/edit-rename.png and /dev/null differ diff --git a/ico/16x16/edit-select-all.png b/ico/16x16/edit-select-all.png deleted file mode 100644 index 0755c5e64..000000000 Binary files a/ico/16x16/edit-select-all.png and /dev/null differ diff --git a/ico/16x16/edit-select-invert.png b/ico/16x16/edit-select-invert.png deleted file mode 100644 index d6a5b1fe1..000000000 Binary files a/ico/16x16/edit-select-invert.png and /dev/null differ diff --git a/ico/16x16/edit-select-none.png b/ico/16x16/edit-select-none.png deleted file mode 100644 index 39e824a95..000000000 Binary files a/ico/16x16/edit-select-none.png and /dev/null differ diff --git a/ico/16x16/edit-table-cell-merge.png b/ico/16x16/edit-table-cell-merge.png deleted file mode 100644 index 68ea6fa5f..000000000 Binary files a/ico/16x16/edit-table-cell-merge.png and /dev/null differ diff --git a/ico/16x16/edit-table-cell-split.png b/ico/16x16/edit-table-cell-split.png deleted file mode 100644 index f5af72655..000000000 Binary files a/ico/16x16/edit-table-cell-split.png and /dev/null differ diff --git a/ico/16x16/edit-table-delete-column.png b/ico/16x16/edit-table-delete-column.png deleted file mode 100644 index 90a8a76f8..000000000 Binary files a/ico/16x16/edit-table-delete-column.png and /dev/null differ diff --git a/ico/16x16/edit-table-delete-row.png b/ico/16x16/edit-table-delete-row.png deleted file mode 100644 index a7a740f9e..000000000 Binary files a/ico/16x16/edit-table-delete-row.png and /dev/null differ diff --git a/ico/16x16/edit-table-insert-column-left.png b/ico/16x16/edit-table-insert-column-left.png deleted file mode 100644 index 363501016..000000000 Binary files a/ico/16x16/edit-table-insert-column-left.png and /dev/null differ diff --git a/ico/16x16/edit-table-insert-column-right.png b/ico/16x16/edit-table-insert-column-right.png deleted file mode 100644 index 9e5d7d3da..000000000 Binary files a/ico/16x16/edit-table-insert-column-right.png and /dev/null differ diff --git a/ico/16x16/edit-table-insert-row-above.png b/ico/16x16/edit-table-insert-row-above.png deleted file mode 100644 index 7edf81493..000000000 Binary files a/ico/16x16/edit-table-insert-row-above.png and /dev/null differ diff --git a/ico/16x16/edit-table-insert-row-under.png b/ico/16x16/edit-table-insert-row-under.png deleted file mode 100644 index ff4299901..000000000 Binary files a/ico/16x16/edit-table-insert-row-under.png and /dev/null differ diff --git a/ico/16x16/edit-undo.png b/ico/16x16/edit-undo.png deleted file mode 100644 index d9e6dccbf..000000000 Binary files a/ico/16x16/edit-undo.png and /dev/null differ diff --git a/ico/16x16/element.png b/ico/16x16/element.png deleted file mode 100644 index 14888be00..000000000 Binary files a/ico/16x16/element.png and /dev/null differ diff --git a/ico/16x16/flip.png b/ico/16x16/flip.png deleted file mode 100644 index 72c40bf95..000000000 Binary files a/ico/16x16/flip.png and /dev/null differ diff --git a/ico/16x16/folder-new.png b/ico/16x16/folder-new.png deleted file mode 100644 index 81fe83d54..000000000 Binary files a/ico/16x16/folder-new.png and /dev/null differ diff --git a/ico/16x16/folder-open.png b/ico/16x16/folder-open.png deleted file mode 100644 index a191f9979..000000000 Binary files a/ico/16x16/folder-open.png and /dev/null differ diff --git a/ico/16x16/folder-properties.png b/ico/16x16/folder-properties.png deleted file mode 100644 index e5a609d4d..000000000 Binary files a/ico/16x16/folder-properties.png and /dev/null differ diff --git a/ico/16x16/folder.png b/ico/16x16/folder.png deleted file mode 100644 index 2e2ea1a3f..000000000 Binary files a/ico/16x16/folder.png and /dev/null differ diff --git a/ico/16x16/folio-delete.png b/ico/16x16/folio-delete.png deleted file mode 100644 index 1ed2b8028..000000000 Binary files a/ico/16x16/folio-delete.png and /dev/null differ diff --git a/ico/16x16/folio-new.png b/ico/16x16/folio-new.png deleted file mode 100644 index a788a722f..000000000 Binary files a/ico/16x16/folio-new.png and /dev/null differ diff --git a/ico/16x16/folio-properties.png b/ico/16x16/folio-properties.png deleted file mode 100644 index a4581c162..000000000 Binary files a/ico/16x16/folio-properties.png and /dev/null differ diff --git a/ico/16x16/go-bottom.png b/ico/16x16/go-bottom.png deleted file mode 100644 index 490b265c0..000000000 Binary files a/ico/16x16/go-bottom.png and /dev/null differ diff --git a/ico/16x16/go-down-double.png b/ico/16x16/go-down-double.png deleted file mode 100644 index 46e2bed31..000000000 Binary files a/ico/16x16/go-down-double.png and /dev/null differ diff --git a/ico/16x16/go-down.png b/ico/16x16/go-down.png deleted file mode 100644 index 05c690b06..000000000 Binary files a/ico/16x16/go-down.png and /dev/null differ diff --git a/ico/16x16/go-home.png b/ico/16x16/go-home.png deleted file mode 100644 index a3cf271c9..000000000 Binary files a/ico/16x16/go-home.png and /dev/null differ diff --git a/ico/16x16/go-top.png b/ico/16x16/go-top.png deleted file mode 100644 index ae516930f..000000000 Binary files a/ico/16x16/go-top.png and /dev/null differ diff --git a/ico/16x16/go-up-double.png b/ico/16x16/go-up-double.png deleted file mode 100644 index cef7f8b41..000000000 Binary files a/ico/16x16/go-up-double.png and /dev/null differ diff --git a/ico/16x16/go-up.png b/ico/16x16/go-up.png deleted file mode 100644 index 8a0d0e2dd..000000000 Binary files a/ico/16x16/go-up.png and /dev/null differ diff --git a/ico/16x16/grid.png b/ico/16x16/grid.png deleted file mode 100644 index 2c646c60d..000000000 Binary files a/ico/16x16/grid.png and /dev/null differ diff --git a/ico/16x16/help-contents.png b/ico/16x16/help-contents.png deleted file mode 100644 index 3fb63a165..000000000 Binary files a/ico/16x16/help-contents.png and /dev/null differ diff --git a/ico/16x16/help-donate.png b/ico/16x16/help-donate.png deleted file mode 100644 index 8d13033d3..000000000 Binary files a/ico/16x16/help-donate.png and /dev/null differ diff --git a/ico/16x16/item-cancel.png b/ico/16x16/item-cancel.png deleted file mode 100644 index c731f7ace..000000000 Binary files a/ico/16x16/item-cancel.png and /dev/null differ diff --git a/ico/16x16/item-copy.png b/ico/16x16/item-copy.png deleted file mode 100644 index b804d7a98..000000000 Binary files a/ico/16x16/item-copy.png and /dev/null differ diff --git a/ico/16x16/item-move.png b/ico/16x16/item-move.png deleted file mode 100644 index 5f8cee2fa..000000000 Binary files a/ico/16x16/item-move.png and /dev/null differ diff --git a/ico/16x16/kdenlive-show-video.png b/ico/16x16/kdenlive-show-video.png deleted file mode 100644 index 9135f40ed..000000000 Binary files a/ico/16x16/kdenlive-show-video.png and /dev/null differ diff --git a/ico/16x16/label.png b/ico/16x16/label.png deleted file mode 100644 index 315cb5279..000000000 Binary files a/ico/16x16/label.png and /dev/null differ diff --git a/ico/16x16/list-add.png b/ico/16x16/list-add.png deleted file mode 100644 index 67ceb4113..000000000 Binary files a/ico/16x16/list-add.png and /dev/null differ diff --git a/ico/16x16/list-remove.png b/ico/16x16/list-remove.png deleted file mode 100644 index e165fb747..000000000 Binary files a/ico/16x16/list-remove.png and /dev/null differ diff --git a/ico/16x16/masquer.png b/ico/16x16/masquer.png deleted file mode 100644 index 8f8e9a3b6..000000000 Binary files a/ico/16x16/masquer.png and /dev/null differ diff --git a/ico/16x16/mirror.png b/ico/16x16/mirror.png deleted file mode 100644 index 6a842bc07..000000000 Binary files a/ico/16x16/mirror.png and /dev/null differ diff --git a/ico/16x16/move.png b/ico/16x16/move.png deleted file mode 100644 index 5553e93e7..000000000 Binary files a/ico/16x16/move.png and /dev/null differ diff --git a/ico/16x16/object-group.png b/ico/16x16/object-group.png deleted file mode 100644 index d1c0e093c..000000000 Binary files a/ico/16x16/object-group.png and /dev/null differ diff --git a/ico/16x16/object-rotate-right.png b/ico/16x16/object-rotate-right.png deleted file mode 100644 index 30a29672f..000000000 Binary files a/ico/16x16/object-rotate-right.png and /dev/null differ diff --git a/ico/16x16/preferences-desktop-user.png b/ico/16x16/preferences-desktop-user.png deleted file mode 100644 index 25222b46b..000000000 Binary files a/ico/16x16/preferences-desktop-user.png and /dev/null differ diff --git a/ico/16x16/project-delete.png b/ico/16x16/project-delete.png deleted file mode 100644 index 6a14a5649..000000000 Binary files a/ico/16x16/project-delete.png and /dev/null differ diff --git a/ico/16x16/qet.png b/ico/16x16/qet.png deleted file mode 100644 index c0c7eb9b5..000000000 Binary files a/ico/16x16/qet.png and /dev/null differ diff --git a/ico/16x16/qt.png b/ico/16x16/qt.png deleted file mode 100644 index 74b406ec0..000000000 Binary files a/ico/16x16/qt.png and /dev/null differ diff --git a/ico/16x16/select.png b/ico/16x16/select.png deleted file mode 100644 index 9fa393cdd..000000000 Binary files a/ico/16x16/select.png and /dev/null differ diff --git a/ico/16x16/table-of-content.png b/ico/16x16/table-of-content.png deleted file mode 100644 index 604fe31c2..000000000 Binary files a/ico/16x16/table-of-content.png and /dev/null differ diff --git a/ico/16x16/transform-rotate.png b/ico/16x16/transform-rotate.png deleted file mode 100644 index 71042d3c3..000000000 Binary files a/ico/16x16/transform-rotate.png and /dev/null differ diff --git a/ico/16x16/user-busy.png b/ico/16x16/user-busy.png deleted file mode 100644 index 45fbaa667..000000000 Binary files a/ico/16x16/user-busy.png and /dev/null differ diff --git a/ico/16x16/user-online.png b/ico/16x16/user-online.png deleted file mode 100644 index 1d358cbab..000000000 Binary files a/ico/16x16/user-online.png and /dev/null differ diff --git a/ico/16x16/view-fullscreen.png b/ico/16x16/view-fullscreen.png deleted file mode 100644 index d00b8133a..000000000 Binary files a/ico/16x16/view-fullscreen.png and /dev/null differ diff --git a/ico/16x16/view-refresh.png b/ico/16x16/view-refresh.png deleted file mode 100644 index 7527ee00d..000000000 Binary files a/ico/16x16/view-refresh.png and /dev/null differ diff --git a/ico/16x16/view-restore.png b/ico/16x16/view-restore.png deleted file mode 100644 index 645b5db98..000000000 Binary files a/ico/16x16/view-restore.png and /dev/null differ diff --git a/ico/16x16/window-new.png b/ico/16x16/window-new.png deleted file mode 100644 index f60d2d000..000000000 Binary files a/ico/16x16/window-new.png and /dev/null differ diff --git a/ico/16x16/zoom-draw.png b/ico/16x16/zoom-draw.png deleted file mode 100644 index 0879f41e8..000000000 Binary files a/ico/16x16/zoom-draw.png and /dev/null differ diff --git a/ico/16x16/zoom-in.png b/ico/16x16/zoom-in.png deleted file mode 100644 index 74886f5a6..000000000 Binary files a/ico/16x16/zoom-in.png and /dev/null differ diff --git a/ico/16x16/zoom-out.png b/ico/16x16/zoom-out.png deleted file mode 100644 index 998789b83..000000000 Binary files a/ico/16x16/zoom-out.png and /dev/null differ diff --git a/ico/22x22/Actions-player-time-icon.png b/ico/22x22/Actions-player-time-icon.png deleted file mode 100644 index 19c5d3411..000000000 Binary files a/ico/22x22/Actions-player-time-icon.png and /dev/null differ diff --git a/ico/22x22/application-exit.png b/ico/22x22/application-exit.png deleted file mode 100644 index b4b5c263b..000000000 Binary files a/ico/22x22/application-exit.png and /dev/null differ diff --git a/ico/22x22/applications-development-translation.png b/ico/22x22/applications-development-translation.png deleted file mode 100644 index 34599ba3c..000000000 Binary files a/ico/22x22/applications-development-translation.png and /dev/null differ diff --git a/ico/22x22/arc.png b/ico/22x22/arc.png deleted file mode 100644 index 082df111f..000000000 Binary files a/ico/22x22/arc.png and /dev/null differ diff --git a/ico/22x22/arrow-left.png b/ico/22x22/arrow-left.png deleted file mode 100644 index c2e522864..000000000 Binary files a/ico/22x22/arrow-left.png and /dev/null differ diff --git a/ico/22x22/arrow-right.png b/ico/22x22/arrow-right.png deleted file mode 100644 index 6b4d4094d..000000000 Binary files a/ico/22x22/arrow-right.png and /dev/null differ diff --git a/ico/22x22/autoconnect.png b/ico/22x22/autoconnect.png deleted file mode 100644 index b1b3ef8dd..000000000 Binary files a/ico/22x22/autoconnect.png and /dev/null differ diff --git a/ico/22x22/bring_forward.png b/ico/22x22/bring_forward.png deleted file mode 100644 index c3b8b1642..000000000 Binary files a/ico/22x22/bring_forward.png and /dev/null differ diff --git a/ico/22x22/configure.png b/ico/22x22/configure.png deleted file mode 100644 index fdc4f0d94..000000000 Binary files a/ico/22x22/configure.png and /dev/null differ diff --git a/ico/22x22/dialog-cancel.png b/ico/22x22/dialog-cancel.png deleted file mode 100644 index c81277891..000000000 Binary files a/ico/22x22/dialog-cancel.png and /dev/null differ diff --git a/ico/22x22/dialog-ok.png b/ico/22x22/dialog-ok.png deleted file mode 100644 index b07cf10a2..000000000 Binary files a/ico/22x22/dialog-ok.png and /dev/null differ diff --git a/ico/22x22/document-close.png b/ico/22x22/document-close.png deleted file mode 100644 index c36e97b30..000000000 Binary files a/ico/22x22/document-close.png and /dev/null differ diff --git a/ico/22x22/document-export.png b/ico/22x22/document-export.png deleted file mode 100644 index d7b6cfbba..000000000 Binary files a/ico/22x22/document-export.png and /dev/null differ diff --git a/ico/22x22/document-import.png b/ico/22x22/document-import.png deleted file mode 100644 index 0d22342fb..000000000 Binary files a/ico/22x22/document-import.png and /dev/null differ diff --git a/ico/22x22/document-new.png b/ico/22x22/document-new.png deleted file mode 100644 index b25da4ce0..000000000 Binary files a/ico/22x22/document-new.png and /dev/null differ diff --git a/ico/22x22/document-open-recent.png b/ico/22x22/document-open-recent.png deleted file mode 100644 index 76a88838c..000000000 Binary files a/ico/22x22/document-open-recent.png and /dev/null differ diff --git a/ico/22x22/document-open.png b/ico/22x22/document-open.png deleted file mode 100644 index c73e84cf1..000000000 Binary files a/ico/22x22/document-open.png and /dev/null differ diff --git a/ico/22x22/document-print-frame.png b/ico/22x22/document-print-frame.png deleted file mode 100644 index 778f2fc19..000000000 Binary files a/ico/22x22/document-print-frame.png and /dev/null differ diff --git a/ico/22x22/document-print.png b/ico/22x22/document-print.png deleted file mode 100644 index 778f2fc19..000000000 Binary files a/ico/22x22/document-print.png and /dev/null differ diff --git a/ico/22x22/document-save-all.png b/ico/22x22/document-save-all.png deleted file mode 100644 index 5c670cd9b..000000000 Binary files a/ico/22x22/document-save-all.png and /dev/null differ diff --git a/ico/22x22/document-save-as.png b/ico/22x22/document-save-as.png deleted file mode 100644 index 55f60a51e..000000000 Binary files a/ico/22x22/document-save-as.png and /dev/null differ diff --git a/ico/22x22/document-save.png b/ico/22x22/document-save.png deleted file mode 100644 index b0e516b3f..000000000 Binary files a/ico/22x22/document-save.png and /dev/null differ diff --git a/ico/22x22/edit-clear-locationbar-ltr.png b/ico/22x22/edit-clear-locationbar-ltr.png deleted file mode 100644 index bf798c4b8..000000000 Binary files a/ico/22x22/edit-clear-locationbar-ltr.png and /dev/null differ diff --git a/ico/22x22/edit-clear-locationbar-rtl.png b/ico/22x22/edit-clear-locationbar-rtl.png deleted file mode 100644 index 694cae9d3..000000000 Binary files a/ico/22x22/edit-clear-locationbar-rtl.png and /dev/null differ diff --git a/ico/22x22/edit-clear.png b/ico/22x22/edit-clear.png deleted file mode 100644 index 4cabdd5db..000000000 Binary files a/ico/22x22/edit-clear.png and /dev/null differ diff --git a/ico/22x22/edit-copy.png b/ico/22x22/edit-copy.png deleted file mode 100644 index edb6ce67b..000000000 Binary files a/ico/22x22/edit-copy.png and /dev/null differ diff --git a/ico/22x22/edit-cut.png b/ico/22x22/edit-cut.png deleted file mode 100644 index d1f4f1155..000000000 Binary files a/ico/22x22/edit-cut.png and /dev/null differ diff --git a/ico/22x22/edit-delete.png b/ico/22x22/edit-delete.png deleted file mode 100644 index a34adf695..000000000 Binary files a/ico/22x22/edit-delete.png and /dev/null differ diff --git a/ico/22x22/edit-paste.png b/ico/22x22/edit-paste.png deleted file mode 100644 index 441bc83b8..000000000 Binary files a/ico/22x22/edit-paste.png and /dev/null differ diff --git a/ico/22x22/edit-redo.png b/ico/22x22/edit-redo.png deleted file mode 100644 index f970b7b66..000000000 Binary files a/ico/22x22/edit-redo.png and /dev/null differ diff --git a/ico/22x22/edit-rename.png b/ico/22x22/edit-rename.png deleted file mode 100644 index f4a8dd15f..000000000 Binary files a/ico/22x22/edit-rename.png and /dev/null differ diff --git a/ico/22x22/edit-select-all.png b/ico/22x22/edit-select-all.png deleted file mode 100644 index 42d56eda6..000000000 Binary files a/ico/22x22/edit-select-all.png and /dev/null differ diff --git a/ico/22x22/edit-table-cell-merge.png b/ico/22x22/edit-table-cell-merge.png deleted file mode 100644 index 3c0500038..000000000 Binary files a/ico/22x22/edit-table-cell-merge.png and /dev/null differ diff --git a/ico/22x22/edit-table-cell-split.png b/ico/22x22/edit-table-cell-split.png deleted file mode 100644 index c625fbfbc..000000000 Binary files a/ico/22x22/edit-table-cell-split.png and /dev/null differ diff --git a/ico/22x22/edit-table-delete-column.png b/ico/22x22/edit-table-delete-column.png deleted file mode 100644 index a94df56fa..000000000 Binary files a/ico/22x22/edit-table-delete-column.png and /dev/null differ diff --git a/ico/22x22/edit-table-delete-row.png b/ico/22x22/edit-table-delete-row.png deleted file mode 100644 index 48138a07a..000000000 Binary files a/ico/22x22/edit-table-delete-row.png and /dev/null differ diff --git a/ico/22x22/edit-table-insert-column-left.png b/ico/22x22/edit-table-insert-column-left.png deleted file mode 100644 index fa2abf463..000000000 Binary files a/ico/22x22/edit-table-insert-column-left.png and /dev/null differ diff --git a/ico/22x22/edit-table-insert-column-right.png b/ico/22x22/edit-table-insert-column-right.png deleted file mode 100644 index 02cdf5e89..000000000 Binary files a/ico/22x22/edit-table-insert-column-right.png and /dev/null differ diff --git a/ico/22x22/edit-table-insert-row-above.png b/ico/22x22/edit-table-insert-row-above.png deleted file mode 100644 index b4a15aab5..000000000 Binary files a/ico/22x22/edit-table-insert-row-above.png and /dev/null differ diff --git a/ico/22x22/edit-table-insert-row-under.png b/ico/22x22/edit-table-insert-row-under.png deleted file mode 100644 index 2309e4923..000000000 Binary files a/ico/22x22/edit-table-insert-row-under.png and /dev/null differ diff --git a/ico/22x22/edit-undo.png b/ico/22x22/edit-undo.png deleted file mode 100644 index 005705c51..000000000 Binary files a/ico/22x22/edit-undo.png and /dev/null differ diff --git a/ico/22x22/ellipse.png b/ico/22x22/ellipse.png deleted file mode 100644 index 501b8b25b..000000000 Binary files a/ico/22x22/ellipse.png and /dev/null differ diff --git a/ico/22x22/folder-new.png b/ico/22x22/folder-new.png deleted file mode 100644 index 8be615292..000000000 Binary files a/ico/22x22/folder-new.png and /dev/null differ diff --git a/ico/22x22/folder-open.png b/ico/22x22/folder-open.png deleted file mode 100644 index d7e71cd01..000000000 Binary files a/ico/22x22/folder-open.png and /dev/null differ diff --git a/ico/22x22/format-text-subscript.png b/ico/22x22/format-text-subscript.png deleted file mode 100644 index b1b0965b9..000000000 Binary files a/ico/22x22/format-text-subscript.png and /dev/null differ diff --git a/ico/22x22/format-text-superscript.png b/ico/22x22/format-text-superscript.png deleted file mode 100644 index 53194aa66..000000000 Binary files a/ico/22x22/format-text-superscript.png and /dev/null differ diff --git a/ico/22x22/go-down.png b/ico/22x22/go-down.png deleted file mode 100644 index 2b5cc5abf..000000000 Binary files a/ico/22x22/go-down.png and /dev/null differ diff --git a/ico/22x22/go-home.png b/ico/22x22/go-home.png deleted file mode 100644 index 3d5b72879..000000000 Binary files a/ico/22x22/go-home.png and /dev/null differ diff --git a/ico/22x22/go-up.png b/ico/22x22/go-up.png deleted file mode 100644 index 258977752..000000000 Binary files a/ico/22x22/go-up.png and /dev/null differ diff --git a/ico/22x22/grid.png b/ico/22x22/grid.png deleted file mode 100644 index 8cd01f801..000000000 Binary files a/ico/22x22/grid.png and /dev/null differ diff --git a/ico/22x22/insert-image.png b/ico/22x22/insert-image.png deleted file mode 100644 index 760803eef..000000000 Binary files a/ico/22x22/insert-image.png and /dev/null differ diff --git a/ico/22x22/line.png b/ico/22x22/line.png deleted file mode 100644 index 6f5346cbb..000000000 Binary files a/ico/22x22/line.png and /dev/null differ diff --git a/ico/22x22/list-add.png b/ico/22x22/list-add.png deleted file mode 100644 index 69a2f307c..000000000 Binary files a/ico/22x22/list-add.png and /dev/null differ diff --git a/ico/22x22/list-remove.png b/ico/22x22/list-remove.png deleted file mode 100644 index d986f138f..000000000 Binary files a/ico/22x22/list-remove.png and /dev/null differ diff --git a/ico/22x22/move.png b/ico/22x22/move.png deleted file mode 100644 index 2d8f17207..000000000 Binary files a/ico/22x22/move.png and /dev/null differ diff --git a/ico/22x22/object-locked.png b/ico/22x22/object-locked.png deleted file mode 100644 index 0da503d94..000000000 Binary files a/ico/22x22/object-locked.png and /dev/null differ diff --git a/ico/22x22/object-rotate-right.png b/ico/22x22/object-rotate-right.png deleted file mode 100644 index df0eecd90..000000000 Binary files a/ico/22x22/object-rotate-right.png and /dev/null differ diff --git a/ico/22x22/object-unlocked.png b/ico/22x22/object-unlocked.png deleted file mode 100644 index 446d31ad4..000000000 Binary files a/ico/22x22/object-unlocked.png and /dev/null differ diff --git a/ico/22x22/polygon.png b/ico/22x22/polygon.png deleted file mode 100644 index f5a7f1a05..000000000 Binary files a/ico/22x22/polygon.png and /dev/null differ diff --git a/ico/22x22/preferences-desktop-user.png b/ico/22x22/preferences-desktop-user.png deleted file mode 100644 index 401dcf1e1..000000000 Binary files a/ico/22x22/preferences-desktop-user.png and /dev/null differ diff --git a/ico/22x22/project-delete.png b/ico/22x22/project-delete.png deleted file mode 100644 index 24557da5b..000000000 Binary files a/ico/22x22/project-delete.png and /dev/null differ diff --git a/ico/22x22/rectangle.png b/ico/22x22/rectangle.png deleted file mode 100644 index 19e1706fa..000000000 Binary files a/ico/22x22/rectangle.png and /dev/null differ diff --git a/ico/22x22/restaurer.png b/ico/22x22/restaurer.png deleted file mode 100644 index ca9208c8e..000000000 Binary files a/ico/22x22/restaurer.png and /dev/null differ diff --git a/ico/22x22/select.png b/ico/22x22/select.png deleted file mode 100644 index cf56e90ca..000000000 Binary files a/ico/22x22/select.png and /dev/null differ diff --git a/ico/22x22/single_page.png b/ico/22x22/single_page.png deleted file mode 100644 index 3be1b7b40..000000000 Binary files a/ico/22x22/single_page.png and /dev/null differ diff --git a/ico/22x22/start.png b/ico/22x22/start.png deleted file mode 100644 index 694cae9d3..000000000 Binary files a/ico/22x22/start.png and /dev/null differ diff --git a/ico/22x22/text.png b/ico/22x22/text.png deleted file mode 100644 index bb5a7f9ae..000000000 Binary files a/ico/22x22/text.png and /dev/null differ diff --git a/ico/22x22/transform-scale.png b/ico/22x22/transform-scale.png deleted file mode 100644 index aee868587..000000000 Binary files a/ico/22x22/transform-scale.png and /dev/null differ diff --git a/ico/22x22/two_pages.png b/ico/22x22/two_pages.png deleted file mode 100644 index 8c3d5c515..000000000 Binary files a/ico/22x22/two_pages.png and /dev/null differ diff --git a/ico/22x22/view-fit-window.png b/ico/22x22/view-fit-window.png deleted file mode 100644 index 557a5e970..000000000 Binary files a/ico/22x22/view-fit-window.png and /dev/null differ diff --git a/ico/22x22/view-fullscreen.png b/ico/22x22/view-fullscreen.png deleted file mode 100644 index 4b28b0413..000000000 Binary files a/ico/22x22/view-fullscreen.png and /dev/null differ diff --git a/ico/22x22/view-refresh.png b/ico/22x22/view-refresh.png deleted file mode 100644 index 273307b35..000000000 Binary files a/ico/22x22/view-refresh.png and /dev/null differ diff --git a/ico/22x22/view-restore.png b/ico/22x22/view-restore.png deleted file mode 100644 index 6c5b11094..000000000 Binary files a/ico/22x22/view-restore.png and /dev/null differ diff --git a/ico/22x22/view_fit_width.png b/ico/22x22/view_fit_width.png deleted file mode 100644 index 607c5da32..000000000 Binary files a/ico/22x22/view_fit_width.png and /dev/null differ diff --git a/ico/22x22/window-new.png b/ico/22x22/window-new.png deleted file mode 100644 index 58d82d02b..000000000 Binary files a/ico/22x22/window-new.png and /dev/null differ diff --git a/ico/22x22/zoom-draw.png b/ico/22x22/zoom-draw.png deleted file mode 100644 index 1d04149d1..000000000 Binary files a/ico/22x22/zoom-draw.png and /dev/null differ diff --git a/ico/22x22/zoom-in.png b/ico/22x22/zoom-in.png deleted file mode 100644 index 2ae499de1..000000000 Binary files a/ico/22x22/zoom-in.png and /dev/null differ diff --git a/ico/22x22/zoom-out.png b/ico/22x22/zoom-out.png deleted file mode 100644 index cdd8d7505..000000000 Binary files a/ico/22x22/zoom-out.png and /dev/null differ diff --git a/ico/32x32/format-text-bold.png b/ico/32x32/format-text-bold.png deleted file mode 100644 index 52d835f86..000000000 Binary files a/ico/32x32/format-text-bold.png and /dev/null differ diff --git a/ico/32x32/format-text-color.png b/ico/32x32/format-text-color.png deleted file mode 100644 index 5ac3f0812..000000000 Binary files a/ico/32x32/format-text-color.png and /dev/null differ diff --git a/ico/32x32/format-text-italic.png b/ico/32x32/format-text-italic.png deleted file mode 100644 index fc025fb0a..000000000 Binary files a/ico/32x32/format-text-italic.png and /dev/null differ diff --git a/ico/32x32/format-text-underline.png b/ico/32x32/format-text-underline.png deleted file mode 100644 index 53a8045dc..000000000 Binary files a/ico/32x32/format-text-underline.png and /dev/null differ diff --git a/ico/32x32/image-x-eps.png b/ico/32x32/image-x-eps.png deleted file mode 100644 index dec8112cb..000000000 Binary files a/ico/32x32/image-x-eps.png and /dev/null differ diff --git a/ico/32x32/insert-link.png b/ico/32x32/insert-link.png deleted file mode 100644 index f8bd90cff..000000000 Binary files a/ico/32x32/insert-link.png and /dev/null differ diff --git a/ico/32x32/printer.png b/ico/32x32/printer.png deleted file mode 100644 index 47f73d6f1..000000000 Binary files a/ico/32x32/printer.png and /dev/null differ diff --git a/ico/32x32/qt.png b/ico/32x32/qt.png deleted file mode 100644 index 0c6a07751..000000000 Binary files a/ico/32x32/qt.png and /dev/null differ diff --git a/ico/48x48/document-print-frame.png b/ico/48x48/document-print-frame.png deleted file mode 100644 index 6c3e47233..000000000 Binary files a/ico/48x48/document-print-frame.png and /dev/null differ diff --git a/ico/48x48/user-away-extended.png b/ico/48x48/user-away-extended.png deleted file mode 100644 index 4ff79a78b..000000000 Binary files a/ico/48x48/user-away-extended.png and /dev/null differ diff --git a/ico/48x48/user-away.png b/ico/48x48/user-away.png deleted file mode 100644 index 4ff79a78b..000000000 Binary files a/ico/48x48/user-away.png and /dev/null differ diff --git a/ico/48x48/view-pim-journal.png b/ico/48x48/view-pim-journal.png deleted file mode 100644 index a741f7157..000000000 Binary files a/ico/48x48/view-pim-journal.png and /dev/null differ diff --git a/ico/breeze/16/draw-circle.svg b/ico/breeze/16/draw-circle.svg deleted file mode 100644 index 54ff98519..000000000 --- a/ico/breeze/16/draw-circle.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/breeze/16/draw-ellipse.svg b/ico/breeze/16/draw-ellipse.svg deleted file mode 100644 index 5323404c8..000000000 --- a/ico/breeze/16/draw-ellipse.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/breeze/16/go-next-skip.svg b/ico/breeze/16/go-next-skip.svg deleted file mode 100644 index 85ae02d5e..000000000 --- a/ico/breeze/16/go-next-skip.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/ico/breeze/16/go-previous-skip.svg b/ico/breeze/16/go-previous-skip.svg deleted file mode 100644 index 4e556a50a..000000000 --- a/ico/breeze/16/go-previous-skip.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/ico/breeze/16/text-csv.svg b/ico/breeze/16/text-csv.svg deleted file mode 100644 index 706719a6d..000000000 --- a/ico/breeze/16/text-csv.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ico/breeze/16/text-field.svg b/ico/breeze/16/text-field.svg deleted file mode 100644 index 8eb9c52be..000000000 --- a/ico/breeze/16/text-field.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/ico/breeze/16/text-xml.svg b/ico/breeze/16/text-xml.svg deleted file mode 100644 index 1a12e4b23..000000000 --- a/ico/breeze/16/text-xml.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ico/breeze/16/view-pages-overview.svg b/ico/breeze/16/view-pages-overview.svg deleted file mode 100644 index 1831d1a87..000000000 --- a/ico/breeze/16/view-pages-overview.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/ico/breeze/22/draw-circle.svg b/ico/breeze/22/draw-circle.svg deleted file mode 100644 index 2b95109cc..000000000 --- a/ico/breeze/22/draw-circle.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/breeze/22/draw-ellipse.svg b/ico/breeze/22/draw-ellipse.svg deleted file mode 100644 index 60e0527e4..000000000 --- a/ico/breeze/22/draw-ellipse.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/breeze/22/go-next-skip.svg b/ico/breeze/22/go-next-skip.svg deleted file mode 100644 index 0ec9674a1..000000000 --- a/ico/breeze/22/go-next-skip.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/ico/breeze/22/go-previous-skip.svg b/ico/breeze/22/go-previous-skip.svg deleted file mode 100644 index f9ef7544f..000000000 --- a/ico/breeze/22/go-previous-skip.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/ico/breeze/22/text-csv.svg b/ico/breeze/22/text-csv.svg deleted file mode 100644 index 20f53dd51..000000000 --- a/ico/breeze/22/text-csv.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ico/breeze/22/text-field.svg b/ico/breeze/22/text-field.svg deleted file mode 100644 index 03947bedd..000000000 --- a/ico/breeze/22/text-field.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/ico/breeze/22/text-xml.svg b/ico/breeze/22/text-xml.svg deleted file mode 100644 index e627ee108..000000000 --- a/ico/breeze/22/text-xml.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - \ No newline at end of file diff --git a/ico/breeze/22/view-pages-overview.svg b/ico/breeze/22/view-pages-overview.svg deleted file mode 100644 index 2b0e87053..000000000 --- a/ico/breeze/22/view-pages-overview.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/ico/breeze/32/go-next-skip.svg b/ico/breeze/32/go-next-skip.svg deleted file mode 100644 index f04490974..000000000 --- a/ico/breeze/32/go-next-skip.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/ico/breeze/32/go-previous-skip.svg b/ico/breeze/32/go-previous-skip.svg deleted file mode 100644 index 0197efd74..000000000 --- a/ico/breeze/32/go-previous-skip.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/ico/breeze/32/text-csv.svg b/ico/breeze/32/text-csv.svg deleted file mode 100644 index 54e71c7b6..000000000 --- a/ico/breeze/32/text-csv.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ico/breeze/32/text-xml.svg b/ico/breeze/32/text-xml.svg deleted file mode 100644 index 412e09202..000000000 --- a/ico/breeze/32/text-xml.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ico/breeze/48/systemsettings.svg b/ico/breeze/48/systemsettings.svg new file mode 100644 index 000000000..847b3e338 --- /dev/null +++ b/ico/breeze/48/systemsettings.svg @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/breeze/64/printer.svg b/ico/breeze/64/printer.svg new file mode 100644 index 000000000..d96428e5b --- /dev/null +++ b/ico/breeze/64/printer.svg @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/copyright b/ico/copyright index a0c7c532a..a8bc50945 100644 --- a/ico/copyright +++ b/ico/copyright @@ -92,6 +92,7 @@ Files: ico/22x22/* Files: ico/32x32/* Files: ico/48x48/* Files: ico/128x128/* +Files: ico/breeze/* From the KDE Breeze theme icons Copyright: 2014, Uri Herrera and others @@ -136,12 +137,9 @@ Clarification: Some icons have been created exclusively for QElectroTech. They are based or inspired by the KDE Breeze icon theme. These icons are: - ico/16x16/diagram.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/16x16/document-open.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/east.svg by the QElectroTech team, traced from east.png by Nuri, with permission (License GPL-2.0-or-later) - ico/16x16/edit-clear.png from https://www.brandeps.com (License CC BY-ND 3.0) changes: icon color, icon rotation - ico/16x16/element.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) + ico/traced/*/element.svg by the QElectroTech team, traced from element.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/element-delete.svg by the QElectroTech team, traced from element-delete.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/element-edit.svg by the QElectroTech team, traced from element-edit.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/element-new.svg by the QElectroTech team, traced from element-new.png by Nuri, with permission (License GPL-2.0-or-later) @@ -151,69 +149,43 @@ Clarification: ico/traced/*/endline-simple.svg by the QElectroTech team, traced from endline-simple.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/endline-triangle.svg by the QElectroTech team, traced from endline-triangle.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/export-csv.svg by the QElectroTech team, traced from export-csv.png by Nuri, with permission (License GPL-2.0-or-later) - ico/16x16/folio-delete.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/16x16/folio-new.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/16x16/folio-properties.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/folder-delete.svg by the QElectroTech team, traced from folder-delete.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/folder-edit.svg by the QElectroTech team, traced from folder-edit.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/folder-only-this.svg by the QElectroTech team, traced from folder-only-this.png by Nuri, with permission (License GPL-2.0-or-later) - ico/16x16/folder-properties.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/folder-show-all.svg by the QElectroTech team, traced from folder-show-all.png by Nuri, with permission (License GPL-2.0-or-later) - ico/16x16/go-down-double.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/16x16/go-up-double.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/ground.svg by the QElectroTech team, traced from ground.png by Nuri, with permission (License GPL-2.0-or-later) - ico/16x16/label.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/16x16/list-remove.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/neutral.svg by the QElectroTech team, traced from neutral.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/north.svg by the QElectroTech team, traced from north.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/phase.svg by the QElectroTech team, traced from phase.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/project.svg by the QElectroTech team, traced from project.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/project-close.svg by the QElectroTech team, traced from project-close.png by Nuri, with permission (License GPL-2.0-or-later) - ico/16x16/project-delete.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/project-new.svg by the QElectroTech team, traced from project-new.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/project-properties.svg by the QElectroTech team, traced from project-properties.png by Nuri, with permission (License GPL-2.0-or-later) - ico/16x16/qet.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/16x16/qt.png from http://brand.qt.io/downloads/ + ico/traced/*/qet.svg by the QElectroTech team, traced from qet.png by Nuri, with permission (License GPL-2.0-or-later) + ico/traced/*/qt.svg by the QElectroTech team, traced from the Qt logo, http://brand.qt.io/downloads/ ico/traced/*/south.svg by the QElectroTech team, traced from south.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/terminalstrip.svg by the QElectroTech team, traced from terminalstrip.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/west.svg by the QElectroTech team, traced from west.png by Nuri, with permission (License GPL-2.0-or-later) - ico/22x22/arc.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/autoconnect.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/diagram.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/diagram_add.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) + ico/traced/*/arc.svg by the QElectroTech team, traced from arc.png by Nuri, with permission (License GPL-2.0-or-later) + ico/traced/*/autoconnect.svg by the QElectroTech team, traced from autoconnect.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/diagram_bg.svg by the QElectroTech team, traced from diagram_bg.png by Nuri, with permission (License GPL-2.0-or-later) - ico/22x22/diagram_del.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/dialog-information.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/document-open.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/edit-clear.png from https://www.brandeps.com (License CC BY-ND 3.0) changes: icon color, icon rotation - ico/22x22/folder-new.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/hotspot.svg by the QElectroTech team, traced from hotspot.png by Nuri, with permission (License GPL-2.0-or-later) - ico/22x22/label.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/landscape.svg by the QElectroTech team, traced from landscape.png by Nuri, with permission (License GPL-2.0-or-later) - ico/22x22/line.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/list-remove.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/portrait.svg by the QElectroTech team, traced from portrait.png by Nuri, with permission (License GPL-2.0-or-later) - ico/22x22/project-delete.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/22x22/single_page.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/traced/*/terminal.svg by the QElectroTech team, traced from terminal.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/titleblock-bottom.svg by the QElectroTech team, traced from titleblock-bottom.png by Nuri, with permission (License GPL-2.0-or-later) ico/traced/*/titleblock-right.svg by the QElectroTech team, traced from titleblock-right.png by Nuri, with permission (License GPL-2.0-or-later) - ico/22x22/two_pages.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/32x32/qt.png from http://brand.qt.io/downloads/ ico/traced/*/simplifyrichtext.svg by the QElectroTech team, traced from simplifyrichtext.png by Nuri, with permission (License GPL-2.0-or-later) - ico/48x48/document-print-frame.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/128x128/diagram.png by the QElectroTech team (License CC BY-ND 3.0) - ico/128x128/document-export.png by the QElectroTech team (License CC BY-ND 3.0) - ico/128x128/configure-shortcuts.png by Jeff Patterson from the QElectroTech team (License CC BY-ND 3.0), rendered from the .svg files beside them - ico/scalable/pdf-import.svg by Jeff Patterson from the QElectroTech team (License CC BY-ND 3.0), laid out like ico/22x22/insert-image.png + ico/128x128/configure-shortcuts.svg by Jeff Patterson from the QElectroTech team (License GPL-2.0-or-later) + ico/scalable/pdf-import.svg by Jeff Patterson from the QElectroTech team (License CC BY-ND 3.0), laid out like the former insert-image.png ico/scalable/diagram.svg, folio-new.svg, folio-delete.svg, folio-properties.svg, label.svg by Jeff Patterson from the QElectroTech team (License CC BY-ND 3.0), the folio icons redrawn in the same style + ico/traced/*/circle.svg, ellipse.svg, view-fit-window.svg by ispyisail from the QElectroTech team (License GPL-2.0-or-later), 16 pixel versions by the QElectroTech team ico/traced/* other than the above by the QElectroTech team (License GPL-2.0-or-later), traced from QElectroTech's PNG icons of the same names ico/scalable/16/* by the QElectroTech team (License GPL-2.0-or-later), 16 pixel versions of the ico/scalable/ icons of the same names ico/breeze-added/16/* by the QElectroTech team, 16 pixel versions of the KDE Breeze icons of the same names (License LGPL, as Breeze) ico/256x256/* by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/breeze-icons/* by Nuri from the QElectroTech team (License CC BY-ND 3.0) - ico/diagram.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/mac_icon/* by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/splash.png by Nuri from the QElectroTech team (License CC BY-ND 3.0) ico/windows_icon/* by Nuri from the QElectroTech team (License CC BY-ND 3.0) diff --git a/ico/diagram.png b/ico/diagram.png deleted file mode 100644 index 1a59e02b8..000000000 Binary files a/ico/diagram.png and /dev/null differ diff --git a/ico/generated/breeze-24/draw-circle.svg b/ico/generated/breeze-24/draw-circle.svg deleted file mode 100644 index d2ad41042..000000000 --- a/ico/generated/breeze-24/draw-circle.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/ico/generated/breeze-24/draw-ellipse.svg b/ico/generated/breeze-24/draw-ellipse.svg deleted file mode 100644 index 6fd8a96a1..000000000 --- a/ico/generated/breeze-24/draw-ellipse.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/ico/generated/traced-24/arc.svg b/ico/generated/traced-24/arc.svg new file mode 100644 index 000000000..df09768fa --- /dev/null +++ b/ico/generated/traced-24/arc.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/autoconnect.svg b/ico/generated/traced-24/autoconnect.svg new file mode 100644 index 000000000..01e720d16 --- /dev/null +++ b/ico/generated/traced-24/autoconnect.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ico/generated/traced-24/bring_forward.svg b/ico/generated/traced-24/bring_forward.svg new file mode 100644 index 000000000..1136e6089 --- /dev/null +++ b/ico/generated/traced-24/bring_forward.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/circle.svg b/ico/generated/traced-24/circle.svg new file mode 100644 index 000000000..91da1dfe1 --- /dev/null +++ b/ico/generated/traced-24/circle.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/conductor.svg b/ico/generated/traced-24/conductor.svg new file mode 100644 index 000000000..ff1637e47 --- /dev/null +++ b/ico/generated/traced-24/conductor.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/generated/traced-24/element.svg b/ico/generated/traced-24/element.svg new file mode 100644 index 000000000..2a756af46 --- /dev/null +++ b/ico/generated/traced-24/element.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/ellipse.svg b/ico/generated/traced-24/ellipse.svg new file mode 100644 index 000000000..841723148 --- /dev/null +++ b/ico/generated/traced-24/ellipse.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/move.svg b/ico/generated/traced-24/move.svg new file mode 100644 index 000000000..9ac05b85a --- /dev/null +++ b/ico/generated/traced-24/move.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/qet.svg b/ico/generated/traced-24/qet.svg new file mode 100644 index 000000000..8f776ca95 --- /dev/null +++ b/ico/generated/traced-24/qet.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/qt.svg b/ico/generated/traced-24/qt.svg new file mode 100644 index 000000000..1a409c91e --- /dev/null +++ b/ico/generated/traced-24/qt.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/user-away-extended.svg b/ico/generated/traced-24/user-away-extended.svg new file mode 100644 index 000000000..5e4626875 --- /dev/null +++ b/ico/generated/traced-24/user-away-extended.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-24/view-fit-window.svg b/ico/generated/traced-24/view-fit-window.svg new file mode 100644 index 000000000..bfe23f139 --- /dev/null +++ b/ico/generated/traced-24/view-fit-window.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/generated/traced-large-24/arc.svg b/ico/generated/traced-large-24/arc.svg new file mode 100644 index 000000000..5ab8cc61b --- /dev/null +++ b/ico/generated/traced-large-24/arc.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/ico/generated/traced-large-24/autoconnect.svg b/ico/generated/traced-large-24/autoconnect.svg new file mode 100644 index 000000000..2a89c943d --- /dev/null +++ b/ico/generated/traced-large-24/autoconnect.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/generated/traced-large-24/bring_forward.svg b/ico/generated/traced-large-24/bring_forward.svg new file mode 100644 index 000000000..e7db9a3c5 --- /dev/null +++ b/ico/generated/traced-large-24/bring_forward.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ico/generated/traced-large-24/circle.svg b/ico/generated/traced-large-24/circle.svg new file mode 100644 index 000000000..f49fc49a5 --- /dev/null +++ b/ico/generated/traced-large-24/circle.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/generated/traced-large-24/conductor.svg b/ico/generated/traced-large-24/conductor.svg new file mode 100644 index 000000000..f68d9476b --- /dev/null +++ b/ico/generated/traced-large-24/conductor.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/generated/traced-large-24/element.svg b/ico/generated/traced-large-24/element.svg new file mode 100644 index 000000000..08cbca002 --- /dev/null +++ b/ico/generated/traced-large-24/element.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/ico/generated/traced-large-24/ellipse.svg b/ico/generated/traced-large-24/ellipse.svg new file mode 100644 index 000000000..9cd21593a --- /dev/null +++ b/ico/generated/traced-large-24/ellipse.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/generated/traced-large-24/move.svg b/ico/generated/traced-large-24/move.svg new file mode 100644 index 000000000..9f547aa75 --- /dev/null +++ b/ico/generated/traced-large-24/move.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ico/generated/traced-large-24/qet.svg b/ico/generated/traced-large-24/qet.svg new file mode 100644 index 000000000..872283612 --- /dev/null +++ b/ico/generated/traced-large-24/qet.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/ico/generated/traced-large-24/user-away-extended.svg b/ico/generated/traced-large-24/user-away-extended.svg new file mode 100644 index 000000000..6dc6282cb --- /dev/null +++ b/ico/generated/traced-large-24/user-away-extended.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/ico/generated/traced-large-24/view-fit-window.svg b/ico/generated/traced-large-24/view-fit-window.svg new file mode 100644 index 000000000..abcd1b198 --- /dev/null +++ b/ico/generated/traced-large-24/view-fit-window.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/ico/icon-themes.qrc b/ico/icon-themes.qrc index 45d6454ca..37a903f33 100644 --- a/ico/icon-themes.qrc +++ b/ico/icon-themes.qrc @@ -4,37 +4,14 @@ themes/qet/index.theme themes/qet-dark/index.theme - 16x16/conductor.png - 16x16/edit-clear-locationbar-rtl.png - 16x16/element.png - 16x16/move.png - 16x16/project-delete.png - 16x16/qet.png - 16x16/qt.png - 22x22/Actions-player-time-icon.png - 22x22/arc.png - 22x22/autoconnect.png - 22x22/bring_forward.png - 22x22/edit-clear-locationbar-rtl.png - 22x22/move.png - 22x22/project-delete.png - 32x32/format-text-color.png - 32x32/insert-link.png - 32x32/printer.png - 32x32/qt.png - 48x48/user-away-extended.png - 48x48/user-away.png - 128x128/configure-shortcuts.png - 128x128/printer.png - 128x128/settings.png scalable/align-horizontal-center.svg scalable/align-horizontal-left.svg - scalable/draw-fillet.svg scalable/align-horizontal-right.svg scalable/align-vertical-bottom.svg scalable/align-vertical-center.svg scalable/align-vertical-top.svg scalable/diagram.svg + scalable/draw-fillet.svg scalable/folio-delete.svg scalable/folio-new.svg scalable/folio-properties.svg @@ -49,6 +26,9 @@ generated/ellipse-to-bezier.svg generated/rect-to-bezier.svg generated/rect-to-polyline.svg + breeze/64/printer.svg + breeze/48/systemsettings.svg + 128x128/configure-shortcuts.svg scalable/16/align-horizontal-center.svg generated/scalable-22/align-horizontal-center.svg scalable/16/align-horizontal-center.svg @@ -62,29 +42,17 @@ scalable/16/align-horizontal-center.svg scalable/16/align-horizontal-center.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg generated/scalable-22/align-horizontal-left.svg - generated/scalable-22/draw-fillet.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg scalable/align-horizontal-left.svg - scalable/draw-fillet.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg generated/scalable-22/align-horizontal-left.svg - generated/scalable-22/draw-fillet.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg scalable/align-horizontal-left.svg - scalable/draw-fillet.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg scalable/16/align-horizontal-left.svg - scalable/16/draw-fillet.svg scalable/16/align-horizontal-right.svg generated/scalable-22/align-horizontal-right.svg scalable/16/align-horizontal-right.svg @@ -189,6 +157,21 @@ generated/breeze-24/amarok_change_language.svg breeze/16/amarok_change_language.svg breeze/16/amarok_change_language.svg + traced/16/arc.svg + traced/large16/arc.svg + traced/22/arc.svg + traced/large22/arc.svg + traced/large16/arc.svg + traced/large16/arc.svg + generated/traced-large-24/arc.svg + generated/traced-large-24/arc.svg + traced/large16/arc.svg + traced/large16/arc.svg + traced/large16/arc.svg + traced/large16/arc.svg + generated/traced-24/arc.svg + generated/traced-large-24/arc.svg + traced/large22/arc.svg breeze/16/go-previous.svg breeze/22/go-previous.svg generated/breeze-24/go-previous.svg @@ -245,19 +228,66 @@ generated/traced-24/arrow-right-double.svg generated/traced-large-24/arrow-right-double.svg traced/large22/arrow-right-double.svg - breeze/16/draw-circle.svg - breeze/22/draw-circle.svg - generated/breeze-24/draw-circle.svg - breeze/16/draw-circle.svg - generated/breeze-24/draw-circle.svg - breeze/16/draw-circle.svg - breeze/16/draw-circle.svg - breeze/16/draw-circle.svg - breeze/22/draw-circle.svg - breeze/16/draw-circle.svg - generated/breeze-24/draw-circle.svg - breeze/16/draw-circle.svg - breeze/16/draw-circle.svg + traced/16/autoconnect.svg + traced/large16/autoconnect.svg + traced/22/autoconnect.svg + traced/large22/autoconnect.svg + traced/large16/autoconnect.svg + traced/large16/autoconnect.svg + generated/traced-large-24/autoconnect.svg + generated/traced-large-24/autoconnect.svg + traced/large16/autoconnect.svg + traced/large16/autoconnect.svg + traced/large16/autoconnect.svg + traced/large16/autoconnect.svg + generated/traced-24/autoconnect.svg + generated/traced-large-24/autoconnect.svg + traced/large22/autoconnect.svg + traced/16/bring_forward.svg + traced/large16/bring_forward.svg + traced/22/bring_forward.svg + traced/large22/bring_forward.svg + traced/large16/bring_forward.svg + traced/large16/bring_forward.svg + generated/traced-large-24/bring_forward.svg + generated/traced-large-24/bring_forward.svg + traced/large16/bring_forward.svg + traced/large16/bring_forward.svg + traced/large16/bring_forward.svg + traced/large16/bring_forward.svg + generated/traced-24/bring_forward.svg + generated/traced-large-24/bring_forward.svg + traced/large22/bring_forward.svg + traced/16/circle.svg + traced/large16/circle.svg + traced/22/circle.svg + traced/large22/circle.svg + traced/large16/circle.svg + traced/large16/circle.svg + generated/traced-large-24/circle.svg + generated/traced-large-24/circle.svg + traced/large16/circle.svg + traced/large16/circle.svg + traced/large16/circle.svg + traced/large16/circle.svg + generated/traced-24/circle.svg + generated/traced-large-24/circle.svg + traced/large22/circle.svg + traced/16/conductor.svg + traced/large16/conductor.svg + traced/22/conductor.svg + traced/large22/conductor.svg + traced/large16/conductor.svg + traced/large16/conductor.svg + generated/traced-large-24/conductor.svg + generated/traced-large-24/conductor.svg + traced/large16/conductor.svg + traced/large16/conductor.svg + traced/large16/conductor.svg + traced/large16/conductor.svg + generated/traced-24/conductor.svg + generated/traced-large-24/conductor.svg + traced/large22/conductor.svg traced/16/conductor-edit.svg traced/large16/conductor-edit.svg traced/22/conductor-edit.svg @@ -527,6 +557,18 @@ generated/breeze-24/document-save-as.svg breeze/32/document-save-as.svg breeze/32/document-save-as.svg + scalable/16/draw-fillet.svg + generated/scalable-22/draw-fillet.svg + scalable/16/draw-fillet.svg + scalable/draw-fillet.svg + scalable/16/draw-fillet.svg + scalable/16/draw-fillet.svg + scalable/16/draw-fillet.svg + generated/scalable-22/draw-fillet.svg + scalable/16/draw-fillet.svg + scalable/draw-fillet.svg + scalable/16/draw-fillet.svg + scalable/16/draw-fillet.svg traced/16/east.svg traced/large16/east.svg traced/22/east.svg @@ -815,6 +857,21 @@ generated/breeze-24/edit-undo.svg breeze/32/edit-undo.svg breeze/32/edit-undo.svg + traced/16/element.svg + traced/large16/element.svg + traced/22/element.svg + traced/large22/element.svg + traced/large16/element.svg + traced/large16/element.svg + generated/traced-large-24/element.svg + generated/traced-large-24/element.svg + traced/large16/element.svg + traced/large16/element.svg + traced/large16/element.svg + traced/large16/element.svg + generated/traced-24/element.svg + generated/traced-large-24/element.svg + traced/large22/element.svg traced/16/element-delete.svg traced/large16/element-delete.svg traced/22/element-delete.svg @@ -890,19 +947,21 @@ generated/traced-24/element-slave.svg generated/traced-large-24/element-slave.svg traced/large22/element-slave.svg - breeze/16/draw-ellipse.svg - breeze/22/draw-ellipse.svg - generated/breeze-24/draw-ellipse.svg - breeze/16/draw-ellipse.svg - generated/breeze-24/draw-ellipse.svg - breeze/16/draw-ellipse.svg - breeze/16/draw-ellipse.svg - breeze/16/draw-ellipse.svg - breeze/22/draw-ellipse.svg - breeze/16/draw-ellipse.svg - generated/breeze-24/draw-ellipse.svg - breeze/16/draw-ellipse.svg - breeze/16/draw-ellipse.svg + traced/16/ellipse.svg + traced/large16/ellipse.svg + traced/22/ellipse.svg + traced/large22/ellipse.svg + traced/large16/ellipse.svg + traced/large16/ellipse.svg + generated/traced-large-24/ellipse.svg + generated/traced-large-24/ellipse.svg + traced/large16/ellipse.svg + traced/large16/ellipse.svg + traced/large16/ellipse.svg + traced/large16/ellipse.svg + generated/traced-24/ellipse.svg + generated/traced-large-24/ellipse.svg + traced/large22/ellipse.svg traced/16/endline-circle.svg traced/large16/endline-circle.svg traced/22/endline-circle.svg @@ -1609,6 +1668,21 @@ generated/breeze-24/object-flip-horizontal.svg breeze/16/object-flip-horizontal.svg breeze/16/object-flip-horizontal.svg + traced/16/move.svg + traced/large16/move.svg + traced/22/move.svg + traced/large22/move.svg + traced/large16/move.svg + traced/large16/move.svg + generated/traced-large-24/move.svg + generated/traced-large-24/move.svg + traced/large16/move.svg + traced/large16/move.svg + traced/large16/move.svg + traced/large16/move.svg + generated/traced-24/move.svg + generated/traced-large-24/move.svg + traced/large22/move.svg traced/16/names.svg traced/large16/names.svg traced/22/names.svg @@ -1864,6 +1938,36 @@ generated/traced-24/project-properties.svg generated/traced-large-24/project-properties.svg traced/large22/project-properties.svg + traced/16/qet.svg + traced/large16/qet.svg + traced/22/qet.svg + traced/large22/qet.svg + traced/large16/qet.svg + traced/large16/qet.svg + generated/traced-large-24/qet.svg + generated/traced-large-24/qet.svg + traced/large16/qet.svg + traced/large16/qet.svg + traced/large16/qet.svg + traced/large16/qet.svg + generated/traced-24/qet.svg + generated/traced-large-24/qet.svg + traced/large22/qet.svg + traced/16/qt.svg + traced/large16/qt.svg + traced/22/qt.svg + traced/large22/qt.svg + traced/large16/qt.svg + traced/large16/qt.svg + traced/large22/qt.svg + traced/large22/qt.svg + traced/large16/qt.svg + traced/large16/qt.svg + traced/large16/qt.svg + traced/large16/qt.svg + generated/traced-24/qt.svg + traced/large22/qt.svg + traced/large22/qt.svg traced/16/raise.svg traced/large16/raise.svg traced/22/raise.svg @@ -2171,6 +2275,21 @@ generated/breeze-24/view-pages-facing.svg breeze/16/view-pages-facing.svg breeze/16/view-pages-facing.svg + traced/16/user-away-extended.svg + traced/large16/user-away-extended.svg + traced/22/user-away-extended.svg + traced/large22/user-away-extended.svg + traced/large16/user-away-extended.svg + traced/large16/user-away-extended.svg + generated/traced-large-24/user-away-extended.svg + generated/traced-large-24/user-away-extended.svg + traced/large16/user-away-extended.svg + traced/large16/user-away-extended.svg + traced/large16/user-away-extended.svg + traced/large16/user-away-extended.svg + generated/traced-24/user-away-extended.svg + generated/traced-large-24/user-away-extended.svg + traced/large22/user-away-extended.svg breeze/16/im-user-busy.svg breeze/22/im-user-busy.svg generated/breeze-24/im-user-busy.svg @@ -2197,19 +2316,21 @@ generated/breeze-24/im-user-online.svg breeze/16/im-user-online.svg breeze/16/im-user-online.svg - breeze/16/zoom-fit-best.svg - breeze/22/zoom-fit-best.svg - generated/breeze-24/zoom-fit-best.svg - breeze/32/zoom-fit-best.svg - generated/breeze-24/zoom-fit-best.svg - breeze/32/zoom-fit-best.svg - breeze/32/zoom-fit-best.svg - breeze/32/zoom-fit-best.svg - breeze/22/zoom-fit-best.svg - breeze/32/zoom-fit-best.svg - generated/breeze-24/zoom-fit-best.svg - breeze/32/zoom-fit-best.svg - breeze/32/zoom-fit-best.svg + traced/16/view-fit-window.svg + traced/large16/view-fit-window.svg + traced/22/view-fit-window.svg + traced/large22/view-fit-window.svg + traced/large16/view-fit-window.svg + traced/large16/view-fit-window.svg + generated/traced-large-24/view-fit-window.svg + generated/traced-large-24/view-fit-window.svg + traced/large16/view-fit-window.svg + traced/large16/view-fit-window.svg + traced/large16/view-fit-window.svg + traced/large16/view-fit-window.svg + generated/traced-24/view-fit-window.svg + generated/traced-large-24/view-fit-window.svg + traced/large22/view-fit-window.svg breeze/16/view-fullscreen.svg breeze/22/view-fullscreen.svg generated/breeze-24/view-fullscreen.svg @@ -2370,27 +2491,14 @@ generated/breeze-24/zoom-out.svg breeze/32/zoom-out.svg breeze/32/zoom-out.svg - themes/qet-dark/16x16/edit-clear-locationbar-rtl.png - themes/qet-dark/16x16/element.png - themes/qet-dark/16x16/move.png - themes/qet-dark/22x22/Actions-player-time-icon.png - themes/qet-dark/22x22/arc.png - themes/qet-dark/22x22/edit-clear-locationbar-rtl.png - themes/qet-dark/22x22/move.png - themes/qet-dark/32x32/format-text-color.png - themes/qet-dark/32x32/insert-link.png - themes/qet-dark/32x32/printer.png - themes/qet-dark/48x48/user-away-extended.png - themes/qet-dark/48x48/user-away.png - themes/qet-dark/128x128/settings.png themes/qet-dark/scalable/align-horizontal-center.svg themes/qet-dark/scalable/align-horizontal-left.svg - themes/qet-dark/scalable/draw-fillet.svg themes/qet-dark/scalable/align-horizontal-right.svg themes/qet-dark/scalable/align-vertical-bottom.svg themes/qet-dark/scalable/align-vertical-center.svg themes/qet-dark/scalable/align-vertical-top.svg themes/qet-dark/scalable/diagram.svg + themes/qet-dark/scalable/draw-fillet.svg themes/qet-dark/scalable/folio-delete.svg themes/qet-dark/scalable/folio-new.svg themes/qet-dark/scalable/folio-properties.svg @@ -2408,9 +2516,7 @@ themes/qet-dark/scalable-16/align-horizontal-center.svg themes/qet-dark/scalable-22/align-horizontal-center.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable-22/align-horizontal-left.svg - themes/qet-dark/scalable-22/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-right.svg themes/qet-dark/scalable-22/align-horizontal-right.svg themes/qet-dark/scalable-16/align-vertical-bottom.svg @@ -2428,6 +2534,12 @@ themes/qet-dark/breeze/16/amarok_change_language.svg themes/qet-dark/breeze/22/amarok_change_language.svg themes/qet-dark/breeze-24/amarok_change_language.svg + themes/qet-dark/traced/16/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced/22/arc.svg + themes/qet-dark/traced/large22/arc.svg + themes/qet-dark/traced-large-24/arc.svg + themes/qet-dark/traced-24/arc.svg themes/qet-dark/breeze/16/go-previous.svg themes/qet-dark/breeze/22/go-previous.svg themes/qet-dark/breeze-24/go-previous.svg @@ -2448,9 +2560,30 @@ themes/qet-dark/traced/large22/arrow-right-double.svg themes/qet-dark/traced-large-24/arrow-right-double.svg themes/qet-dark/traced-24/arrow-right-double.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze/22/draw-circle.svg - themes/qet-dark/breeze-24/draw-circle.svg + themes/qet-dark/traced/16/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced/22/autoconnect.svg + themes/qet-dark/traced/large22/autoconnect.svg + themes/qet-dark/traced-large-24/autoconnect.svg + themes/qet-dark/traced-24/autoconnect.svg + themes/qet-dark/traced/16/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced/22/bring_forward.svg + themes/qet-dark/traced/large22/bring_forward.svg + themes/qet-dark/traced-large-24/bring_forward.svg + themes/qet-dark/traced-24/bring_forward.svg + themes/qet-dark/traced/16/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced/22/circle.svg + themes/qet-dark/traced/large22/circle.svg + themes/qet-dark/traced-large-24/circle.svg + themes/qet-dark/traced-24/circle.svg + themes/qet-dark/traced/16/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced/22/conductor.svg + themes/qet-dark/traced/large22/conductor.svg + themes/qet-dark/traced-large-24/conductor.svg + themes/qet-dark/traced-24/conductor.svg themes/qet-dark/traced/16/conductor-edit.svg themes/qet-dark/traced/large16/conductor-edit.svg themes/qet-dark/traced/22/conductor-edit.svg @@ -2525,6 +2658,8 @@ themes/qet-dark/breeze/22/document-save-as.svg themes/qet-dark/breeze-24/document-save-as.svg themes/qet-dark/breeze/32/document-save-as.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable-22/draw-fillet.svg themes/qet-dark/traced/16/east.svg themes/qet-dark/traced/large16/east.svg themes/qet-dark/traced/22/east.svg @@ -2594,6 +2729,12 @@ themes/qet-dark/breeze/22/edit-undo.svg themes/qet-dark/breeze-24/edit-undo.svg themes/qet-dark/breeze/32/edit-undo.svg + themes/qet-dark/traced/16/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced/22/element.svg + themes/qet-dark/traced/large22/element.svg + themes/qet-dark/traced-large-24/element.svg + themes/qet-dark/traced-24/element.svg themes/qet-dark/traced/16/element-delete.svg themes/qet-dark/traced/large16/element-delete.svg themes/qet-dark/traced/22/element-delete.svg @@ -2624,9 +2765,12 @@ themes/qet-dark/traced/large22/element-slave.svg themes/qet-dark/traced-large-24/element-slave.svg themes/qet-dark/traced-24/element-slave.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze/22/draw-ellipse.svg - themes/qet-dark/breeze-24/draw-ellipse.svg + themes/qet-dark/traced/16/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced/22/ellipse.svg + themes/qet-dark/traced/large22/ellipse.svg + themes/qet-dark/traced-large-24/ellipse.svg + themes/qet-dark/traced-24/ellipse.svg themes/qet-dark/traced/16/endline-circle.svg themes/qet-dark/traced/large16/endline-circle.svg themes/qet-dark/traced/22/endline-circle.svg @@ -2814,6 +2958,12 @@ themes/qet-dark/breeze/16/object-flip-horizontal.svg themes/qet-dark/breeze/22/object-flip-horizontal.svg themes/qet-dark/breeze-24/object-flip-horizontal.svg + themes/qet-dark/traced/16/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced/22/move.svg + themes/qet-dark/traced/large22/move.svg + themes/qet-dark/traced-large-24/move.svg + themes/qet-dark/traced-24/move.svg themes/qet-dark/traced/16/names.svg themes/qet-dark/traced/large16/names.svg themes/qet-dark/traced/22/names.svg @@ -2945,10 +3095,18 @@ themes/qet-dark/breeze/16/view-pages-facing.svg themes/qet-dark/breeze/22/view-pages-facing.svg themes/qet-dark/breeze-24/view-pages-facing.svg - themes/qet-dark/breeze/16/zoom-fit-best.svg - themes/qet-dark/breeze/22/zoom-fit-best.svg - themes/qet-dark/breeze-24/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg + themes/qet-dark/traced/16/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced/22/user-away-extended.svg + themes/qet-dark/traced/large22/user-away-extended.svg + themes/qet-dark/traced-large-24/user-away-extended.svg + themes/qet-dark/traced-24/user-away-extended.svg + themes/qet-dark/traced/16/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced/22/view-fit-window.svg + themes/qet-dark/traced/large22/view-fit-window.svg + themes/qet-dark/traced-large-24/view-fit-window.svg + themes/qet-dark/traced-24/view-fit-window.svg themes/qet-dark/breeze/16/view-fullscreen.svg themes/qet-dark/breeze/22/view-fullscreen.svg themes/qet-dark/breeze-24/view-fullscreen.svg @@ -2975,6 +3133,10 @@ themes/qet-dark/breeze/16/window-new.svg themes/qet-dark/breeze/22/window-new.svg themes/qet-dark/breeze-24/window-new.svg + themes/qet-dark/breeze/16/zoom-fit-best.svg + themes/qet-dark/breeze/22/zoom-fit-best.svg + themes/qet-dark/breeze-24/zoom-fit-best.svg + themes/qet-dark/breeze/32/zoom-fit-best.svg themes/qet-dark/traced/16/zoom-fit-best.svg themes/qet-dark/traced/large16/zoom-fit-best.svg themes/qet-dark/traced/22/zoom-fit-best.svg @@ -3006,29 +3168,17 @@ themes/qet-dark/scalable-16/align-horizontal-center.svg themes/qet-dark/scalable-16/align-horizontal-center.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable-22/align-horizontal-left.svg - themes/qet-dark/scalable-22/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable/align-horizontal-left.svg - themes/qet-dark/scalable/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable-22/align-horizontal-left.svg - themes/qet-dark/scalable-22/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable/align-horizontal-left.svg - themes/qet-dark/scalable/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-left.svg - themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/scalable-16/align-horizontal-right.svg themes/qet-dark/scalable-22/align-horizontal-right.svg themes/qet-dark/scalable-16/align-horizontal-right.svg @@ -3105,6 +3255,21 @@ themes/qet-dark/breeze-24/amarok_change_language.svg themes/qet-dark/breeze/16/amarok_change_language.svg themes/qet-dark/breeze/16/amarok_change_language.svg + themes/qet-dark/traced/16/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced/22/arc.svg + themes/qet-dark/traced/large22/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced-large-24/arc.svg + themes/qet-dark/traced-large-24/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced/large16/arc.svg + themes/qet-dark/traced-24/arc.svg + themes/qet-dark/traced-large-24/arc.svg + themes/qet-dark/traced/large22/arc.svg themes/qet-dark/breeze/16/go-previous.svg themes/qet-dark/breeze/22/go-previous.svg themes/qet-dark/breeze-24/go-previous.svg @@ -3161,19 +3326,66 @@ themes/qet-dark/traced-24/arrow-right-double.svg themes/qet-dark/traced-large-24/arrow-right-double.svg themes/qet-dark/traced/large22/arrow-right-double.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze/22/draw-circle.svg - themes/qet-dark/breeze-24/draw-circle.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze-24/draw-circle.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze/22/draw-circle.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze-24/draw-circle.svg - themes/qet-dark/breeze/16/draw-circle.svg - themes/qet-dark/breeze/16/draw-circle.svg + themes/qet-dark/traced/16/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced/22/autoconnect.svg + themes/qet-dark/traced/large22/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced-large-24/autoconnect.svg + themes/qet-dark/traced-large-24/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced/large16/autoconnect.svg + themes/qet-dark/traced-24/autoconnect.svg + themes/qet-dark/traced-large-24/autoconnect.svg + themes/qet-dark/traced/large22/autoconnect.svg + themes/qet-dark/traced/16/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced/22/bring_forward.svg + themes/qet-dark/traced/large22/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced-large-24/bring_forward.svg + themes/qet-dark/traced-large-24/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced/large16/bring_forward.svg + themes/qet-dark/traced-24/bring_forward.svg + themes/qet-dark/traced-large-24/bring_forward.svg + themes/qet-dark/traced/large22/bring_forward.svg + themes/qet-dark/traced/16/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced/22/circle.svg + themes/qet-dark/traced/large22/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced-large-24/circle.svg + themes/qet-dark/traced-large-24/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced/large16/circle.svg + themes/qet-dark/traced-24/circle.svg + themes/qet-dark/traced-large-24/circle.svg + themes/qet-dark/traced/large22/circle.svg + themes/qet-dark/traced/16/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced/22/conductor.svg + themes/qet-dark/traced/large22/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced-large-24/conductor.svg + themes/qet-dark/traced-large-24/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced/large16/conductor.svg + themes/qet-dark/traced-24/conductor.svg + themes/qet-dark/traced-large-24/conductor.svg + themes/qet-dark/traced/large22/conductor.svg themes/qet-dark/traced/16/conductor-edit.svg themes/qet-dark/traced/large16/conductor-edit.svg themes/qet-dark/traced/22/conductor-edit.svg @@ -3415,6 +3627,18 @@ themes/qet-dark/breeze-24/document-save-as.svg themes/qet-dark/breeze/32/document-save-as.svg themes/qet-dark/breeze/32/document-save-as.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable-22/draw-fillet.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable/draw-fillet.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable-22/draw-fillet.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable/draw-fillet.svg + themes/qet-dark/scalable-16/draw-fillet.svg + themes/qet-dark/scalable-16/draw-fillet.svg themes/qet-dark/traced/16/east.svg themes/qet-dark/traced/large16/east.svg themes/qet-dark/traced/22/east.svg @@ -3690,6 +3914,21 @@ themes/qet-dark/breeze-24/edit-undo.svg themes/qet-dark/breeze/32/edit-undo.svg themes/qet-dark/breeze/32/edit-undo.svg + themes/qet-dark/traced/16/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced/22/element.svg + themes/qet-dark/traced/large22/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced-large-24/element.svg + themes/qet-dark/traced-large-24/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced/large16/element.svg + themes/qet-dark/traced-24/element.svg + themes/qet-dark/traced-large-24/element.svg + themes/qet-dark/traced/large22/element.svg themes/qet-dark/traced/16/element-delete.svg themes/qet-dark/traced/large16/element-delete.svg themes/qet-dark/traced/22/element-delete.svg @@ -3765,19 +4004,21 @@ themes/qet-dark/traced-24/element-slave.svg themes/qet-dark/traced-large-24/element-slave.svg themes/qet-dark/traced/large22/element-slave.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze/22/draw-ellipse.svg - themes/qet-dark/breeze-24/draw-ellipse.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze-24/draw-ellipse.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze/22/draw-ellipse.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze-24/draw-ellipse.svg - themes/qet-dark/breeze/16/draw-ellipse.svg - themes/qet-dark/breeze/16/draw-ellipse.svg + themes/qet-dark/traced/16/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced/22/ellipse.svg + themes/qet-dark/traced/large22/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced-large-24/ellipse.svg + themes/qet-dark/traced-large-24/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced/large16/ellipse.svg + themes/qet-dark/traced-24/ellipse.svg + themes/qet-dark/traced-large-24/ellipse.svg + themes/qet-dark/traced/large22/ellipse.svg themes/qet-dark/traced/16/endline-circle.svg themes/qet-dark/traced/large16/endline-circle.svg themes/qet-dark/traced/22/endline-circle.svg @@ -4428,6 +4669,21 @@ themes/qet-dark/breeze-24/object-flip-horizontal.svg themes/qet-dark/breeze/16/object-flip-horizontal.svg themes/qet-dark/breeze/16/object-flip-horizontal.svg + themes/qet-dark/traced/16/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced/22/move.svg + themes/qet-dark/traced/large22/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced-large-24/move.svg + themes/qet-dark/traced-large-24/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced/large16/move.svg + themes/qet-dark/traced-24/move.svg + themes/qet-dark/traced-large-24/move.svg + themes/qet-dark/traced/large22/move.svg themes/qet-dark/traced/16/names.svg themes/qet-dark/traced/large16/names.svg themes/qet-dark/traced/22/names.svg @@ -4853,19 +5109,36 @@ themes/qet-dark/breeze-24/view-pages-facing.svg themes/qet-dark/breeze/16/view-pages-facing.svg themes/qet-dark/breeze/16/view-pages-facing.svg - themes/qet-dark/breeze/16/zoom-fit-best.svg - themes/qet-dark/breeze/22/zoom-fit-best.svg - themes/qet-dark/breeze-24/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg - themes/qet-dark/breeze-24/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg - themes/qet-dark/breeze/22/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg - themes/qet-dark/breeze-24/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg - themes/qet-dark/breeze/32/zoom-fit-best.svg + themes/qet-dark/traced/16/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced/22/user-away-extended.svg + themes/qet-dark/traced/large22/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced-large-24/user-away-extended.svg + themes/qet-dark/traced-large-24/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced/large16/user-away-extended.svg + themes/qet-dark/traced-24/user-away-extended.svg + themes/qet-dark/traced-large-24/user-away-extended.svg + themes/qet-dark/traced/large22/user-away-extended.svg + themes/qet-dark/traced/16/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced/22/view-fit-window.svg + themes/qet-dark/traced/large22/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced-large-24/view-fit-window.svg + themes/qet-dark/traced-large-24/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced/large16/view-fit-window.svg + themes/qet-dark/traced-24/view-fit-window.svg + themes/qet-dark/traced-large-24/view-fit-window.svg + themes/qet-dark/traced/large22/view-fit-window.svg themes/qet-dark/breeze/16/view-fullscreen.svg themes/qet-dark/breeze/22/view-fullscreen.svg themes/qet-dark/breeze-24/view-fullscreen.svg @@ -5026,7 +5299,6 @@ themes/qet-dark/breeze-24/zoom-out.svg themes/qet-dark/breeze/32/zoom-out.svg themes/qet-dark/breeze/32/zoom-out.svg - 128x128/printer.png traced/22/titleblock-bottom.svg generated/traced-24/titleblock-bottom.svg traced/22/titleblock-right.svg diff --git a/ico/themes/qet-dark/128x128/settings.png b/ico/themes/qet-dark/128x128/settings.png deleted file mode 100644 index 93b34f1ad..000000000 Binary files a/ico/themes/qet-dark/128x128/settings.png and /dev/null differ diff --git a/ico/themes/qet-dark/16x16/edit-clear-locationbar-rtl.png b/ico/themes/qet-dark/16x16/edit-clear-locationbar-rtl.png deleted file mode 100644 index 5ba190483..000000000 Binary files a/ico/themes/qet-dark/16x16/edit-clear-locationbar-rtl.png and /dev/null differ diff --git a/ico/themes/qet-dark/16x16/element.png b/ico/themes/qet-dark/16x16/element.png deleted file mode 100644 index 44d0e8702..000000000 Binary files a/ico/themes/qet-dark/16x16/element.png and /dev/null differ diff --git a/ico/themes/qet-dark/16x16/move.png b/ico/themes/qet-dark/16x16/move.png deleted file mode 100644 index ba16ed79c..000000000 Binary files a/ico/themes/qet-dark/16x16/move.png and /dev/null differ diff --git a/ico/themes/qet-dark/22x22/Actions-player-time-icon.png b/ico/themes/qet-dark/22x22/Actions-player-time-icon.png deleted file mode 100644 index f7cfeec5f..000000000 Binary files a/ico/themes/qet-dark/22x22/Actions-player-time-icon.png and /dev/null differ diff --git a/ico/themes/qet-dark/22x22/arc.png b/ico/themes/qet-dark/22x22/arc.png deleted file mode 100644 index a7b112291..000000000 Binary files a/ico/themes/qet-dark/22x22/arc.png and /dev/null differ diff --git a/ico/themes/qet-dark/22x22/edit-clear-locationbar-rtl.png b/ico/themes/qet-dark/22x22/edit-clear-locationbar-rtl.png deleted file mode 100644 index 4e790b4d3..000000000 Binary files a/ico/themes/qet-dark/22x22/edit-clear-locationbar-rtl.png and /dev/null differ diff --git a/ico/themes/qet-dark/22x22/move.png b/ico/themes/qet-dark/22x22/move.png deleted file mode 100644 index 97f50985d..000000000 Binary files a/ico/themes/qet-dark/22x22/move.png and /dev/null differ diff --git a/ico/themes/qet-dark/32x32/format-text-color.png b/ico/themes/qet-dark/32x32/format-text-color.png deleted file mode 100644 index fd28e4058..000000000 Binary files a/ico/themes/qet-dark/32x32/format-text-color.png and /dev/null differ diff --git a/ico/themes/qet-dark/32x32/insert-link.png b/ico/themes/qet-dark/32x32/insert-link.png deleted file mode 100644 index 8b2611840..000000000 Binary files a/ico/themes/qet-dark/32x32/insert-link.png and /dev/null differ diff --git a/ico/themes/qet-dark/32x32/printer.png b/ico/themes/qet-dark/32x32/printer.png deleted file mode 100644 index cabec7e10..000000000 Binary files a/ico/themes/qet-dark/32x32/printer.png and /dev/null differ diff --git a/ico/themes/qet-dark/48x48/user-away-extended.png b/ico/themes/qet-dark/48x48/user-away-extended.png deleted file mode 100644 index a3b9e1c8e..000000000 Binary files a/ico/themes/qet-dark/48x48/user-away-extended.png and /dev/null differ diff --git a/ico/themes/qet-dark/48x48/user-away.png b/ico/themes/qet-dark/48x48/user-away.png deleted file mode 100644 index a3b9e1c8e..000000000 Binary files a/ico/themes/qet-dark/48x48/user-away.png and /dev/null differ diff --git a/ico/themes/qet-dark/breeze-24/draw-circle.svg b/ico/themes/qet-dark/breeze-24/draw-circle.svg deleted file mode 100644 index 24a47d8ba..000000000 --- a/ico/themes/qet-dark/breeze-24/draw-circle.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/ico/themes/qet-dark/breeze-24/draw-ellipse.svg b/ico/themes/qet-dark/breeze-24/draw-ellipse.svg deleted file mode 100644 index b555a2f27..000000000 --- a/ico/themes/qet-dark/breeze-24/draw-ellipse.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/ico/themes/qet-dark/breeze/16/draw-circle.svg b/ico/themes/qet-dark/breeze/16/draw-circle.svg deleted file mode 100644 index 6be8bad15..000000000 --- a/ico/themes/qet-dark/breeze/16/draw-circle.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/themes/qet-dark/breeze/16/draw-ellipse.svg b/ico/themes/qet-dark/breeze/16/draw-ellipse.svg deleted file mode 100644 index 69e16fb55..000000000 --- a/ico/themes/qet-dark/breeze/16/draw-ellipse.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/themes/qet-dark/breeze/22/draw-circle.svg b/ico/themes/qet-dark/breeze/22/draw-circle.svg deleted file mode 100644 index 0938c51c9..000000000 --- a/ico/themes/qet-dark/breeze/22/draw-circle.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/themes/qet-dark/breeze/22/draw-ellipse.svg b/ico/themes/qet-dark/breeze/22/draw-ellipse.svg deleted file mode 100644 index 6ec4427de..000000000 --- a/ico/themes/qet-dark/breeze/22/draw-ellipse.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/ico/themes/qet-dark/traced-24/arc.svg b/ico/themes/qet-dark/traced-24/arc.svg new file mode 100644 index 000000000..c4b414eaf --- /dev/null +++ b/ico/themes/qet-dark/traced-24/arc.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/autoconnect.svg b/ico/themes/qet-dark/traced-24/autoconnect.svg new file mode 100644 index 000000000..cc26af7a3 --- /dev/null +++ b/ico/themes/qet-dark/traced-24/autoconnect.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/bring_forward.svg b/ico/themes/qet-dark/traced-24/bring_forward.svg new file mode 100644 index 000000000..b95a85e10 --- /dev/null +++ b/ico/themes/qet-dark/traced-24/bring_forward.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/circle.svg b/ico/themes/qet-dark/traced-24/circle.svg new file mode 100644 index 000000000..aaf079f33 --- /dev/null +++ b/ico/themes/qet-dark/traced-24/circle.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/conductor.svg b/ico/themes/qet-dark/traced-24/conductor.svg new file mode 100644 index 000000000..90fb92c60 --- /dev/null +++ b/ico/themes/qet-dark/traced-24/conductor.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/element.svg b/ico/themes/qet-dark/traced-24/element.svg new file mode 100644 index 000000000..c7783399f --- /dev/null +++ b/ico/themes/qet-dark/traced-24/element.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/ellipse.svg b/ico/themes/qet-dark/traced-24/ellipse.svg new file mode 100644 index 000000000..676e31291 --- /dev/null +++ b/ico/themes/qet-dark/traced-24/ellipse.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/move.svg b/ico/themes/qet-dark/traced-24/move.svg new file mode 100644 index 000000000..2153d6528 --- /dev/null +++ b/ico/themes/qet-dark/traced-24/move.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/user-away-extended.svg b/ico/themes/qet-dark/traced-24/user-away-extended.svg new file mode 100644 index 000000000..9ec112a77 --- /dev/null +++ b/ico/themes/qet-dark/traced-24/user-away-extended.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-24/view-fit-window.svg b/ico/themes/qet-dark/traced-24/view-fit-window.svg new file mode 100644 index 000000000..1e871071e --- /dev/null +++ b/ico/themes/qet-dark/traced-24/view-fit-window.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/arc.svg b/ico/themes/qet-dark/traced-large-24/arc.svg new file mode 100644 index 000000000..6a66b9f94 --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/arc.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/autoconnect.svg b/ico/themes/qet-dark/traced-large-24/autoconnect.svg new file mode 100644 index 000000000..763aedd3d --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/autoconnect.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/bring_forward.svg b/ico/themes/qet-dark/traced-large-24/bring_forward.svg new file mode 100644 index 000000000..fa7cd8228 --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/bring_forward.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/circle.svg b/ico/themes/qet-dark/traced-large-24/circle.svg new file mode 100644 index 000000000..177ab3ce0 --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/circle.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/conductor.svg b/ico/themes/qet-dark/traced-large-24/conductor.svg new file mode 100644 index 000000000..49c646fbc --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/conductor.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/element.svg b/ico/themes/qet-dark/traced-large-24/element.svg new file mode 100644 index 000000000..9d98298f3 --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/element.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/ellipse.svg b/ico/themes/qet-dark/traced-large-24/ellipse.svg new file mode 100644 index 000000000..d078da777 --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/ellipse.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/move.svg b/ico/themes/qet-dark/traced-large-24/move.svg new file mode 100644 index 000000000..b15d9677d --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/move.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/user-away-extended.svg b/ico/themes/qet-dark/traced-large-24/user-away-extended.svg new file mode 100644 index 000000000..bfebb2da6 --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/user-away-extended.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced-large-24/view-fit-window.svg b/ico/themes/qet-dark/traced-large-24/view-fit-window.svg new file mode 100644 index 000000000..499d28daa --- /dev/null +++ b/ico/themes/qet-dark/traced-large-24/view-fit-window.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/arc.svg b/ico/themes/qet-dark/traced/16/arc.svg new file mode 100644 index 000000000..7f851111d --- /dev/null +++ b/ico/themes/qet-dark/traced/16/arc.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/autoconnect.svg b/ico/themes/qet-dark/traced/16/autoconnect.svg new file mode 100644 index 000000000..d457a6b94 --- /dev/null +++ b/ico/themes/qet-dark/traced/16/autoconnect.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/bring_forward.svg b/ico/themes/qet-dark/traced/16/bring_forward.svg new file mode 100644 index 000000000..64607e324 --- /dev/null +++ b/ico/themes/qet-dark/traced/16/bring_forward.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/circle.svg b/ico/themes/qet-dark/traced/16/circle.svg new file mode 100644 index 000000000..f6f289104 --- /dev/null +++ b/ico/themes/qet-dark/traced/16/circle.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/conductor.svg b/ico/themes/qet-dark/traced/16/conductor.svg new file mode 100644 index 000000000..bfbc696b8 --- /dev/null +++ b/ico/themes/qet-dark/traced/16/conductor.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/element.svg b/ico/themes/qet-dark/traced/16/element.svg new file mode 100644 index 000000000..8e3ca766d --- /dev/null +++ b/ico/themes/qet-dark/traced/16/element.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/ellipse.svg b/ico/themes/qet-dark/traced/16/ellipse.svg new file mode 100644 index 000000000..f20e3683e --- /dev/null +++ b/ico/themes/qet-dark/traced/16/ellipse.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/move.svg b/ico/themes/qet-dark/traced/16/move.svg new file mode 100644 index 000000000..ac7aa5191 --- /dev/null +++ b/ico/themes/qet-dark/traced/16/move.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/user-away-extended.svg b/ico/themes/qet-dark/traced/16/user-away-extended.svg new file mode 100644 index 000000000..9a1cbc6e8 --- /dev/null +++ b/ico/themes/qet-dark/traced/16/user-away-extended.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/16/view-fit-window.svg b/ico/themes/qet-dark/traced/16/view-fit-window.svg new file mode 100644 index 000000000..40cd1f8d8 --- /dev/null +++ b/ico/themes/qet-dark/traced/16/view-fit-window.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/arc.svg b/ico/themes/qet-dark/traced/22/arc.svg new file mode 100644 index 000000000..9b542da79 --- /dev/null +++ b/ico/themes/qet-dark/traced/22/arc.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/autoconnect.svg b/ico/themes/qet-dark/traced/22/autoconnect.svg new file mode 100644 index 000000000..00503bad5 --- /dev/null +++ b/ico/themes/qet-dark/traced/22/autoconnect.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/bring_forward.svg b/ico/themes/qet-dark/traced/22/bring_forward.svg new file mode 100644 index 000000000..e3c92e383 --- /dev/null +++ b/ico/themes/qet-dark/traced/22/bring_forward.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/circle.svg b/ico/themes/qet-dark/traced/22/circle.svg new file mode 100644 index 000000000..f5b1c6119 --- /dev/null +++ b/ico/themes/qet-dark/traced/22/circle.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/conductor.svg b/ico/themes/qet-dark/traced/22/conductor.svg new file mode 100644 index 000000000..87abf0ffd --- /dev/null +++ b/ico/themes/qet-dark/traced/22/conductor.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/element.svg b/ico/themes/qet-dark/traced/22/element.svg new file mode 100644 index 000000000..b7e08d23f --- /dev/null +++ b/ico/themes/qet-dark/traced/22/element.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/ellipse.svg b/ico/themes/qet-dark/traced/22/ellipse.svg new file mode 100644 index 000000000..4ed940cbc --- /dev/null +++ b/ico/themes/qet-dark/traced/22/ellipse.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/move.svg b/ico/themes/qet-dark/traced/22/move.svg new file mode 100644 index 000000000..d87d60e41 --- /dev/null +++ b/ico/themes/qet-dark/traced/22/move.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/user-away-extended.svg b/ico/themes/qet-dark/traced/22/user-away-extended.svg new file mode 100644 index 000000000..3ba6549bd --- /dev/null +++ b/ico/themes/qet-dark/traced/22/user-away-extended.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/22/view-fit-window.svg b/ico/themes/qet-dark/traced/22/view-fit-window.svg new file mode 100644 index 000000000..62149d0ff --- /dev/null +++ b/ico/themes/qet-dark/traced/22/view-fit-window.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/arc.svg b/ico/themes/qet-dark/traced/large16/arc.svg new file mode 100644 index 000000000..778242ad8 --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/arc.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/autoconnect.svg b/ico/themes/qet-dark/traced/large16/autoconnect.svg new file mode 100644 index 000000000..695a91a7b --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/autoconnect.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/bring_forward.svg b/ico/themes/qet-dark/traced/large16/bring_forward.svg new file mode 100644 index 000000000..9a888c0f4 --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/bring_forward.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/circle.svg b/ico/themes/qet-dark/traced/large16/circle.svg new file mode 100644 index 000000000..3a8ad1a61 --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/circle.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/conductor.svg b/ico/themes/qet-dark/traced/large16/conductor.svg new file mode 100644 index 000000000..d651eced5 --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/conductor.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/element.svg b/ico/themes/qet-dark/traced/large16/element.svg new file mode 100644 index 000000000..910792fe4 --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/element.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/ellipse.svg b/ico/themes/qet-dark/traced/large16/ellipse.svg new file mode 100644 index 000000000..ff55f773f --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/ellipse.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/move.svg b/ico/themes/qet-dark/traced/large16/move.svg new file mode 100644 index 000000000..e26d51b2c --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/move.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/user-away-extended.svg b/ico/themes/qet-dark/traced/large16/user-away-extended.svg new file mode 100644 index 000000000..b3052a3f4 --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/user-away-extended.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large16/view-fit-window.svg b/ico/themes/qet-dark/traced/large16/view-fit-window.svg new file mode 100644 index 000000000..2bb2ef2ff --- /dev/null +++ b/ico/themes/qet-dark/traced/large16/view-fit-window.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/arc.svg b/ico/themes/qet-dark/traced/large22/arc.svg new file mode 100644 index 000000000..a515a8392 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/arc.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/autoconnect.svg b/ico/themes/qet-dark/traced/large22/autoconnect.svg new file mode 100644 index 000000000..18a8605c0 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/autoconnect.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/bring_forward.svg b/ico/themes/qet-dark/traced/large22/bring_forward.svg new file mode 100644 index 000000000..b11386061 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/bring_forward.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/circle.svg b/ico/themes/qet-dark/traced/large22/circle.svg new file mode 100644 index 000000000..8a568e096 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/circle.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/conductor.svg b/ico/themes/qet-dark/traced/large22/conductor.svg new file mode 100644 index 000000000..05df7eb10 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/conductor.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/element.svg b/ico/themes/qet-dark/traced/large22/element.svg new file mode 100644 index 000000000..994cd0877 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/element.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/ellipse.svg b/ico/themes/qet-dark/traced/large22/ellipse.svg new file mode 100644 index 000000000..2692858f2 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/ellipse.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/move.svg b/ico/themes/qet-dark/traced/large22/move.svg new file mode 100644 index 000000000..8bd28ae84 --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/move.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/user-away-extended.svg b/ico/themes/qet-dark/traced/large22/user-away-extended.svg new file mode 100644 index 000000000..ead81c42b --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/user-away-extended.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ico/themes/qet-dark/traced/large22/view-fit-window.svg b/ico/themes/qet-dark/traced/large22/view-fit-window.svg new file mode 100644 index 000000000..4920fa0fe --- /dev/null +++ b/ico/themes/qet-dark/traced/large22/view-fit-window.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/traced/16/arc.svg b/ico/traced/16/arc.svg new file mode 100644 index 000000000..067b784ab --- /dev/null +++ b/ico/traced/16/arc.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/ico/traced/16/autoconnect.svg b/ico/traced/16/autoconnect.svg new file mode 100644 index 000000000..f7908086f --- /dev/null +++ b/ico/traced/16/autoconnect.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/ico/traced/16/bring_forward.svg b/ico/traced/16/bring_forward.svg new file mode 100644 index 000000000..bbcfafc85 --- /dev/null +++ b/ico/traced/16/bring_forward.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/traced/16/circle.svg b/ico/traced/16/circle.svg new file mode 100644 index 000000000..c05f542ee --- /dev/null +++ b/ico/traced/16/circle.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/ico/traced/16/conductor.svg b/ico/traced/16/conductor.svg new file mode 100644 index 000000000..16ca2aa30 --- /dev/null +++ b/ico/traced/16/conductor.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/ico/traced/16/element.svg b/ico/traced/16/element.svg new file mode 100644 index 000000000..65961d04c --- /dev/null +++ b/ico/traced/16/element.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/16/ellipse.svg b/ico/traced/16/ellipse.svg new file mode 100644 index 000000000..0c3515a70 --- /dev/null +++ b/ico/traced/16/ellipse.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/traced/16/move.svg b/ico/traced/16/move.svg new file mode 100644 index 000000000..ca1a69142 --- /dev/null +++ b/ico/traced/16/move.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/16/qet.svg b/ico/traced/16/qet.svg new file mode 100644 index 000000000..3a8c37a1f --- /dev/null +++ b/ico/traced/16/qet.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/16/qt.svg b/ico/traced/16/qt.svg new file mode 100644 index 000000000..1d39bbb5c --- /dev/null +++ b/ico/traced/16/qt.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/16/user-away-extended.svg b/ico/traced/16/user-away-extended.svg new file mode 100644 index 000000000..ade4e5c3a --- /dev/null +++ b/ico/traced/16/user-away-extended.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/16/view-fit-window.svg b/ico/traced/16/view-fit-window.svg new file mode 100644 index 000000000..2be401960 --- /dev/null +++ b/ico/traced/16/view-fit-window.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/traced/22/arc.svg b/ico/traced/22/arc.svg new file mode 100644 index 000000000..2f28cf24c --- /dev/null +++ b/ico/traced/22/arc.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/autoconnect.svg b/ico/traced/22/autoconnect.svg new file mode 100644 index 000000000..ca36d3aef --- /dev/null +++ b/ico/traced/22/autoconnect.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/traced/22/bring_forward.svg b/ico/traced/22/bring_forward.svg new file mode 100644 index 000000000..478f2c2df --- /dev/null +++ b/ico/traced/22/bring_forward.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/circle.svg b/ico/traced/22/circle.svg new file mode 100644 index 000000000..1dccc4a24 --- /dev/null +++ b/ico/traced/22/circle.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/conductor.svg b/ico/traced/22/conductor.svg new file mode 100644 index 000000000..b18342819 --- /dev/null +++ b/ico/traced/22/conductor.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/ico/traced/22/element.svg b/ico/traced/22/element.svg new file mode 100644 index 000000000..6fcf61e1c --- /dev/null +++ b/ico/traced/22/element.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/ellipse.svg b/ico/traced/22/ellipse.svg new file mode 100644 index 000000000..d31dc19be --- /dev/null +++ b/ico/traced/22/ellipse.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/move.svg b/ico/traced/22/move.svg new file mode 100644 index 000000000..4fabe5b6d --- /dev/null +++ b/ico/traced/22/move.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/qet.svg b/ico/traced/22/qet.svg new file mode 100644 index 000000000..ae4009302 --- /dev/null +++ b/ico/traced/22/qet.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/qt.svg b/ico/traced/22/qt.svg new file mode 100644 index 000000000..8c0534014 --- /dev/null +++ b/ico/traced/22/qt.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/user-away-extended.svg b/ico/traced/22/user-away-extended.svg new file mode 100644 index 000000000..77cb631c4 --- /dev/null +++ b/ico/traced/22/user-away-extended.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/22/view-fit-window.svg b/ico/traced/22/view-fit-window.svg new file mode 100644 index 000000000..c38944073 --- /dev/null +++ b/ico/traced/22/view-fit-window.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/traced/large16/arc.svg b/ico/traced/large16/arc.svg new file mode 100644 index 000000000..a02942c80 --- /dev/null +++ b/ico/traced/large16/arc.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/ico/traced/large16/autoconnect.svg b/ico/traced/large16/autoconnect.svg new file mode 100644 index 000000000..db1ba2417 --- /dev/null +++ b/ico/traced/large16/autoconnect.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/large16/bring_forward.svg b/ico/traced/large16/bring_forward.svg new file mode 100644 index 000000000..caa43e692 --- /dev/null +++ b/ico/traced/large16/bring_forward.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/traced/large16/circle.svg b/ico/traced/large16/circle.svg new file mode 100644 index 000000000..01eba33d3 --- /dev/null +++ b/ico/traced/large16/circle.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/traced/large16/conductor.svg b/ico/traced/large16/conductor.svg new file mode 100644 index 000000000..6721eccb2 --- /dev/null +++ b/ico/traced/large16/conductor.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/ico/traced/large16/element.svg b/ico/traced/large16/element.svg new file mode 100644 index 000000000..66b215a41 --- /dev/null +++ b/ico/traced/large16/element.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/ico/traced/large16/ellipse.svg b/ico/traced/large16/ellipse.svg new file mode 100644 index 000000000..e6a9bb7d0 --- /dev/null +++ b/ico/traced/large16/ellipse.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/traced/large16/move.svg b/ico/traced/large16/move.svg new file mode 100644 index 000000000..180e532c4 --- /dev/null +++ b/ico/traced/large16/move.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/ico/traced/large16/qet.svg b/ico/traced/large16/qet.svg new file mode 100644 index 000000000..8df27d1ca --- /dev/null +++ b/ico/traced/large16/qet.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/ico/traced/large16/qt.svg b/ico/traced/large16/qt.svg new file mode 100644 index 000000000..989d8e813 --- /dev/null +++ b/ico/traced/large16/qt.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/ico/traced/large16/user-away-extended.svg b/ico/traced/large16/user-away-extended.svg new file mode 100644 index 000000000..5bb547c5a --- /dev/null +++ b/ico/traced/large16/user-away-extended.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ico/traced/large16/view-fit-window.svg b/ico/traced/large16/view-fit-window.svg new file mode 100644 index 000000000..c7fd13771 --- /dev/null +++ b/ico/traced/large16/view-fit-window.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/ico/traced/large22/arc.svg b/ico/traced/large22/arc.svg new file mode 100644 index 000000000..dc582061a --- /dev/null +++ b/ico/traced/large22/arc.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/ico/traced/large22/autoconnect.svg b/ico/traced/large22/autoconnect.svg new file mode 100644 index 000000000..29a0bffa0 --- /dev/null +++ b/ico/traced/large22/autoconnect.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ico/traced/large22/bring_forward.svg b/ico/traced/large22/bring_forward.svg new file mode 100644 index 000000000..a7c59edb3 --- /dev/null +++ b/ico/traced/large22/bring_forward.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/ico/traced/large22/circle.svg b/ico/traced/large22/circle.svg new file mode 100644 index 000000000..344d34e0d --- /dev/null +++ b/ico/traced/large22/circle.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/traced/large22/conductor.svg b/ico/traced/large22/conductor.svg new file mode 100644 index 000000000..0c1afe579 --- /dev/null +++ b/ico/traced/large22/conductor.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ico/traced/large22/element.svg b/ico/traced/large22/element.svg new file mode 100644 index 000000000..0f84da760 --- /dev/null +++ b/ico/traced/large22/element.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/ico/traced/large22/ellipse.svg b/ico/traced/large22/ellipse.svg new file mode 100644 index 000000000..979506787 --- /dev/null +++ b/ico/traced/large22/ellipse.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ico/traced/large22/move.svg b/ico/traced/large22/move.svg new file mode 100644 index 000000000..2c505be49 --- /dev/null +++ b/ico/traced/large22/move.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/ico/traced/large22/qet.svg b/ico/traced/large22/qet.svg new file mode 100644 index 000000000..c889fac42 --- /dev/null +++ b/ico/traced/large22/qet.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/ico/traced/large22/qt.svg b/ico/traced/large22/qt.svg new file mode 100644 index 000000000..989d8e813 --- /dev/null +++ b/ico/traced/large22/qt.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/ico/traced/large22/user-away-extended.svg b/ico/traced/large22/user-away-extended.svg new file mode 100644 index 000000000..1b33be0c4 --- /dev/null +++ b/ico/traced/large22/user-away-extended.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ico/traced/large22/view-fit-window.svg b/ico/traced/large22/view-fit-window.svg new file mode 100644 index 000000000..5fd9421f5 --- /dev/null +++ b/ico/traced/large22/view-fit-window.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/misc/import_breeze_icons.py b/misc/import_breeze_icons.py index e8bd9af4a..3b9afbad0 100644 --- a/misc/import_breeze_icons.py +++ b/misc/import_breeze_icons.py @@ -29,6 +29,9 @@ and 32 pixels, unchanged: ico/breeze/22/.svg ico/breeze/32/.svg +The settings page icons in BREEZE_PAGES are copied from the one size +listed for each, to ico/breeze//.svg. + Many Breeze names are symbolic links to another file. The copy holds the linked file's content under the name BREEZE gives, so list the link's target in BREEZE and several QET icons share one copy. Every name needs @@ -39,7 +42,7 @@ import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent)) -from make_icon_themes import BREEZE, BREEZE_SIZES, ICO # noqa: E402 +from make_icon_themes import BREEZE, BREEZE_PAGES, BREEZE_SIZES, ICO # noqa: E402 CATEGORIES = ["actions", "places", "mimetypes", "status", "devices", "apps", "preferences"] OUT = ICO / "breeze" @@ -69,6 +72,14 @@ def main(): target.parent.mkdir(parents=True, exist_ok=True) target.write_bytes(source.read_bytes()) wanted.add(target) + for name, size in BREEZE_PAGES.values(): + source = find(checkout, name, size) + if not source: + sys.exit(f"{name}: no {size} pixel icon in {checkout}") + target = OUT / str(size) / f"{name}.svg" + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(source.read_bytes()) + wanted.add(target) # Drop icons no longer listed, so ico/breeze/ holds only what the theme uses. for old in sorted(OUT.glob("*/*.svg")): if old not in wanted: diff --git a/misc/make_icon_themes.py b/misc/make_icon_themes.py index 1a2a79bfb..3d585a3db 100644 --- a/misc/make_icon_themes.py +++ b/misc/make_icon_themes.py @@ -94,9 +94,13 @@ Breeze art: another multiple of 16 (32, 64, 128...) the smooth 16 pixel design 44 pixels and scalable the smooth 22 pixel design -The Scale=2 folders follow the table at twice their size. Four icons +The Scale=2 folders follow the table at twice their size. Five icons have a 32 pixel design, used in place of both smooth vectors. +A settings page icon (PAGES) is colored art shown at 64 and 128 pixels: +one SVG in the scalable folder serves it. The printer and settings pages +use the Breeze art QET's PNGs were exported from (BREEZE_PAGES). + An SVG is recolored for the dark theme through its text color (see dark_svg). A colored SVG, one without a text color, gets no dark copy and is inherited from the light theme, as a colored PNG is. @@ -110,7 +114,7 @@ touched; the dark theme inherits them from the light one. Qt inherits by name, not by size: once a name has any file in the dark theme, the parent theme is never consulted for that name, and a size the dark theme lacks is served by scaling the nearest dark file. An icon that -is line art at 22 pixels and colored at 128 (the printer) would then come +is line art at 22 pixels and colored at 128 would then come out as the 22 pixel copy scaled up on a dark palette. So for every name the dark theme holds, the .qrc also aliases the light files of the sizes the dark theme does not have, when they read on the dark window (3:1, @@ -173,6 +177,7 @@ SVGS = [ "scalable/align-vertical-center.svg", "scalable/align-vertical-top.svg", "scalable/diagram.svg", + "scalable/draw-fillet.svg", "scalable/folio-delete.svg", "scalable/folio-new.svg", "scalable/folio-properties.svg", @@ -197,7 +202,6 @@ BREEZE = { "applications-development-translation": "amarok_change_language", "arrow-left": "go-previous", "arrow-right": "go-next", - "circle": "draw-circle", "configure": "configure", "dialog-cancel": "dialog-cancel", "dialog-ok": "dialog-ok-apply", @@ -233,7 +237,6 @@ BREEZE = { "edit-table-insert-row-above": "edit-table-insert-row-above", "edit-table-insert-row-under": "edit-table-insert-row-under", "edit-undo": "edit-undo", - "ellipse": "draw-ellipse", "flip": "object-flip-vertical", "folder": "folder", "folder-new": "folder-new", @@ -283,7 +286,6 @@ BREEZE = { "two_pages": "view-pages-facing", "user-busy": "im-user-busy", "user-online": "im-user-online", - "view-fit-window": "zoom-fit-best", "view-fullscreen": "view-fullscreen", "view-pim-journal": "view-calendar-journal", "view-refresh": "view-refresh", @@ -299,6 +301,19 @@ BREEZE = { # Sizes Breeze draws its action icons at, the folders of ico/breeze/. BREEZE_SIZES = [16, 22, 32] +# Settings page icons: colored art shown at 64 and 128 pixels only, so one +# scalable SVG serves every size. QET name to Breeze name and the Breeze +# size it is copied from (ico/breeze//.svg). QET's PNGs of +# these were exports of the same Breeze art. +BREEZE_PAGES = { + "printer": ("printer", 64), + "settings": ("systemsettings", 48), +} + +# Page icons, QET name to SVG, relative to ico/. +PAGES = {name: f"breeze/{size}/{breeze}.svg" for name, (breeze, size) in BREEZE_PAGES.items()} +PAGES["configure-shortcuts"] = "128x128/configure-shortcuts.svg" + # Where the generator puts the 22 pixel Breeze art moved onto a 24 pixel # canvas (see on_24_canvas). BREEZE_24 = ICO / "generated" / "breeze-24" @@ -599,7 +614,7 @@ def main(): for size in SIZES: folder = ICO / size for png in sorted(folder.glob("*.png")): - if png.stem in BREEZE or png.stem in TRACED or png.stem in grid: + if png.stem in BREEZE or png.stem in TRACED or png.stem in grid or png.stem in PAGES: continue rel = f"{size}/{png.name}" names = [png.stem] @@ -624,8 +639,9 @@ def main(): changed += write_if_changed(target, dark_image) dark.append(f"themes/qet-dark/{size}/{name}.png") - for rel in SVGS: - name = (ICO / rel).name.replace("-symbolic", "") + svgs = [((ICO / rel).name.replace("-symbolic", ""), rel) for rel in SVGS] + svgs += [(f"{name}.svg", rel) for name, rel in PAGES.items()] + for name, rel in svgs: light.append((f"themes/qet/scalable/{name}", rel)) text = dark_svg((ICO / rel).read_text(encoding="utf-8")) if text is None: diff --git a/misc/qet-mcp/README.md b/misc/qet-mcp/README.md index cd53ec880..d6b391456 100644 --- a/misc/qet-mcp/README.md +++ b/misc/qet-mcp/README.md @@ -532,6 +532,25 @@ Python, plus the hang guard on `addConductor` and the database refresh in the file until it is saved once: since #1107 QElectroTech works one out from the wire's two ends on load and writes it on the next save, so it appears after a first `qet_edit`. +- **Wires can be routed around symbols.** By default a new conductor gets + QElectroTech's own two or three straight segments, which run through + whatever symbol or wire lies between the two terminals. Give + `add_conductor` `"route": "avoid"` to redraw it around the symbols + instead, or use `route_conductor` (addressed like `move_conductor_segment`, + by `element` + `terminal` or by `"conductor": "{uuid}"`) to redraw one + already drawn. The route leaves and enters each terminal in its own + direction, runs on the folio grid, stays inside the folio's border, and is + the cheapest found by a search that charges for length, for each bend + and, less heavily, for running along or crossing another wire. Obstacles + are each symbol's own rectangle plus half a grid step; texts, images, + shapes and tables are not obstacles. The path is saved as a hand-edited + one, so it survives a reload and one undo puts the default back. Where + no route exists, the wire keeps its path: `route_conductor` returns + `"no-route"` and both ops say so in `note` -- it is not a failure, and + the run goes on. Like a hand-edited path, it is stretched rather than + rerouted when a symbol is moved afterwards; route again after moving + things. Needs `qet.routeConductor()` / `qet.routeConductorBetween()` in + the build, and only an edit that routes requires them. - **A terminal can be named by its uuid**: `terminal`, `from_terminal` and `to_terminal` take the terminal's uuid (as `qet_element_info` lists it) in place of its index, on the op's own element (for `add_conductor`, on @@ -542,6 +561,15 @@ Python, plus the hang guard on `addConductor` and the database refresh in `qet.terminalIndex()` in the build. A symbol file saved without terminal uuids lists them empty; QElectroTech gives the terminals of every project's copy of it a uuid on opening (#1118), written on the next save. +- **The `wiring` export names unnamed terminals.** Most shipped symbols + leave their terminals unnamed, so `from_terminal`/`to_terminal` are often + empty. Each row also ends with `from_terminal_index`, + `from_terminal_uuid`, `to_terminal_index` and `to_terminal_uuid`: the + index `add_conductor` takes, and the uuid the `.qet` names the terminal + by (as `qet_edit` accepts in place of the index). The index is empty for + a terminal sharing its point with another, where the order is undefined; + the uuid tells those apart. `wiring_list_view` carries the same four + columns for `qet_query`. - **`qet_export` isolates its launch.** SingleApplication keys its socket on `applicationFilePath()`, so a second launch of the same binary path forwards its request to an already-running instance and returns *that* diff --git a/misc/qet-mcp/qet_mcp.py b/misc/qet-mcp/qet_mcp.py index 257b1c294..ca9b597ba 100755 --- a/misc/qet-mcp/qet_mcp.py +++ b/misc/qet-mcp/qet_mcp.py @@ -1361,6 +1361,10 @@ OPS = { "move_conductor_segment": ("moveConductorSegment", [("folio", "folio"), ("element", "elmt"), ("terminal", "term"), ("segment", "num"), ("dx", "num"), ("dy", "num")]), + # Redraws one conductor around the symbols in its way; the result is + # "routed", or "no-route" when there is none, the path then unchanged. + "route_conductor": ("routeConductor", [("folio", "folio"), ("element", "elmt"), + ("terminal", "term")]), "link_elements": ("linkElements", [("folio", "folio"), ("element", "elmt"), ("to_folio", "folio"), ("to", "elmt")]), "link_plc_io": ("linkElements", [("folio", "folio"), ("element", "elmt"), @@ -1495,7 +1499,16 @@ FOLIO_MAKING_OPS = ("add_folio", "insert_folio") # The ops that address one conductor by element + terminal, and so also # take "conductor": "{uuid}" (qet_conductors reports each one's uuid). -CONDUCTOR_UUID_OPS = ("set_conductor", "move_conductor_segment", "delete_conductor") +CONDUCTOR_UUID_OPS = ("set_conductor", "move_conductor_segment", "delete_conductor", + "route_conductor") + +# add_conductor's "route": "default" is the application's own two or three +# segments; "avoid" then redraws the new conductor around the symbols. +ROUTE_MODES = ["default", "avoid"] + +# Routing arrived after the other drawing verbs, so it is required only by +# an edit that routes: every other edit still runs on a build without it. +_ROUTE_METHODS = {"routeConductor", "routeConductorBetween"} # Accepted by set_conductor. The names are the project file's own, so what # a script sets is what qet_conductors reports back. @@ -1514,7 +1527,7 @@ CONDUCTOR_DEFAULT_PROPERTIES = ["onetextperfolio"] + CONDUCTOR_PROPERTIES # verbs. Probed in the script rather than assumed, because the failure mode # otherwise is a TypeError on line N of a generated file the caller never # sees, reported as "the edit failed". -_REQUIRED_METHODS = sorted({m for m, _ in OPS.values() if m} | +_REQUIRED_METHODS = sorted(({m for m, _ in OPS.values() if m} - _ROUTE_METHODS) | {"save", "folioCount", "conductorCount", "elementCount"}) _MARKER = "QETEDIT " @@ -1745,6 +1758,14 @@ def _build_script(operations: list, output: str) -> str: raise ValueError(f"operation {i}: unknown conductor property " f"{op.get('property')!r}; expected one of " f"{', '.join(CONDUCTOR_PROPERTIES)}") + route = op.get("route", "default") if name == "add_conductor" else "default" + if route not in ROUTE_MODES: + raise ValueError(f"operation {i}: unknown route {route!r}; " + f"expected one of {', '.join(ROUTE_MODES)}") + if name == "route_conductor": + uuid_methods.add("routeConductor") + if route == "avoid": + uuid_methods.add("routeConductorBetween") if name == "set_folio" and op.get("property") not in FOLIO_PROPERTIES: raise ValueError(f"operation {i}: unknown folio property " f"{op.get('property')!r}; expected one of " @@ -1830,6 +1851,18 @@ def _build_script(operations: list, output: str) -> str: lines.append(f" var e{i} = qetMcpConductorEnd({i}, {args[0]}, {conductor_js});") call = f"(e{i} ? {call} : false)" lines.append(f" var v{i} = {call};") + if route == "avoid": + # The wire exists either way; a route not found leaves it on the + # default path, which is a note on the op, not a failure of it. + lines.append(f" if (v{i} === true) {{ var r{i} = qet.routeConductorBetween(" + f"{', '.join(args)}); if (r{i} !== 'routed') qet.log({_js(_MARKER)} + " + f"JSON.stringify({{kind: 'op_note', index: {i}, note: 'no route " + f"around the symbols was found; the conductor keeps the default " + f"path'}})); }}") + if name == "route_conductor": + lines.append(f" if (v{i} === 'no-route') qet.log({_js(_MARKER)} + " + f"JSON.stringify({{kind: 'op_note', index: {i}, note: 'no route " + f"around the symbols was found; the conductor keeps its path'}}));") if ident is not None: lines.append(f" R[{_js(ident)}] = v{i};") refs.add(ident) @@ -3524,6 +3557,15 @@ TOOLS = [ "movable ones, then a static segment, in that order from the " "first terminal; call with a guessed index and read \"succeeded\" " "to check it landed on a movable one. " + "add_conductor takes an optional \"route\": \"avoid\" to " + "redraw the new wire around the symbols in its way instead of " + "QElectroTech's default two or three straight segments; " + "route_conductor does the same to an existing conductor " + "(addressed like move_conductor_segment, or by \"conductor\") " + "and returns \"routed\" or \"no-route\". Where no route " + "exists the wire keeps its path and the op's note says so -- " + "not a failure. Route after placing everything: moving a " + "symbol later stretches the routed path, it does not reroute it. " "link_elements takes a folio for each end, since a master " "and its slave are usually on different ones. " "delete_conductor removes only the conductor on the named " diff --git a/misc/qet-mcp/test_qet_mcp.py b/misc/qet-mcp/test_qet_mcp.py index 0f7871168..3d933df2d 100644 --- a/misc/qet-mcp/test_qet_mcp.py +++ b/misc/qet-mcp/test_qet_mcp.py @@ -22,6 +22,7 @@ away: a check that has never been seen to fail is not evidence. from __future__ import annotations +import csv import json import os import re @@ -281,6 +282,35 @@ class EditValidation(unittest.TestCase): with self.assertRaisesRegex(ValueError, "saved before conductors carried a uuid"): self.build([{"op": "delete_conductor", "folio": 0, "conductor": ""}]) + def test_route_ops(self): + """route_conductor and add_conductor's "route": "avoid" call the + router; neither makes a missing route a failure of the run, and the + router methods are required only by an edit that routes.""" + E, F = "{11111111-2222-4333-8444-555555555555}", "{21111111-2222-4333-8444-555555555555}" + U = "{31111111-2222-4333-8444-555555555555}" + plain = self.build([{"op": "add_conductor", "folio": 0, "from": E, "from_terminal": 1, + "to": F, "to_terminal": 0}]) + self.assertNotIn("routeConductor", plain) + self.assertEqual(plain, self.build([{"op": "add_conductor", "folio": 0, "from": E, + "from_terminal": 1, "to": F, "to_terminal": 0, + "route": "default"}])) + s = self.build([{"op": "add_conductor", "folio": 0, "from": E, "from_terminal": 1, + "to": F, "to_terminal": 0, "route": "avoid"}]) + self.assertIn(f'if (v0 === true) {{ var r0 = qet.routeConductorBetween(0, "{E}", 1, "{F}", 0);', s) + self.assertIn('"routeConductorBetween"', s) + self.assertNotIn('"routeConductor",', s) + # the op's own result is still the conductor being added + self.assertIn("result: v0", s) + s = self.build([{"op": "route_conductor", "folio": 2, "conductor": U}]) + self.assertIn("(e0 ? qet.routeConductor(2, e0.element, e0.terminal) : false)", s) + self.assertIn("if (v0 === 'no-route')", s) + self.assertIn('"routeConductor"', s) + s = self.build([{"op": "route_conductor", "folio": 0, "element": E, "terminal": 1}]) + self.assertIn(f'qet.routeConductor(0, "{E}", 1)', s) + with self.assertRaisesRegex(ValueError, "unknown route"): + self.build([{"op": "add_conductor", "folio": 0, "from": E, "from_terminal": 1, + "to": F, "to_terminal": 0, "route": "around"}]) + def test_terminal_by_uuid(self): """A terminal named by uuid is turned into its index at run time, on the element it belongs to: the op's element, or each add_conductor @@ -343,6 +373,8 @@ class EditValidation(unittest.TestCase): "move_conductor_segment": el + [{"op": "move_conductor_segment", "folio": "$f", "element": "$e", "terminal": 0, "segment": 1, "dx": 10, "dy": 0}], + "route_conductor": el + [{"op": "route_conductor", "folio": "$f", "element": "$e", + "terminal": 0}], "delete_conductor": el + [{"op": "delete_conductor", "folio": "$f", "element": "$e", "terminal": 0}], "link_elements": two + [{"op": "link_elements", "folio": "$f", "element": "$e", "to_folio": "$f", "to": "$e2"}], @@ -3675,6 +3707,44 @@ class Integration(unittest.TestCase): note = r["operations"][1].get("note", "") self.assertIn("from_terminal: no terminal", note) self.assertIn("to_terminal: no terminal", note) + def test_wiring_export_names_unnamed_terminals(self): + """--export-wiring gives each end the index add_conductor took and + the uuid the file names the terminal by, even where the terminal + has no name. This strip's file lists its terminals in another order + than the index (top to bottom, then left to right), so a column + holding the file's order would fail here.""" + strip = ("common://10_electric/10_allpole/130_terminals_terminal_strips/" + "90_terminal_strips_diagram/90-10-0211.elmt") + base = self.sb.new() + r = self.ok(self.sb.edit(base, [ + {"op": "add_element", "id": "a", "folio": 0, "path": strip, "x": 100, "y": 200}, + {"op": "add_element", "id": "b", "folio": 0, "path": strip, "x": 400, "y": 200}, + {"op": "add_conductor", "folio": 0, "from": "$a", "from_terminal": 2, + "to": "$b", "to_terminal": 3}, + {"op": "add_conductor", "folio": 0, "from": "$a", "from_terminal": 1, + "to": "$b", "to_terminal": 0}])) + a_uuid, b_uuid = (o["result"] for o in r["operations"][:2]) + out = self.sb.p("wiring.csv") + e = m.tool_export(BINARY, r["output"], "wiring", out) + self.assertTrue(e["ok"], e) + with open(out, encoding="utf-8-sig", newline="") as fh: + rows = list(csv.DictReader(fh, delimiter=";")) + self.assertEqual(len(rows), 2) + # the conductor in the file: which uuid it names each end by + in_file = {c.get("uuid"): {(c.get("element1"), c.get("terminal1")), + (c.get("element2"), c.get("terminal2"))} + for c in ET.parse(r["output"]).getroot().iter("conductor") + if c.get("element1")} + got = set() + for row in rows: + self.assertEqual((row["from_terminal"], row["to_terminal"]), ("", "")) + ends = {(int(row["from_terminal_index"]), row["from_terminal_uuid"]), + (int(row["to_terminal_index"]), row["to_terminal_uuid"])} + self.assertEqual({u for _, u in ends}, + {t for _, t in in_file[row["conductor_uuid"]]}) + got.add(frozenset(i for i, _ in ends)) + self.assertEqual(got, {frozenset({2, 3}), frozenset({1, 0})}) + def test_folio_ref_survives_an_insert_before_it(self): """add_folio names a folio "$f"; inserting another at position 0 moves it from index 1 to 2. "$f" must still name it.""" @@ -3806,6 +3876,65 @@ class Integration(unittest.TestCase): "terminal": 0, "segment": 99, "dx": 1, "dy": 1}]) self.assertFalse(r["ok"]) + def _column_with_a_symbol_between(self): + """Three coils in a column; a wire from the bottom of the first to + the top of the third runs straight through the middle one by + default.""" + return [{"op": "add_folio", "id": "f"}, + {"op": "add_element", "id": "a", "folio": "$f", "path": COIL, "x": 200, "y": 100}, + {"op": "add_element", "id": "b", "folio": "$f", "path": COIL, "x": 200, "y": 250}, + {"op": "add_element", "id": "c", "folio": "$f", "path": COIL, "x": 200, "y": 400}] + + @staticmethod + def _crosses_the_middle_coil(xml): + """Whether the saved path enters the middle coil. The path starts + at the first coil's A2 terminal, (200, 120); relative to that the + middle coil (40 x 60, hotspot 17,32, placed at 200,250) covers + x -17..23, y 98..158.""" + segs = re.findall(r' -17 and lo_y < 158 and hi_y > 98: + return True + x, y = nx, ny + return False + + def test_route_avoid_goes_around_the_symbol_between(self): + base = self.sb.new() + ops = self._column_with_a_symbol_between() + wire = {"op": "add_conductor", "folio": "$f", "from": "$a", "from_terminal": 1, + "to": "$c", "to_terminal": 0} + # the arm that must differ: the default path is straight, saved + # without segments, and so through the middle coil + plain = self.ok(self.sb.edit(base, ops + [wire], out="plain.qet")) + self.assertNotIn("')) + # one undo puts the default path back + u = self.ok(self.sb.edit(base, ops + [{**wire, "route": "avoid"}, {"op": "undo"}], + out="undone.qet")) + self.assertNotIn(" - ico/128x128/diagram.png - ico/128x128/settings.png - ico/128x128/document-export.png - ico/128x128/printer.png - ico/16x16/application-exit.png - ico/16x16/arrow-left.png - ico/16x16/arrow-right.png - ico/16x16/circle.png - ico/16x16/configure.png - ico/16x16/dialog-cancel.png - ico/16x16/dialog-ok.png - ico/16x16/document-close.png - ico/16x16/document-export.png - ico/16x16/document-import.png - ico/16x16/document-new.png - ico/16x16/document-open.png - ico/16x16/document-open-recent.png - ico/16x16/document-print-frame.png - ico/16x16/document-print.png - ico/16x16/document-save-all.png - ico/16x16/document-save-as.png - ico/16x16/document-save.png - ico/16x16/edit-clear-locationbar-ltr.png - ico/16x16/edit-clear.png - ico/16x16/edit-copy.png - ico/16x16/edit-cut.png - ico/16x16/edit-delete.png - ico/16x16/edit-paste.png - ico/16x16/edit-redo.png - ico/16x16/edit-rename.png - ico/16x16/edit-select-all.png - ico/16x16/edit-table-insert-row-above.png - ico/16x16/edit-table-insert-column-left.png - ico/16x16/edit-table-insert-row-under.png - ico/16x16/edit-table-delete-row.png - ico/16x16/edit-table-insert-column-right.png - ico/16x16/edit-table-delete-column.png - ico/16x16/edit-table-cell-split.png - ico/16x16/edit-table-cell-merge.png - ico/16x16/edit-undo.png - ico/16x16/flip.png - ico/16x16/folder-new.png - ico/16x16/folder.png - ico/16x16/go-down.png - ico/16x16/go-home.png - ico/16x16/go-up.png - ico/16x16/label.png - ico/16x16/list-add.png - ico/16x16/list-remove.png - ico/16x16/masquer.png - ico/16x16/mirror.png - ico/16x16/preferences-desktop-user.png - ico/16x16/qet.png - ico/16x16/user-busy.png - ico/16x16/user-online.png - ico/16x16/view-fullscreen.png - ico/16x16/view-refresh.png - ico/16x16/view-restore.png - ico/16x16/window-new.png - ico/16x16/zoom-draw.png - ico/16x16/zoom-in.png - ico/16x16/zoom-out.png - ico/22x22/application-exit.png - ico/22x22/arc.png - ico/22x22/arrow-left.png - ico/22x22/arrow-right.png - ico/22x22/bring_forward.png - ico/22x22/configure.png - ico/22x22/dialog-cancel.png - ico/22x22/dialog-ok.png - ico/22x22/document-close.png - ico/22x22/document-export.png - ico/22x22/document-import.png - ico/22x22/document-new.png - ico/22x22/document-open.png - ico/22x22/document-open-recent.png - ico/22x22/document-print-frame.png - ico/22x22/document-print.png - ico/22x22/document-save-all.png - ico/22x22/document-save-as.png - ico/22x22/document-save.png - ico/22x22/edit-clear-locationbar-ltr.png - ico/22x22/edit-clear.png - ico/22x22/edit-copy.png - ico/22x22/edit-cut.png - ico/22x22/edit-delete.png - ico/22x22/edit-paste.png - ico/22x22/edit-redo.png - ico/22x22/edit-rename.png - ico/22x22/edit-select-all.png - ico/22x22/edit-table-insert-row-above.png - ico/22x22/edit-table-insert-column-left.png - ico/22x22/edit-table-insert-row-under.png - ico/22x22/edit-table-delete-row.png - ico/22x22/edit-table-insert-column-right.png - ico/22x22/edit-table-delete-column.png - ico/22x22/edit-table-cell-split.png - ico/22x22/edit-table-cell-merge.png - ico/22x22/edit-undo.png - ico/22x22/ellipse.png - ico/22x22/folder-new.png - ico/22x22/go-down.png - ico/22x22/go-home.png - ico/22x22/go-up.png - ico/22x22/insert-image.png - ico/22x22/line.png - ico/22x22/list-add.png - ico/22x22/list-remove.png - ico/22x22/move.png - ico/22x22/object-locked.png - ico/22x22/object-rotate-right.png - ico/22x22/object-unlocked.png - ico/22x22/polygon.png - ico/22x22/preferences-desktop-user.png - ico/22x22/rectangle.png - ico/22x22/restaurer.png - ico/22x22/select.png - ico/22x22/single_page.png - ico/22x22/start.png - ico/22x22/text.png - ico/22x22/transform-scale.png - ico/22x22/two_pages.png - ico/22x22/view_fit_width.png - ico/22x22/view-fullscreen.png - ico/22x22/view-refresh.png - ico/22x22/view-restore.png - ico/22x22/window-new.png - ico/22x22/zoom-draw.png - ico/22x22/zoom-in.png - ico/22x22/zoom-out.png ico/256x256/qelectrotech.png ico/256x256/qet.png - ico/32x32/image-x-eps.png - ico/32x32/printer.png - ico/32x32/qt.png - ico/diagram.png ico/splash.png titleblocks/default.titleblock - ico/48x48/user-away.png - ico/48x48/user-away-extended.png - ico/32x32/format-text-bold.png - ico/32x32/format-text-italic.png - ico/32x32/format-text-underline.png ico/24x16/ar.png ico/24x16/cs.png ico/24x16/de.png @@ -158,34 +19,10 @@ ico/24x16/sl.png ico/24x16/gr.png ico/24x16/it.png - ico/22x22/applications-development-translation.png - ico/48x48/view-pim-journal.png ico/24x16/nl.png ico/24x16/nl_BE.png - ico/22x22/autoconnect.png - ico/16x16/folio-new.png - ico/48x48/document-print-frame.png - ico/22x22/Actions-player-time-icon.png ico/24x16/dk.png ico/24x16/br.png - ico/22x22/grid.png - ico/16x16/diagram.png - ico/16x16/edit-clear-locationbar-rtl.png - ico/16x16/edit-download.png - ico/16x16/help-contents.png - ico/16x16/help-donate.png - ico/16x16/item-cancel.png - ico/16x16/item-copy.png - ico/16x16/item-move.png - ico/16x16/kdenlive-show-video.png - ico/16x16/object-rotate-right.png - ico/16x16/project-delete.png - ico/16x16/qt.png - ico/22x22/edit-clear-locationbar-rtl.png - ico/22x22/format-text-subscript.png - ico/22x22/format-text-superscript.png - ico/22x22/project-delete.png - ico/22x22/view-fit-window.png ico/24x16/ad.png ico/24x16/ae.png ico/24x16/af.png @@ -434,8 +271,6 @@ ico/24x16/za.png ico/24x16/zm.png ico/24x16/zw.png - ico/32x32/format-text-color.png - ico/32x32/insert-link.png ico/breeze-icons/128x128/apps/qelectrotech.png ico/breeze-icons/128x128/mimetypes/application-x-qet-element.png ico/breeze-icons/128x128/mimetypes/application-x-qet-project.png @@ -490,7 +325,6 @@ ico/generated/rect-to-polyline.svg ico/generated/rect-to-bezier.svg ico/generated/ellipse-to-bezier.svg - ico/16x16/object-group.png ico/mac_icon/elmt.icns ico/mac_icon/qelectrotech.icns ico/mac_icon/qet.icns @@ -502,25 +336,7 @@ ico/windows_icon/qelectrotech.ico ico/windows_icon/qelectrotech.rc ico/copyright - ico/16x16/folio-delete.png - ico/16x16/table-of-content.png - ico/16x16/folio-properties.png - ico/16x16/select.png - ico/16x16/grid.png - ico/16x16/move.png - ico/16x16/element.png - ico/16x16/folder-open.png - ico/16x16/folder-properties.png - ico/16x16/go-up-double.png - ico/16x16/go-down-double.png - ico/16x16/go-top.png - ico/16x16/go-bottom.png - ico/22x22/folder-open.png - ico/16x16/edit-select-invert.png - ico/16x16/edit-select-none.png - ico/16x16/transform-rotate.png ico/16x16/window-close.svg - ico/16x16/conductor.png ico/22x22/color/color-brown.png ico/22x22/color/color-gray.png ico/22x22/color/color-orange.png diff --git a/sources/ElementsCollection/elementslocation.cpp b/sources/ElementsCollection/elementslocation.cpp index 7c34f923a..0e8a94c7a 100644 --- a/sources/ElementsCollection/elementslocation.cpp +++ b/sources/ElementsCollection/elementslocation.cpp @@ -709,12 +709,20 @@ pugi::xml_document ElementsLocation::pugiXml() const #endif if (!m_project) { + //Read through QFile, not pugi's load_file(): on Windows load_file() + //fails once the full path reaches MAX_PATH (260 characters), while + //QFile handles long paths. + QFile file(m_file_system_path); + if (!file.open(QIODevice::ReadOnly)) { + return docu; + } + const QByteArray data = file.readAll(); #ifndef Q_OS_LINUX - if (docu.load_file(m_file_system_path.toStdWString().c_str())) { + if (docu.load_buffer(data.constData(), data.size())) { docu.save(m_string_stream); } #else - docu.load_file(m_file_system_path.toStdWString().c_str()); + docu.load_buffer(data.constData(), data.size()); #endif } else diff --git a/sources/ElementsCollection/fileelementcollectionitem.cpp b/sources/ElementsCollection/fileelementcollectionitem.cpp index 7b9d3ea98..805c3fc27 100644 --- a/sources/ElementsCollection/fileelementcollectionitem.cpp +++ b/sources/ElementsCollection/fileelementcollectionitem.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -178,7 +179,12 @@ QString FileElementCollectionItem::localName() bool readable = false; QString str(fileSystemPath() % "/qet_directory"); pugi::xml_document docu; - if (docu.load_file(str.toStdWString().c_str())) + // QFile rather than pugi's load_file(), which fails on + // Windows once the full path reaches 260 characters. + QFile file(str); + const QByteArray data = file.open(QIODevice::ReadOnly) + ? file.readAll() : QByteArray(); + if (!data.isEmpty() && docu.load_buffer(data.constData(), data.size())) { if (QString(docu.document_element().name()) == "qet-directory") diff --git a/sources/ElementsCollection/xmlelementcollection.cpp b/sources/ElementsCollection/xmlelementcollection.cpp index 940988da6..d3bb9713a 100644 --- a/sources/ElementsCollection/xmlelementcollection.cpp +++ b/sources/ElementsCollection/xmlelementcollection.cpp @@ -157,6 +157,16 @@ QDomElement XmlElementCollection::root() const */ QDomElement XmlElementCollection::importCategory() const { + //Found by name: a project may hold other top-level categories, + //and before the "import" one (lmdg.qet has "k_elem" first). Every + //lookup of an imported element is under "import/", so filing it + //anywhere else made the next placement of the same symbol fail. + for (QDomElement category = root().firstChildElement("category") ; + !category.isNull() ; + category = category.nextSiblingElement("category")) { + if (category.attribute("name") == QLatin1String("import")) + return category; + } return root().firstChildElement("category"); } diff --git a/sources/NameList/ui/namelistwidget.ui b/sources/NameList/ui/namelistwidget.ui index a38dd046d..33fec9d97 100644 --- a/sources/NameList/ui/namelistwidget.ui +++ b/sources/NameList/ui/namelistwidget.ui @@ -36,8 +36,7 @@ Ajouter une ligne - - :/ico/16x16/list-add.png:/ico/16x16/list-add.png + @@ -48,8 +47,7 @@ Copier dans le presse papier - - :/ico/16x16/edit-paste.png:/ico/16x16/edit-paste.png + diff --git a/sources/SearchAndReplace/ui/replacefoliowidget.ui b/sources/SearchAndReplace/ui/replacefoliowidget.ui index b438180b9..a46499e16 100644 --- a/sources/SearchAndReplace/ui/replacefoliowidget.ui +++ b/sources/SearchAndReplace/ui/replacefoliowidget.ui @@ -180,8 +180,7 @@ - - :/ico/22x22/start.png:/ico/22x22/start.png + diff --git a/sources/SearchAndReplace/ui/searchandreplacewidget.ui b/sources/SearchAndReplace/ui/searchandreplacewidget.ui index dd45f6a26..e14cf95c9 100644 --- a/sources/SearchAndReplace/ui/searchandreplacewidget.ui +++ b/sources/SearchAndReplace/ui/searchandreplacewidget.ui @@ -106,8 +106,7 @@ - - :/ico/16x16/go-bottom.png:/ico/16x16/go-bottom.png + true @@ -123,8 +122,7 @@ - - :/ico/16x16/go-top.png:/ico/16x16/go-top.png + true @@ -140,8 +138,7 @@ - - :/ico/16x16/view-refresh.png:/ico/16x16/view-refresh.png + true diff --git a/sources/TerminalStrip/ui/freeterminaleditor.ui b/sources/TerminalStrip/ui/freeterminaleditor.ui index 4f318c60e..b0432600f 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.ui +++ b/sources/TerminalStrip/ui/freeterminaleditor.ui @@ -84,8 +84,7 @@ - - :/ico/22x22/dialog-ok.png:/ico/22x22/dialog-ok.png + diff --git a/sources/TerminalStrip/ui/terminalstripeditor.ui b/sources/TerminalStrip/ui/terminalstripeditor.ui index ef65cdf9c..4b5020e08 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.ui +++ b/sources/TerminalStrip/ui/terminalstripeditor.ui @@ -63,8 +63,7 @@ - - :/ico/16x16/dialog-ok.png:/ico/16x16/dialog-ok.png + diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.ui b/sources/TerminalStrip/ui/terminalstripeditorwindow.ui index 53b413b3b..3678c1a8b 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.ui +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.ui @@ -54,8 +54,7 @@ - - :/ico/16x16/list-add.png:/ico/16x16/list-add.png + Ajouter un bornier @@ -66,8 +65,7 @@ - - :/ico/16x16/list-remove.png:/ico/16x16/list-remove.png + Supprimer le bornier @@ -78,8 +76,7 @@ - - :/ico/16x16/view-refresh.png:/ico/16x16/view-refresh.png + Recharger diff --git a/sources/autoNum/ui/autonumberingdockwidget.ui b/sources/autoNum/ui/autonumberingdockwidget.ui index b0bcc6e61..e2fd474ef 100644 --- a/sources/autoNum/ui/autonumberingdockwidget.ui +++ b/sources/autoNum/ui/autonumberingdockwidget.ui @@ -73,8 +73,7 @@ - - :/ico/16x16/view-refresh.png:/ico/16x16/view-refresh.png + @@ -161,8 +160,7 @@ - - :/ico/16x16/view-refresh.png:/ico/16x16/view-refresh.png + @@ -238,8 +236,7 @@ - - :/ico/16x16/view-refresh.png:/ico/16x16/view-refresh.png + @@ -319,8 +316,7 @@ Configurer - - :/ico/16x16/configure.png:/ico/16x16/configure.png + diff --git a/sources/autoNum/ui/selectautonumw.ui b/sources/autoNum/ui/selectautonumw.ui index 8da8d2e70..4c4626415 100644 --- a/sources/autoNum/ui/selectautonumw.ui +++ b/sources/autoNum/ui/selectautonumw.ui @@ -63,8 +63,7 @@ - - :/ico/16x16/edit-delete.png:/ico/16x16/edit-delete.png + @@ -136,8 +135,7 @@ - - :/ico/22x22/list-remove.png:/ico/22x22/list-remove.png + false @@ -153,8 +151,7 @@ - - :/ico/22x22/list-add.png:/ico/22x22/list-add.png + false @@ -170,8 +167,7 @@ - - :/ico/16x16/arrow-left.png:/ico/16x16/arrow-left.png + @@ -184,8 +180,7 @@ - - :/ico/16x16/arrow-right.png:/ico/16x16/arrow-right.png + diff --git a/sources/cli_export.cpp b/sources/cli_export.cpp index ff90b300f..d99481345 100644 --- a/sources/cli_export.cpp +++ b/sources/cli_export.cpp @@ -627,6 +627,12 @@ QHash folioIndex(QETProject &project) /// From-to wiring list: one row per conductor, each endpoint resolved to its /// element label and terminal name. /// +/// Most symbols leave their terminals unnamed, so each end also carries the +/// terminal's index -- the one the scripting API's addConductor() takes, +/// empty for two terminals at one point -- and its uuid, the one the project +/// file names the terminal by. These come last, after the columns the list +/// has always had, so a reader of those is not disturbed. +/// /// Reads wiring_list_view out of the project database. --export-cables produces /// the same logical list from the document XML instead, and the two are meant /// to agree: running both and diffing them is a direct check that the database @@ -639,7 +645,8 @@ int exportWiring(QETProject &project, const QString &output) static const QStringList columns { "wire_number", "from_element_label", "from_terminal", - "to_element_label", "to_terminal", "diagram_position", "conductor_uuid" + "to_element_label", "to_terminal", "diagram_position", "conductor_uuid", + "from_terminal_index", "from_terminal_uuid", "to_terminal_index", "to_terminal_uuid" }; QSqlQuery query = project.dataBase()->newQuery( diff --git a/sources/conductorrouter.cpp b/sources/conductorrouter.cpp new file mode 100644 index 000000000..d3d800453 --- /dev/null +++ b/sources/conductorrouter.cpp @@ -0,0 +1,342 @@ +/* + Copyright 2006-2026 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 . +*/ +// SPDX-License-Identifier: GPL-2.0-or-later +#include "conductorrouter.h" + +#include +#include +#include +#include +#include + +namespace { + +using ConductorRouter::Direction; + +constexpr qreal eps = 1e-6; + ///Larger than any folio needs: a 2000 x 2000 grid +constexpr int max_nodes = 4000000; + + ///What each thing costs, in scene units of length. A bend is worth + ///three grid steps of extra wire, so the search prefers a slightly + ///longer route to a more crooked one, as a person drawing would. +constexpr qreal bend_steps = 3.0; + ///Running along another wire costs this much more per unit of length +constexpr qreal along_factor = 3.0; + ///Each crossing of another wire costs two grid steps +constexpr qreal cross_steps = 2.0; + +QPointF step(Direction d) +{ + switch (d) { + case Direction::North: return {0, -1}; + case Direction::East: return {1, 0}; + case Direction::South: return {0, 1}; + case Direction::West: return {-1, 0}; + } + return {0, 0}; +} + +Direction opposite(Direction d) +{ + return static_cast((static_cast(d) + 2) % 4); +} + +bool strictlyInside(const QPointF &p, const QRectF &r) +{ + return p.x() > r.left() + eps && p.x() < r.right() - eps + && p.y() > r.top() + eps && p.y() < r.bottom() - eps; +} + +bool insideAny(const QPointF &p, const QList &rects) +{ + for (const QRectF &r : rects) + if (strictlyInside(p, r)) return true; + return false; +} + + ///A wire segment, kept as the fixed coordinate and the range along the + ///other axis +struct Span { qreal at, from, to; }; + + ///The first point of a route after a terminal: one grid step out in the + ///terminal's direction, snapped to the grid the way + ///Conductor::extendTerminal() snaps it, then on until it is clear of + ///every obstacle -- of the terminal's own symbol above all. +bool exitPoint(const QPointF &dock, Direction d, const ConductorRouter::Request &r, + const QList &obstacles, QPointF &out) +{ + const QPointF s = step(d); + QPointF p = dock; + if (s.x() != 0) + p.setX(std::round((dock.x() + s.x() * r.grid) / r.grid) * r.grid); + else + p.setY(std::round((dock.y() + s.y() * r.grid) / r.grid) * r.grid); + for (int i = 0; i < 200; ++i) { + if (!insideAny(p, obstacles)) { + out = p; + return true; + } + p += s * r.grid; + } + return false; +} + + ///Sorted, without duplicates: the grid lines inside [low, high], plus + ///the extra coordinates (the two exit points, which need not be on the + ///grid when a terminal is not) +QVector axis(qreal low, qreal high, qreal grid, std::initializer_list extra) +{ + QVector v; + for (qreal c = std::ceil(low / grid) * grid; c <= high + eps; c += grid) + v << c; + for (qreal c : extra) v << c; + std::sort(v.begin(), v.end()); + v.erase(std::unique(v.begin(), v.end(), + [](qreal a, qreal b) { return std::abs(a - b) < eps; }), + v.end()); + return v; +} + +int indexOf(const QVector &v, qreal c) +{ + auto it = std::lower_bound(v.begin(), v.end(), c - eps); + return (it != v.end() && std::abs(*it - c) < eps) ? int(it - v.begin()) : -1; +} + + ///[first, last) of the sorted v: the values strictly between low and high +std::pair openRange(const QVector &v, qreal low, qreal high) +{ + const int first = int(std::upper_bound(v.begin(), v.end(), low) - v.begin()); + const int last = int(std::lower_bound(v.begin(), v.end(), high) - v.begin()); + return {first, std::max(first, last)}; +} + + ///The cost of every edge along one axis, or infinity where an obstacle + ///blocks it. Edge (k, i) runs from pos[i] to pos[i + 1] at the fixed + ///coordinate lines[k], and is stored at [k * pos.size() + i]; + ///horizontal says which axis pos is. Each obstacle and wire visits only + ///the edges it can touch, so the cost grows with the folio, not with + ///the folio times everything drawn on it. +std::vector edgeCosts(bool horizontal, + const QVector &pos, const QVector &lines, + const QList &obstacles, + const QVector &along, const QVector &across, + qreal grid) +{ + const int np = pos.size(), nl = lines.size(); + std::vector cost(size_t(np) * nl, std::numeric_limits::infinity()); + for (int k = 0; k < nl; ++k) + for (int i = 0; i + 1 < np; ++i) + cost[size_t(k) * np + i] = pos[i + 1] - pos[i]; + + // The edges i that can overlap (low, high): pos[i + 1] > low and + // pos[i] < high. The exact test is applied to each one found. + const auto edges = [&](qreal low, qreal high) { + const int first = int(std::upper_bound(pos.begin(), pos.end(), low) - pos.begin()) - 1; + const int last = int(std::lower_bound(pos.begin(), pos.end(), high) - pos.begin()); + return std::pair{std::max(0, first), std::min(np - 1, last)}; + }; + + for (const QRectF &r : obstacles) { + const qreal lo = horizontal ? r.left() : r.top(); + const qreal hi = horizontal ? r.right() : r.bottom(); + const qreal flo = horizontal ? r.top() : r.left(); + const qreal fhi = horizontal ? r.bottom(): r.right(); + const auto [k0, k1] = openRange(lines, flo, fhi); + const auto [i0, i1] = edges(lo, hi); + for (int k = k0; k < k1; ++k) { + if (!(lines[k] > flo + eps && lines[k] < fhi - eps)) continue; + for (int i = i0; i < i1; ++i) + if (std::min(pos[i + 1], hi) - std::max(pos[i], lo) > eps) + cost[size_t(k) * np + i] = std::numeric_limits::infinity(); + } + } + for (const Span &s : along) { + const int k0 = int(std::lower_bound(lines.begin(), lines.end(), s.at - 0.5) - lines.begin()); + const auto [i0, i1] = edges(s.from, s.to); + for (int k = k0; k < nl && lines[k] <= s.at + 0.5; ++k) { + if (std::abs(s.at - lines[k]) > 0.5) continue; + for (int i = i0; i < i1; ++i) { + const qreal overlap = std::min(pos[i + 1], s.to) - std::max(pos[i], s.from); + if (overlap > eps) cost[size_t(k) * np + i] += overlap * along_factor; + } + } + } + for (const Span &s : across) { + // Half-open (a, b], so a crossing on a grid node is counted + // once, by the edge that ends on it; and only through the + // other wire's interior, not at its end, which is a junction. + const auto [k0, k1] = openRange(lines, s.from, s.to); + const auto [i0, i1] = edges(s.at - 1.0, s.at + 1.0); + for (int k = k0; k < k1; ++k) { + if (!(lines[k] > s.from + 0.5 && lines[k] < s.to - 0.5)) continue; + for (int i = i0; i < i1; ++i) + if (s.at > pos[i] + eps && s.at <= pos[i + 1] + eps) + cost[size_t(k) * np + i] += cross_steps * grid; + } + } + return cost; +} + +} // namespace + +ConductorRouter::Result ConductorRouter::route(const Request &r) +{ + Result result; + if (r.grid <= 0) { + result.error = QStringLiteral("the grid step must be positive"); + return result; + } + + QList obstacles; + for (const QRectF &o : r.obstacles) + obstacles << o.normalized().adjusted(-r.margin, -r.margin, r.margin, r.margin); + + QPointF s1, s2; + if (!exitPoint(r.start, r.start_direction, r, obstacles, s1) + || !exitPoint(r.end, r.end_direction, r, obstacles, s2)) { + result.error = QStringLiteral("a terminal has no way out of the symbols around it"); + return result; + } + + // The area searched: everything involved, with room to go round + // it, kept on the folio when there is one. + QRectF box = QRectF(s1, s2).normalized(); + for (const QRectF &o : obstacles) box = box.united(o); + box.adjust(-3 * r.grid, -3 * r.grid, 3 * r.grid, 3 * r.grid); + if (r.bounds.isValid()) box = box.intersected(r.bounds); + box = box.united(QRectF(s1, s2).normalized()); + + const QVector xs = axis(box.left(), box.right(), r.grid, {s1.x(), s2.x()}); + const QVector ys = axis(box.top(), box.bottom(), r.grid, {s1.y(), s2.y()}); + const int nx = xs.size(), ny = ys.size(); + if (qint64(nx) * ny > max_nodes) { + result.error = QStringLiteral("the area to search is too large"); + return result; + } + + QVector horizontal_wires, vertical_wires; + for (const QVector &w : r.wires) { + for (int i = 0; i + 1 < w.size(); ++i) { + const QPointF a = w.at(i), b = w.at(i + 1); + if (std::abs(a.y() - b.y()) < 0.5 && std::abs(a.x() - b.x()) > eps) + horizontal_wires << Span{a.y(), std::min(a.x(), b.x()), std::max(a.x(), b.x())}; + else if (std::abs(a.x() - b.x()) < 0.5 && std::abs(a.y() - b.y()) > eps) + vertical_wires << Span{a.x(), std::min(a.y(), b.y()), std::max(a.y(), b.y())}; + } + } + + // The cost of the edge from each node to the next one east, + // h_cost[j * nx + i], and south, v_cost[i * ny + j]; infinity + // where blocked or none. + const qreal inf = std::numeric_limits::infinity(); + const std::vector h_cost = edgeCosts(true, xs, ys, obstacles, + horizontal_wires, vertical_wires, r.grid); + const std::vector v_cost = edgeCosts(false, ys, xs, obstacles, + vertical_wires, horizontal_wires, r.grid); + + const int start_node = indexOf(ys, s1.y()) * nx + indexOf(xs, s1.x()); + const int goal_node = indexOf(ys, s2.y()) * nx + indexOf(xs, s2.x()); + const qreal bend = bend_steps * r.grid; + // The wire arrives at the second terminal moving opposite to the + // way it points. + const Direction arrival = opposite(r.end_direction); + + // Dijkstra over (node, direction of travel): the direction is what + // lets a bend be charged for. + const size_t states = size_t(nx) * ny * 4; + std::vector dist(states, inf); + std::vector previous(states, -1); + using Entry = std::pair; + std::priority_queue, std::greater> queue; + const int first = start_node * 4 + int(r.start_direction); + dist[size_t(first)] = 0; + queue.push({0, first}); + + qreal best = inf; + int best_state = -1; + while (!queue.empty()) { + const auto [cost, state] = queue.top(); + queue.pop(); + if (cost > dist[size_t(state)] || cost >= best) { + if (cost >= best) break; + continue; + } + const int node = state / 4; + const Direction d = static_cast(state % 4); + if (node == goal_node && d != r.end_direction) { + const qreal total = cost + (d == arrival ? 0 : bend); + if (total < best) { best = total; best_state = state; } + } + const int i = node % nx, j = node / nx; + for (int k = 0; k < 4; ++k) { + const Direction nd = static_cast(k); + if (nd == opposite(d)) continue; + int ni = i, nj = j; + qreal edge = inf; + switch (nd) { + case Direction::East: if (i + 1 < nx) { ni = i + 1; edge = h_cost[size_t(j) * nx + i]; } break; + case Direction::West: if (i > 0) { ni = i - 1; edge = h_cost[size_t(j) * nx + ni]; } break; + case Direction::South: if (j + 1 < ny) { nj = j + 1; edge = v_cost[size_t(i) * ny + j]; } break; + case Direction::North: if (j > 0) { nj = j - 1; edge = v_cost[size_t(i) * ny + nj]; } break; + } + if (edge == inf) continue; + const qreal next_cost = cost + edge + (nd == d ? 0 : bend); + const int next = (nj * nx + ni) * 4 + k; + if (next_cost < dist[size_t(next)]) { + dist[size_t(next)] = next_cost; + previous[size_t(next)] = state; + queue.push({next_cost, next}); + } + } + } + + if (best_state < 0) { + result.error = QStringLiteral("no path around the symbols was found"); + return result; + } + + QList chain; + for (int s = best_state; s >= 0; s = previous[size_t(s)]) { + const int node = s / 4; + chain.prepend(QPointF(xs[node % nx], ys[node / nx])); + } + + // Keep only the corners. The two exit points stay even when + // straight on, as Conductor::generateConductorPath() keeps them: + // the segment from a terminal to its exit point is the one the + // application holds fixed when a wire is edited by hand. + QList corners; + for (int k = 0; k < chain.size(); ++k) { + const QPointF p = chain.at(k); + if (k > 0 && k + 1 < chain.size()) { + const QPointF a = chain.at(k - 1), b = chain.at(k + 1); + const bool straight = (std::abs(a.x() - p.x()) < eps && std::abs(b.x() - p.x()) < eps) + || (std::abs(a.y() - p.y()) < eps && std::abs(b.y() - p.y()) < eps); + if (straight) continue; + } + corners << p; + } + + result.points << r.start; + for (const QPointF &p : corners) + if (result.points.last() != p) result.points << p; + if (result.points.last() != r.end) result.points << r.end; + return result; +} diff --git a/sources/conductorrouter.h b/sources/conductorrouter.h new file mode 100644 index 000000000..1fa6b65fe --- /dev/null +++ b/sources/conductorrouter.h @@ -0,0 +1,77 @@ +/* + Copyright 2006-2026 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 . +*/ +// SPDX-License-Identifier: GPL-2.0-or-later +#ifndef CONDUCTORROUTER_H +#define CONDUCTORROUTER_H + +#include +#include +#include +#include +#include + +/** + @brief The ConductorRouter namespace + Finds a path for a conductor that goes around obstacles -- the bounding + rectangles of the symbols on the folio -- instead of the default two or + three straight segments, which run through whatever lies between the two + terminals. Kept free of any QGraphicsItem so the geometry can be tested + on its own. + + The path is made of horizontal and vertical segments only, like every + conductor. It leaves each terminal in the terminal's own direction, + runs on the folio grid, and is the cheapest one found by a search that + charges for length, for every bend, and for running along or crossing + the wires already drawn. +*/ +namespace ConductorRouter +{ + ///The direction a terminal points, outward from its symbol. + ///Same order as Qet::Orientation. + enum class Direction { North, East, South, West }; + + struct Request + { + QPointF start; ///< the first terminal's docking point + Direction start_direction = Direction::North; + QPointF end; ///< the second terminal's docking point + Direction end_direction = Direction::North; + ///Areas no segment may cross. A margin is added to each. + QList obstacles; + ///The other wires on the folio, each as its list of points. + ///Running along one or crossing one costs extra. + QList> wires; + ///The route stays inside this, when it is valid (the folio). + QRectF bounds; + qreal grid = 10.0; + ///Added around each obstacle, so a route keeps clear of it + qreal margin = 5.0; + }; + + struct Result + { + ///From start to end, both included; empty if none was found + QList points; + ///Why there is no route, when points is empty + QString error; + }; + + Result route(const Request &request); +} + +#endif // CONDUCTORROUTER_H diff --git a/sources/dataBase/projectdatabase.cpp b/sources/dataBase/projectdatabase.cpp index bea454bd4..653bcf172 100644 --- a/sources/dataBase/projectdatabase.cpp +++ b/sources/dataBase/projectdatabase.cpp @@ -180,8 +180,37 @@ struct DocumentTerminal QString uuid; QString name; bool master_label = false; + QVariant index; }; + //The index each of @p points has in Element::terminals() -- the index + //the scripting API's addConductor() and conductor calls take -- or a + //null QVariant for a point another terminal shares. Element:: + //parseTerminal() sorts the list top to bottom, then left to right, on + //each terminal's position in its definition, and the sort is not + //stable, so which of two terminals at the same point comes first is + //not defined: no index is given rather than one that can change. +QList terminalIndexes(const QList &points) +{ + QList order; + for (int i = 0 ; i < points.size() ; ++i) { + order << i; + } + std::stable_sort(order.begin(), order.end(), [&points](int a, int b) { + if (points.at(a).y() == points.at(b).y()) { + return points.at(a).x() < points.at(b).x(); + } + return points.at(a).y() < points.at(b).y(); + }); + QList indexes(points.size()); + for (int i = 0 ; i < order.size() ; ++i) { + if (points.count(points.at(order.at(i))) == 1) { + indexes[order.at(i)] = i; + } + } + return indexes; +} + struct DocumentDefinition { QString type; @@ -391,6 +420,25 @@ bool projectDataBase::populateFromDocument(const QDomDocument &document, QString data.fromXml(definition); read.type = data.typeToString(); read.sub_type = data.masterTypeToString(); + //Every terminal the element is built with counts towards + //the indexes, as Element::parseTerminal() keeps every one + //whose position reads, in every . + QList parsed; + QList points; + for (QDomElement d = definition.firstChildElement(QStringLiteral("description")) ; + !d.isNull() ; d = d.nextSiblingElement(QStringLiteral("description"))) { + for (QDomElement t = d.firstChildElement(QStringLiteral("terminal")) ; + !t.isNull() ; t = t.nextSiblingElement(QStringLiteral("terminal"))) + { + qreal x, y; + if (QET::attributeIsAReal(t, QStringLiteral("x"), &x) + && QET::attributeIsAReal(t, QStringLiteral("y"), &y)) { + parsed << t; + points << QPointF(x, y); + } + } + } + const QList indexes = terminalIndexes(points); const QDomElement description = definition.firstChildElement(QStringLiteral("description")); for (QDomElement t = description.firstChildElement(QStringLiteral("terminal")) ; !t.isNull() ; t = t.nextSiblingElement(QStringLiteral("terminal"))) @@ -403,6 +451,10 @@ bool projectDataBase::populateFromDocument(const QDomDocument &document, QString terminal.uuid = terminal_uuid.toString(); terminal.name = t.attribute(QStringLiteral("name")); terminal.master_label = t.attribute(QStringLiteral("use_master_label")) == QLatin1String("true"); + const int place = parsed.indexOf(t); + if (place >= 0) { + terminal.index = indexes.at(place); + } read.terminals.insert(terminal_uuid, terminal); } known = definitions.insert(type, read); @@ -582,8 +634,8 @@ bool projectDataBase::populateFromDocument(const QDomDocument &document, QString for (const auto &end : {std::make_pair(conductor.element1, conductor.terminal1), std::make_pair(conductor.element2, conductor.terminal2)}) { const DocumentElement &owner = elements.at(element_index.value(end.first)); - insertTerminal(end.second, end.first, - owner.terminals.value(QUuid(end.second)).name); + const DocumentTerminal &terminal = owner.terminals.value(QUuid(end.second)); + insertTerminal(end.second, end.first, terminal.name, terminal.index); } m_insert_conductor_query.bindValue(QStringLiteral(":uuid"), conductor.uuid); m_insert_conductor_query.bindValue(QStringLiteral(":diagram_uuid"), conductor.diagram_uuid); @@ -1560,6 +1612,7 @@ bool projectDataBase::createDataBase() "uuid VARCHAR(50) NOT NULL, " "element_uuid VARCHAR(50) NOT NULL," "name VARCHAR(50)," + "terminal_index INTEGER," "PRIMARY KEY (uuid, element_uuid)," "FOREIGN KEY (element_uuid) REFERENCES element (uuid)" ")"); @@ -1812,7 +1865,11 @@ void projectDataBase::createWiringListView() "t2.element_uuid AS to_element_uuid," "ei2.label AS to_element_label," "t2.name AS to_terminal," - "d.pos AS diagram_position" + "d.pos AS diagram_position," + "t1.uuid AS from_terminal_uuid," + "t1.terminal_index AS from_terminal_index," + "t2.uuid AS to_terminal_uuid," + "t2.terminal_index AS to_terminal_index" " FROM conductor c" " JOIN terminal t1 ON c.terminal1_uuid = t1.uuid AND c.terminal1_element_uuid = t1.element_uuid" " JOIN terminal t2 ON c.terminal2_uuid = t2.uuid AND c.terminal2_element_uuid = t2.element_uuid" @@ -1999,9 +2056,15 @@ void projectDataBase::populateConductorTable() */ void projectDataBase::insertTerminal(Terminal *terminal) { + const QList terminals = terminal->parentElement()->terminals(); + QList points; + for (const Terminal *t : terminals) { + points << terminal->parentElement()->mapFromScene(t->dockConductor()); + } insertTerminal(terminal->stableUuid().toString(), terminal->parentElement()->uuid().toString(), - terminal->name()); + terminal->name(), + terminalIndexes(points).value(terminals.indexOf(terminal))); } /** @@ -2009,11 +2072,12 @@ void projectDataBase::insertTerminal(Terminal *terminal) insertTerminal(Terminal *) from values rather than a live terminal. */ void projectDataBase::insertTerminal(const QString &uuid, const QString &element_uuid, - const QString &name) + const QString &name, const QVariant &index) { m_insert_terminal_query.bindValue(":uuid", uuid); m_insert_terminal_query.bindValue(":element_uuid", element_uuid); m_insert_terminal_query.bindValue(":name", name); + m_insert_terminal_query.bindValue(":terminal_index", index); if (!m_insert_terminal_query.exec()) { qDebug() << "projectDataBase::insertTerminal insert error : " << m_insert_terminal_query.lastError(); } @@ -2146,7 +2210,7 @@ void projectDataBase::prepareQuery() //INSERT TERMINAL m_insert_terminal_query = QSqlQuery(m_data_base); - m_insert_terminal_query.prepare("INSERT OR IGNORE INTO terminal (uuid, element_uuid, name) VALUES (:uuid, :element_uuid, :name)"); + m_insert_terminal_query.prepare("INSERT OR IGNORE INTO terminal (uuid, element_uuid, name, terminal_index) VALUES (:uuid, :element_uuid, :name, :terminal_index)"); //INSERT CONDUCTOR m_insert_conductor_query = QSqlQuery(m_data_base); diff --git a/sources/dataBase/projectdatabase.h b/sources/dataBase/projectdatabase.h index 67472af91..1029fcc3d 100644 --- a/sources/dataBase/projectdatabase.h +++ b/sources/dataBase/projectdatabase.h @@ -150,7 +150,7 @@ class projectDataBase : public QObject void watchConductor(Conductor *conductor); void insertTerminal(Terminal *terminal); void insertTerminal(const QString &uuid, const QString &element_uuid, - const QString &name); + const QString &name, const QVariant &index); void prepareQuery(); static QHash elementInfoToString( Element *elmt); diff --git a/sources/dataBase/ui/elementquerywidget.ui b/sources/dataBase/ui/elementquerywidget.ui index 8300b2387..2464c6c81 100644 --- a/sources/dataBase/ui/elementquerywidget.ui +++ b/sources/dataBase/ui/elementquerywidget.ui @@ -88,8 +88,7 @@ - - :/ico/16x16/go-up.png:/ico/16x16/go-up.png + false @@ -105,8 +104,7 @@ - - :/ico/16x16/list-add.png:/ico/16x16/list-add.png + @@ -119,8 +117,7 @@ - - :/ico/16x16/list-remove.png:/ico/16x16/list-remove.png + @@ -133,8 +130,7 @@ - - :/ico/16x16/go-down.png:/ico/16x16/go-down.png + @@ -353,8 +349,7 @@ - - :/ico/16x16/folder-open.png:/ico/16x16/folder-open.png + @@ -380,8 +375,7 @@ - - :/ico/16x16/document-save.png:/ico/16x16/document-save.png + false diff --git a/sources/dataBase/ui/summaryquerywidget.ui b/sources/dataBase/ui/summaryquerywidget.ui index de98cd343..5ed869f20 100644 --- a/sources/dataBase/ui/summaryquerywidget.ui +++ b/sources/dataBase/ui/summaryquerywidget.ui @@ -76,8 +76,7 @@ - - :/ico/16x16/go-up.png:/ico/16x16/go-up.png + @@ -87,8 +86,7 @@ - - :/ico/16x16/list-add.png:/ico/16x16/list-add.png + @@ -98,8 +96,7 @@ - - :/ico/16x16/list-remove.png:/ico/16x16/list-remove.png + @@ -109,8 +106,7 @@ - - :/ico/16x16/go-down.png:/ico/16x16/go-down.png + diff --git a/sources/diagramcontext.cpp b/sources/diagramcontext.cpp index 94b8696a2..b6228e36e 100644 --- a/sources/diagramcontext.cpp +++ b/sources/diagramcontext.cpp @@ -42,6 +42,7 @@ void DiagramContext::add(DiagramContext other) */ void DiagramContext::remove(const QString &key) { m_content.remove(key); + m_content_show.remove(key); } /** diff --git a/sources/editor/elementprimitivedecorator.cpp b/sources/editor/elementprimitivedecorator.cpp index 3b678a7d4..8c01c3693 100644 --- a/sources/editor/elementprimitivedecorator.cpp +++ b/sources/editor/elementprimitivedecorator.cpp @@ -206,7 +206,13 @@ void ElementPrimitiveDecorator::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { // When moving the selection, consider the position of the first selected item QPointF current_position = scene_pos - mouse_offset_; - QPointF rounded_current_position = snapConstPointToGrid(current_position); + // Snap to the editor's grid, as a single part does (bugtracker + // #112); Ctrl keeps the fine 1-unit step. + ElementScene *element_scene = qobject_cast(scene()); + QPointF rounded_current_position = + (element_scene && !(event->modifiers() & Qt::ControlModifier)) + ? element_scene->snapToGrid(current_position) + : snapConstPointToGrid(current_position); movement = rounded_current_position - decorated_items_.at(0) -> toItem() -> scenePos(); QRectF bounding_rect = modified_bounding_rect_; diff --git a/sources/editor/elementview.cpp b/sources/editor/elementview.cpp index 6eed40457..588ac2399 100644 --- a/sources/editor/elementview.cpp +++ b/sources/editor/elementview.cpp @@ -17,6 +17,8 @@ */ #include "elementview.h" +#include "elementviewgrid.h" + #include "../qetapp.h" #include "UndoCommand/pastepartscommand.h" #include "ui/qetelementeditor.h" @@ -535,29 +537,12 @@ void ElementView::drawBackground(QPainter *p, const QRectF &r) { // choisit la granularite de la grille en fonction du zoom en cours // selects the grid granularity according to the current zoom level - int drawn_x_grid = 1;//scene_ -> xGrid(); - int drawn_y_grid = 1;//scene_ -> yGrid(); - bool draw_grid = true; - bool draw_cross = false; + const ElementViewGrid grid = ElementViewGrid::forZoom(zoom_factor); + const int grid_step = grid.step; + const bool draw_grid = grid.draw_grid; + const bool draw_cross = grid.draw_cross; - if (zoom_factor < 1.0) { //< no grid - draw_grid = false; - } else if (zoom_factor < 4.0) { //< grid 10*10 - drawn_x_grid *= 10; - drawn_y_grid *= 10; - }else if (zoom_factor < 8.0) { //< grid 5*5 - drawn_x_grid *= 5; - drawn_y_grid *= 5; - draw_cross = true; - } else if (zoom_factor < 10.0) { //< grid 2*2 - drawn_x_grid *= 2; - drawn_y_grid *= 2; - draw_cross = true; - } else { //< grid 1*1 - draw_cross = true; - } - - m_scene->setGrid(drawn_x_grid, drawn_y_grid); + m_scene->setGrid(grid_step, grid_step); if (draw_grid) { // draw the dots of the grid @@ -587,12 +572,12 @@ void ElementView::drawBackground(QPainter *p, const QRectF &r) { qreal limit_y = r.y() + r.height(); int g_x = (int)ceil(r.x()); - while (g_x % drawn_x_grid) ++ g_x; + while (g_x % grid_step) ++ g_x; int g_y = (int)ceil(r.y()); - while (g_y % drawn_y_grid) ++ g_y; + while (g_y % grid_step) ++ g_y; - for (int gx = g_x ; gx < limit_x ; gx += drawn_x_grid) { - for (int gy = g_y ; gy < limit_y ; gy += drawn_y_grid) { + for (int gx = g_x ; gx < limit_x ; gx += grid_step) { + for (int gy = g_y ; gy < limit_y ; gy += grid_step) { if (draw_cross) { if (!(gx % 10) && !(gy % 10)) { p -> drawLine(QLineF(gx - (pen.width()/4.0), gy, gx + (pen.width()/4.0), gy)); diff --git a/sources/editor/elementviewgrid.h b/sources/editor/elementviewgrid.h new file mode 100644 index 000000000..7a6b2a7e9 --- /dev/null +++ b/sources/editor/elementviewgrid.h @@ -0,0 +1,60 @@ +/* + Copyright 2006-2026 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 . +*/ +#ifndef ELEMENTVIEWGRID_H +#define ELEMENTVIEWGRID_H + +#include + +/** + The symbol editor's grid at a given zoom: the step parts snap to, and + how the grid is drawn. The step gets finer as the view zooms in, so a + small detail can be placed precisely. + + Below 100 % the grid is not drawn (its dots would merge into a grey + wash), but parts still snap every 10 units, as at 100 %. Snapping to 1 + unit there left everything dragged while zoomed out off the grid, with + nothing on screen to show it (bugtracker #112). +*/ +struct ElementViewGrid +{ + int step = 10; + bool draw_grid = true; + bool draw_cross = false; + + static ElementViewGrid forZoom(qreal zoom_factor) + { + ElementViewGrid grid; + if (zoom_factor < 1.0) { + grid.draw_grid = false; + } else if (zoom_factor < 4.0) { + grid.step = 10; + } else if (zoom_factor < 8.0) { + grid.step = 5; + grid.draw_cross = true; + } else if (zoom_factor < 10.0) { + grid.step = 2; + grid.draw_cross = true; + } else { + grid.step = 1; + grid.draw_cross = true; + } + return grid; + } +}; + +#endif // ELEMENTVIEWGRID_H diff --git a/sources/editor/ui/polygoneditor.ui b/sources/editor/ui/polygoneditor.ui index c34d26888..434d2fce6 100644 --- a/sources/editor/ui/polygoneditor.ui +++ b/sources/editor/ui/polygoneditor.ui @@ -48,8 +48,7 @@ - - :/ico/16x16/list-add.png:/ico/16x16/list-add.png + Ajouter un point @@ -57,8 +56,7 @@ - - :/ico/16x16/list-remove.png:/ico/16x16/list-remove.png + Supprimer ce point diff --git a/sources/editor/ui/qetelementeditor.cpp b/sources/editor/ui/qetelementeditor.cpp index dfb81b1ec..7469a2a26 100644 --- a/sources/editor/ui/qetelementeditor.cpp +++ b/sources/editor/ui/qetelementeditor.cpp @@ -765,6 +765,9 @@ void QETElementEditor::updateSelectionFromPartsList() } m_parts_list -> blockSignals(false); m_elmt_scene -> blockSignals(false); + //selectionChanged was blocked above, so the selection decorator must be + //updated by hand, otherwise dragging moves only the part under the cursor + m_elmt_scene -> managePrimitivesGroups(); updateInformations(); updateAction(); } diff --git a/sources/editor/ui/qetelementeditor.ui b/sources/editor/ui/qetelementeditor.ui index 53c380cba..6df529dd9 100644 --- a/sources/editor/ui/qetelementeditor.ui +++ b/sources/editor/ui/qetelementeditor.ui @@ -14,8 +14,7 @@ QElectroTech - Éditeur d'élément - - :/ico/16x16/qet.png:/ico/16x16/qet.png + @@ -55,8 +54,7 @@ Coller depuis... - - :/ico/16x16/edit-paste.png:/ico/16x16/edit-paste.png + @@ -202,8 +200,7 @@ - - :/ico/16x16/edit-select-all.png:/ico/16x16/edit-select-all.png + Tout sélectionner @@ -211,8 +208,7 @@ - - :/ico/22x22/document-new.png:/ico/22x22/document-new.png + &Nouveau @@ -220,8 +216,7 @@ - - :/ico/22x22/folder-open.png:/ico/22x22/folder-open.png + &Ouvrir @@ -229,8 +224,7 @@ - - :/ico/22x22/folder-open.png:/ico/22x22/folder-open.png + &Ouvrir depuis un fichier @@ -238,8 +232,7 @@ - - :/ico/22x22/document-save.png:/ico/22x22/document-save.png + &Enregistrer @@ -247,8 +240,7 @@ - - :/ico/22x22/document-save-as.png:/ico/22x22/document-save-as.png + Enregistrer sous @@ -256,8 +248,7 @@ - - :/ico/22x22/document-save.png:/ico/22x22/document-save.png + Enregistrer dans un fichier @@ -265,8 +256,7 @@ - - :/ico/22x22/document-export.png:/ico/22x22/document-export.png + Exporter en SVG @@ -274,8 +264,7 @@ - - :/ico/22x22/view-refresh.png:/ico/22x22/view-refresh.png + Recharger @@ -283,8 +272,7 @@ - - :/ico/16x16/application-exit.png:/ico/16x16/application-exit.png + &Fermer cet éditeur @@ -295,8 +283,7 @@ - - :/ico/16x16/edit-select-none.png:/ico/16x16/edit-select-none.png + Désélectionner tout @@ -304,8 +291,7 @@ - - :/ico/16x16/edit-cut.png:/ico/16x16/edit-cut.png + Co&uper @@ -313,8 +299,7 @@ - - :/ico/16x16/edit-copy.png:/ico/16x16/edit-copy.png + Cop&ier @@ -322,8 +307,7 @@ - - :/ico/16x16/edit-paste.png:/ico/16x16/edit-paste.png + C&oller @@ -331,8 +315,7 @@ - - :/ico/16x16/edit-paste.png:/ico/16x16/edit-paste.png + C&oller dans la zone @@ -348,8 +331,7 @@ - - :/ico/16x16/element.png:/ico/16x16/element.png + Un élément @@ -357,8 +339,7 @@ - - :/ico/16x16/edit-select-invert.png:/ico/16x16/edit-select-invert.png + Inverser la sélection @@ -366,8 +347,7 @@ - - :/ico/22x22/edit-delete.png:/ico/22x22/edit-delete.png + &Supprimer @@ -383,8 +363,7 @@ - - :/ico/16x16/preferences-desktop-user.png:/ico/16x16/preferences-desktop-user.png + Éditer les informations sur l'auteur @@ -400,8 +379,7 @@ - - :/ico/22x22/zoom-in.png:/ico/22x22/zoom-in.png + Zoom avant @@ -409,8 +387,7 @@ - - :/ico/22x22/zoom-out.png:/ico/22x22/zoom-out.png + Zoom arrière @@ -434,8 +411,7 @@ - - :/ico/16x16/qet.png:/ico/16x16/qet.png + À &propos de QElectroTech @@ -446,8 +422,7 @@ - - :/ico/16x16/help-contents.png:/ico/16x16/help-contents.png + Manuel en ligne @@ -458,8 +433,7 @@ - - :/ico/16x16/kdenlive-show-video.png:/ico/16x16/kdenlive-show-video.png + Chaine Youtube @@ -470,8 +444,7 @@ - - :/ico/16x16/help-donate.png:/ico/16x16/help-donate.png + Soutenir le projet par un don @@ -482,8 +455,7 @@ - - :/ico/16x16/qt.png:/ico/16x16/qt.png + À propos de &Qt @@ -510,8 +482,7 @@ - - :/ico/16x16/mirror.png:/ico/16x16/mirror.png + Mirror @@ -519,8 +490,7 @@ - - :/ico/16x16/flip.png:/ico/16x16/flip.png + Flip @@ -536,8 +506,7 @@ - - :/ico/22x22/folder-open.png:/ico/22x22/folder-open.png + importer un élément à redimensionner diff --git a/sources/elementspanel.cpp b/sources/elementspanel.cpp index d4d318717..72e20ef79 100644 --- a/sources/elementspanel.cpp +++ b/sources/elementspanel.cpp @@ -255,9 +255,9 @@ bool ElementsPanel::matchesFilter(const QTreeWidgetItem *item, */ void ElementsPanel::reload() { - QIcon system_icon(":/ico/16x16/qet.png"); + QIcon system_icon = QIcon::fromTheme("qet"); QIcon company_icon = QET::Icons::Company; - QIcon user_icon(":/ico/16x16/go-home.png"); + QIcon user_icon = QIcon::fromTheme("go-home"); // load the common title block templates collection TitleBlockTemplatesCollection *common_tbt_collection = QETApp::commonTitleBlockTemplatesCollection(); diff --git a/sources/print/projectprintwindow.ui b/sources/print/projectprintwindow.ui index beae39275..70cbf2e59 100644 --- a/sources/print/projectprintwindow.ui +++ b/sources/print/projectprintwindow.ui @@ -134,8 +134,7 @@ - - :/ico/16x16/dialog-ok.png:/ico/16x16/dialog-ok.png + true @@ -305,8 +304,7 @@ - - :/ico/22x22/view_fit_width.png:/ico/22x22/view_fit_width.png + Ajuster la largeur @@ -314,8 +312,7 @@ - - :/ico/22x22/view-fit-window.png:/ico/22x22/view-fit-window.png + Ajuster la page @@ -323,8 +320,7 @@ - - :/ico/16x16/zoom-out.png:/ico/16x16/zoom-out.png + Zoom arrière @@ -332,8 +328,7 @@ - - :/ico/16x16/zoom-in.png:/ico/16x16/zoom-in.png + Zoom avant @@ -365,8 +360,7 @@ - - :/ico/16x16/arrow-left.png:/ico/16x16/arrow-left.png + Page précédente @@ -374,8 +368,7 @@ - - :/ico/16x16/arrow-right.png:/ico/16x16/arrow-right.png + Page suivante @@ -391,8 +384,7 @@ - - :/ico/22x22/single_page.png:/ico/22x22/single_page.png + Afficher une seule page @@ -400,8 +392,7 @@ - - :/ico/22x22/two_pages.png:/ico/22x22/two_pages.png + Afficher deux pages @@ -417,8 +408,7 @@ - - :/ico/48x48/document-print-frame.png:/ico/48x48/document-print-frame.png + mise en page diff --git a/sources/qetgraphicsitem/ViewItem/ui/graphicstablepropertieseditor.ui b/sources/qetgraphicsitem/ViewItem/ui/graphicstablepropertieseditor.ui index 3c9751697..5d07ce7a1 100644 --- a/sources/qetgraphicsitem/ViewItem/ui/graphicstablepropertieseditor.ui +++ b/sources/qetgraphicsitem/ViewItem/ui/graphicstablepropertieseditor.ui @@ -62,8 +62,7 @@ - - :/ico/16x16/arrow-right.png:/ico/16x16/arrow-right.png + true @@ -178,8 +177,7 @@ - - :/ico/16x16/arrow-left.png:/ico/16x16/arrow-left.png + true diff --git a/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.ui b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.ui index 649e756c7..2ae359594 100644 --- a/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.ui +++ b/sources/qetgraphicsitem/ViewItem/ui/projectdbmodelpropertieswidget.ui @@ -20,8 +20,7 @@ Requête - - :/ico/16x16/edit-rename.png:/ico/16x16/edit-rename.png + @@ -31,8 +30,7 @@ Recharger - - :/ico/16x16/view-refresh.png:/ico/16x16/view-refresh.png + diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 4d658129f..8939e0bac 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -1389,6 +1389,46 @@ bool Conductor::moveSegment(int index, qreal dx, qreal dy) return true; } +/** + @brief Conductor::setPathPoints + Replace this conductor's path by the one through @p scene_points, and + push one undo step for it -- the same ChangeConductorCommand a manual + handle drag or moveSegment() pushes, so the path is saved as a + modified one and survives a reload. + @param scene_points in scene coordinates, from terminal1's docking + point to terminal2's, every segment horizontal or vertical + @return false, changing nothing, if the points do not make such a path +*/ +bool Conductor::setPathPoints(const QList &scene_points) +{ + if (scene_points.size() < 2 || !terminal1 || !terminal2) return false; + const auto near = [](const QPointF &a, const QPointF &b) { + return qAbs(a.x() - b.x()) < 0.5 && qAbs(a.y() - b.y()) < 0.5; + }; + if (!near(scene_points.first(), terminal1->dockConductor()) || + !near(scene_points.last(), terminal2->dockConductor())) + return false; + QList points; + for (int i = 0; i < scene_points.size(); ++i) { + const QPointF p = scene_points.at(i); + if (i && qAbs(p.x() - scene_points.at(i - 1).x()) > 0.01 + && qAbs(p.y() - scene_points.at(i - 1).y()) > 0.01) + return false; + points << mapFromScene(p); + } + // A two-point path has nothing to segment between: let the + // application draw it, as for a conductor with no profile. + if (points.size() < 3) return false; + + before_mov_text_pos_ = m_text_item->pos(); + pointsToSegments(points); + modified_path = true; + segmentsToPath(); + calculateTextItemPosition(); + saveProfile(); + return true; +} + /** @brief Conductor::length @return the length of this conductor @@ -2305,6 +2345,38 @@ QPointF Conductor::movePointIntoPolygon(const QPointF &point, const QPainterPath } } +namespace { + /// The two ends of @p conductor on the folio, smaller first, compared + /// by x then y. + QPair conductorEnds(const Conductor *conductor) + { + auto less = [](const QPointF &a, const QPointF &b) { + return a.x() < b.x() || (a.x() == b.x() && a.y() < b.y()); + }; + QPointF a = conductor->terminal1 ? conductor->terminal1->dockConductor() : QPointF(); + QPointF b = conductor->terminal2 ? conductor->terminal2->dockConductor() : QPointF(); + if (less(b, a)) + std::swap(a, b); + return qMakePair(a, b); + } + + /// True if @p a comes before @p b in an order that is the same in every + /// run: by where the conductor's ends are on the folio, then by uuid. + /// Not by uuid first: a project generated again by a script gets new + /// uuids each time, and a file with no conductor uuids gets new ones on + /// every load, while the drawing is the same. + bool stableConductorLess(const Conductor *a, const Conductor *b) + { + const auto ea = conductorEnds(a), eb = conductorEnds(b); + const qreal ka[4] = {ea.first.x(), ea.first.y(), ea.second.x(), ea.second.y()}; + const qreal kb[4] = {eb.first.x(), eb.first.y(), eb.second.x(), eb.second.y()}; + for (int i = 0; i < 4; ++i) + if (ka[i] != kb[i]) + return ka[i] < kb[i]; + return a->uuid() < b->uuid(); + } +} + /** @brief longestConductorInPotential @param conductor : a conductor in the potential to search @@ -2313,10 +2385,24 @@ QPointF Conductor::movePointIntoPolygon(const QPointF &point, const QPainterPath */ Conductor * longestConductorInPotential(Conductor *conductor, bool all_diagram) { Conductor *longest_conductor = conductor; - //Search the longest conductor + qreal longest_length = conductor->length(); + //Search the longest conductor. + //Conductors of equal length are common (a symmetrical layout), and the + //set is iterated in pointer order, which changes from run to run: so a + //tie is broken by an order that does not, or the potential's text lands + //on a different conductor each time the same file is opened or exported. foreach (Conductor *c, conductor -> relatedPotentialConductors(all_diagram)) - if (c -> length() > longest_conductor -> length()) + { + const qreal length = c->length(); + if (qAbs(length - longest_length) < 1e-6) { + if (stableConductorLess(c, longest_conductor)) + longest_conductor = c; + } + else if (length > longest_length) { longest_conductor = c; + longest_length = length; + } + } return longest_conductor; } diff --git a/sources/qetgraphicsitem/conductor.h b/sources/qetgraphicsitem/conductor.h index 46976129a..2cbe76f27 100644 --- a/sources/qetgraphicsitem/conductor.h +++ b/sources/qetgraphicsitem/conductor.h @@ -116,6 +116,7 @@ class Conductor : public QGraphicsObject QVector handlerPoints() const; const QList segmentsList() const; bool moveSegment(int index, qreal dx, qreal dy); + bool setPathPoints(const QList &scene_points); void setPropertyToPotential( const ConductorProperties &property, diff --git a/sources/qeticons.cpp b/sources/qeticons.cpp index ae3c9ff4f..dbfe7a736 100644 --- a/sources/qeticons.cpp +++ b/sources/qeticons.cpp @@ -427,8 +427,7 @@ void QET::Icons::initIcons() ConfigureToolbars = QIcon::fromTheme("configure-toolbars"); IC_CopyFile = QIcon::fromTheme("item-copy"); DiagramAdd = QIcon::fromTheme("folio-new"); - Diagram.addFile(":/ico/16x16/diagram.png"); - Diagram.addFile(":/ico/diagram.png"); + Diagram = QIcon::fromTheme("diagram"); DiagramBg = QIcon::fromTheme("diagram_bg"); DiagramDelete = QIcon::fromTheme("folio-delete"); DialogCancel = QIcon::fromTheme("dialog-cancel"); diff --git a/sources/scripting/qetscriptapi.cpp b/sources/scripting/qetscriptapi.cpp index 54b0d9054..0c5e83f9c 100644 --- a/sources/scripting/qetscriptapi.cpp +++ b/sources/scripting/qetscriptapi.cpp @@ -42,6 +42,7 @@ #include "../qetgraphicsitem/conductor.h" #include "../qetgraphicsitem/conductortextitem.h" #include "../conductorsegment.h" +#include "../conductorrouter.h" #include "../qetgraphicsitem/diagramimageitem.h" // See diagrameventaddpdf.h: a missing QtPdf module (or Qt < 6.4) is not @@ -86,6 +87,7 @@ #include #include #include +#include #include #include #include @@ -677,6 +679,17 @@ QString QetScriptApi::addElement(int folioIndex, const QString &locationPath, do const QString import_path = location.isFileSystem() ? QStringLiteral("import/") + location.collectionPath(false) : location.collectionPath(false); + // An element file that exists but cannot be read gives a null + // uuid(), which the collision check below would misreport as "a + // different element" -- say what actually went wrong instead. + if (location.isFileSystem() + && location.pugiXml().document_element().empty()) { + const QString file = QDir::toNativeSeparators( + QFileInfo(location.fileSystemPath()).absoluteFilePath()); + log(QStringLiteral("qet.addElement: could not read element '%1' (file '%2', " + "%3 characters)").arg(locationPath, file).arg(file.size())); + return QString(); + } const ElementsLocation existing(import_path, m_project); if (existing.exist() && existing.uuid() != location.uuid()) { log(QStringLiteral("qet.addElement: '%1' would collide with a different element " @@ -1194,6 +1207,119 @@ bool QetScriptApi::moveConductorSegment(int folioIndex, const QString &elementUu return conductor->moveSegment(segmentIndex, dx, dy); } +namespace { +ConductorRouter::Direction routerDirection(Qet::Orientation o) +{ + switch (o) { + case Qet::North: return ConductorRouter::Direction::North; + case Qet::East: return ConductorRouter::Direction::East; + case Qet::South: return ConductorRouter::Direction::South; + case Qet::West: return ConductorRouter::Direction::West; + } + return ConductorRouter::Direction::North; +} +} // namespace + +/** + @brief QetScriptApi::applyRoute + Redraw @p conductor around the symbols on its folio (ConductorRouter), + as one undo step through Conductor::setPathPoints() -- the same + ChangeConductorCommand a handle drag pushes, so the path is saved and + survives a reload. Obstacles are every element's own rectangle, its + texts left out; the other conductors are not obstacles but cost extra + to run along or cross. + @return "routed", or "no-route" with the reason logged when there is + no such path -- the conductor then keeps the path it had. Not a + failure: the wire exists and joins the right terminals either way. +*/ +QString QetScriptApi::applyRoute(Conductor *conductor, const QString &caller) +{ + Diagram *diagram = conductor->diagram(); + if (!diagram) return QString(); + + ConductorRouter::Request request; + request.start = conductor->terminal1->dockConductor(); + request.start_direction = routerDirection(conductor->terminal1->orientation()); + request.end = conductor->terminal2->dockConductor(); + request.end_direction = routerDirection(conductor->terminal2->orientation()); + request.grid = Diagram::xGrid; + request.bounds = diagram->border_and_titleblock.insideBorderRect(); + for (Element *e : diagram->elements()) + request.obstacles << e->mapRectToScene(e->boundingRect()); + for (Conductor *other : diagram->conductors()) { + if (other == conductor) continue; + QVector wire; + const QList segs = other->segmentsList(); + for (ConductorSegment *seg : segs) { + if (wire.isEmpty()) wire << other->mapToScene(seg->firstPoint()); + wire << other->mapToScene(seg->secondPoint()); + } + request.wires << wire; + } + + const ConductorRouter::Result route = ConductorRouter::route(request); + if (route.points.isEmpty()) { + log(QStringLiteral("qet.%1: %2; the conductor keeps its path") + .arg(caller, route.error)); + return QStringLiteral("no-route"); + } + if (!conductor->setPathPoints(route.points)) { + log(QStringLiteral("qet.%1: the route found does not join the two terminals; " + "the conductor keeps its path").arg(caller)); + return QStringLiteral("no-route"); + } + return QStringLiteral("routed"); +} + +/** + @brief QetScriptApi::routeConductor + Redraw the conductor on a terminal so it goes around the symbols in + its way instead of through them -- see applyRoute(). Addressed as the + other conductor calls address one. + @return "routed", "no-route" (path unchanged, reason logged), or an + empty string if there is no such conductor or the project is read-only +*/ +QString QetScriptApi::routeConductor(int folioIndex, const QString &elementUuid, + int terminalIndex) +{ + if (!m_project) return QString(); + if (m_project->isReadOnly()) { + log(QStringLiteral("qet.routeConductor: project is read-only")); + return QString(); + } + Conductor *conductor = findConductor(folioIndex, elementUuid, terminalIndex, + QStringLiteral("routeConductor")); + if (!conductor) return QString(); + return applyRoute(conductor, QStringLiteral("routeConductor")); +} + +/** + @brief QetScriptApi::routeConductorBetween + routeConductor() for the conductor joining two given terminals, which + names it even where either terminal carries other conductors too -- + the case just after addConductor() onto a terminal already wired. +*/ +QString QetScriptApi::routeConductorBetween(int folioIndex, + const QString &elementUuidA, int terminalIndexA, + const QString &elementUuidB, int terminalIndexB) +{ + if (!m_project) return QString(); + if (m_project->isReadOnly()) { + log(QStringLiteral("qet.routeConductorBetween: project is read-only")); + return QString(); + } + const QString caller = QStringLiteral("routeConductorBetween"); + Terminal *a = findTerminal(folioIndex, elementUuidA, terminalIndexA, caller); + Terminal *b = findTerminal(folioIndex, elementUuidB, terminalIndexB, caller); + if (!a || !b) return QString(); + for (Conductor *c : a->conductors()) { + if (c->terminal1 == b || c->terminal2 == b) + return applyRoute(c, caller); + } + log(QStringLiteral("qet.%1: no conductor joins those two terminals").arg(caller)); + return QString(); +} + QString QetScriptApi::elementLinkType(int folioIndex, const QString &elementUuid) const { Element *element = findElement(folioIndex, elementUuid); diff --git a/sources/scripting/qetscriptapi.h b/sources/scripting/qetscriptapi.h index a458149da..a4da697de 100644 --- a/sources/scripting/qetscriptapi.h +++ b/sources/scripting/qetscriptapi.h @@ -418,6 +418,11 @@ class QetScriptApi : public QObject Q_INVOKABLE bool moveConductorSegment(int folioIndex, const QString &elementUuid, int terminalIndex, int segmentIndex, double dx, double dy); + Q_INVOKABLE QString routeConductor(int folioIndex, const QString &elementUuid, + int terminalIndex); + Q_INVOKABLE QString routeConductorBetween(int folioIndex, + const QString &elementUuidA, int terminalIndexA, + const QString &elementUuidB, int terminalIndexB); // -- cross-references: master/slave and report links -- Q_INVOKABLE QString elementLinkType(int folioIndex, const QString &elementUuid) const; @@ -596,6 +601,7 @@ class QetScriptApi : public QObject Element *findElement(int folioIndex, const QString &elementUuid) const; Terminal *findTerminal(int folioIndex, const QString &elementUuid, int terminalIndex, const QString &caller); + QString applyRoute(Conductor *conductor, const QString &caller); Conductor *findConductor(int folioIndex, const QString &elementUuid, int terminalIndex, const QString &caller); QList sortedTexts(int folioIndex) const; diff --git a/sources/ui/conductorpropertieswidget.cpp b/sources/ui/conductorpropertieswidget.cpp index d8e3e57a6..d203880a1 100644 --- a/sources/ui/conductorpropertieswidget.cpp +++ b/sources/ui/conductorpropertieswidget.cpp @@ -126,6 +126,12 @@ ConductorProperties ConductorPropertiesWidget::properties() const properties_.m_bicolor = ui->m_color_2_gb->isChecked(); properties_.m_color_2 = ui->m_color_2_kpb->color(); properties_.m_dash_size = ui->m_dash_size_sb->value(); + //The box starts at 2, so the default size 1 shows as 2: keep the + //stored size unless the box shows something else. + if (properties_.m_dash_size == qBound(ui->m_dash_size_sb->minimum(), + m_properties.m_dash_size, + ui->m_dash_size_sb->maximum())) + properties_.m_dash_size = m_properties.m_dash_size; properties_.style = ui -> m_line_style_cb->itemData(ui->m_line_style_cb->currentIndex()).value().style(); properties_.m_formula = ui->m_formula_le->text(); properties_.text = ui -> m_text_le -> text(); diff --git a/sources/ui/conductorpropertieswidget.ui b/sources/ui/conductorpropertieswidget.ui index 41163cfed..301aa0f18 100644 --- a/sources/ui/conductorpropertieswidget.ui +++ b/sources/ui/conductorpropertieswidget.ui @@ -233,8 +233,7 @@ - - :/ico/16x16/configure.png:/ico/16x16/configure.png + diff --git a/sources/ui/configpage/configpages.cpp b/sources/ui/configpage/configpages.cpp index 7c2db969d..b9ac8562c 100644 --- a/sources/ui/configpage/configpages.cpp +++ b/sources/ui/configpage/configpages.cpp @@ -233,8 +233,10 @@ void NewDiagramPage::applyConf() pg.color = g.color; proj_guides.append(pg); } - m_project->setDefaultGuides(proj_guides); - modified_project = true; + if (m_project->defaultGuides() != proj_guides) { + m_project->setDefaultGuides(proj_guides); + modified_project = true; + } if (modified_project) { m_project -> setModified(modified_project); diff --git a/sources/ui/configsaveloaderwidget.ui b/sources/ui/configsaveloaderwidget.ui index aaa8aa130..97c35b529 100644 --- a/sources/ui/configsaveloaderwidget.ui +++ b/sources/ui/configsaveloaderwidget.ui @@ -29,8 +29,7 @@ - - :/ico/16x16/folder-open.png:/ico/16x16/folder-open.png + @@ -40,8 +39,7 @@ - - :/ico/16x16/document-save.png:/ico/16x16/document-save.png + diff --git a/sources/ui/dialogwaiting.cpp b/sources/ui/dialogwaiting.cpp index 498504e1e..1f9f7c468 100644 --- a/sources/ui/dialogwaiting.cpp +++ b/sources/ui/dialogwaiting.cpp @@ -19,6 +19,7 @@ #include "dialogwaiting.h" #include "ui_dialogwaiting.h" #include "../qet.h" +#include #include @@ -32,6 +33,8 @@ DialogWaiting::DialogWaiting(QWidget *parent) : ui(new Ui::DialogWaiting) { ui->setupUi(this); + ui->label->setPixmap(QIcon::fromTheme("user-away-extended") + .pixmap(ui->label->maximumSize())); QET::trackDialogGeometry(this); setTitle( "..." ); setDetail( "..." ); diff --git a/sources/ui/dialogwaiting.ui b/sources/ui/dialogwaiting.ui index a7d223783..bb6ff955e 100644 --- a/sources/ui/dialogwaiting.ui +++ b/sources/ui/dialogwaiting.ui @@ -62,9 +62,6 @@ - - :/ico/48x48/user-away-extended.png - true diff --git a/sources/ui/dynamicelementtextitemeditor.ui b/sources/ui/dynamicelementtextitemeditor.ui index 549fe9dbb..f4d264cd3 100644 --- a/sources/ui/dynamicelementtextitemeditor.ui +++ b/sources/ui/dynamicelementtextitemeditor.ui @@ -25,8 +25,7 @@ ... - - :/ico/16x16/document-save.png:/ico/16x16/document-save.png + @@ -39,8 +38,7 @@ ... - - :/ico/16x16/folder-open.png:/ico/16x16/folder-open.png + @@ -79,8 +77,7 @@ ... - - :/ico/16x16/object-group.png:/ico/16x16/object-group.png + @@ -93,8 +90,7 @@ ... - - :/ico/16x16/list-remove.png:/ico/16x16/list-remove.png + diff --git a/sources/ui/masterpropertieswidget.ui b/sources/ui/masterpropertieswidget.ui index 910ac27c0..123042be0 100644 --- a/sources/ui/masterpropertieswidget.ui +++ b/sources/ui/masterpropertieswidget.ui @@ -136,8 +136,7 @@ - - :/ico/16x16/go-up.png:/ico/16x16/go-up.png + @@ -150,8 +149,7 @@ - - :/ico/16x16/go-down.png:/ico/16x16/go-down.png + diff --git a/sources/ui/thirdpartybinaryinstalldialog.ui b/sources/ui/thirdpartybinaryinstalldialog.ui index cbd94b056..dff03700c 100644 --- a/sources/ui/thirdpartybinaryinstalldialog.ui +++ b/sources/ui/thirdpartybinaryinstalldialog.ui @@ -33,8 +33,7 @@ Télechargement - - :/ico/16x16/edit-download.png:/ico/16x16/edit-download.png + @@ -44,8 +43,7 @@ Dossier installation - - :/ico/16x16/folder-open.png:/ico/16x16/folder-open.png + diff --git a/sources/ui/titleblockpropertieswidget.cpp b/sources/ui/titleblockpropertieswidget.cpp index 929b557c2..88bdd4842 100644 --- a/sources/ui/titleblockpropertieswidget.cpp +++ b/sources/ui/titleblockpropertieswidget.cpp @@ -123,6 +123,8 @@ void TitleBlockPropertiesWidget::setProperties( ui -> m_folio_le -> setText (properties.folio); ui -> m_display_at_cb -> setCurrentIndex(properties.display_at == Qt::BottomEdge ? 0 : 1); ui->auto_page_cb->setCurrentText(properties.auto_page_num); + m_auto_page_num = properties.auto_page_num; + m_auto_page_num_picked = false; //About date ui -> m_date_now_pb -> setDisabled(true); @@ -166,6 +168,7 @@ void TitleBlockPropertiesWidget::setProperties( // Show the saved custom values, plus any of the template's custom variables // that aren't defined yet, so the user only fills in the missing ones (#271). DiagramContext context = properties.context; + m_context_keys = context.keys(); addTemplateVariables(context, index); m_dcw -> setContext(context); } @@ -215,8 +218,22 @@ TitleBlockProperties TitleBlockPropertiesWidget::properties() const } prop.context = m_dcw -> context(); + //The template's custom variables are only offered for filling in + //(#271): one left empty is not part of the properties. + const QList keys = prop.context.keys(); + for (const QString &key : keys) { + if (!m_context_keys.contains(key) + && prop.context.value(key).toString().isEmpty()) + prop.context.remove(key); + } - prop.auto_page_num = ui->auto_page_cb->currentText(); + //The combo box cannot show "no folio numbering": it shows its + //placeholder entry, or the project's first numbering. Return what + //was set unless the user picked something else. + if (!m_auto_page_num_picked) + prop.auto_page_num = m_auto_page_num; + else if (ui->auto_page_cb->currentText() != tr("Créer un Folio Numérotation Auto")) + prop.auto_page_num = ui->auto_page_cb->currentText(); return prop; } @@ -376,6 +393,9 @@ void TitleBlockPropertiesWidget::initDialog( foreach (QString str, keys_2) { ui -> auto_page_cb -> addItem(str); } if (ui->auto_page_cb->currentText()==nullptr) ui->auto_page_cb->addItem(tr("Créer un Folio Numérotation Auto")); + //activated() is only emitted for a choice the user makes + connect(ui->auto_page_cb, qOverload(&QComboBox::activated), + this, [this]() { m_auto_page_num_picked = true; }); } else{ ui->auto_page_cb->hide(); diff --git a/sources/ui/titleblockpropertieswidget.h b/sources/ui/titleblockpropertieswidget.h index 0622da8a5..127f04c9c 100644 --- a/sources/ui/titleblockpropertieswidget.h +++ b/sources/ui/titleblockpropertieswidget.h @@ -100,11 +100,17 @@ class TitleBlockPropertiesWidget : public QWidget private: Ui::TitleBlockPropertiesWidget *ui; DiagramContextWidget *m_dcw; + /// keys of the context given to setProperties() + QStringList m_context_keys; QAction *m_tbt_edit, *m_tbt_duplicate; QMenu *m_tbt_menu; QList m_tbt_collection_list; QList m_map_index_to_collection_type; QList keys_2; + /// auto_page_num as given to setProperties(), returned + /// unchanged unless the user picks another folio numbering + QString m_auto_page_num; + bool m_auto_page_num_picked = false; }; #endif // TITLEBLOCKPROPERTIESWIDGET_H diff --git a/sources/ui/titleblockpropertieswidget.ui b/sources/ui/titleblockpropertieswidget.ui index b1ad44d4b..da3edd61c 100644 --- a/sources/ui/titleblockpropertieswidget.ui +++ b/sources/ui/titleblockpropertieswidget.ui @@ -119,8 +119,7 @@ - - :/ico/22x22/edit-rename.png:/ico/22x22/edit-rename.png + @@ -208,8 +207,7 @@ - - :/ico/16x16/configure.png:/ico/16x16/configure.png + @@ -303,8 +301,7 @@ - - :/ico/22x22/start.png:/ico/22x22/start.png + diff --git a/sources/ui/xrefpropertieswidget.cpp b/sources/ui/xrefpropertieswidget.cpp index c113eda45..d08c8d5c7 100644 --- a/sources/ui/xrefpropertieswidget.cpp +++ b/sources/ui/xrefpropertieswidget.cpp @@ -151,8 +151,15 @@ void XRefPropertiesWidget::saveProperties(int index) { xrp.setPrefix("switch", ui->m_switch_prefix_le->text()); xrp.setMasterLabel(ui->m_master_le->text()); xrp.setSlaveLabel(ui->m_slave_le->text()); - xrp.setOffset(ui->m_offset_sb->value()); - xrp.setSlaveOffset(ui->m_slave_offset_sb->value()); + //The boxes cannot show a value below their minimum (the offset's + //minimum is its "Default" entry, standing for the stored 0): keep + //the stored value unless the box shows something else. + if (ui->m_offset_sb->value() != qBound(ui->m_offset_sb->minimum(), xrp.offset(), + ui->m_offset_sb->maximum())) + xrp.setOffset(ui->m_offset_sb->value()); + if (ui->m_slave_offset_sb->value() != qBound(ui->m_slave_offset_sb->minimum(), xrp.slaveOffset(), + ui->m_slave_offset_sb->maximum())) + xrp.setSlaveOffset(ui->m_slave_offset_sb->value()); m_properties.insert(type, xrp); } diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index 992d0e3f5..41951877e 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -104,6 +104,13 @@ add_test(NAME tst_textgrid COMMAND tst_textgrid) target_include_directories(tst_textgrid PRIVATE ${QET_DIR}/sources) target_link_libraries(tst_textgrid PRIVATE Qt::Test) +# elementviewgrid.h is header-only: the symbol editor's snap step at each +# zoom (bugtracker #112), tested without an editor window. +add_executable(tst_elementviewgrid tst_elementviewgrid.cpp) +add_test(NAME tst_elementviewgrid COMMAND tst_elementviewgrid) +target_include_directories(tst_elementviewgrid PRIVATE ${QET_DIR}/sources) +target_link_libraries(tst_elementviewgrid PRIVATE Qt::Test) + # alignment.h is header-only too (it builds on textgrid.h): the geometry # behind the align commands, tested without a scene. add_executable(tst_alignment tst_alignment.cpp) @@ -400,6 +407,19 @@ target_link_libraries(tst_pdfpagesize PRIVATE Qt::Test Qt::Gui) target_compile_definitions(tst_pdfpagesize PRIVATE "QET_TEST_BINARY_PATH=\"$\"") +# One text per potential: the number goes on the same conductor in every +# run when two conductors tie for longest. Exports +# fixtures/one_text_per_potential_tie.qet through the real binary, several +# times, since the order it used to depend on changes only between runs. +add_executable( + tst_potentialtextcarrier + tst_potentialtextcarrier.cpp) +add_test(NAME tst_potentialtextcarrier COMMAND tst_potentialtextcarrier) +add_dependencies(tst_potentialtextcarrier qelectrotech) +target_link_libraries(tst_potentialtextcarrier PRIVATE Qt::Test) +target_compile_definitions(tst_potentialtextcarrier PRIVATE + "QET_TEST_BINARY_PATH=\"$\"") + # Hops where wires cross (issue #436): the geometry in wirehops.cpp, and # through the real binary, that --resave keeps the project setting and # adds nothing to a project without it. @@ -414,6 +434,16 @@ target_link_libraries(tst_wirehops PRIVATE Qt::Test Qt::Gui) target_compile_definitions(tst_wirehops PRIVATE "QET_TEST_BINARY_PATH=\"$\"") +# The routing behind qet.routeConductor(): conductorrouter.cpp needs only +# Qt Core, so the geometry is tested without a scene. +add_executable( + tst_conductorrouter + tst_conductorrouter.cpp + ${QET_DIR}/sources/conductorrouter.cpp) +add_test(NAME tst_conductorrouter COMMAND tst_conductorrouter) +target_include_directories(tst_conductorrouter PRIVATE ${QET_DIR}/sources) +target_link_libraries(tst_conductorrouter PRIVATE Qt::Test) + # qet.conductorUuids() / qet.conductorEnds(): a script lists a folio's # conductors by uuid and finds each one's two ends. Runs a script through # the real binary's --run on fixtures/qet_bug_repro_resaved.qet, so only @@ -441,6 +471,18 @@ if(QET_HAS_SCRIPTING) "QET_TEST_BINARY_PATH=\"$\"" "QET_ELEMENTS_DIR=\"${QET_DIR}/elements\"") + # qet.addElement() on a symbol that exists but cannot be read says so, + # rather than reporting a collision with the copy already embedded. + add_executable( + tst_unreadableelement + tst_unreadableelement.cpp) + add_test(NAME tst_unreadableelement COMMAND tst_unreadableelement) + add_dependencies(tst_unreadableelement qelectrotech) + target_link_libraries(tst_unreadableelement PRIVATE Qt::Test) + target_compile_definitions(tst_unreadableelement PRIVATE + "QET_TEST_BINARY_PATH=\"$\"" + "QET_ELEMENTS_DIR=\"${QET_DIR}/elements\"") + # The project database filled from the file as it is read holds exactly # what it holds filled from the built folios (QET_DATABASE_FROM_FOLIOS=1), # on every example saved once; an older file falls back, saying why. @@ -479,6 +521,19 @@ if(QET_HAS_SCRIPTING) "QET_TEST_BINARY_PATH=\"$\"" "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") + # The same symbol placed twice in a project whose collection does not + # start with its "import" category (examples/lmdg.qet). + add_executable( + tst_importcategory + tst_importcategory.cpp) + add_test(NAME tst_importcategory COMMAND tst_importcategory) + add_dependencies(tst_importcategory qelectrotech) + target_link_libraries(tst_importcategory PRIVATE Qt::Test) + target_compile_definitions(tst_importcategory PRIVATE + "QET_TEST_BINARY_PATH=\"$\"" + "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"" + "QET_ELEMENTS_DIR=\"${QET_DIR}/elements\"") + # qet.currentFolio() through --run: the first folio, or -1 with none; and # --run keeps one undo step per call (only an editor run is grouped). add_executable( diff --git a/tests/qttest/fixtures/one_text_per_potential_tie.qet b/tests/qttest/fixtures/one_text_per_potential_tie.qet new file mode 100644 index 000000000..31f27e377 --- /dev/null +++ b/tests/qttest/fixtures/one_text_per_potential_tie.qet @@ -0,0 +1,320 @@ + + + 10/2/26 + 02-10-2026 + 2026-10-02 + one_text_per_potential_tie + one_text_per_potential_tie.qet + 22:07 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + label + + + + + + + + + + + + + + label + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + Elements importats + Zavedené prvky + Importerede elementer + Importierte Elemente + Εισηγμένα στοιχεία + Imported elements + Elementos importados + Éléments importés + Uvezeni elementi + Elementi importati + インバートされた要素 + 전기 심볼 요소 + 전기 심볼 요소 + Elementen geïmporteerd + Elementen geïmporteerd + Elementy importowane + Elementos importados + Elementos importados + Elemente importate + Импортированные элементы + Uvoženi elementi + Importerade element + İthal öğeler + Імпортовані елементи + 导入元件 + + + + كهربائي + Elèctric + Elektrotechnika + Elektrisk + Elektrik + Ηλεκτρικά + Electric + Eléctrica + Sähkö + Electrique + Električno + Elektromos + Elettrica + 電気 + 전기 + Цахилгаан + Elektrisk + Elektrotechniek + Elektrisch + Elektrotechnika + Elétrico + Elétrica + Electric + Электротехника + Elektrické + Elektrika + Електрика + El + Elektrik + Електрика + 10_电气 + 电气工程 + + + + متعدد الأقطاب + Multifilar + Vícežilový + Flere ledere + Allpolig + Πολυγραμμικό + All-pole + Multifilar + Yleisnapa + Multifilaire + Univerzalni + Többvonalas szimbólumok + Multifilare + 複線 + 다-극 + Бүх туйл + Alle poler + Veel polig + All-pole + Schematy wieloliniowe + Multipolar + Multifilar + Bipolar + Многополюсные + Všepólové + Vsi poli + Свe-полни + Allpolig + Çok kutuplu + Багатополюсні + 10_全极 + + + + إلكترونيات وأشباه موصلات + Electrònica i semiconductors + Elektronika a polovodiče + Elektronik og halvledere + Elektronik und Halbleiter + Ηλεκτρονικά και ημιαγωγοί + Electronics and semiconductors + Electrónica y semiconductores + Elektroniikka ja puolijohteet + Electronique et semi-conducteurs + Elektronika i poluvodiči + Elektronika és félvezetők + Elettronica e semiconduttori + 電子と半導体 + 전자 공학 및 반도체 + Электроник ба хагас дамжуулагч + Elektronikk og halvledere + Electronica en halfgeleiders + Elektronica en halfgeleiders + Elektronika i półprzewodniki + Eletrónica e semicondutores + Eletrônica e semi-condutoues + Electronică și semiconductoare + Электроника и полупроводники + Elektronika a polovodiče + Elektronika in polprevodniki + Електроника и полупроводници + Elektronik och halvledare + Elektronik ve yarı iletkenler + Електроніка та напівпровідники + 电子与半导体 + + + + مُقاومة + Resistències + Odpory + Modstande + Widerstände + Αντιστάσεις + Resistors + Resistencias + Vastukset + Résistances + Otpornici + Ellenállások + Resistori + 抵抗器 + 저항 + Эсэргүүцэл + Motstander + Weerstand + Weerstanden + Rezystory + Resistência + Resistores + Rezistoare + Резисторы + Rezistory + Upori + Отпорници + Motstånd + Dirençler + Резистори + 电阻器 + + + + + + مُقاومة + Resistència + Odpor + Modstand + Widerstand + Αντίσταση + Resistor + Resistencia + Vastus + Résistance + Otpornik + Ellenállás + Resistore + 抵抗器 + 저항 + Резистор + Motstand + Weerstand + Weerstand + Rezystor + Resistência + Resistor + Rezistor + Резистор + Rezistor + Upor + Отпорник + Resistor + Direnç + Резистор + 电阻 + + EN 60617: 04-01-01 + + + + + + label + + + + + + + + + + + + + diff --git a/tests/qttest/tst_conductorrouter.cpp b/tests/qttest/tst_conductorrouter.cpp new file mode 100644 index 000000000..6807d4149 --- /dev/null +++ b/tests/qttest/tst_conductorrouter.cpp @@ -0,0 +1,212 @@ +/* + Copyright 2006-2026 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 . +*/ +// SPDX-License-Identifier: GPL-2.0-or-later +#include "conductorrouter.h" + +#include + +/** + The geometry of ConductorRouter on its own: that a route is made of + horizontal and vertical segments, leaves and enters each terminal in + the terminal's direction, and goes around obstacles rather than + through them. +*/ +class TestConductorRouter : public QObject +{ + Q_OBJECT + + using Direction = ConductorRouter::Direction; + + static bool crosses(const QList &points, const QRectF &r) + { + for (int i = 0; i + 1 < points.size(); ++i) { + const QPointF a = points.at(i), b = points.at(i + 1); + const QRectF seg = QRectF(a, b).normalized(); + const qreal left = qMax(seg.left(), r.left()), right = qMin(seg.right(), r.right()); + const qreal top = qMax(seg.top(), r.top()), bottom = qMin(seg.bottom(), r.bottom()); + // a segment is a degenerate rectangle: it crosses the + // interior when it overlaps it on one axis and lies + // strictly inside it on the other + if (seg.width() == 0 && seg.left() > r.left() && seg.left() < r.right() && bottom > top) + return true; + if (seg.height() == 0 && seg.top() > r.top() && seg.top() < r.bottom() && right > left) + return true; + } + return false; + } + + static void checkShape(const QList &p, const ConductorRouter::Request &r) + { + QVERIFY(p.size() >= 3); + QCOMPARE(p.first(), r.start); + QCOMPARE(p.last(), r.end); + for (int i = 0; i + 1 < p.size(); ++i) + QVERIFY2(p.at(i).x() == p.at(i + 1).x() || p.at(i).y() == p.at(i + 1).y(), + "a segment is neither horizontal nor vertical"); + } + + static QPointF unit(Direction d) + { + switch (d) { + case Direction::North: return {0, -1}; + case Direction::East: return {1, 0}; + case Direction::South: return {0, 1}; + case Direction::West: return {-1, 0}; + } + return {}; + } + + static QPointF direction(QPointF from, QPointF to) + { + const QPointF d = to - from; + return {d.x() > 0 ? 1. : d.x() < 0 ? -1. : 0., d.y() > 0 ? 1. : d.y() < 0 ? -1. : 0.}; + } + +private slots: + void straightWhenNothingIsInTheWay() + { + ConductorRouter::Request r; + r.start = {100, 100}; + r.start_direction = Direction::East; + r.end = {300, 100}; + r.end_direction = Direction::West; + const auto result = ConductorRouter::route(r); + checkShape(result.points, r); + // no bend at all: start, the two exit points, end + for (const QPointF &p : result.points) QCOMPARE(p.y(), 100.); + } + + void goesAroundASymbol() + { + ConductorRouter::Request r; + r.start = {100, 100}; + r.start_direction = Direction::East; + r.end = {300, 100}; + r.end_direction = Direction::West; + const QRectF symbol(170, 60, 60, 80); + r.obstacles << symbol; + const auto result = ConductorRouter::route(r); + QVERIFY2(result.error.isEmpty(), qPrintable(result.error)); + checkShape(result.points, r); + QVERIFY(!crosses(result.points, symbol.adjusted(-r.margin, -r.margin, r.margin, r.margin))); + } + + // The test that the check above can fail: a straight line through + // the symbol is reported as crossing it. + void crossingCheckCanFail() + { + QVERIFY(crosses({{100, 100}, {300, 100}}, QRectF(170, 60, 60, 80))); + } + + void leavesAndEntersInTheTerminalsDirections_data() + { + QTest::addColumn("from"); + QTest::addColumn("to"); + for (int a = 0; a < 4; ++a) + for (int b = 0; b < 4; ++b) + QTest::addRow("%d-%d", a, b) << a << b; + } + + void leavesAndEntersInTheTerminalsDirections() + { + QFETCH(int, from); + QFETCH(int, to); + ConductorRouter::Request r; + r.start = {100, 100}; + r.start_direction = Direction(from); + r.end = {250, 180}; + r.end_direction = Direction(to); + // each terminal's own symbol, on the side opposite the way + // the terminal points + const QPointF s = unit(r.start_direction), e = unit(r.end_direction); + const QRectF own_start(r.start - s * 40 - QPointF(20, 20), QSizeF(40, 40)); + const QRectF own_end(r.end - e * 40 - QPointF(20, 20), QSizeF(40, 40)); + r.obstacles << own_start << own_end; + const auto result = ConductorRouter::route(r); + QVERIFY2(result.error.isEmpty(), qPrintable(result.error)); + checkShape(result.points, r); + const auto &p = result.points; + QCOMPARE(direction(p.at(0), p.at(1)), s); + QCOMPARE(direction(p.at(p.size() - 1), p.at(p.size() - 2)), e); + QVERIFY(!crosses(p, own_start)); + QVERIFY(!crosses(p, own_end)); + } + + void prefersNotToRunAlongAnotherWire() + { + ConductorRouter::Request r; + r.start = {100, 100}; + r.start_direction = Direction::East; + r.end = {300, 100}; + r.end_direction = Direction::West; + // a wire lying exactly on the straight route + r.wires << QVector{{110, 100}, {290, 100}}; + const auto result = ConductorRouter::route(r); + checkShape(result.points, r); + bool on_it = false; + for (int i = 1; i + 2 < result.points.size(); ++i) + if (result.points.at(i).y() == 100 && result.points.at(i + 1).y() == 100) + on_it = true; + QVERIFY(!on_it); + } + + void staysOnTheFolio() + { + ConductorRouter::Request r; + r.start = {100, 30}; + r.start_direction = Direction::East; + r.end = {300, 30}; + r.end_direction = Direction::West; + r.obstacles << QRectF(170, 0, 60, 200); + r.bounds = QRectF(0, 0, 500, 400); + const auto result = ConductorRouter::route(r); + QVERIFY2(result.error.isEmpty(), qPrintable(result.error)); + for (const QPointF &p : result.points) QVERIFY(r.bounds.contains(p)); + } + + void reportsWhenThereIsNoWay() + { + ConductorRouter::Request r; + r.start = {100, 100}; + r.start_direction = Direction::East; + r.end = {300, 100}; + r.end_direction = Direction::West; + // a wall from the top of the folio to the bottom + r.obstacles << QRectF(170, -10, 60, 520); + r.bounds = QRectF(0, 0, 500, 500); + const auto result = ConductorRouter::route(r); + QVERIFY(result.points.isEmpty()); + QVERIFY(!result.error.isEmpty()); + } + + void terminalsOffTheGrid() + { + ConductorRouter::Request r; + r.start = {103, 97}; + r.start_direction = Direction::South; + r.end = {287, 213}; + r.end_direction = Direction::North; + r.obstacles << QRectF(120, 140, 200, 30); + const auto result = ConductorRouter::route(r); + QVERIFY2(result.error.isEmpty(), qPrintable(result.error)); + checkShape(result.points, r); + } +}; + +QTEST_MAIN(TestConductorRouter) +#include "tst_conductorrouter.moc" diff --git a/tests/qttest/tst_diagramcontext.cpp b/tests/qttest/tst_diagramcontext.cpp index f0e004b0d..640dee9e7 100644 --- a/tests/qttest/tst_diagramcontext.cpp +++ b/tests/qttest/tst_diagramcontext.cpp @@ -65,6 +65,24 @@ private slots: QCOMPARE(fromDom(xml(value)), expected); QCOMPARE(fromPugi(xml(value)), expected); } + + // remove() forgets the key entirely: a context with a key added + // then removed equals one that never had it. remove() used to keep + // the key's show flag, so the two never compared equal, and + // Project properties > OK saw a change where there was none. + void removeForgetsTheKey() + { + DiagramContext edited; + edited.addValue(QStringLiteral("author"), QStringLiteral("N.V.")); + edited.addValue(QStringLiteral("01-numprojet"), QString()); + edited.remove(QStringLiteral("01-numprojet")); + + DiagramContext stored; + stored.addValue(QStringLiteral("author"), QStringLiteral("N.V.")); + + QCOMPARE(edited.keys(), stored.keys()); + QVERIFY(edited == stored); + } }; QTEST_APPLESS_MAIN(tst_diagramcontext) diff --git a/tests/qttest/tst_elementviewgrid.cpp b/tests/qttest/tst_elementviewgrid.cpp new file mode 100644 index 000000000..bf3c48e3b --- /dev/null +++ b/tests/qttest/tst_elementviewgrid.cpp @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include + +#include "editor/elementviewgrid.h" + +// The symbol editor's snap step at each zoom (bugtracker #112): below +// 100 % the grid is hidden but parts must still snap every 10 units. +class tst_elementviewgrid : public QObject +{ + Q_OBJECT + +private slots: + void stepAtZoom_data() + { + QTest::addColumn("zoom"); + QTest::addColumn("step"); + QTest::addColumn("drawGrid"); + QTest::addColumn("drawCross"); + + QTest::newRow("10 % (fit to a big symbol)") << 0.10 << 10 << false << false; + QTest::newRow("62.5 %, the #112 case") << 0.625 << 10 << false << false; + QTest::newRow("100 %") << 1.0 << 10 << true << false; + QTest::newRow("200 %") << 2.0 << 10 << true << false; + QTest::newRow("400 %") << 4.0 << 5 << true << true; + QTest::newRow("800 %") << 8.0 << 2 << true << true; + QTest::newRow("1000 %") << 10.0 << 1 << true << true; + + // Just below each threshold: the comparisons are strict (<), so a + // change to <= would move these rows into the next band. + QTest::newRow("99.9 %") << 0.999 << 10 << false << false; + QTest::newRow("399.9 %") << 3.999 << 10 << true << false; + QTest::newRow("401 %") << 4.01 << 5 << true << true; + QTest::newRow("799.9 %") << 7.999 << 5 << true << true; + QTest::newRow("999.9 %") << 9.999 << 2 << true << true; + } + + void stepAtZoom() + { + QFETCH(qreal, zoom); + QFETCH(int, step); + QFETCH(bool, drawGrid); + QFETCH(bool, drawCross); + + const ElementViewGrid grid = ElementViewGrid::forZoom(zoom); + QCOMPARE(grid.step, step); + QCOMPARE(grid.draw_grid, drawGrid); + QCOMPARE(grid.draw_cross, drawCross); + } +}; + +QTEST_APPLESS_MAIN(tst_elementviewgrid) + +#include "tst_elementviewgrid.moc" diff --git a/tests/qttest/tst_importcategory.cpp b/tests/qttest/tst_importcategory.cpp new file mode 100644 index 000000000..6ea53d641 --- /dev/null +++ b/tests/qttest/tst_importcategory.cpp @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include + +#include +#include +#include +#include +#include +#include +#include + +// Placing the same symbol twice in lmdg.qet: its embedded collection has a +// "k_elem" category before "import". Imported symbols were filed under the +// first category while every lookup is under "import/", so the second +// placement could not find the first copy, tried to import it again, and +// failed -- in a script (qet.addElement() returned "") and in the editor, +// where the drop silently placed nothing. +class tst_importcategory : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + + // Run @p script on @p project in a sandbox of its own and return the + // JSON object it logged. + QJsonObject run(const QString &script, const QString &project) + { + const QString path = m_dir.filePath(QStringLiteral("probe.js")); + const QString home = m_dir.filePath(QStringLiteral("home")); + QDir().mkpath(home + QStringLiteral("/config/QElectroTech")); + //The shipped collection, so common:// paths resolve; forward + //slashes, as Qt reads a backslash here as an escape. + QFile conf(home + QStringLiteral("/config/QElectroTech/QElectroTech.conf")); + if (!conf.open(QIODevice::WriteOnly)) return {}; + conf.write("[elements-collections]\ncommon-collection-path=" + QET_ELEMENTS_DIR "\n"); + conf.close(); + QFile f(path); + if (!f.open(QIODevice::WriteOnly)) return {}; + f.write(script.toUtf8()); + f.close(); + + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + env.insert(QStringLiteral("QET_ENABLE_SCRIPTING"), QStringLiteral("1")); + env.insert(QStringLiteral("HOME"), home); + env.insert(QStringLiteral("XDG_CONFIG_HOME"), home + QStringLiteral("/config")); + env.insert(QStringLiteral("XDG_DATA_HOME"), home + QStringLiteral("/data")); + env.insert(QStringLiteral("TMPDIR"), m_dir.path()); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), + {QStringLiteral("--run"), path, project}); + if (!proc.waitForFinished(120000)) return {}; + const QString out = QString::fromUtf8(proc.readAllStandardOutput() + + proc.readAllStandardError()); + const QString mark = QStringLiteral("PROBE "); + for (const QString &line : out.split(QLatin1Char('\n'))) { + const int i = line.indexOf(mark); + if (i >= 0) + return QJsonDocument::fromJson(line.mid(i + mark.size()).toUtf8()).object(); + } + return {}; + } + +private slots: + void initTestCase() + { + QVERIFY(m_dir.isValid()); + QVERIFY(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH))); + } + + void sameSymbolTwiceInLmdg() + { + const QString project = m_dir.filePath(QStringLiteral("lmdg.qet")); + QVERIFY(QFile::copy(QStringLiteral(QET_EXAMPLES_DIR "/lmdg.qet"), project)); + + const QJsonObject r = run(QStringLiteral( + "var p = 'common://10_electric/10_allpole/310_relays_contactors_contacts/" + "01_coils/bobine_ka_a_remanence.elmt';\n" + "var a = qet.addElement(0, p, 100, 100);\n" + "var b = qet.addElement(0, p, 300, 100);\n" + "qet.log('PROBE ' + JSON.stringify({first: a, second: b}));\n"), + project); + QVERIFY2(!r.isEmpty(), "the script logged nothing"); + QVERIFY2(!r.value(QStringLiteral("first")).toString().isEmpty(), + "the first placement failed"); + QVERIFY2(!r.value(QStringLiteral("second")).toString().isEmpty(), + "the second placement of the same symbol failed"); + } +}; + +QTEST_GUILESS_MAIN(tst_importcategory) + +#include "tst_importcategory.moc" diff --git a/tests/qttest/tst_potentialtextcarrier.cpp b/tests/qttest/tst_potentialtextcarrier.cpp new file mode 100644 index 000000000..97d8c28d2 --- /dev/null +++ b/tests/qttest/tst_potentialtextcarrier.cpp @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include + +#include +#include +#include +#include +#include +#include + +// With "one text per potential" on, the potential's number is drawn on its +// longest conductor. fixtures/one_text_per_potential_tie.qet has two +// conductors of the same, greatest length in one potential: which of them +// carried the number used to follow pointer order, so the same file +// exported twice could put it on either. Runs the real binary, in separate +// processes, since that order only changes from one run to the next. +class tst_potentialtextcarrier : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + + // Export the fixture to SVG and return where the number is drawn: the + // transform of the group holding it. Empty if it is not drawn exactly + // once. + QString carrier(int run) + { + const QString home = m_dir.filePath(QStringLiteral("home%1").arg(run)); + const QString out = m_dir.filePath(QStringLiteral("svg%1").arg(run)); + QDir().mkpath(home); + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + env.insert(QStringLiteral("HOME"), home); + env.insert(QStringLiteral("XDG_CONFIG_HOME"), home + QStringLiteral("/config")); + env.insert(QStringLiteral("XDG_DATA_HOME"), home + QStringLiteral("/data")); + env.insert(QStringLiteral("TMPDIR"), home); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), + {QStringLiteral("--export-svg"), + QFINDTESTDATA("fixtures/one_text_per_potential_tie.qet"), out}); + if (!proc.waitForFinished(60000) || proc.exitCode() != 0) + return {}; + + const QStringList svgs = QDir(out).entryList({QStringLiteral("*.svg")}); + if (svgs.size() != 1) + return {}; + QFile f(QDir(out).filePath(svgs.first())); + if (!f.open(QIODevice::ReadOnly)) + return {}; + const QString svg = QString::fromUtf8(f.readAll()); + + static const QRegularExpression re( + QStringLiteral("transform=\"([^\"]*)\"[^<]*>\\s*]*>42")); + QStringList found; + auto it = re.globalMatch(svg); + while (it.hasNext()) + found << it.next().captured(1); + return found.size() == 1 ? found.first() : QString(); + } + +private slots: + void initTestCase() + { + QVERIFY(m_dir.isValid()); + QVERIFY(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH))); + } + + // Before the fix about half the runs differed from the first, so + // eight agreeing runs leave a 1 in 128 chance of a false pass. + void sameCarrierEveryRun() + { + const QString first = carrier(0); + QVERIFY2(!first.isEmpty(), "the number is not drawn exactly once"); + for (int run = 1; run < 8; ++run) + QCOMPARE(carrier(run), first); + } +}; + +QTEST_GUILESS_MAIN(tst_potentialtextcarrier) +#include "tst_potentialtextcarrier.moc" diff --git a/tests/qttest/tst_unreadableelement.cpp b/tests/qttest/tst_unreadableelement.cpp new file mode 100644 index 000000000..906b8da58 --- /dev/null +++ b/tests/qttest/tst_unreadableelement.cpp @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include + +#include +#include +#include +#include +#include + +// qet.addElement() compares the uuid of the symbol it is given with the copy +// already embedded under the same name. A symbol file that exists but cannot +// be read has no uuid, and was reported as "would collide with a different +// element" (#1178 follow-up: on Windows, any symbol whose full path reaches +// 260 characters). Made unreadable here with the file's permissions, which +// gives the same null uuid on Linux. +class tst_unreadableelement : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + QString m_collection; + QString m_symbol; + + // Runs a script placing common://custom/my_siren.elmt into project and + // saving it to output; returns everything the run printed. + QString placeTheSymbol(const QString &project, const QString &output) + { + const QString root = m_dir.path(); + const QString home = root + QStringLiteral("/home"); + const QString settings = root + QStringLiteral("/settings"); + QDir().mkpath(settings + QStringLiteral("/QElectroTech")); + QDir().mkpath(root + QStringLiteral("/tmp")); + QFile ini(settings + QStringLiteral("/QElectroTech/QElectroTech.ini")); + if (!ini.open(QIODevice::WriteOnly | QIODevice::Text)) + return QString(); + ini.write("[elements-collections]\ncommon-collection-path="); + ini.write(m_collection.toUtf8()); + ini.write("\n"); + ini.close(); + + const QString script = root + QStringLiteral("/add.js"); + QFile js(script); + if (!js.open(QIODevice::WriteOnly)) + return QString(); + js.write("var u = qet.addElement(0, 'common://custom/my_siren.elmt', 100, 100);\n" + "qet.log('RESULT ' + (u ? 'placed' : 'refused'));\n" + "if (u) qet.save('"); + js.write(output.toUtf8()); + js.write("');\n"); + js.close(); + + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + env.insert(QStringLiteral("QET_ENABLE_SCRIPTING"), QStringLiteral("1")); + env.insert(QStringLiteral("HOME"), home); + env.insert(QStringLiteral("XDG_CONFIG_HOME"), home + QStringLiteral("/.config")); + env.insert(QStringLiteral("XDG_DATA_HOME"), home + QStringLiteral("/.local/share")); + env.insert(QStringLiteral("TMPDIR"), root + QStringLiteral("/tmp")); + env.insert(QStringLiteral("QET_SETTINGS_DIR"), settings); + + QProcess proc; + proc.setProcessEnvironment(env); + proc.setProcessChannelMode(QProcess::MergedChannels); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), {QStringLiteral("--run"), script, project}); + if (!proc.waitForFinished(60000)) + return QString(); + return QString::fromUtf8(proc.readAll()); + } + +private slots: + void initTestCase() + { + QVERIFY(m_dir.isValid()); + QVERIFY(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH))); + m_collection = m_dir.filePath(QStringLiteral("collection")); + m_symbol = m_collection + QStringLiteral("/custom/my_siren.elmt"); + QVERIFY(QDir().mkpath(m_collection + QStringLiteral("/custom"))); + QVERIFY(QFile::copy(QStringLiteral(QET_ELEMENTS_DIR "/10_electric/10_allpole/380_signaling_operating/12_acoustic_signaling/sirene.elmt"), + m_symbol)); + QVERIFY(QFile::copy(QFINDTESTDATA("fixtures/qet_bug_repro_resaved.qet"), + m_dir.filePath(QStringLiteral("p.qet")))); + } + + void anUnreadableSymbolIsNotACollision() + { + // Placed once while readable: the project now embeds it. + const QString embedded = m_dir.filePath(QStringLiteral("embedded.qet")); + QVERIFY(placeTheSymbol(m_dir.filePath(QStringLiteral("p.qet")), embedded) + .contains(QStringLiteral("RESULT placed"))); + QVERIFY(QFile::exists(embedded)); + + QVERIFY(QFile::setPermissions(m_symbol, QFileDevice::Permissions())); + QFile probe(m_symbol); + if (probe.open(QIODevice::ReadOnly)) + QSKIP("permissions do not stop this user reading the file (root?)"); + + const QString out = placeTheSymbol(embedded, m_dir.filePath(QStringLiteral("again.qet"))); + QFile::setPermissions(m_symbol, QFileDevice::ReadOwner | QFileDevice::WriteOwner); + QVERIFY2(out.contains(QStringLiteral("RESULT refused")), qPrintable(out)); + QVERIFY2(out.contains(QStringLiteral("could not read element")), qPrintable(out)); + QVERIFY2(!out.contains(QStringLiteral("would collide")), qPrintable(out)); + } + + // Readable again, the same symbol is placed a second time as before. + void theSameSymbolIsPlacedAgain() + { + const QString out = placeTheSymbol(m_dir.filePath(QStringLiteral("embedded.qet")), + m_dir.filePath(QStringLiteral("twice.qet"))); + QVERIFY2(out.contains(QStringLiteral("RESULT placed")), qPrintable(out)); + } +}; + +QTEST_APPLESS_MAIN(tst_unreadableelement) + +#include "tst_unreadableelement.moc"