Skip to content

Commit

Permalink
Improve "driver messages" dialog
Browse files Browse the repository at this point in the history
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
  • Loading branch information
kk7ds committed Sep 4, 2024
1 parent 3ed39bf commit 355c0c5
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 9 deletions.
54 changes: 47 additions & 7 deletions chirp/wxui/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import platform
import shutil
import tempfile
import textwrap
import threading

import wx
Expand Down Expand Up @@ -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,)

Expand All @@ -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()
5 changes: 3 additions & 2 deletions chirp/wxui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,8 @@ def open_file(self, filename, exists=True, select=True, rclass=None):
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(
Expand Down Expand Up @@ -1356,7 +1357,7 @@ def _menu_import(self, event):
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:
Expand Down

0 comments on commit 355c0c5

Please sign in to comment.