-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClipboard.js.html
237 lines (194 loc) · 11.5 KB
/
Clipboard.js.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: Clipboard.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: Clipboard.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/*
* Copyright 2020 WICKLETS LLC
*
* This file is part of Wick Engine.
*
* Wick Engine is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Wick Engine is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Wick Engine. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* A clipboard utility class for copy/paste functionality.
*/
Wick.Clipboard = class {
static get LOCALSTORAGE_KEY () {
return 'wick_engine_clipboard';
}
static get PASTE_OFFSET () {
// how many pixels should we shift objects over when we paste (canvas only)
return 20;
}
/**
* Create a new Clipboard object.
*/
constructor () {
this._copyLocation = null;
this._copyLayerIndex = 0;
this._originalObjects = [];
}
/**
* The data of copied objects, stored as JSON.
* @type {Object}
*/
get clipboardData () {
var json = localStorage[Wick.Clipboard.LOCALSTORAGE_KEY];
if(!json) return null;
return JSON.parse(json);
}
set clipboardData (clipboardData) {
localStorage[Wick.Clipboard.LOCALSTORAGE_KEY] = JSON.stringify(clipboardData);
}
/**
* Replace the current contents of the clipboard with new objects.
* @param {Wick.Base[]} objects - the objects to copy to the clipboard
*/
copyObjectsToClipboard (project, objects) {
if(!project || (!project instanceof Wick.Project)) console.error('copyObjectsToClipboard(): project is required');
// Get the playhead position of the "first" frame in the list of objects
var playheadCopyOffset = null;
objects.filter(object => {
return object instanceof Wick.Frame;
}).forEach(frame => {
if(playheadCopyOffset === null || frame.start < playheadCopyOffset) {
playheadCopyOffset = frame.start;
}
});
// Keep track of where objects were originally copied from
this._copyLocation = project.activeFrame && project.activeFrame.uuid;
// Keep track of the topmost layer of the selection (we use this later to position frames)
this._copyLayerIndex = Infinity;
objects.filter(object => {
return (object instanceof Wick.Frame)
|| (object instanceof Wick.Tween);
}).map(frame => {
return frame.parentLayer.index;
}).forEach(i => {
this._copyLayerIndex = Math.min(this._copyLayerIndex, i);
});
// Make deep copies of every object
var exportedData = objects.map(object => {
return object.export();
});
// Save references to the original objects
this._originalObjects = objects.map(object => {
return object;
});
// Shift frames and tweens so that they copy from the relative position of the first frame
var startPlayheadPosition = Number.MAX_SAFE_INTEGER;
exportedData.forEach(data => {
if(data.object.classname === 'Frame') {
if(data.object.start < startPlayheadPosition) {
startPlayheadPosition = data.object.start;
}
}
if(data.object.classname === 'Tween') {
if(data.object.playheadPosition < startPlayheadPosition) {
startPlayheadPosition = data.object.playheadPosition;
}
}
});
exportedData.forEach(data => {
if(data.object.classname === 'Frame') {
data.object.start -= startPlayheadPosition - 1;
data.object.end -= startPlayheadPosition - 1;
}
if(data.object.classname === 'Tween') {
data.object.playheadPosition -= startPlayheadPosition - 1;
}
});
// Set the new clipboard data
this.clipboardData = exportedData;
}
/**
* Paste the content of the clipboard into the project.
* @param {Wick.Project} project - the project to paste objects into.
* @returns {boolean} True if there is something to paste in the clipboard, false if the clipboard is empty.
*/
pasteObjectsFromClipboard (project) {
if(!project || (!project instanceof Wick.Project)) console.error('pasteObjectsFromClipboard(): project is required');
if(!this.clipboardData) {
return false;
}
// Prevent crash when pasting into an empty space
if(!project.activeFrame) {
project.insertBlankFrame();
}
// Always paste in-place if the original objects are no longer visible
var pasteInPlace = true;
this._originalObjects.forEach(origObj => {
if(origObj.parentFrame && origObj.parentFrame.onScreen) {
pasteInPlace = false;
}
});
// Use this value later to position frames on the corrent pasted layer
var layerIndicesMoved = project.activeLayer.index - this._copyLayerIndex;
project.selection.clear();
this.clipboardData.map(data => {
return Wick.Base.import(data, project).copy();
}).forEach(object => {
// Paste frames at the position of the playhead
if(object instanceof Wick.Frame) {
object._originalLayerIndex += layerIndicesMoved;
object.start += project.focus.timeline.playheadPosition - 1;
object.end += project.focus.timeline.playheadPosition - 1;
}
// Paste tweens at the position of the playhead
if(object instanceof Wick.Tween) {
object._originalLayerIndex += layerIndicesMoved;
object.playheadPosition += project.focus.timeline.playheadPosition - 1;
}
project.addObject(object);
object.identifier = object._getUniqueIdentifier(object.identifier);
// Add offset to Paths and Clips if pasteInPlace is NOT enabled.
if(!pasteInPlace && (object instanceof Wick.Path || object instanceof Wick.Clip)) {
object.view.render();//This render call updates the json, I think... so without this call the path loses its data somehow :(
object.x += Wick.Clipboard.PASTE_OFFSET;
object.y += Wick.Clipboard.PASTE_OFFSET;
}
project.selection.select(object);
});
return true;
}
}
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="BuiltinAssets.html">BuiltinAssets</a></li><li><a href="GlobalAPI.html">GlobalAPI</a></li><li><a href="paper.SelectionGUI.html">SelectionGUI</a></li><li><a href="paper-paper.Selection.html">Selection</a></li><li><a href="SelectionWidget.html">SelectionWidget</a></li><li><a href="Wick.AutoSave.html">AutoSave</a></li><li><a href="Wick.Base.html">Base</a></li><li><a href="Wick.Button.html">Button</a></li><li><a href="Wick.Clip.html">Clip</a></li><li><a href="Wick.Clipboard.html">Clipboard</a></li><li><a href="Wick.FileCache.html">FileCache</a></li><li><a href="Wick.Frame.html">Frame</a></li><li><a href="Wick.GUIElement.Project.html">Project</a></li><li><a href="Wick.GUIElement.Timeline.html">Timeline</a></li><li><a href="Wick.GUIElement-Wick.GUIElement.Breadcrumbs.html">Breadcrumbs</a></li><li><a href="Wick.GUIElement-Wick.GUIElement.Button.html">Button</a></li><li><a href="Wick.History.html">History</a></li><li><a href="Wick.HTMLExport.html">HTMLExport</a></li><li><a href="Wick.HTMLPreview.html">HTMLPreview</a></li><li><a href="Wick.ImageSequence.html">ImageSequence</a></li><li><a href="Wick.Layer.html">Layer</a></li><li><a href="Wick.Path.html">Path</a></li><li><a href="Wick.Project.html">Project</a></li><li><a href="Wick.Selection.html">Selection</a></li><li><a href="Wick.Tickable.html">Tickable</a></li><li><a href="Wick.Timeline.html">Timeline</a></li><li><a href="Wick.Tools-Wick.Tools.Brush.html">Brush</a></li><li><a href="Wick.Tools-Wick.Tools.Cursor.html">Cursor</a></li><li><a href="Wick.Tools-Wick.Tools.Ellipse.html">Ellipse</a></li><li><a href="Wick.Tools-Wick.Tools.Eraser.html">Eraser</a></li><li><a href="Wick.Tools-Wick.Tools.Eyedropper.html">Eyedropper</a></li><li><a href="Wick.Tools-Wick.Tools.FillBucket.html">FillBucket</a></li><li><a href="Wick.Tools-Wick.Tools.Interact.html">Interact</a></li><li><a href="Wick.Tools-Wick.Tools.Line.html">Line</a></li><li><a href="Wick.Tools-Wick.Tools.None.html">None</a></li><li><a href="Wick.Tools-Wick.Tools.Pan.html">Pan</a></li><li><a href="Wick.Tools-Wick.Tools.Pencil.html">Pencil</a></li><li><a href="Wick.Tools-Wick.Tools.Rectangle.html">Rectangle</a></li><li><a href="Wick.Tools-Wick.Tools.Text.html">Text</a></li><li><a href="Wick.Tools-Wick.Tools.Zoom.html">Zoom</a></li><li><a href="Wick.Transformation.html">Transformation</a></li><li><a href="Wick.Tween.html">Tween</a></li><li><a href="Wick.View-Wick.View.Clip.html">Clip</a></li><li><a href="Wick.View-Wick.View.Frame.html">Frame</a></li><li><a href="Wick.View-Wick.View.Path.html">Path</a></li><li><a href="Wick.View-Wick.View.Selection.html">Selection</a></li><li><a href="Wick.WickFile.html">WickFile</a></li><li><a href="Wick.WickObjectFile.html">WickObjectFile</a></li><li><a href="Wick.ZIPExport.html">ZIPExport</a></li><li><a href="WickObjectCache.html">WickObjectCache</a></li><li><a href="Wick-Wick.Asset.html">Asset</a></li><li><a href="Wick-Wick.AudioTrack.html">AudioTrack</a></li><li><a href="Wick-Wick.ClipAsset.html">ClipAsset</a></li><li><a href="Wick-Wick.Color.html">Color</a></li><li><a href="Wick-Wick.FileAsset.html">FileAsset</a></li><li><a href="Wick-Wick.FontAsset.html">FontAsset</a></li><li><a href="Wick-Wick.GIFAsset.html">GIFAsset</a></li><li><a href="Wick-Wick.GUIElement.html">GUIElement</a></li><li><a href="Wick-Wick.ImageAsset.html">ImageAsset</a></li><li><a href="Wick-Wick.SoundAsset.html">SoundAsset</a></li><li><a href="Wick-Wick.SVGAsset.html">SVGAsset</a></li><li><a href="Wick-Wick.Tool.html">Tool</a></li><li><a href="Wick-Wick.ToolSettings.html">ToolSettings</a></li><li><a href="Wick-Wick.View.html">View</a></li></ul><h3>Global</h3><ul><li><a href="global.html#type">type</a></li><li><a href="global.html#Wick">Wick</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.4</a> on Fri Apr 24 2020 15:26:12 GMT-0400 (Eastern Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>