view infinite_canvas/canvas.h @ 277:1d99147f520c

Merge Qwen services and infinite canvas heads
author MrJuneJune <me@mrjunejune.com>
date Mon, 17 Aug 2026 17:01:40 -0700
parents b55c22cff335
children 8d560f50ed4c
line wrap: on
line source

#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