diff options
author | Daniel Lange <DLange@git.local> | 2016-04-11 13:00:19 +0200 |
---|---|---|
committer | Daniel Lange <DLange@git.local> | 2016-04-11 13:00:19 +0200 |
commit | 266ab52b3a741a58fb17c48b0f7939d7c5d266de (patch) | |
tree | b4bccc59b9a35f3acbe7560f3d633940c71aedef /ColumnsListBox.c | |
parent | 2c8c1a156130aa40be7dcaeb3ce2977a03cf50c2 (diff) | |
download | debian_htop-266ab52b3a741a58fb17c48b0f7939d7c5d266de.tar.gz debian_htop-266ab52b3a741a58fb17c48b0f7939d7c5d266de.tar.bz2 debian_htop-266ab52b3a741a58fb17c48b0f7939d7c5d266de.zip |
Imported Upstream version 0.6upstream/0.6
Diffstat (limited to 'ColumnsListBox.c')
-rw-r--r-- | ColumnsListBox.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/ColumnsListBox.c b/ColumnsListBox.c new file mode 100644 index 0000000..d3d02ee --- /dev/null +++ b/ColumnsListBox.c @@ -0,0 +1,104 @@ + +#include "ColumnsListBox.h" + +#include "ListBox.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include <assert.h> + +/*{ + +typedef struct ColumnsListBox_ { + ListBox super; + + Settings* settings; + ScreenManager* scr; +} ColumnsListBox; + +}*/ + +ColumnsListBox* ColumnsListBox_new(Settings* settings, ScreenManager* scr) { + ColumnsListBox* this = (ColumnsListBox*) malloc(sizeof(ColumnsListBox)); + ListBox* super = (ListBox*) this; + ListBox_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); + ((Object*)this)->delete = ColumnsListBox_delete; + + this->settings = settings; + this->scr = scr; + super->eventHandler = ColumnsListBox_eventHandler; + ListBox_setHeader(super, "Active Columns"); + + ProcessField* fields = this->settings->pl->fields; + for (; *fields; fields++) { + ListBox_add(super, (Object*) ListItem_new(Process_fieldNames[*fields], 0)); + } + return this; +} + +void ColumnsListBox_delete(Object* object) { + ListBox* super = (ListBox*) object; + ColumnsListBox* this = (ColumnsListBox*) object; + ListBox_done(super); + free(this); +} + +void ColumnsListBox_update(ListBox* super) { + ColumnsListBox* this = (ColumnsListBox*) super; + int size = ListBox_getSize(super); + this->settings->changed = true; + // FIXME: this is crappily inefficient + free(this->settings->pl->fields); + this->settings->pl->fields = (ProcessField*) malloc(sizeof(ProcessField) * (size+1)); + for (int i = 0; i < size; i++) { + char* text = ((ListItem*) ListBox_get(super, i))->value; + for (int j = 1; j <= LAST_PROCESSFIELD; j++) { + if (String_eq(text, Process_fieldNames[j])) { + this->settings->pl->fields[i] = j; + break; + } + } + } + this->settings->pl->fields[size] = 0; +} + +HandlerResult ColumnsListBox_eventHandler(ListBox* super, int ch) { + + int selected = ListBox_getSelectedIndex(super); + HandlerResult result = IGNORED; + int size = ListBox_getSize(super); + + switch(ch) { + case KEY_F(7): + case '[': + case '-': + { + if (selected < size - 1) + ListBox_moveSelectedUp(super); + result = HANDLED; + break; + } + case KEY_F(8): + case ']': + case '+': + { + if (selected < size - 2) + ListBox_moveSelectedDown(super); + result = HANDLED; + break; + } + case KEY_F(9): + case KEY_DC: + { + if (selected < size - 1) { + ListBox_remove(super, selected); + } + result = HANDLED; + break; + } + } + if (result == HANDLED) + ColumnsListBox_update(super); + return result; +} |