-import { defineAsyncComponent, ref } from 'vue'
+import { ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { downloadFile } from '@/base/common/downloadUtil'
@@ -15,23 +15,15 @@ import LatentPreview from '@/renderer/extensions/linearMode/LatentPreview.vue'
import LinearWelcome from '@/renderer/extensions/linearMode/LinearWelcome.vue'
import LinearArrange from '@/renderer/extensions/linearMode/LinearArrange.vue'
import LinearFeedback from '@/renderer/extensions/linearMode/LinearFeedback.vue'
+import MediaOutputPreview from '@/renderer/extensions/linearMode/MediaOutputPreview.vue'
import OutputHistory from '@/renderer/extensions/linearMode/OutputHistory.vue'
import { useOutputHistory } from '@/renderer/extensions/linearMode/useOutputHistory'
import type { OutputSelection } from '@/renderer/extensions/linearMode/linearModeTypes'
-import VideoPreview from '@/renderer/extensions/linearMode/VideoPreview.vue'
-import { getMediaType } from '@/renderer/extensions/linearMode/mediaTypes'
import { app } from '@/scripts/app'
import { useCommandStore } from '@/stores/commandStore'
import { useExecutionStore } from '@/stores/executionStore'
import { useQueueStore } from '@/stores/queueStore'
import type { ResultItemImpl } from '@/stores/queueStore'
-import { collectAllNodes } from '@/utils/graphTraversalUtil'
-import { executeWidgetsCallback } from '@/utils/litegraphUtil'
-
-// Lazy-loaded to avoid pulling THREE.js into the main bundle
-const Preview3d = defineAsyncComponent(
- () => import('@/renderer/extensions/linearMode/Preview3d.vue')
-)
const { t } = useI18n()
const commandStore = useCommandStore()
@@ -73,17 +65,12 @@ async function loadWorkflow(item: AssetItem | undefined) {
const changeTracker = useWorkflowStore().activeWorkflow?.changeTracker
if (!changeTracker) return app.loadGraphData(workflow)
changeTracker.redoQueue = []
- changeTracker.updateState([workflow], changeTracker.undoQueue)
+ await changeTracker.updateState([workflow], changeTracker.undoQueue)
}
async function rerun(e: Event) {
if (!runButtonClick) return
await loadWorkflow(selectedItem.value)
- //FIXME don't use timeouts here
- //Currently seeds fail to properly update even with timeouts?
- await new Promise((r) => setTimeout(r, 500))
- executeWidgetsCallback(collectAllNodes(app.rootGraph), 'afterQueued')
-
runButtonClick(e)
}
@@ -106,6 +93,7 @@ async function rerun(e: Event) {
-
-
-
-
diff --git a/src/renderer/extensions/linearMode/MediaOutputPreview.vue b/src/renderer/extensions/linearMode/MediaOutputPreview.vue
new file mode 100644
index 0000000000..b1964224a7
--- /dev/null
+++ b/src/renderer/extensions/linearMode/MediaOutputPreview.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
diff --git a/src/scripts/ui/draggableList.ts b/src/scripts/ui/draggableList.ts
index 0a1fdb5a93..124f5a46a4 100644
--- a/src/scripts/ui/draggableList.ts
+++ b/src/scripts/ui/draggableList.ts
@@ -314,18 +314,22 @@ export class DraggableList extends EventTarget {
unsetDraggableItem() {
this.draggableItem.style = null
this.draggableItem.classList.remove('is-draggable')
- this.draggableItem.classList.add('is-idle')
this.draggableItem = null
}
unsetItemState() {
- this.getIdleItems().forEach((item) => {
- // @ts-expect-error fixme ts strict error
+ this.getIdleItems().forEach((item: HTMLElement) => {
delete item.dataset.isAbove
- // @ts-expect-error fixme ts strict error
delete item.dataset.isToggled
- // @ts-expect-error fixme ts strict error
item.style.transform = ''
+
+ // Defer re-adding is-idle (which enables CSS transitions) until after
+ // the browser paints items in their final positions. Without this,
+ // the transition animates the stale drag transform.
+ item.classList.remove('is-idle')
+ requestAnimationFrame(() => {
+ item.classList.add('is-idle')
+ })
})
}
diff --git a/src/views/LinearView.vue b/src/views/LinearView.vue
index 46894ea812..39ca218dc5 100644
--- a/src/views/LinearView.vue
+++ b/src/views/LinearView.vue
@@ -1,5 +1,6 @@