Compare commits

..

15 Commits

Author SHA1 Message Date
abd1a1073a wip 2026-03-09 15:08:46 +01:00
18c708597a Retrait win11toast et compilation agressive via fichier spec 2026-03-09 12:52:05 +01:00
52e4c01f3d Passage à PySide6 car licence plus permissive 2026-03-09 12:22:49 +01:00
75893a8a01 Change for windows onyl & pyinstaller script 2026-03-07 17:17:14 +01:00
cc8aa03102 Hide QSlider handler 2026-03-07 10:45:58 +01:00
a2e1153340 upgrade readme 2026-03-06 11:41:59 +01:00
8c4aa284b7 upgrade extension recommendations 2026-03-06 11:33:47 +01:00
a437de91df wip: refacto qss, new assets 2026-03-06 11:24:45 +01:00
42768aa78a fix mypy config 2026-03-05 14:48:17 +01:00
8e7242937e fix window platform 2026-03-05 14:31:19 +01:00
a4bcd764db Adapting for windows and linux 2026-03-05 14:08:33 +01:00
8395b2f220 update qrc file path for ui file 2026-03-05 11:49:46 +01:00
b643188418 reorganize folders, add gitignore 2026-03-05 11:44:47 +01:00
097524cd27 cleaning file for dependencies 2026-03-05 11:19:45 +01:00
4be6dd8b84 Configure modules for vscode 2026-03-05 11:05:38 +01:00
39 changed files with 2677 additions and 759 deletions

15
.editorconfig Normal file
View 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
View 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
View 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
View 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>

View 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
View 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
View 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
View 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
View 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
View 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
View 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',
'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', # non utilisé dans ton code
'sqlite3',
'ssl',
'socket', # win11toast peut en avoir besoin, à tester
'ctypes', # idem, à tester
'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.

After

Width:  |  Height:  |  Size: 12 KiB

23
assets/computer-tv.svg Normal file
View 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
View 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
View 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

1
build.bat Normal file
View 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

View File

@@ -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())

View File

@@ -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())

View File

@@ -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())

View File

@@ -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
View 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.

View File

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

View File

@@ -1,6 +1,10 @@
<RCC>
<qresource prefix="/">
<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>

View File

@@ -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)

105
src/mainwindow.py Normal file
View File

@@ -0,0 +1,105 @@
import sys
import os
from pathlib import Path
from PySide6 import QtGui
from PySide6.QtCore import Qt
from PySide6.QtGui import QFontDatabase, QFont
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QMainWindow, QApplication
# 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
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
bundle_dir = Path(sys._MEIPASS)
else:
bundle_dir = Path(__file__).parent.parent
# Remove this into final release
from fake_patch_notes import patch_note
NO_STAFF = True
CURRENT = os.path.dirname(os.path.realpath(__file__))
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):
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)
# 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)
# 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.show()
# 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
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

View File

@@ -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)
);
}

174
styles/styles.qss Normal file
View File

@@ -0,0 +1,174 @@
#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 */
}
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#volume_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

@@ -38,12 +38,9 @@
<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>
@@ -57,11 +54,6 @@
<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>
@@ -186,7 +178,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">
@@ -230,9 +222,6 @@
<height>658</height>
</size>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="frameShape">
<enum>QFrame::Shape::NoFrame</enum>
</property>
@@ -293,13 +282,6 @@
</property>
<item>
<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>
@@ -366,37 +348,25 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QLabel" name="label">
<widget class="QLabel" name="queue_lbl">
<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="QLCDNumber" name="lcdNumber">
<property name="maximumSize">
<size>
<width>70</width>
<height>50</height>
</size>
<widget class="QLabel" name="queue_position">
<property name="text">
<string>20</string>
</property>
<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 name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@@ -472,12 +442,22 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<widget class="QPushButton" name="volume_btn">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<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>
</widget>
</item>
@@ -584,7 +564,7 @@
<item alignment="Qt::AlignmentFlag::AlignHCenter">
<widget class="QLabel" name="maintitle_label">
<property name="text">
<string>la taniere</string>
<string>LA TANIÈRE</string>
</property>
</widget>
</item>
@@ -613,7 +593,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>
@@ -689,7 +669,17 @@
<string notr="true"/>
</property>
<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>
</widget>
</item>
@@ -761,7 +751,17 @@
</size>
</property>
<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>
</widget>
</item>
@@ -787,7 +787,17 @@
</size>
</property>
<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>
</widget>
</item>
@@ -846,16 +856,7 @@
</size>
</property>
<property name="styleSheet">
<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>
<string notr="true"/>
</property>
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
@@ -897,7 +898,7 @@
</widget>
</widget>
<resources>
<include location="resources.qrc"/>
<include location="../resources.qrc"/>
</resources>
<connections/>
</ui>

395
ui/mainwindow_ui.py Normal file
View 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
View File

@@ -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" },
]