From b6e14cd74dc9ed3e22693e38855100c58b814dd0 Mon Sep 17 00:00:00 2001 From: Roman Pytkov Date: Wed, 25 Feb 2026 23:59:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=81?= =?UTF-8?q?=D0=BA=D0=B2=D0=BE=D0=B7=D1=8C=20=D1=82=D1=83=D0=BB=D0=B1=D0=B0?= =?UTF-8?q?=D1=80=20=D0=BD=D0=B5=20=D0=BA=D0=BB=D0=B8=D0=BA=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0=20=D1=85=D0=BE=D0=BB=D1=81?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Canvas.zig | 2 ++ src/ui/canvas_view.zig | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/Canvas.zig b/src/Canvas.zig index 4915a7b..57c78c2 100644 --- a/src/Canvas.zig +++ b/src/Canvas.zig @@ -30,6 +30,8 @@ _redraw_pending: bool = false, _last_redraw_time_ms: i64 = 0, cursor_document_point: ?Point2_f = null, draw_document: bool = true, +/// Rect тулбара (из предыдущего кадра) для исключения кликов по нему из handleCanvasMouse. +toolbar_rect_scale: ?dvui.RectScale = null, pub fn init(allocator: std.mem.Allocator, document: *Document, engine: RenderEngine) Canvas { return .{ diff --git a/src/ui/canvas_view.zig b/src/ui/canvas_view.zig index 8672f1b..233c9f6 100644 --- a/src/ui/canvas_view.zig +++ b/src/ui/canvas_view.zig @@ -26,7 +26,25 @@ pub fn canvasView(canvas: *Canvas, content_rect_scale: dvui.RectScale) void { } scroll.deinit(); - drawToolbar(canvas); + // Тулбар поверх scroll + var toolbar_box = dvui.box( + @src(), + .{ .dir = .horizontal }, + .{ + .expand = .none, + .background = false, + .gravity_x = 0.0, + .gravity_y = 0.0, + .margin = dvui.Rect{ .x = 8, .y = 8 }, + }, + ); + { + drawToolbar(canvas); + } + // Сохраняем rect тулбара для следующего кадра — в handleCanvasMouse исключаем из него клики + canvas.toolbar_rect_scale = toolbar_box.data().contentRectScale(); + toolbar_box.deinit(); + dvui.label(@src(), "Canvas", .{}, .{ .gravity_x = 0.5, .gravity_y = 0.0 }); } overlay.deinit(); @@ -145,16 +163,25 @@ fn handleCanvasZoom(canvas: *Canvas, scroll: anytype) void { } } -fn handleCanvasMouse(canvas: *Canvas, scroll: anytype) void { +fn handleCanvasMouse(canvas: *Canvas, scroll: *dvui.ScrollAreaWidget) void { const natural_scale = if (canvas.native_scaling) 1 else dvui.windowNaturalScale(); + const scroll_data = scroll.data(); for (dvui.events()) |*e| { switch (e.evt) { .mouse => |*mouse| { if (mouse.action != .press or mouse.button != .left) continue; - if (!dvui.eventMatchSimple(e, scroll.data())) continue; + if (e.handled) continue; + if (!dvui.eventMatchSimple(e, scroll_data)) continue; - const viewport_pt = scroll.data().contentRectScale().pointFromPhysical(mouse.p); + // Не обрабатывать клик, если он попал в область тулбара (rect с предыдущего кадра). + if (canvas.toolbar_rect_scale) |trs| { + const pt = trs.pointFromPhysical(mouse.p); + const r = trs.r; + if (pt.x >= 0 and pt.x * trs.s < r.w and pt.y >= 0 and pt.y * trs.s < r.h) continue; + } + + const viewport_pt = scroll_data.contentRectScale().pointFromPhysical(mouse.p); const content_pt = dvui.Point{ .x = viewport_pt.x + canvas.scroll.viewport.x, .y = viewport_pt.y + canvas.scroll.viewport.y,