diff --git a/gui/uis/windows/main_window/setup_main_window.py b/gui/uis/windows/main_window/setup_main_window.py index 779cc61..11ba725 100644 --- a/gui/uis/windows/main_window/setup_main_window.py +++ b/gui/uis/windows/main_window/setup_main_window.py @@ -99,6 +99,23 @@ class SetupMainWindow: } ] + # ADD TITLE BAR MENUS + # /////////////////////////////////////////////////////////////// + add_title_bar_menus = [ + { + "btn_icon" : "icon_search.svg", + "btn_id" : "btn_search", + "btn_tooltip" : "Search", + "is_active" : False + }, + { + "btn_icon" : "icon_more_options.svg", + "btn_id" : "btn_top_settings", + "btn_tooltip" : "Top settings", + "is_active" : False + } + ] + # SETUP MAIN WINDOW WITH CUSTOM PARAMETERS # /////////////////////////////////////////////////////////////// def setup(self): diff --git a/gui/uis/windows/main_window/ui_main.py b/gui/uis/windows/main_window/ui_main.py index 2f0a8d1..7ed28ed 100644 --- a/gui/uis/windows/main_window/ui_main.py +++ b/gui/uis/windows/main_window/ui_main.py @@ -179,6 +179,7 @@ class UI_MainWindow(object): radius = 8, font_family = self.settings["font"]["family"], title_size = self.settings["font"]["title_size"], + is_custom_title_bar = self.settings["custom_title_bar"] ) self.title_bar_layout.addWidget(self.title_bar) diff --git a/gui/widgets/py_left_menu/py_left_menu.py b/gui/widgets/py_left_menu/py_left_menu.py index 2af82eb..2849630 100644 --- a/gui/widgets/py_left_menu/py_left_menu.py +++ b/gui/widgets/py_left_menu/py_left_menu.py @@ -30,6 +30,7 @@ from gui.core.functions import * # PY LEFT MENU # /////////////////////////////////////////////////////////////// class PyLeftMenu(QWidget): + # SIGNALS clicked = Signal(object) released = Signal(object) @@ -37,7 +38,6 @@ class PyLeftMenu(QWidget): self, parent = None, app_parent = None, - buttons = None, dark_one = "#1b1e23", dark_three = "#21252d", dark_four = "#272c36", @@ -56,7 +56,7 @@ class PyLeftMenu(QWidget): icon_path = "icon_menu.svg", icon_path_close = "icon_menu_close.svg", toggle_text = "Hide Menu", - toggle_tooltip = "Expand/Retract menu" + toggle_tooltip = "Show menu" ): super(PyLeftMenu, self).__init__() @@ -123,10 +123,6 @@ class PyLeftMenu(QWidget): self.div_bottom.hide() self.bottom_layout.addWidget(self.div_bottom) - # ADD BUTTONS - # /////////////////////////////////////////////////////////////// - self.add_menus(buttons) - # ADD BUTTONS TO LEFT MENU # Add btns and emit signals # /////////////////////////////////////////////////////////////// diff --git a/gui/widgets/py_title_bar/py_title_bar.py b/gui/widgets/py_title_bar/py_title_bar.py index c2b6aea..251355b 100644 --- a/gui/widgets/py_title_bar/py_title_bar.py +++ b/gui/widgets/py_title_bar/py_title_bar.py @@ -44,6 +44,10 @@ _old_size = QSize() # close buttons and extra buttons # /////////////////////////////////////////////////////////////// class PyTitleBar(QWidget): + # SIGNALS + clicked = Signal(object) + released = Signal(object) + def __init__( self, parent, @@ -65,7 +69,8 @@ class PyTitleBar(QWidget): text_foreground = "#8a95aa", radius = 8, font_family = "Segoe UI", - title_size = 10 + title_size = 10, + is_custom_title_bar = True, ): super(PyTitleBar, self).__init__() @@ -89,6 +94,7 @@ class PyTitleBar(QWidget): self._font_family = font_family self._title_size = title_size self._text_foreground = text_foreground + self._is_custom_title_bar = is_custom_title_bar # SETUP UI self.setup_ui() @@ -101,9 +107,6 @@ class PyTitleBar(QWidget): self.top_logo.setMaximumWidth(logo_width) self.top_logo.setPixmap(Functions.set_svg_image(logo_image)) - # ADD TITLE TEXT - self.title_label.setText(self.settings["app_name"]) - # MOVE WINDOW / MAXIMIZE / RESTORE # /////////////////////////////////////////////////////////////// def moveWindow(event): @@ -121,16 +124,19 @@ class PyTitleBar(QWidget): event.accept() # MOVE APP WIDGETS - self.top_logo.mouseMoveEvent = moveWindow - self.div_1.mouseMoveEvent = moveWindow - self.title_label.mouseMoveEvent = moveWindow - self.div_2.mouseMoveEvent = moveWindow + if is_custom_title_bar: + self.top_logo.mouseMoveEvent = moveWindow + self.div_1.mouseMoveEvent = moveWindow + self.title_label.mouseMoveEvent = moveWindow + self.div_2.mouseMoveEvent = moveWindow + self.div_3.mouseMoveEvent = moveWindow # MAXIMIZE / RESTORE - self.top_logo.mouseDoubleClickEvent = self.maximize_restore - self.div_1.mouseDoubleClickEvent = self.maximize_restore - self.title_label.mouseDoubleClickEvent = self.maximize_restore - self.div_2.mouseDoubleClickEvent = self.maximize_restore + if is_custom_title_bar: + self.top_logo.mouseDoubleClickEvent = self.maximize_restore + self.div_1.mouseDoubleClickEvent = self.maximize_restore + self.title_label.mouseDoubleClickEvent = self.maximize_restore + self.div_2.mouseDoubleClickEvent = self.maximize_restore # ADD WIDGETS TO TITLE BAR # /////////////////////////////////////////////////////////////// @@ -145,10 +151,67 @@ class PyTitleBar(QWidget): self.minimize_button.released.connect(lambda: parent.showMinimized()) self.maximize_restore_button.released.connect(lambda: self.maximize_restore()) self.close_button.released.connect(lambda: parent.close()) + + # Extra BTNs layout + self.bg_layout.addLayout(self.custom_buttons_layout) + # ADD Buttons - self.bg_layout.addWidget(self.minimize_button) - self.bg_layout.addWidget(self.maximize_restore_button) - self.bg_layout.addWidget(self.close_button) + if is_custom_title_bar: + self.bg_layout.addWidget(self.minimize_button) + self.bg_layout.addWidget(self.maximize_restore_button) + self.bg_layout.addWidget(self.close_button) + + # ADD BUTTONS TO TITLE BAR + # Add btns and emit signals + # /////////////////////////////////////////////////////////////// + def add_menus(self, parameters): + if parameters != None and len(parameters) > 0: + for parameter in parameters: + _btn_icon = Functions.set_svg_icon(parameter['btn_icon']) + _btn_id = parameter['btn_id'] + _btn_tooltip = parameter['btn_tooltip'] + _is_active = parameter['is_active'] + + self.menu = PyTitleButton( + self._parent, + self._app_parent, + btn_id = _btn_id, + tooltip_text = _btn_tooltip, + dark_one = self._dark_one, + bg_color = self._bg_color, + bg_color_hover = self._btn_bg_color_hover, + bg_color_pressed = self._btn_bg_color_pressed, + icon_color = self._icon_color, + icon_color_hover = self._icon_color_active, + icon_color_pressed = self._icon_color_pressed, + icon_color_active = self._icon_color_active, + context_color = self._context_color, + text_foreground = self._text_foreground, + icon_path = _btn_icon, + is_active = _is_active + ) + self.menu.clicked.connect(self.btn_clicked) + self.menu.released.connect(self.btn_released) + + # ADD TO LAYOUT + self.custom_buttons_layout.addWidget(self.menu) + + # ADD DIV + if self._is_custom_title_bar: + self.custom_buttons_layout.addWidget(self.div_3) + + # TITLE BAR MENU EMIT SIGNALS + # /////////////////////////////////////////////////////////////// + def btn_clicked(self): + self.clicked.emit(self.menu) + + def btn_released(self): + self.released.emit(self.menu) + + # SET TITLE BAR TEXT + # /////////////////////////////////////////////////////////////// + def set_title(self, title): + self.title_label.setText(title) # MAXIMIZE / RESTORE # maximize and restore parent window @@ -201,6 +264,7 @@ class PyTitleBar(QWidget): # DIVS self.div_1 = PyDiv(self._div_color) self.div_2 = PyDiv(self._div_color) + self.div_3 = PyDiv(self._div_color) # LEFT FRAME WITH MOVE APP self.top_logo = QLabel() @@ -210,6 +274,11 @@ class PyTitleBar(QWidget): self.title_label.setAlignment(Qt.AlignVCenter) self.title_label.setStyleSheet(f'font: {self._title_size}pt "{self._font_family}"') + # CUSTOM BUTTONS LAYOUT + self.custom_buttons_layout = QHBoxLayout() + self.custom_buttons_layout.setContentsMargins(0,0,0,0) + self.custom_buttons_layout.setSpacing(3) + # MINIMIZE BUTTON self.minimize_button = PyTitleButton( self._parent, diff --git a/gui/widgets/py_title_bar/py_title_button.py b/gui/widgets/py_title_bar/py_title_button.py index efa7391..57a55f5 100644 --- a/gui/widgets/py_title_bar/py_title_button.py +++ b/gui/widgets/py_title_bar/py_title_button.py @@ -26,6 +26,7 @@ class PyTitleButton(QPushButton): parent, app_parent = None, tooltip_text = "", + btn_id = None, width = 30, height = 30, radius = 8, @@ -47,6 +48,7 @@ class PyTitleButton(QPushButton): # SET DEFAULT PARAMETERS self.setFixedSize(width, height) self.setCursor(Qt.PointingHandCursor) + self.setObjectName(btn_id) # PROPERTIES self._bg_color = bg_color @@ -56,7 +58,8 @@ class PyTitleButton(QPushButton): self._icon_color_hover = icon_color_hover self._icon_color_pressed = icon_color_pressed self._icon_color_active = icon_color_active - self._top_margin = self.height() + 3 + self._context_color = context_color + self._top_margin = self.height() + 6 # Set Parameters self._set_bg_color = bg_color self._set_icon_path = icon_path @@ -107,6 +110,7 @@ class PyTitleButton(QPushButton): # CHANGE STYLES # Functions with custom styles + # /////////////////////////////////////////////////////////////// def change_style(self, event): if event == QEvent.Enter: self._set_bg_color = self._bg_color_hover @@ -118,7 +122,7 @@ class PyTitleButton(QPushButton): self.repaint() elif event == QEvent.MouseButtonPress: self._set_bg_color = self._bg_color_pressed - self._set_icon_color = self._icon_color_pressed + self._set_icon_color = self._context_color self.repaint() elif event == QEvent.MouseButtonRelease: self._set_bg_color = self._bg_color_hover @@ -127,6 +131,7 @@ class PyTitleButton(QPushButton): # MOUSE OVER # Event triggered when the mouse is over the BTN + # /////////////////////////////////////////////////////////////// def enterEvent(self, event): self.change_style(QEvent.Enter) self.move_tooltip() @@ -134,6 +139,7 @@ class PyTitleButton(QPushButton): # MOUSE LEAVE # Event fired when the mouse leaves the BTN + # /////////////////////////////////////////////////////////////// def leaveEvent(self, event): self.change_style(QEvent.Leave) self.move_tooltip() @@ -141,6 +147,7 @@ class PyTitleButton(QPushButton): # MOUSE PRESS # Event triggered when the left button is pressed + # /////////////////////////////////////////////////////////////// def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.change_style(QEvent.MouseButtonPress) @@ -151,6 +158,7 @@ class PyTitleButton(QPushButton): # MOUSE RELEASED # Event triggered after the mouse button is released + # /////////////////////////////////////////////////////////////// def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.change_style(QEvent.MouseButtonRelease) @@ -196,6 +204,8 @@ class PyTitleButton(QPushButton): # Move tooltip position self._tooltip.move(pos_x, pos_y) +# TOOLTIP +# /////////////////////////////////////////////////////////////// class _ToolTip(QLabel): # TOOLTIP / LABEL StyleSheet style_tooltip = """ @@ -210,7 +220,6 @@ class _ToolTip(QLabel): font: 800 9pt "Segoe UI"; }} """ - def __init__( self, parent, diff --git a/main.py b/main.py index a308124..094e72f 100644 --- a/main.py +++ b/main.py @@ -71,6 +71,23 @@ class MainWindow(QMainWindow): self.ui.left_menu.clicked.connect(self.left_menu_btn_clicked) self.ui.left_menu.released.connect(self.left_menu_btn_released) + # TITLE BAR / ADD EXTRA BUTTONS + # /////////////////////////////////////////////////////////////// + # ADD MENUS + self.ui.title_bar.add_menus(SetupMainWindow.add_title_bar_menus) + + # SET SIGNALS + self.ui.title_bar.clicked.connect(self.left_menu_btn_clicked) + self.ui.title_bar.released.connect(self.left_menu_btn_released) + + # ADD Title + if self.settings["custom_title_bar"]: + self.ui.title_bar.set_title(self.settings["app_name"]) + else: + self.ui.title_bar.set_title("Welcome to PyOneDark") + + + # SHOW MAIN WINDOW # /////////////////////////////////////////////////////////////// self.show() @@ -79,11 +96,18 @@ class MainWindow(QMainWindow): # Run function when btn is clicked # Check funtion by object name / btn_id # /////////////////////////////////////////////////////////////// + def setup_btns(self): + if self.ui.title_bar.sender() != None: + return self.ui.title_bar.sender() + elif self.ui.left_menu.sender() != None: + return self.ui.left_menu.sender() + def left_menu_btn_clicked(self): # GET BT CLICKED - btn = self.ui.left_menu.sender() + btn = self.setup_btns() - if btn.objectName() == "btn_add_user": + # SELECT / DESELECT BTN HOME + if btn.objectName() == "btn_home": if btn.is_active(): btn.set_active(False) else: @@ -98,7 +122,7 @@ class MainWindow(QMainWindow): # /////////////////////////////////////////////////////////////// def left_menu_btn_released(self): # GET BT CLICKED - btn = self.ui.left_menu.sender() + btn = self.setup_btns() # DEBUG print(f"Button {btn.objectName()}, released!") diff --git a/settings.json b/settings.json index f8e31bc..cf7388c 100644 --- a/settings.json +++ b/settings.json @@ -1,5 +1,6 @@ { "app_name": "PyOneDark - Modern GUI", + "version" : "1.0.0", "custom_title_bar": true, "startup_size": [ 1200,