Добавлены остальные инструменты
This commit is contained in:
2
.vscode/tasks.json
vendored
2
.vscode/tasks.json
vendored
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
12
src/tools/arc.zig
Normal 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
12
src/tools/broken.zig
Normal 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
12
src/tools/ellipse.zig
Normal 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 };
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user