Skip to content

Commit 9246a1f

Browse files
committed
Handle indentation
1 parent a83e8db commit 9246a1f

File tree

3 files changed

+74
-24
lines changed

3 files changed

+74
-24
lines changed

widget/edit.py

Lines changed: 68 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,32 @@ def __init__(self):
3535
], 3, 1, 0, urwid.LEFT)
3636

3737
class Item(urwid.Columns):
38-
def __init__(self, item: gkeepapi.node.ListItem):
38+
def __init__(self, item: gkeepapi.node.ListItem, indented=None):
3939
self.id = item.id
40+
self.indented = indented if indented is not None else item.indented
41+
self.w_indent = urwid.Text('')
4042
self.w_checkbox = urwid.Text(u'☑' if item.checked else u'☐')
4143
self.w_text = urwid_readline.ReadlineEdit(edit_text=item.text)
4244
super(Item, self).__init__([
45+
(urwid.PACK, self.w_indent),
4346
(urwid.PACK, self.w_checkbox),
4447
self.w_text,
4548
], dividechars=1)
4649

50+
self._updateIndent()
51+
52+
def indent(self):
53+
self.indented = True
54+
self._updateIndent()
55+
56+
def dedent(self):
57+
self.indented = False
58+
self._updateIndent()
59+
60+
def _updateIndent(self):
61+
self.w_indent.set_text(' ' if self.indented else '')
62+
self._invalidate()
63+
4764
def setPos(self, pos):
4865
self.w_text.edit_pos = pos
4966

@@ -94,24 +111,35 @@ def actual_key(unhandled):
94111
if key == 'enter':
95112
pos = 0
96113
text = ''
114+
indented = None
97115
if self.focus is not None:
98116
text = self.focus.cutToEnd()
99117
pos = self.focus_position + 1
100118

101-
listitem = gkeepapi.node.ListItem()
102-
listitem.text = text
103-
self.body.insert(pos, Item(listitem))
119+
if pos > 0:
120+
indented = self.body[pos - 1].indented
121+
item = gkeepapi.node.ListItem()
122+
item.text = text
123+
self.body.insert(pos, Item(item, indented))
104124
self.focus.setPos(0)
105125
self.focus_position = pos
106126
key = None
107-
if key == 'backspace':
127+
elif key == 'backspace':
108128
if self.focus_position > 0:
109129
text = self.body[self.focus_position].getText()
110130
last = self.focus_position == len(self.body) - 1
111131
del self.body[self.focus_position]
112132
if not last:
113133
self.focus_position -= 1
114134
self.focus.appendText(text)
135+
elif key == 'meta [':
136+
self.body[self.focus_position].dedent()
137+
key = None
138+
elif key == 'meta ]':
139+
if self.focus_position > 0:
140+
self.body[self.focus_position].indent()
141+
key = None
142+
return key
115143

116144
return key
117145

@@ -127,7 +155,7 @@ def __init__(self, app: 'application.Application', note: gkeepapi.node.TopLevelN
127155
self.w_list = Items()
128156
self.w_labels = widget.labels.Labels()
129157

130-
self.w_header = urwid.Text(u'', align=urwid.RIGHT)
158+
self.w_state = urwid.Text(u'', align=urwid.RIGHT)
131159
self.w_footer = urwid.Text(u'', align=urwid.RIGHT)
132160
self.w_content = urwid.Frame(
133161
self.w_list,
@@ -143,16 +171,15 @@ def __init__(self, app: 'application.Application', note: gkeepapi.node.TopLevelN
143171
left=1,
144172
right=1
145173
),
146-
header=self.w_header,
174+
header=self.w_state,
147175
footer=self.w_footer,
148176
),
149177
note.color.value
150178
)
151179

152180
self._updateContent()
153181
self._updateLabels()
154-
self._updatePinned()
155-
self._updateArchived()
182+
self._updateState()
156183

157184
def _updateContent(self):
158185
self.w_title.set_edit_text(self.note.title)
@@ -181,38 +208,56 @@ def _updateLabels(self):
181208

182209
self.w_content.contents['footer'] = w_labels
183210

184-
def _updateArchived(self):
185-
self.w_footer.set_text('📥' if self.note.archived else '')
186-
187-
def _updatePinned(self):
188-
self.w_header.set_text('📍' if self.note.pinned else '')
211+
def _updateState(self):
212+
parts = [
213+
'🔄' if self.note.dirty else ' ',
214+
'🗃' if self.note.archived else ' ',
215+
'📍' if self.note.pinned else ' ',
216+
]
217+
self.w_state.set_text(''.join(parts))
189218

190219
def _save(self):
191220
self.note.title = self.w_title.get_edit_text()
192221
if isinstance(self.note, gkeepapi.node.List):
193-
for child in self.note.children:
194-
self.note.remove(child)
222+
for item in self.note.items:
223+
self.note.remove(item)
195224

196-
entries = {item.id: item for item in self.w_list.body}
197-
old_items = {item.id: item for item in self.note.children}
198-
for id_, w_item in entries.items():
225+
old_items = {item.id: item for item in self.note.items}
226+
for i, w_item in enumerate(self.w_list.body):
199227
item = gkeepapi.node.ListItem(parent_id=self.note.id)
200-
if id_ in old_items:
201-
item = old_items[id_]
228+
if w_item.id in old_items:
229+
item = old_items[w_item.id]
230+
231+
item.checked = True
202232
item.text = w_item.getText()
203233
self.note.append(item)
234+
235+
curr = None
236+
prev = item.super_list_item_id
237+
if i > 0 and w_item.indented:
238+
curr = self.w_list.body[i - 1].id
239+
240+
if prev != curr:
241+
if prev is not None:
242+
old_items[prev].dedent(item)
243+
244+
if curr is not None:
245+
raise Exception(curr + str(self.note._children.keys()))
246+
self.note.get(curr).indent(item)
247+
248+
204249
else:
205250
self.note.text = self.w_text.get_edit_text()
206251

207252
def keypress(self, size, key):
208253
key = super(Edit, self).keypress(size, key)
209254
if key == 'f':
210255
self.note.pinned = not self.note.pinned
211-
self._updatePinned()
256+
self._updateState()
212257
key = None
213258
elif key == 'e':
214259
self.note.archived = not self.note.archived
215-
self._updateArchived()
260+
self._updateState()
216261
key = None
217262
elif key == 'esc':
218263
self._save()

widget/help.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
('f', 'Pin or unpin notes'),
2121
('e', 'Archive note'),
2222

23+
'Editor',
24+
('meta + [', 'Dedent list item'),
25+
('meta + ]', 'Indent list item'),
26+
2327
'Misc',
2428
('?', 'Open keyboard shortcut help'),
2529
('Esc', 'Finish editing / Quit'),

widget/note.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ def _updateFocus(self, focus):
6464

6565
def _updateState(self):
6666
parts = [
67-
'📥' if self.note.archived else ' ',
67+
'🔄' if self.note.dirty else ' ',
68+
'🗃' if self.note.archived else ' ',
6869
'📍' if self.note.pinned else ' ',
6970
]
7071
self.w_state.set_text(''.join(parts))

0 commit comments

Comments
 (0)