From ff1c3752e9e59fecf0658103dc5cde0fe37d30db Mon Sep 17 00:00:00 2001 From: "brian m. carlson" Date: Sat, 20 Oct 2012 16:24:27 +0000 Subject: [PATCH] Rework record deletion code. We used to attempt to remove deleted records from the listing as soon as we deleted them. This caused all sorts of rendering bugs (usually involving not removing the record from the list) which in turn led to users retrying the operation, which led to them unintentionally deleting multiple records. Now the deleted records are marked by a color change and are removed from the database automatically when it is written to disk. Signed-off-by: brian m. carlson --- newfol | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/newfol b/newfol index 5604b50..963781a 100755 --- a/newfol +++ b/newfol @@ -55,7 +55,7 @@ class KeyboardShortcuts(dict): self["meta d"] = "right" self["meta k"] = "left" self["meta g"] = "delete" - #self["meta y"] = "remove" + self["meta y"] = "remove" self["tab"] = "next-field" self["meta f"] = "next-field" self["meta j"] = "previous-field" @@ -774,22 +774,24 @@ class RecordListView(ListView): else: self._render_type = "urwid" def _delete_selected_record(self): - rec = self.items[self._get_selected_item_position()] - recs = list(filter(lambda x: x is not rec, DatabaseData().records)) - DatabaseData().records = recs - self.items = list(filter(lambda x: x is not rec, self.items)) - try: - self._delete_record(rec) - except: - pass - self.rerender(self.loop) + selected = self._get_selected_item_position() + rec = self.items[selected] + rec.deleted = True + self.render(self.loop) + self.listwalker.set_focus(selected) def _render_records(self, loop, title, recs, fields): self.loop = loop formatter = RecordFormatter(recs, fields) - content = urwid.SimpleListWalker([ - urwid.AttrMap(urwid.Text(text), "item", - "focused-item") - for text in formatter.format()]) + def attr_maps(formatter, recs): + pairs = zip(formatter.format(), recs) + result = [] + for text, rec in pairs: + attrs = ["item", "focused-item"] + if rec.deleted: + attrs = ["deleted", "focused-deleted"] + result.append(urwid.AttrMap(urwid.Text(text), *attrs)) + return result + content = urwid.SimpleListWalker(attr_maps(formatter, recs)) if self._render_type == "urwid": return self._render_listview(title, recs, content) elif self._render_type == "editor-ro": @@ -1057,6 +1059,8 @@ def start_curses(): palette = [ ('bg', 'black', 'yellow', '', 'black', '#ffa'), ('text', 'black', 'yellow', '', '#860', '#ffa'), + ('focused-deleted', 'dark gray', 'light red', '', '#666', '#a00'), + ('deleted', 'light red', 'dark gray', '', '#a00', '#666'), ('focused-item', 'yellow', 'black', '', '#ffa', '#860'), ('item', 'text'), ('description', 'text'),