#pragma once // ============================================================================ // block_workspace.h - 工作区管理 // ============================================================================ #include "block_core.h" #define MAX_WORKSPACE_BLOCKS 1024 #define MAX_WORKSPACE_CONNECTIONS 2048 typedef struct BlockWorkspace { Block* blocks[MAX_WORKSPACE_BLOCKS]; int block_count; BlockConnection connections[MAX_WORKSPACE_CONNECTIONS]; int connection_count; float view_x, view_y; float zoom; Block* selected_block; BlockSlot* dragging_from; float drag_start_x, drag_start_y; int next_block_id; struct BlockPalette* palette; } BlockWorkspace; // 创建/销毁 BlockWorkspace* workspace_create(void); void workspace_destroy(BlockWorkspace* ws); // 添加/移除积木 int workspace_add_block(BlockWorkspace* ws, Block* block); void workspace_remove_block(BlockWorkspace* ws, int block_id); // 添加/移除连接 bool workspace_add_connection(BlockWorkspace* ws, BlockSlot* from, BlockSlot* to); void workspace_remove_connection(BlockWorkspace* ws, BlockSlot* from); void workspace_remove_all_connections(BlockWorkspace* ws, Block* block); // 查找 Block* workspace_find_block(BlockWorkspace* ws, int block_id); Block* workspace_find_block_at(BlockWorkspace* ws, float x, float y); BlockSlot* workspace_find_slot_at(BlockWorkspace* ws, float x, float y); // 视口变换 void workspace_screen_to_world(BlockWorkspace* ws, float sx, float sy, float* wx, float* wy); void workspace_world_to_screen(BlockWorkspace* ws, float wx, float wy, float* sx, float* sy); // 清空 void workspace_clear(BlockWorkspace* ws);