Дополнительные базовые модели

This commit is contained in:
2026-02-22 20:38:03 +03:00
parent 7dc7069186
commit 48824532f1
3 changed files with 87 additions and 3 deletions

View File

@@ -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,
};
};

View File

@@ -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,
};