update and tabs bar adjustments

This commit is contained in:
Louis Mazin 2025-09-09 15:58:47 +02:00
parent 278f2353fe
commit 1639c71b56
6 changed files with 92 additions and 36 deletions

View File

@ -56,8 +56,20 @@ class AlertManager:
def on_button_clicked(button):
if button == details and details_callback:
box.setResult(QMessageBox.StandardButton.NoButton)
details_callback()
if not box.isVisible():
box.show()
box.buttonClicked.connect(on_button_clicked)
box.exec()
return box.clickedButton() == yes
while True:
result = box.exec()
clicked_button = box.clickedButton()
# Si c'est le bouton détails, on continue la boucle sans fermer
if clicked_button == details:
continue
# Sinon, on sort de la boucle et retourne le résultat
else:
return clicked_button == yes

View File

@ -51,6 +51,7 @@ class ThemeManager:
}}
QLabel {{
color: {self.current_theme.get_color("font_color")};
font-size: 20px;
}}
QProgressBar {{
border: 1px solid #3C3C3E;
@ -149,4 +150,27 @@ class ThemeManager:
background-color: {self.current_theme.get_color("background2")};
color: {self.current_theme.get_color("font_color")};
}}
QComboBox {{
padding: 5px;
border-radius: 8px;
font-size: 14px;
min-height: 30px;
}}
QComboBox {{
border: 2px solid {self.current_theme.get_color("border")};
}}
QComboBox::drop-down {{
border: none;
background: transparent;
}}
QComboBox::down-arrow {{
image: none;
}}
/* Optionnel: indicateur visuel au hover */
QComboBox:hover {{
border-color: #0078d4;
}}
"""

View File

@ -125,7 +125,7 @@ class UpdateManager:
parent=parent,
details_callback=lambda: self.show_details_dialog(releases, current_version, parent)
)
print(choice)
return choice
def show_details_dialog(self, releases: List[Dict], current_version: str, parent=None) -> None:
@ -161,7 +161,7 @@ class UpdateManager:
changelog_text += "\n\n"
if release != newer_releases[-1]:
changelog_text += "---\n\n"
print(changelog_text)
text_edit.setAcceptRichText(True)
text_edit.setMarkdown(changelog_text)
layout.addWidget(text_edit)

View File

@ -2,7 +2,7 @@ from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QLabel, QFra
from PyQt6.QtGui import QResizeEvent, QCloseEvent
from PyQt6.QtCore import QSize, QEvent, Qt
from app.core.main_manager import MainManager, NotificationType
from app.ui.widgets.tabs_widget import TabsWidget, MenuDirection, ButtonPosition, BorderSide
from app.ui.widgets.tabs_widget import TabsWidget, MenuDirection, ButtonPosition, BorderSide, TabSide
from app.ui.windows.settings_window import SettingsWindow
from app.ui.windows.suggestion_window import SuggestionWindow
import app.utils.paths as paths, shutil
@ -85,11 +85,8 @@ class MainWindow(QMainWindow):
pass
def setup_ui(self) -> None:
central_widget = QFrame(self)
layout = QVBoxLayout(central_widget)
layout.setContentsMargins(0, 0, 0, 0)
self.side_menu = TabsWidget(self, MenuDirection.HORIZONTAL, 70, None, 10, 1, BorderSide.TOP)
self.side_menu = TabsWidget(self, MenuDirection.HORIZONTAL, 70, None, 10, 1, BorderSide.BOTTOM, TabSide.TOP)
self.suggestion_window = SuggestionWindow(self)
self.side_menu.add_widget(self.suggestion_window, "", paths.get_asset_svg_path("suggestion"), position=ButtonPosition.CENTER)
@ -97,17 +94,7 @@ class MainWindow(QMainWindow):
self.settings_window = SettingsWindow(self)
self.side_menu.add_widget(self.settings_window, "", paths.get_asset_svg_path("settings"), position=ButtonPosition.CENTER)
layout.addWidget(self.side_menu)
self.footer_label = QLabel(self.language_manager.get_text("footer_text"), self)
self.footer_label.setAlignment(Qt.AlignmentFlag.AlignRight)
self.footer_label.setStyleSheet("padding: 5px; font-size: 12px; color: gray;")
layout.addWidget(self.footer_label)
self.setCentralWidget(central_widget)
self.setCentralWidget(self.side_menu)
def update_theme(self) -> None:
self.setStyleSheet(self.theme_manager.get_sheet())

View File

@ -25,8 +25,14 @@ class BorderSide(Enum):
BOTTOM = "bottom"
NONE = None
class TabSide(Enum):
LEFT = 0 # Barre à gauche (pour VERTICAL)
RIGHT = 1 # Barre à droite (pour VERTICAL)
TOP = 0 # Barre en haut (pour HORIZONTAL)
BOTTOM = 1 # Barre en bas (pour HORIZONTAL)
class TabsWidget(QWidget):
def __init__(self, parent=None, direction=MenuDirection.VERTICAL, menu_width=80, onTabChange=None, spacing=10, button_size_ratio=0.8, border_side=BorderSide.LEFT):
def __init__(self, parent=None, direction=MenuDirection.VERTICAL, menu_width=80, onTabChange=None, spacing=10, button_size_ratio=0.8, border_side=BorderSide.LEFT, tab_side=None):
super().__init__(parent)
self.main_manager = MainManager.get_instance()
self.theme_manager = self.main_manager.get_theme_manager()
@ -36,7 +42,22 @@ class TabsWidget(QWidget):
self.menu_width = menu_width
self.button_size_ratio = button_size_ratio # Default ratio for button size relative to menu width
self.onTabChange = onTabChange
self.border_side = border_side # Store border side preference
# Gérer border_side comme une liste ou un seul élément
if isinstance(border_side, list):
self.border_sides = border_side
elif border_side is not None:
self.border_sides = [border_side]
else:
self.border_sides = []
# Déterminer le côté de la barre d'onglets
if tab_side is None:
# Valeurs par défaut basées sur la direction
self.tab_side = TabSide.LEFT if direction == MenuDirection.VERTICAL else TabSide.TOP
else:
self.tab_side = tab_side
self.buttons = []
self.widgets = []
self.button_positions = []
@ -61,7 +82,7 @@ class TabsWidget(QWidget):
self._setup_ui()
def _setup_ui(self):
"""Setup the main layout based on direction"""
"""Setup the main layout based on direction and tab_side"""
if self.direction == MenuDirection.HORIZONTAL:
self.main_layout = QVBoxLayout(self)
self.button_layout = QHBoxLayout()
@ -96,13 +117,13 @@ class TabsWidget(QWidget):
# Initialize spacers for alignment zones
self._setup_alignment_zones()
# Add widgets to main layout based on direction
if self.direction == MenuDirection.HORIZONTAL:
# Add widgets to main layout based on direction and tab_side
if self.tab_side == TabSide.LEFT:
self.main_layout.addWidget(self.button_container)
self.main_layout.addWidget(self.stacked_widget)
else: # VERTICAL
self.main_layout.addWidget(self.button_container)
else: # TabSide.RIGHT
self.main_layout.addWidget(self.stacked_widget)
self.main_layout.addWidget(self.button_container)
self.setLayout(self.main_layout)
@ -215,7 +236,7 @@ class TabsWidget(QWidget):
# Set size policy
button.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
# Create border style based on border_side setting
# Create border style based on border_sides setting
border_style = self._get_border_style()
button.setStyleSheet(border_style)
@ -243,8 +264,8 @@ class TabsWidget(QWidget):
return super().eventFilter(obj, event)
def _get_border_style(self):
"""Generate CSS border style based on border_side setting"""
if self.border_side == BorderSide.NONE or self.border_side is None:
"""Generate CSS border style based on border_sides setting"""
if not self.border_sides or BorderSide.NONE in self.border_sides:
return f"""
QPushButton {{
border-radius: 0px;
@ -258,16 +279,28 @@ class TabsWidget(QWidget):
}}
"""
# Construire le style CSS pour chaque côté de bordure
border_declarations = []
selected_border_declarations = []
for border_side in self.border_sides:
if border_side != BorderSide.NONE and border_side is not None:
border_declarations.append(f"border-{border_side.value}: 3px solid transparent")
selected_border_declarations.append(f"border-{border_side.value}: 3px solid {self.selected_border_icon_color}")
border_style = "; ".join(border_declarations)
selected_border_style = "; ".join(selected_border_declarations)
return f"""
QPushButton {{
border-radius: 0px;
background-color: transparent;
border-{self.border_side.value}: 3px solid transparent;
{border_style};
}}
QPushButton[selected="true"] {{
border-radius: 0px;
background-color: transparent;
border-{self.border_side.value}: 3px solid {self.selected_border_icon_color};
{selected_border_style};
}}
"""

View File

@ -1,9 +1,9 @@
{
"app_name": "HoDA",
"app_name": "Application",
"app_os": "Windows",
"app_version": "1.0.0",
"architecture": "x64",
"icon_path": "data/assets/icon.ico",
"main_script": "main.py",
"git_repo": "https://gitea.louismazin.ovh/LouisMazin/HoDA"
"git_repo": "https://gitea.louismazin.ovh/LouisMazin/PythonApplicationTemplate"
}