update and tabs bar adjustments
This commit is contained in:
parent
278f2353fe
commit
1639c71b56
@ -56,8 +56,20 @@ class AlertManager:
|
|||||||
|
|
||||||
def on_button_clicked(button):
|
def on_button_clicked(button):
|
||||||
if button == details and details_callback:
|
if button == details and details_callback:
|
||||||
|
box.setResult(QMessageBox.StandardButton.NoButton)
|
||||||
details_callback()
|
details_callback()
|
||||||
|
if not box.isVisible():
|
||||||
|
box.show()
|
||||||
|
|
||||||
box.buttonClicked.connect(on_button_clicked)
|
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
|
@ -51,6 +51,7 @@ class ThemeManager:
|
|||||||
}}
|
}}
|
||||||
QLabel {{
|
QLabel {{
|
||||||
color: {self.current_theme.get_color("font_color")};
|
color: {self.current_theme.get_color("font_color")};
|
||||||
|
font-size: 20px;
|
||||||
}}
|
}}
|
||||||
QProgressBar {{
|
QProgressBar {{
|
||||||
border: 1px solid #3C3C3E;
|
border: 1px solid #3C3C3E;
|
||||||
@ -149,4 +150,27 @@ class ThemeManager:
|
|||||||
background-color: {self.current_theme.get_color("background2")};
|
background-color: {self.current_theme.get_color("background2")};
|
||||||
color: {self.current_theme.get_color("font_color")};
|
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;
|
||||||
|
}}
|
||||||
"""
|
"""
|
@ -125,7 +125,7 @@ class UpdateManager:
|
|||||||
parent=parent,
|
parent=parent,
|
||||||
details_callback=lambda: self.show_details_dialog(releases, current_version, parent)
|
details_callback=lambda: self.show_details_dialog(releases, current_version, parent)
|
||||||
)
|
)
|
||||||
|
print(choice)
|
||||||
return choice
|
return choice
|
||||||
|
|
||||||
def show_details_dialog(self, releases: List[Dict], current_version: str, parent=None) -> None:
|
def show_details_dialog(self, releases: List[Dict], current_version: str, parent=None) -> None:
|
||||||
@ -161,7 +161,7 @@ class UpdateManager:
|
|||||||
changelog_text += "\n\n"
|
changelog_text += "\n\n"
|
||||||
if release != newer_releases[-1]:
|
if release != newer_releases[-1]:
|
||||||
changelog_text += "---\n\n"
|
changelog_text += "---\n\n"
|
||||||
print(changelog_text)
|
|
||||||
text_edit.setAcceptRichText(True)
|
text_edit.setAcceptRichText(True)
|
||||||
text_edit.setMarkdown(changelog_text)
|
text_edit.setMarkdown(changelog_text)
|
||||||
layout.addWidget(text_edit)
|
layout.addWidget(text_edit)
|
||||||
|
@ -2,7 +2,7 @@ from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QLabel, QFra
|
|||||||
from PyQt6.QtGui import QResizeEvent, QCloseEvent
|
from PyQt6.QtGui import QResizeEvent, QCloseEvent
|
||||||
from PyQt6.QtCore import QSize, QEvent, Qt
|
from PyQt6.QtCore import QSize, QEvent, Qt
|
||||||
from app.core.main_manager import MainManager, NotificationType
|
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.settings_window import SettingsWindow
|
||||||
from app.ui.windows.suggestion_window import SuggestionWindow
|
from app.ui.windows.suggestion_window import SuggestionWindow
|
||||||
import app.utils.paths as paths, shutil
|
import app.utils.paths as paths, shutil
|
||||||
@ -85,29 +85,16 @@ class MainWindow(QMainWindow):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def setup_ui(self) -> None:
|
def setup_ui(self) -> None:
|
||||||
central_widget = QFrame(self)
|
|
||||||
layout = QVBoxLayout(central_widget)
|
self.side_menu = TabsWidget(self, MenuDirection.HORIZONTAL, 70, None, 10, 1, BorderSide.BOTTOM, TabSide.TOP)
|
||||||
layout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
|
|
||||||
self.side_menu = TabsWidget(self, MenuDirection.HORIZONTAL, 70, None, 10, 1, BorderSide.TOP)
|
|
||||||
|
|
||||||
self.suggestion_window = SuggestionWindow(self)
|
self.suggestion_window = SuggestionWindow(self)
|
||||||
self.side_menu.add_widget(self.suggestion_window, "", paths.get_asset_svg_path("suggestion"), position=ButtonPosition.CENTER)
|
self.side_menu.add_widget(self.suggestion_window, "", paths.get_asset_svg_path("suggestion"), position=ButtonPosition.CENTER)
|
||||||
|
|
||||||
self.settings_window = SettingsWindow(self)
|
self.settings_window = SettingsWindow(self)
|
||||||
self.side_menu.add_widget(self.settings_window, "", paths.get_asset_svg_path("settings"), position=ButtonPosition.CENTER)
|
self.side_menu.add_widget(self.settings_window, "", paths.get_asset_svg_path("settings"), position=ButtonPosition.CENTER)
|
||||||
|
|
||||||
layout.addWidget(self.side_menu)
|
self.setCentralWidget(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)
|
|
||||||
|
|
||||||
def update_theme(self) -> None:
|
def update_theme(self) -> None:
|
||||||
self.setStyleSheet(self.theme_manager.get_sheet())
|
self.setStyleSheet(self.theme_manager.get_sheet())
|
||||||
|
@ -25,8 +25,14 @@ class BorderSide(Enum):
|
|||||||
BOTTOM = "bottom"
|
BOTTOM = "bottom"
|
||||||
NONE = None
|
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):
|
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)
|
super().__init__(parent)
|
||||||
self.main_manager = MainManager.get_instance()
|
self.main_manager = MainManager.get_instance()
|
||||||
self.theme_manager = self.main_manager.get_theme_manager()
|
self.theme_manager = self.main_manager.get_theme_manager()
|
||||||
@ -36,7 +42,22 @@ class TabsWidget(QWidget):
|
|||||||
self.menu_width = menu_width
|
self.menu_width = menu_width
|
||||||
self.button_size_ratio = button_size_ratio # Default ratio for button size relative to menu width
|
self.button_size_ratio = button_size_ratio # Default ratio for button size relative to menu width
|
||||||
self.onTabChange = onTabChange
|
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.buttons = []
|
||||||
self.widgets = []
|
self.widgets = []
|
||||||
self.button_positions = []
|
self.button_positions = []
|
||||||
@ -61,7 +82,7 @@ class TabsWidget(QWidget):
|
|||||||
self._setup_ui()
|
self._setup_ui()
|
||||||
|
|
||||||
def _setup_ui(self):
|
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:
|
if self.direction == MenuDirection.HORIZONTAL:
|
||||||
self.main_layout = QVBoxLayout(self)
|
self.main_layout = QVBoxLayout(self)
|
||||||
self.button_layout = QHBoxLayout()
|
self.button_layout = QHBoxLayout()
|
||||||
@ -96,13 +117,13 @@ class TabsWidget(QWidget):
|
|||||||
# Initialize spacers for alignment zones
|
# Initialize spacers for alignment zones
|
||||||
self._setup_alignment_zones()
|
self._setup_alignment_zones()
|
||||||
|
|
||||||
# Add widgets to main layout based on direction
|
# Add widgets to main layout based on direction and tab_side
|
||||||
if self.direction == MenuDirection.HORIZONTAL:
|
if self.tab_side == TabSide.LEFT:
|
||||||
self.main_layout.addWidget(self.button_container)
|
self.main_layout.addWidget(self.button_container)
|
||||||
self.main_layout.addWidget(self.stacked_widget)
|
self.main_layout.addWidget(self.stacked_widget)
|
||||||
else: # VERTICAL
|
else: # TabSide.RIGHT
|
||||||
self.main_layout.addWidget(self.button_container)
|
|
||||||
self.main_layout.addWidget(self.stacked_widget)
|
self.main_layout.addWidget(self.stacked_widget)
|
||||||
|
self.main_layout.addWidget(self.button_container)
|
||||||
|
|
||||||
self.setLayout(self.main_layout)
|
self.setLayout(self.main_layout)
|
||||||
|
|
||||||
@ -215,7 +236,7 @@ class TabsWidget(QWidget):
|
|||||||
# Set size policy
|
# Set size policy
|
||||||
button.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
|
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()
|
border_style = self._get_border_style()
|
||||||
button.setStyleSheet(border_style)
|
button.setStyleSheet(border_style)
|
||||||
|
|
||||||
@ -243,8 +264,8 @@ class TabsWidget(QWidget):
|
|||||||
return super().eventFilter(obj, event)
|
return super().eventFilter(obj, event)
|
||||||
|
|
||||||
def _get_border_style(self):
|
def _get_border_style(self):
|
||||||
"""Generate CSS border style based on border_side setting"""
|
"""Generate CSS border style based on border_sides setting"""
|
||||||
if self.border_side == BorderSide.NONE or self.border_side is None:
|
if not self.border_sides or BorderSide.NONE in self.border_sides:
|
||||||
return f"""
|
return f"""
|
||||||
QPushButton {{
|
QPushButton {{
|
||||||
border-radius: 0px;
|
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"""
|
return f"""
|
||||||
QPushButton {{
|
QPushButton {{
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border-{self.border_side.value}: 3px solid transparent;
|
{border_style};
|
||||||
}}
|
}}
|
||||||
QPushButton[selected="true"] {{
|
QPushButton[selected="true"] {{
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border-{self.border_side.value}: 3px solid {self.selected_border_icon_color};
|
{selected_border_style};
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"app_name": "HoDA",
|
"app_name": "Application",
|
||||||
"app_os": "Windows",
|
"app_os": "Windows",
|
||||||
"app_version": "1.0.0",
|
"app_version": "1.0.0",
|
||||||
"architecture": "x64",
|
"architecture": "x64",
|
||||||
"icon_path": "data/assets/icon.ico",
|
"icon_path": "data/assets/icon.ico",
|
||||||
"main_script": "main.py",
|
"main_script": "main.py",
|
||||||
"git_repo": "https://gitea.louismazin.ovh/LouisMazin/HoDA"
|
"git_repo": "https://gitea.louismazin.ovh/LouisMazin/PythonApplicationTemplate"
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user