From 69f439eff387a6ecb52734e400b297a3c85f2285 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Tue, 21 Sep 2021 08:35:19 +0200 Subject: New upstream version 3.1.0 --- CategoriesPanel.c | 78 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 27 deletions(-) (limited to 'CategoriesPanel.c') diff --git a/CategoriesPanel.c b/CategoriesPanel.c index 4ee1ad4..21010b3 100644 --- a/CategoriesPanel.c +++ b/CategoriesPanel.c @@ -17,11 +17,16 @@ in the source distribution for its full text. #include "ColumnsPanel.h" #include "DisplayOptionsPanel.h" #include "FunctionBar.h" +#include "Header.h" +#include "HeaderLayout.h" +#include "HeaderOptionsPanel.h" #include "ListItem.h" +#include "Macros.h" #include "MetersPanel.h" #include "Object.h" #include "ProvideCurses.h" #include "Vector.h" +#include "XUtils.h" static const char* const CategoriesFunctions[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done ", NULL}; @@ -33,14 +38,24 @@ static void CategoriesPanel_delete(Object* object) { 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); - ScreenManager_add(this->scr, (Panel*) leftMeters, 20); - ScreenManager_add(this->scr, (Panel*) rightMeters, 20); +static void CategoriesPanel_makeMetersPage(CategoriesPanel* this) { + size_t columns = HeaderLayout_getColumns(this->scr->header->headerLayout); + MetersPanel** meterPanels = xMallocArray(columns, sizeof(MetersPanel*)); + + for (size_t i = 0; i < columns; i++) { + char titleBuffer[32]; + xSnprintf(titleBuffer, sizeof(titleBuffer), "Column %zu", i + 1); + meterPanels[i] = MetersPanel_new(this->settings, titleBuffer, this->header->columns[i], this->scr); + + if (i != 0) { + meterPanels[i]->leftNeighbor = meterPanels[i - 1]; + meterPanels[i - 1]->rightNeighbor = meterPanels[i]; + } + + ScreenManager_add(this->scr, (Panel*) meterPanels[i], 20); + } + + Panel* availableMeters = (Panel*) AvailableMetersPanel_new(this->settings, this->header, columns, meterPanels, this->scr, this->pl); ScreenManager_add(this->scr, availableMeters, -1); } @@ -50,17 +65,36 @@ static void CategoriesPanel_makeDisplayOptionsPage(CategoriesPanel* this) { } static void CategoriesPanel_makeColorsPage(CategoriesPanel* this) { - Panel* colors = (Panel*) ColorsPanel_new(this->settings, this->scr); + Panel* colors = (Panel*) ColorsPanel_new(this->settings); ScreenManager_add(this->scr, colors, -1); } static void CategoriesPanel_makeColumnsPage(CategoriesPanel* this) { Panel* columns = (Panel*) ColumnsPanel_new(this->settings); - Panel* availableColumns = (Panel*) AvailableColumnsPanel_new(columns); + Panel* availableColumns = (Panel*) AvailableColumnsPanel_new(columns, this->settings->dynamicColumns); ScreenManager_add(this->scr, columns, 20); ScreenManager_add(this->scr, availableColumns, -1); } +static void CategoriesPanel_makeHeaderOptionsPage(CategoriesPanel* this) { + Panel* colors = (Panel*) HeaderOptionsPanel_new(this->settings, this->scr); + ScreenManager_add(this->scr, colors, -1); +} + +typedef void (* CategoriesPanel_makePageFunc)(CategoriesPanel* ref); +typedef struct CategoriesPanelPage_ { + const char* name; + CategoriesPanel_makePageFunc ctor; +} CategoriesPanelPage; + +static const CategoriesPanelPage categoriesPanelPages[] = { + { .name = "Display options", .ctor = CategoriesPanel_makeDisplayOptionsPage }, + { .name = "Header layout", .ctor = CategoriesPanel_makeHeaderOptionsPage }, + { .name = "Meters", .ctor = CategoriesPanel_makeMetersPage }, + { .name = "Columns", .ctor = CategoriesPanel_makeColumnsPage }, + { .name = "Colors", .ctor = CategoriesPanel_makeColorsPage }, +}; + static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) { CategoriesPanel* this = (CategoriesPanel*) super; @@ -98,19 +132,8 @@ static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) { 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_makeColumnsPage(this); - break; + if (selected >= 0 && (size_t)selected < ARRAYSIZE(categoriesPanelPages)) { + categoriesPanelPages[selected].ctor(this); } } return result; @@ -135,9 +158,10 @@ CategoriesPanel* CategoriesPanel_new(ScreenManager* scr, Settings* settings, Hea this->header = header; this->pl = pl; Panel_setHeader(super, "Setup"); - 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("Columns", 0)); + for (size_t i = 0; i < ARRAYSIZE(categoriesPanelPages); i++) + Panel_add(super, (Object*) ListItem_new(categoriesPanelPages[i].name, 0)); + + ScreenManager_add(scr, super, 16); + categoriesPanelPages[0].ctor(this); return this; } -- cgit v1.2.3