feat: add ansi colors
This commit is contained in:
24
app.cpp
24
app.cpp
@@ -143,7 +143,7 @@ int gymTrackerStatus(Arena *arena, list<string> args) {
|
||||
GymLogDbParsed *db = parseDb(arena, os_readEntireFile(arena, DB_FILE_LOCATION));
|
||||
|
||||
Timestamp startTs = {0};
|
||||
ParsePositiveIntResult numDays = {1, false};
|
||||
ParsePositiveIntResult numDays = {1, true};
|
||||
bool showAll = args.length == 1 && strEql(args.data[0], "--all"_s);
|
||||
if (!showAll) {
|
||||
if (args.length == 2 && (strEql(args.data[0], "--days"_s) || strEql(args.data[0], "-d"_s))) {
|
||||
@@ -169,6 +169,7 @@ int gymTrackerStatus(Arena *arena, list<string> args) {
|
||||
list<string> nameByExercise = PushFullListZero(arena, string, db->header.nextId);
|
||||
|
||||
list<real32> workPerExerciseByDay = PushFullListZero(arena, real32, db->header.nextId);
|
||||
list<real32> workPerExerciseByPrevDay = PushFullListZero(arena, real32, db->header.nextId);
|
||||
list<uint32> restPerExerciseByDay = PushFullListZero(arena, uint32, db->header.nextId);
|
||||
list<uint32> lastTsPerExerciseByDay = PushFullListZero(arena, uint32, db->header.nextId);
|
||||
|
||||
@@ -192,7 +193,7 @@ int gymTrackerStatus(Arena *arena, list<string> args) {
|
||||
if (dayCount > 0) {
|
||||
log("\n");
|
||||
}
|
||||
log("================ %S =================================\n", formatTimeYmd(arena, ×tamp));
|
||||
log("================ %S ===================\n", formatTimeYmd(arena, ×tamp));
|
||||
lastDay = timestamp.tm_yday;
|
||||
lastYear = timestamp.tm_year;
|
||||
dayCount++;
|
||||
@@ -245,12 +246,29 @@ int gymTrackerStatus(Arena *arena, list<string> args) {
|
||||
log("Work summary:\n");
|
||||
for (size_t j = 0; j < workPerExerciseByDay.length; j++) {
|
||||
if (workPerExerciseByDay.data[j] != 0.0f) {
|
||||
log("%S: %.2fkg in %.2fmin\n", nameByExercise.data[j], workPerExerciseByDay.data[j], (real32)restPerExerciseByDay.data[j] / 60.0f);
|
||||
const char *fmtString;
|
||||
real32 improvement = 0;
|
||||
if (workPerExerciseByPrevDay.data[j] == 0) {
|
||||
fmtString = COLOR_TEXT("%S", ANSI_fg_cyan) ": %.2fkg in %.2fmin\n";
|
||||
} else {
|
||||
improvement = workPerExerciseByDay.data[j] - workPerExerciseByPrevDay.data[j];
|
||||
if (improvement > 0) {
|
||||
fmtString = COLOR_TEXT("%S", ANSI_fg_cyan) ": %.2fkg in %.2fmin " COLOR_TEXT("+%.2fkg\n", ANSI_fg_green);
|
||||
} else {
|
||||
fmtString = COLOR_TEXT("%S", ANSI_fg_cyan) ": %.2fkg in %.2fmin " COLOR_TEXT("%.2fkg\n", ANSI_fg_red);
|
||||
}
|
||||
}
|
||||
|
||||
log(fmtString, nameByExercise.data[j], workPerExerciseByDay.data[j], (real32)restPerExerciseByDay.data[j] / 60.0f, improvement);
|
||||
|
||||
workPerExerciseByPrevDay.data[j] = workPerExerciseByDay.data[j];
|
||||
}
|
||||
}
|
||||
zeroListFull(&workPerExerciseByDay);
|
||||
zeroListFull(&restPerExerciseByDay);
|
||||
zeroListFull(&lastTsPerExerciseByDay);
|
||||
prevEntry = 0;
|
||||
entry = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,6 +208,52 @@ enum LogTarget {
|
||||
LogTarget_count,
|
||||
};
|
||||
|
||||
#define ANSI_INSTRUCTION_FROM_ENUM(ansiCodeEnum) ANSI_INSTRUCTION(ansiCodeEnum)
|
||||
#define ANSI_INSTRUCTION(ansiCode) "\u001b[" #ansiCode "m"
|
||||
#define ANSI_INSTRUCTION_STR(ansiCodeStr) "\u001b[" ansiCodeStr "m"
|
||||
#define ANSI_RESET ANSI_INSTRUCTION(0)
|
||||
|
||||
#define ANSI_fg_black 30
|
||||
#define ANSI_fg_red 31
|
||||
#define ANSI_fg_green 32
|
||||
#define ANSI_fg_yellow 33
|
||||
#define ANSI_fg_blue 34
|
||||
#define ANSI_fg_magenta 35
|
||||
#define ANSI_fg_cyan 36
|
||||
#define ANSI_fg_white 37
|
||||
|
||||
#define ANSI_fg_bblack 90
|
||||
#define ANSI_fg_bred 91
|
||||
#define ANSI_fg_bgreen 92
|
||||
#define ANSI_fg_byellow 93
|
||||
#define ANSI_fg_bblue 94
|
||||
#define ANSI_fg_bmagenta 95
|
||||
#define ANSI_fg_bcyan 96
|
||||
#define ANSI_fg_bwhite 97
|
||||
|
||||
#define ANSI_bg_black 40
|
||||
#define ANSI_bg_red 41
|
||||
#define ANSI_bg_green 42
|
||||
#define ANSI_bg_yellow 43
|
||||
#define ANSI_bg_blue 44
|
||||
#define ANSI_bg_magenta 45
|
||||
#define ANSI_bg_cyan 46
|
||||
#define ANSI_bg_white 47
|
||||
|
||||
#define ANSI_bg_bblack 100
|
||||
#define ANSI_bg_bred 101
|
||||
#define ANSI_bg_bgreen 102
|
||||
#define ANSI_bg_byellow 103
|
||||
#define ANSI_bg_bblue 104
|
||||
#define ANSI_bg_bmagenta 105
|
||||
#define ANSI_bg_bcyan 106
|
||||
#define ANSI_bg_bwhite 107
|
||||
|
||||
#define COLOR_TEXT(text, foregroundcolor) ANSI_INSTRUCTION_FROM_ENUM(foregroundcolor) text ANSI_RESET
|
||||
#define COLOR_TEXT_BG(text, backgroundcolor) ANSI_INSTRUCTION_FROM_ENUM(backgroundcolor) text ANSI_RESET
|
||||
#define COLOR_TEXT_FG_BG(text, foregroundcolor, backgroundcolor) ANSI_INSTRUCTION_FROM_ENUM(foregroundcolor) ANSI_INSTRUCTION_FROM_ENUM(backgroundcolor) text ANSI_RESET
|
||||
#define COLOR_TEXT_RGB(text, red, green, blue) ANSI_INSTRUCTION_STR("38;2;" #red ";" #green ";" #blue) text ANSI_RESET
|
||||
|
||||
void log(list<int> l, LogTarget target = LogTarget_stdout);
|
||||
void log(list<string> l, LogTarget target = LogTarget_stdout);
|
||||
void log(const char *fmt, ...);
|
||||
|
||||
Reference in New Issue
Block a user