Добавлять объекты в родителя
This commit is contained in:
@@ -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| {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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});
|
||||
|
||||
Reference in New Issue
Block a user