Skip to content

Commit ea37af2

Browse files
committed
Make job history model multi-selection aware #1641
1 parent 44d6155 commit ea37af2

File tree

4 files changed

+18
-25
lines changed

4 files changed

+18
-25
lines changed

ai_diffusion/jobs.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from dataclasses import dataclass, fields, field
44
from datetime import datetime
55
from enum import Enum, Flag
6-
from typing import Any, Deque, NamedTuple, TYPE_CHECKING
6+
from typing import Any, NamedTuple, TYPE_CHECKING
77
from PyQt5.QtCore import QObject, pyqtSignal
88

99
from .image import Bounds, ImageCollection
@@ -133,14 +133,12 @@ class Item(NamedTuple):
133133
result_used = pyqtSignal(Item)
134134
result_discarded = pyqtSignal(Item)
135135

136-
_entries: Deque[Job]
137-
_selection: Item | None = None
138-
_previous_selection: Item | None = None
139-
_memory_usage = 0 # in MB
140-
141136
def __init__(self):
142137
super().__init__()
143-
self._entries = deque()
138+
self._entries: deque[Job] = deque()
139+
self._selection: list[JobQueue.Item] = []
140+
self._previous_selection: JobQueue.Item | None = None
141+
self._memory_usage = 0 # in MB
144142

145143
def add(self, kind: JobKind, params: JobParams):
146144
return self.add_job(Job(None, kind, params))
@@ -202,14 +200,14 @@ def notify_used(self, job_id: str, index: int):
202200
self.result_used.emit(self.Item(job_id, index))
203201

204202
def select(self, job_id: str, index: int):
205-
self.selection = self.Item(job_id, index)
203+
self.selection = [self.Item(job_id, index)]
206204

207205
def toggle_selection(self):
208-
if self._selection is not None:
209-
self._previous_selection = self._selection
210-
self.selection = None
206+
if self._selection:
207+
self._previous_selection = self._selection[0]
208+
self.selection = []
211209
elif self._previous_selection is not None and self.has_item(self._previous_selection):
212-
self.selection = self._previous_selection
210+
self.selection = [self._previous_selection]
213211

214212
def _discard_job(self, job: Job):
215213
self._entries.remove(job)
@@ -257,7 +255,7 @@ def selection(self):
257255
return self._selection
258256

259257
@selection.setter
260-
def selection(self, value: Item | None):
258+
def selection(self, value: list[Item]):
261259
if self._selection != value:
262260
self._selection = value
263261
self.selection_changed.emit()

ai_diffusion/model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ def _finish_job(self, job: Job, event: ClientEvent):
527527

528528
def update_preview(self):
529529
if selection := self.jobs.selection:
530-
self.show_preview(selection.job, selection.image)
530+
self.show_preview(selection[0].job, selection[0].image)
531531
else:
532532
self.hide_preview()
533533

@@ -651,7 +651,7 @@ def apply_generated_result(self, job_id: str, index: int):
651651
if self._layer:
652652
self._layer.remove()
653653
self._layer = None
654-
self.jobs.selection = None
654+
self.jobs.selection = []
655655
self.jobs.notify_used(job_id, index)
656656

657657
def apply_animation(self, job: Job):

ai_diffusion/ui/actions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ def toggle_preview():
3636

3737
def apply():
3838
if model := root.model_for_active_document():
39-
if model.workspace is Workspace.generation and model.jobs.selection is not None:
40-
model.apply_generated_result(*model.jobs.selection)
39+
if model.workspace is Workspace.generation and len(model.jobs.selection) > 0:
40+
model.apply_generated_result(*model.jobs.selection[0])
4141
elif model.workspace is Workspace.live:
4242
model.live.apply_result()
4343

ai_diffusion/ui/generation.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def _job_id(item: QListWidgetItem | None):
221221
item = self.item(current)
222222

223223
if item_was_selected:
224-
self._model.jobs.selection = None
224+
self._model.jobs.selection = []
225225
else:
226226
self.update_apply_button() # selection may have moved
227227

@@ -239,8 +239,7 @@ def update_selection(self):
239239
cast(AnimatedListItem, item).stop_animation()
240240
self.clearSelection()
241241

242-
selection = self._model.jobs.selection
243-
if selection is not None:
242+
for selection in self._model.jobs.selection:
244243
item = self._find(selection)
245244
if item is not None and not item.isSelected():
246245
item.setSelected(True)
@@ -283,11 +282,7 @@ def update_image_thumbnail(self, id: JobQueue.Item):
283282
item.setIcon(self._image_thumbnail(job, id.image))
284283

285284
def select_item(self):
286-
items = self.selectedItems()
287-
if len(items) > 0:
288-
self._model.jobs.selection = self._item_data(items[0])
289-
else:
290-
self._model.jobs.selection = None
285+
self._model.jobs.selection = [self._item_data(i) for i in self.selectedItems()]
291286

292287
def _toggle_selection(self):
293288
self._model.jobs.toggle_selection()

0 commit comments

Comments
 (0)