From b336ebaeb4a0e4be4504c26d0a3d84c80579b908 Mon Sep 17 00:00:00 2001 From: Andre Riesco Date: Fri, 8 Nov 2024 11:20:49 -0300 Subject: [PATCH] python3Pyside2QML: Deprecating it for Torizon OS 7 Deprecating this template, as it will be replaced by a PySide6 (Qt6) template in the future. Signed-off-by: Andre Riesco --- DEPRECATED.md | 3 + README.md | 3 +- python3Pyside2QML/.conf/deps.json | 12 - python3Pyside2QML/.conf/id_rsa | 27 -- python3Pyside2QML/.conf/id_rsa.pub | 1 - python3Pyside2QML/.conf/update.json | 14 - python3Pyside2QML/.doc/README.md | 36 -- python3Pyside2QML/.dockerignore | 9 - python3Pyside2QML/.gitignore | 166 -------- python3Pyside2QML/.vscode/extensions.json | 7 - python3Pyside2QML/.vscode/launch.json | 63 --- python3Pyside2QML/.vscode/settings.json | 23 -- python3Pyside2QML/.vscode/tasks.json | 388 ------------------ python3Pyside2QML/Dockerfile | 101 ----- python3Pyside2QML/Dockerfile.debug | 149 ------- python3Pyside2QML/docker-compose.yml | 80 ---- python3Pyside2QML/requirements-debug.txt | 1 - python3Pyside2QML/requirements-local.txt | 3 - python3Pyside2QML/requirements-release.txt | 0 python3Pyside2QML/src/Scene.ui.qml | 29 -- python3Pyside2QML/src/assets/torizon-logo.png | Bin 28344 -> 0 bytes python3Pyside2QML/src/main.py | 20 - python3Pyside2QML/src/mainwindow.qml | 35 -- 23 files changed, 4 insertions(+), 1166 deletions(-) delete mode 100644 python3Pyside2QML/.conf/deps.json delete mode 100644 python3Pyside2QML/.conf/id_rsa delete mode 100644 python3Pyside2QML/.conf/id_rsa.pub delete mode 100644 python3Pyside2QML/.conf/update.json delete mode 100644 python3Pyside2QML/.doc/README.md delete mode 100644 python3Pyside2QML/.dockerignore delete mode 100644 python3Pyside2QML/.gitignore delete mode 100644 python3Pyside2QML/.vscode/extensions.json delete mode 100644 python3Pyside2QML/.vscode/launch.json delete mode 100644 python3Pyside2QML/.vscode/settings.json delete mode 100644 python3Pyside2QML/.vscode/tasks.json delete mode 100644 python3Pyside2QML/Dockerfile delete mode 100644 python3Pyside2QML/Dockerfile.debug delete mode 100644 python3Pyside2QML/docker-compose.yml delete mode 100644 python3Pyside2QML/requirements-debug.txt delete mode 100644 python3Pyside2QML/requirements-local.txt delete mode 100644 python3Pyside2QML/requirements-release.txt delete mode 100644 python3Pyside2QML/src/Scene.ui.qml delete mode 100644 python3Pyside2QML/src/assets/torizon-logo.png delete mode 100755 python3Pyside2QML/src/main.py delete mode 100644 python3Pyside2QML/src/mainwindow.qml diff --git a/DEPRECATED.md b/DEPRECATED.md index 5ab99555d..627b5bc4a 100644 --- a/DEPRECATED.md +++ b/DEPRECATED.md @@ -11,9 +11,12 @@ | ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/monowinforms.png?raw=true) | Mono 4.7 C# Windows Forms Application | .NET 4.7 | C# | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [monoCsharpForms](./monoCsharpForms) | ![](https://avatars.githubusercontent.com/u/2633321?v=4&s=64) [@microhobby](https://www.github.com/microhobby) | | ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/gambasform.png?raw=true) | Gambas3 Form Project | Gambas3 | Visual Basic | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [gambasForms](./gambasForms) | ![](https://avatars.githubusercontent.com/u/2633321?v=4&s=64) [@microhobby](https://www.github.com/microhobby) | | ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/rust-console.png?raw=true) | Rust Console Application | libc | Rust | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [rustConsole](./rustConsole) | ![](https://avatars.githubusercontent.com/u/19845403?v=4&s=64) [@skkywalker](https://www.github.com/skkywalker) | +| ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/python3console.png?raw=true) | Python 3 Pyside 2(Qt5) QML | Pyside 2 | Python 3 | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [python3Pyside2QML](./python3Pyside2QML) | ![](https://github.com/toradex/vscode-torizon-templates-documentation/blob/main/thumbnails/none.png?raw=true) [@andreriesco](https://www.github.com/andreriesco) | This templates were deprecated due to the fact that their respective maintainer does not have the intention to keep maintaining them on Torizon OS 7. As they were Community Supported Templates, their maintenance is responsability of their respective maintainer. If you use any of this templates and have interest on becoming it's maintainer, please feel free to do so by [opening an issue here on the repository](https://github.com/torizon/vscode-torizon-templates/issues), contributions are welcome and we will help you out with this. +Python 3 Pyside 2(Qt5) QML template is an exception, since it will be replaced by a PySide6 (Qt6) template in the future. + ## Already deprecated on Torizon OS 6 | TEMPLATE | DESCRIPTION | RUNTIME | LANGUAGE | HW ARCH | FOLDER | CONTRIBUTOR | diff --git a/README.md b/README.md index 4782e257f..49eacb5e3 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,7 @@ We encourage you to also contribute templates. The community supported templates | -------- | ----------- | ------- | -------- | ------- | ------ | ----------- | | ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/avaloniafbdrm.png?raw=true) | .NET 8 C# Avalonia Frame Buffer DRM | .NET 8.0 | C# | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [dotnetAvaloniaFrameBuffer](./dotnetAvaloniaFrameBuffer) | ![](https://avatars.githubusercontent.com/u/2633321?v=4&s=64) [@microhobby](https://www.github.com/microhobby) | | ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/avaloniagtk.png?raw=true) | .NET 8 C# Avalonia GTK MVVM | .NET 8.0 | C# | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [dotnetAvalonia](./dotnetAvalonia) | ![](https://avatars.githubusercontent.com/u/2633321?v=4&s=64) [@microhobby](https://www.github.com/microhobby) | -| ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/python3console.png?raw=true) | Python 3 Pyside 2(Qt5) QML | Pyside 2 | Python 3 | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [python3Pyside2QML](./python3Pyside2QML) | ![](https://github.com/toradex/vscode-torizon-templates-documentation/blob/main/thumbnails/none.png?raw=true) [@andreriesco](https://www.github.com/andreriesco) | -| ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/cconsole.png?raw=true) | C Makefile Console Application | libc | C | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2)  | [cConsole](./cConsole) | ![](https://avatars.githubusercontent.com/u/19562097?v=4&s=64) [@hiagofranco](https://www.github.com/hiagofranco) | +| ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/cconsole.png?raw=true) | C Makefile Console Application | libc | C | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) ![](assets/img/riscv64.png?raw=true&id=2) ![](assets/img/x8664.png?raw=true&id=2) | [cConsole](./cConsole) | ![](https://avatars.githubusercontent.com/u/19562097?v=4&s=64) [@hiagofranco](https://www.github.com/hiagofranco) | | ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/zig-console.png?raw=true) | Zig Console Application | no-libc | Zig | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) | [zigConsole](./zigConsole) | ![](https://avatars.githubusercontent.com/u/6756180?v=4&s=64) [@kassane](https://www.github.com/kassane) | | ![](https://raw.githubusercontent.com/toradex/vscode-torizon-templates-documentation/refs/heads/main/thumbnails/nodejsts.png?raw=true) | Node.js TypeScript Application | Node.js | TypeScript | ![](assets/img/arm32.png?raw=true&id=2) ![](assets/img/arm64.png?raw=true&id=2) ![](assets/img/x8664.png?raw=true&id=2)| [nodeJSTypeScript](./nodeJSTypeScript) | ![](https://avatars.githubusercontent.com/u/142019321?v=4&s=64) [@torizon](https://www.github.com/torizon) | diff --git a/python3Pyside2QML/.conf/deps.json b/python3Pyside2QML/.conf/deps.json deleted file mode 100644 index 0c05d418a..000000000 --- a/python3Pyside2QML/.conf/deps.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "packages": [ - "openssh-client", - "sshpass", - "python3", - "python3-pip", - "python3-pylint-common", - "python3-pyside2.qtquick", - "python3-pyside2.qtwidgets", - "python3-venv" - ] -} diff --git a/python3Pyside2QML/.conf/id_rsa b/python3Pyside2QML/.conf/id_rsa deleted file mode 100644 index af98f44ff..000000000 --- a/python3Pyside2QML/.conf/id_rsa +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAqpUaOa6i/TaSKwpdsHzLfGK95dDcFYpmYH5hUj0cBhVEVdl8 -JAG0MEDcZsjQHiBlfUiHmyU2iOWBoKUytpMnzYF6ggdZBv5hBMv3RcTlnNijxzxg -KvbjTm3LqAY8uu4SF9I8oDXVOn7xwZYgiC7s3XRGOP6TowSVEHsLB+cehWs4Y5io -3BngOlcOYZtVrh+i3A7xSHWP7n2IetJEo5C425oaOCZXUJT2egau6ODmvBItZjpG -mNdwVwrEI2H3o+LLI9tieNfyFcUFPNDRXbku1V0mXU9VjZ7WFihZXob11XNCEkY7 -Bg3SpzTntSRn9hZD7i3xDU9MSJz90rnn56ID1wIDAQABAoIBACI239i7/3Mcc/rw -DFSu4z2irIYg+1PSu7AVCT4uhaVutJMnmS+7q8GV8N8o3h18z/5uAs0KjMKuje6D -1AUsxOoCU2krQh8V/K2yn3k+AfQQu+DlakCT3onHmfassZeo0rY2c/SKd6dQ+Pqk -Owg1qUrN3Jvn7ALhk2iH1XGTWNrXj44AxVVhK3zADd/688stubo+mhj1vLJvk3IJ -j/cb9UtCnWDZ6U6E4C+5tfXqzrqbtlrWnIBe0qAwYI6+f4bSQxnNa42wNUh0v0mX -tiY9wnHEmE7nCQNQ8sBeBLEJm3xmFRhABNA+iAglsjfeBIbPNpy7rXty412CmHp0 -mLG0RskCgYEA4t4Ca3EDq/scg7fiplLjhk2AtsZumkYT/N+42x4VlioKfoaivLKf -6mjWUSr+c7Aq0Ssx9GdOFU0epNGbuvymCGBhq6v27SADMJTP2Dmg83FpcV6opOUM -SBz1tnrL9j74Eo9jGdnBjgxHOl4biO+uCjCZxcLoVjsfPpGnCeNSpFUCgYEAwHzM -GfiBR9wl+7cVrtP4YQgmzyZ6YCnqkfFasVAe6cN/0if5sqQRn3Fg3YFrP9GlKkkn -EMvow56nTWUmpx4KG4yanrocEYIsA4uv4kwyFOC/YD+67SQpgTEOjD0seDJoOgpz -ekkxNjMro8RJCK+DrV17qk3/dGY4b3u2M66P03sCgYEAhHCcswJX5WeD/vUzkGtl -PfsywADZgqCUfJRSg0Bt06sZU0Hf8Q7KQnsPWnUh9IGMjW2NDSPdtpu93vQq2J8z -gkJZ4nFShp2gnxTQvWbvKg80QiXDh/fbEqItY2kOduPNyHACp42y6+0JC+7yXh+l -13cF3ihpoCWFmO5IuIIHtb0CgYEAk5acwEUEi17HWOuWmog4591iNG8iYd2B2Akh -Ktdt/HtD5JV2JX0bbg924CA9ZZ+Pbo7Mf1p5zJQ3X2Zxbq3fviPe4ll88AfJS6at -Y2xc8hkpY9k5sF6L3F0K9IhrMnYj6GzfAiJgs1gk29rCzQAWjLUi/v/zIQLHvuMy -Xwo3iUUCgYEAo/27Qkb5nOdL8sJwFggDrdB1pPrxXN20KmYCJF1P9wPDhnj1fJ7+ -0Z/56XYzPA2rQx0vf5idvoGQ3KZS7QkOClLtcyevH3b38fnmAqv+dPLRHmrSd+3G -BspdMlr3rwZK8RKwXjDzLYpwSvjmf7PTGTPO3C7WTzg+m0U9RbSJKi4= ------END RSA PRIVATE KEY----- diff --git a/python3Pyside2QML/.conf/id_rsa.pub b/python3Pyside2QML/.conf/id_rsa.pub deleted file mode 100644 index 86f8fe63f..000000000 --- a/python3Pyside2QML/.conf/id_rsa.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqlRo5rqL9NpIrCl2wfMt8Yr3l0NwVimZgfmFSPRwGFURV2XwkAbQwQNxmyNAeIGV9SIebJTaI5YGgpTK2kyfNgXqCB1kG/mEEy/dFxOWc2KPHPGAq9uNObcuoBjy67hIX0jygNdU6fvHBliCILuzddEY4/pOjBJUQewsH5x6FazhjmKjcGeA6Vw5hm1WuH6LcDvFIdY/ufYh60kSjkLjbmho4JldQlPZ6Bq7o4Oa8Ei1mOkaY13BXCsQjYfej4ssj22J41/IVxQU80NFduS7VXSZdT1WNntYWKFlehvXVc0ISRjsGDdKnNOe1JGf2FkPuLfENT0xInP3SuefnogPX \ No newline at end of file diff --git a/python3Pyside2QML/.conf/update.json b/python3Pyside2QML/.conf/update.json deleted file mode 100644 index 2921d3da1..000000000 --- a/python3Pyside2QML/.conf/update.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "source": "requirements-local.txt", - "target": "requirements-local.txt" - }, - { - "source": "requirements-debug.txt", - "target": "requirements-debug.txt" - }, - { - "source": "requirements-release.txt", - "target": "requirements-release.txt" - } -] diff --git a/python3Pyside2QML/.doc/README.md b/python3Pyside2QML/.doc/README.md deleted file mode 100644 index b13de625f..000000000 --- a/python3Pyside2QML/.doc/README.md +++ /dev/null @@ -1,36 +0,0 @@ - - -# Python 3 Pyside 2(Qt 5) QML Template Specific Documentation - - -> ⚠️ **WARNING:** This is just the documentation part specific of this template. **For the complete and general Torizon IDE documentation, check the [developer website documentation](https://developer.toradex.com/torizon/application-development/ide-extension/)** ⚠️ - -> ⚠️ **WARNING:** Remember to maintain pip updated, with the command `python -m pip install --upgrade pip` - -All projects follow the pipeline of tasks described in the [common contributing documentation](https://github.com/toradex/vscode-torizon-templates/blob/bookworm/CONTRIBUTING.md#contributing-templates). However, each project has its own specificities in terms of technologies and methods used to compile, deploy, and debug the code. Therefore, each of them has their own specific tasks in the **tasks.json** file. - -As Python is an interpreted language, it does not have a compile step. - -The deployable package is then copied into the running debug container using **scp**, in the task named **deploy-torizon-\${architecture}**. This task contains the entire sequence of tasks executed by the pipeline and, therefore, is unique to each template. - -Remote debugging is performed by running **debugpy** inside the running container on the device, in a task named **start-torizon-debug\${architecture}**, and then attaching to this running container, as described at [VSCode Python remote debugging](https://code.visualstudio.com/docs/python/debugging#_remote-script-debugging-with-ssh). For local debugging, the method used is the one described in the [VSCode documentation for Python Debugging](https://code.visualstudio.com/docs/python/debugging) is used. The tasks that perform the debugging are those present in the **launch.json** file. - -The python packages of the project that should be installed using **pip** should be defined on: -- **requirements-local.txt** file for host/local debugging packages -- **requirements-debug.txt** file for remote debugging image package (installed on **Dockerfile.debug** file) -- **requirements-release.txt** file for production (release) image packages (installed on **Dockerfile** file) - -The source code of the template is a simple Hello World (Hello Torizon, actually) in Python. - -## Create and Modify the Python Virtual Environment - -> ⚠️ **WARNING:** When the template workspace opens in VSCode, a task called **create-venv** which creates a virtual environment at **.venv** is executed (also the **host-install-pip-requirements** is executed in sequence). However, if you can recreate and modify the Python virtual environment by following the steps described below. ⚠️ - -How to recreate and modify the Python virtual environment on this template: - - - Remove the **.venv** folder - - If you want to modify the command that creates the virtual env (for example to add the **--system-site-packages** argument or even create a **.conda** environment instead of **.venv**), you can do so by modifying the **create-venv** task at the **.vscode/tasks.json** file - - Click on the **create-venv** task on the **TASK RUNNER** tab - - If you made changes to the **.venv** path, update the **python.defaultInterpreterPath** configuration at **.vscode/settings.json** - - > If some problem occurs after updating the virtual env, try reloading the VSCode Windows (there is a **vscode-reload-window** task on the **TASK RUNNER** tab) to see if the problem persists diff --git a/python3Pyside2QML/.dockerignore b/python3Pyside2QML/.dockerignore deleted file mode 100644 index 482e7714d..000000000 --- a/python3Pyside2QML/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ -credentials.zip diff --git a/python3Pyside2QML/.gitignore b/python3Pyside2QML/.gitignore deleted file mode 100644 index 35709ebfb..000000000 --- a/python3Pyside2QML/.gitignore +++ /dev/null @@ -1,166 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - -credentials.zip -*.lock.yml - -.conf/.depok -.conf/.docok \ No newline at end of file diff --git a/python3Pyside2QML/.vscode/extensions.json b/python3Pyside2QML/.vscode/extensions.json deleted file mode 100644 index 81db5806c..000000000 --- a/python3Pyside2QML/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "recommendations": [ - "ms-python.python", - "seanwu.vscode-qt-for-python", - "derevin.qml-ls-client" - ] -} diff --git a/python3Pyside2QML/.vscode/launch.json b/python3Pyside2QML/.vscode/launch.json deleted file mode 100644 index 93a54d59f..000000000 --- a/python3Pyside2QML/.vscode/launch.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Python Local", - "type": "debugpy", - "request": "launch", - "program": "${workspaceFolder}/src/main.py", - "preLaunchTask": "host-install-pip-requirements" - }, - { - "name": "Torizon AMD64", - "type": "debugpy", - "request": "attach", - "justMyCode": false, - "connect": { - "host": "${config:torizon_ip}", - "port": "${config:torizon_debug_port}" - }, - "pathMappings": [ - { - "localRoot": "${workspaceFolder}", - "remoteRoot": "${config:torizon_app_root}" - } - ], - "preLaunchTask": "deploy-torizon-amd64" - }, - { - "name": "Torizon ARMv7", - "type": "debugpy", - "request": "attach", - "justMyCode": false, - "connect": { - "host": "${config:torizon_ip}", - "port": "${config:torizon_debug_port1}" - }, - "pathMappings": [ - { - "localRoot": "${workspaceFolder}", - "remoteRoot": "${config:torizon_app_root}" - } - ], - "preLaunchTask": "deploy-torizon-arm" - }, - { - "name": "Torizon ARMv8", - "type": "debugpy", - "request": "attach", - "justMyCode": false, - "connect": { - "host": "${config:torizon_ip}", - "port": "${config:torizon_debug_port1}" - }, - "pathMappings": [ - { - "localRoot": "${workspaceFolder}", - "remoteRoot": "${config:torizon_app_root}" - } - ], - "preLaunchTask": "deploy-torizon-arm64" - } - ] -} diff --git a/python3Pyside2QML/.vscode/settings.json b/python3Pyside2QML/.vscode/settings.json deleted file mode 100644 index 63c6cb872..000000000 --- a/python3Pyside2QML/.vscode/settings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "torizon_psswd": "", - "torizon_login": "", - "torizon_ip": "", - "torizon_ssh_port": "", - "host_ip": "", - "torizon_workspace": "${workspaceFolder}", - "torizon_debug_ssh_port": "6502", - "torizon_debug_port1": "6512", - "torizon_debug_port2": "", - "torizon_debug_port3": "", - "torizon_gpu": "", - "torizon_arch": "", - "wait_sync": "1", - "torizon_run_as": "torizon", - "torizon_app_root": "/home/torizon/app", - "docker_tag": "v0.0.0", - "tcb.packageName": "__change__", - "tcb.version": "3.11.0", - "torizon.gpuPrefixRC": true, - "qml-ls-client.qmllsPath": ".venv/lib/python3.11/site-packages/PySide6/qmlls", - "python.defaultInterpreterPath": "./.venv/bin/python3" -} diff --git a/python3Pyside2QML/.vscode/tasks.json b/python3Pyside2QML/.vscode/tasks.json deleted file mode 100644 index 7dfb70c2a..000000000 --- a/python3Pyside2QML/.vscode/tasks.json +++ /dev/null @@ -1,388 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "create-prepare-venv", - "detail": "", - "hide": true, - "command": "echo", - "type": "process", - "args": [ - "venv", - "ok" - ], - "problemMatcher": "$msCompile", - "dependsOrder": "sequence", - "dependsOn": [ - "create-venv", - "host-install-pip-requirements" - ], - "runOptions": { - "runOn": "folderOpen" - }, - "icon": { - "id": "vm-active", - "color": "terminal.ansiCyan" - }, - "presentation": { - "echo": true, - "reveal": "silent", - "focus": true, - "panel": "shared", - "group": "python-related" - } - }, - { - "label": "create-venv", - "detail": "Create Python virtual environment at .venv, if it doesn't already exist in the workspace", - "command": "/usr/bin/python3", - "type": "process", - "args": [ - "-m", - "venv", - ".venv" - ], - "problemMatcher": "$msCompile", - "icon": { - "id": "vm", - "color": "terminal.ansiCyan" - }, - "presentation": { - "echo": true, - "reveal": "silent", - "focus": true, - "panel": "shared", - "group": "python-related" - } - }, - { - "label": "rsync-torizon-generic", - "detail": "", - "hide": true, - "command": "rsync", - "type": "process", - "args": [ - "-P", - "-av", - "-e", - "ssh -p ${config:torizon_debug_ssh_port} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null", - "${workspaceFolder}/src", - "${config:torizon_run_as}@${config:torizon_ip}:${config:torizon_app_root}/" - ], - "dependsOrder": "sequence", - "icon": { - "id": "debug-alt", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "stop-torizon-debug-generic", - "detail": "", - "hide": true, - "command": "ssh", - "type": "process", - "args": [ - "-o", - "UserKnownHostsFile=/dev/null", - "-o", - "StrictHostKeyChecking=no", - "-p", - "${config:torizon_debug_ssh_port}", - "${config:torizon_run_as}@${config:torizon_ip}", - "pkill python3 || true" - ], - "dependsOrder": "sequence", - "problemMatcher": "$msCompile", - "icon": { - "id": "stop", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "deploy-torizon-arm", - "detail": "", - "hide": true, - "command": "ssh", - "type": "shell", - "args": [ - "-o", - "UserKnownHostsFile=/dev/null", - "-o", - "StrictHostKeyChecking=no", - "-p", - "${config:torizon_debug_ssh_port}", - "${config:torizon_run_as}@${config:torizon_ip}", - "cT=0; while ! grep -r \": wait_for_client()\" ${config:torizon_app_root}/src/log/debugpy.server*.log 2> /dev/null; do sleep 0.1; if [ \"$cT\" -eq 100 ]; then echo \"Problem debugging main.py file\"; break; fi; cT=$(expr $cT + 1); done" - ], - "dependsOn": [ - "validate-settings", - "validate-arch-arm", - "copy-docker-compose", - "pre-cleanup", - "build-container-torizon-debug-arm", - "push-container-torizon-debug-arm", - "pull-container-torizon-debug-arm", - "run-container-torizon-debug-arm", - "wait-a-bit", - "stop-torizon-debug-generic", - "rsync-torizon-generic", - "start-torizon-debug-arm" - ], - "dependsOrder": "sequence", - "icon": { - "id": "debug-alt", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "start-torizon-debug-arm", - "detail": "", - "hide": true, - "command": "ssh", - "type": "process", - "args": [ - "-o", - "UserKnownHostsFile=/dev/null", - "-o", - "StrictHostKeyChecking=no", - "-p", - "${config:torizon_debug_ssh_port}", - "${config:torizon_run_as}@${config:torizon_ip}", - "cd ${config:torizon_app_root} && . ${config:torizon_app_root}/.venv/bin/activate && screen -d -m python3 -m debugpy --listen 0.0.0.0:${config:torizon_debug_port1} --log-to src/log --wait-for-client src/main.py", - ], - "dependsOrder": "sequence", - "problemMatcher": "$msCompile", - "icon": { - "id": "debug-alt", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "deploy-torizon-arm64", - "detail": "", - "hide": true, - "command": "ssh", - "type": "shell", - "args": [ - "-o", - "UserKnownHostsFile=/dev/null", - "-o", - "StrictHostKeyChecking=no", - "-p", - "${config:torizon_debug_ssh_port}", - "${config:torizon_run_as}@${config:torizon_ip}", - "cT=0; while ! grep -r \": wait_for_client()\" ${config:torizon_app_root}/src/log/debugpy.server*.log 2> /dev/null; do sleep 0.1; if [ \"$cT\" -eq 100 ]; then echo \"Problem debugging main.py file\"; break; fi; cT=$(expr $cT + 1); done" - ], - "dependsOn": [ - "validate-settings", - "validate-arch-arm64", - "copy-docker-compose", - "pre-cleanup", - "build-container-torizon-debug-arm64", - "push-container-torizon-debug-arm64", - "pull-container-torizon-debug-arm64", - "run-container-torizon-debug-arm64", - "wait-a-bit", - "stop-torizon-debug-generic", - "rsync-torizon-generic", - "start-torizon-debug-arm64" - ], - "dependsOrder": "sequence", - "icon": { - "id": "debug-alt", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "start-torizon-debug-arm64", - "detail": "", - "hide": true, - "command": "ssh", - "type": "process", - "args": [ - "-o", - "UserKnownHostsFile=/dev/null", - "-o", - "StrictHostKeyChecking=no", - "-p", - "${config:torizon_debug_ssh_port}", - "${config:torizon_run_as}@${config:torizon_ip}", - "cd ${config:torizon_app_root} && . ${config:torizon_app_root}/.venv/bin/activate && screen -d -m python3 -m debugpy --listen 0.0.0.0:${config:torizon_debug_port1} --log-to src/log --wait-for-client src/main.py", - ], - "dependsOrder": "sequence", - "problemMatcher": "$msCompile", - "icon": { - "id": "debug-alt", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "start-torizon-debug-amd64", - "detail": "", - "hide": true, - "command": "ssh", - "type": "process", - "args": [ - "-o", - "UserKnownHostsFile=/dev/null", - "-o", - "StrictHostKeyChecking=no", - "-p", - "${config:torizon_debug_ssh_port}", - "${config:torizon_run_as}@${config:torizon_ip}", - "cd ${config:torizon_app_root} && . ${config:torizon_app_root}/.venv/bin/activate && screen -d -m python3 -m debugpy --listen 0.0.0.0:${config:torizon_debug_port} --log-to src/log --wait-for-client src/main.py", - ], - "dependsOrder": "sequence", - "problemMatcher": "$msCompile", - "icon": { - "id": "debug-alt", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "deploy-torizon-amd64", - "detail": "", - "hide": true, - "command": "ssh", - "type": "shell", - "args": [ - "-o", - "UserKnownHostsFile=/dev/null", - "-o", - "StrictHostKeyChecking=no", - "-p", - "${config:torizon_debug_ssh_port}", - "${config:torizon_run_as}@${config:torizon_ip}", - "cT=0; while ! grep -r \": wait_for_client()\" ${config:torizon_app_root}/src/log/debugpy.server*.log 2> /dev/null; do sleep 0.1; if [ \"$cT\" -eq 100 ]; then echo \"Problem debugging main.py file\"; break; fi; cT=$(expr $cT + 1); done" - ], - "dependsOn": [ - "validate-settings", - "validate-arch-amd64", - "host-install-pip-requirements", - "copy-docker-compose", - "pre-cleanup", - "build-container-torizon-debug-amd64", - "push-container-torizon-debug-amd64", - "pull-container-torizon-debug-amd64", - "run-container-torizon-debug-amd64", - "wait-a-bit", - "stop-torizon-debug-generic", - "rsync-torizon-generic", - "start-torizon-debug-amd64" - ], - "dependsOrder": "sequence", - "icon": { - "id": "debug-alt", - "color": "terminal.ansiYellow" - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "shared", - "group": "build-execution" - } - }, - { - "label": "host-install-pip-requirements", - "detail": "Install pip requirements on the host", - "command": "${config:python.defaultInterpreterPath}", - "type": "process", - "args": [ - "-m", - "pip", - "install", - "-r", - "requirements-local.txt" - ], - "dependsOrder": "sequence", - "problemMatcher": "$msCompile", - "icon": { - "id": "layers", - "color": "terminal.ansiCyan" - }, - "presentation": { - "echo": true, - "reveal": "silent", - "focus": true, - "panel": "shared", - "group": "python-related" - } - }, - { - "label": "host-upgrade-pip", - "detail": "Upgrade pip in the host", - "command": "${config:python.defaultInterpreterPath}", - "type": "process", - "args": [ - "-m", - "pip", - "install", - "--upgrade", - "pip" - ], - "dependsOrder": "sequence", - "icon": { - "id": "layers", - "color": "terminal.ansiCyan" - }, - "presentation": { - "echo": true, - "reveal": "silent", - "focus": true, - "panel": "shared", - "group": "python-related" - } - }, - ], - "inputs": [] -} diff --git a/python3Pyside2QML/Dockerfile b/python3Pyside2QML/Dockerfile deleted file mode 100644 index 84f92cbc8..000000000 --- a/python3Pyside2QML/Dockerfile +++ /dev/null @@ -1,101 +0,0 @@ -# ARGUMENTS -------------------------------------------------------------------- -## -# Board architecture -## -ARG IMAGE_ARCH= - -## -# Base container version -## -ARG BASE_VERSION=4.0.0 - -## -# Directory of the application inside container -## -ARG APP_ROOT= - -## -# Board GPU vendor prefix -## -ARG GPU= - - -FROM --platform=linux/${IMAGE_ARCH} \ - torizon/qt5-wayland${GPU}:${BASE_VERSION} AS deploy - -ARG IMAGE_ARCH -ARG GPU -ARG APP_ROOT - -# for vivante GPU we need some "special" sauce -RUN apt-get -q -y update && \ - if [ "${GPU}" = "-vivante" ] || [ "${GPU}" = "-imx8" ]; then \ - apt-get -q -y install \ - imx-gpu-viv-wayland-dev \ - ; else \ - apt-get -q -y install \ - libgl1 \ - ; fi \ - && \ - apt-get clean && apt-get autoremove && \ - rm -rf /var/lib/apt/lists/* - -# your regular RUN statements here -# Install required packages -RUN apt-get -q -y update && \ - apt-get -q -y install \ - python3-minimal \ - python3-pip \ - python3-venv \ - qml-module-qtquick-controls \ - qml-module-qtquick-controls2 \ - qml-module-qtquick2 \ - python3-pyside2.qtwidgets \ - python3-pyside2.qtgui \ - python3-pyside2.qtqml \ - python3-pyside2.qtcore \ - python3-pyside2.qtquick \ - python3-pyside2.qtnetwork \ - qml-module-qtquick-dialogs \ - qtwayland5 \ -# DOES NOT REMOVE THIS LABEL: this is used for VS Code automation - # __torizon_packages_prod_start__ - # __torizon_packages_prod_end__ -# DO NOT REMOVE THIS LABEL: this is used for VS Code automation - && apt-get clean && apt-get autoremove && \ - rm -rf /var/lib/apt/lists/* - -# edge case for amd64 -# this prevent the error: texture atlas allocation failed -RUN apt-get -q -y update && \ - if [ "${IMAGE_ARCH}" = "amd64" ]; then \ - apt-get -q -y install \ - libqt5quick5 \ - ; fi \ - && \ - apt-get clean && apt-get autoremove && \ - rm -rf /var/lib/apt/lists/* - -# Create virtualenv -RUN python3 -m venv ${APP_ROOT}/.venv --system-site-packages - -# Install pip packages on venv -COPY requirements-release.txt /requirements-release.txt -RUN . ${APP_ROOT}/.venv/bin/activate && \ - pip3 install --upgrade pip && pip3 install -r requirements-release.txt && \ - rm requirements-release.txt - -USER torizon - -# Copy the application source code in the workspace to the $APP_ROOT directory -# path inside the container, where $APP_ROOT is the torizon_app_root -# configuration defined in settings.json -COPY ./src ${APP_ROOT}/src - -WORKDIR ${APP_ROOT} - -ENV APP_ROOT=${APP_ROOT} -ENV QT_QPA_PLATFORM="wayland" - -# Activate and run the code -CMD . ${APP_ROOT}/.venv/bin/activate && python3 src/main.py --no-sandbox diff --git a/python3Pyside2QML/Dockerfile.debug b/python3Pyside2QML/Dockerfile.debug deleted file mode 100644 index 667b503b7..000000000 --- a/python3Pyside2QML/Dockerfile.debug +++ /dev/null @@ -1,149 +0,0 @@ -# ARGUMENTS -------------------------------------------------------------------- -## -# Board architecture -## -ARG IMAGE_ARCH= - -## -# Base container version -## -ARG BASE_VERSION=4.0.0 - -## -# Debug port -## -ARG DEBUG_SSH_PORT= - -## -# Run as -## -ARG SSHUSERNAME= - -## -# Directory of the application inside container -## -ARG APP_ROOT= - -## -# Board GPU vendor prefix -## -ARG GPU= - - -FROM --platform=linux/${IMAGE_ARCH} \ - torizon/qt5-wayland${GPU}:${BASE_VERSION} AS debug - -ARG IMAGE_ARCH -ARG GPU -ARG DEBUG_SSH_PORT -ARG SSHUSERNAME -ARG APP_ROOT - -# SSH for remote debug -EXPOSE ${DEBUG_SSH_PORT} -EXPOSE 6512 - -ENV QT_QPA_PLATFORM="wayland" - -# Make sure we don't get notifications we can't answer during building. -ENV DEBIAN_FRONTEND="noninteractive" - -# for vivante GPU we need some "special" sauce -RUN apt-get -q -y update && \ - if [ "${GPU}" = "-vivante" ] || [ "${GPU}" = "-imx8" ]; then \ - apt-get -q -y install \ - imx-gpu-viv-wayland-dev \ - ; else \ - apt-get -q -y install \ - libgl1 \ - ; fi \ - && \ - apt-get clean && apt-get autoremove && \ - rm -rf /var/lib/apt/lists/* - -# your regular RUN statements here -# Install required packages -RUN apt-get -q -y update && \ - apt-get -q -y install \ - openssl \ - openssh-server \ - rsync \ - file \ - screen \ - python3-minimal \ - python3-pip \ - python3-setuptools \ - python3-venv \ - qml-module-qtquick-controls \ - qml-module-qtquick-controls2 \ - qml-module-qtquick2 \ - python3-pyside2.qtwidgets \ - python3-pyside2.qtgui \ - python3-pyside2.qtqml \ - python3-pyside2.qtcore \ - python3-pyside2.qtquick \ - python3-pyside2.qtnetwork \ - qml-module-qtquick-dialogs \ - qtwayland5 \ - && apt-get clean && apt-get autoremove && \ - rm -rf /var/lib/apt/lists/* - -# edge case for amd64 -# this prevent the error: texture atlas allocation failed -RUN apt-get -q -y update && \ - if [ "${IMAGE_ARCH}" = "amd64" ]; then \ - apt-get -q -y install \ - libqt5quick5 \ - ; fi \ - && \ - apt-get clean && apt-get autoremove && \ - rm -rf /var/lib/apt/lists/* - -# automate for torizonPackages.json -RUN apt-get -q -y update && \ - apt-get -q -y install \ -# DO NOT REMOVE THIS LABEL: this is used for VS Code automation - # __torizon_packages_dev_start__ - # __torizon_packages_dev_end__ -# DO NOT REMOVE THIS LABEL: this is used for VS Code automation - && \ - apt-get clean && apt-get autoremove && \ - rm -rf /var/lib/apt/lists/* - -# Create virtualenv -RUN python3 -m venv ${APP_ROOT}/.venv --system-site-packages - -# Install pip packages on venv -COPY requirements-debug.txt /requirements-debug.txt -RUN . ${APP_ROOT}/.venv/bin/activate && \ - pip3 install --upgrade pip && pip3 install -r requirements-debug.txt && \ - rm requirements-debug.txt - -# ⚠️ DEBUG PURPOSES ONLY!! -# THIS CONFIGURES AN INSECURE SSH CONNECTION - -# create folders needed for the different components -# configures SSH access to the container and sets environment by default -RUN mkdir /var/run/sshd && \ - sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' \ - -i /etc/pam.d/sshd && \ - if test $SSHUSERNAME != root ; \ - then mkdir -p /home/$SSHUSERNAME/.ssh ; \ - else mkdir -p /root/.ssh ; fi && \ - echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config && \ - echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && \ - echo "Port ${DEBUG_SSH_PORT}" >> /etc/ssh/sshd_config && \ - echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \ - echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config && \ - su -c "env" $SSHUSERNAME > /etc/environment && \ - echo "$SSHUSERNAME:" | chpasswd -e - -RUN rm -r /etc/ssh/ssh*key && \ - dpkg-reconfigure openssh-server - -# Copy the application source code in the workspace to the $APP_ROOT directory -# path inside the container, where $APP_ROOT is the torizon_app_root -# configuration defined in settings.json -COPY --chown=$SSHUSERNAME:$SSHUSERNAME ./src ${APP_ROOT}/src - -CMD [ "/usr/sbin/sshd", "-D" ] diff --git a/python3Pyside2QML/docker-compose.yml b/python3Pyside2QML/docker-compose.yml deleted file mode 100644 index 7a55f4f75..000000000 --- a/python3Pyside2QML/docker-compose.yml +++ /dev/null @@ -1,80 +0,0 @@ -version: "3.9" -services: - __container__-debug: - build: - context: . - dockerfile: Dockerfile.debug - image: ${LOCAL_REGISTRY}:5002/__container__-debug:${TAG} - ports: - - ${DEBUG_SSH_PORT}:${DEBUG_SSH_PORT} - - ${DEBUG_PORT1}:${DEBUG_PORT1} - volumes: - - type: bind - source: /tmp - target: /tmp - - type: bind - source: /dev - target: /dev - device_cgroup_rules: - # ... for tty - - "c 4:* rmw" - # ... for /dev/input devices - - "c 13:* rmw" - - "c 199:* rmw" - # ... for /dev/dri devices - - "c 226:* rmw" - depends_on: [ - weston - ] - - __container__: - build: - context: . - dockerfile: Dockerfile - image: ${DOCKER_LOGIN}/__container__:${TAG} - volumes: - - type: bind - source: /tmp - target: /tmp - - type: bind - source: /dev - target: /dev - device_cgroup_rules: - # ... for tty - - "c 4:* rmw" - # ... for /dev/input devices - - "c 13:* rmw" - - "c 199:* rmw" - # ... for /dev/dri devices - - "c 226:* rmw" - depends_on: [ - weston - ] - - weston: - image: torizon/weston${GPU}:4.0.0 - environment: - - ACCEPT_FSL_EULA=1 - # Required to get udev events from host udevd via netlink - network_mode: host - volumes: - - type: bind - source: /tmp - target: /tmp - - type: bind - source: /dev - target: /dev - - type: bind - source: /run/udev - target: /run/udev - cap_add: - - CAP_SYS_TTY_CONFIG - # Add device access rights through cgroup... - device_cgroup_rules: - # ... for tty - - "c 4:* rmw" - # ... for /dev/input devices - - "c 13:* rmw" - - "c 199:* rmw" - # ... for /dev/dri devices - - "c 226:* rmw" diff --git a/python3Pyside2QML/requirements-debug.txt b/python3Pyside2QML/requirements-debug.txt deleted file mode 100644 index 2802a6b1b..000000000 --- a/python3Pyside2QML/requirements-debug.txt +++ /dev/null @@ -1 +0,0 @@ -debugpy diff --git a/python3Pyside2QML/requirements-local.txt b/python3Pyside2QML/requirements-local.txt deleted file mode 100644 index bc71e8a9a..000000000 --- a/python3Pyside2QML/requirements-local.txt +++ /dev/null @@ -1,3 +0,0 @@ -debugpy -PySide2 -PySide6 diff --git a/python3Pyside2QML/requirements-release.txt b/python3Pyside2QML/requirements-release.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/python3Pyside2QML/src/Scene.ui.qml b/python3Pyside2QML/src/Scene.ui.qml deleted file mode 100644 index 18be630cc..000000000 --- a/python3Pyside2QML/src/Scene.ui.qml +++ /dev/null @@ -1,29 +0,0 @@ -import QtQuick 2.13 -import QtQuick.Controls 2.13 - -Item { - id: item1 - width: 640 - height: 320 - - Rectangle { - anchors.fill: parent - color: "white" - } - - Image { - id: image - anchors.fill: parent - anchors.margins: 20 - horizontalAlignment: Image.AlignHCenter - verticalAlignment: Image.AlignVCenter - source: "assets/torizon-logo.png" - fillMode: Image.PreserveAspectFit - } -} - -/*##^## -Designer { - D{i:0;formeditorZoom:0.66} -} -##^##*/ diff --git a/python3Pyside2QML/src/assets/torizon-logo.png b/python3Pyside2QML/src/assets/torizon-logo.png deleted file mode 100644 index fc38edcd92ebda153b924d22a77ee457a3abb2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28344 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