Добавлять объекты в родителя

This commit is contained in:
2026-02-26 21:18:37 +03:00
parent 291dbd6f85
commit 77604e7b2b
7 changed files with 25 additions and 10 deletions

View File

@@ -30,6 +30,17 @@ pub fn addObject(self: *Document, template: Object) !void {
try self.objects.append(self.allocator, obj);
}
/// Добавляет объект в документ: как ребёнка родителя (если id найден), иначе в корень.
pub fn addObjectUnderParentId(self: *Document, parent_id: ?u64, template: Object) !void {
if (parent_id) |id| {
if (self.findObjectById(id)) |parent| {
try parent.addChild(self.allocator, template, &self.next_object_id);
return;
}
}
try self.addObject(template);
}
pub fn addShape(self: *Document, parent: ?*Object, shape_kind: Object.ShapeKind) !void {
const obj = try shape.createObject(self.allocator, shape_kind);
if (parent) |p| {

View File

@@ -1,9 +1,16 @@
const Point2_f = @import("../models/basic_models.zig").Point2_f;
const Canvas = @import("../Canvas.zig");
const Document = @import("../models/Document.zig");
pub const ToolContext = struct {
canvas: *Canvas,
document_point: Point2_f,
selected_object_id: ?u64,
pub fn addObject(self: *const ToolContext, template: Document.Object) !void {
try self.canvas.document.addObjectUnderParentId(self.selected_object_id, template);
self.canvas.requestRedraw();
}
};
pub const Tool = struct {

View File

@@ -6,7 +6,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
var obj = shape.createObject(canvas.document.allocator, .arc) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try canvas.document.addObject(obj);
canvas.requestRedraw();
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -6,7 +6,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
var obj = shape.createObject(canvas.document.allocator, .broken) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try canvas.document.addObject(obj);
canvas.requestRedraw();
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -6,7 +6,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
var obj = shape.createObject(canvas.document.allocator, .ellipse) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try canvas.document.addObject(obj);
canvas.requestRedraw();
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -8,7 +8,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
var obj = shape.createObject(canvas.document.allocator, .line) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try canvas.document.addObject(obj);
canvas.requestRedraw();
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -30,7 +30,7 @@ pub fn canvasView(canvas: *Canvas, selected_object_id: ?u64, content_rect_scale:
{
drawCanvasContent(canvas, scroll);
handleCanvasZoom(canvas, scroll);
handleCanvasMouse(canvas, scroll);
handleCanvasMouse(canvas, scroll, selected_object_id);
}
const scroll_parent = dvui.parentGet();
@@ -221,7 +221,7 @@ fn handleCanvasZoom(canvas: *Canvas, scroll: anytype) void {
}
}
fn handleCanvasMouse(canvas: *Canvas, scroll: *dvui.ScrollAreaWidget) void {
fn handleCanvasMouse(canvas: *Canvas, scroll: *dvui.ScrollAreaWidget, selected_object_id: ?u64) void {
const natural_scale = if (canvas.native_scaling) 1 else dvui.windowNaturalScale();
const scroll_data = scroll.data();
@@ -257,6 +257,7 @@ fn handleCanvasMouse(canvas: *Canvas, scroll: *dvui.ScrollAreaWidget) void {
var ctx = Tool.ToolContext{
.canvas = canvas,
.document_point = point,
.selected_object_id = selected_object_id,
};
desc.implementation.onCanvasClick(&ctx) catch |err| {
std.debug.print("onCanvasClick error: {}\n", .{err});