Commit 580ecca8 authored by dmMaze's avatar dmMaze
Browse files

add line number to copy source text when translator is chatgpt, close #197

parent 0c4e98bd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ from .ocr import OCR, OCRBase, OCRMIT32px, OCRMIT48pxCTC, MangaOCR
from .textdetector import TEXTDETECTORS, TextDetectorBase, ComicTextDetector
from .translators import TRANSLATORS, BaseTranslator
from .inpaint import INPAINTERS, InpainterBase, PatchmatchInpainter, AOTInpainter, LamaInpainterMPE
from .base import DEFAULT_DEVICE
from .base import DEFAULT_DEVICE, GPUINTENSIVE_SET

GET_VALID_TEXTDETECTORS = lambda : list(TEXTDETECTORS.module_dict.keys())
GET_VALID_TRANSLATORS = lambda : list(TRANSLATORS.module_dict.keys())
+10 −3
Original line number Diff line number Diff line
@@ -142,8 +142,15 @@ class GPTTranslator(BaseTranslator):
        else:
            return None

    def _assemble_prompts(self, from_lang: str, to_lang: str, queries: List[str]) -> List[str]:
    def _assemble_prompts(self, queries: List[str], from_lang: str = None, to_lang: str = None, max_tokens = None) -> List[str]:
        if from_lang is None:
            from_lang = self.lang_map[self.lang_source]
        if to_lang is None:
            to_lang = self.lang_map[self.lang_target]
            
        prompt = ''

        if max_tokens is None:
            max_tokens = self.max_tokens
        # return_prompt = self.params['return prompt']
        prompt_template = self.params['prompt template']['content'].format(to_lang=to_lang).rstrip()
@@ -200,7 +207,7 @@ class GPTTranslator(BaseTranslator):
        queries = src_list
        # return_prompt = self.params['return prompt']
        chat_sample = self.chat_sample
        for prompt, num_src in self._assemble_prompts(from_lang, to_lang, queries):
        for prompt, num_src in self._assemble_prompts(queries, from_lang, to_lang):
            ratelimit_attempt = 0
            retry_attempt = 0
            while True:
+2 −2
Original line number Diff line number Diff line
from typing import List, Callable

from modules import GET_VALID_INPAINTERS, GET_VALID_TEXTDETECTORS, GET_VALID_TRANSLATORS, GET_VALID_OCR, \
    BaseTranslator, DEFAULT_DEVICE
    BaseTranslator, DEFAULT_DEVICE, GPUINTENSIVE_SET
from utils.logger import logger as LOGGER
from .stylewidgets import ConfigComboBox, NoBorderPushBtn, CustomComboBox
from .constants import CONFIG_FONTSIZE_CONTENT, CONFIG_COMBOBOX_MIDEAN, CONFIG_COMBOBOX_LONG, CONFIG_COMBOBOX_SHORT, CONFIG_COMBOBOX_HEIGHT
@@ -162,7 +162,7 @@ class ParamWidget(QWidget):
                    if param_key == 'device' and DEFAULT_DEVICE == 'cpu':
                        param_dict['select'] = 'cpu'
                        for ii, device in enumerate(param_dict['options']):
                            if device == 'cuda':
                            if device in GPUINTENSIVE_SET:
                                model = param_widget.model()
                                item = model.item(ii, 0)
                                item.setEnabled(False)
+4 −4
Original line number Diff line number Diff line
import re, traceback

from qtpy.QtWidgets import QHeaderView, QTableView, QAbstractItemView, QListWidget, QHBoxLayout, QListWidgetItem, QWidget, QGridLayout, QPushButton, QVBoxLayout
from qtpy.QtCore import Qt, Signal, QModelIndex
from qtpy.QtGui import QContextMenuEvent, QShowEvent, QHideEvent, QStandardItem, QStandardItemModel
from typing import List, Union, Dict
from qtpy.QtWidgets import QHeaderView, QTableView, QWidget, QVBoxLayout
from qtpy.QtCore import Qt, Signal
from qtpy.QtGui import QStandardItem, QStandardItemModel
from typing import List, Dict

from utils.logger import logger as LOGGER
from .misc import FontFormat
+40 −5
Original line number Diff line number Diff line
@@ -4,13 +4,13 @@ from typing import List

from qtpy.QtWidgets import QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QSplitter, QListWidget, QShortcut, QListWidgetItem, QMessageBox, QTextEdit, QPlainTextEdit
from qtpy.QtCore import Qt, QPoint, QSize, QEvent, Signal
from qtpy.QtGui import QTextCursor, QGuiApplication, QIcon, QCloseEvent, QKeySequence, QImage, QPainter
from qtpy.QtGui import QTextCursor, QGuiApplication, QIcon, QCloseEvent, QKeySequence, QImage, QPainter, QClipboard

from utils.logger import logger as LOGGER
from utils.io_utils import json_dump_nested_obj
from utils.text_processing import is_cjk, full_len, half_len
from modules.textdetector.textblock import TextBlock

from modules.translators.trans_chatgpt import GPTTranslator
from .misc import pt2px, parse_stylesheet
from .config import ProgramConfig, pcfg
from .imgtrans_proj import ProjImgTrans
@@ -20,7 +20,7 @@ from .module_manager import ModuleManager
from .pagesources import SourceDownload
from .textedit_area import SourceTextEdit, SelectTextMiniMenu
from .drawingpanel import DrawingPanel
from .scenetext_manager import SceneTextManager, TextPanel
from .scenetext_manager import SceneTextManager, TextPanel, PasteSrcItemsCommand
from .mainwindowbars import TitleBar, LeftBar, BottomBar
from .io_thread import ImgSaveThread, ImportDocThread, ExportDocThread
from .stylewidgets import FrameLessMessageBox, ImgtransProgressMessageBox, SourceDownloadProgressMessageBox
@@ -156,7 +156,8 @@ class MainWindow(FramelessWindow):
        self.canvas.drop_open_folder.connect(self.dropOpenDir)
        self.canvas.originallayer_trans_slider = self.bottomBar.originalSlider
        self.canvas.textlayer_trans_slider = self.bottomBar.textlayerSlider
        # self.canvas.masklayer_trans_slider = self.bottomBar.mask
        self.canvas.copy_src_signal.connect(self.on_copy_src)
        self.canvas.paste_src_signal.connect(self.on_paste_src)

        self.bottomBar.originalSlider.valueChanged.connect(self.canvas.setOriginalTransparencyBySlider)
        self.bottomBar.textlayerSlider.valueChanged.connect(self.canvas.setTextLayerTransparencyBySlider)
@@ -1126,3 +1127,37 @@ class MainWindow(FramelessWindow):
        
        for ii, tr in enumerate(translations):
            translations[ii] = self.mtSubWidget.sub_text(tr)

    def on_copy_src(self):
        blks = self.canvas.selected_text_items()
        if len(blks) == 0:
            return
        
        if isinstance(self.module_manager.translator, GPTTranslator):
            src_list = [self.st_manager.pairwidget_list[blk.idx].e_source.toPlainText() for blk in blks]
            src_txt = ''
            for (prompt, num_src) in self.module_manager.translator._assemble_prompts(src_list, max_tokens=4294967295):
                src_txt += prompt
            src_txt = src_txt.strip()
        else:
            src_list = [self.st_manager.pairwidget_list[blk.idx].e_source.toPlainText().strip().replace('\n', ' ') for blk in blks]
            src_txt = '\n'.join(src_list)

        self.st_manager.app_clipborad.setText(src_txt, QClipboard.Mode.Clipboard)

    def on_paste_src(self):
        blks = self.canvas.selected_text_items()
        if len(blks) == 0:
            return

        src_widget_list = [self.st_manager.pairwidget_list[blk.idx].e_source for blk in blks]
        text_list = self.st_manager.app_clipborad.text().split('\n')
        
        n_paragraph = min(len(src_widget_list), len(text_list))
        if n_paragraph < 1:
            return
        
        src_widget_list = src_widget_list[:n_paragraph]
        text_list = text_list[:n_paragraph]

        self.canvas.push_undo_command(PasteSrcItemsCommand(src_widget_list, text_list))
 No newline at end of file
Loading