studia/jezyki-skryptowe/image-editor/editor/ImageManager.py

60 lines
1.6 KiB
Python

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