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);