radames commited on
Commit
b2fc3c0
1 Parent(s): 8f150bf

wait render and clean mask

Browse files
frontend/src/lib/App.svelte CHANGED
@@ -10,7 +10,13 @@
10
  import { PUBLIC_WS_INPAINTING } from '$env/static/public';
11
  import type { PromptImgKey } from '$lib/types';
12
  import { Status } from '$lib/types';
13
- import { loadingState, currZoomTransform, maskEl, selectedRoomID } from '$lib/store';
 
 
 
 
 
 
14
  import { useMyPresence, useObject, useOthers } from '$lib/liveblocks';
15
  import { base64ToBlob, uploadImage } from '$lib/utils';
16
  import { nanoid } from 'nanoid';
@@ -26,7 +32,7 @@
26
 
27
  let showModal = false;
28
 
29
- $: isLoading = $myPresence?.status === Status.loading || false;
30
 
31
  function onPrompt() {
32
  if (!isLoading && !showModal) {
 
10
  import { PUBLIC_WS_INPAINTING } from '$env/static/public';
11
  import type { PromptImgKey } from '$lib/types';
12
  import { Status } from '$lib/types';
13
+ import {
14
+ loadingState,
15
+ currZoomTransform,
16
+ maskEl,
17
+ selectedRoomID,
18
+ isRenderingCanvas
19
+ } from '$lib/store';
20
  import { useMyPresence, useObject, useOthers } from '$lib/liveblocks';
21
  import { base64ToBlob, uploadImage } from '$lib/utils';
22
  import { nanoid } from 'nanoid';
 
32
 
33
  let showModal = false;
34
 
35
+ $: isLoading = $myPresence?.status === Status.loading || $isRenderingCanvas || false;
36
 
37
  function onPrompt() {
38
  if (!isLoading && !showModal) {
frontend/src/lib/Buttons/RoomsSelector.svelte CHANGED
@@ -59,7 +59,7 @@
59
  <People />
60
  <span> players </span>
61
  </li>
62
- {#each $rooms as room, i}
63
  <li>
64
  <!-- svelte-ignore a11y-invalid-attribute -->
65
  <a
@@ -73,7 +73,7 @@
73
  <Pin />
74
  {/if}
75
  </span>
76
- <span>room {room.room_id.split('-')[3]} </span>
77
  <span />
78
  <span />
79
  <span>{room.users_count} / {MAX_CAPACITY}</span>
@@ -93,7 +93,7 @@
93
  <div class="grid-row gap-2">
94
  <Room />
95
  <span>
96
- room {selectedRoom?.room_id.split('-')[3]}
97
  </span>
98
  <span />
99
  <People />
 
59
  <People />
60
  <span> players </span>
61
  </li>
62
+ {#each $rooms as room}
63
  <li>
64
  <!-- svelte-ignore a11y-invalid-attribute -->
65
  <a
 
73
  <Pin />
74
  {/if}
75
  </span>
76
+ <span>{room.room_id} </span>
77
  <span />
78
  <span />
79
  <span>{room.users_count} / {MAX_CAPACITY}</span>
 
93
  <div class="grid-row gap-2">
94
  <Room />
95
  <span>
96
+ {selectedRoom?.room_id}
97
  </span>
98
  <span />
99
  <People />
frontend/src/lib/PaintCanvas.svelte CHANGED
@@ -4,7 +4,7 @@
4
  import { select } from 'd3-selection';
5
  import { onMount } from 'svelte';
6
  import { PUBLIC_UPLOADS } from '$env/static/public';
7
- import { currZoomTransform, canvasEl } from '$lib/store';
8
 
9
  import { useMyPresence, useObject } from '$lib/liveblocks';
10
  import type { PromptImgObject } from '$lib/types';
@@ -138,10 +138,11 @@
138
  id: string;
139
  };
140
  function renderImages(promptImgList: PromptImgObject[]) {
141
- Promise.all(
 
142
  promptImgList.map(
143
  ({ imgURL, position, id }) =>
144
- new Promise<ImageRendered>((resolve) => {
145
  const img = new Image();
146
  img.crossOrigin = 'anonymous';
147
  img.onload = () => {
@@ -149,16 +150,23 @@
149
  canvasCtx.drawImage(img, position.x, position.y, img.width, img.height);
150
  resolve(res);
151
  };
 
 
 
152
  img.src = `${PUBLIC_UPLOADS}/${imgURL}`;
153
  })
154
  )
155
- ).then((images) => {
 
 
 
156
  images.forEach(({ img, position, id }) => {
157
  // keep track of images already rendered
158
  //re draw in order
159
  imagesOnCanvas.add(id);
160
  canvasCtx.drawImage(img, position.x, position.y, img.width, img.height);
161
  });
 
162
  });
163
  }
164
  function zoomed(e: Event) {
 
4
  import { select } from 'd3-selection';
5
  import { onMount } from 'svelte';
6
  import { PUBLIC_UPLOADS } from '$env/static/public';
7
+ import { currZoomTransform, canvasEl, isRenderingCanvas } from '$lib/store';
8
 
9
  import { useMyPresence, useObject } from '$lib/liveblocks';
10
  import type { PromptImgObject } from '$lib/types';
 
138
  id: string;
139
  };
140
  function renderImages(promptImgList: PromptImgObject[]) {
141
+ $isRenderingCanvas = true;
142
+ Promise.allSettled(
143
  promptImgList.map(
144
  ({ imgURL, position, id }) =>
145
+ new Promise<ImageRendered>((resolve, reject) => {
146
  const img = new Image();
147
  img.crossOrigin = 'anonymous';
148
  img.onload = () => {
 
150
  canvasCtx.drawImage(img, position.x, position.y, img.width, img.height);
151
  resolve(res);
152
  };
153
+ img.onerror = (err) => {
154
+ reject(err);
155
+ };
156
  img.src = `${PUBLIC_UPLOADS}/${imgURL}`;
157
  })
158
  )
159
+ ).then((values) => {
160
+ const images = values
161
+ .filter((v) => v.status === 'fulfilled')
162
+ .map((v) => (v as PromiseFulfilledResult<ImageRendered>).value);
163
  images.forEach(({ img, position, id }) => {
164
  // keep track of images already rendered
165
  //re draw in order
166
  imagesOnCanvas.add(id);
167
  canvasCtx.drawImage(img, position.x, position.y, img.width, img.height);
168
  });
169
+ $isRenderingCanvas = false;
170
  });
171
  }
172
  function zoomed(e: Event) {
frontend/src/lib/PaintFrame.svelte CHANGED
@@ -10,7 +10,7 @@
10
  import { onMount, createEventDispatcher } from 'svelte';
11
 
12
  import { useMyPresence } from '$lib/liveblocks';
13
- import { canvasEl, maskEl, loadingState } from '$lib/store';
14
 
15
  import { Status } from './types';
16
  const myPresence = useMyPresence({ addToHistory: true });
@@ -42,6 +42,9 @@
42
  x: transform.applyX(position.x),
43
  y: transform.applyY(position.y)
44
  };
 
 
 
45
 
46
  $: if ($loadingState === 'Complete' && !dragEnabled) {
47
  cleanMask();
@@ -293,7 +296,8 @@
293
  <div
294
  bind:this={frameElement}
295
  class="absolute top-0 left-0 ring-8 hand
296
- {dragEnabled ? 'block cursor-move' : 'hidden cursor-pointer'}"
 
297
  style={`width: ${FRAME_SIZE}px;height: ${FRAME_SIZE}px;transform: translateX(${coord.x}px) translateY(${coord.y}px) scale(${transform.k}); transform-origin: 0 0;`}
298
  />
299
  </div>
 
10
  import { onMount, createEventDispatcher } from 'svelte';
11
 
12
  import { useMyPresence } from '$lib/liveblocks';
13
+ import { canvasEl, maskEl, loadingState, isRenderingCanvas } from '$lib/store';
14
 
15
  import { Status } from './types';
16
  const myPresence = useMyPresence({ addToHistory: true });
 
42
  x: transform.applyX(position.x),
43
  y: transform.applyY(position.y)
44
  };
45
+ $: if (!$isRenderingCanvas) {
46
+ cleanMask();
47
+ }
48
 
49
  $: if ($loadingState === 'Complete' && !dragEnabled) {
50
  cleanMask();
 
296
  <div
297
  bind:this={frameElement}
298
  class="absolute top-0 left-0 ring-8 hand
299
+ {dragEnabled ? 'block' : 'hidden'}
300
+ {isLoading ? 'cursor-wait' : dragEnabled ? 'block cursor-move' : 'hidden cursor-pointer'}"
301
  style={`width: ${FRAME_SIZE}px;height: ${FRAME_SIZE}px;transform: translateX(${coord.x}px) translateY(${coord.y}px) scale(${transform.k}); transform-origin: 0 0;`}
302
  />
303
  </div>
frontend/src/lib/store.ts CHANGED
@@ -6,4 +6,5 @@ export const currZoomTransform = writable<ZoomTransform>(zoomIdentity);
6
  export const canvasEl = writable<HTMLCanvasElement>();
7
  export const maskEl = writable<HTMLCanvasElement>();
8
  export const selectedRoomID = writable<string | null>();
9
- export const toggleAbout = writable<boolean>(false);
 
 
6
  export const canvasEl = writable<HTMLCanvasElement>();
7
  export const maskEl = writable<HTMLCanvasElement>();
8
  export const selectedRoomID = writable<string | null>();
9
+ export const toggleAbout = writable<boolean>(false);
10
+ export const isRenderingCanvas = writable<boolean>(true);