[chirp_devel] [PATCH] Add "Open Recent" menu to "File" menu in PY3 branch #9371
# HG changeset patch # User Joseph.P.Scanlan@n7xsd.us # Date 1631652611 25200 # Tue Sep 14 13:50:11 2021 -0700 # Branch py3 # Node ID 767a2b7ea346019d66869b61caafab5fe666b932 # Parent 04a5c59091011b5bfe622fbdb6ea07b6fefe20ba Add "Open Recent" menu to "File" menu in PY3 branch #9371
* Limit "Open Recent" menu to 8 files. * Read list of files from config at start of CHIRP. * Update menu when a file is "Open"ed are "Save as"ed. * Most recently opened file is placed at top of menu.
diff -r 04a5c5909101 -r 767a2b7ea346 chirp/wxui/main.py --- a/chirp/wxui/main.py Tue Aug 24 17:43:05 2021 -0700 +++ b/chirp/wxui/main.py Tue Sep 14 13:50:11 2021 -0700 @@ -21,6 +21,9 @@ CONF = config.get() LOG = logging.getLogger(__name__)
+EMPTY_MENU_LABEL = '(none)' +KEEP_RECENT = 8 +OPEN_RECENT_MENU = None
class ChirpEditorSet(wx.Panel): def __init__(self, radio, filename, *a, **k): @@ -166,6 +169,7 @@ CSVRadio = directory.get_radio('Generic_CSV') radio = CSVRadio(None)
+ self.adj_menu_open_recent(filename) editorset = ChirpEditorSet(radio, filename, self._editors) self.add_editorset(editorset, select=select)
@@ -185,6 +189,23 @@ open_item = file_menu.Append(wx.ID_OPEN) self.Bind(wx.EVT_MENU, self._menu_open, open_item)
+ self.OPEN_RECENT_MENU = wx.Menu() + i = 0 + fn = CONF.get("recent%i" % i, "state") + while fn: + submenu_item = self.OPEN_RECENT_MENU.Append(wx.ID_ANY, fn) + self.Bind(wx.EVT_MENU, self._menu_open_recent, submenu_item) + i += 1 + if i >= KEEP_RECENT: + break + fn = CONF.get("recent%i" % i, "state") + if self.OPEN_RECENT_MENU.GetMenuItemCount() <= 0: + submenu_item = self.OPEN_RECENT_MENU.Append(wx.ID_ANY, + EMPTY_MENU_LABEL) + submenu_item.Enable(False) + self.Bind(wx.EVT_MENU, self._menu_open_recent, submenu_item) + file_menu.Append(wx.ID_ANY, 'Open Recent', self.OPEN_RECENT_MENU) + save_item = file_menu.Append(wx.ID_SAVE) self.Bind(wx.EVT_MENU, self._menu_save, save_item)
@@ -299,6 +320,46 @@ self.Bind(wx.EVT_MENU, self._menu_open, tbopen) tb.Realize()
+ def adj_menu_open_recent(self, filename): + ### Travel the Open Recent menu looking for filename + found_mi = None + empty_mi = None + for i in range(0, self.OPEN_RECENT_MENU.GetMenuItemCount()): + menu_item = self.OPEN_RECENT_MENU.FindItemByPosition(i) + fn = menu_item.GetLabel() + if fn == filename: + found_mi = menu_item + if fn == EMPTY_MENU_LABEL: + empty_mi = menu_item + + ### Move filename to top of menu or add it to top if it wasn't found + if found_mi: + self.OPEN_RECENT_MENU.Remove(found_mi) + self.OPEN_RECENT_MENU.Prepend(found_mi) + else: + submenu_item = self.OPEN_RECENT_MENU.Prepend(wx.ID_ANY, filename) + self.Bind(wx.EVT_MENU, self._menu_open_recent, submenu_item) + + ### Get rid of the place holder used in an empty menu + if empty_mi: + self.OPEN_RECENT_MENU.Delete(empty_mi) + + ### Trim the menu length + if self.OPEN_RECENT_MENU.GetMenuItemCount() > KEEP_RECENT: + for i in range(self.OPEN_RECENT_MENU.GetMenuItemCount() - 1, + KEEP_RECENT - 1, -1): + extra_mi = self.OPEN_RECENT_MENU.FindItemByPosition(i) + self.OPEN_RECENT_MENU.Delete(extra_mi) + + ### Travel the Open Recent menu and save file names to config. + for i in range(0, self.OPEN_RECENT_MENU.GetMenuItemCount()): + if i >= KEEP_RECENT: + break + menu_item = self.OPEN_RECENT_MENU.FindItemByPosition(i) + fn = menu_item.GetLabel() + CONF.set("recent%i" % i, fn, "state") + config._CONFIG.save() + def _editor_page_changed(self, event): self._editors.GetPage(event.GetSelection()) self._update_window_for_editor() @@ -379,6 +440,10 @@ filename = fd.GetPath() self.open_file(str(filename))
+ def _menu_open_recent(self, event): + filename = self.OPEN_RECENT_MENU.FindItemById(event.GetId()).GetLabel() + self.open_file(filename) + def _menu_save_as(self, event): eset = self.current_editorset wildcard = 'CHIRP %(vendor)s %(model)s Files (*.%(ext)s)|*.%(ext)s' % { @@ -394,6 +459,7 @@ return filename = fd.GetPath() eset.save(filename) + self.adj_menu_open_recent(filename) self._update_editorset_title(eset)
def _menu_save(self, event):
participants (1)
-
Joseph.P.Scanlan@n7xsd.us