diff --git a/src/Canvas.zig b/src/Canvas.zig index 051f1ac..b2df2c6 100644 --- a/src/Canvas.zig +++ b/src/Canvas.zig @@ -8,7 +8,7 @@ const Rect_i = basic_models.Rect_i; const Size_i = basic_models.Size_i; const Point2_f = @import("models/basic_models.zig").Point2_f; const Color = dvui.Color; - +const tools = @import("tools.zig"); const Toolbar = @import("Toolbar.zig"); const Canvas = @This(); @@ -29,15 +29,14 @@ _zoom: f32 = 1, _redraw_pending: bool = false, _last_redraw_time_ms: i64 = 0, cursor_document_point: ?Point2_f = null, -/// true — рисовать документ (render), false — пример (gradient/squares). draw_document: bool = true, -pub fn init(allocator: std.mem.Allocator, document: *Document, engine: RenderEngine, toolbar: Toolbar) Canvas { +pub fn init(allocator: std.mem.Allocator, document: *Document, engine: RenderEngine) Canvas { return .{ .allocator = allocator, .document = document, .render_engine = engine, - .toolbar = toolbar, + .toolbar = Toolbar.init(&tools.default_tools), }; } diff --git a/src/Tool.zig b/src/Tool.zig new file mode 100644 index 0000000..64f2379 --- /dev/null +++ b/src/Tool.zig @@ -0,0 +1,11 @@ +const Point2_f = @import("models/basic_models.zig").Point2_f; +const Canvas = @import("Canvas.zig"); + +pub const ToolContext = struct { + canvas: *Canvas, + document_point: Point2_f, +}; + +pub const Tool = struct { + onCanvasClick: *const fn (*const ToolContext) void, +}; diff --git a/src/Toolbar.zig b/src/Toolbar.zig index 9b44df9..b5cd5b0 100644 --- a/src/Toolbar.zig +++ b/src/Toolbar.zig @@ -1,19 +1,13 @@ -//! Структура тулбара инструментов. Жизненный цикл совпадает с Canvas. - -const tool_interface = @import("tool_interface.zig"); +const Tool = @import("Tool.zig"); const Toolbar = @This(); -/// Описание одного инструмента для тулбара. pub const ToolDescriptor = struct { name: []const u8, - /// Иконка в формате TVG (байты). icon_tvg: []const u8, - /// Реализация интерфейса инструмента (своя для каждого инструмента в tools/). - implementation: *const tool_interface.Tool, + implementation: *const Tool.Tool, }; -/// Вертикальный тулбар инструментов. tools: []const ToolDescriptor, selected_index: usize, diff --git a/src/WindowContext.zig b/src/WindowContext.zig index 9f0d919..eedb590 100644 --- a/src/WindowContext.zig +++ b/src/WindowContext.zig @@ -5,8 +5,6 @@ const RenderEngine = @import("render/RenderEngine.zig").RenderEngine; const Document = @import("models/Document.zig"); const random_document = @import("models/random_document.zig"); const basic_models = @import("models/basic_models.zig"); -const tools = @import("tools.zig"); -const Toolbar = @import("Toolbar.zig"); const WindowContext = @This(); @@ -23,7 +21,6 @@ pub const OpenDocument = struct { allocator, &self.document, (&self.cpu_render).renderEngine(), - Toolbar.init(&tools.default_tools), ); } diff --git a/src/tool_interface.zig b/src/tool_interface.zig deleted file mode 100644 index aeb1ffb..0000000 --- a/src/tool_interface.zig +++ /dev/null @@ -1,14 +0,0 @@ -//! Общий интерфейс инструмента. Реализации живут в каталоге tools/. - -const Point2_f = @import("models/basic_models.zig").Point2_f; - -/// Контекст вызова: холст и точка в координатах документа. -pub const ToolContext = struct { - canvas: *anyopaque, - document_point: Point2_f, -}; - -/// Интерфейс инструмента: один метод — клик по холсту в позиции курсора. -pub const Tool = struct { - onClick: *const fn (*const ToolContext) void, -}; diff --git a/src/tools.zig b/src/tools.zig index fdc8152..24c4164 100644 --- a/src/tools.zig +++ b/src/tools.zig @@ -1,5 +1,3 @@ -//! Список инструментов по умолчанию для тулбара. Реализации — в каталоге tools/. - const Toolbar = @import("Toolbar.zig"); const line = @import("tools/line.zig"); const icons = @import("icons.zig"); diff --git a/src/tools/line.zig b/src/tools/line.zig index e02958f..f3598d1 100644 --- a/src/tools/line.zig +++ b/src/tools/line.zig @@ -1,21 +1,19 @@ -//! Инструмент «Линия»: создаёт линию в позиции клика. - const Canvas = @import("../Canvas.zig"); -const tool_interface = @import("../tool_interface.zig"); +const Tool = @import("../Tool.zig"); const shape = @import("../models/shape/shape.zig"); -fn onClick(ctx: *const tool_interface.ToolContext) void { - const canvas: *Canvas = @alignCast(@ptrCast(ctx.canvas)); +fn onCanvasClick(ctx: *const Tool.ToolContext) void { + const canvas = ctx.canvas; var obj = shape.createObject(canvas.document.allocator, .line) catch return; + defer obj.deinit(canvas.allocator); obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } }) catch { obj.deinit(canvas.document.allocator); return; }; canvas.document.addObject(obj) catch { - obj.deinit(canvas.document.allocator); return; }; canvas.requestRedraw(); } -pub const tool = tool_interface.Tool{ .onClick = onClick }; +pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick }; diff --git a/src/ui/canvas_view.zig b/src/ui/canvas_view.zig index 8ef3f39..5fa3c1e 100644 --- a/src/ui/canvas_view.zig +++ b/src/ui/canvas_view.zig @@ -3,7 +3,7 @@ const dvui = @import("dvui"); const dvui_ext = @import("dvui_ext.zig"); const Canvas = @import("../Canvas.zig"); const Rect_i = @import("../models/basic_models.zig").Rect_i; -const tool_interface = @import("../tool_interface.zig"); +const Tool = @import("../Tool.zig"); pub fn canvasView(canvas: *Canvas, content_rect_scale: dvui.RectScale) void { var textured = dvui_ext.texturedBox(content_rect_scale, dvui.Rect.all(20)); @@ -163,11 +163,11 @@ fn handleCanvasMouse(canvas: *Canvas, scroll: anytype) void { canvas.cursor_document_point = if (canvas.isContentPointOnDocument(content_pt, natural_scale)) doc_pt else null; if (canvas.cursor_document_point) |point| { if (canvas.toolbar.currentDescriptor()) |desc| { - var ctx = tool_interface.ToolContext{ + var ctx = Tool.ToolContext{ .canvas = canvas, .document_point = point, }; - desc.implementation.onClick(&ctx); + desc.implementation.onCanvasClick(&ctx); } } }, @@ -198,7 +198,7 @@ fn drawToolbar(canvas: *Canvas) void { const is_selected = (canvas.toolbar.selected_index == i); const opts: dvui.Options = .{ .id_extra = i, - .color_fill = if (is_selected) dvui.Color.transparent else undefined, + .color_fill = if (is_selected) dvui.themeGet().fill else undefined, }; if (dvui.buttonIcon(@src(), tool_desc.name, tool_desc.icon_tvg, .{}, .{}, opts)) { canvas.toolbar.select(i);