From 1f3b2686ef07470a5fd396961e7a306d5230474f Mon Sep 17 00:00:00 2001 From: talksik Date: Fri, 2 Oct 2026 12:37:25 -0700 Subject: [PATCH] feat: simple overlay and window modes with intention setting --- .gitignore | 4 ++- Makefile | 24 ++++++++++++------ TODO.md | 4 +++ adhd | Bin 18048 -> 0 bytes include/common.h | 15 ++++++++++++ include/store.h | 10 ++++++++ include/window_state.h | 24 ++++++++++++++++++ src/main.c | 52 ++++++++++++++++++++++++++++++++++++--- src/window_state.c | 54 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 174 insertions(+), 13 deletions(-) delete mode 100755 adhd create mode 100644 include/common.h create mode 100644 include/store.h create mode 100644 include/window_state.h create mode 100644 src/window_state.c diff --git a/.gitignore b/.gitignore index 54dd716..d4e463c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ build/ *~ -*.o \ No newline at end of file +*.o +*#* +adhd \ No newline at end of file diff --git a/Makefile b/Makefile index 83ebac5..5976374 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,24 @@ CC = cc CFLAGS = -g -Wall -Iinclude -SOURCES = $(wildcard src/*.c) -OBJECTS = $(SOURCES:.c=.o) -LDFLAGS = -lraylib +SOURCES = src/main.c src/window_state.c +OBJECTS = src/main.o src/window_state.o +LDFLAGS = -lraylib -lm HEADERS = \ - include/raygui.h + include/raygui.h include/common.h include/window_state.h -adhd: $(OBJECTS) - $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) +# adhd: $(OBJECTS) +# $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) -%.o: %.c $(HEADERS) - $(CC) $(CFLAGS) -c $< -o $@ +# %.o: %.c $(HEADERS) +# $(CC) $(CFLAGS) -c $< -o $@ +adhd: src/main.o src/window_state.o + $(CC) $(CFLAGS) src/main.o src/window_state.o -o $@ $(LDFLAGS) + +src/main.o: src/main.c $(HEADERS) + $(CC) -c $(CFLAGS) src/main.c -o $@ + +src/window_state.o: src/window_state.c $(HEADERS) + $(CC) -c $(CFLAGS) src/window_state.c -o $@ clean: rm -rf $(OBJECTS) adhd diff --git a/TODO.md b/TODO.md index 4db2c59..94fe400 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,8 @@ +- [x] model window state +- [ ] math behind animation engine +- [ ] grid system for win / loss + - [ ] create a slick overlay mode - [ ] create a simple window mode for adjusting the current intention - [ ] remind me by flashing every x minutes (gradient orange) diff --git a/adhd b/adhd deleted file mode 100755 index e87f99e9fd928fe34a7dfcd7fe30da7621c26bcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18048 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 diff --git a/include/common.h b/include/common.h new file mode 100644 index 0000000..7b30bc6 --- /dev/null +++ b/include/common.h @@ -0,0 +1,15 @@ +#ifndef COMMON_H +#define COMMON_H + +typedef unsigned int U32; + +struct date { + U32 day; + U32 month; + U32 year; +}; + +struct date to_date(char *); +char *to_string(struct date); + +#endif diff --git a/include/store.h b/include/store.h new file mode 100644 index 0000000..ca00022 --- /dev/null +++ b/include/store.h @@ -0,0 +1,10 @@ +#include +#include "common.h" + +/* persist on disk with compact representation + date representation -> value + */ +void store_result(U32 val, struct date d); +void retrieve_result(U32 val, struct date d); +void retrieve_results_before(int *vals, struct date before); + diff --git a/include/window_state.h b/include/window_state.h new file mode 100644 index 0000000..ebf8dce --- /dev/null +++ b/include/window_state.h @@ -0,0 +1,24 @@ +#ifndef WINDOWSTATE_H +#define WINDOWSTATE_H + +#include "common.h" +#include +#define GRAPH_DAYS 30 + +enum mode_t { + WINDOW = 0, + OVERLAY +}; +typedef enum mode_t Mode; + +void init_window_state(); +void cleanup_window_state(); + +void set_intention(char *intention); +char *get_intention(); +size_t get_intention_size(); + +Mode get_mode(); +void set_mode(Mode mode); + +#endif diff --git a/src/main.c b/src/main.c index a5aa533..f6b7876 100644 --- a/src/main.c +++ b/src/main.c @@ -1,34 +1,78 @@ #include + +#define RAYGUI_IMPLEMENTATION #include #include +#include "window_state.h" #define WINDOW_HEIGHT 700 #define WINDOW_WIDTH 500 #define OVERLAY_HEIGHT 300 #define OVERLAY_WIDTH 700 +bool edit_mode = true; + +void switch_mode(Mode mode) { + set_mode(mode); + + switch (mode) { + case WINDOW: + SetWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); + break; + case OVERLAY: + SetWindowSize(OVERLAY_WIDTH, OVERLAY_HEIGHT); + break; + default: + break; + } +} + void render_window() { ClearBackground(RAYWHITE); DrawFPS(WINDOW_WIDTH - 50, 10); - // draw a button for toggle mode + const Rectangle text_rect = {(WINDOW_WIDTH / 2) - 200, WINDOW_HEIGHT / 2, 400, 50}; + if (GuiTextBox(text_rect, get_intention(), get_intention_size(), &edit_mode)) { + switch_mode(OVERLAY); + } + + char label[2048]; + sprintf(label, "%d / %d characters | Hit enter to set", (int) strlen(get_intention()), (int) get_intention_size()); + GuiLabel((Rectangle){ WINDOW_WIDTH / 2 - 100, (WINDOW_HEIGHT / 2) + 50, 300, 50}, label); + } void render_overlay() { ClearBackground(BLANK); DrawFPS(OVERLAY_WIDTH - 50, 10); - // draw a button to toggle mode + const Rectangle button_rect = {OVERLAY_WIDTH - 100, 10, 100, 25}; + int active = 0; + + if (GuiToggleSlider(button_rect, "Toggle mode", &active)) { + switch_mode(WINDOW); + } + + GuiSetStyle(DEFAULT, TEXT_SIZE, 100); + GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); + GuiLabel((Rectangle){0, (OVERLAY_HEIGHT / 2), OVERLAY_WIDTH, 50}, get_intention()); } int main(int argc, char *argv[]) { + init_window_state(); + printf("Welcome to Flowy.adhd\n"); InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Flowy.adhd"); - + while (!WindowShouldClose()) { BeginDrawing(); - render_window(); + + GuiSetStyle(DEFAULT, TEXT_SIZE, 15); + + if (get_mode() == WINDOW) render_window(); + else render_overlay(); + EndDrawing(); } diff --git a/src/window_state.c b/src/window_state.c new file mode 100644 index 0000000..d06d44a --- /dev/null +++ b/src/window_state.c @@ -0,0 +1,54 @@ +#include "window_state.h" +#include +#include +#include + +struct state *s = NULL; + +#define INTENTION_MAX_SIZE 2048 + +struct state { + Mode mode; + char intention[INTENTION_MAX_SIZE]; +}; + +void init_window_state() { + s = malloc(sizeof(struct state)); + s->mode = WINDOW; + + memset(s->intention, 0, sizeof(s->intention)); +} + +void cleanup_window_state() { + if (!s) { + return; + } + free(s); + s = NULL; +} + +void set_intention(char *intention) { + assert(s); + + strncpy(s->intention, intention, sizeof(s->intention)); + s->intention[sizeof(s->intention) - 1] = '\0'; +} + +char *get_intention() { + assert(s); + return s->intention; +} + +size_t get_intention_size() { + assert(s); + return sizeof(s->intention); +} + +Mode get_mode() { + assert(s); + return s->mode; +} + +void set_mode(Mode new_mode) { + s->mode = new_mode; +}