Colors: support block related settings

Fix #721
This commit is contained in:
李通洲
2024-02-14 22:07:08 +08:00
parent 925dc6f681
commit 17f4a6e055
5 changed files with 208 additions and 25 deletions
+96 -18
View File
@@ -4,6 +4,16 @@
#include "modules/colors/colors.h"
#include "util/stringUtils.h"
static inline uint8_t min(uint8_t a, uint8_t b)
{
return a < b ? a : b;
}
static inline uint8_t max(uint8_t a, uint8_t b)
{
return a > b ? a : b;
}
void ffPrintColors(FFColorsOptions* options)
{
if(instance.config.display.pipe)
@@ -11,30 +21,36 @@ void ffPrintColors(FFColorsOptions* options)
ffPrintLogoAndKey(FF_COLORS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
if(options->paddingLeft > 0)
ffPrintCharTimes(' ', options->paddingLeft);
FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(128);
if (options->symbol == FF_COLORS_SYMBOL_BLOCK)
{
// 4%d: Set the background color
// 3%d: Set the foreground color
for(uint8_t i = 0; i < 8; i++)
printf("\033[3%dm███", i);
for(uint8_t i = options->block.range[0]; i <= min(options->block.range[1], 7); i++)
{
ffStrbufAppendF(&result, "\e[3%dm", i);
for (uint8_t j = 0; j < options->block.width; j++)
ffStrbufAppendS(&result, "█");
}
if (result.length > 0)
{
if(options->paddingLeft > 0)
ffPrintCharTimes(' ', options->paddingLeft);
puts(FASTFETCH_TEXT_MODIFIER_RESET);
ffLogoPrintLine();
if(options->paddingLeft > 0)
ffPrintCharTimes(' ', options->paddingLeft);
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET);
ffStrbufPutTo(&result, stdout);
ffStrbufClear(&result);
ffLogoPrintLine();
}
// 1: Set everything to bolt. This causes normal colors on some systems to be bright.
// 4%d: Set the background to the not bright color
// 3%d: Set the foreground to the not bright color
// 10%d: Set the background to the bright color
// 9%d: Set the foreground to the bright color
for(uint8_t i = 0; i < 8; i++)
printf("\033[1;3%d;9%dm███", i, i);
for(uint8_t i = max(options->block.range[0], 8); i <= options->block.range[1]; i++)
{
ffStrbufAppendF(&result, "\e[1;9%dm", i - 8);
for (uint8_t j = 0; j < options->block.width; j++)
ffStrbufAppendS(&result, "█");
}
}
else
{
@@ -49,10 +65,16 @@ void ffPrintColors(FFColorsOptions* options)
default: symbol = "███"; break;
}
for (int i = 8; i >= 1; --i)
printf("\e[3%dm%s ", i, symbol);
ffStrbufAppendF(&result, "\e[3%dm%s ", i, symbol);
}
puts(FASTFETCH_TEXT_MODIFIER_RESET);
if (result.length > 0)
{
if(options->paddingLeft > 0)
ffPrintCharTimes(' ', options->paddingLeft);
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET);
ffStrbufPutTo(&result, stdout);
}
}
bool ffParseColorsCommandOptions(FFColorsOptions* options, const char* key, const char* value)
@@ -82,6 +104,24 @@ bool ffParseColorsCommandOptions(FFColorsOptions* options, const char* key, cons
return true;
}
if (ffStrEqualsIgnCase(subKey, "block-width"))
{
options->block.width = (uint8_t) ffOptionParseUInt32(key, value);
return true;
}
if (ffStrEqualsIgnCase(subKey, "block-range-start"))
{
options->block.range[0] = min((uint8_t) ffOptionParseUInt32(key, value), 15);
return true;
}
if (ffStrEqualsIgnCase(subKey, "block-range-end"))
{
options->block.range[1] = min((uint8_t) ffOptionParseUInt32(key, value), 15);
return true;
}
return false;
}
@@ -123,6 +163,40 @@ void ffParseColorsJsonObject(FFColorsOptions* options, yyjson_val* module)
continue;
}
if (ffStrEqualsIgnCase(key, "block"))
{
if (!yyjson_is_obj(val))
ffPrintErrorString(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s value: must be an object", key);
else
{
yyjson_val* width = yyjson_obj_get(val, "width");
if (width)
options->block.width = (uint8_t) yyjson_get_uint(width);
yyjson_val* range = yyjson_obj_get(val, "range");
if (range)
{
if (!yyjson_is_arr(range) || yyjson_arr_size(range) != 2)
ffPrintErrorString(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: must be an array of 2 elements", key);
else
{
uint8_t start = (uint8_t) yyjson_get_uint(yyjson_arr_get(range, 0));
uint8_t end = (uint8_t) yyjson_get_uint(yyjson_arr_get(range, 1));
if (start > end)
ffPrintErrorString(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: range[0] > range[1]", key);
else if (end > 15)
ffPrintErrorString(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: range[1] > 15", key);
else
{
options->block.range[0] = start;
options->block.range[1] = end;
}
}
}
}
continue;
}
ffPrintErrorString(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", key);
}
}
@@ -168,6 +242,10 @@ void ffInitColorsOptions(FFColorsOptions* options)
ffStrbufSetStatic(&options->moduleArgs.key, " ");
options->symbol = FF_COLORS_SYMBOL_BLOCK;
options->paddingLeft = 0;
options->block = (FFBlockConfig) {
.width = 3,
.range = { 0, 15 },
};
}
void ffDestroyColorsOptions(FF_MAYBE_UNUSED FFColorsOptions* options)
+7
View File
@@ -14,6 +14,12 @@ typedef enum FFColorsSymbol
FF_COLORS_SYMBOL_STAR,
} FFColorsSymbol;
typedef struct FFBlockConfig
{
uint8_t width;
uint8_t range[2];
} FFBlockConfig;
typedef struct FFColorsOptions
{
FFModuleBaseInfo moduleInfo;
@@ -21,4 +27,5 @@ typedef struct FFColorsOptions
FFColorsSymbol symbol;
uint32_t paddingLeft;
FFBlockConfig block;
} FFColorsOptions;