@@ -35,15 +35,32 @@ def __init__(self):
35
35
], 3 , 1 , 0 , urwid .LEFT )
36
36
37
37
class Item (urwid .Columns ):
38
- def __init__ (self , item : gkeepapi .node .ListItem ):
38
+ def __init__ (self , item : gkeepapi .node .ListItem , indented = None ):
39
39
self .id = item .id
40
+ self .indented = indented if indented is not None else item .indented
41
+ self .w_indent = urwid .Text ('' )
40
42
self .w_checkbox = urwid .Text (u'☑' if item .checked else u'☐' )
41
43
self .w_text = urwid_readline .ReadlineEdit (edit_text = item .text )
42
44
super (Item , self ).__init__ ([
45
+ (urwid .PACK , self .w_indent ),
43
46
(urwid .PACK , self .w_checkbox ),
44
47
self .w_text ,
45
48
], dividechars = 1 )
46
49
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
+
47
64
def setPos (self , pos ):
48
65
self .w_text .edit_pos = pos
49
66
@@ -94,24 +111,35 @@ def actual_key(unhandled):
94
111
if key == 'enter' :
95
112
pos = 0
96
113
text = ''
114
+ indented = None
97
115
if self .focus is not None :
98
116
text = self .focus .cutToEnd ()
99
117
pos = self .focus_position + 1
100
118
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 ))
104
124
self .focus .setPos (0 )
105
125
self .focus_position = pos
106
126
key = None
107
- if key == 'backspace' :
127
+ elif key == 'backspace' :
108
128
if self .focus_position > 0 :
109
129
text = self .body [self .focus_position ].getText ()
110
130
last = self .focus_position == len (self .body ) - 1
111
131
del self .body [self .focus_position ]
112
132
if not last :
113
133
self .focus_position -= 1
114
134
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
115
143
116
144
return key
117
145
@@ -127,7 +155,7 @@ def __init__(self, app: 'application.Application', note: gkeepapi.node.TopLevelN
127
155
self .w_list = Items ()
128
156
self .w_labels = widget .labels .Labels ()
129
157
130
- self .w_header = urwid .Text (u'' , align = urwid .RIGHT )
158
+ self .w_state = urwid .Text (u'' , align = urwid .RIGHT )
131
159
self .w_footer = urwid .Text (u'' , align = urwid .RIGHT )
132
160
self .w_content = urwid .Frame (
133
161
self .w_list ,
@@ -143,16 +171,15 @@ def __init__(self, app: 'application.Application', note: gkeepapi.node.TopLevelN
143
171
left = 1 ,
144
172
right = 1
145
173
),
146
- header = self .w_header ,
174
+ header = self .w_state ,
147
175
footer = self .w_footer ,
148
176
),
149
177
note .color .value
150
178
)
151
179
152
180
self ._updateContent ()
153
181
self ._updateLabels ()
154
- self ._updatePinned ()
155
- self ._updateArchived ()
182
+ self ._updateState ()
156
183
157
184
def _updateContent (self ):
158
185
self .w_title .set_edit_text (self .note .title )
@@ -181,38 +208,56 @@ def _updateLabels(self):
181
208
182
209
self .w_content .contents ['footer' ] = w_labels
183
210
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 ))
189
218
190
219
def _save (self ):
191
220
self .note .title = self .w_title .get_edit_text ()
192
221
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 )
195
224
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 ):
199
227
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
202
232
item .text = w_item .getText ()
203
233
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
+
204
249
else :
205
250
self .note .text = self .w_text .get_edit_text ()
206
251
207
252
def keypress (self , size , key ):
208
253
key = super (Edit , self ).keypress (size , key )
209
254
if key == 'f' :
210
255
self .note .pinned = not self .note .pinned
211
- self ._updatePinned ()
256
+ self ._updateState ()
212
257
key = None
213
258
elif key == 'e' :
214
259
self .note .archived = not self .note .archived
215
- self ._updateArchived ()
260
+ self ._updateState ()
216
261
key = None
217
262
elif key == 'esc' :
218
263
self ._save ()
0 commit comments