From 77604e7b2b51c4cece482cb547f2d2ad9d620bd1 Mon Sep 17 00:00:00 2001 From: Roman Pytkov Date: Thu, 26 Feb 2026 21:18:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B2=20=D1=80=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/Document.zig | 11 +++++++++++ src/toolbar/Tool.zig | 7 +++++++ src/toolbar/tools/arc.zig | 3 +-- src/toolbar/tools/broken.zig | 3 +-- src/toolbar/tools/ellipse.zig | 3 +-- src/toolbar/tools/line.zig | 3 +-- src/ui/canvas_view.zig | 5 +++-- 7 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/models/Document.zig b/src/models/Document.zig index 7ce22d6..603894c 100644 --- a/src/models/Document.zig +++ b/src/models/Document.zig @@ -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| { diff --git a/src/toolbar/Tool.zig b/src/toolbar/Tool.zig index e2ff953..f1857c8 100644 --- a/src/toolbar/Tool.zig +++ b/src/toolbar/Tool.zig @@ -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 { diff --git a/src/toolbar/tools/arc.zig b/src/toolbar/tools/arc.zig index b52bfb0..c91fe19 100644 --- a/src/toolbar/tools/arc.zig +++ b/src/toolbar/tools/arc.zig @@ -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 }; diff --git a/src/toolbar/tools/broken.zig b/src/toolbar/tools/broken.zig index eb15958..30617a1 100644 --- a/src/toolbar/tools/broken.zig +++ b/src/toolbar/tools/broken.zig @@ -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 }; diff --git a/src/toolbar/tools/ellipse.zig b/src/toolbar/tools/ellipse.zig index 41c01fa..93222a2 100644 --- a/src/toolbar/tools/ellipse.zig +++ b/src/toolbar/tools/ellipse.zig @@ -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 }; diff --git a/src/toolbar/tools/line.zig b/src/toolbar/tools/line.zig index 57644ca..84fd8c3 100644 --- a/src/toolbar/tools/line.zig +++ b/src/toolbar/tools/line.zig @@ -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 }; diff --git a/src/ui/canvas_view.zig b/src/ui/canvas_view.zig index 6d911c2..9e4a6b3 100644 --- a/src/ui/canvas_view.zig +++ b/src/ui/canvas_view.zig @@ -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});