Mercurial
diff infinite_canvas/canvas.h @ 278:8d560f50ed4c
Improve infinite canvas interactions and browser chrome
Render Lucide icons directly with Raylib, add searchable icon browsing, robust text editing, entity lifecycle animations, z-order-safe input, semantic themes, and animated editable browser controls. Document rendering, pinning, context, and component extension for future agents.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: f68442b1-fa8f-46a0-9689-81710613bbd4
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:16:14 -0700 |
| parents | b55c22cff335 |
| children | 49e9e591c9bb |
line wrap: on
line diff
--- a/infinite_canvas/canvas.h Mon Aug 17 17:01:40 2026 -0700 +++ b/infinite_canvas/canvas.h Mon Aug 17 22:16:14 2026 -0700 @@ -7,10 +7,12 @@ #define CANVAS_MAX_ENTITIES 1024 #define CANVAS_WEB_FRAME_INSET 8.0f +#define CANVAS_WEB_TOOLBAR_HEIGHT 42.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) +#define CANVAS_ENTITY_TEXT_CAPACITY 2048 typedef enum { CANVAS_ENTITY_RECTANGLE = 0, @@ -29,6 +31,7 @@ CANVAS_ENTITY_SCROLL_AREA, CANVAS_ENTITY_IMAGE, CANVAS_ENTITY_WEB_CONTENT, + CANVAS_ENTITY_LUCIDE_GALLERY, CANVAS_ENTITY_TYPE_COUNT, } Canvas_Entity_Type; @@ -38,13 +41,19 @@ Vector2 position; Vector2 size; Color color; - char text[128]; + char text[CANVAS_ENTITY_TEXT_CAPACITY]; int32 value; + int32 text_cursor; + int32 text_selection_anchor; + float text_scroll_y; + float visibility_amount; boolean active; boolean pinned; + boolean removing; boolean screen_space_initialized; float hover_amount; float animation_amount; + float web_chrome_amount; Vector2 pinned_screen_position; Vector2 pinned_screen_size; } Canvas_Entity; @@ -68,8 +77,15 @@ int32 hover_index; boolean dragging; boolean resizing; + boolean selecting_text; + boolean editing_web_url; boolean show_grid; float notification_stack_amount; + uint32 web_url_entity_id; + int32 web_url_cursor; + int32 web_url_selection_anchor; + float web_url_scroll_x; + char web_url_draft[CANVAS_ENTITY_TEXT_CAPACITY]; Vector2 pointer_start; Vector2 entity_start; Vector2 entity_size_start; @@ -81,6 +97,14 @@ boolean truncated; } Canvas_Context_Snapshot; +typedef enum { + CANVAS_WEB_CHROME_NONE = 0, + CANVAS_WEB_CHROME_CAPTURE, + CANVAS_WEB_CHROME_BACK, + CANVAS_WEB_CHROME_FORWARD, + CANVAS_WEB_CHROME_NAVIGATE, +} Canvas_Web_Chrome_Action; + 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); @@ -91,20 +115,44 @@ Vector2 screen_anchor, float zoom_multiplier); Rectangle Canvas_Camera_Viewport_Bounds(const Canvas_Camera *p_camera); +void Canvas_Camera_Fit_Bounds( + Canvas_Camera *p_camera, + Rectangle bounds, + float padding_left, + float padding_top, + float padding_right, + float padding_bottom); float Canvas_Grid_Spacing(float zoom); +int32 Canvas_Lucide_Count_Matches(const char *p_query); +Canvas_Web_Chrome_Action Canvas_Web_Chrome_Update_Input( + const Canvas_Camera *p_camera, + Canvas_Scene *p_scene, + Font font, + const char *p_current_url); +boolean Canvas_Web_Chrome_Is_Editing(const Canvas_Scene *p_scene); 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_Fade_Out_All(Canvas_Scene *p_scene); +void Canvas_Scene_Fade_Out_Selected(Canvas_Scene *p_scene); void Canvas_Scene_Add_Demo(Canvas_Scene *p_scene); void Canvas_Scene_Add_Browser_Grid(Canvas_Scene *p_scene); +boolean Canvas_Scene_Show_Lucide_Gallery( + Canvas_Scene *p_scene, + Canvas_Camera *p_camera); int32 Canvas_Scene_Pick( const Canvas_Scene *p_scene, Vector2 world_pointer, float zoom); +int32 Canvas_Scene_Topmost_Visual( + const Canvas_Scene *p_scene, + Vector2 world_pointer, + float zoom); boolean Canvas_Scene_Update_Interaction( Canvas_Scene *p_scene, const Canvas_Camera *p_camera, + Font font, boolean block_pointer_input); boolean Canvas_Scene_Is_Text_Editing(const Canvas_Scene *p_scene); void Canvas_Scene_Toggle_Selected_Pin( @@ -131,6 +179,30 @@ const Canvas_Scene *p_scene, Font font, const Canvas_Theme *p_theme); +void Canvas_Draw_World_Background( + const Canvas_Camera *p_camera, + const Canvas_Scene *p_scene, + const Canvas_Theme *p_theme); +void Canvas_Draw_World_Entity( + const Canvas_Camera *p_camera, + const Canvas_Scene *p_scene, + size_t entity_index, + Font font, + const Canvas_Theme *p_theme); +void Canvas_Draw_Web_Chrome_Entity( + const Canvas_Camera *p_camera, + const Canvas_Scene *p_scene, + size_t entity_index, + Font font, + const Canvas_Theme *p_theme, + const char *p_url, + boolean can_go_back, + boolean can_go_forward); +void Canvas_Draw_World_Overlays( + 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);