htop/CategoriesPanel.c

155 lines
4.8 KiB
C
Raw Normal View History

2011-12-26 21:35:57 +00:00
/*
htop - CategoriesPanel.c
(C) 2004-2011 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
2006-03-04 18:16:49 +00:00
2006-05-30 13:47:28 +00:00
#include "CategoriesPanel.h"
2011-12-26 21:35:57 +00:00
2006-05-30 13:47:28 +00:00
#include "AvailableMetersPanel.h"
#include "MetersPanel.h"
#include "DisplayOptionsPanel.h"
#include "ScreensPanel.h"
2006-05-30 13:47:28 +00:00
#include "ColorsPanel.h"
#include "AvailableColumnsPanel.h"
2011-12-26 21:35:57 +00:00
2006-03-04 18:16:49 +00:00
#include <assert.h>
2011-12-26 21:35:57 +00:00
#include <stdlib.h>
2006-03-04 18:16:49 +00:00
/*{
2011-12-26 21:35:57 +00:00
#include "Panel.h"
#include "Settings.h"
#include "ScreenManager.h"
#include "ProcessList.h"
2006-03-04 18:16:49 +00:00
2006-05-30 13:47:28 +00:00
typedef struct CategoriesPanel_ {
Panel super;
ScreenManager* scr;
2006-03-04 18:16:49 +00:00
Settings* settings;
Header* header;
ProcessList* pl;
2006-05-30 13:47:28 +00:00
} CategoriesPanel;
2006-03-04 18:16:49 +00:00
}*/
static const char* const CategoriesFunctions[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done ", NULL};
2006-03-04 18:16:49 +00:00
static void CategoriesPanel_delete(Object* object) {
2006-05-30 13:47:28 +00:00
Panel* super = (Panel*) object;
CategoriesPanel* this = (CategoriesPanel*) object;
Panel_done(super);
2006-03-04 18:16:49 +00:00
free(this);
}
void CategoriesPanel_makeMetersPage(CategoriesPanel* this) {
MetersPanel* leftMeters = MetersPanel_new(this->settings, "Left column", this->header->columns[0], this->scr);
MetersPanel* rightMeters = MetersPanel_new(this->settings, "Right column", this->header->columns[1], this->scr);
leftMeters->rightNeighbor = rightMeters;
rightMeters->leftNeighbor = leftMeters;
Panel* availableMeters = (Panel*) AvailableMetersPanel_new(this->settings, this->header, (Panel*) leftMeters, (Panel*) rightMeters, this->scr, this->pl);
2015-03-23 18:26:56 +00:00
ScreenManager_add(this->scr, (Panel*) leftMeters, 20);
ScreenManager_add(this->scr, (Panel*) rightMeters, 20);
ScreenManager_add(this->scr, availableMeters, -1);
}
static void CategoriesPanel_makeDisplayOptionsPage(CategoriesPanel* this) {
Panel* displayOptions = (Panel*) DisplayOptionsPanel_new(this->settings, this->scr);
2015-03-23 18:26:56 +00:00
ScreenManager_add(this->scr, displayOptions, -1);
}
static void CategoriesPanel_makeColorsPage(CategoriesPanel* this) {
Panel* colors = (Panel*) ColorsPanel_new(this->settings, this->scr);
2015-03-23 18:26:56 +00:00
ScreenManager_add(this->scr, colors, -1);
}
static void CategoriesPanel_makeScreensPage(CategoriesPanel* this) {
Panel* screens = (Panel*) ScreensPanel_new(this->settings);
Panel* columns = (Panel*) ((ScreensPanel*)screens)->columns;
Panel* availableColumns = (Panel*) AvailableColumnsPanel_new(columns);
ScreenManager_add(this->scr, screens, 20);
2015-03-23 18:26:56 +00:00
ScreenManager_add(this->scr, columns, 20);
ScreenManager_add(this->scr, availableColumns, -1);
}
static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) {
2006-05-30 13:47:28 +00:00
CategoriesPanel* this = (CategoriesPanel*) super;
2006-03-04 18:16:49 +00:00
HandlerResult result = IGNORED;
int selected = Panel_getSelectedIndex(super);
2006-03-04 18:16:49 +00:00
switch (ch) {
2015-03-25 02:12:43 +00:00
case EVENT_SET_SELECTED:
result = HANDLED;
break;
2006-03-04 18:16:49 +00:00
case KEY_UP:
case KEY_CTRL('P'):
2006-03-04 18:16:49 +00:00
case KEY_DOWN:
case KEY_CTRL('N'):
2006-03-04 18:16:49 +00:00
case KEY_NPAGE:
case KEY_PPAGE:
case KEY_HOME:
case KEY_END: {
int previous = selected;
2006-05-30 13:47:28 +00:00
Panel_onKey(super, ch);
selected = Panel_getSelectedIndex(super);
if (previous != selected)
result = HANDLED;
break;
}
default:
if (ch < 255 && isalpha(ch))
result = Panel_selectByTyping(super, ch);
if (result == BREAK_LOOP)
result = IGNORED;
break;
}
if (result == HANDLED) {
int size = ScreenManager_size(this->scr);
for (int i = 1; i < size; i++)
ScreenManager_remove(this->scr, 1);
switch (selected) {
case 0:
CategoriesPanel_makeMetersPage(this);
break;
case 1:
CategoriesPanel_makeDisplayOptionsPage(this);
break;
case 2:
CategoriesPanel_makeColorsPage(this);
break;
case 3:
CategoriesPanel_makeScreensPage(this);
break;
2006-03-04 18:16:49 +00:00
}
}
return result;
}
PanelClass CategoriesPanel_class = {
.super = {
.extends = Class(Panel),
.delete = CategoriesPanel_delete
},
.eventHandler = CategoriesPanel_eventHandler
};
CategoriesPanel* CategoriesPanel_new(ScreenManager* scr, Settings* settings, Header* header, ProcessList* pl) {
CategoriesPanel* this = AllocThis(CategoriesPanel);
Panel* super = (Panel*) this;
2015-03-23 18:26:56 +00:00
FunctionBar* fuBar = FunctionBar_new(CategoriesFunctions, NULL, NULL);
Panel_init(super, 1, 1, 1, 1, Class(ListItem), true, fuBar);
2006-03-04 18:16:49 +00:00
this->scr = scr;
this->settings = settings;
this->header = header;
this->pl = pl;
2018-08-25 01:45:55 +00:00
Panel_setHeader(super, "Categories");
Panel_add(super, (Object*) ListItem_new("Meters", 0));
Panel_add(super, (Object*) ListItem_new("Display options", 0));
Panel_add(super, (Object*) ListItem_new("Colors", 0));
Panel_add(super, (Object*) ListItem_new("Screens", 0));
return this;
2006-03-04 18:16:49 +00:00
}