Added Ctrl+A and Ctrl+E to go to beginning and end of line.

(Also, '^' and '$')
Closes #508.
This commit is contained in:
Hisham 2016-06-15 12:45:23 -03:00
parent 1a13b4d0f4
commit 0128d222b9
5 changed files with 30 additions and 31 deletions

View File

@ -82,9 +82,9 @@ static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) {
result = HANDLED; result = HANDLED;
break; break;
case KEY_UP: case KEY_UP:
case KEY_CTRLP: case KEY_CTRL('P'):
case KEY_DOWN: case KEY_DOWN:
case KEY_CTRLN: case KEY_CTRL('N'):
case KEY_NPAGE: case KEY_NPAGE:
case KEY_PPAGE: case KEY_PPAGE:
case KEY_HOME: case KEY_HOME:

View File

@ -105,20 +105,6 @@ static HandlerResult MainPanel_eventHandler(Panel* super, int ch) {
} else { } else {
reaction |= HTOP_KEEP_FOLLOWING; reaction |= HTOP_KEEP_FOLLOWING;
} }
switch (ch) {
case KEY_LEFT:
case KEY_CTRLB:
if (super->scrollH > 0) {
super->scrollH -= CRT_scrollHAmount;
super->needsRedraw = true;
}
return HANDLED;
case KEY_RIGHT:
case KEY_CTRLF:
super->scrollH += CRT_scrollHAmount;
super->needsRedraw = true;
return HANDLED;
}
} }
if (reaction & HTOP_REDRAW_BAR) { if (reaction & HTOP_REDRAW_BAR) {

26
Panel.c
View File

@ -61,6 +61,7 @@ struct Panel_ {
Vector* items; Vector* items;
int selected; int selected;
int oldSelected; int oldSelected;
int selectedLen;
void* eventHandlerState; void* eventHandlerState;
int scrollV; int scrollV;
short scrollH; short scrollH;
@ -82,10 +83,7 @@ struct Panel_ {
#define MAX(a,b) ((a)>(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b))
#endif #endif
#define KEY_CTRLN 0016 /* control-n key */ #define KEY_CTRL(l) ((l)-'A'+1)
#define KEY_CTRLP 0020 /* control-p key */
#define KEY_CTRLF 0006 /* control-f key */
#define KEY_CTRLB 0002 /* control-b key */
PanelClass Panel_class = { PanelClass Panel_class = {
.super = { .super = {
@ -327,6 +325,7 @@ void Panel_draw(Panel* this, bool focus) {
if (selected) { if (selected) {
attrset(selectionColor); attrset(selectionColor);
RichString_setAttr(&item, selectionColor); RichString_setAttr(&item, selectionColor);
this->selectedLen = itemLen;
} }
mvhline(y + line, x, ' ', this->w); mvhline(y + line, x, ' ', this->w);
if (amt > 0) if (amt > 0)
@ -352,6 +351,7 @@ void Panel_draw(Panel* this, bool focus) {
RichString_begin(new); RichString_begin(new);
Object_display(newObj, &new); Object_display(newObj, &new);
int newLen = RichString_sizeVal(new); int newLen = RichString_sizeVal(new);
this->selectedLen = newLen;
mvhline(y+ this->oldSelected - first, x+0, ' ', this->w); mvhline(y+ this->oldSelected - first, x+0, ' ', this->w);
if (scrollH < oldLen) if (scrollH < oldLen)
RichString_printoffnVal(old, y+this->oldSelected - first, x, 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); int size = Vector_size(this->items);
switch (key) { switch (key) {
case KEY_DOWN: case KEY_DOWN:
case KEY_CTRLN: case KEY_CTRL('N'):
this->selected++; this->selected++;
break; break;
case KEY_UP: case KEY_UP:
case KEY_CTRLP: case KEY_CTRL('P'):
this->selected--; this->selected--;
break; break;
#ifdef KEY_C_DOWN #ifdef KEY_C_DOWN
@ -394,14 +394,14 @@ bool Panel_onKey(Panel* this, int key) {
break; break;
#endif #endif
case KEY_LEFT: case KEY_LEFT:
case KEY_CTRLB: case KEY_CTRL('B'):
if (this->scrollH > 0) { if (this->scrollH > 0) {
this->scrollH -= CRT_scrollHAmount; this->scrollH -= MAX(CRT_scrollHAmount, 0);
this->needsRedraw = true; this->needsRedraw = true;
} }
break; break;
case KEY_RIGHT: case KEY_RIGHT:
case KEY_CTRLF: case KEY_CTRL('F'):
this->scrollH += CRT_scrollHAmount; this->scrollH += CRT_scrollHAmount;
this->needsRedraw = true; this->needsRedraw = true;
break; break;
@ -436,6 +436,14 @@ bool Panel_onKey(Panel* this, int key) {
case KEY_END: case KEY_END:
this->selected = size - 1; this->selected = size - 1;
break; 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: default:
return false; return false;
} }

View File

@ -50,6 +50,7 @@ struct Panel_ {
Vector* items; Vector* items;
int selected; int selected;
int oldSelected; int oldSelected;
int selectedLen;
void* eventHandlerState; void* eventHandlerState;
int scrollV; int scrollV;
short scrollH; short scrollH;
@ -70,10 +71,7 @@ struct Panel_ {
#define MAX(a,b) ((a)>(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b))
#endif #endif
#define KEY_CTRLN 0016 /* control-n key */ #define KEY_CTRL(l) ((l)-'A'+1)
#define KEY_CTRLP 0020 /* control-p key */
#define KEY_CTRLF 0006 /* control-f key */
#define KEY_CTRLB 0002 /* control-b key */
extern PanelClass Panel_class; extern PanelClass Panel_class;

View File

@ -279,7 +279,10 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) {
continue; continue;
} }
case KEY_LEFT: case KEY_LEFT:
case KEY_CTRLB: case KEY_CTRL('B'):
if (this->panelCount < 2) {
goto defaultHandler;
}
if (!this->allowFocusChange) if (!this->allowFocusChange)
break; break;
tryLeft: tryLeft:
@ -290,8 +293,11 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) {
goto tryLeft; goto tryLeft;
break; break;
case KEY_RIGHT: case KEY_RIGHT:
case KEY_CTRLF: case KEY_CTRL('F'):
case 9: case 9:
if (this->panelCount < 2) {
goto defaultHandler;
}
if (!this->allowFocusChange) if (!this->allowFocusChange)
break; break;
tryRight: tryRight:
@ -307,6 +313,7 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) {
quit = true; quit = true;
continue; continue;
default: default:
defaultHandler:
sortTimeout = resetSortTimeout; sortTimeout = resetSortTimeout;
Panel_onKey(panelFocus, ch); Panel_onKey(panelFocus, ch);
break; break;