mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-07 20:31:33 +08:00
eb185255a3
Fixes [BS-3349](https://linear.app/affine-design/issue/BS-3349/) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Improved edge scrolling during selection dragging for smoother and more responsive viewport navigation. - Dragging area and mouse position tracking now update reactively with viewport changes, ensuring more accurate selection and movement. - **Refactor** - Unified and clarified coordinate handling for dragging and mouse position, with clearer naming and separation between model and browser coordinates. - Simplified selection logic and removed unnecessary accumulated state for cleaner and more maintainable behavior. - Enhanced flexibility in coordinate conversion by allowing viewport transformations relative to arbitrary zoom and center. - Streamlined clipboard paste handling by simplifying mouse position extraction and adjusting attachment options. - **Bug Fixes** - Enhanced overlay and dragging area accuracy by updating position calculations and coordinate transformations. - Fixed paste operations to correctly handle mouse position without unnecessary coordinate conversions. - Corrected drag initiation positions in toolbar and shape dragging to align with viewport-relative coordinates. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import { DisposableGroup } from '@blocksuite/global/disposable';
|
|
import { noop } from '@blocksuite/global/utils';
|
|
import type { GfxController } from '@blocksuite/std/gfx';
|
|
import { startWith } from 'rxjs';
|
|
|
|
import type { RoughCanvas } from '../utils/rough/canvas';
|
|
import { Overlay } from './overlay';
|
|
|
|
export class ToolOverlay extends Overlay {
|
|
protected disposables = new DisposableGroup();
|
|
|
|
globalAlpha: number;
|
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
constructor(gfx: GfxController) {
|
|
super(gfx);
|
|
this.x = 0;
|
|
this.y = 0;
|
|
this.globalAlpha = 1;
|
|
this.gfx = gfx;
|
|
|
|
this.disposables.add(
|
|
this.gfx.viewport.viewportUpdated.pipe(startWith(null)).subscribe(() => {
|
|
// when viewport is updated, we should keep the overlay in the same position
|
|
// to get last mouse position and convert it to model coordinates
|
|
const pos = this.gfx.tool.lastMouseViewPos$.value;
|
|
const [x, y] = this.gfx.viewport.toModelCoord(pos.x, pos.y);
|
|
this.x = x;
|
|
this.y = y;
|
|
})
|
|
);
|
|
}
|
|
|
|
override dispose(): void {
|
|
this.disposables.dispose();
|
|
}
|
|
|
|
render(ctx: CanvasRenderingContext2D, rc: RoughCanvas): void {
|
|
noop([ctx, rc]);
|
|
}
|
|
}
|