Skip to content

Commit

Permalink
Make job history model multi-selection aware #1641
Browse files Browse the repository at this point in the history
  • Loading branch information
Acly committed Mar 6, 2025
1 parent 44d6155 commit ea37af2
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 25 deletions.
24 changes: 11 additions & 13 deletions ai_diffusion/jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from dataclasses import dataclass, fields, field
from datetime import datetime
from enum import Enum, Flag
from typing import Any, Deque, NamedTuple, TYPE_CHECKING
from typing import Any, NamedTuple, TYPE_CHECKING
from PyQt5.QtCore import QObject, pyqtSignal

from .image import Bounds, ImageCollection
Expand Down Expand Up @@ -133,14 +133,12 @@ class Item(NamedTuple):
result_used = pyqtSignal(Item)
result_discarded = pyqtSignal(Item)

_entries: Deque[Job]
_selection: Item | None = None
_previous_selection: Item | None = None
_memory_usage = 0 # in MB

def __init__(self):
super().__init__()
self._entries = deque()
self._entries: deque[Job] = deque()
self._selection: list[JobQueue.Item] = []
self._previous_selection: JobQueue.Item | None = None
self._memory_usage = 0 # in MB

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

def select(self, job_id: str, index: int):
self.selection = self.Item(job_id, index)
self.selection = [self.Item(job_id, index)]

def toggle_selection(self):
if self._selection is not None:
self._previous_selection = self._selection
self.selection = None
if self._selection:
self._previous_selection = self._selection[0]
self.selection = []
elif self._previous_selection is not None and self.has_item(self._previous_selection):
self.selection = self._previous_selection
self.selection = [self._previous_selection]

def _discard_job(self, job: Job):
self._entries.remove(job)
Expand Down Expand Up @@ -257,7 +255,7 @@ def selection(self):
return self._selection

@selection.setter
def selection(self, value: Item | None):
def selection(self, value: list[Item]):
if self._selection != value:
self._selection = value
self.selection_changed.emit()
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,7 @@ def _finish_job(self, job: Job, event: ClientEvent):

def update_preview(self):
if selection := self.jobs.selection:
self.show_preview(selection.job, selection.image)
self.show_preview(selection[0].job, selection[0].image)
else:
self.hide_preview()

Expand Down Expand Up @@ -651,7 +651,7 @@ def apply_generated_result(self, job_id: str, index: int):
if self._layer:
self._layer.remove()
self._layer = None
self.jobs.selection = None
self.jobs.selection = []
self.jobs.notify_used(job_id, index)

def apply_animation(self, job: Job):
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/ui/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ def toggle_preview():

def apply():
if model := root.model_for_active_document():
if model.workspace is Workspace.generation and model.jobs.selection is not None:
model.apply_generated_result(*model.jobs.selection)
if model.workspace is Workspace.generation and len(model.jobs.selection) > 0:
model.apply_generated_result(*model.jobs.selection[0])
elif model.workspace is Workspace.live:
model.live.apply_result()

Expand Down
11 changes: 3 additions & 8 deletions ai_diffusion/ui/generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ def _job_id(item: QListWidgetItem | None):
item = self.item(current)

if item_was_selected:
self._model.jobs.selection = None
self._model.jobs.selection = []
else:
self.update_apply_button() # selection may have moved

Expand All @@ -239,8 +239,7 @@ def update_selection(self):
cast(AnimatedListItem, item).stop_animation()
self.clearSelection()

selection = self._model.jobs.selection
if selection is not None:
for selection in self._model.jobs.selection:
item = self._find(selection)
if item is not None and not item.isSelected():
item.setSelected(True)
Expand Down Expand Up @@ -283,11 +282,7 @@ def update_image_thumbnail(self, id: JobQueue.Item):
item.setIcon(self._image_thumbnail(job, id.image))

def select_item(self):
items = self.selectedItems()
if len(items) > 0:
self._model.jobs.selection = self._item_data(items[0])
else:
self._model.jobs.selection = None
self._model.jobs.selection = [self._item_data(i) for i in self.selectedItems()]

def _toggle_selection(self):
self._model.jobs.toggle_selection()
Expand Down

0 comments on commit ea37af2

Please sign in to comment.