Mercurial
diff infinite_canvas/canvas.h @ 276:b55c22cff335
Add interactive infinite canvas prototype
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 16:57:56 -0700 |
| parents | |
| children | 8d560f50ed4c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/infinite_canvas/canvas.h Mon Aug 17 16:57:56 2026 -0700 @@ -0,0 +1,137 @@ +#ifndef INFINITE_CANVAS_CANVAS_H +#define INFINITE_CANVAS_CANVAS_H + +#include "dowa/dowa.h" +#include "infinite_canvas/theme.h" +#include "third_party/raylib/include/raylib.h" + +#define CANVAS_MAX_ENTITIES 1024 +#define CANVAS_WEB_FRAME_INSET 8.0f +#define CANVAS_WEB_RESIZE_HANDLE 18.0f +#define CANVAS_WEB_MIN_WIDTH 160.0f +#define CANVAS_WEB_MIN_HEIGHT 120.0f +#define CANVAS_CONTEXT_MAX_LENGTH (64 * 1024) + +typedef enum { + CANVAS_ENTITY_RECTANGLE = 0, + CANVAS_ENTITY_CIRCLE, + CANVAS_ENTITY_LINE, + CANVAS_ENTITY_TEXT, + CANVAS_ENTITY_BUTTON, + CANVAS_ENTITY_TEXT_AREA, + CANVAS_ENTITY_DROPDOWN, + CANVAS_ENTITY_ACCORDION, + CANVAS_ENTITY_CARD, + CANVAS_ENTITY_CALENDAR, + CANVAS_ENTITY_SWITCH, + CANVAS_ENTITY_TABLE, + CANVAS_ENTITY_NOTIFICATION, + CANVAS_ENTITY_SCROLL_AREA, + CANVAS_ENTITY_IMAGE, + CANVAS_ENTITY_WEB_CONTENT, + CANVAS_ENTITY_TYPE_COUNT, +} Canvas_Entity_Type; + +typedef struct { + uint32 id; + Canvas_Entity_Type type; + Vector2 position; + Vector2 size; + Color color; + char text[128]; + int32 value; + boolean active; + boolean pinned; + boolean screen_space_initialized; + float hover_amount; + float animation_amount; + Vector2 pinned_screen_position; + Vector2 pinned_screen_size; +} Canvas_Entity; + +typedef struct { + Vector2 target; + float zoom; + int32 viewport_width; + int32 viewport_height; + float min_zoom; + float max_zoom; +} Canvas_Camera; + +typedef struct { + Dowa_Arena *p_arena; + Canvas_Entity *p_entities; + uint32 next_entity; + uint32 next_entity_id; + int32 selected_index; + int32 pressed_index; + int32 hover_index; + boolean dragging; + boolean resizing; + boolean show_grid; + float notification_stack_amount; + Vector2 pointer_start; + Vector2 entity_start; + Vector2 entity_size_start; +} Canvas_Scene; + +typedef struct { + size_t visible_count; + size_t bytes_written; + boolean truncated; +} Canvas_Context_Snapshot; + +void Canvas_Camera_Init(Canvas_Camera *p_camera, int32 width, int32 height); +void Canvas_Camera_Set_Viewport(Canvas_Camera *p_camera, int32 width, int32 height); +Vector2 Canvas_Camera_Screen_To_World(const Canvas_Camera *p_camera, Vector2 screen); +Vector2 Canvas_Camera_World_To_Screen(const Canvas_Camera *p_camera, Vector2 world); +void Canvas_Camera_Pan(Canvas_Camera *p_camera, Vector2 screen_delta); +void Canvas_Camera_Zoom_At( + Canvas_Camera *p_camera, + Vector2 screen_anchor, + float zoom_multiplier); +Rectangle Canvas_Camera_Viewport_Bounds(const Canvas_Camera *p_camera); +float Canvas_Grid_Spacing(float zoom); + +void Canvas_Scene_Init(Canvas_Scene *p_scene, Dowa_Arena *p_arena); +boolean Canvas_Scene_Add(Canvas_Scene *p_scene, Canvas_Entity_Type type, Vector2 position); +void Canvas_Scene_Clear(Canvas_Scene *p_scene); +void Canvas_Scene_Add_Demo(Canvas_Scene *p_scene); +void Canvas_Scene_Add_Browser_Grid(Canvas_Scene *p_scene); +int32 Canvas_Scene_Pick( + const Canvas_Scene *p_scene, + Vector2 world_pointer, + float zoom); +boolean Canvas_Scene_Update_Interaction( + Canvas_Scene *p_scene, + const Canvas_Camera *p_camera, + boolean block_pointer_input); +boolean Canvas_Scene_Is_Text_Editing(const Canvas_Scene *p_scene); +void Canvas_Scene_Toggle_Selected_Pin( + Canvas_Scene *p_scene, + const Canvas_Camera *p_camera); +void Canvas_Scene_Sync_Pinned( + Canvas_Scene *p_scene, + const Canvas_Camera *p_camera); +void Canvas_Scene_Update_Notification_Stack( + Canvas_Scene *p_scene, + const Canvas_Camera *p_camera); +Canvas_Context_Snapshot Canvas_Scene_Build_Visible_Context( + const Canvas_Scene *p_scene, + const Canvas_Camera *p_camera, + char *p_buffer, + size_t buffer_size); + +void Canvas_Update_Camera_Input( + Canvas_Camera *p_camera, + boolean block_pointer_input, + boolean block_keyboard_input); +void Canvas_Draw_World( + const Canvas_Camera *p_camera, + const Canvas_Scene *p_scene, + Font font, + const Canvas_Theme *p_theme); + +const char *Canvas_Entity_Type_Name(Canvas_Entity_Type type); + +#endif