Compare commits
17 Commits
linux
...
567901b205
| Author | SHA1 | Date | |
|---|---|---|---|
| 567901b205 | |||
| 935dbf6253 | |||
| abd1a1073a | |||
| 18c708597a | |||
| 52e4c01f3d | |||
| 75893a8a01 | |||
| cc8aa03102 | |||
| a2e1153340 | |||
| 8c4aa284b7 | |||
| a437de91df | |||
| 42768aa78a | |||
| 8e7242937e | |||
| a4bcd764db | |||
| 8395b2f220 | |||
| b643188418 | |||
| 097524cd27 | |||
| 4be6dd8b84 |
15
.editorconfig
Normal file
15
.editorconfig
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
end_of_line = lf
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.py]
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[pyproject.toml]
|
||||||
|
indent_size = 4
|
||||||
401
.gitignore
vendored
Normal file
401
.gitignore
vendored
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/*.code-snippets
|
||||||
|
!*.code-workspace
|
||||||
|
|
||||||
|
# Built Visual Studio Code Extensions
|
||||||
|
*.vsix
|
||||||
|
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[codz]
|
||||||
|
*$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
|
||||||
|
|
||||||
|
# UV
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
||||||
|
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||||
|
# commonly ignored for libraries.
|
||||||
|
# uv.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
|
||||||
|
# poetry.toml
|
||||||
|
|
||||||
|
# pdm
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||||
|
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
||||||
|
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
||||||
|
# pdm.lock
|
||||||
|
# pdm.toml
|
||||||
|
.pdm-python
|
||||||
|
.pdm-build/
|
||||||
|
|
||||||
|
# pixi
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
||||||
|
# pixi.lock
|
||||||
|
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
||||||
|
# in the .venv directory. It is recommended not to include this directory in version control.
|
||||||
|
.pixi
|
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
*.rdb
|
||||||
|
*.aof
|
||||||
|
*.pid
|
||||||
|
|
||||||
|
# RabbitMQ
|
||||||
|
mnesia/
|
||||||
|
rabbitmq/
|
||||||
|
rabbitmq-data/
|
||||||
|
|
||||||
|
# ActiveMQ
|
||||||
|
activemq-data/
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.envrc
|
||||||
|
.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/
|
||||||
|
|
||||||
|
# Abstra
|
||||||
|
# Abstra is an AI-powered process automation framework.
|
||||||
|
# Ignore directories containing user credentials, local state, and settings.
|
||||||
|
# Learn more at https://abstra.io/docs
|
||||||
|
.abstra/
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
||||||
|
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
||||||
|
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
||||||
|
# you could uncomment the following to ignore the entire vscode folder
|
||||||
|
# .vscode/
|
||||||
|
|
||||||
|
# Ruff stuff:
|
||||||
|
.ruff_cache/
|
||||||
|
|
||||||
|
# PyPI configuration file
|
||||||
|
.pypirc
|
||||||
|
|
||||||
|
# Marimo
|
||||||
|
marimo/_static/
|
||||||
|
marimo/_lsp/
|
||||||
|
__marimo__/
|
||||||
|
|
||||||
|
# Streamlit
|
||||||
|
.streamlit/secrets.toml
|
||||||
|
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, GoLand, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# AWS User-specific
|
||||||
|
.idea/**/aws.xml
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/artifacts
|
||||||
|
# .idea/compiler.xml
|
||||||
|
# .idea/jarRepositories.xml
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
# *.iml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# SonarLint plugin
|
||||||
|
.idea/sonarlint/
|
||||||
|
.idea/sonarlint.xml # see https://community.sonarsource.com/t/is-the-file-idea-idea-idea-sonarlint-xml-intended-to-be-under-source-control/121119
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based HTTP Client
|
||||||
|
.idea/httpRequests
|
||||||
|
http-client.private.env.json
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
|
# Apifox Helper cache
|
||||||
|
.idea/.cache/.Apifox_Helper
|
||||||
|
.idea/ApifoxUploaderProjectSetting.xml
|
||||||
|
|
||||||
|
# Github Copilot persisted session migrations, see: https://github.com/microsoft/copilot-intellij-feedback/issues/712#issuecomment-3322062215
|
||||||
|
.idea/**/copilot.data.migration.*.xml
|
||||||
|
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, GoLand, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# AWS User-specific
|
||||||
|
.idea/**/aws.xml
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/artifacts
|
||||||
|
# .idea/compiler.xml
|
||||||
|
# .idea/jarRepositories.xml
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
# *.iml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# SonarLint plugin
|
||||||
|
.idea/sonarlint/
|
||||||
|
.idea/sonarlint.xml # see https://community.sonarsource.com/t/is-the-file-idea-idea-idea-sonarlint-xml-intended-to-be-under-source-control/121119
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based HTTP Client
|
||||||
|
.idea/httpRequests
|
||||||
|
http-client.private.env.json
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
|
# Apifox Helper cache
|
||||||
|
.idea/.cache/.Apifox_Helper
|
||||||
|
.idea/ApifoxUploaderProjectSetting.xml
|
||||||
|
|
||||||
|
# Github Copilot persisted session migrations, see: https://github.com/microsoft/copilot-intellij-feedback/issues/712#issuecomment-3322062215
|
||||||
|
.idea/**/copilot.data.migration.*.xml
|
||||||
10
.idea/.gitignore
generated
vendored
Normal file
10
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Ignored default folder with query files
|
||||||
|
/queries/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
11
.idea/PyQt6_LaTaniere.iml
generated
Normal file
11
.idea/PyQt6_LaTaniere.iml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="jdk" jdkName="uv (PyQt6_LaTaniere)" jdkType="Python SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="uv (PyQt6_LaTaniere)" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="uv (PyQt6_LaTaniere)" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/PyQt6_LaTaniere.iml" filepath="$PROJECT_DIR$/.idea/PyQt6_LaTaniere.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
19
.vscode/extensions.json
vendored
Normal file
19
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"ms-python.python",
|
||||||
|
"ms-python.debugpy",
|
||||||
|
"ms-python.vscode-pylance",
|
||||||
|
"ms-python.vscode-python-envs",
|
||||||
|
"ms-python.mypy-type-checker",
|
||||||
|
"charliermarsh.ruff",
|
||||||
|
"editorconfig.editorconfig",
|
||||||
|
"njpwerner.autodocstring",
|
||||||
|
"redhat.vscode-yaml",
|
||||||
|
"tamasfe.even-better-toml",
|
||||||
|
"codezombiech.gitignore",
|
||||||
|
"theqtcompany.qt-core",
|
||||||
|
"theqtcompany.qt-ui",
|
||||||
|
"theqtcompany.qt-python",
|
||||||
|
"theqtcompany.qt-qml",
|
||||||
|
]
|
||||||
|
}
|
||||||
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"python.analysis.autoImportCompletions": true,
|
||||||
|
"python.analysis.extraPaths": [".venv/lib/python3.11/site-packages"],
|
||||||
|
"python.analysis.fixAll": ["source.unusedImports"],
|
||||||
|
"python.languageServer": "Pylance"
|
||||||
|
}
|
||||||
133
La Tanière Launcher.spec
Normal file
133
La Tanière Launcher.spec
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
|
a = Analysis(
|
||||||
|
['src\\mainwindow.py'],
|
||||||
|
pathex=[],
|
||||||
|
binaries=[],
|
||||||
|
datas=[
|
||||||
|
('.\\styles\\styles.qss', 'styles'),
|
||||||
|
('.\\ui\\mainwindow.ui', 'ui')
|
||||||
|
],
|
||||||
|
hiddenimports=[],
|
||||||
|
hookspath=[],
|
||||||
|
hooksconfig={
|
||||||
|
"qt_plugins": ["platforms", "styles"]
|
||||||
|
},
|
||||||
|
runtime_hooks=[],
|
||||||
|
excludes=[
|
||||||
|
# PySide6 - modules non utilisés
|
||||||
|
'PySide6.Qt3DAnimation',
|
||||||
|
'PySide6.Qt3DCore',
|
||||||
|
'PySide6.Qt3DExtras',
|
||||||
|
'PySide6.Qt3DInput',
|
||||||
|
'PySide6.Qt3DLogic',
|
||||||
|
'PySide6.Qt3DRender',
|
||||||
|
'PySide6.QtAxContainer',
|
||||||
|
'PySide6.QtBluetooth',
|
||||||
|
'PySide6.QtCharts',
|
||||||
|
'PySide6.QtConcurrent',
|
||||||
|
'PySide6.QtDataVisualization',
|
||||||
|
'PySide6.QtDesigner',
|
||||||
|
'PySide6.QtHelp',
|
||||||
|
'PySide6.QtLocation',
|
||||||
|
# 'PySide6.QtMultimedia',
|
||||||
|
'PySide6.QtMultimediaWidgets',
|
||||||
|
# 'PySide6.QtNetwork', # Dépendance à QtMultimedia
|
||||||
|
'PySide6.QtNetworkAuth',
|
||||||
|
'PySide6.QtNfc',
|
||||||
|
'PySide6.QtOpenGL',
|
||||||
|
'PySide6.QtOpenGLWidgets',
|
||||||
|
'PySide6.QtPdf',
|
||||||
|
'PySide6.QtPdfWidgets',
|
||||||
|
'PySide6.QtPositioning',
|
||||||
|
'PySide6.QtPrintSupport',
|
||||||
|
'PySide6.QtQml',
|
||||||
|
'PySide6.QtQuick',
|
||||||
|
'PySide6.QtQuick3D',
|
||||||
|
'PySide6.QtQuickControls2',
|
||||||
|
'PySide6.QtQuickWidgets',
|
||||||
|
'PySide6.QtRemoteObjects',
|
||||||
|
'PySide6.QtScxml',
|
||||||
|
'PySide6.QtSensors',
|
||||||
|
'PySide6.QtSerialBus',
|
||||||
|
'PySide6.QtSerialPort',
|
||||||
|
'PySide6.QtSpatialAudio',
|
||||||
|
'PySide6.QtSql',
|
||||||
|
'PySide6.QtStateMachine',
|
||||||
|
'PySide6.QtSvg',
|
||||||
|
'PySide6.QtSvgWidgets',
|
||||||
|
'PySide6.QtTest',
|
||||||
|
'PySide6.QtTextToSpeech',
|
||||||
|
'PySide6.QtWebChannel',
|
||||||
|
'PySide6.QtWebEngineCore',
|
||||||
|
'PySide6.QtWebEngineQuick',
|
||||||
|
'PySide6.QtWebEngineWidgets',
|
||||||
|
'PySide6.QtWebSockets',
|
||||||
|
'PySide6.QtXml',
|
||||||
|
|
||||||
|
# Stdlib inutile en prod
|
||||||
|
'unittest',
|
||||||
|
'email',
|
||||||
|
'html',
|
||||||
|
'http',
|
||||||
|
'xmlrpc',
|
||||||
|
'pydoc',
|
||||||
|
'doctest',
|
||||||
|
'difflib',
|
||||||
|
'tkinter',
|
||||||
|
'curses',
|
||||||
|
'readline',
|
||||||
|
'xml',
|
||||||
|
'xmlrpc',
|
||||||
|
'csv',
|
||||||
|
'multiprocessing',
|
||||||
|
'concurrent',
|
||||||
|
'asyncio',
|
||||||
|
'sqlite3',
|
||||||
|
'ssl',
|
||||||
|
'socket',
|
||||||
|
'ctypes',
|
||||||
|
'lib2to3',
|
||||||
|
'test',
|
||||||
|
'distutils',
|
||||||
|
'setuptools',
|
||||||
|
'pkg_resources',
|
||||||
|
'pip',
|
||||||
|
],
|
||||||
|
noarchive=False,
|
||||||
|
optimize=2, # optimisation bytecode
|
||||||
|
)
|
||||||
|
pyz = PYZ(a.pure, a.zipped_data)
|
||||||
|
|
||||||
|
exe = EXE(
|
||||||
|
pyz,
|
||||||
|
a.scripts,
|
||||||
|
a.binaries,
|
||||||
|
a.datas,
|
||||||
|
[],
|
||||||
|
name='La Tanière Launcher',
|
||||||
|
debug=False,
|
||||||
|
bootloader_ignore_signals=False,
|
||||||
|
strip=False, # True = enlève symboles debug
|
||||||
|
upx=True,
|
||||||
|
upx_exclude=[
|
||||||
|
"_uuid.pyd",
|
||||||
|
"Qt6Core.dll",
|
||||||
|
"Qt6Gui.dll",
|
||||||
|
"Qt6Widgets.dll",
|
||||||
|
"Qt6UiTools.dll",
|
||||||
|
"qwindows.dll",
|
||||||
|
"python3*.dll",
|
||||||
|
"vcruntime*.dll",
|
||||||
|
"msvcp*.dll",
|
||||||
|
],
|
||||||
|
runtime_tmpdir=None,
|
||||||
|
console=False,
|
||||||
|
disable_windowed_traceback=True,
|
||||||
|
argv_emulation=False,
|
||||||
|
target_arch=None,
|
||||||
|
codesign_identity=None,
|
||||||
|
entitlements_file=None,
|
||||||
|
icon=['assets\\Icone.ico'],
|
||||||
|
)
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
assets/Logo_Discord_2015.png
Normal file
BIN
assets/Logo_Discord_2015.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
assets/Logo_rond.png
Normal file
BIN
assets/Logo_rond.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 222 KiB |
23
assets/computer-tv.svg
Normal file
23
assets/computer-tv.svg
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
viewBox="0 0 501.333 501.333" xml:space="preserve">
|
||||||
|
<path style="fill:#637888;" d="M458.667,241.067c0,11.733-8.533,21.333-20.267,21.333H62.933c-10.667,0-20.267-9.6-20.267-21.333
|
||||||
|
V21.333C42.667,9.6,51.2,0,62.933,0H438.4c10.667,0,20.267,9.6,20.267,21.333L458.667,241.067L458.667,241.067z"/>
|
||||||
|
<path style="fill:#53C2EF;" d="M62.933,249.6c-5.333,0-8.533-4.267-8.533-9.6V21.333c0-5.333,4.267-9.6,8.533-9.6H438.4
|
||||||
|
c5.333,0,8.533,4.267,8.533,9.6v219.733c0,5.333-4.267,9.6-8.533,9.6H62.933V249.6z"/>
|
||||||
|
<rect x="166.4" y="262.4" style="fill:#3A5569;" width="168.533" height="61.867"/>
|
||||||
|
<path style="fill:#637888;" d="M363.733,317.867H137.6c-18.133,0-34.133,10.667-34.133,23.467h294.4
|
||||||
|
C397.867,328.533,382.933,317.867,363.733,317.867z"/>
|
||||||
|
<rect y="342.4" style="fill:#3A5569;" width="501.333" height="158.933"/>
|
||||||
|
<g>
|
||||||
|
<rect x="268.8" y="375.467" style="fill:#637888;" width="194.133" height="45.867"/>
|
||||||
|
<rect x="28.8" y="364.8" style="fill:#637888;" width="11.733" height="113.067"/>
|
||||||
|
<rect x="60.8" y="364.8" style="fill:#637888;" width="11.733" height="113.067"/>
|
||||||
|
<rect x="91.733" y="364.8" style="fill:#637888;" width="11.733" height="113.067"/>
|
||||||
|
<rect x="122.667" y="364.8" style="fill:#637888;" width="11.733" height="113.067"/>
|
||||||
|
<rect x="153.6" y="364.8" style="fill:#637888;" width="11.733" height="113.067"/>
|
||||||
|
</g>
|
||||||
|
<circle style="fill:#F16D6E;" cx="225.067" cy="400" r="11.733"/>
|
||||||
|
<circle style="fill:#60C3AB;" cx="225.067" cy="443.733" r="11.733"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
14
assets/padlock-lock.svg
Normal file
14
assets/padlock-lock.svg
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
viewBox="0 0 512.001 512.001" xml:space="preserve">
|
||||||
|
<path style="fill:#FF9E16;" d="M459.897,231.945c0-16.19-13.246-29.436-29.436-29.436H81.54c-16.19,0-29.436,13.247-29.436,29.436
|
||||||
|
v250.619C52.104,498.754,65.349,512,81.54,512H430.46c16.189,0,29.436-13.246,29.436-29.436V231.945H459.897z"/>
|
||||||
|
<path style="fill:#0071CE;" d="M52.104,458.106v24.459c0,16.189,13.245,29.436,29.436,29.436H430.46
|
||||||
|
c16.189,0,29.436-13.246,29.436-29.436v-24.459H52.104z"/>
|
||||||
|
<path style="fill:#0055B8;" d="M284.42,344.612c14.456-9.34,24.033-25.585,24.033-44.077c0-28.969-23.484-52.453-52.453-52.453
|
||||||
|
s-52.453,23.484-52.453,52.453c0,18.491,9.578,34.736,24.034,44.077l-9.012,61.623c-0.809,5.538,3.107,10.069,8.703,10.069h57.457
|
||||||
|
c5.597,0,9.513-4.531,8.703-10.069L284.42,344.612z"/>
|
||||||
|
<path style="fill:#333E48;" d="M384.933,202.51h-52.985v-73.576c0-41.878-34.069-75.948-75.948-75.948s-75.949,34.069-75.949,75.948
|
||||||
|
v73.576h-52.985v-73.576C127.067,57.839,184.907,0,256.001,0s128.933,57.839,128.933,128.933L384.933,202.51L384.933,202.51z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
30
assets/sound-speaker.svg
Normal file
30
assets/sound-speaker.svg
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
viewBox="0 0 512 512" xml:space="preserve">
|
||||||
|
<path style="fill:#4A5058;" d="M144.24,167.708H29.247c-11.636,0-21.069,9.433-21.069,21.067v134.448
|
||||||
|
c0,11.636,9.433,21.067,21.069,21.067H144.24V167.708z"/>
|
||||||
|
<rect x="62.112" y="167.704" style="fill:#E45D4C;" width="28.195" height="176.582"/>
|
||||||
|
<path style="fill:#7E858B;" d="M297.578,62.32L144.24,167.708v176.583L297.578,449.68c7.783,5.349,18.374-0.222,18.374-9.666V71.986
|
||||||
|
C315.952,62.542,305.361,56.97,297.578,62.32z"/>
|
||||||
|
<path style="opacity:0.2;enable-background:new ;" d="M311.097,436.161L162.493,334.026c-3.083-2.119-6.738-3.253-10.479-3.253
|
||||||
|
H42.765c-11.636,0-21.067-9.433-21.067-21.067V175.258c0-2.274,0.371-4.46,1.037-6.512c-8.446,2.745-14.555,10.669-14.555,20.03
|
||||||
|
v134.448c0,11.636,9.433,21.067,21.069,21.067h114.992L297.579,449.68c7.783,5.349,18.374-0.222,18.374-9.666v-1.91
|
||||||
|
C314.293,437.846,312.64,437.222,311.097,436.161z"/>
|
||||||
|
<path d="M429.806,79.937c-3.457-2.908-8.618-2.46-11.523,0.999c-2.906,3.458-2.459,8.617,0.999,11.523
|
||||||
|
c48.528,40.785,76.361,100.396,76.361,163.546c0,63.149-27.833,122.76-76.361,163.545c-3.458,2.907-3.905,8.066-0.999,11.523
|
||||||
|
c1.617,1.926,3.933,2.917,6.266,2.917c1.857,0,3.726-0.629,5.258-1.918C482.041,388.171,512,323.996,512,256.004
|
||||||
|
C512,188.012,482.041,123.837,429.806,79.937z M393.581,123.107c-3.457-2.906-8.617-2.462-11.523,0.999
|
||||||
|
c-2.906,3.458-2.459,8.617,0.999,11.523c35.719,30.021,56.205,73.897,56.205,120.375s-20.486,90.353-56.205,120.374
|
||||||
|
c-3.458,2.906-3.905,8.066-0.999,11.523c1.617,1.926,3.934,2.917,6.266,2.917c1.857,0,3.726-0.629,5.258-1.918
|
||||||
|
c39.427-33.137,62.04-81.576,62.04-132.896S433.008,156.246,393.581,123.107z M313.492,54.367
|
||||||
|
c-6.567-3.454-14.438-2.987-20.547,1.212L141.7,159.529H29.247C13.12,159.528,0,172.649,0,188.776v134.448
|
||||||
|
c0,16.127,13.12,29.247,29.247,29.247H141.7l151.246,103.95c3.39,2.331,7.321,3.511,11.272,3.511c3.17,0,6.353-0.76,9.276-2.298
|
||||||
|
c6.562-3.453,10.639-10.205,10.639-17.619V71.986C324.131,64.571,320.055,57.82,313.492,54.367z M136.061,336.113H29.247
|
||||||
|
c-7.106,0-12.888-5.781-12.888-12.888V188.776c0-7.108,5.782-12.888,12.888-12.888H136.06v160.225H136.061z M307.772,440.014
|
||||||
|
c0,1.865-1.189,2.769-1.897,3.142c-0.709,0.371-2.126,0.841-3.663-0.216L152.42,339.989V172.011L302.212,69.06
|
||||||
|
c1.539-1.057,2.956-0.586,3.663-0.216c0.709,0.373,1.897,1.277,1.897,3.142V440.014z M357.385,166.238
|
||||||
|
c-3.461-2.904-8.619-2.455-11.525,1.002c-2.905,3.459-2.456,8.619,1.002,11.525c22.889,19.225,36.017,47.379,36.017,77.24
|
||||||
|
s-13.128,58.013-36.017,77.239c-3.458,2.905-3.908,8.066-1.002,11.525c1.618,1.926,3.935,2.918,6.268,2.918
|
||||||
|
c1.856,0,3.723-0.628,5.257-1.916c26.599-22.342,41.854-55.06,41.854-89.766C399.239,221.299,383.984,188.581,357.385,166.238z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.8 KiB |
BIN
assets/the-beat-of-nature-122841.mp3
Normal file
BIN
assets/the-beat-of-nature-122841.mp3
Normal file
Binary file not shown.
1
build.bat
Normal file
1
build.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pyinstaller --noconfirm --onedir --onefile --windowed --icon .\assets\Icone.ico --name "La Tanière Launcher" .\src\mainwindow.py --paths ".\.venv\Lib\site-packages\" --add-data ".\styles\styles.qss:styles" --add-data ".\ui\mainwindow.ui:ui" --hidden-import win11toast
|
||||||
48
frameless.py
48
frameless.py
@@ -1,48 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
|
|
||||||
from PyQt6.QtCore import Qt, QPoint
|
|
||||||
|
|
||||||
# À placer tout en haut, avant les imports PyQt6 si possible
|
|
||||||
os.environ["QT_QPA_PLATFORM"] = "xcb"
|
|
||||||
|
|
||||||
class FenetreSansTitre(QMainWindow):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
|
||||||
self.resize(400, 300)
|
|
||||||
|
|
||||||
# IMPORTANT : On active le suivi de souris
|
|
||||||
self.setMouseTracking(True)
|
|
||||||
|
|
||||||
layout = QVBoxLayout()
|
|
||||||
btn_quitter = QPushButton("Quitter")
|
|
||||||
btn_quitter.clicked.connect(self.close)
|
|
||||||
layout.addWidget(btn_quitter)
|
|
||||||
|
|
||||||
container = QWidget()
|
|
||||||
container.setLayout(layout)
|
|
||||||
self.setCentralWidget(container)
|
|
||||||
|
|
||||||
self._drag_pos = None
|
|
||||||
|
|
||||||
def mousePressEvent(self, event):
|
|
||||||
if event.button() == Qt.MouseButton.LeftButton:
|
|
||||||
# On enregistre la position du clic RELATIVE au coin haut-gauche de la fenêtre
|
|
||||||
self._drag_pos = event.position().toPoint()
|
|
||||||
|
|
||||||
def mouseMoveEvent(self, event):
|
|
||||||
if self._drag_pos is not None:
|
|
||||||
# On déplace la fenêtre vers la position globale du curseur
|
|
||||||
# MOINS le décalage initial (offset) pour éviter que le curseur ne saute au centre
|
|
||||||
self.move(event.globalPosition().toPoint() - self._drag_pos)
|
|
||||||
|
|
||||||
def mouseReleaseEvent(self, event):
|
|
||||||
self._drag_pos = None
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app = QApplication(sys.argv)
|
|
||||||
fenetre = FenetreSansTitre()
|
|
||||||
fenetre.show()
|
|
||||||
sys.exit(app.exec())
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
|
|
||||||
from PyQt6.QtCore import Qt, QPoint
|
|
||||||
|
|
||||||
# À placer tout en haut, avant les imports PyQt6 si possible
|
|
||||||
os.environ["QT_QPA_PLATFORM"] = "xcb"
|
|
||||||
|
|
||||||
class FenetreSansTitre(QMainWindow):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
# 1. Retirer la barre de titre
|
|
||||||
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
|
||||||
self.resize(400, 300)
|
|
||||||
|
|
||||||
# Interface simple
|
|
||||||
layout = QVBoxLayout()
|
|
||||||
btn_quitter = QPushButton("Fermer la fenêtre")
|
|
||||||
btn_quitter.clicked.connect(self.close)
|
|
||||||
layout.addWidget(btn_quitter)
|
|
||||||
|
|
||||||
container = QWidget()
|
|
||||||
container.setLayout(layout)
|
|
||||||
self.setCentralWidget(container)
|
|
||||||
|
|
||||||
# Variable pour stocker la position du clic
|
|
||||||
self.old_pos = None
|
|
||||||
|
|
||||||
# --- Logique de déplacement ---
|
|
||||||
|
|
||||||
def mousePressEvent(self, event):
|
|
||||||
if event.button() == Qt.MouseButton.LeftButton:
|
|
||||||
# On sauvegarde la position relative du curseur dans la fenêtre
|
|
||||||
self.old_pos = event.globalPosition().toPoint()
|
|
||||||
|
|
||||||
def mouseMoveEvent(self, event):
|
|
||||||
if self.old_pos is not None:
|
|
||||||
# Calcul de la distance parcourue
|
|
||||||
delta = QPoint(event.globalPosition().toPoint() - self.old_pos)
|
|
||||||
# Déplacement de la fenêtre
|
|
||||||
self.move(self.x() + delta.x(), self.y() + delta.y())
|
|
||||||
# Mise à jour de la position de référence
|
|
||||||
self.old_pos = event.globalPosition().toPoint()
|
|
||||||
|
|
||||||
def mouseReleaseEvent(self, event):
|
|
||||||
self.old_pos = None
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app = QApplication(sys.argv)
|
|
||||||
fenetre = FenetreSansTitre()
|
|
||||||
fenetre.show()
|
|
||||||
sys.exit(app.exec())
|
|
||||||
117
mainwindow.py
117
mainwindow.py
@@ -1,117 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
from PyQt6 import QtGui, QtWidgets
|
|
||||||
from PyQt6 import uic
|
|
||||||
from PyQt6.QtCore import Qt
|
|
||||||
from PyQt6.QtGui import QFontDatabase, QFont, QColor
|
|
||||||
from PyQt6.QtWidgets import QApplication, QMainWindow
|
|
||||||
|
|
||||||
|
|
||||||
from slidergroovecolorstyle import ThinSubPageLineStyle, ThinAddPageLineStyle
|
|
||||||
|
|
||||||
# Compile resources.qrc into resources_rc.py
|
|
||||||
# rcc -g python resources.qrc -o resources_rc.py
|
|
||||||
|
|
||||||
import resources_rc # This is generated from the .qrc file
|
|
||||||
|
|
||||||
# À placer tout en haut, avant les imports PyQt6 si possible
|
|
||||||
if sys.platform.startswith('linux'):
|
|
||||||
os.environ["QT_QPA_PLATFORM"] = "xcb"
|
|
||||||
|
|
||||||
# Remove this into final release
|
|
||||||
from fake_patch_notes import patch_note
|
|
||||||
NO_STAFF = True
|
|
||||||
|
|
||||||
def load_custom_font():
|
|
||||||
# Load font from Qt resource
|
|
||||||
font_id = QFontDatabase.addApplicationFont(":/assets/Avocado-Cake-Demo.otf")
|
|
||||||
if font_id == -1:
|
|
||||||
raise RuntimeError("Failed to load font from resources.")
|
|
||||||
|
|
||||||
# Get the family name of the loaded font
|
|
||||||
font_families = QFontDatabase.applicationFontFamilies(font_id)
|
|
||||||
if not font_families:
|
|
||||||
raise RuntimeError("No font families found in the loaded font.")
|
|
||||||
return font_families[0]
|
|
||||||
|
|
||||||
class MainWindow(QMainWindow):
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
# Remove the title bar and window frame
|
|
||||||
self.setWindowFlags(Qt.WindowType.FramelessWindowHint |Qt.WindowType.Window)
|
|
||||||
|
|
||||||
# Optional: Make background transparent (if you want rounded corners, etc.)
|
|
||||||
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
|
|
||||||
|
|
||||||
# Track mouse position for dragging
|
|
||||||
self._drag_pos = None
|
|
||||||
|
|
||||||
# Load font family from resource
|
|
||||||
font_family = load_custom_font()
|
|
||||||
|
|
||||||
uic.loadUi("mainwindow.ui", self)
|
|
||||||
|
|
||||||
# Adjust UI
|
|
||||||
self.maintitle_label.setFont(QFont(font_family, 38))
|
|
||||||
self.subtitle_label.setStyleSheet("color: rgb(163, 177, 198)")
|
|
||||||
#self.horizontalSlider.setStyle(ThinAddPageLineStyle(app.style(), QColor("#2196F3")))
|
|
||||||
|
|
||||||
if NO_STAFF :
|
|
||||||
self.staff_btn.hide()
|
|
||||||
self.spacer_substitution.hide()
|
|
||||||
|
|
||||||
self.info_text.setMarkdown(patch_note)
|
|
||||||
|
|
||||||
# Find the button by its objectName in Qt Designer
|
|
||||||
# Example: objectName = "close_btn"
|
|
||||||
self.close_btn.clicked.connect(self.close_link)
|
|
||||||
self.minimize_btn.clicked.connect(self.minimize_link)
|
|
||||||
|
|
||||||
self.connexion_btn.clicked.connect(self.connexion_btn_link)
|
|
||||||
|
|
||||||
def close_link(self):
|
|
||||||
sys.exit(app.exec())
|
|
||||||
|
|
||||||
def minimize_link(self):
|
|
||||||
# Minimize the application
|
|
||||||
self.setWindowState(Qt.WindowState.WindowMinimized)
|
|
||||||
|
|
||||||
# Mouse press event to start dragging
|
|
||||||
def mousePressEvent(self, event):
|
|
||||||
if event.button() == Qt.MouseButton.LeftButton:
|
|
||||||
self._drag_pos = event.globalPosition().toPoint() - self.frameGeometry().topLeft()
|
|
||||||
event.accept()
|
|
||||||
|
|
||||||
# Mouse move event to drag window
|
|
||||||
def mouseMoveEvent(self, event):
|
|
||||||
if event.buttons() == Qt.MouseButton.LeftButton and self._drag_pos is not None:
|
|
||||||
self.move(event.globalPosition().toPoint() - self._drag_pos)
|
|
||||||
event.accept()
|
|
||||||
|
|
||||||
# Mouse release event to stop dragging
|
|
||||||
def mouseReleaseEvent(self, event):
|
|
||||||
self._drag_pos = None
|
|
||||||
event.accept()
|
|
||||||
|
|
||||||
def connexion_btn_link(self):
|
|
||||||
#toast('Hello Python🐍')
|
|
||||||
print("")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app = QApplication(sys.argv)
|
|
||||||
|
|
||||||
with open('styles.qss', 'r') as f:
|
|
||||||
style = f.read()
|
|
||||||
|
|
||||||
# Set the stylesheet of the application
|
|
||||||
app.setStyleSheet(style)
|
|
||||||
|
|
||||||
# Load and set the global font
|
|
||||||
custom_font = QFont(load_custom_font(), 16)
|
|
||||||
if custom_font:
|
|
||||||
app.setFont(custom_font)
|
|
||||||
window = MainWindow()
|
|
||||||
window.show()
|
|
||||||
sys.exit(app.exec())
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
[project]
|
|
||||||
name = "LaTaniere_UI"
|
|
||||||
version = "0.1.0"
|
|
||||||
description = "Add your description here"
|
|
||||||
readme = "README.md"
|
|
||||||
requires-python = ">=3.14"
|
|
||||||
dependencies = [
|
|
||||||
"pyside6>=6.10.2",
|
|
||||||
]
|
|
||||||
51
readme.md
Normal file
51
readme.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# LaTaniere Launcher UI
|
||||||
|
|
||||||
|
⚠️ you need [Qt Designer](https://build-system.fman.io/qt-designer-download).
|
||||||
|
|
||||||
|
## First: create virtualenv
|
||||||
|
|
||||||
|
python -m venv .venv
|
||||||
|
|
||||||
|
## Second: activate your virtual environment
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Execute in powershell:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
.venv/bin/activate.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
or batch file
|
||||||
|
|
||||||
|
```bat
|
||||||
|
.venv/bin/activate.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
Execute into terminal in project folder:
|
||||||
|
`source .venv/bin/actiave`
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
## Third install packages
|
||||||
|
|
||||||
|
Ensure your virtual environment is active and execute these commands within it.
|
||||||
|
|
||||||
|
### Using Pip
|
||||||
|
|
||||||
|
#### Global packages
|
||||||
|
|
||||||
|
`pip install -r .\requirements.txt`
|
||||||
|
|
||||||
|
#### packages for Windows only
|
||||||
|
|
||||||
|
`pip install -r .\windows_requirements.txt`
|
||||||
|
|
||||||
|
### Using install.py script
|
||||||
|
|
||||||
|
Execute `python install.py`
|
||||||
|
Note: in case if you aren't virtual environment, the script stop.
|
||||||
|
|
||||||
|
Enjoy.
|
||||||
@@ -1,31 +1,17 @@
|
|||||||
certifi==2026.2.25
|
altgraph==0.17.5
|
||||||
distlib==0.4.0
|
librt==0.8.1
|
||||||
filelock==3.25.0
|
modulegraph==0.19.7
|
||||||
|
mypy==1.19.1
|
||||||
|
mypy_extensions==1.1.0
|
||||||
packaging==26.0
|
packaging==26.0
|
||||||
pipenv==2026.0.3
|
pathspec==1.0.4
|
||||||
platformdirs==4.9.2
|
pefile==2024.8.26
|
||||||
PyQt6==6.10.2
|
pyinstaller==6.19.0
|
||||||
PyQt6-Qt6==6.10.2
|
pyinstaller-hooks-contrib==2026.2
|
||||||
PyQt6_sip==13.11.0
|
|
||||||
PySide6==6.10.2
|
PySide6==6.10.2
|
||||||
PySide6_Addons==6.10.2
|
PySide6_Addons==6.10.2
|
||||||
PySide6_Essentials==6.10.2
|
PySide6_Essentials==6.10.2
|
||||||
python-discovery==1.1.0
|
pywin32-ctypes==0.2.3
|
||||||
setuptools==82.0.0
|
setuptools==82.0.0
|
||||||
shiboken6==6.10.2
|
shiboken6==6.10.2
|
||||||
typing_extensions==4.15.0
|
typing_extensions==4.15.0
|
||||||
virtualenv==21.1.0
|
|
||||||
win11toast==0.36.3
|
|
||||||
winrt-runtime==3.2.1
|
|
||||||
winrt-Windows.Data.Xml.Dom==3.2.1
|
|
||||||
winrt-Windows.Foundation==3.2.1
|
|
||||||
winrt-Windows.Foundation.Collections==3.2.1
|
|
||||||
winrt-Windows.Globalization==3.2.1
|
|
||||||
winrt-Windows.Graphics.Imaging==3.2.1
|
|
||||||
winrt-Windows.Media.Core==3.2.1
|
|
||||||
winrt-Windows.Media.Ocr==3.2.1
|
|
||||||
winrt-Windows.Media.Playback==3.2.1
|
|
||||||
winrt-Windows.Media.SpeechSynthesis==3.2.1
|
|
||||||
winrt-Windows.Storage==3.2.1
|
|
||||||
winrt-Windows.Storage.Streams==3.2.1
|
|
||||||
winrt-Windows.UI.Notifications==3.2.1
|
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/">
|
<qresource prefix="/">
|
||||||
|
<file>assets/the-beat-of-nature-122841.mp3</file>
|
||||||
|
<file>assets/sound-speaker.svg</file>
|
||||||
|
<file>assets/computer-tv.svg</file>
|
||||||
|
<file>assets/padlock-lock.svg</file>
|
||||||
<file>assets/logo.png</file>
|
<file>assets/logo.png</file>
|
||||||
|
<file>assets/Logo_Discord_2015.png</file>
|
||||||
<file>assets/system-shutdown.png</file>
|
<file>assets/system-shutdown.png</file>
|
||||||
<file>assets/Avocado-Cake-Demo.otf</file>
|
<file>assets/Avocado-Cake-Demo.otf</file>
|
||||||
<file>assets/background.png</file>
|
<file>assets/background.png</file>
|
||||||
|
|||||||
26783
resources_rc.py
26783
resources_rc.py
File diff suppressed because it is too large
Load Diff
@@ -1,272 +0,0 @@
|
|||||||
from PyQt6.QtCore import Qt
|
|
||||||
from PyQt6.QtWidgets import (
|
|
||||||
QSlider, QProxyStyle, QStyle
|
|
||||||
)
|
|
||||||
from PyQt6.QtGui import QColor
|
|
||||||
|
|
||||||
class SliderGrooveColorStyle(QProxyStyle):
|
|
||||||
def __init__(self, base_style=None, groove_color=QColor("lightblue")):
|
|
||||||
super().__init__(base_style)
|
|
||||||
self.groove_color = groove_color
|
|
||||||
|
|
||||||
def drawComplexControl(self, control, option, painter, widget=None):
|
|
||||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
|
||||||
|
|
||||||
# Récupérer la zone du groove
|
|
||||||
groove_rect = self.subControlRect(
|
|
||||||
QStyle.ComplexControl.CC_Slider,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderGroove,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
# Dessiner notre fond
|
|
||||||
painter.save()
|
|
||||||
painter.setBrush(self.groove_color)
|
|
||||||
painter.setPen(Qt.PenStyle.NoPen)
|
|
||||||
painter.drawRect(groove_rect)
|
|
||||||
painter.restore()
|
|
||||||
|
|
||||||
# Puis laisser Qt dessiner normalement (handle etc.)
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
return
|
|
||||||
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
|
|
||||||
class SliderSubPageColorStyle(QProxyStyle):
|
|
||||||
def __init__(self, base_style=None, color=QColor("#4CAF50")):
|
|
||||||
super().__init__(base_style)
|
|
||||||
self.color = color
|
|
||||||
|
|
||||||
def drawComplexControl(self, control, option, painter, widget=None):
|
|
||||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
|
||||||
|
|
||||||
# Laisser Qt dessiner le slider normalement
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
|
|
||||||
# Récupérer les rectangles du groove et du handle
|
|
||||||
groove_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderGroove,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
handle_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderHandle,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
painter.save()
|
|
||||||
painter.setBrush(self.color)
|
|
||||||
painter.setPen(Qt.PenStyle.NoPen)
|
|
||||||
|
|
||||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
|
||||||
# Partie avant le handle (gauche → centre du handle)
|
|
||||||
sub_rect = groove_rect.adjusted(
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
handle_rect.center().x() - groove_rect.right(),
|
|
||||||
0
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
# Vertical (bas → centre du handle)
|
|
||||||
sub_rect = groove_rect.adjusted(
|
|
||||||
0,
|
|
||||||
handle_rect.center().y() - groove_rect.bottom(),
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
|
|
||||||
painter.drawRect(sub_rect)
|
|
||||||
painter.restore()
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
|
|
||||||
class SliderAddPageColorStyle(QProxyStyle):
|
|
||||||
def __init__(self, base_style=None, color=QColor("#FF9800")):
|
|
||||||
super().__init__(base_style)
|
|
||||||
self.color = color
|
|
||||||
|
|
||||||
def drawComplexControl(self, control, option, painter, widget=None):
|
|
||||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
|
||||||
|
|
||||||
# Récupérer groove + handle
|
|
||||||
groove_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderGroove,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
handle_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderHandle,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
painter.save()
|
|
||||||
painter.setBrush(self.color)
|
|
||||||
painter.setPen(Qt.PenStyle.NoPen)
|
|
||||||
|
|
||||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
|
||||||
# Partie après le handle (centre → fin)
|
|
||||||
add_rect = groove_rect.adjusted(
|
|
||||||
handle_rect.center().x() - groove_rect.left(),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
# Vertical (centre → haut)
|
|
||||||
add_rect = groove_rect.adjusted(
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
handle_rect.center().y() - groove_rect.top()
|
|
||||||
)
|
|
||||||
|
|
||||||
painter.drawRect(add_rect)
|
|
||||||
painter.restore()
|
|
||||||
|
|
||||||
# IMPORTANT : Qt dessine ensuite le handle par-dessus
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
return
|
|
||||||
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
|
|
||||||
class ThinAddPageLineStyle(QProxyStyle):
|
|
||||||
def __init__(self, base_style=None, color=QColor("#E91E63")):
|
|
||||||
super().__init__(base_style)
|
|
||||||
self.color = color
|
|
||||||
|
|
||||||
def drawComplexControl(self, control, option, painter, widget=None):
|
|
||||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
|
||||||
|
|
||||||
groove_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderGroove,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
handle_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderHandle,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
painter.save()
|
|
||||||
painter.setBrush(self.color)
|
|
||||||
painter.setPen(Qt.PenStyle.NoPen)
|
|
||||||
|
|
||||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
|
||||||
# Épaisseur fine (2 px)
|
|
||||||
thickness = 2
|
|
||||||
|
|
||||||
y = groove_rect.center().y() - thickness // 2
|
|
||||||
|
|
||||||
add_rect = groove_rect.adjusted(
|
|
||||||
handle_rect.center().x() - groove_rect.left(),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
|
|
||||||
add_rect.setTop(y)
|
|
||||||
add_rect.setHeight(thickness)
|
|
||||||
|
|
||||||
else:
|
|
||||||
thickness = 2
|
|
||||||
|
|
||||||
x = groove_rect.center().x() - thickness // 2
|
|
||||||
|
|
||||||
add_rect = groove_rect.adjusted(
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
handle_rect.center().y() - groove_rect.top()
|
|
||||||
)
|
|
||||||
|
|
||||||
add_rect.setLeft(x)
|
|
||||||
add_rect.setWidth(thickness)
|
|
||||||
|
|
||||||
painter.drawRect(add_rect)
|
|
||||||
painter.restore()
|
|
||||||
|
|
||||||
# Dessiner ensuite le slider normalement (handle au-dessus)
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
return
|
|
||||||
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
|
|
||||||
class ThinSubPageLineStyle(QProxyStyle):
|
|
||||||
def __init__(self, base_style=None, color=QColor("#4CAF50")):
|
|
||||||
super().__init__(base_style)
|
|
||||||
self.color = color
|
|
||||||
|
|
||||||
def drawComplexControl(self, control, option, painter, widget=None):
|
|
||||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
|
||||||
|
|
||||||
groove_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderGroove,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
handle_rect = self.subControlRect(
|
|
||||||
control,
|
|
||||||
option,
|
|
||||||
QStyle.SubControl.SC_SliderHandle,
|
|
||||||
widget
|
|
||||||
)
|
|
||||||
|
|
||||||
painter.save()
|
|
||||||
painter.setBrush(self.color)
|
|
||||||
painter.setPen(Qt.PenStyle.NoPen)
|
|
||||||
|
|
||||||
# Épaisseur fine (ajuste si besoin)
|
|
||||||
thickness = 2
|
|
||||||
|
|
||||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
|
||||||
|
|
||||||
y = groove_rect.center().y() - thickness // 2
|
|
||||||
|
|
||||||
sub_rect = groove_rect.adjusted(
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
handle_rect.center().x() - groove_rect.right(),
|
|
||||||
0
|
|
||||||
)
|
|
||||||
|
|
||||||
sub_rect.setTop(y)
|
|
||||||
sub_rect.setHeight(thickness)
|
|
||||||
|
|
||||||
else:
|
|
||||||
x = groove_rect.center().x() - thickness // 2
|
|
||||||
|
|
||||||
sub_rect = groove_rect.adjusted(
|
|
||||||
0,
|
|
||||||
handle_rect.center().y() - groove_rect.bottom(),
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
|
|
||||||
sub_rect.setLeft(x)
|
|
||||||
sub_rect.setWidth(thickness)
|
|
||||||
|
|
||||||
painter.drawRect(sub_rect)
|
|
||||||
painter.restore()
|
|
||||||
|
|
||||||
# Qt redessine le slider (handle au-dessus)
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
return
|
|
||||||
|
|
||||||
super().drawComplexControl(control, option, painter, widget)
|
|
||||||
226
src/mainwindow.py
Normal file
226
src/mainwindow.py
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import webbrowser
|
||||||
|
from pathlib import Path
|
||||||
|
from PySide6 import QtGui
|
||||||
|
from PySide6.QtCore import Qt, QPropertyAnimation, QEasingCurve, QResource, QFile, QBuffer, QByteArray, QIODevice
|
||||||
|
from PySide6.QtGui import QFontDatabase, QFont, QColor
|
||||||
|
from PySide6.QtUiTools import QUiLoader
|
||||||
|
from PySide6.QtWidgets import QMainWindow, QApplication, QGraphicsDropShadowEffect
|
||||||
|
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
|
||||||
|
|
||||||
|
# Compile resources.qrc into resources_rc.py
|
||||||
|
# rcc -g python .\resources.qrc -o .\src\resources_rc.py
|
||||||
|
|
||||||
|
import resources as resources # This is generated from the .qrc file # noqa: F401
|
||||||
|
|
||||||
|
# Remove this into final release
|
||||||
|
from fake_patch_notes import patch_note
|
||||||
|
|
||||||
|
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
|
||||||
|
bundle_dir = Path(sys._MEIPASS)
|
||||||
|
else:
|
||||||
|
bundle_dir = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
|
# charger le fichier rcc compilé
|
||||||
|
QResource.registerResource(f"{bundle_dir}/resources.py")
|
||||||
|
|
||||||
|
NO_STAFF = True
|
||||||
|
CURRENT = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
def load_custom_font() -> str:
|
||||||
|
# Load font from Qt resource
|
||||||
|
font_id = QFontDatabase.addApplicationFont(":/assets/Avocado-Cake-Demo.otf")
|
||||||
|
if font_id == -1:
|
||||||
|
raise RuntimeError("Failed to load font from resources.")
|
||||||
|
|
||||||
|
# Get the family name of the loaded font
|
||||||
|
font_families = QFontDatabase.applicationFontFamilies(font_id)
|
||||||
|
if not font_families:
|
||||||
|
raise RuntimeError("No font families found in the loaded font.")
|
||||||
|
return font_families[0]
|
||||||
|
|
||||||
|
class MainWindow(QMainWindow):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.ui = QUiLoader().load(f"{bundle_dir}/ui/mainwindow.ui", self)
|
||||||
|
central = self.ui.centralWidget()
|
||||||
|
self.setCentralWidget(central)
|
||||||
|
|
||||||
|
# # Remove the title bar and window frame
|
||||||
|
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.Window)
|
||||||
|
# # Optional: Make background transparent (if you want rounded corners, etc.)
|
||||||
|
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
|
||||||
|
|
||||||
|
# Initialize audio
|
||||||
|
self.media_player = QMediaPlayer()
|
||||||
|
self.audio_output = QAudioOutput()
|
||||||
|
self.media_player.setAudioOutput(self.audio_output)
|
||||||
|
|
||||||
|
# Using mp3 in resource
|
||||||
|
mp3file = QFile(":/assets/the-beat-of-nature-122841.mp3")
|
||||||
|
mp3file.open(QFile.ReadOnly)
|
||||||
|
mp3data = mp3file.readAll()
|
||||||
|
mp3file.close()
|
||||||
|
|
||||||
|
# buffer mémoire
|
||||||
|
mp3buffer = QBuffer()
|
||||||
|
mp3buffer.setData(QByteArray(mp3data))
|
||||||
|
mp3buffer.open(QIODevice.ReadOnly)
|
||||||
|
self.mp3buffer = mp3buffer
|
||||||
|
|
||||||
|
self.media_player.setSourceDevice(self.mp3buffer)
|
||||||
|
|
||||||
|
# Optionnel : Définir la valeur initiale du slider (ici: 10%)
|
||||||
|
self.ui.audio_volume_adjust.setValue(10)
|
||||||
|
self.audio_output.setVolume(0.1)
|
||||||
|
|
||||||
|
# Initialisation de la mémoire du volume (par défaut 10%)
|
||||||
|
self.previous_volume = 10
|
||||||
|
self.is_muted = False
|
||||||
|
|
||||||
|
# Connexion du Slider
|
||||||
|
self.ui.audio_volume_adjust.valueChanged.connect(self.update_volume)
|
||||||
|
|
||||||
|
# Lancer la lecture (par exemple ici, ou dans une fonction)
|
||||||
|
self.media_player.play()
|
||||||
|
|
||||||
|
# Track mouse position for dragging
|
||||||
|
self._drag_pos = None
|
||||||
|
|
||||||
|
if NO_STAFF :
|
||||||
|
self.ui.staff_btn.hide()
|
||||||
|
self.ui.spacer_substitution.hide()
|
||||||
|
|
||||||
|
self.ui.info_text.setMarkdown(patch_note)
|
||||||
|
|
||||||
|
# 1. Création de l'effet de lueur intense
|
||||||
|
self.ui.connexion_btn.glow = QGraphicsDropShadowEffect(self.ui.connexion_btn)
|
||||||
|
self.ui.connexion_btn.glow.setBlurRadius(20) # Point de départ
|
||||||
|
self.ui.connexion_btn.glow.setOffset(0, 0) # Centré
|
||||||
|
self.ui.connexion_btn.glow.setColor(QColor(255, 140, 0, 255)) # Orange pur (Alpha max)
|
||||||
|
#self.ui.connexion_btn.setGraphicsEffect(self.ui.connexion_btn.glow)
|
||||||
|
|
||||||
|
# 2. Animation du "Pulse" avec une grande amplitude
|
||||||
|
self.ui.connexion_btn.pulse_anim = QPropertyAnimation(self.ui.connexion_btn.glow, b"blurRadius")
|
||||||
|
self.ui.connexion_btn.pulse_anim.setDuration(1200) # Un peu plus rapide pour le dynamisme
|
||||||
|
self.ui.connexion_btn.pulse_anim.setStartValue(15) # Lueur de base
|
||||||
|
self.ui.connexion_btn.pulse_anim.setKeyValueAt(0.5, 70) # Lueur d'explosion (très large)
|
||||||
|
self.ui.connexion_btn.pulse_anim.setEndValue(15)
|
||||||
|
|
||||||
|
self.ui.connexion_btn.pulse_anim.setEasingCurve(QEasingCurve.InOutQuad)
|
||||||
|
self.ui.connexion_btn.pulse_anim.setLoopCount(-1)
|
||||||
|
#self.ui.connexion_btn.pulse_anim.start()
|
||||||
|
|
||||||
|
# Find the button by its objectName in Qt Designer
|
||||||
|
# Example: objectName = "close_btn"
|
||||||
|
self.ui.close_btn.clicked.connect(self.close)
|
||||||
|
self.ui.minimize_btn.clicked.connect(self.showMinimized)
|
||||||
|
self.ui.connexion_btn.clicked.connect(self.connexion_btn_link)
|
||||||
|
self.ui.discord_btn.clicked.connect(self.discord_btn_link)
|
||||||
|
self.ui.intranet_btn.clicked.connect(self.intranet_btn_link)
|
||||||
|
self.ui.mute_btn.clicked.connect(self.mute_btn_link)
|
||||||
|
|
||||||
|
#self.show()
|
||||||
|
|
||||||
|
# On centre la fenêtre avant de l'afficher
|
||||||
|
self.center_window()
|
||||||
|
self.show()
|
||||||
|
|
||||||
|
def center_window(self):
|
||||||
|
# On s'assure que la fenêtre a calculé sa taille
|
||||||
|
self.adjustSize()
|
||||||
|
|
||||||
|
screen = QtGui.QGuiApplication.screenAt(QtGui.QCursor.pos())
|
||||||
|
if not screen:
|
||||||
|
screen = QtGui.QGuiApplication.primaryScreen()
|
||||||
|
|
||||||
|
screen_geometry = screen.availableGeometry()
|
||||||
|
|
||||||
|
# On utilise frameGeometry() de la fenêtre elle-même
|
||||||
|
window_rect = self.frameGeometry()
|
||||||
|
window_rect.moveCenter(screen_geometry.center())
|
||||||
|
|
||||||
|
self.move(window_rect.topLeft())
|
||||||
|
|
||||||
|
# Mouse press event to start dragging
|
||||||
|
def mousePressEvent(self, event: QtGui.QMouseEvent) -> None:
|
||||||
|
if event.button() == Qt.MouseButton.LeftButton:
|
||||||
|
self._drag_pos = event.globalPosition().toPoint() - self.frameGeometry().topLeft()
|
||||||
|
super().mousePressEvent(event)
|
||||||
|
|
||||||
|
# Mouse move event to drag window
|
||||||
|
def mouseMoveEvent(self, event: QtGui.QMouseEvent) -> None:
|
||||||
|
if event.buttons() & Qt.MouseButton.LeftButton and self._drag_pos is not None:
|
||||||
|
self.move(event.globalPosition().toPoint() - self._drag_pos)
|
||||||
|
super().mouseMoveEvent(event)
|
||||||
|
|
||||||
|
# Mouse release event to stop dragging
|
||||||
|
def mouseReleaseEvent(self, event):
|
||||||
|
self._drag_pos = None
|
||||||
|
super().mouseReleaseEvent(event)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def connexion_btn_link():
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def discord_btn_link() -> None:
|
||||||
|
webbrowser.open('https://discord.gg/A7eanmSkp2')
|
||||||
|
return None
|
||||||
|
|
||||||
|
def intranet_btn_link(self) -> None:
|
||||||
|
webbrowser.open('https://la-taniere.fun/connexion/')
|
||||||
|
self.ui.connexion_btn.setGraphicsEffect(self.ui.connexion_btn.glow)
|
||||||
|
self.ui.connexion_btn.pulse_anim.start()
|
||||||
|
return None
|
||||||
|
|
||||||
|
def update_volume(self, value):
|
||||||
|
# 'value' est l'entier venant du slider (ex: 0 à 100)
|
||||||
|
# On convertit en float pour QAudioOutput (0.0 à 1.0)
|
||||||
|
volume = value / 100.0
|
||||||
|
self.audio_output.setVolume(volume)
|
||||||
|
|
||||||
|
def mute_btn_link(self) -> None:
|
||||||
|
if not self.is_muted:
|
||||||
|
# --- PASSAGE EN MUTE ---
|
||||||
|
# On sauvegarde la valeur actuelle du slider
|
||||||
|
self.previous_volume = self.ui.audio_volume_adjust.value()
|
||||||
|
|
||||||
|
# On met le volume à 0 (moteur audio + interface)
|
||||||
|
self.audio_output.setVolume(0.0)
|
||||||
|
self.ui.audio_volume_adjust.setValue(0)
|
||||||
|
|
||||||
|
# Optionnel : changer l'icône ou le style du bouton
|
||||||
|
self.ui.mute_btn.setStyleSheet("background-color: red;")
|
||||||
|
|
||||||
|
self.is_muted = True
|
||||||
|
else:
|
||||||
|
# --- RETOUR DU SON ---
|
||||||
|
# On restaure le volume précédent
|
||||||
|
volume_float = self.previous_volume / 100.0
|
||||||
|
self.audio_output.setVolume(volume_float)
|
||||||
|
self.ui.audio_volume_adjust.setValue(self.previous_volume)
|
||||||
|
|
||||||
|
# Optionnel : remettre le style d'origine
|
||||||
|
self.ui.mute_btn.setStyleSheet("")
|
||||||
|
|
||||||
|
self.is_muted = False
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
|
with open(f"{bundle_dir}/styles/styles.qss", 'r') as f:
|
||||||
|
style = f.read()
|
||||||
|
|
||||||
|
# Load and set the global font
|
||||||
|
custom_font = QFont(load_custom_font(), 16)
|
||||||
|
if custom_font:
|
||||||
|
app.setFont(custom_font)
|
||||||
|
|
||||||
|
# Set the stylesheet of the application
|
||||||
|
app.setStyleSheet(style)
|
||||||
|
|
||||||
|
window = MainWindow()
|
||||||
|
|
||||||
|
sys.exit(app.exec())
|
||||||
374354
src/resources.py
Normal file
374354
src/resources.py
Normal file
File diff suppressed because it is too large
Load Diff
107
styles.qss
107
styles.qss
@@ -1,107 +0,0 @@
|
|||||||
QPushButton#connexion_btn {
|
|
||||||
border-radius: 15px;
|
|
||||||
background-color: rgb(255, 120, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QPushButton#connexion_btn:hover {
|
|
||||||
background: #ffad66;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPushButton#discord_btn,
|
|
||||||
QPushButton#intranet_btn
|
|
||||||
{
|
|
||||||
border-radius: 15px;
|
|
||||||
background-color: #203a43;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPushButton#close_btn {
|
|
||||||
border : 0;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPushButton#minimize_btn {
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
border-bottom: 5px solid white;
|
|
||||||
color: white;
|
|
||||||
font-size: 18px;
|
|
||||||
padding: 0px;
|
|
||||||
padding-top: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextEdit#info_text {
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
QSlider::groove:horizontal {
|
|
||||||
border: 1px solid #262626;
|
|
||||||
height: 10px;
|
|
||||||
}
|
|
||||||
QSlider::handle:horizontal {
|
|
||||||
background: rgb(236, 127, 43);
|
|
||||||
border: 1px solid rgb(236, 127, 43);
|
|
||||||
width: 23px;
|
|
||||||
border-radius: 3px;
|
|
||||||
height: 100px;
|
|
||||||
margin: -24px -12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSlider::sub-page:horizontal{
|
|
||||||
border:0px;
|
|
||||||
border-radius:6px;
|
|
||||||
background:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #12b9ff, stop: 1.0 #015eea);
|
|
||||||
}
|
|
||||||
|
|
||||||
QSlider::add-page:horizontal{
|
|
||||||
border:0px;
|
|
||||||
border-radius:6px;
|
|
||||||
background:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgb(146, 149, 150), stop: 1.0 rgb(253, 254, 254));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
QSlider::groove:horizontal {
|
|
||||||
border: 1px inset #1C1C1C;
|
|
||||||
height: 6px;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSlider::groove:horizontal {
|
|
||||||
border: 1px inset #1C1C1C;
|
|
||||||
height: 6px;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSlider::sub-page:horizontal {
|
|
||||||
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #12b9ff, stop: 1.0 #015eea);
|
|
||||||
border: 1px inset #1C1C1C;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* groove background on right of slider */
|
|
||||||
QSlider::add-page:horizontal {
|
|
||||||
background: #7D7D7D;
|
|
||||||
border: 1px outset #1C1C1C;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSlider::handle:horizontal {
|
|
||||||
background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 rgb(241, 160, 61), stop:1 rgb(233, 111, 29));
|
|
||||||
border: 1px solid rgb(213, 125, 2);
|
|
||||||
width: 12px;
|
|
||||||
height: 10px;
|
|
||||||
margin-top: -8px;
|
|
||||||
margin-bottom: -8px;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget#main_container{
|
|
||||||
background: qlineargradient(
|
|
||||||
x1:0, y1:0,
|
|
||||||
x2:0, y2:0,
|
|
||||||
stop: 0 rgba(32, 49, 103, 180),
|
|
||||||
stop: 1 rgba(103, 49, 32, 80)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
180
styles/styles.qss
Normal file
180
styles/styles.qss
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
#main_container {
|
||||||
|
border-radius: 30px;
|
||||||
|
/*background-image: url(:/assets/background.png);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center; */
|
||||||
|
/*background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
|
||||||
|
stop: 0 #050a0f,
|
||||||
|
stop: 1 #0f172a);*/
|
||||||
|
background: qradialgradient(cx:0.5, cy:0.5, radius:0.8, fx:0.5, fy:0.5,
|
||||||
|
stop: 0 #16213e,
|
||||||
|
stop: 1 #0a0e14);
|
||||||
|
|
||||||
|
/*background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
|
||||||
|
stop: 0 #0d1117,
|
||||||
|
stop: 0.7 #0d1117,
|
||||||
|
stop: 1 #1e3a8a); /* Une pointe de bleu plus vif en bas à droite */
|
||||||
|
}
|
||||||
|
|
||||||
|
QFrame#logo_frame {
|
||||||
|
background-image: url(:/assets/logo.png);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#maintitle_label {
|
||||||
|
font-size: 38px;
|
||||||
|
color: rgb(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#subtitle_label {
|
||||||
|
color: rgb(163, 177, 198);
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#queue_position {
|
||||||
|
font-size: 36px;
|
||||||
|
color: rgb(17, 248, 183);
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#queue_lbl {
|
||||||
|
color: rgb(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#connexion_btn {
|
||||||
|
/* border-radius: 15px;
|
||||||
|
background-color: rgb(255, 120, 0);
|
||||||
|
color: rgb(255, 255, 255); */
|
||||||
|
/* Dégradé chaleureux : Orange vers Orange-Rouge */
|
||||||
|
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
|
||||||
|
stop: 0 #ff9d00,
|
||||||
|
stop: 1 #f56100);
|
||||||
|
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 1px solid #b34700;
|
||||||
|
color: white;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#connexion_btn:hover {
|
||||||
|
/* background: #ffad66; */
|
||||||
|
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
|
||||||
|
stop: 0 #ffb338,
|
||||||
|
stop: 1 #ff7a29);
|
||||||
|
border: 1px solid #ffcc80;
|
||||||
|
/* Un léger halo autour du bouton */
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#connexionBtn:pressed {
|
||||||
|
background: #cc5200;
|
||||||
|
padding-top: 12px; /* Effet d'enfoncement */
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#discord_btn,
|
||||||
|
QPushButton#intranet_btn
|
||||||
|
{
|
||||||
|
/*border-radius: 15px;
|
||||||
|
background-color: rgb(32, 58, 67);
|
||||||
|
color: rgb(255, 255, 255);*/
|
||||||
|
background-color: rgba(32, 58, 67, 0.6); /* Bleu très sombre semi-transparent */
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #e2e8f0;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 8px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#discord_btn:hover {
|
||||||
|
background-color: rgba(88, 101, 242, 0.4); /* Fond bleu Discord translucide */
|
||||||
|
border: 2px solid #7289da; /* Bordure plus épaisse et claire pour l'éclat */
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#intranet_btn:hover {
|
||||||
|
/* background: rgb(68, 124, 143); */
|
||||||
|
background-color: rgba(0, 242, 255, 0.15); /* Teinte turquoise légère en fond */
|
||||||
|
border: 2px solid #00f2ff; /* Bordure turquoise vive et épaisse */
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#discordBtn:pressed, QPushButton#intranetBtn:pressed {
|
||||||
|
background-color: #0f172a;
|
||||||
|
padding-top: 10px; /* Petit effet d'enfoncement */
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#mute_btn {
|
||||||
|
border-radius: 15px;
|
||||||
|
background-color: rgb(255, 120, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#close_btn {
|
||||||
|
border : 0;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton#minimize_btn {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
border-bottom: 5px solid white;
|
||||||
|
color: white;
|
||||||
|
font-size: 18px;
|
||||||
|
padding: 0px;
|
||||||
|
padding-top: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
QFrame#info_frame{
|
||||||
|
background: qlineargradient(
|
||||||
|
x1:0, y1:0,
|
||||||
|
x2:0, y2:1,
|
||||||
|
stop:0 rgba(255,255,255,30),
|
||||||
|
stop:1 rgba(255,255,255,30)
|
||||||
|
);
|
||||||
|
border-radius: 20px;
|
||||||
|
border: 1px solid rgba(255,255,255,140);
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextEdit#info_text {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
color: rgb(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
QSlider::groove:horizontal {
|
||||||
|
border: 1px inset #1C1C1C;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSlider::groove:horizontal {
|
||||||
|
border: 1px inset #1C1C1C;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSlider::sub-page:horizontal {
|
||||||
|
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #12b9ff, stop: 1.0 #015eea);
|
||||||
|
border: 1px inset #1C1C1C;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* groove background on right of slider */
|
||||||
|
QSlider::add-page:horizontal {
|
||||||
|
background: #7D7D7D;
|
||||||
|
border: 1px outset #1C1C1C;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSlider::handle:horizontal {
|
||||||
|
/*background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 rgb(78, 195, 146), stop:1 rgb(57, 144, 107));
|
||||||
|
border: 1px solid rgb(78, 195, 146);
|
||||||
|
width: 12px;
|
||||||
|
height: 10px;
|
||||||
|
margin-top: -8px;
|
||||||
|
margin-bottom: -8px;
|
||||||
|
border-radius: 2px;*/
|
||||||
|
background: transparent;
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
image: none;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
@@ -38,12 +38,9 @@
|
|||||||
<string>MainWindow</string>
|
<string>MainWindow</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowIcon">
|
<property name="windowIcon">
|
||||||
<iconset resource="resources.qrc">
|
<iconset resource="../resources.qrc">
|
||||||
<normaloff>:/assets/Icone.ico</normaloff>:/assets/Icone.ico</iconset>
|
<normaloff>:/assets/Icone.ico</normaloff>:/assets/Icone.ico</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="main_container">
|
<widget class="QWidget" name="main_container">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
@@ -57,11 +54,6 @@
|
|||||||
<height>703</height>
|
<height>703</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">#main_container {
|
|
||||||
border-radius: 30px;
|
|
||||||
}</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
@@ -186,7 +178,7 @@
|
|||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="resources.qrc">
|
<iconset resource="../resources.qrc">
|
||||||
<normaloff>:/assets/system-shutdown.png</normaloff>:/assets/system-shutdown.png</iconset>
|
<normaloff>:/assets/system-shutdown.png</normaloff>:/assets/system-shutdown.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize">
|
<property name="iconSize">
|
||||||
@@ -230,9 +222,6 @@
|
|||||||
<height>658</height>
|
<height>658</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::Shape::NoFrame</enum>
|
<enum>QFrame::Shape::NoFrame</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -292,14 +281,7 @@
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame">
|
<widget class="QFrame" name="logo_frame">
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">#frame{
|
|
||||||
background-image: url(:/assets/logo.png);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
}</string>
|
|
||||||
</property>
|
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::Shape::NoFrame</enum>
|
<enum>QFrame::Shape::NoFrame</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -366,37 +348,25 @@
|
|||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_8">
|
<layout class="QHBoxLayout" name="horizontalLayout_8">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="queue_lbl">
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Position en file d'attente: </string>
|
<string>Position en file d'attente: </string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLCDNumber" name="lcdNumber">
|
<widget class="QLabel" name="queue_position">
|
||||||
<property name="maximumSize">
|
<property name="text">
|
||||||
<size>
|
<string>20</string>
|
||||||
<width>70</width>
|
|
||||||
<height>50</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="layoutDirection">
|
<property name="alignment">
|
||||||
<enum>Qt::LayoutDirection::RightToLeft</enum>
|
<set>Qt::AlignmentFlag::AlignCenter</set>
|
||||||
</property>
|
|
||||||
<property name="frameShadow">
|
|
||||||
<enum>QFrame::Shadow::Sunken</enum>
|
|
||||||
</property>
|
|
||||||
<property name="smallDecimalPoint">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="digitCount">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="value" stdset="0">
|
|
||||||
<double>20.000000000000000</double>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -453,7 +423,7 @@
|
|||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSlider" name="horizontalSlider">
|
<widget class="QSlider" name="audio_volume_adjust">
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
@@ -472,12 +442,22 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="pushButton">
|
<widget class="QPushButton" name="mute_btn">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="QIcon::ThemeIcon::AudioVolumeHigh"/>
|
<iconset resource="../resources.qrc">
|
||||||
|
<normaloff>:/assets/sound-speaker.svg</normaloff>:/assets/sound-speaker.svg</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="flat">
|
||||||
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -584,7 +564,7 @@
|
|||||||
<item alignment="Qt::AlignmentFlag::AlignHCenter">
|
<item alignment="Qt::AlignmentFlag::AlignHCenter">
|
||||||
<widget class="QLabel" name="maintitle_label">
|
<widget class="QLabel" name="maintitle_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>la taniere</string>
|
<string>LA TANIÈRE</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -613,7 +593,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>un espace pour se retrouver</string>
|
<string>Un espace pour se retrouver</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat">
|
<property name="textFormat">
|
||||||
<enum>Qt::TextFormat::AutoText</enum>
|
<enum>Qt::TextFormat::AutoText</enum>
|
||||||
@@ -689,7 +669,17 @@
|
|||||||
<string notr="true"/>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>connexion</string>
|
<string> Connexion</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../resources.qrc">
|
||||||
|
<normaloff>:/assets/padlock-lock.svg</normaloff>:/assets/padlock-lock.svg</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -761,7 +751,17 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>discord</string>
|
<string> Discord</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../resources.qrc">
|
||||||
|
<normaloff>:/assets/Logo_Discord_2015.png</normaloff>:/assets/Logo_Discord_2015.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -787,7 +787,17 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>intranet</string>
|
<string> Intranet</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../resources.qrc">
|
||||||
|
<normaloff>:/assets/computer-tv.svg</normaloff>:/assets/computer-tv.svg</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -846,16 +856,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QFrame#info_frame{
|
<string notr="true"/>
|
||||||
background: qlineargradient(
|
|
||||||
x1:0, y1:0,
|
|
||||||
x2:0, y2:1,
|
|
||||||
stop:0 rgba(255,255,255,30),
|
|
||||||
stop:1 rgba(255,255,255,30)
|
|
||||||
);
|
|
||||||
border-radius: 20px;
|
|
||||||
border: 1px solid rgba(255,255,255,140);
|
|
||||||
}</string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::Shape::StyledPanel</enum>
|
<enum>QFrame::Shape::StyledPanel</enum>
|
||||||
@@ -897,7 +898,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="resources.qrc"/>
|
<include location="../resources.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
395
ui/mainwindow_ui.py
Normal file
395
ui/mainwindow_ui.py
Normal file
@@ -0,0 +1,395 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
## Form generated from reading UI file 'mainwindowdJHBSQ.ui'
|
||||||
|
##
|
||||||
|
## Created by: Qt User Interface Compiler version 6.10.2
|
||||||
|
##
|
||||||
|
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
import resources_rc
|
||||||
|
from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize, Qt)
|
||||||
|
from PySide6.QtGui import (QIcon)
|
||||||
|
from PySide6.QtWidgets import (QFrame, QHBoxLayout, QLabel,
|
||||||
|
QPushButton, QSizePolicy, QSlider,
|
||||||
|
QSpacerItem, QTextEdit, QVBoxLayout, QWidget)
|
||||||
|
|
||||||
|
|
||||||
|
class Ui_MainWindow(object):
|
||||||
|
def setupUi(self, MainWindow):
|
||||||
|
if not MainWindow.objectName():
|
||||||
|
MainWindow.setObjectName(u"MainWindow")
|
||||||
|
MainWindow.setWindowModality(Qt.WindowModality.ApplicationModal)
|
||||||
|
MainWindow.resize(1199, 703)
|
||||||
|
sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
|
||||||
|
MainWindow.setSizePolicy(sizePolicy)
|
||||||
|
MainWindow.setMinimumSize(QSize(1199, 703))
|
||||||
|
MainWindow.setMaximumSize(QSize(1199, 703))
|
||||||
|
MainWindow.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)
|
||||||
|
icon = QIcon()
|
||||||
|
icon.addFile(u":/assets/Icone.ico", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
|
||||||
|
MainWindow.setWindowIcon(icon)
|
||||||
|
self.main_container = QWidget(MainWindow)
|
||||||
|
self.main_container.setObjectName(u"main_container")
|
||||||
|
self.main_container.setMinimumSize(QSize(1199, 703))
|
||||||
|
self.main_container.setMaximumSize(QSize(1199, 703))
|
||||||
|
self.verticalLayout = QVBoxLayout(self.main_container)
|
||||||
|
self.verticalLayout.setSpacing(0)
|
||||||
|
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||||
|
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.title_bar = QFrame(self.main_container)
|
||||||
|
self.title_bar.setObjectName(u"title_bar")
|
||||||
|
self.title_bar.setMinimumSize(QSize(1199, 50))
|
||||||
|
self.title_bar.setMaximumSize(QSize(1199, 50))
|
||||||
|
self.title_bar.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.title_bar.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.horizontalLayout = QHBoxLayout(self.title_bar)
|
||||||
|
self.horizontalLayout.setSpacing(0)
|
||||||
|
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
||||||
|
self.horizontalLayout.setContentsMargins(0, 9, 0, 0)
|
||||||
|
self.horizontalSpacer = QSpacerItem(1006, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout.addItem(self.horizontalSpacer)
|
||||||
|
|
||||||
|
self.minimize_btn = QPushButton(self.title_bar)
|
||||||
|
self.minimize_btn.setObjectName(u"minimize_btn")
|
||||||
|
self.minimize_btn.setMinimumSize(QSize(0, 0))
|
||||||
|
self.minimize_btn.setMaximumSize(QSize(25, 25))
|
||||||
|
self.minimize_btn.setStyleSheet(u"")
|
||||||
|
self.minimize_btn.setIconSize(QSize(32, 32))
|
||||||
|
|
||||||
|
self.horizontalLayout.addWidget(self.minimize_btn)
|
||||||
|
|
||||||
|
self.horizontalSpacer_2 = QSpacerItem(20, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout.addItem(self.horizontalSpacer_2)
|
||||||
|
|
||||||
|
self.close_btn = QPushButton(self.title_bar)
|
||||||
|
self.close_btn.setObjectName(u"close_btn")
|
||||||
|
self.close_btn.setMaximumSize(QSize(42, 42))
|
||||||
|
self.close_btn.setStyleSheet(u"")
|
||||||
|
icon1 = QIcon()
|
||||||
|
icon1.addFile(u":/assets/system-shutdown.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
|
||||||
|
self.close_btn.setIcon(icon1)
|
||||||
|
self.close_btn.setIconSize(QSize(32, 32))
|
||||||
|
|
||||||
|
self.horizontalLayout.addWidget(self.close_btn)
|
||||||
|
|
||||||
|
self.horizontalSpacer_3 = QSpacerItem(30, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout.addItem(self.horizontalSpacer_3)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout.addWidget(self.title_bar)
|
||||||
|
|
||||||
|
self.frame_2 = QFrame(self.main_container)
|
||||||
|
self.frame_2.setObjectName(u"frame_2")
|
||||||
|
self.frame_2.setMinimumSize(QSize(1199, 0))
|
||||||
|
self.frame_2.setMaximumSize(QSize(1199, 658))
|
||||||
|
self.frame_2.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.frame_2.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.horizontalLayout_2 = QHBoxLayout(self.frame_2)
|
||||||
|
self.horizontalLayout_2.setSpacing(0)
|
||||||
|
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
||||||
|
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.left_column = QFrame(self.frame_2)
|
||||||
|
self.left_column.setObjectName(u"left_column")
|
||||||
|
self.left_column.setMinimumSize(QSize(450, 630))
|
||||||
|
self.left_column.setMaximumSize(QSize(450, 630))
|
||||||
|
self.left_column.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.left_column.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.verticalLayout_5 = QVBoxLayout(self.left_column)
|
||||||
|
self.verticalLayout_5.setSpacing(0)
|
||||||
|
self.verticalLayout_5.setObjectName(u"verticalLayout_5")
|
||||||
|
self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.frame = QFrame(self.left_column)
|
||||||
|
self.frame.setObjectName(u"frame")
|
||||||
|
self.frame.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.frame.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
|
||||||
|
self.verticalLayout_5.addWidget(self.frame)
|
||||||
|
|
||||||
|
self.frame_3 = QFrame(self.left_column)
|
||||||
|
self.frame_3.setObjectName(u"frame_3")
|
||||||
|
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
|
||||||
|
sizePolicy1.setHorizontalStretch(0)
|
||||||
|
sizePolicy1.setVerticalStretch(0)
|
||||||
|
sizePolicy1.setHeightForWidth(self.frame_3.sizePolicy().hasHeightForWidth())
|
||||||
|
self.frame_3.setSizePolicy(sizePolicy1)
|
||||||
|
self.frame_3.setMinimumSize(QSize(0, 100))
|
||||||
|
self.frame_3.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.frame_3.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.horizontalLayout_6 = QHBoxLayout(self.frame_3)
|
||||||
|
self.horizontalLayout_6.setSpacing(0)
|
||||||
|
self.horizontalLayout_6.setObjectName(u"horizontalLayout_6")
|
||||||
|
self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.frame_5 = QFrame(self.frame_3)
|
||||||
|
self.frame_5.setObjectName(u"frame_5")
|
||||||
|
sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
|
||||||
|
sizePolicy2.setHorizontalStretch(0)
|
||||||
|
sizePolicy2.setVerticalStretch(0)
|
||||||
|
sizePolicy2.setHeightForWidth(self.frame_5.sizePolicy().hasHeightForWidth())
|
||||||
|
self.frame_5.setSizePolicy(sizePolicy2)
|
||||||
|
self.frame_5.setMinimumSize(QSize(0, 0))
|
||||||
|
self.frame_5.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.frame_5.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.horizontalLayout_8 = QHBoxLayout(self.frame_5)
|
||||||
|
self.horizontalLayout_8.setObjectName(u"horizontalLayout_8")
|
||||||
|
self.queue_lbl = QLabel(self.frame_5)
|
||||||
|
self.queue_lbl.setObjectName(u"queue_lbl")
|
||||||
|
self.queue_lbl.setAutoFillBackground(False)
|
||||||
|
self.queue_lbl.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||||
|
|
||||||
|
self.horizontalLayout_8.addWidget(self.queue_lbl)
|
||||||
|
|
||||||
|
self.queue_position = QLabel(self.frame_5)
|
||||||
|
self.queue_position.setObjectName(u"queue_position")
|
||||||
|
self.queue_position.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||||
|
|
||||||
|
self.horizontalLayout_8.addWidget(self.queue_position)
|
||||||
|
|
||||||
|
self.horizontalSpacer_5 = QSpacerItem(80, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout_8.addItem(self.horizontalSpacer_5)
|
||||||
|
|
||||||
|
|
||||||
|
self.horizontalLayout_6.addWidget(self.frame_5)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout_5.addWidget(self.frame_3)
|
||||||
|
|
||||||
|
self.frame_4 = QFrame(self.left_column)
|
||||||
|
self.frame_4.setObjectName(u"frame_4")
|
||||||
|
sizePolicy1.setHeightForWidth(self.frame_4.sizePolicy().hasHeightForWidth())
|
||||||
|
self.frame_4.setSizePolicy(sizePolicy1)
|
||||||
|
self.frame_4.setMinimumSize(QSize(0, 0))
|
||||||
|
self.frame_4.setMaximumSize(QSize(16777215, 50))
|
||||||
|
self.frame_4.setStyleSheet(u"")
|
||||||
|
self.frame_4.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.frame_4.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.horizontalLayout_7 = QHBoxLayout(self.frame_4)
|
||||||
|
self.horizontalLayout_7.setObjectName(u"horizontalLayout_7")
|
||||||
|
self.horizontalSlider = QSlider(self.frame_4)
|
||||||
|
self.horizontalSlider.setObjectName(u"horizontalSlider")
|
||||||
|
self.horizontalSlider.setAutoFillBackground(False)
|
||||||
|
self.horizontalSlider.setStyleSheet(u"")
|
||||||
|
self.horizontalSlider.setValue(20)
|
||||||
|
self.horizontalSlider.setOrientation(Qt.Orientation.Horizontal)
|
||||||
|
self.horizontalSlider.setInvertedAppearance(False)
|
||||||
|
|
||||||
|
self.horizontalLayout_7.addWidget(self.horizontalSlider)
|
||||||
|
|
||||||
|
self.volume_btn = QPushButton(self.frame_4)
|
||||||
|
self.volume_btn.setObjectName(u"volume_btn")
|
||||||
|
self.volume_btn.setMinimumSize(QSize(32, 32))
|
||||||
|
icon2 = QIcon()
|
||||||
|
icon2.addFile(u":/assets/sound-speaker.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
|
||||||
|
self.volume_btn.setIcon(icon2)
|
||||||
|
self.volume_btn.setFlat(True)
|
||||||
|
|
||||||
|
self.horizontalLayout_7.addWidget(self.volume_btn)
|
||||||
|
|
||||||
|
self.horizontalSpacer_10 = QSpacerItem(180, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout_7.addItem(self.horizontalSpacer_10)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout_5.addWidget(self.frame_4)
|
||||||
|
|
||||||
|
|
||||||
|
self.horizontalLayout_2.addWidget(self.left_column)
|
||||||
|
|
||||||
|
self.right_column = QFrame(self.frame_2)
|
||||||
|
self.right_column.setObjectName(u"right_column")
|
||||||
|
sizePolicy2.setHeightForWidth(self.right_column.sizePolicy().hasHeightForWidth())
|
||||||
|
self.right_column.setSizePolicy(sizePolicy2)
|
||||||
|
self.right_column.setMinimumSize(QSize(0, 650))
|
||||||
|
self.right_column.setMaximumSize(QSize(700, 650))
|
||||||
|
self.right_column.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.right_column.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.verticalLayout_2 = QVBoxLayout(self.right_column)
|
||||||
|
self.verticalLayout_2.setSpacing(0)
|
||||||
|
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
|
||||||
|
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.title_frame = QFrame(self.right_column)
|
||||||
|
self.title_frame.setObjectName(u"title_frame")
|
||||||
|
sizePolicy1.setHeightForWidth(self.title_frame.sizePolicy().hasHeightForWidth())
|
||||||
|
self.title_frame.setSizePolicy(sizePolicy1)
|
||||||
|
self.title_frame.setMinimumSize(QSize(0, 140))
|
||||||
|
self.title_frame.setMaximumSize(QSize(16777215, 180))
|
||||||
|
self.title_frame.setStyleSheet(u"")
|
||||||
|
self.title_frame.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.title_frame.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.verticalLayout_3 = QVBoxLayout(self.title_frame)
|
||||||
|
self.verticalLayout_3.setSpacing(0)
|
||||||
|
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
|
||||||
|
self.verticalLayout_3.setContentsMargins(-1, -1, -1, 9)
|
||||||
|
self.maintitle_label = QLabel(self.title_frame)
|
||||||
|
self.maintitle_label.setObjectName(u"maintitle_label")
|
||||||
|
|
||||||
|
self.verticalLayout_3.addWidget(self.maintitle_label, 0, Qt.AlignmentFlag.AlignHCenter)
|
||||||
|
|
||||||
|
self.verticalSpacer = QSpacerItem(20, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
|
||||||
|
|
||||||
|
self.verticalLayout_3.addItem(self.verticalSpacer)
|
||||||
|
|
||||||
|
self.subtitle_label = QLabel(self.title_frame)
|
||||||
|
self.subtitle_label.setObjectName(u"subtitle_label")
|
||||||
|
self.subtitle_label.setMinimumSize(QSize(0, 0))
|
||||||
|
self.subtitle_label.setTextFormat(Qt.TextFormat.AutoText)
|
||||||
|
self.subtitle_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||||
|
|
||||||
|
self.verticalLayout_3.addWidget(self.subtitle_label)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout_2.addWidget(self.title_frame, 0, Qt.AlignmentFlag.AlignHCenter)
|
||||||
|
|
||||||
|
self.btn_frame = QFrame(self.right_column)
|
||||||
|
self.btn_frame.setObjectName(u"btn_frame")
|
||||||
|
sizePolicy1.setHeightForWidth(self.btn_frame.sizePolicy().hasHeightForWidth())
|
||||||
|
self.btn_frame.setSizePolicy(sizePolicy1)
|
||||||
|
self.btn_frame.setMinimumSize(QSize(0, 150))
|
||||||
|
self.btn_frame.setMaximumSize(QSize(16777215, 150))
|
||||||
|
self.btn_frame.setStyleSheet(u"")
|
||||||
|
self.btn_frame.setFrameShape(QFrame.Shape.NoFrame)
|
||||||
|
self.btn_frame.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.verticalLayout_4 = QVBoxLayout(self.btn_frame)
|
||||||
|
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
|
||||||
|
self.horizontalLayout_3 = QHBoxLayout()
|
||||||
|
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
|
||||||
|
self.horizontalSpacer_4 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout_3.addItem(self.horizontalSpacer_4)
|
||||||
|
|
||||||
|
self.connexion_btn = QPushButton(self.btn_frame)
|
||||||
|
self.connexion_btn.setObjectName(u"connexion_btn")
|
||||||
|
self.connexion_btn.setMinimumSize(QSize(250, 50))
|
||||||
|
self.connexion_btn.setMaximumSize(QSize(16777215, 16777215))
|
||||||
|
self.connexion_btn.setStyleSheet(u"")
|
||||||
|
icon3 = QIcon()
|
||||||
|
icon3.addFile(u":/assets/padlock-lock.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
|
||||||
|
self.connexion_btn.setIcon(icon3)
|
||||||
|
self.connexion_btn.setIconSize(QSize(32, 32))
|
||||||
|
|
||||||
|
self.horizontalLayout_3.addWidget(self.connexion_btn)
|
||||||
|
|
||||||
|
self.spacer_substitution = QWidget(self.btn_frame)
|
||||||
|
self.spacer_substitution.setObjectName(u"spacer_substitution")
|
||||||
|
self.spacer_substitution.setMinimumSize(QSize(53, 0))
|
||||||
|
|
||||||
|
self.horizontalLayout_3.addWidget(self.spacer_substitution)
|
||||||
|
|
||||||
|
self.staff_btn = QPushButton(self.btn_frame)
|
||||||
|
self.staff_btn.setObjectName(u"staff_btn")
|
||||||
|
self.staff_btn.setMinimumSize(QSize(250, 50))
|
||||||
|
self.staff_btn.setMaximumSize(QSize(16777215, 16777215))
|
||||||
|
|
||||||
|
self.horizontalLayout_3.addWidget(self.staff_btn)
|
||||||
|
|
||||||
|
self.horizontalSpacer_6 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout_3.addItem(self.horizontalSpacer_6)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout_4.addLayout(self.horizontalLayout_3)
|
||||||
|
|
||||||
|
self.horizontalLayout_4 = QHBoxLayout()
|
||||||
|
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
|
||||||
|
self.horizontalSpacer_7 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout_4.addItem(self.horizontalSpacer_7)
|
||||||
|
|
||||||
|
self.discord_btn = QPushButton(self.btn_frame)
|
||||||
|
self.discord_btn.setObjectName(u"discord_btn")
|
||||||
|
self.discord_btn.setMinimumSize(QSize(250, 50))
|
||||||
|
icon4 = QIcon()
|
||||||
|
icon4.addFile(u":/assets/Logo_Discord_2015.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
|
||||||
|
self.discord_btn.setIcon(icon4)
|
||||||
|
self.discord_btn.setIconSize(QSize(32, 32))
|
||||||
|
|
||||||
|
self.horizontalLayout_4.addWidget(self.discord_btn)
|
||||||
|
|
||||||
|
self.horizontalSpacer_8 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout_4.addItem(self.horizontalSpacer_8)
|
||||||
|
|
||||||
|
self.intranet_btn = QPushButton(self.btn_frame)
|
||||||
|
self.intranet_btn.setObjectName(u"intranet_btn")
|
||||||
|
self.intranet_btn.setMinimumSize(QSize(250, 50))
|
||||||
|
icon5 = QIcon()
|
||||||
|
icon5.addFile(u":/assets/computer-tv.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
|
||||||
|
self.intranet_btn.setIcon(icon5)
|
||||||
|
self.intranet_btn.setIconSize(QSize(32, 32))
|
||||||
|
|
||||||
|
self.horizontalLayout_4.addWidget(self.intranet_btn)
|
||||||
|
|
||||||
|
self.horizontalSpacer_9 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||||
|
|
||||||
|
self.horizontalLayout_4.addItem(self.horizontalSpacer_9)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout_4.addLayout(self.horizontalLayout_4)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout_2.addWidget(self.btn_frame)
|
||||||
|
|
||||||
|
self.verticalSpacer_3 = QSpacerItem(20, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
|
||||||
|
|
||||||
|
self.verticalLayout_2.addItem(self.verticalSpacer_3)
|
||||||
|
|
||||||
|
self.info_frame = QFrame(self.right_column)
|
||||||
|
self.info_frame.setObjectName(u"info_frame")
|
||||||
|
sizePolicy1.setHeightForWidth(self.info_frame.sizePolicy().hasHeightForWidth())
|
||||||
|
self.info_frame.setSizePolicy(sizePolicy1)
|
||||||
|
self.info_frame.setMinimumSize(QSize(0, 310))
|
||||||
|
self.info_frame.setMaximumSize(QSize(16777215, 280))
|
||||||
|
self.info_frame.setStyleSheet(u"")
|
||||||
|
self.info_frame.setFrameShape(QFrame.Shape.StyledPanel)
|
||||||
|
self.info_frame.setFrameShadow(QFrame.Shadow.Raised)
|
||||||
|
self.horizontalLayout_5 = QHBoxLayout(self.info_frame)
|
||||||
|
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
|
||||||
|
self.info_text = QTextEdit(self.info_frame)
|
||||||
|
self.info_text.setObjectName(u"info_text")
|
||||||
|
self.info_text.setReadOnly(True)
|
||||||
|
|
||||||
|
self.horizontalLayout_5.addWidget(self.info_text)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout_2.addWidget(self.info_frame)
|
||||||
|
|
||||||
|
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
||||||
|
|
||||||
|
self.verticalLayout_2.addItem(self.verticalSpacer_2)
|
||||||
|
|
||||||
|
|
||||||
|
self.horizontalLayout_2.addWidget(self.right_column)
|
||||||
|
|
||||||
|
|
||||||
|
self.verticalLayout.addWidget(self.frame_2)
|
||||||
|
|
||||||
|
MainWindow.setCentralWidget(self.main_container)
|
||||||
|
|
||||||
|
self.retranslateUi(MainWindow)
|
||||||
|
|
||||||
|
QMetaObject.connectSlotsByName(MainWindow)
|
||||||
|
# setupUi
|
||||||
|
|
||||||
|
def retranslateUi(self, MainWindow):
|
||||||
|
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
|
||||||
|
self.minimize_btn.setText("")
|
||||||
|
self.close_btn.setText("")
|
||||||
|
self.queue_lbl.setText(QCoreApplication.translate("MainWindow", u"Position en file d'attente: ", None))
|
||||||
|
self.queue_position.setText(QCoreApplication.translate("MainWindow", u"20", None))
|
||||||
|
self.volume_btn.setText("")
|
||||||
|
self.maintitle_label.setText(QCoreApplication.translate("MainWindow", u"LA TANI\u00c8RE", None))
|
||||||
|
self.subtitle_label.setText(QCoreApplication.translate("MainWindow", u"Un espace pour se retrouver", None))
|
||||||
|
self.connexion_btn.setText(QCoreApplication.translate("MainWindow", u" Connexion", None))
|
||||||
|
self.staff_btn.setText(QCoreApplication.translate("MainWindow", u"staff", None))
|
||||||
|
self.discord_btn.setText(QCoreApplication.translate("MainWindow", u" Discord", None))
|
||||||
|
self.intranet_btn.setText(QCoreApplication.translate("MainWindow", u" Intranet", None))
|
||||||
|
# retranslateUi
|
||||||
|
|
||||||
74
uv.lock
generated
74
uv.lock
generated
@@ -1,74 +0,0 @@
|
|||||||
version = 1
|
|
||||||
revision = 3
|
|
||||||
requires-python = ">=3.14"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "myproject"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = { virtual = "." }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "pyside6" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.metadata]
|
|
||||||
requires-dist = [{ name = "pyside6", specifier = ">=6.10.2" }]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pyside6"
|
|
||||||
version = "6.10.2"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "pyside6-addons" },
|
|
||||||
{ name = "pyside6-essentials" },
|
|
||||||
{ name = "shiboken6" },
|
|
||||||
]
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/35/0f/5736889fc850794623692cb369e295a994175e51295fa52134626f486296/pyside6-6.10.2-cp39-abi3-macosx_13_0_universal2.whl", hash = "sha256:4b084293caa7845d0064aaf6af258e0f7caae03a14a33537d0a552131afddaf0", size = 563185, upload-time = "2026-02-02T08:50:47.161Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/35/d3/ab5cd2fac3d34469c7376e0cd18eec92905dbe44748c70bda7699a2a7206/pyside6-6.10.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:1b89ce8558d4b4f35b85bff1db90d680912e4d3ce9e79ff804d6fef1d1a151ef", size = 563357, upload-time = "2026-02-02T08:50:48.919Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/ea/8c/55bbd50c138c8dc12edc9f25e9d94760a33e574905468e98dff399094baa/pyside6-6.10.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:0439f5e9b10ebe6177981bac9e219096ec970ac6ec215bef055279802ba50601", size = 563357, upload-time = "2026-02-02T08:50:50.077Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/4f/d4/673b8112b4a260377f760be835c4e357163fdaf68a56a1aec59aeb8e584b/pyside6-6.10.2-cp39-abi3-win_amd64.whl", hash = "sha256:032bad6b18a17fcbf4dddd0397f49b07f8aae7f1a45b7e4de7037bf7fd6e0edf", size = 569554, upload-time = "2026-02-02T08:50:51.147Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/14/95/bda648fcccf61fe58cb417284716ae30acdddd44f7d4cbad6eea4ccaa872/pyside6-6.10.2-cp39-abi3-win_arm64.whl", hash = "sha256:65a59ad0bc92525639e3268d590948ce07a80ee97b55e7a9200db41d493cac31", size = 553828, upload-time = "2026-02-02T08:50:52.244Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pyside6-addons"
|
|
||||||
version = "6.10.2"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "pyside6-essentials" },
|
|
||||||
{ name = "shiboken6" },
|
|
||||||
]
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/61/06/c283567628ffa2cefc3c72374ad607f1dfc9842a03db65f1347b9ae52bee/pyside6_addons-6.10.2-cp39-abi3-macosx_13_0_universal2.whl", hash = "sha256:0de7d0c9535e17d5e3b634b61314a1867f3b0f6d35c3d7cdc99efc353192faff", size = 322745605, upload-time = "2026-02-02T08:39:19.929Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/a5/69/e1ab8c756fd3984b1fd7b186446227f524f6b561160bfbfdba8874b4709a/pyside6_addons-6.10.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:030a851163b51dbf0063be59e9ddb6a9e760bde89a28e461ccc81a224d286eaf", size = 170718434, upload-time = "2026-02-02T08:40:55.989Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/df/e5/18ba86ba86d1231c486d36f9accfe862ed6eb52ca0b698aeaf6e837a87ca/pyside6_addons-6.10.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:fcee0373e3fd7b98f014094e5e37b4a39e4de7c5a47c13f654a7d557d4a426ad", size = 166423836, upload-time = "2026-02-02T08:42:44.918Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/99/13/503bec9201881968c372cb634069535e80aec2489f3907d676e151a1023f/pyside6_addons-6.10.2-cp39-abi3-win_amd64.whl", hash = "sha256:c20150068525a17494f3b6576c5d61c417cf9a5870659e29f5ebd83cd20a78ea", size = 164712775, upload-time = "2026-02-02T08:43:23.729Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/b6/39/44d6710b4dd18d745077b5fc6ded4ba6f32987a6e49c5834529e50f02155/pyside6_addons-6.10.2-cp39-abi3-win_arm64.whl", hash = "sha256:3d18db739b46946ba7b722d8ad4cc2097135033aa6ea57076e64d591e6a345f3", size = 34041396, upload-time = "2026-02-02T08:43:31.246Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pyside6-essentials"
|
|
||||||
version = "6.10.2"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "shiboken6" },
|
|
||||||
]
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/1d/2e/5f18a77f5e0bd730bacec93a690d0ef3c96a9711d213653eacecbf241b8d/pyside6_essentials-6.10.2-cp39-abi3-macosx_13_0_universal2.whl", hash = "sha256:1dee2cb9803ff135f881dadeb5c0edcef793d1ec4f8a9140a1348cecb71074e1", size = 105913067, upload-time = "2026-02-02T08:45:37.508Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/99/20/3a6ca95052e1744b5a3eba164e2dd451d358a3dcaf78179de4b45c8e3f47/pyside6_essentials-6.10.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:660aea45bfa36f1e06f799b934c2a7df963bd31abc5083e8bb8a5bfaef45686b", size = 77027153, upload-time = "2026-02-02T08:45:53.09Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/93/a6/6073e4ddc2a5c7b3941606e4bc8bbaadcf0737f57450620b0793041c8d22/pyside6_essentials-6.10.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:c2b028e4c6f8047a02c31f373408e23b4eedfd405f56c6aba8d0525c29472835", size = 76114242, upload-time = "2026-02-02T08:46:07.184Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/22/a8/616bbbd009efd3e17bf9a2db09d90c6764c010565cd2bdea2a240bfd18f7/pyside6_essentials-6.10.2-cp39-abi3-win_amd64.whl", hash = "sha256:0741018c2b6395038cad4c41775cfae3f13a409e87995ac9f7d89e5b1fb6b22a", size = 74546490, upload-time = "2026-02-02T08:46:26.395Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/b9/f9/c9757a984c4ffb6d12fab69e966d95dfc862a5d44e12b7900f3a03780b76/pyside6_essentials-6.10.2-cp39-abi3-win_arm64.whl", hash = "sha256:db5f4913648bb6afddb8b347edae151ee2378f12bceb03c8b2515a530a4b38d9", size = 55258626, upload-time = "2026-02-02T08:46:36.788Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "shiboken6"
|
|
||||||
version = "6.10.2"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/fb/38/3912eb08a3b865b5fcdb4bdce8076cacc211986cee587f5cb62e637791af/shiboken6-6.10.2-cp39-abi3-macosx_13_0_universal2.whl", hash = "sha256:3bd4e94e9a3c8c1fa8362fd752d399ef39265d5264e4e37bae61cdaa2a00c8c7", size = 479829, upload-time = "2026-02-02T08:50:22.495Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/52/88/292e0576489c46624ab419ee284ac5a59ae10e2eb34a58b6abca51dfd290/shiboken6-6.10.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ace0790032d9cb0adda644b94ee28d59410180d9773643bb6cf8438c361987ad", size = 273052, upload-time = "2026-02-02T08:50:24.539Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/06/c2/03d44d34e8264e1f25671677fece95b414c70fd85dcc2be8d5e821ee2628/shiboken6-6.10.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:f74d3ed1f92658077d0630c39e694eb043aeb1d830a5d275176c45d07147427f", size = 269868, upload-time = "2026-02-02T08:50:25.662Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/71/5d/5ca52c0ef86b3d01572131b6709bd531a080995f7e680720e9424328ce1d/shiboken6-6.10.2-cp39-abi3-win_amd64.whl", hash = "sha256:10f3c8c5e1b8bee779346f21c10dbc14cff068f0b0b4e62420c82a6bf36ac2e7", size = 1222052, upload-time = "2026-02-02T08:50:27.502Z" },
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/46/52/421fd378313c89b67ee7d584bf4e9ec088fa1804891b8d74e02b16703457/shiboken6-6.10.2-cp39-abi3-win_arm64.whl", hash = "sha256:20c671645d70835af212ee05df60361d734c5305edb2746e9875c6a31283f963", size = 1784089, upload-time = "2026-02-02T08:50:29.069Z" },
|
|
||||||
]
|
|
||||||
Reference in New Issue
Block a user