From 0128d222b94adab6b258f417722f298013a33327 Mon Sep 17 00:00:00 2001 From: Hisham Date: Wed, 15 Jun 2016 12:45:23 -0300 Subject: Added Ctrl+A and Ctrl+E to go to beginning and end of line. (Also, '^' and '$') Closes #508. --- Panel.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'Panel.c') diff --git a/Panel.c b/Panel.c index 65d13423..a22b36f0 100644 --- a/Panel.c +++ b/Panel.c @@ -61,6 +61,7 @@ struct Panel_ { Vector* items; int selected; int oldSelected; + int selectedLen; void* eventHandlerState; int scrollV; short scrollH; @@ -82,10 +83,7 @@ struct Panel_ { #define MAX(a,b) ((a)>(b)?(a):(b)) #endif -#define KEY_CTRLN 0016 /* control-n key */ -#define KEY_CTRLP 0020 /* control-p key */ -#define KEY_CTRLF 0006 /* control-f key */ -#define KEY_CTRLB 0002 /* control-b key */ +#define KEY_CTRL(l) ((l)-'A'+1) PanelClass Panel_class = { .super = { @@ -327,6 +325,7 @@ void Panel_draw(Panel* this, bool focus) { if (selected) { attrset(selectionColor); RichString_setAttr(&item, selectionColor); + this->selectedLen = itemLen; } mvhline(y + line, x, ' ', this->w); if (amt > 0) @@ -352,6 +351,7 @@ void Panel_draw(Panel* this, bool focus) { RichString_begin(new); Object_display(newObj, &new); int newLen = RichString_sizeVal(new); + this->selectedLen = newLen; mvhline(y+ this->oldSelected - first, x+0, ' ', this->w); if (scrollH < oldLen) RichString_printoffnVal(old, y+this->oldSelected - first, x, @@ -376,11 +376,11 @@ bool Panel_onKey(Panel* this, int key) { int size = Vector_size(this->items); switch (key) { case KEY_DOWN: - case KEY_CTRLN: + case KEY_CTRL('N'): this->selected++; break; case KEY_UP: - case KEY_CTRLP: + case KEY_CTRL('P'): this->selected--; break; #ifdef KEY_C_DOWN @@ -394,14 +394,14 @@ bool Panel_onKey(Panel* this, int key) { break; #endif case KEY_LEFT: - case KEY_CTRLB: + case KEY_CTRL('B'): if (this->scrollH > 0) { - this->scrollH -= CRT_scrollHAmount; + this->scrollH -= MAX(CRT_scrollHAmount, 0); this->needsRedraw = true; } break; case KEY_RIGHT: - case KEY_CTRLF: + case KEY_CTRL('F'): this->scrollH += CRT_scrollHAmount; this->needsRedraw = true; break; @@ -436,6 +436,14 @@ bool Panel_onKey(Panel* this, int key) { case KEY_END: this->selected = size - 1; break; + case KEY_CTRL('A'): + case '^': + this->scrollH = 0; + break; + case KEY_CTRL('E'): + case '$': + this->scrollH = MAX(this->selectedLen - this->w, 0); + break; default: return false; } -- cgit v1.2.3