diff options
| -rw-r--r-- | llamachat/ui.py | 23 | ||||
| -rwxr-xr-x | test_llamachat.py | 54 |
2 files changed, 73 insertions, 4 deletions
diff --git a/llamachat/ui.py b/llamachat/ui.py index 11fffae..3ea3598 100644 --- a/llamachat/ui.py +++ b/llamachat/ui.py @@ -594,9 +594,21 @@ class ChatWindow(QMainWindow): self.attach_label.hide() right_layout.addWidget(self.attach_label) + self.status_row = QWidget() + status_row = QHBoxLayout(self.status_row) + status_row.setContentsMargins(0, 0, 0, 0) + status_row.setSpacing(6) self.status_label = QLabel() - self.status_label.hide() - right_layout.addWidget(self.status_label) + self.status_label.setWordWrap(True) + status_row.addWidget(self.status_label, 1) + self.status_dismiss = QToolButton() + self.status_dismiss.setText("✕") + self.status_dismiss.setToolTip("Dismiss this message") + self.status_dismiss.setAutoRaise(True) + self.status_dismiss.clicked.connect(self.hide_status) + status_row.addWidget(self.status_dismiss, 0, Qt.AlignTop) + self.status_row.hide() + right_layout.addWidget(self.status_row) self.input = QPlainTextEdit() self.input.setPlaceholderText( @@ -1683,10 +1695,13 @@ class ChatWindow(QMainWindow): if error else "padding: 4px;" ) - self.status_label.show() + # Every status message is dismissable: errors persist until something + # replaces them, and a transient one can be cleared early too. + self.status_dismiss.show() + self.status_row.show() def hide_status(self) -> None: - self.status_label.hide() + self.status_row.hide() # -- window behaviour ------------------------------------------------- diff --git a/test_llamachat.py b/test_llamachat.py index 74b0d0c..bb5f097 100755 --- a/test_llamachat.py +++ b/test_llamachat.py @@ -843,6 +843,59 @@ def test_shortcuts(): print("ok shortcuts") +def test_status_dismiss(): + """Status messages show a dismiss button; clicking it hides them.""" + os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + from PySide6.QtWidgets import QApplication + + from llamachat import backend as _backend + from llamachat import config as _config + from llamachat import models as _models + from llamachat.ui import ChatWindow + + app = QApplication.instance() or QApplication([]) + + with tempfile.TemporaryDirectory() as tmp: + cfg = _config.load(Path(tmp) / "config.toml") + cfg.prompts_dir = Path(tmp) / "prompts" + cfg.db_path = Path(tmp) / "t.db" + history = db.History(cfg.db_path) + window = ChatWindow( + cfg, + history, + _backend.MultiClient(cfg.providers, cfg.request_timeout), + _config.parse_presets(cfg.presets_path), + _models.ModelStore(cfg.models_path), + ) + window.show() + app.processEvents() + + # Errors are dismissable: the ✕ button appears beside the message. + window.show_status("boom", error=True) + app.processEvents() + assert not window.status_row.isHidden() + assert window.status_label.text() == "boom" + assert not window.status_dismiss.isHidden() + + window.status_dismiss.click() + app.processEvents() + assert window.status_row.isHidden() + + # Transient statuses are dismissable too. + window.show_status("searching: otters…") + app.processEvents() + assert not window.status_row.isHidden() + assert not window.status_dismiss.isHidden() + + window.status_dismiss.click() + app.processEvents() + assert window.status_row.isHidden() + + window.close() + history.close() + print("ok status dismiss") + + def test_version_matches_changelog(): """The package version must be the newest release in the changelog.""" import re @@ -3168,6 +3221,7 @@ if __name__ == "__main__": test_unbalanced_backticks() test_sidebar_toggle() test_shortcuts() + test_status_dismiss() test_system_qt_theme_guard() test_version_matches_changelog() test_venv_discovery() |
