Only replace the exact same message

If we have a error message followed by an info message with the same text, they
should both be shown, not replaced automatically.
This commit is contained in:
Florian Bruhin 2022-06-14 16:51:58 +02:00
parent 1d7b89fd00
commit 676e016771
2 changed files with 41 additions and 9 deletions

View File

@ -120,7 +120,7 @@ class MessageView(QWidget):
self._clear_timer.timeout.connect(self.clear_messages)
config.instance.changed.connect(self._set_clear_timer_interval)
self._last_text = None
self._last_info = None
@config.change_filter('messages.timeout')
def _set_clear_timer_interval(self):
@ -142,14 +142,14 @@ class MessageView(QWidget):
for widget in self._messages:
self._remove_message(widget)
self._messages = []
self._last_text = None
self._last_info = None
self.hide()
self._clear_timer.stop()
@pyqtSlot(message.MessageInfo)
def show_message(self, info: message.MessageInfo) -> None:
"""Show the given message with the given MessageLevel."""
if info.text == self._last_text:
if info == self._last_info:
return
if info.replace is not None:
@ -164,7 +164,7 @@ class MessageView(QWidget):
self._vbox.addWidget(widget)
widget.show()
self._messages.append(widget)
self._last_text = info.text
self._last_info = info
self.show()
self.update_geometry.emit()
if config.val.messages.timeout != 0:

View File

@ -122,11 +122,43 @@ def test_rich_text(view, qtbot, rich, higher, expected_format, replace):
assert height2 == height1
def test_show_message_twice(view):
"""Show the same message twice -> only one should be shown."""
view.show_message(message.MessageInfo(usertypes.MessageLevel.info, 'test'))
view.show_message(message.MessageInfo(usertypes.MessageLevel.info, 'test'))
assert len(view._messages) == 1
@pytest.mark.parametrize("info1, info2, count", [
# same
(
message.MessageInfo(usertypes.MessageLevel.info, 'test'),
message.MessageInfo(usertypes.MessageLevel.info, 'test'),
1,
),
# different text
(
message.MessageInfo(usertypes.MessageLevel.info, 'test'),
message.MessageInfo(usertypes.MessageLevel.info, 'test2'),
2,
),
# different level
(
message.MessageInfo(usertypes.MessageLevel.info, 'test'),
message.MessageInfo(usertypes.MessageLevel.error, 'test'),
2,
),
# different rich text
(
message.MessageInfo(usertypes.MessageLevel.info, 'test', rich=True),
message.MessageInfo(usertypes.MessageLevel.info, 'test', rich=False),
2,
),
# different replaces
(
message.MessageInfo(usertypes.MessageLevel.info, 'test'),
message.MessageInfo(usertypes.MessageLevel.info, 'test', replace='test'),
2,
),
])
def test_show_message_twice(view, info1, info2, count):
"""Show the exact same message twice -> only one should be shown."""
view.show_message(info1)
view.show_message(info2)
assert len(view._messages) == count
def test_show_message_twice_after_first_disappears(qtbot, view):