mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-04-23 03:00:31 -04:00
feat(ui): rework progress event handling
- Canvas manages its own progress socket event listeners and progress event data. - Remove cancellations listener jank. - Dip into low-level redux subscription API to watch for queue status changes, clearing the last "global" progress event when the queue has nothing in progress. Could also do this in a useEffect I guess. - Had to shuffle some things around to prevent circular imports, so there are a lot of tiny changes here.
This commit is contained in:
committed by
Kent Keirsey
parent
b08a66ecaf
commit
7db4d26837
@@ -4,7 +4,10 @@ import { CanvasModuleBase } from 'features/controlLayers/konva/CanvasModuleBase'
|
||||
import { getPrefixedId, loadImage } from 'features/controlLayers/konva/util';
|
||||
import { selectShowProgressOnCanvas } from 'features/controlLayers/store/canvasSettingsSlice';
|
||||
import Konva from 'konva';
|
||||
import { atom } from 'nanostores';
|
||||
import type { Logger } from 'roarr';
|
||||
import { selectCanvasQueueCounts } from 'services/api/endpoints/queue';
|
||||
import type { S } from 'services/api/types';
|
||||
|
||||
export class CanvasProgressImageModule extends CanvasModuleBase {
|
||||
readonly type = 'progress_image';
|
||||
@@ -23,7 +26,8 @@ export class CanvasProgressImageModule extends CanvasModuleBase {
|
||||
imageElement: HTMLImageElement | null = null;
|
||||
|
||||
subscriptions = new Set<() => void>();
|
||||
|
||||
$lastProgressEvent = atom<S['InvocationDenoiseProgressEvent'] | null>(null);
|
||||
hasActiveGeneration: boolean = false;
|
||||
mutex: Mutex = new Mutex();
|
||||
|
||||
constructor(manager: CanvasManager) {
|
||||
@@ -41,11 +45,50 @@ export class CanvasProgressImageModule extends CanvasModuleBase {
|
||||
image: null,
|
||||
};
|
||||
|
||||
this.subscriptions.add(this.manager.stateApi.$lastCanvasProgressEvent.listen(this.render));
|
||||
this.subscriptions.add(this.manager.stagingArea.$shouldShowStagedImage.listen(this.render));
|
||||
this.subscriptions.add(this.manager.stateApi.createStoreSubscription(selectShowProgressOnCanvas, this.render));
|
||||
this.subscriptions.add(this.setSocketEventListeners());
|
||||
this.subscriptions.add(
|
||||
this.manager.stateApi.createStoreSubscription(selectCanvasQueueCounts, ({ data }) => {
|
||||
if (data && (data.in_progress > 0 || data.pending > 0)) {
|
||||
this.hasActiveGeneration = true;
|
||||
} else {
|
||||
this.hasActiveGeneration = false;
|
||||
this.$lastProgressEvent.set(null);
|
||||
}
|
||||
})
|
||||
);
|
||||
this.subscriptions.add(this.$lastProgressEvent.listen(this.render));
|
||||
}
|
||||
|
||||
setSocketEventListeners = (): (() => void) => {
|
||||
const progressListener = (data: S['InvocationDenoiseProgressEvent']) => {
|
||||
if (data.destination !== 'canvas') {
|
||||
return;
|
||||
}
|
||||
if (!this.hasActiveGeneration) {
|
||||
return;
|
||||
}
|
||||
this.$lastProgressEvent.set(data);
|
||||
};
|
||||
|
||||
const clearProgress = () => {
|
||||
this.$lastProgressEvent.set(null);
|
||||
};
|
||||
|
||||
this.manager.socket.on('invocation_denoise_progress', progressListener);
|
||||
this.manager.socket.on('connect', clearProgress);
|
||||
this.manager.socket.on('connect_error', clearProgress);
|
||||
this.manager.socket.on('disconnect', clearProgress);
|
||||
|
||||
return () => {
|
||||
this.manager.socket.off('invocation_denoise_progress', progressListener);
|
||||
this.manager.socket.off('connect', clearProgress);
|
||||
this.manager.socket.off('connect_error', clearProgress);
|
||||
this.manager.socket.off('disconnect', clearProgress);
|
||||
};
|
||||
};
|
||||
|
||||
getNodes = () => {
|
||||
return [this.konva.group];
|
||||
};
|
||||
@@ -53,7 +96,7 @@ export class CanvasProgressImageModule extends CanvasModuleBase {
|
||||
render = async () => {
|
||||
const release = await this.mutex.acquire();
|
||||
|
||||
const event = this.manager.stateApi.$lastCanvasProgressEvent.get();
|
||||
const event = this.$lastProgressEvent.get();
|
||||
const showProgressOnCanvas = this.manager.stateApi.runSelector(selectShowProgressOnCanvas);
|
||||
|
||||
if (!event || !showProgressOnCanvas) {
|
||||
|
||||
Reference in New Issue
Block a user