export default function previewPanelDirective($interval: ng.IIntervalService, $timeout: ng.ITimeoutService) {
let animation = {editor: null, stage: 0, start: 0, stop: 0};
let prevContent = [];
const Range = ace.acequire('ace/range').Range;
const _clearSelection = (editor) => {
_.forEach(editor.session.getMarkers(false), (marker) => {
editor.session.removeMarker(marker.id);
});
};
/**
* Switch to next stage of animation.
*/
const _animate = () => {
animation.stage += animation.step;
const stage = animation.stage;
const editor = animation.editor;
_clearSelection(editor);
animation.selections.forEach((selection) => {
editor.session.addMarker(new Range(selection.start, 0, selection.stop, 0),
'preview-highlight-' + stage, 'line', false);
});
if (stage === animation.finalStage) {
editor.animatePromise = null;
if (animation.clearOnFinal)
_clearSelection(editor);
}
};
/**
* Selection with animation.
*
* @param editor Editor to show selection animation.
* @param selections Array of selection intervals.
* @param step Step of animation (1 or -1).
* @param stage Start stage of animation.
* @param finalStage Final stage of animation.
* @param clearOnFinal Boolean flat to clear selection on animation finish.
*/
const _fade = (editor, selections, step, stage, finalStage, clearOnFinal) => {
const promise = editor.animatePromise;
if (promise) {
$interval.cancel(promise);
_clearSelection(editor);
}
animation = {editor, selections, step, stage, finalStage, clearOnFinal};
editor.animatePromise = $interval(_animate, 100, 10, false);
};
/**
* Show selections with animation.
*
* @param editor Editor to show selection.
* @param selections Array of selection intervals.
*/
const _fadeIn = (editor, selections) => {
_fade(editor, selections, 1, 0, 10, false);
};
/**
* Hide selections with animation.
*
* @param editor Editor to show selection.
* @param selections Array of selection intervals.
*/
const _fadeOut = (editor, selections) => {
_fade(editor, selections, -1, 10, 0, true);
};
const onChange = ([content, editor]) => {
const {clearPromise} = editor;
const {lines} = content;
if (content.action === 'remove')
prevContent = lines;
else if (prevContent.length > 0 && lines.length > 0 && editor.attractAttention) {
if (clearPromise) {
$timeout.cancel(clearPromise);
_clearSelection(editor);
}
const selections = [];
let newIx = 0;
let prevIx = 0;
let prevLen = prevContent.length - (prevContent[prevContent.length - 1] === '' ? 1 : 0);
let newLen = lines.length - (lines[lines.length - 1] === '' ? 1 : 0);
//.........这里部分代码省略.........
请发表评论