from collections import deque import cv2 class ImageManager(): def __init__(self, update_fn): super().__init__() self.update_fn = update_fn self.close() def undo(self): if len(self._undo_deque) == 0: return prev = self._undo_deque.pop() self._redo_deque.append(self._curr_image) self._curr_image = prev self.update_fn(self._curr_image) def redo(self): if len(self._redo_deque) == 0: return latter = self._redo_deque.pop() self._undo_deque.append(self._curr_image) self._curr_image = latter self.update_fn(self._curr_image) def update(self, new_image): self._undo_deque.append(self._curr_image) self._redo_deque = deque() self._curr_image = new_image.copy() self.update_fn(self._curr_image) def open(self, file_name): self.close() self._curr_image = cv2.imread(file_name) self._curr_image = cv2.cvtColor(self._curr_image, cv2.COLOR_BGR2RGB) self.update_fn(self._curr_image) def close(self): self._undo_deque = deque() self._redo_deque = deque() self._curr_image = None def save(self, file_name): if self._curr_image is not None: cv2.imwrite(file_name, cv2.cvtColor(self._curr_image, cv2.COLOR_RGB2BGR)) def refresh(self): self.update_fn(self._curr_image) def image(self): return self._curr_image def can_redo(self): return len(self._redo_deque) > 0 def can_undo(self): return len(self._undo_deque) > 0