feat(window): add minimize/maximize button

- add minimize and maximize button to title bar
- improve smoothness of window moving
- prevent moving window below taskbar
This commit is contained in:
BuildTools 2024-09-01 21:10:13 -07:00
parent 81b2d4137b
commit 79deff70ed
No known key found for this signature in database
GPG Key ID: 3270C066C15D530B
1 changed files with 52 additions and 12 deletions

View File

@ -1,4 +1,4 @@
from PySide6.QtCore import QPoint from PySide6.QtCore import QPoint, Qt
from PySide6.QtWidgets import QHBoxLayout, QLabel, QMenuBar, QPushButton, QWidget from PySide6.QtWidgets import QHBoxLayout, QLabel, QMenuBar, QPushButton, QWidget
@ -43,7 +43,29 @@ def __init__(self, parent=None) -> None:
""" """
) )
# Enable mouse tracking for smoother movement
self.setMouseTracking(True)
# Add maximize button
self.maximize_button = QPushButton("")
self.maximize_button.setFixedSize(30, 30)
self.maximize_button.setStyleSheet(
"""
QPushButton {
border: none;
background-color: transparent;
padding: 2px;
font-size: 15px;
}
QPushButton:hover {
background-color: rgba(255, 255, 255, 0.1);
}
"""
)
self.maximize_button.clicked.connect(self.toggle_maximize)
layout.addWidget(self.minimize_button) layout.addWidget(self.minimize_button)
layout.addWidget(self.maximize_button)
layout.addWidget(self.close_button) layout.addWidget(self.close_button)
self.minimize_button.clicked.connect(self.parent.showMinimized) self.minimize_button.clicked.connect(self.parent.showMinimized)
@ -51,22 +73,40 @@ def __init__(self, parent=None) -> None:
self.start = QPoint(0, 0) self.start = QPoint(0, 0)
self.pressing = False self.pressing = False
self.isMaximized = False # Flag to track maximization state
self.normal_size = None # Store the normal window size
def mousePressEvent(self, event) -> None: def mousePressEvent(self, event) -> None:
self.start = self.mapToGlobal(event.pos()) if event.button() == Qt.LeftButton:
self.pressing = True self.start = event.globalPos() - self.parent.frameGeometry().topLeft()
self.pressing = True
def mouseMoveEvent(self, event) -> None: def mouseMoveEvent(self, event) -> None:
if self.pressing: if self.pressing:
end = self.mapToGlobal(event.pos()) new_pos = event.globalPos() - self.start
movement = end - self.start screen = self.parent.screen()
self.parent.setGeometry( screen_geo = screen.availableGeometry()
self.parent.x() + movement.x(),
self.parent.y() + movement.y(), # Check if the new position would put the titlebar below the taskbar
self.parent.width(), if (
self.parent.height(), new_pos.y() + self.parent.height() > screen_geo.bottom()
) ): # Use screen_geo.bottom()
self.start = end new_pos.setY(screen_geo.bottom() - self.parent.height())
self.parent.move(new_pos)
def mouseReleaseEvent(self, event) -> None: def mouseReleaseEvent(self, event) -> None:
self.pressing = False self.pressing = False
def toggle_maximize(self):
if self.isMaximized:
self.parent.showNormal()
if self.normal_size:
self.parent.resize(self.normal_size)
self.maximize_button.setText("") # Change back to maximize symbol
self.isMaximized = False
else:
self.normal_size = self.parent.size() # Store the current size
self.parent.showMaximized()
self.maximize_button.setText("") # Change to restore symbol
self.isMaximized = True