Зум к курсору
This commit is contained in:
@@ -99,15 +99,39 @@ fn handleCanvasZoom(canvas: *Canvas, scroll: anytype) void {
|
||||
const ctrl = dvui.currentWindow().modifiers.control();
|
||||
if (!ctrl) return;
|
||||
|
||||
const natural_scale = if (canvas.native_scaling) 1 else dvui.windowNaturalScale();
|
||||
|
||||
for (dvui.events()) |*e| {
|
||||
switch (e.evt) {
|
||||
.mouse => |mouse| {
|
||||
.mouse => |*mouse| {
|
||||
const action = mouse.action;
|
||||
if (dvui.eventMatchSimple(e, scroll.data()) and (action == .wheel_x or action == .wheel_y)) {
|
||||
switch (action) {
|
||||
.wheel_y => |y| {
|
||||
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,
|
||||
};
|
||||
const doc_pt = canvas.contentPointToDocument(content_pt, natural_scale);
|
||||
|
||||
canvas.addZoom(y / 1000);
|
||||
canvas.requestRedraw();
|
||||
|
||||
// Сдвигаем viewport так, чтобы точка под курсором (даже вне холста) не уезжала
|
||||
const new_zoom = canvas.getZoom();
|
||||
const img = canvas.getZoomedImageSize();
|
||||
const new_content_x = (@as(f32, @floatFromInt(img.x)) + doc_pt.x * new_zoom) / natural_scale;
|
||||
const new_content_y = (@as(f32, @floatFromInt(img.y)) + doc_pt.y * new_zoom) / natural_scale;
|
||||
canvas.scroll.viewport.x = new_content_x - viewport_pt.x;
|
||||
canvas.scroll.viewport.y = new_content_y - viewport_pt.y;
|
||||
const viewport_rect = scroll.data().contentRect();
|
||||
const content_w = @as(f32, @floatFromInt(img.x + img.w)) / natural_scale;
|
||||
const content_h = @as(f32, @floatFromInt(img.y + img.h)) / natural_scale;
|
||||
const max_x = @max(0, content_w - viewport_rect.w + canvas.pos.x);
|
||||
const max_y = @max(0, content_h - viewport_rect.h + canvas.pos.y);
|
||||
canvas.scroll.viewport.x = std.math.clamp(canvas.scroll.viewport.x, 0, max_x);
|
||||
canvas.scroll.viewport.y = std.math.clamp(canvas.scroll.viewport.y, 0, max_y);
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
@@ -133,7 +157,8 @@ fn handleCanvasMouse(canvas: *Canvas, scroll: anytype) void {
|
||||
.x = viewport_pt.x + canvas.scroll.viewport.x,
|
||||
.y = viewport_pt.y + canvas.scroll.viewport.y,
|
||||
};
|
||||
canvas.cursor_document_point = canvas.contentPointToDocument(content_pt, natural_scale);
|
||||
const doc_pt = canvas.contentPointToDocument(content_pt, natural_scale);
|
||||
canvas.cursor_document_point = if (canvas.isContentPointOnDocument(content_pt, natural_scale)) doc_pt else null;
|
||||
if (canvas.cursor_document_point) |point|
|
||||
std.debug.print("cursor_document_point: {}\n", .{point});
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user