diff options
author | Daniel Lange <DLange@git.local> | 2016-04-11 13:01:07 +0200 |
---|---|---|
committer | Daniel Lange <DLange@git.local> | 2016-04-11 13:01:07 +0200 |
commit | ff9409b1737627857eb47f64f536a3f66b6a09a4 (patch) | |
tree | 61b631ba551e68a4f656b8b76ff7bd0d9955fc64 /MetersPanel.c | |
parent | f75ab6d2c11e8a8e18191b087564aedebbeb96c5 (diff) | |
download | debian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.tar.gz debian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.tar.bz2 debian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.zip |
Imported Upstream version 2.0.0upstream/2.0.0
Diffstat (limited to 'MetersPanel.c')
-rw-r--r-- | MetersPanel.c | 118 |
1 files changed, 111 insertions, 7 deletions
diff --git a/MetersPanel.c b/MetersPanel.c index 0e755f5..bdbe83e 100644 --- a/MetersPanel.c +++ b/MetersPanel.c @@ -9,22 +9,37 @@ in the source distribution for its full text. #include <stdlib.h> #include <assert.h> +#include "CRT.h" /*{ #include "Panel.h" #include "Settings.h" #include "ScreenManager.h" -typedef struct MetersPanel_ { +typedef struct MetersPanel_ MetersPanel; + +struct MetersPanel_ { Panel super; Settings* settings; Vector* meters; ScreenManager* scr; -} MetersPanel; + MetersPanel* leftNeighbor; + MetersPanel* rightNeighbor; + bool moving; +}; }*/ +static const char* MetersFunctions[] = {"Type ", "Move ", "Delete", "Done ", NULL}; +static const char* MetersKeys[] = {"Space", "Enter", "Del", "Esc"}; +static int MetersEvents[] = {' ', 13, KEY_DC, 27}; + +static const char* MetersMovingFunctions[] = {"Up ", "Down ", "Left ", "Right ", "Confirm", "Delete", "Done ", NULL}; +static const char* MetersMovingKeys[] = {"Up", "Dn", "Lt", "Rt", "Enter", "Del", "Esc"}; +static int MetersMovingEvents[] = {KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, 13, KEY_DC, 27}; +static FunctionBar* Meters_movingBar = NULL; + static void MetersPanel_delete(Object* object) { Panel* super = (Panel*) object; MetersPanel* this = (MetersPanel*) object; @@ -32,27 +47,80 @@ static void MetersPanel_delete(Object* object) { free(this); } +void MetersPanel_setMoving(MetersPanel* this, bool moving) { + Panel* super = (Panel*) this; + this->moving = moving; + ((ListItem*)Panel_getSelected(super))->moving = moving; + if (!moving) { + Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOCUS]); + Panel_setDefaultBar(super); + } else { + Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOLLOW]); + super->currentBar = Meters_movingBar; + } +} + +static inline bool moveToNeighbor(MetersPanel* this, MetersPanel* neighbor, int selected) { + Panel* super = (Panel*) this; + if (this->moving) { + if (neighbor) { + if (selected < Vector_size(this->meters)) { + MetersPanel_setMoving(this, false); + + Meter* meter = (Meter*) Vector_take(this->meters, selected); + Panel_remove(super, selected); + Vector_insert(neighbor->meters, selected, meter); + Panel_insert(&(neighbor->super), selected, (Object*) Meter_toListItem(meter, false)); + Panel_setSelected(&(neighbor->super), selected); + + MetersPanel_setMoving(neighbor, true); + return true; + } + } + } + return false; +} + static HandlerResult MetersPanel_eventHandler(Panel* super, int ch) { MetersPanel* this = (MetersPanel*) super; int selected = Panel_getSelectedIndex(super); HandlerResult result = IGNORED; + bool sideMove = false; switch(ch) { case 0x0a: case 0x0d: case KEY_ENTER: + { + if (!Vector_size(this->meters)) + break; + MetersPanel_setMoving(this, !(this->moving)); + FunctionBar_draw(this->super.currentBar, NULL); + result = HANDLED; + break; + } + case ' ': case KEY_F(4): case 't': { + if (!Vector_size(this->meters)) + break; Meter* meter = (Meter*) Vector_get(this->meters, selected); int mode = meter->mode + 1; if (mode == LAST_METERMODE) mode = 1; Meter_setMode(meter, mode); - Panel_set(super, selected, (Object*) Meter_toListItem(meter)); + Panel_set(super, selected, (Object*) Meter_toListItem(meter, this->moving)); result = HANDLED; break; } + case KEY_UP: + { + if (!this->moving) { + break; + } + /* else fallthrough */ + } case KEY_F(7): case '[': case '-': @@ -62,6 +130,13 @@ static HandlerResult MetersPanel_eventHandler(Panel* super, int ch) { result = HANDLED; break; } + case KEY_DOWN: + { + if (!this->moving) { + break; + } + /* else fallthrough */ + } case KEY_F(8): case ']': case '+': @@ -71,19 +146,41 @@ static HandlerResult MetersPanel_eventHandler(Panel* super, int ch) { result = HANDLED; break; } + case KEY_RIGHT: + { + sideMove = moveToNeighbor(this, this->rightNeighbor, selected); + if (this->moving && !sideMove) { + // lock user here until it exits positioning-mode + result = HANDLED; + } + // if user is free, don't set HANDLED; + // let ScreenManager handle focus. + break; + } + case KEY_LEFT: + { + sideMove = moveToNeighbor(this, this->leftNeighbor, selected); + if (this->moving && !sideMove) { + result = HANDLED; + } + break; + } case KEY_F(9): case KEY_DC: { + if (!Vector_size(this->meters)) + break; if (selected < Vector_size(this->meters)) { Vector_remove(this->meters, selected); Panel_remove(super, selected); } + MetersPanel_setMoving(this, false); result = HANDLED; break; } } - if (result == HANDLED) { - Header* header = this->settings->header; + if (result == HANDLED || sideMove) { + Header* header = (Header*) this->scr->header; this->settings->changed = true; Header_calculateHeight(header); Header_draw(header); @@ -103,15 +200,22 @@ PanelClass MetersPanel_class = { MetersPanel* MetersPanel_new(Settings* settings, const char* header, Vector* meters, ScreenManager* scr) { MetersPanel* this = AllocThis(MetersPanel); Panel* super = (Panel*) this; - Panel_init(super, 1, 1, 1, 1, Class(ListItem), true); + FunctionBar* fuBar = FunctionBar_new(MetersFunctions, MetersKeys, MetersEvents); + if (!Meters_movingBar) { + Meters_movingBar = FunctionBar_new(MetersMovingFunctions, MetersMovingKeys, MetersMovingEvents); + } + Panel_init(super, 1, 1, 1, 1, Class(ListItem), true, fuBar); this->settings = settings; this->meters = meters; this->scr = scr; + this->moving = false; + this->rightNeighbor = NULL; + this->leftNeighbor = NULL; Panel_setHeader(super, header); for (int i = 0; i < Vector_size(meters); i++) { Meter* meter = (Meter*) Vector_get(meters, i); - Panel_add(super, (Object*) Meter_toListItem(meter)); + Panel_add(super, (Object*) Meter_toListItem(meter, false)); } return this; } |