fix: fit main window within screen on startup
This commit is contained in:
+68
-1
@@ -8,11 +8,72 @@ from .tabs.collect import CollectTab
|
||||
from .tabs.generate import GenerateTab
|
||||
from .tabs.settings import SettingsTab
|
||||
from .widgets import *
|
||||
|
||||
PREFERRED_WINDOW_SIZE = (1180, 760)
|
||||
MIN_WINDOW_SIZE = (960, 640)
|
||||
WINDOW_SCREEN_MARGIN = 40
|
||||
|
||||
|
||||
def _screen_available_geometry():
|
||||
app = QApplication.instance()
|
||||
if app is None:
|
||||
return None
|
||||
screen = app.primaryScreen()
|
||||
if screen is None:
|
||||
return None
|
||||
return screen.availableGeometry()
|
||||
|
||||
|
||||
def _bounded_dimension(available_size, preferred_size, minimum_size, margin):
|
||||
if available_size <= 0:
|
||||
return preferred_size
|
||||
if available_size > margin * 2:
|
||||
maximum = available_size - margin * 2
|
||||
else:
|
||||
maximum = available_size
|
||||
if maximum >= minimum_size:
|
||||
return max(minimum_size, min(preferred_size, maximum))
|
||||
return max(1, min(preferred_size, maximum))
|
||||
|
||||
|
||||
def _fit_and_center_window(
|
||||
window,
|
||||
available_geometry=None,
|
||||
preferred_size=PREFERRED_WINDOW_SIZE,
|
||||
minimum_size=MIN_WINDOW_SIZE,
|
||||
margin=WINDOW_SCREEN_MARGIN,
|
||||
):
|
||||
available = available_geometry if available_geometry is not None else _screen_available_geometry()
|
||||
if available is None or available.width() <= 0 or available.height() <= 0:
|
||||
window.resize(*preferred_size)
|
||||
return
|
||||
|
||||
width = _bounded_dimension(
|
||||
available.width(),
|
||||
preferred_size[0],
|
||||
minimum_size[0],
|
||||
margin,
|
||||
)
|
||||
height = _bounded_dimension(
|
||||
available.height(),
|
||||
preferred_size[1],
|
||||
minimum_size[1],
|
||||
margin,
|
||||
)
|
||||
window.resize(width, height)
|
||||
|
||||
x = available.x() + max(0, (available.width() - width) // 2)
|
||||
y = available.y() + max(0, (available.height() - height) // 2)
|
||||
max_x = available.x() + max(0, available.width() - width)
|
||||
max_y = available.y() + max(0, available.height() - height)
|
||||
window.move(min(max(x, available.x()), max_x), min(max(y, available.y()), max_y))
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
"""Main application window with the fixed five-tab workflow."""
|
||||
|
||||
def __init__(self, db_path=None, config=None, config_path=None, ai_models_path=None):
|
||||
super().__init__()
|
||||
self._initial_window_fit_applied_after_show = False
|
||||
self.config = appconfig.load_config(config_path or appconfig.CONFIG_PATH) if config is None else config
|
||||
self.config_path = (
|
||||
config_path
|
||||
@@ -26,7 +87,7 @@ class MainWindow(QMainWindow):
|
||||
or appconfig.AI_MODELS_PATH
|
||||
)
|
||||
self.setWindowTitle("蝦皮圈優化助手")
|
||||
self.resize(1180, 760)
|
||||
_fit_and_center_window(self)
|
||||
self.setStyleSheet(BUTTON_BASE_STYLE)
|
||||
self._settings_tab_index = TAB_TITLES.index("⑤ 设置")
|
||||
self._last_tab_index = 0
|
||||
@@ -41,6 +102,12 @@ class MainWindow(QMainWindow):
|
||||
self.setCentralWidget(self.tabs)
|
||||
self.statusBar().showMessage("就绪")
|
||||
|
||||
def showEvent(self, event):
|
||||
super().showEvent(event)
|
||||
if not self._initial_window_fit_applied_after_show:
|
||||
_fit_and_center_window(self)
|
||||
self._initial_window_fit_applied_after_show = True
|
||||
|
||||
def _build_tab(self, title):
|
||||
if title == "① 导入采集":
|
||||
return CollectTab(
|
||||
|
||||
Reference in New Issue
Block a user