diff --git a/LunaTranslator/LunaTranslator/LunaTranslator.py b/LunaTranslator/LunaTranslator/LunaTranslator.py index aaceda63..dae25d6a 100644 --- a/LunaTranslator/LunaTranslator/LunaTranslator.py +++ b/LunaTranslator/LunaTranslator/LunaTranslator.py @@ -40,7 +40,7 @@ from gui.edittext import edittext import importlib, qtawesome from functools import partial from gui.setting import Setting -from gui.showocrimage import showocrimage +from gui.setting_textinput_ocr import showocrimage from gui.attachprocessdialog import AttachProcessDialog import windows import gobject diff --git a/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py b/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py index 4219f3fa..bf37e6f6 100644 --- a/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py +++ b/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py @@ -1,3 +1,4 @@ +from PyQt5.QtWidgets import QWidget from qtsymbols import * import os, functools, uuid, threading, hashlib from datetime import datetime, timedelta @@ -50,6 +51,7 @@ from gui.specialwidget import ( ) from gui.usefulwidget import ( yuitsu_switch, + pixmapviewer, FocusCombo, TableViewW, saveposwindow, @@ -1731,33 +1733,37 @@ def __scaletosize(_pix: QPixmap, tgt): _pix.save(tgt) +def _getcachedimage(src, small): + if not small: + _pix = QPixmap(src) + if _pix.isNull(): + return None + return _pix + + src2 = gobject.getcachedir(f"icon2/{__b64string(src)}.jpg") + _pix = QPixmap(src2) + if not _pix.isNull(): + return _pix + _pix = QPixmap(src) + if _pix.isNull(): + return None + __scaletosize(_pix, src2) + return _pix + + def _getpixfunction(kk, small=False): if ( savehook_new_data[kk]["currentmainimage"] in savehook_new_data[kk]["imagepath_all"] ): src = savehook_new_data[kk]["currentmainimage"] - if small: - src2 = gobject.getcachedir(f"icon2/{__b64string(src)}.jpg") - _pix = QPixmap(src2) - if _pix and not _pix.isNull(): - return _pix - _pix = QPixmap(src) - if _pix and not _pix.isNull(): - if small: - __scaletosize(_pix, src2) - return _pix + pix = _getcachedimage(src, small) + if pix: + return pix for _ in savehook_new_data[kk]["imagepath_all"]: - if small: - src2 = gobject.getcachedir(f"icon2/{__b64string(_)}.jpg") - _pix = QPixmap(src2) - if _pix and not _pix.isNull(): - return _pix - _pix = QPixmap(_) - if _pix and not _pix.isNull(): - if small: - __scaletosize(_pix, src2) - return _pix + pix = _getcachedimage(_, small) + if pix: + return pix _pix = getExeIcon(uid2gamepath[kk], False, cache=True) return _pix @@ -2608,91 +2614,130 @@ class fadeoutlabel(QLabel): self.animation.start() +class XQListWidget(QListWidget): + def __init__(self, parent=None) -> None: + super().__init__(parent) + self.setFlow(QListWidget.LeftToRight) + self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + self.setHorizontalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) + + +class previewimages(QWidget): + showpixmap = pyqtSignal(QPixmap) + changepixmappath = pyqtSignal(str) + removepath = pyqtSignal(str) + + def sizeHint(self): + return QSize(100, 100) + + def __init__(self, p) -> None: + super().__init__(p) + self.lay = QHBoxLayout() + self.lay.setContentsMargins(0, 0, 0, 0) + self.list = XQListWidget(self) + self.list.currentRowChanged.connect(self._visidx) + self.lay.addWidget(self.list) + self.setLayout(self.lay) + self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) + self.customContextMenuRequested.connect(self.menu) + + def menu(self, _): + menu = QMenu(self) + + deleteimage = LAction(("删除图片")) + + menu.addAction(deleteimage) + action = menu.exec(QCursor.pos()) + if action == deleteimage: + self.removecurrent() + + def tolastnext(self, dx): + if self.list.count() == 0: + return self.list.setCurrentRow(-1) + self.list.setCurrentRow((self.list.currentRow() + dx) % self.list.count()) + + def setpixmaps(self, paths, currentpath): + self.list.setCurrentRow(-1) + pixmapi = 0 + if currentpath in paths: + pixmapi = paths.index(currentpath) + self.list.blockSignals(True) + self.list.clear() + for path in paths: + item = QListWidgetItem() + item.imagepath = path + item.setIcon(QIcon(_getcachedimage(path, True))) + + self.list.addItem(item) + self.list.blockSignals(False) + self.list.setCurrentRow(pixmapi) + + def _visidx(self, _): + item = self.list.currentItem() + if item is None: + return self.showpixmap.emit(QPixmap()) + pixmap_ = item.imagepath + pixmap = QPixmap.fromImage(QImage(pixmap_)) + if pixmap is None or pixmap.isNull(): + return self.showpixmap.emit(QPixmap()) + self.changepixmappath.emit(pixmap_) + self.showpixmap.emit(pixmap) + + def removecurrent(self): + idx = self.list.currentRow() + item = self.list.currentItem() + if item is None: + return + path = item.imagepath + self.removepath.emit(path) + self.list.takeItem(idx) + + def resizeEvent(self, e: QResizeEvent): + self.list.setIconSize(QSize(self.height(), self.height())) + return super().resizeEvent(e) + + class pixwrapper(QWidget): def __init__(self) -> None: super().__init__() - self.pixview = QLabel(self) + self.previewimages = previewimages(self) + self.vlayout = QVBoxLayout(self) + self.vlayout.setContentsMargins(0, 0, 0, 0) + self.pixview = pixmapviewer(self) + self.spliter = QSplitter(self) + self.spliter.setOrientation(Qt.Orientation.Vertical) + self.vlayout.addWidget(self.spliter) + self.spliter.addWidget(self.pixview) + self.pixview.tolastnext.connect(self.previewimages.tolastnext) + self.spliter.addWidget(self.previewimages) + self.setLayout(self.vlayout) self.pathview = fadeoutlabel(self) - self.pixmaps = [] - self.rflist = [] - self.iternalpixmaps = [] + self.previewimages.showpixmap.connect(self.pixview.showpixmap) + self.previewimages.changepixmappath.connect(self.changepixmappath) + self.previewimages.removepath.connect(self.removepath) self.k = None - self.pixmapi = 0 - self.pixview.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.current = None + self.removecurrent = self.previewimages.removecurrent - def tolastnext(self, dx): - if len(self.pixmaps) == 0: - return + def removepath(self, path): + lst = savehook_new_data[self.k]["imagepath_all"] + lst.pop(lst.index(path)) - self.pixmapi = (self.pixmapi + dx) % len(self.pixmaps) - self.visidx() + def changepixmappath(self, path): + savehook_new_data[self.k]["currentvisimage"] = path + self.pathview.setText(path) - def mousePressEvent(self, a0: QMouseEvent) -> None: - if a0.pos().x() < self.width() / 3: - self.tolastnext(-1) - elif a0.pos().x() > self.width() * 2 / 3: - self.tolastnext(1) - else: - pass - return super().mousePressEvent(a0) + def setpixmenu(self, function): + self.pixview.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) + self.pixview.customContextMenuRequested.connect(function) def resizeEvent(self, e: QResizeEvent): - self.pixview.resize(e.size().width(), e.size().height()) self.pathview.resize(e.size().width(), self.pathview.height()) - if self.current is None: - self.visidx() - else: - self.scalepix(self.current) - - def visidx(self): - if len(self.pixmaps) == 0: - if not self.k: - return - pixmap = getExeIcon(uid2gamepath[self.k], False, cache=True) - pixmap_ = None - else: - self.pixmapi = min(len(self.pixmaps) - 1, self.pixmapi) - pixmap_ = self.pixmaps[self.pixmapi] - pixmap = QPixmap.fromImage(QImage(pixmap_)) - if pixmap is None or pixmap.isNull(): - self.pixmaps.pop(self.pixmapi) - return self.visidx() - self.pathview.setText(pixmap_) - savehook_new_data[self.k]["currentvisimage"] = pixmap_ - pixmap.setDevicePixelRatio(self.devicePixelRatioF()) - self.current = pixmap - self.scalepix(pixmap) - - def removecurrent(self): - if self.pixmapi < len(self.pixmaps): - - path = self.pixmaps[self.pixmapi] - self.rflist.pop(self.rflist.index(path)) - self.pixmaps.pop(self.pixmapi) - if self.pixmapi < len(self.pixmaps): - pass - else: - self.pixmapi -= 1 - self.visidx() + super().resizeEvent(e) def setpix(self, k): - self.k = k - self.pixmaps = savehook_new_data[k]["imagepath_all"].copy() - self.rflist = savehook_new_data[k]["imagepath_all"] - self.pixmapi = 0 - if savehook_new_data[k]["currentvisimage"] in self.pixmaps: - self.pixmapi = self.pixmaps.index(savehook_new_data[k]["currentvisimage"]) - self.visidx() - - def scalepix(self, pix: QPixmap): - pix = pix.scaled( - self.pixview.size() * self.devicePixelRatioF(), - Qt.AspectRatioMode.KeepAspectRatio, - Qt.TransformationMode.SmoothTransformation, - ) - self.pixview.setPixmap(pix) + pixmaps = savehook_new_data[k]["imagepath_all"].copy() + self.previewimages.setpixmaps(pixmaps, savehook_new_data[k]["currentvisimage"]) def loadvisinternal(skipid=False, skipidid=None): @@ -2937,10 +2982,7 @@ class dialog_savedgame_v3(QWidget): self.righttop.addTab(_w, "画廊") lay.addWidget(self.righttop) rightlay.addWidget(self.pixview) - self.pixview.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) - self.pixview.customContextMenuRequested.connect( - functools.partial(self.stack_showmenu, True) - ) + self.pixview.setpixmenu(functools.partial(self.stack_showmenu, True)) self.buttonlayout = QHBoxLayout() self.savebutton = [] rightlay.addLayout(self.buttonlayout) diff --git a/LunaTranslator/LunaTranslator/gui/setting_textinput_ocr.py b/LunaTranslator/LunaTranslator/gui/setting_textinput_ocr.py index cb4e5629..23de46aa 100644 --- a/LunaTranslator/LunaTranslator/gui/setting_textinput_ocr.py +++ b/LunaTranslator/LunaTranslator/gui/setting_textinput_ocr.py @@ -1,6 +1,5 @@ from qtsymbols import * import functools, os -import gobject from myutils.config import globalconfig, ocrsetting, ocrerrorfix from myutils.utils import splitocrtypes, dynamiclink from gui.inputdialog import autoinitdialog, postconfigdialog, autoinitdialog_items @@ -12,8 +11,62 @@ from gui.usefulwidget import ( D_getcolorbutton, D_getsimpleswitch, selectcolor, + saveposwindow, + pixmapviewer, ) from gui.dynalang import LPushButton +import qtawesome, gobject +from myutils.ocrutil import imagesolve +from myutils.wrapper import Singleton_close + + +@Singleton_close +class showocrimage(saveposwindow): + setimage = pyqtSignal(list) + + def closeEvent(self, e): + gobject.baseobject.showocrimage = None + super().closeEvent(e) + + def __init__(self, parent, cached): + self.img1 = None + self.originimage = None + super().__init__(parent, poslist=globalconfig["showocrgeo"]) + self.setWindowIcon(qtawesome.icon("fa.picture-o")) + self.setWindowTitle("查看处理效果") + self.originlabel = pixmapviewer() + qw = QWidget() + self.solvedlabel = pixmapviewer() + self.lay2 = QHBoxLayout() + button = QPushButton( + icon=qtawesome.icon("fa.rotate-right", color=globalconfig["buttoncolor"]) + ) + button.clicked.connect(self.retest) + self.layout1 = QVBoxLayout() + # self.lay2.addWidget(button) + self.lay2.addLayout(self.layout1) + self.setCentralWidget(qw) + qw.setLayout(self.lay2) + self.layout1.addWidget(self.originlabel) + self.layout1.addWidget(button) + self.layout1.addWidget(self.solvedlabel) + self.setimage.connect(self.setimagefunction) + if cached: + self.setimagefunction(cached) + + def retest(self): + if self.originimage is None: + return + img = imagesolve(self.originimage) + self.setimagefunction([self.originimage, img]) + + def setimagefunction(self, image): + originimage, solved = image + self.originimage = originimage + self.img1 = QPixmap.fromImage(originimage) + self.img2 = QPixmap.fromImage(solved) + self.originlabel.showpixmap(self.img1) + self.solvedlabel.showpixmap(self.img2) def __label1(self): diff --git a/LunaTranslator/LunaTranslator/gui/showocrimage.py b/LunaTranslator/LunaTranslator/gui/showocrimage.py deleted file mode 100644 index 19128e77..00000000 --- a/LunaTranslator/LunaTranslator/gui/showocrimage.py +++ /dev/null @@ -1,84 +0,0 @@ -from qtsymbols import * -import qtawesome, gobject -from myutils.ocrutil import imagesolve -from myutils.config import globalconfig -from myutils.wrapper import Singleton_close -from gui.usefulwidget import saveposwindow - - -class pixlabel(QLabel): - def __init__(self): - super().__init__() - self.pix = None - - def paintEvent(self, a0) -> None: - - if self.pix: - painter = QPainter(self) - painter.setRenderHint(QPainter.RenderHint.Antialiasing) - - painter.drawPixmap( - 0, - 0, - self.pix.scaled( - self.size() * self.devicePixelRatioF(), - Qt.AspectRatioMode.KeepAspectRatio, - Qt.TransformationMode.SmoothTransformation, - ), - ) - - return super().paintEvent(a0) - - def setpix(self, pix): - pix.setDevicePixelRatio(self.devicePixelRatioF()) - self.pix = pix - self.update() - - -@Singleton_close -class showocrimage(saveposwindow): - setimage = pyqtSignal(list) - - def closeEvent(self, e): - gobject.baseobject.showocrimage = None - super().closeEvent(e) - - def __init__(self, parent, cached): - self.img1 = None - self.originimage = None - super().__init__(parent, poslist=globalconfig["showocrgeo"]) - self.setWindowIcon(qtawesome.icon("fa.picture-o")) - self.setWindowTitle("查看处理效果") - self.originlabel = pixlabel() - qw = QWidget() - self.solvedlabel = pixlabel() - self.lay2 = QHBoxLayout() - button = QPushButton( - icon=qtawesome.icon("fa.rotate-right", color=globalconfig["buttoncolor"]) - ) - button.clicked.connect(self.retest) - self.layout1 = QVBoxLayout() - # self.lay2.addWidget(button) - self.lay2.addLayout(self.layout1) - self.setCentralWidget(qw) - qw.setLayout(self.lay2) - self.layout1.addWidget(self.originlabel) - self.layout1.addWidget(button) - self.layout1.addWidget(self.solvedlabel) - self.setimage.connect(self.setimagefunction) - if cached: - self.setimagefunction(cached) - - def retest(self): - if self.originimage is None: - return - img = imagesolve(self.originimage) - self.setimagefunction([self.originimage, img]) - - def setimagefunction(self, image): - originimage, solved = image - self.originimage = originimage - self.img1 = QPixmap.fromImage(originimage) - self.img2 = QPixmap.fromImage(solved) - self.originlabel.setpix(self.img1) - self.solvedlabel.setpix(self.img2) diff --git a/LunaTranslator/LunaTranslator/gui/usefulwidget.py b/LunaTranslator/LunaTranslator/gui/usefulwidget.py index 0e636380..a526373d 100644 --- a/LunaTranslator/LunaTranslator/gui/usefulwidget.py +++ b/LunaTranslator/LunaTranslator/gui/usefulwidget.py @@ -1859,3 +1859,57 @@ def getsimplepatheditor( lay.addWidget(e) lay.addWidget(bu) return lay + + +class pixmapviewer(QWidget): + tolastnext = pyqtSignal(int) + + def sizeHint(self): + return QSize(400, 400) + + def mousePressEvent(self, a0: QMouseEvent) -> None: + if a0.pos().x() < self.width() / 3: + self.tolastnext.emit(-1) + elif a0.pos().x() > self.width() * 2 / 3: + self.tolastnext.emit(1) + else: + pass + return super().mousePressEvent(a0) + + def __init__(self, p=None) -> None: + super().__init__(p) + self.pix = None + self._pix = None + + def showpixmap(self, pix: QPixmap): + pix.setDevicePixelRatio(self.devicePixelRatioF()) + self.pix = pix + self._pix = None + self.update() + + def paintEvent(self, e): + if self.pix: + if self._pix: + if self._pix.size() != self.size() * self.devicePixelRatioF(): + self._pix = None + if not self._pix: + rate = self.devicePixelRatioF() + self._pix = QPixmap(self.size() * rate) + self._pix.setDevicePixelRatio(rate) + self._pix.fill(Qt.GlobalColor.transparent) + + if not self.pix.isNull(): + painter = QPainter(self._pix) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) + painter.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform) + pix = self.pix.scaled( + self.size() * self.devicePixelRatioF(), + Qt.AspectRatioMode.KeepAspectRatio, + Qt.TransformationMode.SmoothTransformation, + ) + x = self.width() / 2 - pix.width() / 2 / self.devicePixelRatioF() + y = self.height() / 2 - pix.height() / 2 / self.devicePixelRatioF() + painter.drawPixmap(int(x), int(y), pix) + painter = QPainter(self) + painter.drawPixmap(0, 0, self._pix) + return super().paintEvent(e) diff --git a/LunaTranslator/LunaTranslator/metadata/bangumi.py b/LunaTranslator/LunaTranslator/metadata/bangumi.py index b6591283..8d6cca4c 100644 --- a/LunaTranslator/LunaTranslator/metadata/bangumi.py +++ b/LunaTranslator/LunaTranslator/metadata/bangumi.py @@ -201,7 +201,8 @@ class searcher(common): developers = [] for _ in response["infobox"]: if _["key"] in ["游戏开发商", "开发", "发行"]: - developers += [_["value"]] + for __ in _["value"]: + developers.append(__['v']) return { # "namemap": namemap, "title": response["name"], diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index fa8693a9..1c722c9d 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -29,7 +29,7 @@ include(generate_product_version) set(VERSION_MAJOR 5) set(VERSION_MINOR 15) -set(VERSION_PATCH 5) +set(VERSION_PATCH 6) add_library(pch pch.cpp) target_precompile_headers(pch PUBLIC pch.h)