HeaderLayout: save name in configuration

Use a name in the user configuration file instead of the compile
time enum value, so that future reorderings or insertions do not change
the user selected layout.
This commit is contained in:
Christian Göttsche 2021-08-24 17:40:22 +02:00
parent 0679e9f45e
commit db076b9c8e
2 changed files with 33 additions and 11 deletions

View File

@ -12,6 +12,7 @@ in the source distribution for its full text.
#include <stdint.h> #include <stdint.h>
#include "Macros.h" #include "Macros.h"
#include "XUtils.h"
typedef enum HeaderLayout_ { typedef enum HeaderLayout_ {
@ -30,25 +31,45 @@ typedef enum HeaderLayout_ {
static const struct { static const struct {
uint8_t columns; uint8_t columns;
const uint8_t widths[4]; const uint8_t widths[4];
const char* name;
const char* description; const char* description;
} HeaderLayout_layouts[LAST_HEADER_LAYOUT] = { } HeaderLayout_layouts[LAST_HEADER_LAYOUT] = {
[HF_TWO_50_50] = { 2, { 50, 50, 0, 0 }, "2 columns - 50/50 (default)", }, [HF_TWO_50_50] = { 2, { 50, 50, 0, 0 }, "two_50_50", "2 columns - 50/50 (default)", },
[HF_TWO_33_67] = { 2, { 33, 67, 0, 0 }, "2 columns - 33/67", }, [HF_TWO_33_67] = { 2, { 33, 67, 0, 0 }, "two_33_67", "2 columns - 33/67", },
[HF_TWO_67_33] = { 2, { 67, 33, 0, 0 }, "2 columns - 67/33", }, [HF_TWO_67_33] = { 2, { 67, 33, 0, 0 }, "two_67_33", "2 columns - 67/33", },
[HF_THREE_33_34_33] = { 3, { 33, 34, 33, 0 }, "3 columns - 33/34/33", }, [HF_THREE_33_34_33] = { 3, { 33, 34, 33, 0 }, "three_33_34_33", "3 columns - 33/34/33", },
[HF_THREE_25_25_50] = { 3, { 25, 25, 50, 0 }, "3 columns - 25/25/50", }, [HF_THREE_25_25_50] = { 3, { 25, 25, 50, 0 }, "three_25_25_50", "3 columns - 25/25/50", },
[HF_THREE_25_50_25] = { 3, { 25, 50, 25, 0 }, "3 columns - 25/50/25", }, [HF_THREE_25_50_25] = { 3, { 25, 50, 25, 0 }, "three_25_50_25", "3 columns - 25/50/25", },
[HF_THREE_50_25_25] = { 3, { 50, 25, 25, 0 }, "3 columns - 50/25/25", }, [HF_THREE_50_25_25] = { 3, { 50, 25, 25, 0 }, "three_50_25_25", "3 columns - 50/25/25", },
[HF_THREE_40_20_40] = { 3, { 40, 20, 40, 0 }, "3 columns - 40/20/40", }, [HF_THREE_40_20_40] = { 3, { 40, 20, 40, 0 }, "three_40_20_40", "3 columns - 40/20/40", },
[HF_FOUR_25_25_25_25] = { 4, { 25, 25, 25, 25 }, "4 columns - 25/25/25/25", }, [HF_FOUR_25_25_25_25] = { 4, { 25, 25, 25, 25 }, "four_25_25_25_25", "4 columns - 25/25/25/25", },
}; };
static inline size_t HeaderLayout_getColumns(HeaderLayout hLayout) { static inline size_t HeaderLayout_getColumns(HeaderLayout hLayout) {
/* assert the layout is initialized */ /* assert the layout is initialized */
assert(0 <= hLayout); assert(0 <= hLayout);
assert(hLayout < LAST_HEADER_LAYOUT); assert(hLayout < LAST_HEADER_LAYOUT);
assert(HeaderLayout_layouts[hLayout].name[0]);
assert(HeaderLayout_layouts[hLayout].description[0]); assert(HeaderLayout_layouts[hLayout].description[0]);
return HeaderLayout_layouts[hLayout].columns; return HeaderLayout_layouts[hLayout].columns;
} }
static inline const char* HeaderLayout_getName(HeaderLayout hLayout) {
/* assert the layout is initialized */
assert(0 <= hLayout);
assert(hLayout < LAST_HEADER_LAYOUT);
assert(HeaderLayout_layouts[hLayout].name[0]);
assert(HeaderLayout_layouts[hLayout].description[0]);
return HeaderLayout_layouts[hLayout].name;
}
static inline HeaderLayout HeaderLayout_fromName(const char* name) {
for (size_t i = 0; i < LAST_HEADER_LAYOUT; i++) {
if (String_eq(HeaderLayout_layouts[i].name, name))
return (HeaderLayout) i;
}
return LAST_HEADER_LAYOUT;
}
#endif /* HEADER_HeaderLayout */ #endif /* HEADER_HeaderLayout */

View File

@ -7,6 +7,7 @@ in the source distribution for its full text.
#include "Settings.h" #include "Settings.h"
#include <ctype.h>
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
#include <stdio.h> #include <stdio.h>
@ -266,7 +267,7 @@ static bool Settings_read(Settings* this, const char* fileName, unsigned int ini
this->enableMouse = atoi(option[1]); this->enableMouse = atoi(option[1]);
#endif #endif
} else if (String_eq(option[0], "header_layout")) { } else if (String_eq(option[0], "header_layout")) {
this->hLayout = atoi(option[1]); this->hLayout = isdigit((unsigned char)option[1][0]) ? ((HeaderLayout) atoi(option[1])) : HeaderLayout_fromName(option[1]);
if (this->hLayout < 0 || this->hLayout >= LAST_HEADER_LAYOUT) if (this->hLayout < 0 || this->hLayout >= LAST_HEADER_LAYOUT)
this->hLayout = HF_TWO_50_50; this->hLayout = HF_TWO_50_50;
free(this->hColumns); free(this->hColumns);
@ -394,7 +395,7 @@ int Settings_write(const Settings* this, bool onCrash) {
fprintf(fd, "enable_mouse=%d\n", (int) this->enableMouse); fprintf(fd, "enable_mouse=%d\n", (int) this->enableMouse);
#endif #endif
fprintf(fd, "delay=%d\n", (int) this->delay); fprintf(fd, "delay=%d\n", (int) this->delay);
fprintf(fd, "header_layout=%d\n", (int) this->hLayout); fprintf(fd, "header_layout=%s\n", HeaderLayout_getName(this->hLayout));
for (unsigned int i = 0; i < HeaderLayout_getColumns(this->hLayout); i++) { for (unsigned int i = 0; i < HeaderLayout_getColumns(this->hLayout); i++) {
fprintf(fd, "column_meters_%u=", i); fprintf(fd, "column_meters_%u=", i);
writeMeters(this, fd, i); writeMeters(this, fd, i);