mirror of
https://github.com/HIllya51/LunaTranslator.git
synced 2024-12-29 00:24:13 +08:00
...
This commit is contained in:
parent
abef0a1e25
commit
f3e6f2836b
@ -464,7 +464,7 @@ class MAINUI:
|
||||
def selectprocess(self, selectedp):
|
||||
self.textsource = None
|
||||
pids, pexe, hwnd = selectedp
|
||||
checkifnewgame(pexe, windows.GetWindowText(hwnd))
|
||||
checkifnewgame(savehook_new_list, pexe, windows.GetWindowText(hwnd))
|
||||
if globalconfig["sourcestatus2"]["texthook"]["use"]:
|
||||
self.textsource = texthook(pids, hwnd, pexe)
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
from qtsymbols import *
|
||||
import os, functools
|
||||
import os, functools, uuid
|
||||
from datetime import datetime, timedelta
|
||||
from traceback import print_exc
|
||||
import windows, gobject, winsharedutils
|
||||
@ -7,6 +7,7 @@ from myutils.vndb import parsehtmlmethod
|
||||
from myutils.config import (
|
||||
savehook_new_list,
|
||||
savehook_new_data,
|
||||
savegametaged,
|
||||
vndbtagdata,
|
||||
_TR,
|
||||
_TRL,
|
||||
@ -62,7 +63,7 @@ class ItemWidget(QWidget):
|
||||
pass
|
||||
ItemWidget.globallashfocus = None
|
||||
|
||||
def mousePressEvent(self, ev) -> None:
|
||||
def click(self):
|
||||
try:
|
||||
self.bottommask.setStyleSheet(
|
||||
f'background-color: {str2rgba(globalconfig["dialog_savegame_layout"]["onselectcolor"],globalconfig["dialog_savegame_layout"]["transparent"])};'
|
||||
@ -75,6 +76,9 @@ class ItemWidget(QWidget):
|
||||
except:
|
||||
print_exc()
|
||||
|
||||
def mousePressEvent(self, ev) -> None:
|
||||
self.click()
|
||||
|
||||
def focusOut(self):
|
||||
self.bottommask.setStyleSheet("background-color: rgba(255,255,255, 0);")
|
||||
self.focuschanged.emit(False, self.exe)
|
||||
@ -583,7 +587,6 @@ class dialog_setting_game_internal(QWidget):
|
||||
return
|
||||
savehook_new_list[savehook_new_list.index(self.exepath)] = res
|
||||
savehook_new_data[res] = savehook_new_data[self.exepath]
|
||||
savehook_new_data.pop(self.exepath)
|
||||
_icon = getExeIcon(res, cache=True)
|
||||
|
||||
self.setWindowIcon(_icon)
|
||||
@ -1453,29 +1456,18 @@ def startgamecheck(self, game):
|
||||
startgame(game)
|
||||
|
||||
|
||||
def removegame(game):
|
||||
try:
|
||||
idx = savehook_new_list.index(game)
|
||||
savehook_new_list.pop(idx)
|
||||
if game in savehook_new_data:
|
||||
savehook_new_data.pop(game)
|
||||
except:
|
||||
print_exc()
|
||||
|
||||
|
||||
def addgamesingle(callback):
|
||||
def addgamesingle(callback, targetlist):
|
||||
f = QFileDialog.getOpenFileName(options=QFileDialog.Option.DontResolveSymlinks)
|
||||
|
||||
res = f[0]
|
||||
if res == "":
|
||||
return
|
||||
res = os.path.normpath(res)
|
||||
if res not in savehook_new_list:
|
||||
checkifnewgame(res)
|
||||
if checkifnewgame(targetlist, res):
|
||||
callback(res)
|
||||
|
||||
|
||||
def addgamebatch(callback):
|
||||
def addgamebatch(callback, targetlist):
|
||||
res = QFileDialog.getExistingDirectory(
|
||||
options=QFileDialog.Option.DontResolveSymlinks
|
||||
)
|
||||
@ -1486,8 +1478,7 @@ def addgamebatch(callback):
|
||||
path = os.path.normpath(os.path.abspath(os.path.join(_dir, _f)))
|
||||
if path.lower().endswith(".exe") == False:
|
||||
continue
|
||||
if path not in savehook_new_list:
|
||||
checkifnewgame(path)
|
||||
if checkifnewgame(targetlist, path):
|
||||
callback(path)
|
||||
|
||||
|
||||
@ -1497,21 +1488,25 @@ class dialog_savedgame_new(saveposwindow):
|
||||
try:
|
||||
game = self.currentfocuspath
|
||||
idx2 = savehook_new_list.index(game)
|
||||
removegame(game)
|
||||
|
||||
savehook_new_list.pop(idx2)
|
||||
self.flow.removeidx(idx2)
|
||||
self.flow.setfocus(idx2)
|
||||
IMGWidget.clearFocus()
|
||||
try:
|
||||
self.flow.widget(idx2).click()
|
||||
except:
|
||||
pass
|
||||
self.flow.widget(0).click()
|
||||
|
||||
except:
|
||||
print_exc()
|
||||
|
||||
def clicked4(self):
|
||||
opendir(self.currentfocuspath)
|
||||
|
||||
def clicked3_batch(self):
|
||||
addgamebatch(lambda res: self.newline(res, True))
|
||||
addgamebatch(lambda res: self.newline(res, True), savehook_new_list)
|
||||
|
||||
def clicked3(self):
|
||||
addgamesingle(lambda res: self.newline(res, True))
|
||||
addgamesingle(lambda res: self.newline(res, True), savehook_new_list)
|
||||
|
||||
def tagschanged(self, tags):
|
||||
self.currtags = tags
|
||||
@ -1712,10 +1707,7 @@ class dialog_savedgame_new(saveposwindow):
|
||||
|
||||
idx1 = savehook_new_list.index(game)
|
||||
idx2 = (idx1 + dx) % len(savehook_new_list)
|
||||
savehook_new_list[idx1], savehook_new_list[idx2] = (
|
||||
savehook_new_list[idx2],
|
||||
savehook_new_list[idx1],
|
||||
)
|
||||
savehook_new_list.insert(idx2, savehook_new_list.pop(idx1))
|
||||
self.flow.switchidx(idx1, idx2)
|
||||
|
||||
def showsettingdialog(self):
|
||||
@ -1793,7 +1785,9 @@ class dialog_savedgame_lagacy(QDialog):
|
||||
|
||||
def clicked2(self):
|
||||
try:
|
||||
removegame(savehook_new_list[self.table.currentIndex().row()])
|
||||
|
||||
idx = self.table.currentIndex().row()
|
||||
savehook_new_list.pop(idx)
|
||||
self.model.removeRow(self.table.currentIndex().row())
|
||||
except:
|
||||
pass
|
||||
@ -1931,6 +1925,7 @@ class clickitem(QWidget):
|
||||
def resizeEvent(self, a0: QResizeEvent) -> None:
|
||||
self.bottommask.resize(a0.size())
|
||||
self.maskshowfileexists.resize(a0.size())
|
||||
self.bottomline.resize(a0.size())
|
||||
|
||||
def __init__(self, exe):
|
||||
super().__init__()
|
||||
@ -1949,8 +1944,14 @@ class clickitem(QWidget):
|
||||
self.maskshowfileexists.setStyleSheet(f"background-color:{c};")
|
||||
self.bottommask = QLabel(self)
|
||||
self.bottommask.setStyleSheet("background-color: rgba(255,255,255, 0);")
|
||||
_ = QLabel(self)
|
||||
_.setStyleSheet(
|
||||
"""background-color: rgba(255,255,255, 0);border-bottom: 1px solid black;"""
|
||||
)
|
||||
self.bottomline = _
|
||||
size = 40
|
||||
_ = QLabel()
|
||||
_.setFixedSize(QSize(40, 40))
|
||||
_.setFixedSize(QSize(size, size))
|
||||
_.setScaledContents(True)
|
||||
_.setStyleSheet("background-color: rgba(255,255,255, 0);")
|
||||
icon = getExeIcon(exe, icon=False, cache=True)
|
||||
@ -1959,12 +1960,10 @@ class clickitem(QWidget):
|
||||
self.lay.addWidget(_)
|
||||
_ = QLabel(savehook_new_data[exe]["title"])
|
||||
_.setWordWrap(True)
|
||||
_.setFixedHeight(40)
|
||||
_.setFixedHeight(size + 1)
|
||||
self.lay.addWidget(_)
|
||||
self.setLayout(self.lay)
|
||||
_.setStyleSheet(
|
||||
"""background-color: rgba(255,255,255, 0);border-bottom: 1px solid black;"""
|
||||
)
|
||||
_.setStyleSheet("""background-color: rgba(255,255,255, 0);""")
|
||||
|
||||
|
||||
class pixwrapper(QWidget):
|
||||
@ -2010,8 +2009,10 @@ class dialog_savedgame_v3(saveposwindow):
|
||||
except:
|
||||
print_exc()
|
||||
|
||||
def itemfocuschanged(self, b, k):
|
||||
def itemfocuschanged(self, reflst, reftagid, b, k):
|
||||
|
||||
self.reflst = reflst
|
||||
self.reftagid = reftagid
|
||||
if b:
|
||||
self.currentfocuspath = k
|
||||
else:
|
||||
@ -2027,13 +2028,29 @@ class dialog_savedgame_v3(saveposwindow):
|
||||
if self.currentfocuspath:
|
||||
self.viewitem(k)
|
||||
|
||||
def newline(self, row, k, select):
|
||||
def delayitemcreater(self, k, select, reflst, reftagid):
|
||||
|
||||
item = clickitem(k)
|
||||
item.doubleclicked.connect(functools.partial(startgamecheck, self))
|
||||
item.focuschanged.connect(self.itemfocuschanged)
|
||||
item.focuschanged.connect(
|
||||
functools.partial(self.itemfocuschanged, reflst, reftagid)
|
||||
)
|
||||
if select:
|
||||
item.click()
|
||||
self.group0.insertw(row, item)
|
||||
return item
|
||||
|
||||
def newline(self, row, k, select):
|
||||
self.stack.w(self.calculatetagidx(self.reftagid)).insertw(
|
||||
row,
|
||||
functools.partial(
|
||||
self.delayitemcreater,
|
||||
k,
|
||||
select,
|
||||
self.reflst,
|
||||
self.reftagid,
|
||||
),
|
||||
41,
|
||||
)
|
||||
|
||||
def stack_showmenu(self, p):
|
||||
if not self.currentfocuspath:
|
||||
@ -2068,17 +2085,18 @@ class dialog_savedgame_v3(saveposwindow):
|
||||
globalconfig["gamemanageruseversion"] = 2
|
||||
self.setWindowTitle(_TR("游戏管理"))
|
||||
self.currentfocuspath = None
|
||||
self.reftagid = None
|
||||
self.reflst = None
|
||||
self.stack = stackedlist()
|
||||
self.stack.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||
self.stack.customContextMenuRequested.connect(self.stack_showmenu)
|
||||
self.stack.setFixedWidth(300)
|
||||
self.stack.bgclicked.connect(clickitem.clearfocus)
|
||||
w = QWidget()
|
||||
self.setCentralWidget(w)
|
||||
lay = QHBoxLayout()
|
||||
w.setLayout(lay)
|
||||
lay.addWidget(self.stack)
|
||||
self.group0 = shrinkableitem(QPushButton("GLOBAL"))
|
||||
self.stack.addw(self.group0)
|
||||
self.righttop = makesubtab_lazy()
|
||||
self.pixview = pixwrapper()
|
||||
_w = QWidget()
|
||||
@ -2100,8 +2118,8 @@ class dialog_savedgame_v3(saveposwindow):
|
||||
self.simplebutton("打开目录", True, self.clicked4, True)
|
||||
|
||||
if globalconfig["startgamenototop"]:
|
||||
self.simplebutton("Up", True, functools.partial(self.moverank, -1), False)
|
||||
self.simplebutton("Down", True, functools.partial(self.moverank, 1), False)
|
||||
self.simplebutton("上移", True, functools.partial(self.moverank, -1), False)
|
||||
self.simplebutton("下移", True, functools.partial(self.moverank, 1), False)
|
||||
self.simplebutton("添加游戏", False, self.clicked3, 1)
|
||||
self.simplebutton("批量添加", False, self.clicked3_batch, 1)
|
||||
self.simplebutton(
|
||||
@ -2109,24 +2127,132 @@ class dialog_savedgame_v3(saveposwindow):
|
||||
)
|
||||
|
||||
self.show()
|
||||
|
||||
for row, k in enumerate(savehook_new_list): # 2
|
||||
for i, tag in enumerate(savegametaged):
|
||||
# None
|
||||
# {
|
||||
# "title":xxx
|
||||
# "games":[]
|
||||
# }
|
||||
if tag is None:
|
||||
title = "GLOBAL"
|
||||
lst = savehook_new_list
|
||||
tagid = None
|
||||
opened = True
|
||||
else:
|
||||
lst = tag["games"]
|
||||
title = tag["title"]
|
||||
tagid = tag["uid"]
|
||||
opened = tag.get("opened", True)
|
||||
group0 = self.createtaglist(title, tagid, opened)
|
||||
self.stack.insertw(i, group0)
|
||||
for row, k in enumerate(lst):
|
||||
if globalconfig["hide_not_exists"]:
|
||||
if not os.path.exists(k):
|
||||
continue
|
||||
group0.insertw(
|
||||
row,
|
||||
functools.partial(
|
||||
self.delayitemcreater, k, i == 0 and row == 0, lst, tagid
|
||||
),
|
||||
41,
|
||||
)
|
||||
|
||||
self.newline(row, k, row == 0)
|
||||
def taglistrerank(self, tagid, dx):
|
||||
idx1 = self.calculatetagidx(tagid)
|
||||
|
||||
idx2 = (idx1 + dx) % len(savegametaged)
|
||||
savegametaged.insert(idx2, savegametaged.pop(idx1))
|
||||
self.stack.switchidx(idx1, idx2)
|
||||
|
||||
def calculatetagidx(self, tagid):
|
||||
i = 0
|
||||
for save in savegametaged:
|
||||
if save is None and tagid is None:
|
||||
break
|
||||
elif save and tagid and save["uid"] == tagid:
|
||||
break
|
||||
i += 1
|
||||
|
||||
return i
|
||||
|
||||
def tagbuttonmenu(self, tagid):
|
||||
self.currentfocuspath = None
|
||||
self.reftagid = tagid
|
||||
if tagid is None:
|
||||
self.reflst = savehook_new_list
|
||||
else:
|
||||
self.reflst = savegametaged[self.calculatetagidx(tagid)]["games"]
|
||||
menu = QMenu(self)
|
||||
addlist = QAction(_TR("添加列表"))
|
||||
dellist = QAction(_TR("删除列表"))
|
||||
Upaction = QAction(_TR("上移"))
|
||||
Downaction = QAction(_TR("下移"))
|
||||
addgame = QAction(_TR("添加游戏"))
|
||||
batchadd = QAction(_TR("批量添加"))
|
||||
|
||||
menu.addAction(Upaction)
|
||||
menu.addAction(Downaction)
|
||||
menu.addAction(addlist)
|
||||
if tagid:
|
||||
menu.addAction(dellist)
|
||||
menu.addAction(addgame)
|
||||
menu.addAction(batchadd)
|
||||
action = menu.exec(QCursor.pos())
|
||||
if action == addgame:
|
||||
self.clicked3()
|
||||
elif action == batchadd:
|
||||
self.clicked3_batch()
|
||||
elif action == Upaction:
|
||||
self.taglistrerank(tagid, -1)
|
||||
elif action == Downaction:
|
||||
self.taglistrerank(tagid, 1)
|
||||
elif action == addlist:
|
||||
_dia = Prompt_dialog(
|
||||
self,
|
||||
_TR("添加列表"),
|
||||
"",
|
||||
[
|
||||
[_TR("名称"), ""],
|
||||
],
|
||||
)
|
||||
|
||||
if _dia.exec():
|
||||
|
||||
title = _dia.text[0].text()
|
||||
if title != "":
|
||||
i = self.calculatetagidx(tagid)
|
||||
|
||||
tag = {
|
||||
"title": title,
|
||||
"games": [],
|
||||
"uid": str(uuid.uuid4()),
|
||||
"opened": True,
|
||||
}
|
||||
savegametaged.insert(i, tag)
|
||||
group0 = self.createtaglist(title, tag["uid"], True)
|
||||
|
||||
self.stack.insertw(i, group0)
|
||||
elif action == dellist:
|
||||
i = self.calculatetagidx(tagid)
|
||||
savegametaged.pop(i)
|
||||
self.stack.popw(i)
|
||||
|
||||
def createtaglist(self, title, tagid, opened):
|
||||
_btn = QPushButton(title)
|
||||
_btn.customContextMenuRequested
|
||||
_btn.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||
|
||||
_btn.customContextMenuRequested.connect(
|
||||
functools.partial(self.tagbuttonmenu, tagid)
|
||||
)
|
||||
return shrinkableitem(_btn, opened)
|
||||
|
||||
def moverank(self, dx):
|
||||
game = self.currentfocuspath
|
||||
|
||||
idx1 = savehook_new_list.index(game)
|
||||
idx2 = (idx1 + dx) % len(savehook_new_list)
|
||||
savehook_new_list[idx1], savehook_new_list[idx2] = (
|
||||
savehook_new_list[idx2],
|
||||
savehook_new_list[idx1],
|
||||
)
|
||||
self.group0.insertw(idx2, self.group0.popw(idx1))
|
||||
idx1 = self.reflst.index(game)
|
||||
idx2 = (idx1 + dx) % len(self.reflst)
|
||||
self.reflst.insert(idx2, self.reflst.pop(idx1))
|
||||
self.stack.w(self.calculatetagidx(self.reftagid)).switchidx(idx1, idx2)
|
||||
|
||||
def clicked2(self):
|
||||
if not self.currentfocuspath:
|
||||
@ -2134,22 +2260,26 @@ class dialog_savedgame_v3(saveposwindow):
|
||||
|
||||
try:
|
||||
game = self.currentfocuspath
|
||||
idx2 = savehook_new_list.index(game)
|
||||
self.group0.popw(idx2).deleteLater()
|
||||
removegame(game)
|
||||
|
||||
self.currentfocuspath = savehook_new_list[idx2]
|
||||
idx2 = self.reflst.index(game)
|
||||
group0 = self.stack.w(self.calculatetagidx(self.reftagid))
|
||||
group0.popw(idx2)
|
||||
self.reflst.pop(idx2)
|
||||
clickitem.clearfocus()
|
||||
try:
|
||||
group0.w(idx2).click()
|
||||
except:
|
||||
pass
|
||||
group0.w(0).click()
|
||||
except:
|
||||
print_exc()
|
||||
|
||||
def clicked4(self):
|
||||
opendir(self.currentfocuspath)
|
||||
|
||||
def clicked3_batch(self):
|
||||
addgamebatch(lambda res: self.newline(res, True, False))
|
||||
addgamebatch(lambda res: self.newline(res, True, False), self.reflst)
|
||||
|
||||
def clicked3(self):
|
||||
addgamesingle(lambda res: self.newline(0, res, True))
|
||||
addgamesingle(lambda res: self.newline(0, res, True), self.reflst)
|
||||
|
||||
def clicked(self):
|
||||
startgamecheck(self, self.currentfocuspath)
|
||||
|
@ -509,7 +509,7 @@ class hookselect(closeashidewindow):
|
||||
embedw, hlay = getformlayoutw(cls=QHBoxLayout)
|
||||
label = QLabel()
|
||||
hlay.addWidget(label)
|
||||
label.setStyleSheet("background-color: rgba(255, 255, 255, 0)")
|
||||
embedw.setStyleSheet("background-color: rgba(255, 255, 255, 0)")
|
||||
checkbtn = QPushButton()
|
||||
checkbtn.setSizePolicy(
|
||||
QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred
|
||||
|
@ -303,7 +303,7 @@ class FlowLayout(QLayout):
|
||||
return new_height
|
||||
|
||||
|
||||
class lazyscrollflow(QWidget):
|
||||
class lazyscrollflow(ScrollArea):
|
||||
bgclicked = pyqtSignal()
|
||||
|
||||
def mousePressEvent(self, _2) -> None:
|
||||
@ -317,13 +317,11 @@ class lazyscrollflow(QWidget):
|
||||
self._margin = self._spacing # 9
|
||||
self.lock = threading.Lock()
|
||||
self.internalwid = QWidget(self)
|
||||
self.qscrollarea = ScrollArea(self)
|
||||
self.qscrollarea.setWidgetResizable(True)
|
||||
self.qscrollarea.setWidget(self.internalwid)
|
||||
self.qscrollarea.scrolled.connect(lambda _: self.doshowlazywidget(True, _))
|
||||
self.setWidgetResizable(True)
|
||||
self.setWidget(self.internalwid)
|
||||
self.scrolled.connect(lambda _: self.doshowlazywidget(True, _))
|
||||
|
||||
def resizeEvent(self, a0: QResizeEvent) -> None:
|
||||
self.qscrollarea.resize(self.size())
|
||||
self.resizeandshow(False)
|
||||
return super().resizeEvent(a0)
|
||||
|
||||
@ -369,14 +367,8 @@ class lazyscrollflow(QWidget):
|
||||
@trypass
|
||||
def switchidx(self, idx1, idx2):
|
||||
with self.lock:
|
||||
self.widgets[idx1], self.widgets[idx2] = (
|
||||
self.widgets[idx2],
|
||||
self.widgets[idx1],
|
||||
)
|
||||
self.fakegeos[idx1], self.fakegeos[idx2] = (
|
||||
self.fakegeos[idx2],
|
||||
self.fakegeos[idx1],
|
||||
)
|
||||
self.widgets.insert(idx2, self.widgets.pop(idx1))
|
||||
self.fakegeos.insert(idx2, self.fakegeos.pop(idx1))
|
||||
self.resizeandshow()
|
||||
|
||||
@trypass
|
||||
@ -388,11 +380,6 @@ class lazyscrollflow(QWidget):
|
||||
idx = len(self.widgets)
|
||||
self.widgets.insert(idx, widfunc)
|
||||
self.fakegeos.insert(idx, QRect())
|
||||
|
||||
if isinstance(widfunc, QWidget):
|
||||
widfunc.setParent(self.internalwid)
|
||||
widfunc.adjustSize()
|
||||
widfunc.setVisible(True)
|
||||
if refresh:
|
||||
self.resizeandshow()
|
||||
|
||||
@ -401,6 +388,7 @@ class lazyscrollflow(QWidget):
|
||||
with self.lock:
|
||||
if idx >= 0 and idx < len(self.widgets):
|
||||
w = self.widgets[idx]
|
||||
if isinstance(w, QWidget):
|
||||
w.setParent(None)
|
||||
w.deleteLater()
|
||||
self.widgets.pop(idx)
|
||||
@ -423,8 +411,8 @@ class lazyscrollflow(QWidget):
|
||||
return self._spacing
|
||||
|
||||
def fakeresize(self):
|
||||
if self.qscrollarea.verticalScrollBar().isVisible():
|
||||
scrollw = self.qscrollarea.verticalScrollBar().width()
|
||||
if self.verticalScrollBar().isVisible():
|
||||
scrollw = self.verticalScrollBar().width()
|
||||
else:
|
||||
scrollw = 0
|
||||
with self.lock:
|
||||
@ -465,32 +453,114 @@ class lazyscrollflow(QWidget):
|
||||
return new_height
|
||||
|
||||
|
||||
class simplelistw(QWidget):
|
||||
def has_intersection(range1, range2):
|
||||
A1, B1 = range1
|
||||
C1, D1 = range2
|
||||
|
||||
return A1 <= C1 <= B1 or A1 <= D1 <= B1 or C1 <= A1 <= D1 or C1 <= B1 <= D1
|
||||
|
||||
|
||||
class delayloadvbox(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.lay = QVBoxLayout()
|
||||
self.lay.setContentsMargins(0, 0, 0, 0)
|
||||
self.lay.setSpacing(0)
|
||||
self.setLayout(self.lay)
|
||||
self.internal_itemH = []
|
||||
self.internal_widgets = []
|
||||
self.lock = threading.Lock()
|
||||
self.nowvisregion = QRect()
|
||||
|
||||
def addw(self, w):
|
||||
self.lay.addWidget(w)
|
||||
def resizeEvent(self, e: QResizeEvent):
|
||||
if e.oldSize().width() != e.size().width():
|
||||
with self.lock:
|
||||
for w in self.internal_widgets:
|
||||
if isinstance(w, QWidget):
|
||||
w.resize(self.width(), w.height())
|
||||
|
||||
def insertw(self, i, w):
|
||||
self.lay.insertWidget(i, w)
|
||||
def _dovisinternal(self, procevent, region: QRect):
|
||||
if region.isEmpty():
|
||||
return
|
||||
visrange = (region.y(), region.y() + region.height())
|
||||
ylastend = self.y()
|
||||
ydiff = self.y()
|
||||
needdos = []
|
||||
with self.lock:
|
||||
for i, h in enumerate(self.internal_itemH):
|
||||
ystart = ylastend
|
||||
yend = ystart + h
|
||||
ylastend = yend
|
||||
if isinstance(self.internal_widgets[i], QWidget):
|
||||
self.internal_widgets[i].move(0, ystart - ydiff)
|
||||
continue
|
||||
|
||||
if not has_intersection((ystart, yend), visrange):
|
||||
continue
|
||||
|
||||
widfunc = self.internal_widgets[i]
|
||||
if not widfunc:
|
||||
continue
|
||||
self.internal_widgets[i] = None
|
||||
needdos.append((i, widfunc, ystart - ydiff, h))
|
||||
for i, widfunc, ystart, h in needdos:
|
||||
try:
|
||||
with self.lock:
|
||||
widfunc = widfunc()
|
||||
widfunc.setParent(self)
|
||||
widfunc.setVisible(True)
|
||||
widfunc.move(0, ystart)
|
||||
widfunc.resize(self.width(), h)
|
||||
self.internal_widgets[i] = widfunc
|
||||
if procevent:
|
||||
QApplication.processEvents()
|
||||
except:
|
||||
print_exc()
|
||||
|
||||
self.nowvisregion = region
|
||||
|
||||
@trypass
|
||||
def switchidx(self, idx1, idx2):
|
||||
with self.lock:
|
||||
self.internal_widgets.insert(idx2, self.internal_widgets.pop(idx1))
|
||||
self.internal_itemH.insert(idx2, self.internal_itemH.pop(idx1))
|
||||
self._dovisinternal(False, self.nowvisregion)
|
||||
|
||||
def popw(self, i):
|
||||
return self.lay.takeAt(i).widget()
|
||||
with self.lock:
|
||||
if i >= 0 and i < self.len():
|
||||
w = self.internal_widgets[i]
|
||||
if isinstance(w, QWidget):
|
||||
w.setParent(None)
|
||||
w.deleteLater()
|
||||
self.internal_widgets.pop(i)
|
||||
self.internal_itemH.pop(i)
|
||||
self.setFixedHeight(sum(self.internal_itemH))
|
||||
|
||||
self._dovisinternal(False, self.nowvisregion)
|
||||
|
||||
def insertw(self, i, wf, height):
|
||||
refresh = True
|
||||
with self.lock:
|
||||
if i == -1:
|
||||
refresh = False
|
||||
i = self.len()
|
||||
self.internal_itemH.insert(i, height)
|
||||
self.internal_widgets.insert(i, wf)
|
||||
|
||||
self.setFixedHeight(sum(self.internal_itemH))
|
||||
|
||||
if refresh:
|
||||
self._dovisinternal(False, self.nowvisregion)
|
||||
|
||||
def w(self, i):
|
||||
return self.lay.itemAt(i).widget()
|
||||
_ = self.internal_widgets[i]
|
||||
if isinstance(_, QWidget):
|
||||
return _
|
||||
return None
|
||||
|
||||
def len(self):
|
||||
return self.lay.count()
|
||||
return len(self.internal_widgets)
|
||||
|
||||
|
||||
class shrinkableitem(QWidget):
|
||||
def __init__(self, shrinker: QPushButton):
|
||||
def __init__(self, shrinker: QPushButton, opened):
|
||||
super().__init__()
|
||||
self.lay = QVBoxLayout()
|
||||
# self.setSizePolicy(QSizePolicy.Policy.Expanding,QSizePolicy.Policy.Fixed)
|
||||
@ -498,25 +568,24 @@ class shrinkableitem(QWidget):
|
||||
self.lay.setContentsMargins(0, 0, 0, 0)
|
||||
self.lay.setSpacing(0)
|
||||
self.btn = shrinker
|
||||
self.items = simplelistw()
|
||||
self.items = delayloadvbox()
|
||||
self.btn.clicked.connect(self.Revert)
|
||||
self.lay.addWidget(self.btn)
|
||||
self.lay.addWidget(self.items)
|
||||
self.items.setVisible(opened)
|
||||
|
||||
def _dovisinternal(self, procevent, region: QRect):
|
||||
self.items._dovisinternal(procevent, region)
|
||||
|
||||
def Revert(self):
|
||||
self.items.setVisible(not self.items.isVisible())
|
||||
|
||||
def Show(self):
|
||||
self.items.show()
|
||||
@trypass
|
||||
def switchidx(self, idx1, idx2):
|
||||
self.items.switchidx(idx1, idx2)
|
||||
|
||||
def Hide(self):
|
||||
self.items.hide()
|
||||
|
||||
def addw(self, w):
|
||||
self.items.addw(w)
|
||||
|
||||
def insertw(self, i, w):
|
||||
self.items.insertw(i, w)
|
||||
def insertw(self, i, wf, height):
|
||||
self.items.insertw(i, wf, height)
|
||||
|
||||
def popw(self, i):
|
||||
return self.items.popw(i)
|
||||
@ -528,7 +597,16 @@ class shrinkableitem(QWidget):
|
||||
return self.items.len()
|
||||
|
||||
|
||||
class stackedlist(QScrollArea):
|
||||
class stackedlist(ScrollArea):
|
||||
bgclicked = pyqtSignal()
|
||||
|
||||
def mousePressEvent(self, _2) -> None:
|
||||
self.bgclicked.emit()
|
||||
|
||||
@trypass
|
||||
def resizeEvent(self, e: QResizeEvent):
|
||||
self.doshowlazywidget(False, self.internal.visibleRegion().rects()[0])
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setStyleSheet("""QScrollArea{background-color:transparent;border:0px}""")
|
||||
@ -540,19 +618,31 @@ class stackedlist(QScrollArea):
|
||||
self.lay.setSpacing(0)
|
||||
self.lay.setContentsMargins(0, 0, 0, 0)
|
||||
internal.setLayout(self.lay)
|
||||
self.widgets = []
|
||||
self.fakegeos = []
|
||||
self._spacing = 6
|
||||
self._margin = self._spacing # 9
|
||||
self.lock = threading.Lock()
|
||||
self.setWidgetResizable(True)
|
||||
self.setWidget(internal)
|
||||
self.internal = internal
|
||||
self.scrolled.connect(lambda _: self.doshowlazywidget(True, _))
|
||||
|
||||
def addw(self, w):
|
||||
self.lay.addWidget(w)
|
||||
def doshowlazywidget(self, procevent, region: QRect):
|
||||
for i in range(self.len()):
|
||||
self.w(i)._dovisinternal(procevent, region)
|
||||
|
||||
def insertw(self, i, w):
|
||||
def insertw(self, i, w: shrinkableitem):
|
||||
self.lay.insertWidget(i, w)
|
||||
|
||||
def popw(self, i):
|
||||
return self.lay.takeAt(i).widget()
|
||||
def popw(self, i) -> shrinkableitem:
|
||||
self.lay.takeAt(i).widget().deleteLater()
|
||||
|
||||
def w(self, i):
|
||||
def w(self, i) -> shrinkableitem:
|
||||
return self.lay.itemAt(i).widget()
|
||||
|
||||
def len(self):
|
||||
return self.lay.count()
|
||||
|
||||
def switchidx(self, i1, i2):
|
||||
self.lay.insertItem(i2, self.lay.takeAt(i1))
|
||||
|
@ -38,6 +38,7 @@ class mecab(basehira):
|
||||
for node, fields in self.kks.parse(
|
||||
text, codec
|
||||
): # self.kks.parseToNodeList(text):
|
||||
print(fields)
|
||||
kana = ""
|
||||
origorig = ""
|
||||
pos1 = fields[0]
|
||||
@ -53,7 +54,8 @@ class mecab(basehira):
|
||||
elif len(fields) == 9:
|
||||
kana = fields[8]
|
||||
origorig = fields[7]
|
||||
|
||||
elif len(fields) == 6: # 英文
|
||||
kana = origorig = node
|
||||
l = 0
|
||||
|
||||
while str(node) not in text[start : start + l]:
|
||||
@ -80,6 +82,7 @@ class mecab(basehira):
|
||||
extras = text[start:]
|
||||
if len(extras):
|
||||
result.append(
|
||||
{"orig": extras, "hira": extras, "cixing": '', "origorig": extras}
|
||||
{"orig": extras, "hira": extras, "cixing": "", "origorig": extras}
|
||||
)
|
||||
print(result)
|
||||
return result
|
||||
|
@ -49,6 +49,11 @@ except:
|
||||
savehook_new_list = []
|
||||
savehook_new_data = {}
|
||||
|
||||
try:
|
||||
savegametaged = _savehook[2]
|
||||
except:
|
||||
savegametaged = [None]
|
||||
|
||||
translatorsetting = tryreadconfig("translatorsetting.json")
|
||||
ocrsetting = tryreadconfig("ocrsetting.json")
|
||||
|
||||
@ -338,7 +343,8 @@ def saveallconfig():
|
||||
safesave("./userconfig/ocrsetting.json", ocrsetting)
|
||||
safesave("./userconfig/vndbtagdata.json", vndbtagdata)
|
||||
safesave(
|
||||
"./userconfig/savehook_new_1.39.4.json", [savehook_new_list, savehook_new_data]
|
||||
"./userconfig/savehook_new_1.39.4.json",
|
||||
[savehook_new_list, savehook_new_data, savegametaged],
|
||||
)
|
||||
safesave(
|
||||
"./files/lang/{}.json".format(getlanguse()),
|
||||
|
@ -196,13 +196,15 @@ def imgchangedtask(gamepath, res):
|
||||
savehook_new_data[gamepath]["isimagepathusersetted"] = True
|
||||
|
||||
|
||||
def checkifnewgame(gamepath, title=None):
|
||||
if gamepath not in savehook_new_list:
|
||||
savehook_new_list.insert(0, gamepath)
|
||||
def checkifnewgame(targetlist, gamepath, title=None):
|
||||
if gamepath in targetlist:
|
||||
return False
|
||||
targetlist.insert(0, gamepath)
|
||||
|
||||
if gamepath not in savehook_new_data:
|
||||
savehook_new_data[gamepath] = getdefaultsavehook(gamepath, title)
|
||||
searchvndbqueue.put((2, gamepath, None))
|
||||
|
||||
return True
|
||||
|
||||
kanjichs2ja = str.maketrans(static_data["kanjichs2ja"])
|
||||
|
||||
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "لا وقت العرض",
|
||||
"过滤历史重复": "تصفية التاريخ تكرار",
|
||||
"缓存条数": "عدد شرائط التخزين المؤقت",
|
||||
"腾讯OCR": "تينسنت التعرف الضوئي على الحروف"
|
||||
"腾讯OCR": "تينسنت التعرف الضوئي على الحروف",
|
||||
"添加列表": "إضافة قائمة",
|
||||
"删除列表": "حذف قائمة",
|
||||
"上移": "رفع",
|
||||
"下移": "نزولا"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "不顯示時間",
|
||||
"过滤历史重复": "過濾歷史重複",
|
||||
"缓存条数": "緩存條數",
|
||||
"腾讯OCR": "騰訊OCR"
|
||||
"腾讯OCR": "騰訊OCR",
|
||||
"添加列表": "添加清單",
|
||||
"删除列表": "删除清單",
|
||||
"上移": "上移",
|
||||
"下移": "下移"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Do not display time",
|
||||
"过滤历史重复": "Filter historical duplicates",
|
||||
"缓存条数": "Number of cache entries",
|
||||
"腾讯OCR": "Tencent OCR"
|
||||
"腾讯OCR": "Tencent OCR",
|
||||
"添加列表": "Add List",
|
||||
"删除列表": "Delete List",
|
||||
"上移": "Move Up",
|
||||
"下移": "Move Down"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "No muestra el tiempo",
|
||||
"过滤历史重复": "Filtrar repetición histórica",
|
||||
"缓存条数": "Número de barras de caché",
|
||||
"腾讯OCR": "Tencent OCR"
|
||||
"腾讯OCR": "Tencent OCR",
|
||||
"添加列表": "Añadir lista",
|
||||
"删除列表": "Eliminar lista",
|
||||
"上移": "Subir",
|
||||
"下移": "Bajar"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Ne pas afficher l'heure",
|
||||
"过滤历史重复": "Filtrer historique répétition",
|
||||
"缓存条数": "Nombre de barres de cache",
|
||||
"腾讯OCR": "OCR Tencent"
|
||||
"腾讯OCR": "OCR Tencent",
|
||||
"添加列表": "Ajouter une liste",
|
||||
"删除列表": "Supprimer une liste",
|
||||
"上移": "Déplacement vers le Haut",
|
||||
"下移": "Descendre"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Non visualizzare l'ora",
|
||||
"过滤历史重复": "Filtra duplicati storici",
|
||||
"缓存条数": "Numero di voci della cache",
|
||||
"腾讯OCR": "Tencent OCR"
|
||||
"腾讯OCR": "Tencent OCR",
|
||||
"添加列表": "Aggiungi elenco",
|
||||
"删除列表": "Elimina elenco",
|
||||
"上移": "Sposta su",
|
||||
"下移": "Sposta giù"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "時間を表示しない",
|
||||
"过滤历史重复": "フィルタ履歴の繰り返し",
|
||||
"缓存条数": "キャッシュ・エントリ数",
|
||||
"腾讯OCR": "テンセントOCR"
|
||||
"腾讯OCR": "テンセントOCR",
|
||||
"添加列表": "リストの追加",
|
||||
"删除列表": "リストの削除",
|
||||
"上移": "上へ移動",
|
||||
"下移": "下へ移動"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "시간 표시 안 함",
|
||||
"过滤历史重复": "반복된 기록 필터링",
|
||||
"缓存条数": "캐시 바 수",
|
||||
"腾讯OCR": "텐센트 OCR"
|
||||
"腾讯OCR": "텐센트 OCR",
|
||||
"添加列表": "목록 추가",
|
||||
"删除列表": "목록 삭제",
|
||||
"上移": "위로 이동",
|
||||
"下移": "아래로 이동"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Nie wyświetlaj czasu",
|
||||
"过滤历史重复": "Filtruj duplikaty historyczne",
|
||||
"缓存条数": "Liczba wpisów pamięci podręcznej",
|
||||
"腾讯OCR": "Dziesięć OCR"
|
||||
"腾讯OCR": "Dziesięć OCR",
|
||||
"添加列表": "Dodaj listę",
|
||||
"删除列表": "Usuń listę",
|
||||
"上移": "Przesuń się w górę",
|
||||
"下移": "Przesuń w dół"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Не показывать время",
|
||||
"过滤历史重复": "Фильтровать повторение истории",
|
||||
"缓存条数": "Количество кэшированных записей",
|
||||
"腾讯OCR": "Скачать OCR"
|
||||
"腾讯OCR": "Скачать OCR",
|
||||
"添加列表": "Добавить список",
|
||||
"删除列表": "Удалить список",
|
||||
"上移": "Переместить вверх",
|
||||
"下移": "Переместить вниз"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "ไม่แสดงเวลา",
|
||||
"过滤历史重复": "ประวัติการกรอง ทำซ้ำ",
|
||||
"缓存条数": "จำนวนแถบแคช",
|
||||
"腾讯OCR": "Tencent โอซีอาร์"
|
||||
"腾讯OCR": "Tencent โอซีอาร์",
|
||||
"添加列表": "เพิ่มรายการ",
|
||||
"删除列表": "ลบรายการ",
|
||||
"上移": "เลื่อนขึ้น",
|
||||
"下移": "เลื่อนลง"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Zamanı gösterme",
|
||||
"过滤历史重复": "Tarihi çizgileri sil",
|
||||
"缓存条数": "Cache girişlerinin sayısı",
|
||||
"腾讯OCR": "Tencent OCR"
|
||||
"腾讯OCR": "Tencent OCR",
|
||||
"添加列表": "Liste Ekle",
|
||||
"删除列表": "Listeyi sil",
|
||||
"上移": "Yukarı Taşı",
|
||||
"下移": "Aşağı taşın"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Не показувати час",
|
||||
"过滤历史重复": "Фільтрувати історичні дублікати",
|
||||
"缓存条数": "Кількість записів кешу",
|
||||
"腾讯OCR": "Похильний OCR"
|
||||
"腾讯OCR": "Похильний OCR",
|
||||
"添加列表": "Додати список",
|
||||
"删除列表": "Вилучити список",
|
||||
"上移": "Пересунути вгору",
|
||||
"下移": "Пересунути вниз"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "Không hiển thị thời gian",
|
||||
"过滤历史重复": "Lọc lịch sử lặp lại",
|
||||
"缓存条数": "Số thanh bộ nhớ cache",
|
||||
"腾讯OCR": "Thông tin OCR"
|
||||
"腾讯OCR": "Thông tin OCR",
|
||||
"添加列表": "Thêm danh sách",
|
||||
"删除列表": "Xoá danh sách",
|
||||
"上移": "Di chuyển lên",
|
||||
"下移": "Di chuyển xuống"
|
||||
}
|
@ -810,5 +810,9 @@
|
||||
"不显示时间": "",
|
||||
"过滤历史重复": "",
|
||||
"缓存条数": "",
|
||||
"腾讯OCR": ""
|
||||
"腾讯OCR": "",
|
||||
"添加列表": "",
|
||||
"删除列表": "",
|
||||
"上移": "",
|
||||
"下移": ""
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user