Improve "driver messages" dialog

Jamming a hundred errors into a MessageBox is not scalable and looks
pretty dumb after a few. This makes it into a proper dialog that
shows the first line of each and lets the user select each for better
readability.

Related to #11519
This commit is contained in:
Dan Smith 2024-09-04 15:31:11 -07:00 committed by Dan Smith
parent 3ed39bfdfa
commit 355c0c52d0
2 changed files with 50 additions and 9 deletions

View File

@ -22,7 +22,6 @@ import os
import platform
import shutil
import tempfile
import textwrap
import threading
import wx
@ -711,8 +710,51 @@ def temporary_debug_log():
return dst
class MultiErrorDialog(wx.Dialog):
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
vbox = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(vbox)
self.choices = []
self.choice_box = wx.ListBox(self)
vbox.Add(self.choice_box, border=10, proportion=0,
flag=wx.EXPAND | wx.ALL)
self.message = wx.TextCtrl(self)
self.message.SetEditable(False)
vbox.Add(self.message, border=10, proportion=1,
flag=wx.EXPAND | wx.ALL)
buttons = self.CreateButtonSizer(wx.OK)
vbox.Add(buttons, border=10, flag=wx.ALL)
self.Bind(wx.EVT_BUTTON, self._button)
self.choice_box.Bind(wx.EVT_LISTBOX, self._selected)
self.SetMinSize((600, 400))
self.Fit()
self.Center()
def _button(self, event):
self.EndModal(wx.ID_OK)
def select(self, index):
error = self.choices[index]
self.message.SetValue('%s in %s:\n%s' % (
error.levelname, error.module, error.getMessage()))
def _selected(self, event):
self.select(event.GetInt())
def set_errors(self, errors):
self.choices = errors
self.choice_box.Set([x.getMessage() for x in self.choices])
self.select(0)
@contextlib.contextmanager
def expose_logs(level, root, label, maxlen=128):
def expose_logs(level, root, label, maxlen=128, parent=None):
if not isinstance(root, tuple):
root = (root,)
@ -725,9 +767,7 @@ def expose_logs(level, root, label, maxlen=128):
lines = list(itertools.chain.from_iterable(x.get_history()
for x in histories))
if lines:
msg = os.linesep.join(textwrap.shorten(x.getMessage(), maxlen)
for x in lines)
d = wx.MessageDialog(
None, str(msg), label,
style=wx.OK | wx.ICON_INFORMATION)
d = MultiErrorDialog(parent)
d.SetTitle(label)
d.set_errors(lines)
d.ShowModal()

View File

@ -551,7 +551,8 @@ class ChirpMain(wx.Frame):
self.enable_bugreport()
CSVRadio = directory.get_radio('Generic_CSV')
label = _('Driver messages')
with common.expose_logs(logging.WARNING, 'chirp.drivers', label):
with common.expose_logs(logging.WARNING, 'chirp.drivers', label,
parent=self):
if exists:
if not os.path.exists(filename):
raise FileNotFoundError(
@ -1356,7 +1357,7 @@ class ChirpMain(wx.Frame):
r = d.ShowModal()
if r == wx.ID_YES:
with common.expose_logs(logging.WARNING, 'chirp.drivers',
_('Import messages')):
_('Import messages'), parent=self):
radio = directory.get_radio_by_image(filename)
self.current_editorset.current_editor.memedit_import_all(radio)
elif r == wx.ID_NO: