mirror of
https://github.com/slidevjs/rough-notation.git
synced 2026-01-14 09:44:21 +01:00
animation group
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
export const SVG_NS = 'http://www.w3.org/2000/svg';
|
export const SVG_NS = 'http://www.w3.org/2000/svg';
|
||||||
|
|
||||||
|
export const DEFAULT_ANIMATION_DURATION = 1000;
|
||||||
|
|
||||||
export interface Rect {
|
export interface Rect {
|
||||||
x: number;
|
x: number;
|
||||||
y: number;
|
y: number;
|
||||||
@@ -24,4 +26,9 @@ export interface RoughAnnotation {
|
|||||||
show(): void;
|
show(): void;
|
||||||
hide(): void;
|
hide(): void;
|
||||||
remove(): void;
|
remove(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RoughAnnotationGroup {
|
||||||
|
show(): void;
|
||||||
|
hide(): void;
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Rect, RoughAnnotationConfig, SVG_NS } from './model.js';
|
import { Rect, RoughAnnotationConfig, SVG_NS, DEFAULT_ANIMATION_DURATION } from './model.js';
|
||||||
import { ResolvedOptions, OpSet } from 'roughjs/bin/core';
|
import { ResolvedOptions, OpSet } from 'roughjs/bin/core';
|
||||||
import { line, rectangle, ellipse } from 'roughjs/bin/renderer';
|
import { line, rectangle, ellipse } from 'roughjs/bin/renderer';
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ const highlightOptions = JSON.parse(JSON.stringify(defaultOptions));
|
|||||||
highlightOptions.roughness = 3;
|
highlightOptions.roughness = 3;
|
||||||
highlightOptions.disableMultiStroke = true;
|
highlightOptions.disableMultiStroke = true;
|
||||||
|
|
||||||
export function renderAnnotation(svg: SVGSVGElement, rect: Rect, config: RoughAnnotationConfig) {
|
export function renderAnnotation(svg: SVGSVGElement, rect: Rect, config: RoughAnnotationConfig, animationGroupDelay: number) {
|
||||||
const opList: OpSet[] = [];
|
const opList: OpSet[] = [];
|
||||||
let strokeWidth = config.strokeWidth || 2;
|
let strokeWidth = config.strokeWidth || 2;
|
||||||
const padding = (config.padding === 0) ? 0 : (config.padding || 5);
|
const padding = (config.padding === 0) ? 0 : (config.padding || 5);
|
||||||
@@ -91,8 +91,8 @@ export function renderAnnotation(svg: SVGSVGElement, rect: Rect, config: RoughAn
|
|||||||
const lengths: number[] = [];
|
const lengths: number[] = [];
|
||||||
const pathElements: SVGPathElement[] = [];
|
const pathElements: SVGPathElement[] = [];
|
||||||
let totalLength = 0;
|
let totalLength = 0;
|
||||||
const totalDuration = config.animationDuration === 0 ? 0 : (config.animationDuration || 1000);
|
const totalDuration = config.animationDuration === 0 ? 0 : (config.animationDuration || DEFAULT_ANIMATION_DURATION);
|
||||||
const initialDelay = config.animationDelay === 0 ? 0 : (config.animationDelay || 0);
|
const initialDelay = (config.animationDelay === 0 ? 0 : (config.animationDelay || 0)) + (animationGroupDelay || 0);
|
||||||
|
|
||||||
for (const d of pathStrings) {
|
for (const d of pathStrings) {
|
||||||
const path = document.createElementNS(SVG_NS, 'path');
|
const path = document.createElementNS(SVG_NS, 'path');
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Rect, RoughAnnotationConfig, RoughAnnotation, SVG_NS } from './model.js';
|
import { Rect, RoughAnnotationConfig, RoughAnnotation, SVG_NS, RoughAnnotationGroup, DEFAULT_ANIMATION_DURATION } from './model.js';
|
||||||
import { renderAnnotation } from './render.js';
|
import { renderAnnotation } from './render.js';
|
||||||
import { ensureKeyframes } from './keyframes.js';
|
import { ensureKeyframes } from './keyframes.js';
|
||||||
|
|
||||||
@@ -12,6 +12,7 @@ class RoughAnnotationImpl implements RoughAnnotation {
|
|||||||
private _resizing = false;
|
private _resizing = false;
|
||||||
private _resizeObserver?: any; // ResizeObserver is not supported in typescript std lib yet
|
private _resizeObserver?: any; // ResizeObserver is not supported in typescript std lib yet
|
||||||
private _lastSize?: Rect;
|
private _lastSize?: Rect;
|
||||||
|
_animationGroupDelay = 0;
|
||||||
|
|
||||||
constructor(e: HTMLElement, config: RoughAnnotationConfig) {
|
constructor(e: HTMLElement, config: RoughAnnotationConfig) {
|
||||||
this._e = e;
|
this._e = e;
|
||||||
@@ -19,6 +20,10 @@ class RoughAnnotationImpl implements RoughAnnotation {
|
|||||||
this.attach();
|
this.attach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get config(): RoughAnnotationConfig {
|
||||||
|
return this._config;
|
||||||
|
}
|
||||||
|
|
||||||
private _resizeListener = () => {
|
private _resizeListener = () => {
|
||||||
if (!this._resizing) {
|
if (!this._resizing) {
|
||||||
this._resizing = true;
|
this._resizing = true;
|
||||||
@@ -151,7 +156,7 @@ class RoughAnnotationImpl implements RoughAnnotation {
|
|||||||
private render(svg: SVGSVGElement) {
|
private render(svg: SVGSVGElement) {
|
||||||
const rect = this.computeSize();
|
const rect = this.computeSize();
|
||||||
if (rect) {
|
if (rect) {
|
||||||
renderAnnotation(svg, rect, this._config);
|
renderAnnotation(svg, rect, this._config, this._animationGroupDelay);
|
||||||
this._lastSize = rect;
|
this._lastSize = rect;
|
||||||
this._state = 'showing';
|
this._state = 'showing';
|
||||||
}
|
}
|
||||||
@@ -179,4 +184,27 @@ class RoughAnnotationImpl implements RoughAnnotation {
|
|||||||
|
|
||||||
export function annotate(element: HTMLElement, config: RoughAnnotationConfig): RoughAnnotation {
|
export function annotate(element: HTMLElement, config: RoughAnnotationConfig): RoughAnnotation {
|
||||||
return new RoughAnnotationImpl(element, config);
|
return new RoughAnnotationImpl(element, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function annotationGroup(annotations: RoughAnnotation[]): RoughAnnotationGroup {
|
||||||
|
let delay = 0;
|
||||||
|
for (const a of annotations) {
|
||||||
|
const ai = a as RoughAnnotationImpl;
|
||||||
|
ai._animationGroupDelay = delay;
|
||||||
|
const duration = ai.config.animationDuration === 0 ? 0 : (ai.config.animationDuration || DEFAULT_ANIMATION_DURATION);
|
||||||
|
delay += duration;
|
||||||
|
}
|
||||||
|
const list = [...annotations];
|
||||||
|
return {
|
||||||
|
show() {
|
||||||
|
for (const a of list) {
|
||||||
|
a.show();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hide() {
|
||||||
|
for (const a of list) {
|
||||||
|
a.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user