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 <sandals@crustytoothpaste.net>
This commit is contained in:
brian m. carlson 2012-10-20 16:24:27 +00:00
parent fd87df193e
commit ff1c3752e9
No known key found for this signature in database
GPG key ID: BF535D811F52F68B

32
newfol
View file

@ -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'),