@@ -223,6 +223,12 @@ enum Status {
223
223
Done ,
224
224
}
225
225
226
+ enum EditMode {
227
+ Not ,
228
+ New ,
229
+ Editing ,
230
+ }
231
+
226
232
impl Status {
227
233
fn toggle ( & self ) -> Self {
228
234
match self {
@@ -337,6 +343,10 @@ fn save_state(todos: &[String], dones: &[String], file_path: &str) {
337
343
fn main ( ) {
338
344
ctrlc:: init ( ) ;
339
345
346
+ // On some old terminals ESC was used instead of ALT. So we have to tell ncurses not to wait
347
+ // for another key when receiving ESC.
348
+ set_escdelay ( 0 ) ;
349
+
340
350
let mut args = env:: args ( ) ;
341
351
args. next ( ) . unwrap ( ) ;
342
352
@@ -382,7 +392,7 @@ fn main() {
382
392
383
393
let mut quit = false ;
384
394
let mut panel = Status :: Todo ;
385
- let mut editing = false ;
395
+ let mut editing = EditMode :: Not ;
386
396
let mut editing_cursor = 0 ;
387
397
388
398
let mut ui = Ui :: default ( ) ;
@@ -407,11 +417,19 @@ fn main() {
407
417
// TODO(#27): the item lists don't have a scroll area
408
418
for ( index, todo) in todos. iter_mut ( ) . enumerate ( ) {
409
419
if index == todo_curr {
410
- if editing {
420
+ if let EditMode :: Editing | EditMode :: New = editing {
411
421
ui. edit_field ( todo, & mut editing_cursor, x / 2 ) ;
412
422
413
- if let Some ( '\n' ) = ui. key . take ( ) . map ( |x| x as u8 as char ) {
414
- editing = false ;
423
+ match ui. key . take ( ) . map ( |x| x as u8 as char ) {
424
+ Some ( '\n' ) => editing = EditMode :: Not ,
425
+ Some ( '\u{1b}' ) => {
426
+ if let EditMode :: New = editing {
427
+ list_delete ( & mut todos, & mut todo_curr) ;
428
+ }
429
+ editing = EditMode :: Not ;
430
+ break ;
431
+ }
432
+ _ => { }
415
433
}
416
434
} else {
417
435
ui. label_fixed_width (
@@ -420,7 +438,7 @@ fn main() {
420
438
HIGHLIGHT_PAIR ,
421
439
) ;
422
440
if let Some ( 'r' ) = ui. key . map ( |x| x as u8 as char ) {
423
- editing = true ;
441
+ editing = EditMode :: Editing ;
424
442
editing_cursor = todo. len ( ) ;
425
443
ui. key = None ;
426
444
}
@@ -441,7 +459,7 @@ fn main() {
441
459
'i' => {
442
460
todos. insert ( todo_curr, String :: new ( ) ) ;
443
461
editing_cursor = 0 ;
444
- editing = true ;
462
+ editing = EditMode :: New ;
445
463
notification. push_str ( "What needs to be done?" ) ;
446
464
}
447
465
'd' => {
@@ -480,11 +498,13 @@ fn main() {
480
498
ui. label_fixed_width ( "DONE" , x / 2 , HIGHLIGHT_PAIR ) ;
481
499
for ( index, done) in dones. iter_mut ( ) . enumerate ( ) {
482
500
if index == done_curr {
483
- if editing {
501
+ if let EditMode :: Editing = editing {
484
502
ui. edit_field ( done, & mut editing_cursor, x / 2 ) ;
485
503
486
- if let Some ( '\n' ) = ui. key . take ( ) . map ( |x| x as u8 as char ) {
487
- editing = false ;
504
+ if let Some ( '\n' ) | Some ( '\u{1b}' ) =
505
+ ui. key . take ( ) . map ( |x| x as u8 as char )
506
+ {
507
+ editing = EditMode :: Not ;
488
508
}
489
509
} else {
490
510
ui. label_fixed_width (
@@ -493,7 +513,7 @@ fn main() {
493
513
HIGHLIGHT_PAIR ,
494
514
) ;
495
515
if let Some ( 'r' ) = ui. key . map ( |x| x as u8 as char ) {
496
- editing = true ;
516
+ editing = EditMode :: Editing ;
497
517
editing_cursor = done. len ( ) ;
498
518
ui. key = None ;
499
519
}
0 commit comments