2
#include "ColumnsPanel.h"
6
#include "ScreenManager.h"
13
typedef struct ColumnsPanel_ {
22
ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr) {
23
ColumnsPanel* this = (ColumnsPanel*) malloc(sizeof(ColumnsPanel));
24
Panel* super = (Panel*) this;
25
Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true);
26
((Object*)this)->delete = ColumnsPanel_delete;
28
this->settings = settings;
30
super->eventHandler = ColumnsPanel_eventHandler;
31
Panel_setHeader(super, "Active Columns");
33
ProcessField* fields = this->settings->pl->fields;
34
for (; *fields; fields++) {
35
Panel_add(super, (Object*) ListItem_new(Process_fieldNames[*fields], 0));
40
void ColumnsPanel_delete(Object* object) {
41
Panel* super = (Panel*) object;
42
ColumnsPanel* this = (ColumnsPanel*) object;
47
void ColumnsPanel_update(Panel* super) {
48
ColumnsPanel* this = (ColumnsPanel*) super;
49
int size = Panel_getSize(super);
50
this->settings->changed = true;
51
// FIXME: this is crappily inefficient
52
free(this->settings->pl->fields);
53
this->settings->pl->fields = (ProcessField*) malloc(sizeof(ProcessField) * (size+1));
54
for (int i = 0; i < size; i++) {
55
char* text = ((ListItem*) Panel_get(super, i))->value;
56
for (int j = 1; j <= LAST_PROCESSFIELD; j++) {
57
if (String_eq(text, Process_fieldNames[j])) {
58
this->settings->pl->fields[i] = j;
63
this->settings->pl->fields[size] = 0;
66
HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) {
68
int selected = Panel_getSelectedIndex(super);
69
HandlerResult result = IGNORED;
70
int size = Panel_getSize(super);
77
if (selected < size - 1)
78
Panel_moveSelectedUp(super);
86
if (selected < size - 2)
87
Panel_moveSelectedDown(super);
94
if (selected < size - 1) {
95
Panel_remove(super, selected);
101
if (result == HANDLED)
102
ColumnsPanel_update(super);