Loading ballontranslator/ui/canvas.py +13 −9 Original line number Diff line number Diff line Loading @@ -276,13 +276,13 @@ class Canvas(QGraphicsScene): def keyPressEvent(self, event: QKeyEvent) -> None: if self.editing_textblkitem is not None: return super().keyPressEvent(event) if event == QKeySequence.Undo: self.undo() self.txtblkShapeControl.updateBoundingRect() elif event == QKeySequence.Redo: self.redo() self.txtblkShapeControl.updateBoundingRect() elif event.key() == Qt.Key.Key_Alt: # if event == QKeySequence.Undo: # self.undo() # self.txtblkShapeControl.updateBoundingRect() # elif event == QKeySequence.Redo: # self.redo() # self.txtblkShapeControl.updateBoundingRect() if event.key() == Qt.Key.Key_Alt: self.alt_pressed = True return super().keyPressEvent(event) Loading Loading @@ -551,11 +551,15 @@ class Canvas(QGraphicsScene): undo_stack = self.get_active_undostack() if undo_stack is not None: undo_stack.redo() if undo_stack == self.text_undo_stack: self.txtblkShapeControl.updateBoundingRect() def undo(self): undo_stack = self.get_active_undostack() if undo_stack is not None: undo_stack.undo() if undo_stack == self.text_undo_stack: self.txtblkShapeControl.updateBoundingRect() def clear_undostack(self, update_saved_step=False): if update_saved_step: Loading @@ -575,10 +579,10 @@ class Canvas(QGraphicsScene): self.saved_textundo_step = self.text_undo_stack.index() def text_change_unsaved(self) -> bool: return self.saved_textundo_step == self.text_undo_stack.index() return self.saved_textundo_step != self.text_undo_stack.index() def draw_change_unsaved(self) -> bool: return self.saved_drawundo_step == self.draw_undo_stack.index() return self.saved_drawundo_step != self.draw_undo_stack.index() def prepareClose(self): self.blockSignals(True) Loading ballontranslator/ui/drawing_commands.py +2 −11 Original line number Diff line number Diff line from qtpy.QtCore import Signal, Qt, QPointF, QSize, QLineF, QDateTime, QRectF, QPoint from qtpy.QtWidgets import QGridLayout, QPushButton, QComboBox, QSizePolicy, QBoxLayout, QCheckBox, QHBoxLayout, QGraphicsView, QStackedWidget, QVBoxLayout, QLabel, QGraphicsPixmapItem, QGraphicsEllipseItem from qtpy.QtGui import QPen, QColor, QCursor, QPainter, QPixmap, QBrush, QFontMetrics, QImage try: from qtpy.QtWidgets import QUndoCommand, QUndoStack from qtpy.QtWidgets import QUndoCommand except: from qtpy.QtGui import QUndoCommand, QUndoStack from qtpy.QtGui import QUndoCommand from typing import Union, Tuple, List import numpy as np import cv2 from utils.imgproc_utils import enlarge_window from utils.textblock_mask import canny_flood, connected_canny_flood from utils.logger import logger from .dl_manager import DLManager from .image_edit import ImageEditMode, PixmapItem, DrawingLayer, StrokeImgItem from .configpanel import InpaintConfigPanel from .stylewidgets import Widget, SeparatorWidget, ColorPicker, PaintQSlider from .canvas import Canvas class StrokeItemUndoCommand(QUndoCommand): def __init__(self, target_layer: DrawingLayer, rect: Tuple[int], qimg: QImage, erasing=False): super().__init__() Loading ballontranslator/ui/drawingpanel.py +0 −1 Original line number Diff line number Diff line Loading @@ -572,7 +572,6 @@ class DrawingPanel(Widget): left = mask_x - rect_enlarged[0] right = rect_enlarged[2] - inpaint_rect[2] # print('inpaint_rect: ', inpaint_rect, 'enlarged: ', rect_enlarged, 'ltrb: ', left, top, right, bottom) mask = cv2.copyMakeBorder(mask, top, bottom, left, right, cv2.BORDER_CONSTANT, value=0) inpaint_rect = rect_enlarged img = img[inpaint_rect[1]: inpaint_rect[3], inpaint_rect[0]: inpaint_rect[2]] Loading ballontranslator/ui/global_search_widget.py +11 −11 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ from qtpy.QtCore import Qt, QItemSelection, QSize, Signal, QUrl, QThread from qtpy.QtGui import QKeyEvent, QTextCursor, QStandardItemModel, QStandardItem, QFontMetrics, QColor, QShowEvent, QSyntaxHighlighter, QTextCharFormat from typing import List, Union, Tuple, Dict import re from utils.logger import logger as LOGGER from .page_search_widget import SearchEditor, HighlightMatched Loading @@ -13,7 +14,8 @@ from .textedit_area import TransPairWidget, SourceTextEdit, TransTextEdit from .imgtrans_proj import ProjImgTrans from .io_thread import ThreadBase import re SEARCH_RESULT_FONTSIZE = 12 class PageSearchThead(ThreadBase): Loading @@ -32,13 +34,11 @@ class PageSearchThead(ThreadBase): pass SEARCH_RESULT_FONTSIZE = 12 class SearchResultItem(QStandardItem): def __init__(self, text: str, span: Tuple[int, int], blk_idx: int, pagename: str, is_src: bool): super().__init__() self.text = text self.show_text = text.replace('\n', ' ') self.start = span[0] self.end = span[1] self.is_src = is_src Loading @@ -49,7 +49,7 @@ class SearchResultItem(QStandardItem): font.setPointSizeF(SEARCH_RESULT_FONTSIZE) self.setFont(font) self.setText(text) self.setText(self.show_text) self.setEditable(False) def setBold(self, bold: bool): Loading @@ -69,6 +69,7 @@ class PageSeachResultItem(QStandardItem): font = self.font() font.setPointSizeF(SEARCH_RESULT_FONTSIZE) self.setFont(font) self.setEditable(False) def addResult(self, matched_span: Tuple[int, int], text: str, blk_idx: int, is_src: bool) -> SearchResultItem: self.matched_span_list.append(matched_span) Loading @@ -79,7 +80,6 @@ class PageSeachResultItem(QStandardItem): return rstitem def gen_searchitem_list(span_list: List[int], text: str, blk_idx: int, pagename: str, is_src: bool) -> List[SearchResultItem]: sr_list = [] for span in span_list: Loading Loading @@ -277,7 +277,10 @@ class GlobalSearchWidget(Widget): if self.whole_word_toggle.isChecked(): regexr = r'\b' + target_text + r'\b' try: return re.compile(regexr, flag) except re.error: return None def commit_search(self): self.search_tree.clearPages() Loading Loading @@ -313,9 +316,6 @@ class GlobalSearchWidget(Widget): self.search_tree.expandAll() def on_replaceall_btn_clicked(self): pass Loading ballontranslator/ui/imgtrans_proj.py +4 −3 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ from .misc import ImgnameNotInProjectException, ProjectLoadFailureException, Pro def write_jpg_metadata(imgpath: str, metadata="a metadata"): exif_dict = {"Exif":{piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(metadata)}} exif_dict = {"Exif":{piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(metadata, encoding='unicode')}} exif_bytes = piexif.dump(exif_dict) piexif.insert(exif_bytes, imgpath) Loading Loading @@ -309,11 +309,12 @@ class ProjImgTrans: for index, (cut_path, width) in enumerate(zip(cuts_path_list, cut_width_list)): run = table.cell(index, 0).paragraphs[0].add_run() run.style.font.name = target_font blk = blklist[index] blk: TextBlock = blklist[index] bubdict = vars(blk).copy() bubdict["imgkey"] = pagename bubdict["rich_text"] = '' write_jpg_metadata(cut_path, metadata=json.dumps(bubdict, ensure_ascii=False, cls=NumpyEncoder)) bubdict["text"] = blk.get_text() write_jpg_metadata(cut_path, metadata=json.dumps(bubdict, ensure_ascii=False, cls=TextBlkEncoder)) run.add_picture(cut_path, width=Inches(width/96 * 0.85)) table.cell(index, 1).text = bubdict["translation"] Loading Loading
ballontranslator/ui/canvas.py +13 −9 Original line number Diff line number Diff line Loading @@ -276,13 +276,13 @@ class Canvas(QGraphicsScene): def keyPressEvent(self, event: QKeyEvent) -> None: if self.editing_textblkitem is not None: return super().keyPressEvent(event) if event == QKeySequence.Undo: self.undo() self.txtblkShapeControl.updateBoundingRect() elif event == QKeySequence.Redo: self.redo() self.txtblkShapeControl.updateBoundingRect() elif event.key() == Qt.Key.Key_Alt: # if event == QKeySequence.Undo: # self.undo() # self.txtblkShapeControl.updateBoundingRect() # elif event == QKeySequence.Redo: # self.redo() # self.txtblkShapeControl.updateBoundingRect() if event.key() == Qt.Key.Key_Alt: self.alt_pressed = True return super().keyPressEvent(event) Loading Loading @@ -551,11 +551,15 @@ class Canvas(QGraphicsScene): undo_stack = self.get_active_undostack() if undo_stack is not None: undo_stack.redo() if undo_stack == self.text_undo_stack: self.txtblkShapeControl.updateBoundingRect() def undo(self): undo_stack = self.get_active_undostack() if undo_stack is not None: undo_stack.undo() if undo_stack == self.text_undo_stack: self.txtblkShapeControl.updateBoundingRect() def clear_undostack(self, update_saved_step=False): if update_saved_step: Loading @@ -575,10 +579,10 @@ class Canvas(QGraphicsScene): self.saved_textundo_step = self.text_undo_stack.index() def text_change_unsaved(self) -> bool: return self.saved_textundo_step == self.text_undo_stack.index() return self.saved_textundo_step != self.text_undo_stack.index() def draw_change_unsaved(self) -> bool: return self.saved_drawundo_step == self.draw_undo_stack.index() return self.saved_drawundo_step != self.draw_undo_stack.index() def prepareClose(self): self.blockSignals(True) Loading
ballontranslator/ui/drawing_commands.py +2 −11 Original line number Diff line number Diff line from qtpy.QtCore import Signal, Qt, QPointF, QSize, QLineF, QDateTime, QRectF, QPoint from qtpy.QtWidgets import QGridLayout, QPushButton, QComboBox, QSizePolicy, QBoxLayout, QCheckBox, QHBoxLayout, QGraphicsView, QStackedWidget, QVBoxLayout, QLabel, QGraphicsPixmapItem, QGraphicsEllipseItem from qtpy.QtGui import QPen, QColor, QCursor, QPainter, QPixmap, QBrush, QFontMetrics, QImage try: from qtpy.QtWidgets import QUndoCommand, QUndoStack from qtpy.QtWidgets import QUndoCommand except: from qtpy.QtGui import QUndoCommand, QUndoStack from qtpy.QtGui import QUndoCommand from typing import Union, Tuple, List import numpy as np import cv2 from utils.imgproc_utils import enlarge_window from utils.textblock_mask import canny_flood, connected_canny_flood from utils.logger import logger from .dl_manager import DLManager from .image_edit import ImageEditMode, PixmapItem, DrawingLayer, StrokeImgItem from .configpanel import InpaintConfigPanel from .stylewidgets import Widget, SeparatorWidget, ColorPicker, PaintQSlider from .canvas import Canvas class StrokeItemUndoCommand(QUndoCommand): def __init__(self, target_layer: DrawingLayer, rect: Tuple[int], qimg: QImage, erasing=False): super().__init__() Loading
ballontranslator/ui/drawingpanel.py +0 −1 Original line number Diff line number Diff line Loading @@ -572,7 +572,6 @@ class DrawingPanel(Widget): left = mask_x - rect_enlarged[0] right = rect_enlarged[2] - inpaint_rect[2] # print('inpaint_rect: ', inpaint_rect, 'enlarged: ', rect_enlarged, 'ltrb: ', left, top, right, bottom) mask = cv2.copyMakeBorder(mask, top, bottom, left, right, cv2.BORDER_CONSTANT, value=0) inpaint_rect = rect_enlarged img = img[inpaint_rect[1]: inpaint_rect[3], inpaint_rect[0]: inpaint_rect[2]] Loading
ballontranslator/ui/global_search_widget.py +11 −11 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ from qtpy.QtCore import Qt, QItemSelection, QSize, Signal, QUrl, QThread from qtpy.QtGui import QKeyEvent, QTextCursor, QStandardItemModel, QStandardItem, QFontMetrics, QColor, QShowEvent, QSyntaxHighlighter, QTextCharFormat from typing import List, Union, Tuple, Dict import re from utils.logger import logger as LOGGER from .page_search_widget import SearchEditor, HighlightMatched Loading @@ -13,7 +14,8 @@ from .textedit_area import TransPairWidget, SourceTextEdit, TransTextEdit from .imgtrans_proj import ProjImgTrans from .io_thread import ThreadBase import re SEARCH_RESULT_FONTSIZE = 12 class PageSearchThead(ThreadBase): Loading @@ -32,13 +34,11 @@ class PageSearchThead(ThreadBase): pass SEARCH_RESULT_FONTSIZE = 12 class SearchResultItem(QStandardItem): def __init__(self, text: str, span: Tuple[int, int], blk_idx: int, pagename: str, is_src: bool): super().__init__() self.text = text self.show_text = text.replace('\n', ' ') self.start = span[0] self.end = span[1] self.is_src = is_src Loading @@ -49,7 +49,7 @@ class SearchResultItem(QStandardItem): font.setPointSizeF(SEARCH_RESULT_FONTSIZE) self.setFont(font) self.setText(text) self.setText(self.show_text) self.setEditable(False) def setBold(self, bold: bool): Loading @@ -69,6 +69,7 @@ class PageSeachResultItem(QStandardItem): font = self.font() font.setPointSizeF(SEARCH_RESULT_FONTSIZE) self.setFont(font) self.setEditable(False) def addResult(self, matched_span: Tuple[int, int], text: str, blk_idx: int, is_src: bool) -> SearchResultItem: self.matched_span_list.append(matched_span) Loading @@ -79,7 +80,6 @@ class PageSeachResultItem(QStandardItem): return rstitem def gen_searchitem_list(span_list: List[int], text: str, blk_idx: int, pagename: str, is_src: bool) -> List[SearchResultItem]: sr_list = [] for span in span_list: Loading Loading @@ -277,7 +277,10 @@ class GlobalSearchWidget(Widget): if self.whole_word_toggle.isChecked(): regexr = r'\b' + target_text + r'\b' try: return re.compile(regexr, flag) except re.error: return None def commit_search(self): self.search_tree.clearPages() Loading Loading @@ -313,9 +316,6 @@ class GlobalSearchWidget(Widget): self.search_tree.expandAll() def on_replaceall_btn_clicked(self): pass Loading
ballontranslator/ui/imgtrans_proj.py +4 −3 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ from .misc import ImgnameNotInProjectException, ProjectLoadFailureException, Pro def write_jpg_metadata(imgpath: str, metadata="a metadata"): exif_dict = {"Exif":{piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(metadata)}} exif_dict = {"Exif":{piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(metadata, encoding='unicode')}} exif_bytes = piexif.dump(exif_dict) piexif.insert(exif_bytes, imgpath) Loading Loading @@ -309,11 +309,12 @@ class ProjImgTrans: for index, (cut_path, width) in enumerate(zip(cuts_path_list, cut_width_list)): run = table.cell(index, 0).paragraphs[0].add_run() run.style.font.name = target_font blk = blklist[index] blk: TextBlock = blklist[index] bubdict = vars(blk).copy() bubdict["imgkey"] = pagename bubdict["rich_text"] = '' write_jpg_metadata(cut_path, metadata=json.dumps(bubdict, ensure_ascii=False, cls=NumpyEncoder)) bubdict["text"] = blk.get_text() write_jpg_metadata(cut_path, metadata=json.dumps(bubdict, ensure_ascii=False, cls=TextBlkEncoder)) run.add_picture(cut_path, width=Inches(width/96 * 0.85)) table.cell(index, 1).text = bubdict["translation"] Loading