From 0ef835b019626cb5999313222eec68212204d173 Mon Sep 17 00:00:00 2001 From: Roman Pytkov Date: Fri, 27 Feb 2026 00:04:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=82?= =?UTF-8?q?=20=D1=81=D0=BB=D0=B0=D0=B9=D0=B4=D0=B5=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/render/cpu/line.zig | 5 +- src/ui/canvas_view.zig | 117 ++++++++++++++++++++++++++++++++++------ 2 files changed, 104 insertions(+), 18 deletions(-) diff --git a/src/render/cpu/line.zig b/src/render/cpu/line.zig index 8343046..39613ca 100644 --- a/src/render/cpu/line.zig +++ b/src/render/cpu/line.zig @@ -28,8 +28,9 @@ pub fn drawLine(ctx: *DrawContext, x0: f32, y0: f32, x1: f32, y1: f32, color: Co const b1 = ctx.worldToBuffer(w1.x, w1.y); const t = &ctx.transform; const scale = @sqrt(t.scale.scale_x * ctx.scale_x * t.scale.scale_y * ctx.scale_y); - const thickness_px: u32 = @max(@as(u32, 1), @as(u32, @intFromFloat(std.math.round(thickness * scale)))); - drawLineInBuffer(ctx, b0.x, b0.y, b1.x, b1.y, color, thickness_px); + const thickness_px: u32 = @as(u32, @intFromFloat(std.math.round(thickness * scale))); + if (thickness_px > 0) + drawLineInBuffer(ctx, b0.x, b0.y, b1.x, b1.y, color, thickness_px); } inline fn clip(p: f32, q: f32, t0: *f32, t1: *f32) bool { diff --git a/src/ui/canvas_view.zig b/src/ui/canvas_view.zig index 30e904f..464e2df 100644 --- a/src/ui/canvas_view.zig +++ b/src/ui/canvas_view.zig @@ -356,8 +356,22 @@ fn drawPropertyEditor(canvas: *Canvas, obj: *Document.Object, prop: *const Prope const min_y = -doc.size.h; const max_y = doc.size.h; var changed = false; - changed = dvui.sliderEntry(@src(), "x: {d:0.2}", .{ .value = &next.x, .min = min_x, .max = max_x, .interval = 0.1 }, .{ .expand = .horizontal }) or changed; - changed = dvui.sliderEntry(@src(), "y: {d:0.2}", .{ .value = &next.y, .min = min_y, .max = max_y, .interval = 0.1 }, .{ .expand = .horizontal }) or changed; + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "x:", .{}, .{}); + const T = @TypeOf(next.x); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.x, .min = @as(T, min_x), .max = @as(T, max_x) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "y:", .{}, .{}); + const T = @TypeOf(next.y); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.y, .min = @as(T, min_y), .max = @as(T, max_y) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } if (changed) { obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = next } }) catch {}; canvas.requestRedraw(); @@ -365,16 +379,38 @@ fn drawPropertyEditor(canvas: *Canvas, obj: *Document.Object, prop: *const Prope }, .angle => |angle| { var next = angle; - if (dvui.sliderEntry(@src(), "{d:0.2} rad", .{ .value = &next, .min = -std.math.pi * 2.0, .max = std.math.pi * 2.0, .interval = 0.01 }, .{ .expand = .horizontal })) { - obj.setProperty(canvas.document.allocator, .{ .data = .{ .angle = next } }) catch {}; - canvas.requestRedraw(); + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "deg:", .{}, .{}); + var degrees: f32 = next * 180.0 / std.math.pi; + const res = dvui.textEntryNumber(@src(), f32, .{ .value = °rees }, .{ .expand = .horizontal }); + subrow.deinit(); + if (res.changed) { + next = degrees * std.math.pi / 180.0; + obj.setProperty(canvas.document.allocator, .{ .data = .{ .angle = next } }) catch {}; + canvas.requestRedraw(); + } } }, .scale => |scale| { var next = scale; var changed = false; - changed = dvui.sliderEntry(@src(), "x: {d:0.2}", .{ .value = &next.scale_x, .min = 0.0, .max = 10.0, .interval = 0.01 }, .{ .expand = .horizontal }) or changed; - changed = dvui.sliderEntry(@src(), "y: {d:0.2}", .{ .value = &next.scale_y, .min = 0.0, .max = 10.0, .interval = 0.01 }, .{ .expand = .horizontal }) or changed; + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "x:", .{}, .{}); + const T = @TypeOf(next.scale_x); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.scale_x, .min = @as(T, 0.0), .max = @as(T, 10.0) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "y:", .{}, .{}); + const T = @TypeOf(next.scale_y); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.scale_y, .min = @as(T, 0.0), .max = @as(T, 10.0) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } if (changed) { obj.setProperty(canvas.document.allocator, .{ .data = .{ .scale = next } }) catch {}; canvas.requestRedraw(); @@ -405,8 +441,22 @@ fn drawPropertyEditor(canvas: *Canvas, obj: *Document.Object, prop: *const Prope var next = size; const doc = canvas.document; var changed = false; - changed = dvui.sliderEntry(@src(), "w: {d:0.2}", .{ .value = &next.w, .min = 0.0, .max = doc.size.w, .interval = 1.0 }, .{ .expand = .horizontal }) or changed; - changed = dvui.sliderEntry(@src(), "h: {d:0.2}", .{ .value = &next.h, .min = 0.0, .max = doc.size.h, .interval = 1.0 }, .{ .expand = .horizontal }) or changed; + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "w:", .{}, .{}); + const T = @TypeOf(next.w); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.w, .min = @as(T, 0.0), .max = @as(T, doc.size.w) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "h:", .{}, .{}); + const T = @TypeOf(next.h); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.h, .min = @as(T, 0.0), .max = @as(T, doc.size.h) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } if (changed) { obj.setProperty(canvas.document.allocator, .{ .data = .{ .size = next } }) catch {}; canvas.requestRedraw(); @@ -416,8 +466,22 @@ fn drawPropertyEditor(canvas: *Canvas, obj: *Document.Object, prop: *const Prope var next = radii; const doc = canvas.document; var changed = false; - changed = dvui.sliderEntry(@src(), "x: {d:0.2}", .{ .value = &next.x, .min = 0.0, .max = doc.size.w, .interval = 1.0 }, .{ .expand = .horizontal }) or changed; - changed = dvui.sliderEntry(@src(), "y: {d:0.2}", .{ .value = &next.y, .min = 0.0, .max = doc.size.h, .interval = 1.0 }, .{ .expand = .horizontal }) or changed; + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "x:", .{}, .{}); + const T = @TypeOf(next.x); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.x, .min = @as(T, 0.0), .max = @as(T, doc.size.w) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "y:", .{}, .{}); + const T = @TypeOf(next.y); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.y, .min = @as(T, 0.0), .max = @as(T, doc.size.h) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } if (changed) { obj.setProperty(canvas.document.allocator, .{ .data = .{ .radii = next } }) catch {}; canvas.requestRedraw(); @@ -431,8 +495,22 @@ fn drawPropertyEditor(canvas: *Canvas, obj: *Document.Object, prop: *const Prope const min_y = -doc.size.h; const max_y = doc.size.h; var changed = false; - changed = dvui.sliderEntry(@src(), "x: {d:0.2}", .{ .value = &next.x, .min = min_x, .max = max_x, .interval = 0.1 }, .{ .expand = .horizontal }) or changed; - changed = dvui.sliderEntry(@src(), "y: {d:0.2}", .{ .value = &next.y, .min = min_y, .max = max_y, .interval = 0.1 }, .{ .expand = .horizontal }) or changed; + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "x:", .{}, .{}); + const T = @TypeOf(next.x); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.x, .min = @as(T, min_x), .max = @as(T, max_x) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "y:", .{}, .{}); + const T = @TypeOf(next.y); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next.y, .min = @as(T, min_y), .max = @as(T, max_y) }, .{ .expand = .horizontal }); + subrow.deinit(); + changed = res.changed or changed; + } if (changed) { obj.setProperty(canvas.document.allocator, .{ .data = .{ .end_point = next } }) catch {}; canvas.requestRedraw(); @@ -449,9 +527,16 @@ fn drawPropertyEditor(canvas: *Canvas, obj: *Document.Object, prop: *const Prope }, .thickness => |t| { var next = t; - if (dvui.sliderEntry(@src(), "{d:0.2}", .{ .value = &next, .min = 0.0, .max = 100.0, .interval = 0.1 }, .{ .expand = .horizontal })) { - obj.setProperty(canvas.document.allocator, .{ .data = .{ .thickness = next } }) catch {}; - canvas.requestRedraw(); + { + var subrow = dvui.box(@src(), .{ .dir = .horizontal }, .{ .expand = .horizontal }); + dvui.labelNoFmt(@src(), "thickness:", .{}, .{}); + const T = @TypeOf(next); + const res = dvui.textEntryNumber(@src(), T, .{ .value = &next, .min = @as(T, 0.0), .max = @as(T, 100.0) }, .{ .expand = .horizontal }); + subrow.deinit(); + if (res.changed) { + obj.setProperty(canvas.document.allocator, .{ .data = .{ .thickness = next } }) catch {}; + canvas.requestRedraw(); + } } }, }