aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llamachat/ui.py23
-rwxr-xr-xtest_llamachat.py54
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()