diff --git a/src/WindowContext.zig b/src/WindowContext.zig index 6bd9498..52ac7dd 100644 --- a/src/WindowContext.zig +++ b/src/WindowContext.zig @@ -10,7 +10,7 @@ canvas: Canvas, cpu_render: *CpuRenderEngine, frame_index: u64, /// Открытые документы в текущем окне -documents: std.array_list.Managed(Document), +documents: std.ArrayList(Document), pub fn init(allocator: std.mem.Allocator) !WindowContext { var self: WindowContext = undefined; @@ -23,13 +23,14 @@ pub fn init(allocator: std.mem.Allocator) !WindowContext { self.canvas = Canvas.init(allocator, self.cpu_render.renderEngine()); self.frame_index = 0; - self.documents = std.array_list.Managed(Document).init(allocator); + self.documents = std.ArrayList(Document).empty; return self; } pub fn deinit(self: *WindowContext) void { - self.documents.deinit(); + for (self.documents.items) |*doc| doc.deinit(); + self.documents.deinit(self.allocator); self.canvas.deinit(); self.allocator.destroy(self.cpu_render); } diff --git a/src/models/Document.zig b/src/models/Document.zig index 288f97b..cbdf31f 100644 --- a/src/models/Document.zig +++ b/src/models/Document.zig @@ -1,6 +1,67 @@ +const std = @import("std"); const basic_models = @import("basic_models.zig"); const Size = basic_models.Size; +const ObjectCommon = basic_models.ObjectCommon; +const Point2 = basic_models.Point2; const Document = @This(); size: Size, +allocator: std.mem.Allocator, +layers: std.ArrayList(Layer), + +pub fn init(allocator: std.mem.Allocator, size: Size) Document { + return .{ + .size = size, + .allocator = allocator, + .layers = std.ArrayList(Layer).empty, + }; +} + +pub fn deinit(self: *Document) void { + for (self.layers.items) |*layer| layer.deinit(); + self.layers.deinit(self.allocator); +} + +pub const Layer = struct { + name: [64:0]u8 = .{0} ** 64, + allocator: std.mem.Allocator, + objects: std.ArrayList(Object), + + pub fn init(allocator: std.mem.Allocator) Layer { + return .{ + .allocator = allocator, + .objects = std.ArrayList(Object).empty, + }; + } + + pub fn deinit(self: *Layer) void { + self.objects.deinit(self.allocator); + } +}; + +/// Объект на слое: общие свойства + полиморфные данные по тегу (path, rect, ellipse, ...). +/// Полиморфизм через tagged union — без наследования и vtable, диспетчеризация через switch (obj.data). +pub const Object = struct { + common: ObjectCommon, + data: Data, + + pub const Data = union(enum) { + path: PathData, + rect: RectData, + ellipse: EllipseData, + }; + + /// Точки контура (заглушка; позже — владение через Layer/Document allocator) + pub const PathData = struct {}; + + pub const RectData = struct { + width: f32, + height: f32, + }; + + pub const EllipseData = struct { + radius_x: f32, + radius_y: f32, + }; +}; diff --git a/src/models/basic_models.zig b/src/models/basic_models.zig index 7bbd738..f5d7d40 100644 --- a/src/models/basic_models.zig +++ b/src/models/basic_models.zig @@ -14,3 +14,25 @@ pub const Size = struct { width: f32, height: f32, }; + +/// Точка в 2D (документные единицы) +pub const Point2 = struct { + x: f32, + y: f32, +}; + +/// Трансформ объекта: позиция и масштаб (поворот при необходимости добавить отдельно) +pub const Transform2 = struct { + x: f32 = 0, + y: f32 = 0, + scale_x: f32 = 1, + scale_y: f32 = 1, +}; + +/// Общие свойства любого объекта на слое (видимость, блокировка, непрозрачность, трансформ) +pub const ObjectCommon = struct { + transform: Transform2 = .{}, + visible: bool = true, + locked: bool = false, + opacity: f32 = 1.0, +};