From 1639c71b563e3f79295629e7bb03eac974063d8d Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Tue, 9 Sep 2025 15:58:47 +0200 Subject: [PATCH] update and tabs bar adjustments --- app/core/alert_manager.py | 16 ++++++++-- app/core/theme_manager.py | 24 +++++++++++++++ app/core/update_manager.py | 4 +-- app/ui/main_window.py | 23 +++----------- app/ui/widgets/tabs_widget.py | 57 +++++++++++++++++++++++++++-------- config.json | 4 +-- 6 files changed, 92 insertions(+), 36 deletions(-) diff --git a/app/core/alert_manager.py b/app/core/alert_manager.py index 6a6ee25..944abe0 100644 --- a/app/core/alert_manager.py +++ b/app/core/alert_manager.py @@ -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 \ No newline at end of file + + 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 \ No newline at end of file diff --git a/app/core/theme_manager.py b/app/core/theme_manager.py index 2c850ad..4b1f79f 100644 --- a/app/core/theme_manager.py +++ b/app/core/theme_manager.py @@ -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; + }} """ \ No newline at end of file diff --git a/app/core/update_manager.py b/app/core/update_manager.py index ffaac5a..7a3164b 100644 --- a/app/core/update_manager.py +++ b/app/core/update_manager.py @@ -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) diff --git a/app/ui/main_window.py b/app/ui/main_window.py index c5b5b0a..f5c21c4 100644 --- a/app/ui/main_window.py +++ b/app/ui/main_window.py @@ -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,29 +85,16 @@ 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) 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()) diff --git a/app/ui/widgets/tabs_widget.py b/app/ui/widgets/tabs_widget.py index ccc0da1..901a610 100644 --- a/app/ui/widgets/tabs_widget.py +++ b/app/ui/widgets/tabs_widget.py @@ -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}; }} """ diff --git a/config.json b/config.json index ca6a66c..c51be8f 100644 --- a/config.json +++ b/config.json @@ -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" } \ No newline at end of file