Compare commits

..

1 Commits

Author SHA1 Message Date
ec1321c5c3 wip transparence 2026-03-04 22:18:37 +01:00
42 changed files with 27548 additions and 375973 deletions

View File

@@ -1,15 +0,0 @@
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
View File

@@ -1,401 +0,0 @@
.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
View File

@@ -1,10 +0,0 @@
# 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/

View File

@@ -1,11 +0,0 @@
<?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>

View File

@@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated
View File

@@ -1,7 +0,0 @@
<?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
View File

@@ -1,8 +0,0 @@
<?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
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -1,19 +0,0 @@
{
"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",
]
}

View File

@@ -1,6 +0,0 @@
{
"python.analysis.autoImportCompletions": true,
"python.analysis.extraPaths": [".venv/lib/python3.11/site-packages"],
"python.analysis.fixAll": ["source.unusedImports"],
"python.languageServer": "Pylance"
}

View File

@@ -1,133 +0,0 @@
# -*- 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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

View File

@@ -1,23 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,14 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,30 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

View File

@@ -1 +0,0 @@
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 Normal file
View File

@@ -0,0 +1,48 @@
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())

53
frameless_for_MsWindow.py Normal file
View File

@@ -0,0 +1,53 @@
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 Normal file
View File

@@ -0,0 +1,117 @@
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())

View File

@@ -38,9 +38,12 @@
<string>MainWindow</string>
</property>
<property name="windowIcon">
<iconset resource="../resources.qrc">
<iconset resource="resources.qrc">
<normaloff>:/assets/Icone.ico</normaloff>:/assets/Icone.ico</iconset>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(255, 255, 255);</string>
</property>
<widget class="QWidget" name="main_container">
<property name="minimumSize">
<size>
@@ -54,6 +57,11 @@
<height>703</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">#main_container {
border-radius: 30px;
}</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
@@ -178,7 +186,7 @@
<string/>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<iconset resource="resources.qrc">
<normaloff>:/assets/system-shutdown.png</normaloff>:/assets/system-shutdown.png</iconset>
</property>
<property name="iconSize">
@@ -222,6 +230,9 @@
<height>658</height>
</size>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="frameShape">
<enum>QFrame::Shape::NoFrame</enum>
</property>
@@ -281,7 +292,14 @@
<number>0</number>
</property>
<item>
<widget class="QFrame" name="logo_frame">
<widget class="QFrame" name="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">
<enum>QFrame::Shape::NoFrame</enum>
</property>
@@ -348,25 +366,37 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QLabel" name="queue_lbl">
<widget class="QLabel" name="label">
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="text">
<string>Position en file d'attente: </string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="queue_position">
<property name="text">
<string>20</string>
<widget class="QLCDNumber" name="lcdNumber">
<property name="maximumSize">
<size>
<width>70</width>
<height>50</height>
</size>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
<property name="layoutDirection">
<enum>Qt::LayoutDirection::RightToLeft</enum>
</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>
</widget>
</item>
@@ -423,7 +453,7 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QSlider" name="audio_volume_adjust">
<widget class="QSlider" name="horizontalSlider">
<property name="autoFillBackground">
<bool>false</bool>
</property>
@@ -442,22 +472,12 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="mute_btn">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/assets/sound-speaker.svg</normaloff>:/assets/sound-speaker.svg</iconset>
</property>
<property name="flat">
<bool>true</bool>
<iconset theme="QIcon::ThemeIcon::AudioVolumeHigh"/>
</property>
</widget>
</item>
@@ -564,7 +584,7 @@
<item alignment="Qt::AlignmentFlag::AlignHCenter">
<widget class="QLabel" name="maintitle_label">
<property name="text">
<string>LA TANIÈRE</string>
<string>la taniere</string>
</property>
</widget>
</item>
@@ -593,7 +613,7 @@
</size>
</property>
<property name="text">
<string>Un espace pour se retrouver</string>
<string>un espace pour se retrouver</string>
</property>
<property name="textFormat">
<enum>Qt::TextFormat::AutoText</enum>
@@ -669,17 +689,7 @@
<string notr="true"/>
</property>
<property name="text">
<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>
<string>connexion</string>
</property>
</widget>
</item>
@@ -751,17 +761,7 @@
</size>
</property>
<property name="text">
<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>
<string>discord</string>
</property>
</widget>
</item>
@@ -787,17 +787,7 @@
</size>
</property>
<property name="text">
<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>
<string>intranet</string>
</property>
</widget>
</item>
@@ -856,7 +846,16 @@
</size>
</property>
<property name="styleSheet">
<string notr="true"/>
<string notr="true">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);
}</string>
</property>
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
@@ -898,7 +897,7 @@
</widget>
</widget>
<resources>
<include location="../resources.qrc"/>
<include location="resources.qrc"/>
</resources>
<connections/>
</ui>

9
pyproject.toml Normal file
View File

@@ -0,0 +1,9 @@
[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",
]

View File

@@ -1,51 +0,0 @@
# 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.

View File

@@ -1,17 +1,31 @@
altgraph==0.17.5
librt==0.8.1
modulegraph==0.19.7
mypy==1.19.1
mypy_extensions==1.1.0
certifi==2026.2.25
distlib==0.4.0
filelock==3.25.0
packaging==26.0
pathspec==1.0.4
pefile==2024.8.26
pyinstaller==6.19.0
pyinstaller-hooks-contrib==2026.2
pipenv==2026.0.3
platformdirs==4.9.2
PyQt6==6.10.2
PyQt6-Qt6==6.10.2
PyQt6_sip==13.11.0
PySide6==6.10.2
PySide6_Addons==6.10.2
PySide6_Essentials==6.10.2
pywin32-ctypes==0.2.3
python-discovery==1.1.0
setuptools==82.0.0
shiboken6==6.10.2
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

View File

@@ -1,11 +1,6 @@
<RCC>
<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_Discord_2015.png</file>
<file>assets/system-shutdown.png</file>
<file>assets/Avocado-Cake-Demo.otf</file>
<file>assets/background.png</file>

26783
resources_rc.py Normal file

File diff suppressed because it is too large Load Diff

272
slidergroovecolorstyle.py Normal file
View File

@@ -0,0 +1,272 @@
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)

View File

@@ -1,226 +0,0 @@
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())

File diff suppressed because it is too large Load Diff

107
styles.qss Normal file
View File

@@ -0,0 +1,107 @@
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)
);
}

View File

@@ -1,180 +0,0 @@
#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;
}

View File

@@ -1,395 +0,0 @@
# -*- 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 Normal file
View File

@@ -0,0 +1,74 @@
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" },
]