@opendaw/studio-core 0.0.126 → 0.0.128
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AssetService.d.ts.map +1 -1
- package/dist/AssetService.js +7 -7
- package/dist/AudioConsolidation.d.ts.map +1 -1
- package/dist/AudioConsolidation.js +2 -2
- package/dist/EffectBox.d.ts +2 -2
- package/dist/EffectBox.d.ts.map +1 -1
- package/dist/EffectFactories.d.ts +20 -14
- package/dist/EffectFactories.d.ts.map +1 -1
- package/dist/EffectFactories.js +88 -20
- package/dist/EffectFactory.d.ts +1 -0
- package/dist/EffectFactory.d.ts.map +1 -1
- package/dist/Engine.d.ts +2 -1
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +2 -1
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineFacade.js +3 -0
- package/dist/EngineWorklet.d.ts +2 -1
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +11 -1
- package/dist/Mixer.d.ts.map +1 -1
- package/dist/Mixer.js +3 -2
- package/dist/OfflineEngineRenderer.d.ts.map +1 -1
- package/dist/OfflineEngineRenderer.js +41 -3
- package/dist/StudioPreferences.d.ts +1 -1
- package/dist/StudioSettings.d.ts +1 -1
- package/dist/StudioSettings.js +2 -2
- package/dist/capture/RecordAudio.d.ts.map +1 -1
- package/dist/capture/RecordAudio.js +48 -18
- package/dist/capture/RecordAutomation.d.ts.map +1 -1
- package/dist/capture/RecordAutomation.js +219 -198
- package/dist/capture/RecordMidi.d.ts.map +1 -1
- package/dist/capture/RecordMidi.js +1 -1
- package/dist/cloud/CloudBackupSamples.js +1 -1
- package/dist/dawproject/DawProjectExporter.js +1 -1
- package/dist/dawproject/DawProjectService.d.ts.map +1 -1
- package/dist/dawproject/DawProjectService.js +3 -16
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/midi/MidiDevices.d.ts.map +1 -1
- package/dist/midi/MidiDevices.js +8 -2
- package/dist/offline-engine.js +1 -1
- package/dist/offline-engine.js.map +3 -3
- package/dist/processors.js +37 -25
- package/dist/processors.js.map +4 -4
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +30 -5
- package/dist/project/Recovery.js +1 -1
- package/dist/project/migration/MigrateAudioClipBox.d.ts.map +1 -1
- package/dist/project/migration/MigrateAudioClipBox.js +7 -0
- package/dist/project/migration/MigrateAudioRegionBox.d.ts.map +1 -1
- package/dist/project/migration/MigrateAudioRegionBox.js +7 -0
- package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.js +1 -1
- package/dist/samples/SampleService.js +1 -1
- package/dist/samples/SampleStorage.d.ts.map +1 -1
- package/dist/samples/SampleStorage.js +1 -1
- package/dist/ui/clipboard/ClipboardManager.d.ts.map +1 -1
- package/dist/ui/clipboard/ClipboardManager.js +18 -4
- package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.d.ts.map +1 -1
- package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.js +8 -2
- package/dist/ui/clipboard/types/DevicesClipboardHandler.d.ts.map +1 -1
- package/dist/ui/clipboard/types/DevicesClipboardHandler.js +77 -10
- package/dist/ui/clipboard/types/DevicesClipboardHandler.test.d.ts +2 -0
- package/dist/ui/clipboard/types/DevicesClipboardHandler.test.d.ts.map +1 -0
- package/dist/ui/clipboard/types/DevicesClipboardHandler.test.js +1154 -0
- package/dist/ui/timeline/RegionClipResolver.d.ts.map +1 -1
- package/dist/ui/timeline/RegionClipResolver.js +21 -29
- package/dist/ui/timeline/TimeGrid.d.ts +2 -0
- package/dist/ui/timeline/TimeGrid.d.ts.map +1 -1
- package/dist/ui/timeline/TimeGrid.js +13 -1
- package/dist/workers-main.js +1 -1
- package/dist/workers-main.js.map +3 -3
- package/dist/ysync/YService.d.ts +6 -1
- package/dist/ysync/YService.d.ts.map +1 -1
- package/dist/ysync/YService.js +2 -2
- package/dist/ysync/YSync.d.ts.map +1 -1
- package/dist/ysync/YSync.js +1 -0
- package/package.json +15 -15
- package/dist/WavFile.d.ts +0 -7
- package/dist/WavFile.d.ts.map +0 -1
- package/dist/WavFile.js +0 -120
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,OAAO,EACP,IAAI,EAGJ,SAAS,EAIT,UAAU,EACV,eAAe,EACf,UAAU,EACV,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAa,QAAQ,EAA0B,MAAM,kBAAkB,CAAA;AAC9E,OAAO,
|
|
1
|
+
{"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
|
package/dist/project/Project.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Arrays, isDefined, panic, RuntimeNotifier, safeExecute, Terminator, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { BoxEditing, DeleteUpdate, NewUpdate } from "@opendaw/lib-box";
|
|
3
|
-
import { AudioFileBox, AudioRegionBox } from "@opendaw/studio-boxes";
|
|
4
|
-
import { AudioUnitBoxAdapter, BoxAdapters, DeviceBoxUtils, Devices, isVertexOfBox, ParameterFieldAdapters, ProjectSkeleton, RegionAdapters, RootBoxAdapter, TimelineBoxAdapter, UnionBoxTypes, UserEditingManager, VaryingTempoMap, VertexSelection } from "@opendaw/studio-adapters";
|
|
3
|
+
import { ApparatDeviceBox, AudioFileBox, AudioRegionBox, SpielwerkDeviceBox, WerkstattDeviceBox } from "@opendaw/studio-boxes";
|
|
4
|
+
import { AudioUnitBoxAdapter, BoxAdapters, DeviceBoxUtils, Devices, isVertexOfBox, ParameterFieldAdapters, ProjectSkeleton, RegionAdapters, RootBoxAdapter, ScriptCompiler, TimelineBoxAdapter, UnionBoxTypes, UserEditingManager, VaryingTempoMap, VertexSelection } from "@opendaw/studio-adapters";
|
|
5
5
|
import { LiveStreamReceiver } from "@opendaw/lib-fusion";
|
|
6
6
|
import { Mixer } from "../Mixer";
|
|
7
7
|
import { ProjectApi } from "./ProjectApi";
|
|
@@ -20,9 +20,9 @@ import { AudioUnitFreeze } from "../AudioUnitFreeze";
|
|
|
20
20
|
export class Project {
|
|
21
21
|
static new(env, options) {
|
|
22
22
|
const createDefaultUser = options?.noDefaultUser !== true;
|
|
23
|
-
const
|
|
23
|
+
const createOutputMaximizer = StudioPreferences.settings.engine["auto-create-output-maximizer"];
|
|
24
24
|
const { boxGraph, mandatoryBoxes } = ProjectSkeleton.empty({
|
|
25
|
-
|
|
25
|
+
createOutputMaximizer,
|
|
26
26
|
createDefaultUser
|
|
27
27
|
});
|
|
28
28
|
const project = new Project(env, boxGraph, mandatoryBoxes);
|
|
@@ -123,13 +123,38 @@ export class Project {
|
|
|
123
123
|
}
|
|
124
124
|
else if (update instanceof DeleteUpdate && update.name === AudioFileBox.ClassName) {
|
|
125
125
|
this.#unregisterSample(update.uuid);
|
|
126
|
-
this.#deleteUserCreatedSample(update.uuid);
|
|
126
|
+
this.#deleteUserCreatedSample(update.uuid).finally();
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
}));
|
|
130
130
|
}
|
|
131
131
|
startAudioWorklet(restart, options) {
|
|
132
132
|
console.debug(`start AudioWorklet`);
|
|
133
|
+
const audioContext = this.#env.audioWorklets.context;
|
|
134
|
+
const loadScript = (config, deviceBox) => ScriptCompiler.create(config).load(audioContext, deviceBox).catch(reason => console.warn(`Failed to load script device ${UUID.toString(deviceBox.address.uuid)}:`, reason));
|
|
135
|
+
for (const box of this.boxGraph.boxes()) {
|
|
136
|
+
if (box instanceof ApparatDeviceBox) {
|
|
137
|
+
loadScript({
|
|
138
|
+
headerTag: "apparat",
|
|
139
|
+
registryName: "apparatProcessors",
|
|
140
|
+
functionName: "apparat"
|
|
141
|
+
}, box).finally();
|
|
142
|
+
}
|
|
143
|
+
else if (box instanceof WerkstattDeviceBox) {
|
|
144
|
+
loadScript({
|
|
145
|
+
headerTag: "werkstatt",
|
|
146
|
+
registryName: "werkstattProcessors",
|
|
147
|
+
functionName: "werkstatt"
|
|
148
|
+
}, box).finally();
|
|
149
|
+
}
|
|
150
|
+
else if (box instanceof SpielwerkDeviceBox) {
|
|
151
|
+
loadScript({
|
|
152
|
+
headerTag: "spielwerk",
|
|
153
|
+
registryName: "spielwerkProcessors",
|
|
154
|
+
functionName: "spielwerk"
|
|
155
|
+
}, box).finally();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
133
158
|
const lifecycle = this.#terminator.spawn();
|
|
134
159
|
const worklet = lifecycle.own(this.#env.audioWorklets.createEngine({ project: this, options }));
|
|
135
160
|
const handler = async (event) => {
|
package/dist/project/Recovery.js
CHANGED
|
@@ -18,7 +18,7 @@ export class Recovery {
|
|
|
18
18
|
Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/uuid`)
|
|
19
19
|
.then(x => UUID.validateBytes(x)),
|
|
20
20
|
Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/project.od`)
|
|
21
|
-
.then(x => Project.
|
|
21
|
+
.then(x => Project.loadAnyVersion(this.#env, x.buffer)),
|
|
22
22
|
Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/meta.json`)
|
|
23
23
|
.then(x => JSON.parse(new TextDecoder().decode(x.buffer))),
|
|
24
24
|
Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/saved`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrateAudioClipBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioClipBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAC,YAAY,EAAsC,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAQtH,eAAO,MAAM,mBAAmB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,YAAY,KAAG,
|
|
1
|
+
{"version":3,"file":"MigrateAudioClipBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioClipBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAC,YAAY,EAAsC,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAQtH,eAAO,MAAM,mBAAmB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,YAAY,KAAG,IAgC1F,CAAA"}
|
|
@@ -5,6 +5,13 @@ import { TimeBase } from "@opendaw/lib-dsp";
|
|
|
5
5
|
import { AudioContentHelpers } from "../audio/AudioContentHelpers";
|
|
6
6
|
const isIntEncodedAsFloat = (v) => v > 0 && v < 1e-6 && Number.isFinite(v) && (v / 1.401298464324817e-45) % 1 === 0;
|
|
7
7
|
export const migrateAudioClipBox = (boxGraph, box) => {
|
|
8
|
+
if (box.file.targetVertex.isEmpty()) {
|
|
9
|
+
console.debug("Migrate 'AudioClipBox' remove clip without AudioFileBox");
|
|
10
|
+
boxGraph.beginTransaction();
|
|
11
|
+
box.delete();
|
|
12
|
+
boxGraph.endTransaction();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
8
15
|
if (box.events.isEmpty()) {
|
|
9
16
|
console.debug("Migrate 'AudioClipBox' to have a ValueEventCollectionBox");
|
|
10
17
|
boxGraph.beginTransaction();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrateAudioRegionBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioRegionBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAqC,cAAc,EAAE,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAWxH,eAAO,MAAM,qBAAqB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"MigrateAudioRegionBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioRegionBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAqC,cAAc,EAAE,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAWxH,eAAO,MAAM,qBAAqB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,KAAG,IAoD3G,CAAA"}
|
|
@@ -6,6 +6,13 @@ import { AudioContentHelpers } from "../audio/AudioContentHelpers";
|
|
|
6
6
|
const isIntEncodedAsFloat = (v) => v > 0 && v < 1e-6 && Number.isFinite(v) && (v / 1.401298464324817e-45) % 1 === 0;
|
|
7
7
|
const toSeconds = (property, bpm) => PPQN.pulsesToSeconds(property.getValue(), bpm);
|
|
8
8
|
export const migrateAudioRegionBox = (boxGraph, box, bpm) => {
|
|
9
|
+
if (box.file.targetVertex.isEmpty()) {
|
|
10
|
+
console.debug("Migrate 'AudioRegionBox' remove region without AudioFileBox");
|
|
11
|
+
boxGraph.beginTransaction();
|
|
12
|
+
box.delete();
|
|
13
|
+
boxGraph.endTransaction();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
9
16
|
const { duration, loopOffset, loopDuration, playback } = box;
|
|
10
17
|
if (isIntEncodedAsFloat(duration.getValue())
|
|
11
18
|
|| isIntEncodedAsFloat(loopOffset.getValue())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAGnD,qBAAa,aAAc,YAAW,SAAS;IAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,wCAAuC;IAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,2CAA0C;IAGlE,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAGD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IActC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAwCpF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/E,YAAY,IAAI,OAAO;CAC1B"}
|
|
@@ -12,7 +12,7 @@ import { network, Promises } from "@opendaw/lib-runtime";
|
|
|
12
12
|
import { Sample } from "@opendaw/studio-adapters";
|
|
13
13
|
import { base64Credentials, OpenDAWHeaders } from "../OpenDAWHeaders";
|
|
14
14
|
import { z } from "zod";
|
|
15
|
-
import { WavFile } from "
|
|
15
|
+
import { WavFile } from "@opendaw/lib-dsp";
|
|
16
16
|
// Standard openDAW samples (considered to be non-removable)
|
|
17
17
|
export class OpenSampleAPI {
|
|
18
18
|
static ApiRoot = "https://api.opendaw.studio/samples";
|
|
@@ -5,7 +5,7 @@ import { SamplePeaks } from "@opendaw/lib-fusion";
|
|
|
5
5
|
import { AudioFileBox } from "@opendaw/studio-boxes";
|
|
6
6
|
import { AssetService } from "../AssetService";
|
|
7
7
|
import { FilePickerAcceptTypes } from "../FilePickerAcceptTypes";
|
|
8
|
-
import { WavFile } from "
|
|
8
|
+
import { WavFile } from "@opendaw/lib-dsp";
|
|
9
9
|
import { Workers } from "../Workers";
|
|
10
10
|
import { SampleStorage } from "./SampleStorage";
|
|
11
11
|
import { OpenSampleAPI } from "./OpenSampleAPI";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SampleStorage.d.ts","sourceRoot":"","sources":["../../src/samples/SampleStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"SampleStorage.d.ts","sourceRoot":"","sources":["../../src/samples/SampleStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAE/D,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAEnD,yBAAiB,aAAa,CAAC;IAC3B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,WAAW,CAAC;QACnB,IAAI,EAAE,cAAc,CAAA;KACvB,CAAA;CACJ;AAED,qBAAa,aAAc,SAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC3H,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAe;IAGrC,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAED,IAAI,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,EAAE,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;CAgB5E"}
|
|
@@ -10,8 +10,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
import { ByteArrayInput, EmptyExec, Lazy, UUID } from "@opendaw/lib-std";
|
|
11
11
|
import { SamplePeaks } from "@opendaw/lib-fusion";
|
|
12
12
|
import { Workers } from "../Workers";
|
|
13
|
-
import { WavFile } from "../WavFile";
|
|
14
13
|
import { Storage } from "../Storage";
|
|
14
|
+
import { WavFile } from "@opendaw/lib-dsp";
|
|
15
15
|
export class SampleStorage extends Storage {
|
|
16
16
|
static Folder = "samples/v2";
|
|
17
17
|
static get() { return new SampleStorage(); }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClipboardManager.d.ts","sourceRoot":"","sources":["../../../src/ui/clipboard/ClipboardManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAA;AASzE,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACpD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CACjC,CAAA;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,cAAc;IACtD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IACxD,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IACjB,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IAChB,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CACrC;AAED,yBAAiB,gBAAgB,CAAC;IAC9B,KAAK,QAAQ,GAAG,cAAc,CAAA;IA0B9B,MAAM,CAAC,MAAM,OAAO,GAAI,CAAC,SAAS,QAAQ,EAAE,SAAS,WAAW,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,KAAG,
|
|
1
|
+
{"version":3,"file":"ClipboardManager.d.ts","sourceRoot":"","sources":["../../../src/ui/clipboard/ClipboardManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAA;AASzE,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACpD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CACjC,CAAA;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,cAAc;IACtD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IACxD,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IACjB,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IAChB,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CACrC;AAED,yBAAiB,gBAAgB,CAAC;IAC9B,KAAK,QAAQ,GAAG,cAAc,CAAA;IA0B9B,MAAM,CAAC,MAAM,OAAO,GAAI,CAAC,SAAS,QAAQ,EAAE,SAAS,WAAW,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,KAAG,YA4HhG,CAAA;;CACJ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Option, Terminable } from "@opendaw/lib-std";
|
|
2
|
-
import { Events, ReservedShortcuts } from "@opendaw/lib-dom";
|
|
2
|
+
import { Clipboard, Events, ReservedShortcuts } from "@opendaw/lib-dom";
|
|
3
3
|
import { ContextMenu } from "./ContextMenu";
|
|
4
4
|
import { MenuItem } from "../menu/MenuItems";
|
|
5
5
|
import { StudioPreferences } from "../../StudioPreferences";
|
|
@@ -40,7 +40,7 @@ export var ClipboardManager;
|
|
|
40
40
|
const noClient = { clientX: 0, clientY: 0 };
|
|
41
41
|
const writeEntry = (entry) => {
|
|
42
42
|
fallbackEntry = Option.wrap(entry);
|
|
43
|
-
|
|
43
|
+
Clipboard.writeText(encode(entry));
|
|
44
44
|
};
|
|
45
45
|
const performCopy = () => {
|
|
46
46
|
if (!handler.canCopy(noClient)) {
|
|
@@ -60,7 +60,7 @@ export var ClipboardManager;
|
|
|
60
60
|
};
|
|
61
61
|
const performPaste = async () => {
|
|
62
62
|
try {
|
|
63
|
-
const rawText = await
|
|
63
|
+
const rawText = await Clipboard.readText();
|
|
64
64
|
const text = Option.wrap(rawText);
|
|
65
65
|
const entry = text.flatMap(decode);
|
|
66
66
|
if (entry.nonEmpty()) {
|
|
@@ -88,6 +88,9 @@ export var ClipboardManager;
|
|
|
88
88
|
}
|
|
89
89
|
};
|
|
90
90
|
return Terminable.many(Events.subscribe(element, "copy", (event) => {
|
|
91
|
+
if (Events.isTextInput(document.activeElement)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
91
94
|
if (!handler.canCopy(noClient)) {
|
|
92
95
|
return;
|
|
93
96
|
}
|
|
@@ -99,6 +102,9 @@ export var ClipboardManager;
|
|
|
99
102
|
event.clipboardData?.setData("text/plain", encoded);
|
|
100
103
|
});
|
|
101
104
|
}), Events.subscribe(element, "cut", (event) => {
|
|
105
|
+
if (Events.isTextInput(document.activeElement)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
102
108
|
if (!handler.canCut(noClient)) {
|
|
103
109
|
return;
|
|
104
110
|
}
|
|
@@ -110,6 +116,9 @@ export var ClipboardManager;
|
|
|
110
116
|
event.clipboardData?.setData("text/plain", encoded);
|
|
111
117
|
});
|
|
112
118
|
}), Events.subscribe(document, "paste", (event) => {
|
|
119
|
+
if (Events.isTextInput(document.activeElement)) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
113
122
|
if (!element.contains(document.activeElement) && document.activeElement !== document.body) {
|
|
114
123
|
return;
|
|
115
124
|
}
|
|
@@ -120,6 +129,7 @@ export var ClipboardManager;
|
|
|
120
129
|
return;
|
|
121
130
|
}
|
|
122
131
|
event.preventDefault();
|
|
132
|
+
event.stopImmediatePropagation();
|
|
123
133
|
handler.paste(entry.unwrap());
|
|
124
134
|
}
|
|
125
135
|
else {
|
|
@@ -128,10 +138,14 @@ export var ClipboardManager;
|
|
|
128
138
|
return;
|
|
129
139
|
}
|
|
130
140
|
event.preventDefault();
|
|
141
|
+
event.stopImmediatePropagation();
|
|
131
142
|
handler.paste(entry);
|
|
132
143
|
});
|
|
133
144
|
}
|
|
134
145
|
}), Events.subscribe(document, "keydown", (event) => {
|
|
146
|
+
if (Events.isTextInput(document.activeElement)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
135
149
|
if (!element.contains(document.activeElement) && document.activeElement !== document.body) {
|
|
136
150
|
return;
|
|
137
151
|
}
|
|
@@ -156,7 +170,7 @@ export var ClipboardManager;
|
|
|
156
170
|
return;
|
|
157
171
|
}
|
|
158
172
|
const { client } = collector;
|
|
159
|
-
const text = await Option.async(
|
|
173
|
+
const text = await Option.async(Clipboard.readText());
|
|
160
174
|
const entry = text.flatMap(decode);
|
|
161
175
|
const canPaste = entry.map(entry => handler.canPaste(entry, client))
|
|
162
176
|
.unwrapOrElse(() => fallbackEntry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioUnitsClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/AudioUnitsClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,OAAO,EAAO,MAAM,EAAY,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAC1G,OAAO,EAAM,QAAQ,EAAa,MAAM,kBAAkB,CAAA;AAW1D,OAAO,EAAC,mBAAmB,EAAqB,cAAc,EAAE,WAAW,EAAC,MAAM,0BAA0B,CAAA;AAC5G,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,mBAAmB,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;AAMxD,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;QACvC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAA;QACtC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAA;KACrE,CAAA;IAaM,MAAM,aAAa,GAAI,yFAOG,OAAO,KAAG,gBAAgB,CAAC,mBAAmB,CAsE9E,CAAA;
|
|
1
|
+
{"version":3,"file":"AudioUnitsClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/AudioUnitsClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,OAAO,EAAO,MAAM,EAAY,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAC1G,OAAO,EAAM,QAAQ,EAAa,MAAM,kBAAkB,CAAA;AAW1D,OAAO,EAAC,mBAAmB,EAAqB,cAAc,EAAE,WAAW,EAAC,MAAM,0BAA0B,CAAA;AAC5G,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,mBAAmB,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;AAMxD,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;QACvC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAA;QACtC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAA;KACrE,CAAA;IAaM,MAAM,aAAa,GAAI,yFAOG,OAAO,KAAG,gBAAgB,CAAC,mBAAmB,CAsE9E,CAAA;CA+GJ"}
|
|
@@ -99,8 +99,8 @@ export var AudioUnitsClipboard;
|
|
|
99
99
|
if (isOutputPaste) {
|
|
100
100
|
// Split into two transactions to ensure deletion notifications fire
|
|
101
101
|
// before new boxes are created (avoids "already has input" conflict)
|
|
102
|
-
editing.modify(() => clearOutputContent(rootBoxAdapter)
|
|
103
|
-
editing.
|
|
102
|
+
editing.modify(() => clearOutputContent(rootBoxAdapter));
|
|
103
|
+
editing.append(() => pasteOutputContent(entry.data, boxGraph, rootBoxAdapter));
|
|
104
104
|
}
|
|
105
105
|
else {
|
|
106
106
|
editing.modify(() => {
|
|
@@ -138,6 +138,9 @@ export var AudioUnitsClipboard;
|
|
|
138
138
|
}
|
|
139
139
|
ClipboardUtils.deserializeBoxes(data, boxGraph, {
|
|
140
140
|
mapPointer: (pointer, address) => {
|
|
141
|
+
if (address.isEmpty()) {
|
|
142
|
+
return Option.None;
|
|
143
|
+
}
|
|
141
144
|
if (pointer.pointerType === Pointers.TrackCollection) {
|
|
142
145
|
return Option.wrap(outputBox.tracks.address);
|
|
143
146
|
}
|
|
@@ -169,6 +172,9 @@ export var AudioUnitsClipboard;
|
|
|
169
172
|
}
|
|
170
173
|
const boxes = ClipboardUtils.deserializeBoxes(data, boxGraph, {
|
|
171
174
|
mapPointer: (pointer, address) => {
|
|
175
|
+
if (address.isEmpty()) {
|
|
176
|
+
return Option.None;
|
|
177
|
+
}
|
|
172
178
|
if (pointer.pointerType === Pointers.AudioUnits) {
|
|
173
179
|
return Option.wrap(rootBox.audioUnits.address);
|
|
174
180
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevicesClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"DevicesClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,OAAO,EAKP,MAAM,EAEN,QAAQ,EAGX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAM,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAEH,WAAW,EACX,gBAAgB,EAEhB,UAAU,EAGV,iBAAiB,EAGpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;AAajD,yBAAiB,gBAAgB,CAAC;IAC9B,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QACvD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;QACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;KACjD,CAAA;IAyBM,MAAM,aAAa,GAAI,oEAOG,OAAO,KAAG,gBAAgB,CAAC,gBAAgB,CAwN3E,CAAA;CACJ"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { ByteArrayInput, ByteArrayOutput, isDefined, Option, RuntimeNotifier } from "@opendaw/lib-std";
|
|
1
|
+
import { ByteArrayInput, ByteArrayOutput, isDefined, isInstanceOf, isNotNull, Option, RuntimeNotifier } from "@opendaw/lib-std";
|
|
2
2
|
import { Pointers } from "@opendaw/studio-enums";
|
|
3
|
+
import { RootBox, TrackBox } from "@opendaw/studio-boxes";
|
|
3
4
|
import { DeviceBoxUtils, Devices } from "@opendaw/studio-adapters";
|
|
4
5
|
import { ClipboardUtils } from "../ClipboardUtils";
|
|
5
6
|
export var DevicesClipboard;
|
|
@@ -63,16 +64,51 @@ export var DevicesClipboard;
|
|
|
63
64
|
...midiEffects.map(adapter => adapter.box),
|
|
64
65
|
...audioEffects.map(adapter => adapter.box)
|
|
65
66
|
];
|
|
66
|
-
const dependencies = deviceBoxes.flatMap(box =>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
const dependencies = deviceBoxes.flatMap(box => {
|
|
68
|
+
const ownedChildren = box.incomingEdges()
|
|
69
|
+
.filter(pointer => pointer.mandatory && !pointer.box.ephemeral
|
|
70
|
+
&& !isDefined(pointer.box.resource))
|
|
71
|
+
.map(pointer => pointer.box);
|
|
72
|
+
const mandatoryDeps = Array.from(boxGraph.dependenciesOf(box, {
|
|
73
|
+
alwaysFollowMandatory: true,
|
|
74
|
+
excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
|
|
75
|
+
|| dep.name === RootBox.ClassName
|
|
76
|
+
}).boxes).filter(dep => !isDefined(dep.resource));
|
|
77
|
+
const preserved = [box, ...ownedChildren].flatMap(root => Array.from(boxGraph.dependenciesOf(root, {
|
|
78
|
+
alwaysFollowMandatory: true,
|
|
79
|
+
excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
|
|
80
|
+
}).boxes).filter(dep => dep.resource === "preserved"));
|
|
81
|
+
return [...ownedChildren, ...mandatoryDeps, ...preserved];
|
|
82
|
+
});
|
|
83
|
+
const trackContent = [];
|
|
84
|
+
if (isNotNull(instrument)) {
|
|
85
|
+
getHost().ifSome(host => {
|
|
86
|
+
const tracksField = host.audioUnitBoxAdapter().tracksField;
|
|
87
|
+
for (const pointer of tracksField.pointerHub.filter(Pointers.TrackCollection)) {
|
|
88
|
+
if (!isInstanceOf(pointer.box, TrackBox)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const track = pointer.box;
|
|
92
|
+
trackContent.push(track);
|
|
93
|
+
for (const regionPointer of track.regions.pointerHub.incoming()) {
|
|
94
|
+
trackContent.push(regionPointer.box);
|
|
95
|
+
const regionDeps = Array.from(boxGraph.dependenciesOf(regionPointer.box, {
|
|
96
|
+
alwaysFollowMandatory: true,
|
|
97
|
+
excludeBox: (dep) => dep.ephemeral
|
|
98
|
+
|| isInstanceOf(dep, TrackBox)
|
|
99
|
+
|| DeviceBoxUtils.isDeviceBox(dep)
|
|
100
|
+
}).boxes);
|
|
101
|
+
trackContent.push(...regionDeps);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const allBoxes = [...deviceBoxes, ...dependencies, ...trackContent];
|
|
107
|
+
const instrumentContent = isNotNull(instrument)
|
|
72
108
|
? instrument.box.tags.content ?? ""
|
|
73
109
|
: "";
|
|
74
110
|
const metadata = {
|
|
75
|
-
hasInstrument: instrument
|
|
111
|
+
hasInstrument: isNotNull(instrument),
|
|
76
112
|
instrumentContent,
|
|
77
113
|
midiEffectCount: midiEffects.length,
|
|
78
114
|
midiEffectMaxIndex,
|
|
@@ -142,6 +178,12 @@ export var DevicesClipboard;
|
|
|
142
178
|
editing.modify(() => {
|
|
143
179
|
selection.deselectAll();
|
|
144
180
|
if (replaceInstrument && isDefined(selectedInstrument)) {
|
|
181
|
+
const tracksField = host.audioUnitBoxAdapter().tracksField;
|
|
182
|
+
for (const pointer of tracksField.pointerHub.filter(Pointers.TrackCollection)) {
|
|
183
|
+
if (isInstanceOf(pointer.box, TrackBox)) {
|
|
184
|
+
pointer.box.delete();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
145
187
|
selectedInstrument.box.delete();
|
|
146
188
|
}
|
|
147
189
|
for (const adapter of host.midiEffects.adapters()) {
|
|
@@ -157,7 +199,10 @@ export var DevicesClipboard;
|
|
|
157
199
|
}
|
|
158
200
|
}
|
|
159
201
|
const boxes = ClipboardUtils.deserializeBoxes(entry.data, boxGraph, {
|
|
160
|
-
mapPointer: pointer => {
|
|
202
|
+
mapPointer: (pointer, address) => {
|
|
203
|
+
if (address.isEmpty()) {
|
|
204
|
+
return Option.None;
|
|
205
|
+
}
|
|
161
206
|
if (pointer.pointerType === Pointers.InstrumentHost && replaceInstrument) {
|
|
162
207
|
return Option.wrap(host.inputField.address);
|
|
163
208
|
}
|
|
@@ -167,9 +212,23 @@ export var DevicesClipboard;
|
|
|
167
212
|
if (pointer.pointerType === Pointers.AudioEffectHost) {
|
|
168
213
|
return Option.wrap(host.audioEffectsField.address);
|
|
169
214
|
}
|
|
215
|
+
if (pointer.pointerType === Pointers.TrackCollection && replaceInstrument) {
|
|
216
|
+
return Option.wrap(host.audioUnitBoxAdapter().tracksField.address);
|
|
217
|
+
}
|
|
218
|
+
if (pointer.pointerType === Pointers.Automation && replaceInstrument) {
|
|
219
|
+
return Option.wrap(host.audioUnitBoxAdapter().address);
|
|
220
|
+
}
|
|
221
|
+
if (pointer.pointerType === Pointers.MIDIDevice) {
|
|
222
|
+
const rootBox = boxGraph.boxes()
|
|
223
|
+
.find(box => isInstanceOf(box, RootBox));
|
|
224
|
+
if (isDefined(rootBox)) {
|
|
225
|
+
return Option.wrap(rootBox.outputMidiDevices.address);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
170
228
|
return Option.None;
|
|
171
229
|
},
|
|
172
|
-
excludeBox: box =>
|
|
230
|
+
excludeBox: box => !replaceInstrument
|
|
231
|
+
&& (DeviceBoxUtils.isInstrumentDeviceBox(box) || isInstanceOf(box, TrackBox))
|
|
173
232
|
});
|
|
174
233
|
const deviceBoxes = boxes.filter(box => DeviceBoxUtils.isDeviceBox(box));
|
|
175
234
|
const newMidiEffects = deviceBoxes
|
|
@@ -180,6 +239,14 @@ export var DevicesClipboard;
|
|
|
180
239
|
.sort((a, b) => a.index.getValue() - b.index.getValue());
|
|
181
240
|
newMidiEffects.forEach((box, idx) => box.index.setValue(midiInsertIndex + idx));
|
|
182
241
|
newAudioEffects.forEach((box, idx) => box.index.setValue(audioInsertIndex + idx));
|
|
242
|
+
if (replaceInstrument) {
|
|
243
|
+
const tracksField = host.audioUnitBoxAdapter().tracksField;
|
|
244
|
+
const allTracks = tracksField.pointerHub.filter(Pointers.TrackCollection)
|
|
245
|
+
.filter(pointer => isInstanceOf(pointer.box, TrackBox))
|
|
246
|
+
.map(pointer => pointer.box)
|
|
247
|
+
.sort((trackA, trackB) => trackA.index.getValue() - trackB.index.getValue());
|
|
248
|
+
allTracks.forEach((track, idx) => track.index.setValue(idx));
|
|
249
|
+
}
|
|
183
250
|
selection.select(...deviceBoxes.map(box => boxAdapters.adapterFor(box, Devices.isAny)));
|
|
184
251
|
});
|
|
185
252
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevicesClipboardHandler.test.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.test.ts"],"names":[],"mappings":""}
|