comparison 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
comparison
equal deleted inserted replaced
274:c9be578316a6 276:b55c22cff335
1 #ifndef INFINITE_CANVAS_CANVAS_H
2 #define INFINITE_CANVAS_CANVAS_H
3
4 #include "dowa/dowa.h"
5 #include "infinite_canvas/theme.h"
6 #include "third_party/raylib/include/raylib.h"
7
8 #define CANVAS_MAX_ENTITIES 1024
9 #define CANVAS_WEB_FRAME_INSET 8.0f
10 #define CANVAS_WEB_RESIZE_HANDLE 18.0f
11 #define CANVAS_WEB_MIN_WIDTH 160.0f
12 #define CANVAS_WEB_MIN_HEIGHT 120.0f
13 #define CANVAS_CONTEXT_MAX_LENGTH (64 * 1024)
14
15 typedef enum {
16 CANVAS_ENTITY_RECTANGLE = 0,
17 CANVAS_ENTITY_CIRCLE,
18 CANVAS_ENTITY_LINE,
19 CANVAS_ENTITY_TEXT,
20 CANVAS_ENTITY_BUTTON,
21 CANVAS_ENTITY_TEXT_AREA,
22 CANVAS_ENTITY_DROPDOWN,
23 CANVAS_ENTITY_ACCORDION,
24 CANVAS_ENTITY_CARD,
25 CANVAS_ENTITY_CALENDAR,
26 CANVAS_ENTITY_SWITCH,
27 CANVAS_ENTITY_TABLE,
28 CANVAS_ENTITY_NOTIFICATION,
29 CANVAS_ENTITY_SCROLL_AREA,
30 CANVAS_ENTITY_IMAGE,
31 CANVAS_ENTITY_WEB_CONTENT,
32 CANVAS_ENTITY_TYPE_COUNT,
33 } Canvas_Entity_Type;
34
35 typedef struct {
36 uint32 id;
37 Canvas_Entity_Type type;
38 Vector2 position;
39 Vector2 size;
40 Color color;
41 char text[128];
42 int32 value;
43 boolean active;
44 boolean pinned;
45 boolean screen_space_initialized;
46 float hover_amount;
47 float animation_amount;
48 Vector2 pinned_screen_position;
49 Vector2 pinned_screen_size;
50 } Canvas_Entity;
51
52 typedef struct {
53 Vector2 target;
54 float zoom;
55 int32 viewport_width;
56 int32 viewport_height;
57 float min_zoom;
58 float max_zoom;
59 } Canvas_Camera;
60
61 typedef struct {
62 Dowa_Arena *p_arena;
63 Canvas_Entity *p_entities;
64 uint32 next_entity;
65 uint32 next_entity_id;
66 int32 selected_index;
67 int32 pressed_index;
68 int32 hover_index;
69 boolean dragging;
70 boolean resizing;
71 boolean show_grid;
72 float notification_stack_amount;
73 Vector2 pointer_start;
74 Vector2 entity_start;
75 Vector2 entity_size_start;
76 } Canvas_Scene;
77
78 typedef struct {
79 size_t visible_count;
80 size_t bytes_written;
81 boolean truncated;
82 } Canvas_Context_Snapshot;
83
84 void Canvas_Camera_Init(Canvas_Camera *p_camera, int32 width, int32 height);
85 void Canvas_Camera_Set_Viewport(Canvas_Camera *p_camera, int32 width, int32 height);
86 Vector2 Canvas_Camera_Screen_To_World(const Canvas_Camera *p_camera, Vector2 screen);
87 Vector2 Canvas_Camera_World_To_Screen(const Canvas_Camera *p_camera, Vector2 world);
88 void Canvas_Camera_Pan(Canvas_Camera *p_camera, Vector2 screen_delta);
89 void Canvas_Camera_Zoom_At(
90 Canvas_Camera *p_camera,
91 Vector2 screen_anchor,
92 float zoom_multiplier);
93 Rectangle Canvas_Camera_Viewport_Bounds(const Canvas_Camera *p_camera);
94 float Canvas_Grid_Spacing(float zoom);
95
96 void Canvas_Scene_Init(Canvas_Scene *p_scene, Dowa_Arena *p_arena);
97 boolean Canvas_Scene_Add(Canvas_Scene *p_scene, Canvas_Entity_Type type, Vector2 position);
98 void Canvas_Scene_Clear(Canvas_Scene *p_scene);
99 void Canvas_Scene_Add_Demo(Canvas_Scene *p_scene);
100 void Canvas_Scene_Add_Browser_Grid(Canvas_Scene *p_scene);
101 int32 Canvas_Scene_Pick(
102 const Canvas_Scene *p_scene,
103 Vector2 world_pointer,
104 float zoom);
105 boolean Canvas_Scene_Update_Interaction(
106 Canvas_Scene *p_scene,
107 const Canvas_Camera *p_camera,
108 boolean block_pointer_input);
109 boolean Canvas_Scene_Is_Text_Editing(const Canvas_Scene *p_scene);
110 void Canvas_Scene_Toggle_Selected_Pin(
111 Canvas_Scene *p_scene,
112 const Canvas_Camera *p_camera);
113 void Canvas_Scene_Sync_Pinned(
114 Canvas_Scene *p_scene,
115 const Canvas_Camera *p_camera);
116 void Canvas_Scene_Update_Notification_Stack(
117 Canvas_Scene *p_scene,
118 const Canvas_Camera *p_camera);
119 Canvas_Context_Snapshot Canvas_Scene_Build_Visible_Context(
120 const Canvas_Scene *p_scene,
121 const Canvas_Camera *p_camera,
122 char *p_buffer,
123 size_t buffer_size);
124
125 void Canvas_Update_Camera_Input(
126 Canvas_Camera *p_camera,
127 boolean block_pointer_input,
128 boolean block_keyboard_input);
129 void Canvas_Draw_World(
130 const Canvas_Camera *p_camera,
131 const Canvas_Scene *p_scene,
132 Font font,
133 const Canvas_Theme *p_theme);
134
135 const char *Canvas_Entity_Type_Name(Canvas_Entity_Type type);
136
137 #endif