diff --git a/dikte/home_ui.py b/dikte/home_ui.py index df97e6c..c25ac6a 100644 --- a/dikte/home_ui.py +++ b/dikte/home_ui.py @@ -160,10 +160,10 @@ class HomeWindow(QWidget): self.mode_pages["file"] = settings.task_pages["file"] self.mode_pages["meeting"] = self._scrolled(self._meeting_page()) self.mode_pages["ask"] = self._scrolled(self._assistant_page()) - self.mode_pages["history"] = self._history_page() + self.mode_pages["history"] = self._scrolled(self._history_page()) for page in self.mode_pages.values(): self.pages.addWidget(page) - self.footer = _label("", "footer") + self.footer = _label("", "footer", True) root.addWidget(self.footer) self._timer = QTimer(self) self._timer.setInterval(500) @@ -189,6 +189,7 @@ class HomeWindow(QWidget): page.setMaximumWidth(680) area = QScrollArea() area.setWidgetResizable(True) + area.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignTop) area.setFrameShape(QFrame.Shape.NoFrame) area.setWidget(page) return area @@ -282,13 +283,16 @@ class HomeWindow(QWidget): layout.addWidget(self.ask_status) self.ask_scope = _label("", "muted") layout.addWidget(self.ask_scope) + actions = QHBoxLayout() self.ask_button = _button("", self._ask, "primary") - layout.addWidget(self.ask_button) + actions.addWidget(self.ask_button) + actions.addWidget(_button(t("Start a new conversation"), self.controller.reset_conversation)) + actions.addStretch() + layout.addLayout(actions) self.ask_pause = _button(t("Pause the recording"), self._pause) layout.addWidget(self.ask_pause) self.ask_cancel = _button(t("Stop"), self._cancel_ask) layout.addWidget(self.ask_cancel) - layout.addWidget(_button(t("Start a new conversation"), self.controller.reset_conversation)) self.ask_error = _label() layout.addWidget(self.ask_error) self.ask_output = QPlainTextEdit() diff --git a/dikte/settings_ui.py b/dikte/settings_ui.py index 6620117..44c6e8e 100644 --- a/dikte/settings_ui.py +++ b/dikte/settings_ui.py @@ -1154,6 +1154,7 @@ class SettingsWindow(QDialog): page.setMaximumWidth(680) area = QScrollArea() area.setWidgetResizable(True) + area.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignTop) area.setFrameShape(QScrollArea.Shape.NoFrame) area.setWidget(page) for box in page.findChildren((QComboBox, QAbstractSpinBox)): @@ -1986,14 +1987,11 @@ class SettingsWindow(QDialog): row = QHBoxLayout() row.addWidget(copy) row.addWidget(self.minutes_retry) + row.addWidget(folder) + row.addWidget(delete) + row.addWidget(reload_) row.addStretch() layout.addLayout(row) - more = QHBoxLayout() - more.addWidget(folder) - more.addWidget(delete) - more.addWidget(reload_) - more.addStretch() - layout.addLayout(more) return page def _file_tab(self): diff --git a/docs/settings-agent.webp b/docs/settings-agent.webp index abfa761..afb5e42 100644 Binary files a/docs/settings-agent.webp and b/docs/settings-agent.webp differ diff --git a/docs/settings-api.webp b/docs/settings-api.webp index 3495ad2..3558f6d 100644 Binary files a/docs/settings-api.webp and b/docs/settings-api.webp differ diff --git a/docs/settings-audio-file.webp b/docs/settings-audio-file.webp index 6a03165..747eba9 100644 Binary files a/docs/settings-audio-file.webp and b/docs/settings-audio-file.webp differ diff --git a/docs/settings-meeting.webp b/docs/settings-meeting.webp index 844cf66..578d3ce 100644 Binary files a/docs/settings-meeting.webp and b/docs/settings-meeting.webp differ diff --git a/tests/test_home_ui.py b/tests/test_home_ui.py index 6165aea..491084a 100644 --- a/tests/test_home_ui.py +++ b/tests/test_home_ui.py @@ -4,7 +4,7 @@ from types import SimpleNamespace from unittest import mock from PyQt6.QtCore import Qt -from PyQt6.QtWidgets import QApplication, QMessageBox +from PyQt6.QtWidgets import QApplication, QMessageBox, QPushButton from dikte import config as cfg, home_ui, i18n from dikte.app import Dikte @@ -86,6 +86,40 @@ class Home(DikteTest): self.assertLess(self.window.meeting_button.width(), 300) self.assertLessEqual(self.settings.minutes_view.width(), 680) + def test_wide_windows_center_every_task_and_settings_page(self): + self.window.resize(1900, 1000) + for mode, area in self.window.mode_pages.items(): + self.window.show_mode(mode) + QApplication.processEvents() + with self.subTest(mode=mode): + self.assertLessEqual(area.widget().width(), 680) + self.assertAlmostEqual(area.widget().geometry().center().x(), + area.viewport().rect().center().x(), delta=1) + self.settings.resize(1900, 1000) + self.settings.show() + for index in range(self.settings.tabs.count()): + self.settings.tabs.setCurrentIndex(index) + QApplication.processEvents() + area = self.settings.tabs.widget(index) + with self.subTest(settings=index): + self.assertAlmostEqual(area.widget().geometry().center().x(), + area.viewport().rect().center().x(), delta=1) + + def test_meeting_and_assistant_actions_share_one_row(self): + self.window.resize(620, 760) + for mode, labels in ( + ("meeting", ("Copy", "Write it up", "Open the folder", "Delete selected", "Reload")), + ("ask", (self.window.ask_button.text(), "Start a new conversation")), + ): + self.window.show_mode(mode) + QApplication.processEvents() + page = self.window.mode_pages[mode] + buttons = {b.text(): b for b in page.findChildren(QPushButton)} + positions = [buttons[label].mapTo(page, buttons[label].rect().center()).y() + for label in labels] + with self.subTest(mode=mode): + self.assertLessEqual(max(positions) - min(positions), 1) + def test_empty_state_does_not_invent_a_transcript(self): self.assertEqual(self.window.latest_text.toPlainText(), "") self.assertFalse(self.window.copy_button.isEnabled())