Добавлены остальные инструменты

This commit is contained in:
2026-02-25 23:20:30 +03:00
parent 65ca468bfb
commit 790200be2a
8 changed files with 84 additions and 9 deletions

2
.vscode/tasks.json vendored
View File

@@ -4,7 +4,7 @@
{ {
"label": "zig: build", "label": "zig: build",
"type": "shell", "type": "shell",
"command": "zig build -Doptimize=Debug", "command": "zig build",
"group": { "group": {
"kind": "build", "kind": "build",
"isDefault": true "isDefault": true

View File

@@ -9,12 +9,12 @@ pub const ToolDescriptor = struct {
}; };
tools: []const ToolDescriptor, tools: []const ToolDescriptor,
selected_index: usize, selected_index: ?usize,
pub fn init(tools_list: []const ToolDescriptor) Toolbar { pub fn init(tools_list: []const ToolDescriptor) Toolbar {
return .{ return .{
.tools = tools_list, .tools = tools_list,
.selected_index = 0, .selected_index = null,
}; };
} }
@@ -22,9 +22,22 @@ pub fn deinit(_: *Toolbar) void {}
pub fn currentDescriptor(self: *const Toolbar) ?*const ToolDescriptor { pub fn currentDescriptor(self: *const Toolbar) ?*const ToolDescriptor {
if (self.tools.len == 0) return null; if (self.tools.len == 0) return null;
return &self.tools[self.selected_index]; if (self.selected_index) |index| {
return &self.tools[index];
}
return null;
} }
pub fn select(self: *Toolbar, index: usize) void { pub fn select(self: *Toolbar, index: ?usize) void {
if (index < self.tools.len) self.selected_index = index; if (index == self.selected_index) {
self.selected_index = null;
return;
}
if (index) |i| {
if (i < self.tools.len) {
self.selected_index = i;
}
} else {
self.selected_index = null;
}
} }

View File

@@ -1,3 +1,6 @@
const dvui = @import("dvui"); const dvui = @import("dvui");
pub const line = dvui.entypo.line_graph; pub const line = dvui.entypo.line_graph;
pub const ellipse = dvui.entypo.circle;
pub const arc = dvui.entypo.loop;
pub const broken = dvui.entypo.flow_line;

View File

@@ -1,5 +1,8 @@
const Toolbar = @import("Toolbar.zig"); const Toolbar = @import("Toolbar.zig");
const line = @import("tools/line.zig"); const line = @import("tools/line.zig");
const ellipse = @import("tools/ellipse.zig");
const arc = @import("tools/arc.zig");
const broken = @import("tools/broken.zig");
const icons = @import("icons.zig"); const icons = @import("icons.zig");
pub const default_tools = [_]Toolbar.ToolDescriptor{ pub const default_tools = [_]Toolbar.ToolDescriptor{
@@ -8,4 +11,19 @@ pub const default_tools = [_]Toolbar.ToolDescriptor{
.icon_tvg = icons.line, .icon_tvg = icons.line,
.implementation = &line.tool, .implementation = &line.tool,
}, },
.{
.name = "Ellipse",
.icon_tvg = icons.ellipse,
.implementation = &ellipse.tool,
},
.{
.name = "Arc",
.icon_tvg = icons.arc,
.implementation = &arc.tool,
},
.{
.name = "Broken line",
.icon_tvg = icons.broken,
.implementation = &broken.tool,
},
}; };

12
src/tools/arc.zig Normal file
View File

@@ -0,0 +1,12 @@
const Tool = @import("../Tool.zig");
const shape = @import("../models/shape/shape.zig");
fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
const canvas = ctx.canvas;
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();
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

12
src/tools/broken.zig Normal file
View File

@@ -0,0 +1,12 @@
const Tool = @import("../Tool.zig");
const shape = @import("../models/shape/shape.zig");
fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
const canvas = ctx.canvas;
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();
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

12
src/tools/ellipse.zig Normal file
View File

@@ -0,0 +1,12 @@
const Tool = @import("../Tool.zig");
const shape = @import("../models/shape/shape.zig");
fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
const canvas = ctx.canvas;
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();
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -196,16 +196,21 @@ fn drawToolbar(canvas: *Canvas) void {
}, },
); );
{ {
var to_select: ?usize = null;
for (tools_list, 0..) |*tool_desc, i| { for (tools_list, 0..) |*tool_desc, i| {
const is_selected = (canvas.toolbar.selected_index == i); const is_selected = canvas.toolbar.selected_index == i;
const selected_fill = dvui.themeGet().focus;
const opts: dvui.Options = .{ const opts: dvui.Options = .{
.id_extra = i, .id_extra = i,
.color_fill = if (is_selected) dvui.themeGet().fill else undefined, .color_fill = if (is_selected) selected_fill else null,
}; };
if (dvui.buttonIcon(@src(), tool_desc.name, tool_desc.icon_tvg, .{}, .{}, opts)) { if (dvui.buttonIcon(@src(), tool_desc.name, tool_desc.icon_tvg, .{}, .{}, opts)) {
canvas.toolbar.select(i); to_select = i;
} }
} }
if (to_select) |index| {
canvas.toolbar.select(index);
}
} }
bar.deinit(); bar.deinit();
} }