mirror of
https://github.com/HIllya51/LunaTranslator.git
synced 2024-12-29 00:24:13 +08:00
fix
This commit is contained in:
parent
8286514f3d
commit
10d8eabf03
@ -2,7 +2,7 @@ from qtsymbols import *
|
|||||||
import functools
|
import functools
|
||||||
from myutils.utils import checkencoding
|
from myutils.utils import checkencoding
|
||||||
from myutils.config import globalconfig, _TR, _TRL
|
from myutils.config import globalconfig, _TR, _TRL
|
||||||
from myutils.wrapper import Singleton
|
from myutils.wrapper import Singleton_close
|
||||||
from gui.usefulwidget import getspinbox, threebuttons, getlineedit, FocusCombo
|
from gui.usefulwidget import getspinbox, threebuttons, getlineedit, FocusCombo
|
||||||
|
|
||||||
nowsuppertcodes = _TRL(
|
nowsuppertcodes = _TRL(
|
||||||
@ -18,7 +18,7 @@ nowsuppertcodes = _TRL(
|
|||||||
nowsuppertcodespy = ["SHIFT-JIS", "GBK", "BIG5", "EUC-KR", "ASCII"]
|
nowsuppertcodespy = ["SHIFT-JIS", "GBK", "BIG5", "EUC-KR", "ASCII"]
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class codeacceptdialog(QDialog):
|
class codeacceptdialog(QDialog):
|
||||||
def _setcode_i(self, combox: QComboBox, itemsaver_, code="", idx=0):
|
def _setcode_i(self, combox: QComboBox, itemsaver_, code="", idx=0):
|
||||||
itemsaver_.saveidx = idx
|
itemsaver_.saveidx = idx
|
||||||
@ -76,7 +76,7 @@ class codeacceptdialog(QDialog):
|
|||||||
)
|
)
|
||||||
|
|
||||||
row += 1
|
row += 1
|
||||||
button = threebuttons()
|
button = threebuttons(texts=["添加行", "删除行", "立即应用"])
|
||||||
button.btn1clicked.connect(self.clicked1)
|
button.btn1clicked.connect(self.clicked1)
|
||||||
button.btn2clicked.connect(self.clicked2)
|
button.btn2clicked.connect(self.clicked2)
|
||||||
button.btn3clicked.connect(self.apply)
|
button.btn3clicked.connect(self.apply)
|
||||||
@ -122,8 +122,15 @@ class codeacceptdialog(QDialog):
|
|||||||
self.table.setIndexWidget(index, codecombox)
|
self.table.setIndexWidget(index, codecombox)
|
||||||
|
|
||||||
def clicked2(self):
|
def clicked2(self):
|
||||||
|
skip = []
|
||||||
|
for index in self.table.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
skip = reversed(sorted(skip))
|
||||||
|
|
||||||
self.model.removeRow(self.table.currentIndex().row())
|
for row in skip:
|
||||||
|
self.model.removeRow(row)
|
||||||
|
|
||||||
def apply(self):
|
def apply(self):
|
||||||
|
|
||||||
|
@ -16,12 +16,19 @@ from myutils.config import (
|
|||||||
static_data,
|
static_data,
|
||||||
)
|
)
|
||||||
from myutils.hwnd import getExeIcon
|
from myutils.hwnd import getExeIcon
|
||||||
from myutils.wrapper import Singleton_close, Singleton, threader, tryprint
|
from myutils.wrapper import (
|
||||||
|
Singleton_close,
|
||||||
|
Singleton,
|
||||||
|
threader,
|
||||||
|
tryprint,
|
||||||
|
Singleton_close,
|
||||||
|
)
|
||||||
from myutils.utils import (
|
from myutils.utils import (
|
||||||
checkifnewgame,
|
checkifnewgame,
|
||||||
str2rgba,
|
str2rgba,
|
||||||
gamdidchangedtask,
|
gamdidchangedtask,
|
||||||
titlechangedtask,
|
titlechangedtask,
|
||||||
|
idtypecheck,
|
||||||
selectdebugfile,
|
selectdebugfile,
|
||||||
targetmod,
|
targetmod,
|
||||||
)
|
)
|
||||||
@ -707,8 +714,9 @@ class dialog_setting_game_internal(QWidget):
|
|||||||
if globalconfig["metadata"][key]["idtype"] == 0:
|
if globalconfig["metadata"][key]["idtype"] == 0:
|
||||||
vndbid.setValidator(QIntValidator())
|
vndbid.setValidator(QIntValidator())
|
||||||
vndbid.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
|
vndbid.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
|
||||||
|
|
||||||
vndbid.textEdited.connect(
|
vndbid.textEdited.connect(
|
||||||
functools.partial(savehook_new_data[gameuid].__setitem__, idname)
|
functools.partial(idtypecheck, key, idname, gameuid)
|
||||||
)
|
)
|
||||||
vndbid.returnPressed.connect(
|
vndbid.returnPressed.connect(
|
||||||
functools.partial(gamdidchangedtask, key, idname, gameuid)
|
functools.partial(gamdidchangedtask, key, idname, gameuid)
|
||||||
@ -729,7 +737,9 @@ class dialog_setting_game_internal(QWidget):
|
|||||||
__settting = targetmod[key].querysettingwindow
|
__settting = targetmod[key].querysettingwindow
|
||||||
_vbox_internal.insert(
|
_vbox_internal.insert(
|
||||||
1,
|
1,
|
||||||
getIconButton(functools.partial(__settting, self), icon="fa.gear"),
|
getIconButton(
|
||||||
|
functools.partial(__settting, self, gameuid), icon="fa.gear"
|
||||||
|
),
|
||||||
)
|
)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
@ -1149,9 +1159,16 @@ class dialog_setting_game_internal(QWidget):
|
|||||||
): # 2
|
): # 2
|
||||||
self.__checkaddnewmethod(row, k)
|
self.__checkaddnewmethod(row, k)
|
||||||
vbox.addWidget(table)
|
vbox.addWidget(table)
|
||||||
buttons = threebuttons(btns=2, texts=_TRL(["添加行", "删除行"]))
|
buttons = threebuttons(texts=["添加行", "删除行", "上移", "下移"])
|
||||||
buttons.btn1clicked.connect(self.__privatetextproc_btn1)
|
buttons.btn1clicked.connect(self.__privatetextproc_btn1)
|
||||||
buttons.btn2clicked.connect(self.__privatetextproc_btn2)
|
buttons.btn2clicked.connect(self.removerows)
|
||||||
|
buttons.btn3clicked.connect(
|
||||||
|
functools.partial(self.__privatetextproc_moverank, -1)
|
||||||
|
)
|
||||||
|
buttons.btn4clicked.connect(
|
||||||
|
functools.partial(self.__privatetextproc_moverank, 1)
|
||||||
|
)
|
||||||
|
vbox.addWidget(buttons)
|
||||||
vbox.addWidget(buttons)
|
vbox.addWidget(buttons)
|
||||||
return _w
|
return _w
|
||||||
|
|
||||||
@ -1218,6 +1235,25 @@ class dialog_setting_game_internal(QWidget):
|
|||||||
btn,
|
btn,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def removerows(self):
|
||||||
|
|
||||||
|
skip = []
|
||||||
|
for index in self.__textprocinternaltable.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
skip = reversed(sorted(skip))
|
||||||
|
|
||||||
|
for row in skip:
|
||||||
|
self.__textprocinternalmodel.removeRow(row)
|
||||||
|
_dict = savehook_new_data[self.__privatetextproc_gameuid][
|
||||||
|
"save_text_process_info"
|
||||||
|
]
|
||||||
|
post = _dict["rank"][row]
|
||||||
|
_dict["rank"].pop(row)
|
||||||
|
if post in _dict["postprocessconfig"]:
|
||||||
|
_dict["postprocessconfig"].pop(post)
|
||||||
|
|
||||||
def __privatetextproc_btn2(self):
|
def __privatetextproc_btn2(self):
|
||||||
row = self.__textprocinternaltable.currentIndex().row()
|
row = self.__textprocinternaltable.currentIndex().row()
|
||||||
if row < 0:
|
if row < 0:
|
||||||
@ -1475,7 +1511,7 @@ class dialog_setting_game(QDialog):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class dialog_syssetting(QDialog):
|
class dialog_syssetting(QDialog):
|
||||||
|
|
||||||
def __init__(self, parent, type_=1) -> None:
|
def __init__(self, parent, type_=1) -> None:
|
||||||
@ -2491,6 +2527,50 @@ class pixwrapper(QWidget):
|
|||||||
self.pixview.setPixmap(pix)
|
self.pixview.setPixmap(pix)
|
||||||
|
|
||||||
|
|
||||||
|
def getalistname(parent, callback, skipid=False, skipidid=None):
|
||||||
|
__d = {"k": 0}
|
||||||
|
|
||||||
|
__vis = []
|
||||||
|
__uid = []
|
||||||
|
for _ in savegametaged:
|
||||||
|
if _ is None:
|
||||||
|
__vis.append("GLOBAL")
|
||||||
|
__uid.append(None)
|
||||||
|
else:
|
||||||
|
__vis.append(_["title"])
|
||||||
|
__uid.append(_["uid"])
|
||||||
|
if skipid:
|
||||||
|
if skipidid == __uid[-1]:
|
||||||
|
__uid.pop(-1)
|
||||||
|
__vis.pop(-1)
|
||||||
|
|
||||||
|
def __wrap(callback, __d, __uid):
|
||||||
|
if len(__uid) == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
uid = __uid[__d["k"]]
|
||||||
|
callback(uid)
|
||||||
|
|
||||||
|
autoinitdialog(
|
||||||
|
parent,
|
||||||
|
_TR("目标"),
|
||||||
|
600,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "combo",
|
||||||
|
"name": _TR("目标"),
|
||||||
|
"d": __d,
|
||||||
|
"k": "k",
|
||||||
|
"list": __vis,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "okcancel",
|
||||||
|
"callback": functools.partial(__wrap, callback, __d, __uid),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class dialog_savedgame_v3(QWidget):
|
class dialog_savedgame_v3(QWidget):
|
||||||
def viewitem(self, k):
|
def viewitem(self, k):
|
||||||
try:
|
try:
|
||||||
@ -2597,12 +2677,8 @@ class dialog_savedgame_v3(QWidget):
|
|||||||
if curr and os.path.exists(curr):
|
if curr and os.path.exists(curr):
|
||||||
savehook_new_data[self.currentfocusuid]["currentmainimage"] = curr
|
savehook_new_data[self.currentfocusuid]["currentmainimage"] = curr
|
||||||
|
|
||||||
def addtolistcallback(self, __d, __uid, gameuid):
|
def addtolistcallback(self, uid, gameuid):
|
||||||
|
|
||||||
if len(__uid) == 0:
|
|
||||||
return
|
|
||||||
|
|
||||||
uid = __uid[__d["k"]]
|
|
||||||
__save = self.reftagid
|
__save = self.reftagid
|
||||||
self.reftagid = uid
|
self.reftagid = uid
|
||||||
|
|
||||||
@ -2616,39 +2692,11 @@ class dialog_savedgame_v3(QWidget):
|
|||||||
self.reftagid = __save
|
self.reftagid = __save
|
||||||
|
|
||||||
def addtolist(self):
|
def addtolist(self):
|
||||||
__d = {"k": 0}
|
getalistname(
|
||||||
|
|
||||||
__vis = []
|
|
||||||
__uid = []
|
|
||||||
for _ in savegametaged:
|
|
||||||
if _ is None:
|
|
||||||
__vis.append("GLOBAL")
|
|
||||||
__uid.append(None)
|
|
||||||
else:
|
|
||||||
__vis.append(_["title"])
|
|
||||||
__uid.append(_["uid"])
|
|
||||||
if self.reftagid == __uid[-1]:
|
|
||||||
__uid.pop(-1)
|
|
||||||
__vis.pop(-1)
|
|
||||||
autoinitdialog(
|
|
||||||
self,
|
self,
|
||||||
_TR("目标"),
|
lambda x: self.addtolistcallback(x, self.currentfocusuid),
|
||||||
600,
|
True,
|
||||||
[
|
self.reftagid,
|
||||||
{
|
|
||||||
"type": "combo",
|
|
||||||
"name": _TR("目标"),
|
|
||||||
"d": __d,
|
|
||||||
"k": "k",
|
|
||||||
"list": __vis,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "okcancel",
|
|
||||||
"callback": functools.partial(
|
|
||||||
self.addtolistcallback, __d, __uid, self.currentfocusuid
|
|
||||||
),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def directshow(self):
|
def directshow(self):
|
||||||
|
@ -4,7 +4,7 @@ from traceback import print_exc
|
|||||||
import qtawesome
|
import qtawesome
|
||||||
from myutils.config import globalconfig, _TR, _TRL
|
from myutils.config import globalconfig, _TR, _TRL
|
||||||
from myutils.utils import makehtml
|
from myutils.utils import makehtml
|
||||||
from myutils.wrapper import Singleton
|
from myutils.wrapper import Singleton_close
|
||||||
from gui.usefulwidget import (
|
from gui.usefulwidget import (
|
||||||
MySwitch,
|
MySwitch,
|
||||||
selectcolor,
|
selectcolor,
|
||||||
@ -18,7 +18,7 @@ from gui.usefulwidget import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class noundictconfigdialog1(QDialog):
|
class noundictconfigdialog1(QDialog):
|
||||||
def newline(self, row, item):
|
def newline(self, row, item):
|
||||||
self.model.insertRow(
|
self.model.insertRow(
|
||||||
@ -29,6 +29,41 @@ class noundictconfigdialog1(QDialog):
|
|||||||
self.model.index(row, 0), getsimpleswitch(item, "regex")
|
self.model.index(row, 0), getsimpleswitch(item, "regex")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def showmenu(self, table: QTableView, _):
|
||||||
|
r = table.currentIndex().row()
|
||||||
|
if r < 0:
|
||||||
|
return
|
||||||
|
menu = QMenu(table)
|
||||||
|
up = QAction(_TR("上移"))
|
||||||
|
down = QAction(_TR("下移"))
|
||||||
|
menu.addAction(up)
|
||||||
|
menu.addAction(down)
|
||||||
|
action = menu.exec(table.cursor().pos())
|
||||||
|
|
||||||
|
if action == up:
|
||||||
|
|
||||||
|
self.moverank(table, -1)
|
||||||
|
|
||||||
|
elif action == down:
|
||||||
|
self.moverank(table, 1)
|
||||||
|
|
||||||
|
def moverank(self, table: QTableView, dy):
|
||||||
|
curr = table.currentIndex()
|
||||||
|
model = table.model()
|
||||||
|
target = (curr.row() + dy) % model.rowCount()
|
||||||
|
texts = [model.item(curr.row(), i).text() for i in range(model.columnCount())]
|
||||||
|
|
||||||
|
item = self.reflist.pop(curr.row())
|
||||||
|
self.reflist.insert(
|
||||||
|
target, {"key": texts[1], "value": [2], "regex": item["regex"]}
|
||||||
|
)
|
||||||
|
model.removeRow(curr.row())
|
||||||
|
model.insertRow(target, [QStandardItem(text) for text in texts])
|
||||||
|
table.setCurrentIndex(model.index(target, curr.column()))
|
||||||
|
table.setIndexWidget(
|
||||||
|
model.index(target, 0), getsimpleswitch(self.reflist[target], "regex")
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, parent, reflist, title, label) -> None:
|
def __init__(self, parent, reflist, title, label) -> None:
|
||||||
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
||||||
|
|
||||||
@ -47,6 +82,10 @@ class noundictconfigdialog1(QDialog):
|
|||||||
table.horizontalHeader().setSectionResizeMode(
|
table.horizontalHeader().setSectionResizeMode(
|
||||||
0, QHeaderView.ResizeMode.ResizeToContents
|
0, QHeaderView.ResizeMode.ResizeToContents
|
||||||
)
|
)
|
||||||
|
table.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||||
|
table.customContextMenuRequested.connect(
|
||||||
|
functools.partial(self.showmenu, table)
|
||||||
|
)
|
||||||
|
|
||||||
self.table = table
|
self.table = table
|
||||||
for row, item in enumerate(reflist):
|
for row, item in enumerate(reflist):
|
||||||
@ -74,7 +113,7 @@ class noundictconfigdialog1(QDialog):
|
|||||||
button4.clicked.connect(clicked4)
|
button4.clicked.connect(clicked4)
|
||||||
search.addWidget(button4)
|
search.addWidget(button4)
|
||||||
|
|
||||||
button = threebuttons()
|
button = threebuttons(texts=["添加行", "删除行", "上移", "下移", "立即应用"])
|
||||||
|
|
||||||
def clicked1():
|
def clicked1():
|
||||||
self.reflist.insert(0, {"key": "", "value": "", "regex": False})
|
self.reflist.insert(0, {"key": "", "value": "", "regex": False})
|
||||||
@ -83,15 +122,26 @@ class noundictconfigdialog1(QDialog):
|
|||||||
button.btn1clicked.connect(clicked1)
|
button.btn1clicked.connect(clicked1)
|
||||||
|
|
||||||
def clicked2():
|
def clicked2():
|
||||||
self.model.removeRow(table.currentIndex().row())
|
skip = []
|
||||||
self.reflist.pop(table.currentIndex().row())
|
for index in self.table.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
skip = reversed(sorted(skip))
|
||||||
|
|
||||||
|
for row in skip:
|
||||||
|
self.model.removeRow(row)
|
||||||
|
self.reflist.pop(row)
|
||||||
|
|
||||||
button.btn2clicked.connect(clicked2)
|
button.btn2clicked.connect(clicked2)
|
||||||
button.btn3clicked.connect(self.apply)
|
button.btn5clicked.connect(self.apply)
|
||||||
|
button.btn3clicked.connect(functools.partial(self.moverank, table, -1))
|
||||||
|
button.btn4clicked.connect(functools.partial(self.moverank, table, 1))
|
||||||
self.button = button
|
self.button = button
|
||||||
formLayout.addWidget(table)
|
formLayout.addWidget(table)
|
||||||
formLayout.addLayout(search)
|
formLayout.addLayout(search)
|
||||||
formLayout.addWidget(button)
|
formLayout.addWidget(button)
|
||||||
|
|
||||||
self.resize(QSize(600, 400))
|
self.resize(QSize(600, 400))
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
@ -115,7 +165,7 @@ class noundictconfigdialog1(QDialog):
|
|||||||
self.apply()
|
self.apply()
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class regexedit(QDialog):
|
class regexedit(QDialog):
|
||||||
def __init__(self, parent, regexlist) -> None:
|
def __init__(self, parent, regexlist) -> None:
|
||||||
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
||||||
@ -135,7 +185,7 @@ class regexedit(QDialog):
|
|||||||
for row, regex in enumerate(regexlist):
|
for row, regex in enumerate(regexlist):
|
||||||
self.model.insertRow(row, [QStandardItem(regex)])
|
self.model.insertRow(row, [QStandardItem(regex)])
|
||||||
|
|
||||||
button = threebuttons()
|
button = threebuttons(texts=["添加行", "删除行", "立即应用"])
|
||||||
|
|
||||||
def clicked1():
|
def clicked1():
|
||||||
regexlist.insert(0, "")
|
regexlist.insert(0, "")
|
||||||
@ -144,9 +194,16 @@ class regexedit(QDialog):
|
|||||||
button.btn1clicked.connect(clicked1)
|
button.btn1clicked.connect(clicked1)
|
||||||
|
|
||||||
def clicked2():
|
def clicked2():
|
||||||
self.model.removeRow(table.currentIndex().row())
|
skip = []
|
||||||
regexlist.pop(table.currentIndex().row())
|
for index in self.table.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
skip = reversed(sorted(skip))
|
||||||
|
|
||||||
|
for row in skip:
|
||||||
|
self.model.removeRow(row)
|
||||||
|
regexlist.pop(row)
|
||||||
button.btn2clicked.connect(clicked2)
|
button.btn2clicked.connect(clicked2)
|
||||||
button.btn3clicked.connect(self.apply)
|
button.btn3clicked.connect(self.apply)
|
||||||
self.button = button
|
self.button = button
|
||||||
@ -157,17 +214,21 @@ class regexedit(QDialog):
|
|||||||
|
|
||||||
def apply(self):
|
def apply(self):
|
||||||
rows = self.model.rowCount()
|
rows = self.model.rowCount()
|
||||||
rowoffset = 0
|
|
||||||
dedump = set()
|
dedump = set()
|
||||||
|
needremoves = []
|
||||||
for row in range(rows):
|
for row in range(rows):
|
||||||
regex = self.model.item(row, 0).text()
|
regex = self.model.item(row, 0).text()
|
||||||
if regex == "" or regex in dedump:
|
if regex == "" or regex in dedump:
|
||||||
self.regexlist.pop(row - rowoffset)
|
needremoves.append(row)
|
||||||
rowoffset += 1
|
|
||||||
continue
|
continue
|
||||||
self.regexlist[row - rowoffset] = regex
|
|
||||||
|
self.regexlist[row] = regex
|
||||||
dedump.add(regex)
|
dedump.add(regex)
|
||||||
|
|
||||||
|
for row in reversed(needremoves):
|
||||||
|
self.model.removeRow(row)
|
||||||
|
self.regexlist.pop(row)
|
||||||
|
|
||||||
def closeEvent(self, _) -> None:
|
def closeEvent(self, _) -> None:
|
||||||
self.button.setFocus()
|
self.button.setFocus()
|
||||||
self.apply()
|
self.apply()
|
||||||
@ -185,7 +246,7 @@ def autoinitdialog_items(dic):
|
|||||||
return items
|
return items
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class autoinitdialog(QDialog):
|
class autoinitdialog(QDialog):
|
||||||
def __init__(self, parent, title, width, lines, _=None) -> None:
|
def __init__(self, parent, title, width, lines, _=None) -> None:
|
||||||
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
||||||
@ -329,7 +390,7 @@ def getsomepath1(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class multicolorset(QDialog):
|
class multicolorset(QDialog):
|
||||||
def __init__(self, parent) -> None:
|
def __init__(self, parent) -> None:
|
||||||
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
||||||
@ -382,7 +443,7 @@ class multicolorset(QDialog):
|
|||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class postconfigdialog_(QDialog):
|
class postconfigdialog_(QDialog):
|
||||||
def closeEvent(self, a0: QCloseEvent) -> None:
|
def closeEvent(self, a0: QCloseEvent) -> None:
|
||||||
if self.closeevent:
|
if self.closeevent:
|
||||||
@ -426,7 +487,7 @@ class postconfigdialog_(QDialog):
|
|||||||
table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
||||||
# table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
|
# table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
|
||||||
# table.clicked.connect(self.show_info)
|
# table.clicked.connect(self.show_info)
|
||||||
button = threebuttons()
|
button = threebuttons(texts=["添加行", "删除行", "立即应用"])
|
||||||
|
|
||||||
def clicked1():
|
def clicked1():
|
||||||
model.insertRow(0, [QStandardItem(), QStandardItem()])
|
model.insertRow(0, [QStandardItem(), QStandardItem()])
|
||||||
@ -434,8 +495,15 @@ class postconfigdialog_(QDialog):
|
|||||||
button.btn1clicked.connect(clicked1)
|
button.btn1clicked.connect(clicked1)
|
||||||
|
|
||||||
def clicked2():
|
def clicked2():
|
||||||
|
skip = []
|
||||||
|
for index in table.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
skip = reversed(sorted(skip))
|
||||||
|
|
||||||
model.removeRow(table.currentIndex().row())
|
for row in skip:
|
||||||
|
model.removeRow(row)
|
||||||
|
|
||||||
button.btn2clicked.connect(clicked2)
|
button.btn2clicked.connect(clicked2)
|
||||||
button.btn3clicked.connect(self.apply)
|
button.btn3clicked.connect(self.apply)
|
||||||
|
@ -8,8 +8,8 @@ from webviewpy import (
|
|||||||
declare_library_path,
|
declare_library_path,
|
||||||
)
|
)
|
||||||
from winsharedutils import HTMLBrowser
|
from winsharedutils import HTMLBrowser
|
||||||
from myutils.config import _TR, globalconfig
|
from myutils.config import _TR, globalconfig, _TRL
|
||||||
from myutils.wrapper import Singleton, Singleton_close, tryprint
|
from myutils.wrapper import Singleton_close, tryprint
|
||||||
from myutils.utils import nowisdark, checkportavailable
|
from myutils.utils import nowisdark, checkportavailable
|
||||||
|
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ class FocusDoubleSpin(QDoubleSpinBox):
|
|||||||
return super().wheelEvent(e)
|
return super().wheelEvent(e)
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class dialog_showinfo(QDialog):
|
class dialog_showinfo(QDialog):
|
||||||
|
|
||||||
def __init__(self, parent, title, info) -> None:
|
def __init__(self, parent, title, info) -> None:
|
||||||
@ -1277,34 +1277,41 @@ class threebuttons(QWidget):
|
|||||||
btn1clicked = pyqtSignal()
|
btn1clicked = pyqtSignal()
|
||||||
btn2clicked = pyqtSignal()
|
btn2clicked = pyqtSignal()
|
||||||
btn3clicked = pyqtSignal()
|
btn3clicked = pyqtSignal()
|
||||||
|
btn4clicked = pyqtSignal()
|
||||||
|
btn5clicked = pyqtSignal()
|
||||||
|
|
||||||
def __init__(self, btns=3, texts=None):
|
def __init__(self, texts=None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
layout = QHBoxLayout()
|
layout = QHBoxLayout()
|
||||||
layout.setContentsMargins(0, 0, 0, 0)
|
layout.setContentsMargins(0, 0, 0, 0)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
button = QPushButton(self)
|
texts = _TRL(texts)
|
||||||
if texts:
|
if len(texts) >= 1:
|
||||||
|
button = QPushButton(self)
|
||||||
button.setText(texts[0])
|
button.setText(texts[0])
|
||||||
else:
|
button.clicked.connect(self.btn1clicked)
|
||||||
button.setText(_TR("添加行"))
|
layout.addWidget(button)
|
||||||
button.clicked.connect(self.btn1clicked)
|
if len(texts) >= 2:
|
||||||
button2 = QPushButton(self)
|
button2 = QPushButton(self)
|
||||||
if texts:
|
|
||||||
button2.setText(texts[1])
|
button2.setText(texts[1])
|
||||||
else:
|
button2.clicked.connect(self.btn2clicked)
|
||||||
button2.setText(_TR("删除行"))
|
|
||||||
button2.clicked.connect(self.btn2clicked)
|
layout.addWidget(button2)
|
||||||
layout.addWidget(button)
|
if len(texts) >= 3:
|
||||||
layout.addWidget(button2)
|
|
||||||
if btns == 3:
|
|
||||||
button3 = QPushButton(self)
|
button3 = QPushButton(self)
|
||||||
if texts:
|
button3.setText(texts[2])
|
||||||
button3.setText(texts[2])
|
|
||||||
else:
|
|
||||||
button3.setText(_TR("立即应用"))
|
|
||||||
button3.clicked.connect(self.btn3clicked)
|
button3.clicked.connect(self.btn3clicked)
|
||||||
layout.addWidget(button3)
|
layout.addWidget(button3)
|
||||||
|
if len(texts) >= 4:
|
||||||
|
button4 = QPushButton(self)
|
||||||
|
button4.setText(texts[3])
|
||||||
|
button4.clicked.connect(self.btn4clicked)
|
||||||
|
layout.addWidget(button4)
|
||||||
|
if len(texts) >= 5:
|
||||||
|
button5 = QPushButton(self)
|
||||||
|
button5.setText(texts[4])
|
||||||
|
button5.clicked.connect(self.btn5clicked)
|
||||||
|
layout.addWidget(button5)
|
||||||
|
|
||||||
|
|
||||||
def tabadd_lazy(tab, title, getrealwidgetfunction):
|
def tabadd_lazy(tab, title, getrealwidgetfunction):
|
||||||
@ -1534,7 +1541,8 @@ def makesubtab_lazy(
|
|||||||
@Singleton_close
|
@Singleton_close
|
||||||
class listediter(QDialog):
|
class listediter(QDialog):
|
||||||
def showmenu(self, p: QPoint):
|
def showmenu(self, p: QPoint):
|
||||||
r = self.hctable.currentIndex().row()
|
curr = self.hctable.currentIndex()
|
||||||
|
r = curr.row()
|
||||||
if r < 0:
|
if r < 0:
|
||||||
return
|
return
|
||||||
menu = QMenu(self.hctable)
|
menu = QMenu(self.hctable)
|
||||||
@ -1549,15 +1557,10 @@ class listediter(QDialog):
|
|||||||
action = menu.exec(self.hctable.cursor().pos())
|
action = menu.exec(self.hctable.cursor().pos())
|
||||||
|
|
||||||
if action == remove:
|
if action == remove:
|
||||||
self.hcmodel.removeRow(self.hctable.currentIndex().row())
|
self.hcmodel.removeRow(curr.row())
|
||||||
|
|
||||||
elif action == copy:
|
elif action == copy:
|
||||||
winsharedutils.clipboard_set(
|
winsharedutils.clipboard_set(self.hcmodel.itemFromIndex(curr).text())
|
||||||
self.hcmodel.item(
|
|
||||||
self.hctable.currentIndex().row(),
|
|
||||||
self.hctable.currentIndex().column(),
|
|
||||||
).text()
|
|
||||||
)
|
|
||||||
|
|
||||||
elif action == up:
|
elif action == up:
|
||||||
|
|
||||||
@ -1567,12 +1570,12 @@ class listediter(QDialog):
|
|||||||
self.moverank(1)
|
self.moverank(1)
|
||||||
|
|
||||||
def moverank(self, dy):
|
def moverank(self, dy):
|
||||||
target = (self.hctable.currentIndex().row() + dy) % self.hcmodel.rowCount()
|
curr = self.hctable.currentIndex()
|
||||||
text = self.hcmodel.item(
|
target = (curr.row() + dy) % self.hcmodel.rowCount()
|
||||||
self.hctable.currentIndex().row(), self.hctable.currentIndex().column()
|
text = self.hcmodel.itemFromIndex(curr).text()
|
||||||
).text()
|
self.hcmodel.removeRow(curr.row())
|
||||||
self.hcmodel.removeRow(self.hctable.currentIndex().row())
|
|
||||||
self.hcmodel.insertRow(target, [QStandardItem(text)])
|
self.hcmodel.insertRow(target, [QStandardItem(text)])
|
||||||
|
self.hctable.setCurrentIndex(self.hcmodel.index(target, 0))
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, p, title, header, lst, closecallback=None, ispathsedit=None
|
self, p, title, header, lst, closecallback=None, ispathsedit=None
|
||||||
@ -1607,9 +1610,11 @@ class listediter(QDialog):
|
|||||||
self.hcmodel.insertRow(row, [QStandardItem(k)])
|
self.hcmodel.insertRow(row, [QStandardItem(k)])
|
||||||
formLayout = QVBoxLayout()
|
formLayout = QVBoxLayout()
|
||||||
formLayout.addWidget(self.hctable)
|
formLayout.addWidget(self.hctable)
|
||||||
self.buttons = threebuttons(btns=2)
|
self.buttons = threebuttons(texts=["添加行", "删除行", "上移", "下移"])
|
||||||
self.buttons.btn1clicked.connect(self.click1)
|
self.buttons.btn1clicked.connect(self.click1)
|
||||||
self.buttons.btn2clicked.connect(self.clicked2)
|
self.buttons.btn2clicked.connect(self.clicked2)
|
||||||
|
self.buttons.btn3clicked.connect(functools.partial(self.moverank, -1))
|
||||||
|
self.buttons.btn4clicked.connect(functools.partial(self.moverank, 1))
|
||||||
|
|
||||||
formLayout.addWidget(self.buttons)
|
formLayout.addWidget(self.buttons)
|
||||||
self.setLayout(formLayout)
|
self.setLayout(formLayout)
|
||||||
@ -1619,7 +1624,15 @@ class listediter(QDialog):
|
|||||||
print_exc()
|
print_exc()
|
||||||
|
|
||||||
def clicked2(self):
|
def clicked2(self):
|
||||||
self.hcmodel.removeRow(self.hctable.currentIndex().row())
|
skip = []
|
||||||
|
for index in self.hctable.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
skip = reversed(sorted(skip))
|
||||||
|
|
||||||
|
for row in skip:
|
||||||
|
self.hcmodel.removeRow(row)
|
||||||
|
|
||||||
def closeEvent(self, a0: QCloseEvent) -> None:
|
def closeEvent(self, a0: QCloseEvent) -> None:
|
||||||
self.buttons.setFocus()
|
self.buttons.setFocus()
|
||||||
|
@ -29,8 +29,8 @@ class common:
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def idname(self):
|
||||||
return self.config_all.get("name", self.typename)
|
return self.config_all['target']
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def proxy(self):
|
def proxy(self):
|
||||||
|
@ -1,11 +1,156 @@
|
|||||||
|
import requests
|
||||||
|
from myutils.config import (
|
||||||
|
_TR,
|
||||||
|
savehook_new_data,
|
||||||
|
)
|
||||||
|
from myutils.utils import initanewitem, gamdidchangedtask
|
||||||
|
import functools
|
||||||
|
import time
|
||||||
|
from qtsymbols import *
|
||||||
from metadata.abstract import common
|
from metadata.abstract import common
|
||||||
from gui.inputdialog import autoinitdialog, autoinitdialog_items
|
from gui.usefulwidget import getlineedit
|
||||||
|
from gui.dialog_savedgame import getreflist, getalistname
|
||||||
|
from myutils.wrapper import Singleton_close
|
||||||
|
|
||||||
|
|
||||||
|
@Singleton_close
|
||||||
|
class bgmsettings(QDialog):
|
||||||
|
|
||||||
|
@property
|
||||||
|
def headers(self):
|
||||||
|
return {
|
||||||
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
|
||||||
|
"Authorization": "Bearer " + self._ref.config["access-token"].strip(),
|
||||||
|
}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def username(self):
|
||||||
|
response = requests.get(
|
||||||
|
"https://api.bgm.tv/v0/me", headers=self.headers, proxies=self._ref.proxy
|
||||||
|
)
|
||||||
|
return response.json()["username"]
|
||||||
|
|
||||||
|
def querylist(self):
|
||||||
|
|
||||||
|
params = {
|
||||||
|
"subject_type": "4",
|
||||||
|
"limit": "30",
|
||||||
|
"offset": "0",
|
||||||
|
}
|
||||||
|
collectresults = []
|
||||||
|
response = requests.get(
|
||||||
|
f"https://api.bgm.tv/v0/users/{self.username}/collections",
|
||||||
|
params=params,
|
||||||
|
headers=self.headers,
|
||||||
|
proxies=self._ref.proxy,
|
||||||
|
)
|
||||||
|
for item in response.json()["data"]:
|
||||||
|
collectresults.append(
|
||||||
|
{"id": item["subject_id"], "name": item["subject"]["name"]}
|
||||||
|
)
|
||||||
|
return collectresults
|
||||||
|
|
||||||
|
def getalistname_download(self, uid):
|
||||||
|
|
||||||
|
reflist = getreflist(uid)
|
||||||
|
collectresults = self.querylist()
|
||||||
|
thislistvids = [
|
||||||
|
savehook_new_data[gameuid][self._ref.idname] for gameuid in reflist
|
||||||
|
]
|
||||||
|
collect = {}
|
||||||
|
for gameuid in savehook_new_data:
|
||||||
|
vid = savehook_new_data[gameuid][self._ref.idname]
|
||||||
|
collect[vid] = gameuid
|
||||||
|
|
||||||
|
for item in collectresults:
|
||||||
|
title = item["name"]
|
||||||
|
vid = item["id"]
|
||||||
|
if vid in thislistvids:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if vid in collect:
|
||||||
|
gameuid = collect[vid]
|
||||||
|
else:
|
||||||
|
gameuid = initanewitem(f"bgm_{vid}_{time.time()}", title)
|
||||||
|
savehook_new_data[gameuid][self._ref.idname] = vid
|
||||||
|
gamdidchangedtask(self._ref.typename, self._ref.idname, gameuid)
|
||||||
|
reflist.insert(0, gameuid)
|
||||||
|
|
||||||
|
def getalistname_upload(self, uid):
|
||||||
|
reflist = getreflist(uid)
|
||||||
|
vids = [item["id"] for item in self.querylist()]
|
||||||
|
|
||||||
|
for gameuid in reflist:
|
||||||
|
vid = savehook_new_data[gameuid][self._ref.idname]
|
||||||
|
if vid == 0:
|
||||||
|
continue
|
||||||
|
if vid in vids:
|
||||||
|
continue
|
||||||
|
|
||||||
|
requests.post(
|
||||||
|
f"https://api.bgm.tv/v0/users/-/collections/{vid}",
|
||||||
|
headers=self.headers,
|
||||||
|
json={
|
||||||
|
"type": 4,
|
||||||
|
# "rate": 10,
|
||||||
|
"comment": "string",
|
||||||
|
"private": True,
|
||||||
|
"tags": ["string"],
|
||||||
|
},
|
||||||
|
proxies=self._ref.proxy,
|
||||||
|
)
|
||||||
|
|
||||||
|
def singleupload_existsoverride(self, gameuid):
|
||||||
|
vid = savehook_new_data[gameuid][self._ref.idname]
|
||||||
|
if not vid:
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
requests.post(
|
||||||
|
f"https://api.bgm.tv/v0/users/-/collections/{vid}",
|
||||||
|
headers=self.headers,
|
||||||
|
json={
|
||||||
|
"type": 4,
|
||||||
|
# "rate": 10,
|
||||||
|
"comment": "string",
|
||||||
|
"private": True,
|
||||||
|
"tags": ["string"],
|
||||||
|
},
|
||||||
|
proxies=self._ref.proxy,
|
||||||
|
)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __getalistname(self, callback, _):
|
||||||
|
getalistname(self, callback)
|
||||||
|
|
||||||
|
def __init__(self, parent, _ref: common, gameuid: str) -> None:
|
||||||
|
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
||||||
|
self._ref = _ref
|
||||||
|
self.resize(QSize(800, 10))
|
||||||
|
self.setWindowTitle("vndb")
|
||||||
|
fl = QFormLayout(self)
|
||||||
|
fl.addRow("access-token", getlineedit(_ref.config, "access-token"))
|
||||||
|
btn = QPushButton(_TR("上传游戏"))
|
||||||
|
btn.clicked.connect(
|
||||||
|
functools.partial(self.singleupload_existsoverride, gameuid)
|
||||||
|
)
|
||||||
|
fl.addRow(btn)
|
||||||
|
btn = QPushButton(_TR("上传游戏列表"))
|
||||||
|
btn.clicked.connect(
|
||||||
|
functools.partial(self.__getalistname, self.getalistname_upload)
|
||||||
|
)
|
||||||
|
fl.addRow(btn)
|
||||||
|
btn = QPushButton(_TR("获取游戏列表"))
|
||||||
|
btn.clicked.connect(
|
||||||
|
functools.partial(self.__getalistname, self.getalistname_download)
|
||||||
|
)
|
||||||
|
fl.addRow(btn)
|
||||||
|
self.show()
|
||||||
|
|
||||||
|
|
||||||
class searcher(common):
|
class searcher(common):
|
||||||
def querysettingwindow(self, parent):
|
def querysettingwindow(self, parent, gameuid):
|
||||||
items = autoinitdialog_items(self.config_all)
|
bgmsettings(parent, self, gameuid)
|
||||||
autoinitdialog(parent, self.name, 800, items)
|
|
||||||
|
|
||||||
def getidbytitle(self, title):
|
def getidbytitle(self, title):
|
||||||
|
|
||||||
|
@ -1,103 +1,134 @@
|
|||||||
import requests, re, os
|
import requests, re
|
||||||
from myutils.config import tryreadconfig, safesave
|
from myutils.config import (
|
||||||
import gzip, json
|
tryreadconfig,
|
||||||
import shutil, gobject
|
safesave,
|
||||||
|
savegametaged,
|
||||||
|
_TR,
|
||||||
|
savehook_new_data,
|
||||||
|
)
|
||||||
|
from myutils.utils import initanewitem, gamdidchangedtask
|
||||||
|
import gzip, json, functools
|
||||||
|
import shutil, gobject, time
|
||||||
|
from qtsymbols import *
|
||||||
|
from gui.inputdialog import autoinitdialog
|
||||||
from metadata.abstract import common
|
from metadata.abstract import common
|
||||||
|
from gui.usefulwidget import getlineedit
|
||||||
|
from gui.dialog_savedgame import getreflist, getalistname
|
||||||
|
from myutils.wrapper import Singleton_close
|
||||||
|
|
||||||
|
|
||||||
def safegetvndbjson(proxy, url, json, getter):
|
def saferequestvndb(proxy, method, url, json=None, headers=None):
|
||||||
|
print(method, url, json)
|
||||||
try:
|
try:
|
||||||
print(url, json)
|
resp = requests.request(
|
||||||
_ = requests.post(
|
method,
|
||||||
url,
|
"https://api.vndb.org/kana/" + url,
|
||||||
|
headers=headers,
|
||||||
json=json,
|
json=json,
|
||||||
proxies=proxy,
|
proxies=proxy,
|
||||||
)
|
)
|
||||||
print(_.text)
|
|
||||||
try:
|
|
||||||
return getter(_.json())
|
|
||||||
except:
|
|
||||||
# print_exc()
|
|
||||||
return None
|
|
||||||
except:
|
except:
|
||||||
return None
|
time.sleep(3)
|
||||||
|
print("retry network error")
|
||||||
|
return saferequestvndb(proxy, method, url, json, headers)
|
||||||
|
if resp.status_code == 429:
|
||||||
|
time.sleep(3)
|
||||||
|
print("retry 429")
|
||||||
|
return saferequestvndb(proxy, method, url, json, headers)
|
||||||
|
elif resp.status_code == 400:
|
||||||
|
print(resp.text)
|
||||||
|
# 400 搜索失败
|
||||||
|
else:
|
||||||
|
if method.upper() in ["GET", "POST"]:
|
||||||
|
try:
|
||||||
|
return resp.json()
|
||||||
|
except:
|
||||||
|
print(resp.status_code)
|
||||||
|
print(resp.text)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def safegetvndbjson(proxy, url, json):
|
||||||
|
return saferequestvndb(proxy, "POST", url, json)
|
||||||
|
|
||||||
|
|
||||||
|
def gettitlefromjs(js):
|
||||||
|
try:
|
||||||
|
|
||||||
|
for _ in js["titles"]:
|
||||||
|
main = _["main"]
|
||||||
|
title = _["title"]
|
||||||
|
if main:
|
||||||
|
return title
|
||||||
|
|
||||||
|
raise Exception()
|
||||||
|
except:
|
||||||
|
return js["title"]
|
||||||
|
|
||||||
|
|
||||||
def gettitlebyid(proxy, vid):
|
def gettitlebyid(proxy, vid):
|
||||||
def _getter(js):
|
js = safegetvndbjson(
|
||||||
|
|
||||||
try:
|
|
||||||
|
|
||||||
for _ in js["results"][0]["titles"]:
|
|
||||||
main = _["main"]
|
|
||||||
title = _["title"]
|
|
||||||
if main:
|
|
||||||
return title
|
|
||||||
|
|
||||||
raise Exception()
|
|
||||||
except:
|
|
||||||
return js["results"][0]["title"]
|
|
||||||
|
|
||||||
return safegetvndbjson(
|
|
||||||
proxy,
|
proxy,
|
||||||
"https://api.vndb.org/kana/vn",
|
"vn",
|
||||||
{"filters": ["id", "=", vid], "fields": "title,titles.title,titles.main"},
|
{"filters": ["id", "=", vid], "fields": "title,titles.title,titles.main"},
|
||||||
_getter,
|
|
||||||
)
|
)
|
||||||
|
if js:
|
||||||
|
return gettitlefromjs(js["results"][0])
|
||||||
|
|
||||||
|
|
||||||
def getscreenshotsbyid(proxy, vid):
|
def getscreenshotsbyid(proxy, vid):
|
||||||
def _getter(js):
|
|
||||||
|
|
||||||
|
js = safegetvndbjson(
|
||||||
|
proxy, "vn", {"filters": ["id", "=", vid], "fields": "screenshots.url"}
|
||||||
|
)
|
||||||
|
if js:
|
||||||
___ = []
|
___ = []
|
||||||
for _ in js["results"][0]["screenshots"]:
|
for _ in js["results"][0]["screenshots"]:
|
||||||
url = _["url"]
|
url = _["url"]
|
||||||
___.append(url)
|
___.append(url)
|
||||||
return ___
|
return ___
|
||||||
|
|
||||||
return safegetvndbjson(
|
|
||||||
proxy,
|
|
||||||
"https://api.vndb.org/kana/vn",
|
|
||||||
{"filters": ["id", "=", vid], "fields": "screenshots.url"},
|
|
||||||
_getter,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def getimgbyid(proxy, vid):
|
def getimgbyid(proxy, vid):
|
||||||
return safegetvndbjson(
|
js = safegetvndbjson(
|
||||||
proxy,
|
proxy, "vn", {"filters": ["id", "=", vid], "fields": "image.url"}
|
||||||
"https://api.vndb.org/kana/vn",
|
|
||||||
{"filters": ["id", "=", vid], "fields": "image.url"},
|
|
||||||
lambda js: js["results"][0]["image"]["url"],
|
|
||||||
)
|
)
|
||||||
|
if js:
|
||||||
|
return js["results"][0]["image"]["url"]
|
||||||
|
|
||||||
|
|
||||||
def getvidbytitle_vn(proxy, title):
|
def getvidbytitle_vn(proxy, title):
|
||||||
return safegetvndbjson(
|
js = safegetvndbjson(
|
||||||
proxy,
|
proxy,
|
||||||
"https://api.vndb.org/kana/vn",
|
"vn",
|
||||||
{"filters": ["search", "=", title], "fields": "id", "sort": "searchrank"},
|
{"filters": ["search", "=", title], "fields": "id", "sort": "searchrank"},
|
||||||
lambda js: js["results"][0]["id"],
|
|
||||||
)
|
)
|
||||||
|
if js:
|
||||||
|
return js["results"][0]["id"]
|
||||||
|
|
||||||
|
|
||||||
def getvidbytitle_release(proxy, title):
|
def getvidbytitle_release(proxy, title):
|
||||||
return safegetvndbjson(
|
js = safegetvndbjson(
|
||||||
proxy,
|
proxy,
|
||||||
"https://api.vndb.org/kana/release",
|
"release",
|
||||||
{
|
{
|
||||||
"filters": ["search", "=", title],
|
"filters": ["search", "=", title],
|
||||||
"fields": "id,vns.id",
|
"fields": "id,vns.id",
|
||||||
"sort": "searchrank",
|
"sort": "searchrank",
|
||||||
},
|
},
|
||||||
lambda js: js["results"][0]["vns"][0]["id"],
|
|
||||||
)
|
)
|
||||||
|
if js:
|
||||||
|
return js["results"][0]["vns"][0]["id"]
|
||||||
|
|
||||||
|
|
||||||
def getdevelopersbyid(proxy, vid):
|
def getdevelopersbyid(proxy, vid):
|
||||||
|
|
||||||
def _js(js):
|
js = safegetvndbjson(
|
||||||
|
proxy,
|
||||||
|
"vn",
|
||||||
|
{"filters": ["id", "=", vid], "fields": "developers.name,developers.original"},
|
||||||
|
)
|
||||||
|
if js:
|
||||||
_ = []
|
_ = []
|
||||||
for item in js["results"][0]["developers"]:
|
for item in js["results"][0]["developers"]:
|
||||||
if item["original"]:
|
if item["original"]:
|
||||||
@ -105,14 +136,6 @@ def getdevelopersbyid(proxy, vid):
|
|||||||
_.append(item["name"])
|
_.append(item["name"])
|
||||||
return _
|
return _
|
||||||
|
|
||||||
name = safegetvndbjson(
|
|
||||||
proxy,
|
|
||||||
"https://api.vndb.org/kana/vn",
|
|
||||||
{"filters": ["id", "=", vid], "fields": "developers.name,developers.original"},
|
|
||||||
_js,
|
|
||||||
)
|
|
||||||
return name
|
|
||||||
|
|
||||||
|
|
||||||
def getidbytitle_(proxy, title):
|
def getidbytitle_(proxy, title):
|
||||||
vid = getvidbytitle_vn(proxy, title)
|
vid = getvidbytitle_vn(proxy, title)
|
||||||
@ -122,9 +145,9 @@ def getidbytitle_(proxy, title):
|
|||||||
|
|
||||||
|
|
||||||
def getcharnamemapbyid(proxy, vid):
|
def getcharnamemapbyid(proxy, vid):
|
||||||
res = safegetvndbjson(
|
js = safegetvndbjson(
|
||||||
proxy,
|
proxy,
|
||||||
"https://api.vndb.org/kana/character",
|
"character",
|
||||||
{
|
{
|
||||||
"filters": [
|
"filters": [
|
||||||
"vn",
|
"vn",
|
||||||
@ -133,8 +156,11 @@ def getcharnamemapbyid(proxy, vid):
|
|||||||
],
|
],
|
||||||
"fields": "name,original",
|
"fields": "name,original",
|
||||||
},
|
},
|
||||||
lambda js: js["results"],
|
|
||||||
)
|
)
|
||||||
|
if js:
|
||||||
|
res = js["results"]
|
||||||
|
else:
|
||||||
|
return {}
|
||||||
namemap = {}
|
namemap = {}
|
||||||
try:
|
try:
|
||||||
for r in res:
|
for r in res:
|
||||||
@ -178,8 +204,8 @@ def safedownload(proxy):
|
|||||||
|
|
||||||
def getvntagsbyid(proxy, vid):
|
def getvntagsbyid(proxy, vid):
|
||||||
|
|
||||||
res = safegetvndbjson(
|
js = safegetvndbjson(
|
||||||
"https://api.vndb.org/kana/vn",
|
"vn",
|
||||||
{
|
{
|
||||||
"filters": [
|
"filters": [
|
||||||
"id",
|
"id",
|
||||||
@ -188,8 +214,10 @@ def getvntagsbyid(proxy, vid):
|
|||||||
],
|
],
|
||||||
"fields": "tags.rating",
|
"fields": "tags.rating",
|
||||||
},
|
},
|
||||||
lambda js: js["results"][0]["tags"],
|
|
||||||
)
|
)
|
||||||
|
if not js:
|
||||||
|
return
|
||||||
|
res = js["results"][0]["tags"]
|
||||||
if not res:
|
if not res:
|
||||||
return
|
return
|
||||||
tags = []
|
tags = []
|
||||||
@ -213,8 +241,171 @@ def getvntagsbyid(proxy, vid):
|
|||||||
return tags
|
return tags
|
||||||
|
|
||||||
|
|
||||||
|
@Singleton_close
|
||||||
|
class vndbsettings(QDialog):
|
||||||
|
|
||||||
|
def getalistname(self, after):
|
||||||
|
__d = {"k": 0}
|
||||||
|
|
||||||
|
__vis = []
|
||||||
|
__uid = []
|
||||||
|
for _ in savegametaged:
|
||||||
|
if _ is None:
|
||||||
|
__vis.append("GLOBAL")
|
||||||
|
__uid.append(None)
|
||||||
|
else:
|
||||||
|
__vis.append(_["title"])
|
||||||
|
__uid.append(_["uid"])
|
||||||
|
autoinitdialog(
|
||||||
|
self,
|
||||||
|
_TR("目标"),
|
||||||
|
600,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "combo",
|
||||||
|
"name": _TR("目标"),
|
||||||
|
"d": __d,
|
||||||
|
"k": "k",
|
||||||
|
"list": __vis,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "okcancel",
|
||||||
|
"callback": functools.partial(after, __d, __uid),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def headers(self):
|
||||||
|
return {
|
||||||
|
"Authorization": f"Token {self._ref.config['Token']}",
|
||||||
|
}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def userid(self):
|
||||||
|
return saferequestvndb(
|
||||||
|
self._ref.proxy, "GET", "authinfo", headers=self.headers
|
||||||
|
)["id"]
|
||||||
|
|
||||||
|
def querylist(self, needtitle):
|
||||||
|
|
||||||
|
userid = self.userid
|
||||||
|
pagei = 1
|
||||||
|
collectresults = []
|
||||||
|
while True:
|
||||||
|
json_data = {
|
||||||
|
"user": userid,
|
||||||
|
"fields": (
|
||||||
|
"id, vn.title,vn.titles.title,vn.titles.main" if needtitle else "id"
|
||||||
|
),
|
||||||
|
"sort": "vote",
|
||||||
|
"results": 100,
|
||||||
|
"page": pagei,
|
||||||
|
}
|
||||||
|
pagei += 1
|
||||||
|
response = saferequestvndb(
|
||||||
|
self._ref.proxy, "POST", "ulist", json=json_data, headers=self.headers
|
||||||
|
)
|
||||||
|
collectresults += response["results"]
|
||||||
|
if not response["more"]:
|
||||||
|
break
|
||||||
|
return collectresults
|
||||||
|
|
||||||
|
def getalistname_download(self, uid):
|
||||||
|
reflist = getreflist(uid)
|
||||||
|
collectresults = self.querylist()
|
||||||
|
thislistvids = [
|
||||||
|
savehook_new_data[gameuid][self._ref.idname] for gameuid in reflist
|
||||||
|
]
|
||||||
|
collect = {}
|
||||||
|
for gameuid in savehook_new_data:
|
||||||
|
vid = savehook_new_data[gameuid][self._ref.idname]
|
||||||
|
collect[vid] = gameuid
|
||||||
|
|
||||||
|
for item in collectresults:
|
||||||
|
title = item["name"]
|
||||||
|
vid = int(item["id"][1:])
|
||||||
|
if vid in thislistvids:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if vid in collect:
|
||||||
|
gameuid = collect[vid]
|
||||||
|
else:
|
||||||
|
gameuid = initanewitem(f"bgm_{vid}_{time.time()}", title)
|
||||||
|
savehook_new_data[gameuid][self._ref.idname] = vid
|
||||||
|
gamdidchangedtask(self._ref.typename, self._ref.idname, gameuid)
|
||||||
|
reflist.insert(0, gameuid)
|
||||||
|
|
||||||
|
def getalistname_upload(self, uid):
|
||||||
|
reflist = getreflist(uid)
|
||||||
|
vids = [int(item["id"][1:]) for item in self.querylist(False)]
|
||||||
|
|
||||||
|
for gameuid in reflist:
|
||||||
|
vid = savehook_new_data[gameuid][self._ref.idname]
|
||||||
|
if vid == 0:
|
||||||
|
continue
|
||||||
|
if vid in vids:
|
||||||
|
continue
|
||||||
|
saferequestvndb(
|
||||||
|
self._ref.proxy,
|
||||||
|
"PATCH",
|
||||||
|
f"ulist/v{vid}",
|
||||||
|
json={
|
||||||
|
"labels_set": [1],
|
||||||
|
},
|
||||||
|
headers=self.headers,
|
||||||
|
)
|
||||||
|
|
||||||
|
def singleupload_existsoverride(self, gameuid):
|
||||||
|
vid = savehook_new_data[gameuid][self._ref.idname]
|
||||||
|
if not vid:
|
||||||
|
return
|
||||||
|
|
||||||
|
saferequestvndb(
|
||||||
|
self._ref.proxy,
|
||||||
|
"PATCH",
|
||||||
|
f"ulist/v{vid}",
|
||||||
|
json={
|
||||||
|
"labels_set": [1],
|
||||||
|
# "labels_unset": [1],
|
||||||
|
# "vote" :100
|
||||||
|
},
|
||||||
|
headers=self.headers,
|
||||||
|
)
|
||||||
|
|
||||||
|
def __getalistname(self, callback, _):
|
||||||
|
getalistname(self, callback)
|
||||||
|
|
||||||
|
def __init__(self, parent, _ref: common, gameuid: str) -> None:
|
||||||
|
super().__init__(parent, Qt.WindowType.WindowCloseButtonHint)
|
||||||
|
self._ref = _ref
|
||||||
|
self.resize(QSize(800, 10))
|
||||||
|
self.setWindowTitle("vndb")
|
||||||
|
fl = QFormLayout(self)
|
||||||
|
fl.addRow("Token", getlineedit(_ref.config, "Token"))
|
||||||
|
btn = QPushButton(_TR("上传游戏"))
|
||||||
|
btn.clicked.connect(
|
||||||
|
functools.partial(self.singleupload_existsoverride, gameuid)
|
||||||
|
)
|
||||||
|
fl.addRow(btn)
|
||||||
|
btn = QPushButton(_TR("上传游戏列表"))
|
||||||
|
btn.clicked.connect(
|
||||||
|
functools.partial(self.__getalistname, self.getalistname_upload)
|
||||||
|
)
|
||||||
|
fl.addRow(btn)
|
||||||
|
btn = QPushButton(_TR("获取游戏列表"))
|
||||||
|
btn.clicked.connect(
|
||||||
|
functools.partial(self.__getalistname, self.getalistname_download)
|
||||||
|
)
|
||||||
|
fl.addRow(btn)
|
||||||
|
self.show()
|
||||||
|
|
||||||
|
|
||||||
class searcher(common):
|
class searcher(common):
|
||||||
|
|
||||||
|
def querysettingwindow(self, parent, gameuid):
|
||||||
|
vndbsettings(parent, self, gameuid)
|
||||||
|
|
||||||
def refmainpage(self, _id):
|
def refmainpage(self, _id):
|
||||||
return f"https://vndb.org/v{_id}"
|
return f"https://vndb.org/v{_id}"
|
||||||
|
|
||||||
|
@ -245,22 +245,25 @@ def everymethodsthread():
|
|||||||
print_exc()
|
print_exc()
|
||||||
|
|
||||||
|
|
||||||
def gamdidchangedtask(key, idname, gameuid):
|
def idtypecheck(key, idname, gameuid, vid):
|
||||||
vid = savehook_new_data[gameuid][idname]
|
|
||||||
if vid == "":
|
if vid == "":
|
||||||
return
|
return
|
||||||
else:
|
|
||||||
try:
|
try:
|
||||||
if globalconfig["metadata"][key]["idtype"] == 0:
|
if globalconfig["metadata"][key]["idtype"] == 0:
|
||||||
try:
|
try:
|
||||||
vid = int(vid)
|
vid = int(vid)
|
||||||
except:
|
except:
|
||||||
print(vid)
|
print(vid)
|
||||||
return
|
return
|
||||||
savehook_new_data[gameuid][idname] = vid
|
savehook_new_data[gameuid][idname] = vid
|
||||||
searchvndbqueue.put((1, gameuid, (key, vid)), 1)
|
except:
|
||||||
except:
|
print_exc()
|
||||||
print_exc()
|
|
||||||
|
|
||||||
|
def gamdidchangedtask(key, idname, gameuid):
|
||||||
|
vid = savehook_new_data[gameuid][idname]
|
||||||
|
searchvndbqueue.put((1, gameuid, (key, vid)), 1)
|
||||||
|
|
||||||
|
|
||||||
def titlechangedtask(gameuid, title):
|
def titlechangedtask(gameuid, title):
|
||||||
@ -269,13 +272,17 @@ def titlechangedtask(gameuid, title):
|
|||||||
searchvndbqueue.put((0, gameuid, [title]), 1)
|
searchvndbqueue.put((0, gameuid, [title]), 1)
|
||||||
|
|
||||||
|
|
||||||
|
def initanewitem(gamepath, title):
|
||||||
|
uid = f"{time.time()}_{uuid.uuid4()}"
|
||||||
|
gamepath2uid[gamepath] = uid
|
||||||
|
savehook_new_data[uid] = getdefaultsavehook(gamepath, title)
|
||||||
|
uid2gamepath[uid] = gamepath
|
||||||
|
return uid
|
||||||
|
|
||||||
|
|
||||||
def checkifnewgame(targetlist, gamepath, title=None):
|
def checkifnewgame(targetlist, gamepath, title=None):
|
||||||
if gamepath not in gamepath2uid:
|
if gamepath not in gamepath2uid:
|
||||||
uid = f"{time.time()}_{uuid.uuid4()}"
|
uid = initanewitem(gamepath, title)
|
||||||
gamepath2uid[gamepath] = uid
|
|
||||||
savehook_new_data[uid] = getdefaultsavehook(gamepath, title)
|
|
||||||
|
|
||||||
uid2gamepath[uid] = gamepath
|
|
||||||
searchvndbqueue.put((0, uid, [title] + guessmaybetitle(gamepath, title)))
|
searchvndbqueue.put((0, uid, [title] + guessmaybetitle(gamepath, title)))
|
||||||
else:
|
else:
|
||||||
uid = gamepath2uid[gamepath]
|
uid = gamepath2uid[gamepath]
|
||||||
|
@ -19,13 +19,24 @@ def Singleton_impl(cls, behavior="activate"):
|
|||||||
def _singleton(*args, **kwagrs):
|
def _singleton(*args, **kwagrs):
|
||||||
if _lock.locked():
|
if _lock.locked():
|
||||||
if cls not in _instance: # __init__很慢,来不及放入_instance
|
if cls not in _instance: # __init__很慢,来不及放入_instance
|
||||||
pass
|
return
|
||||||
elif behavior == "activate":
|
elif behavior == "activate":
|
||||||
_instance[cls].activateWindow()
|
try:
|
||||||
_instance[cls].show()
|
_instance[cls].activateWindow()
|
||||||
|
_instance[cls].show()
|
||||||
|
return
|
||||||
|
except:
|
||||||
|
# 父类被销毁
|
||||||
|
_lock.release()
|
||||||
|
pass
|
||||||
elif behavior == "close":
|
elif behavior == "close":
|
||||||
_instance[cls].close()
|
try:
|
||||||
return
|
_instance[cls].close()
|
||||||
|
return
|
||||||
|
except:
|
||||||
|
_lock.release()
|
||||||
|
pass
|
||||||
|
|
||||||
_lock.acquire()
|
_lock.acquire()
|
||||||
|
|
||||||
class __(cls):
|
class __(cls):
|
||||||
@ -43,6 +54,7 @@ def Singleton_impl(cls, behavior="activate"):
|
|||||||
self.deleteLater()
|
self.deleteLater()
|
||||||
_instance.pop(cls)
|
_instance.pop(cls)
|
||||||
_lock.release()
|
_lock.release()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
_inst = __(*args, **kwagrs)
|
_inst = __(*args, **kwagrs)
|
||||||
except:
|
except:
|
||||||
|
@ -4,9 +4,11 @@ from collections import OrderedDict
|
|||||||
from urllib.parse import urlencode, urlsplit
|
from urllib.parse import urlencode, urlsplit
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
|
|
||||||
class NetWorkException(Exception):
|
class NetWorkException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Timeout(NetWorkException):
|
class Timeout(NetWorkException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -352,6 +354,12 @@ class Sessionbase:
|
|||||||
def options(self, url, **kwargs):
|
def options(self, url, **kwargs):
|
||||||
return self.request("OPTIONS", url, **kwargs)
|
return self.request("OPTIONS", url, **kwargs)
|
||||||
|
|
||||||
|
def patch(self, url, **kwargs):
|
||||||
|
return self.request("PATCH", url, **kwargs)
|
||||||
|
|
||||||
|
def delete(self, url, **kwargs):
|
||||||
|
return self.request("DELETE", url, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
Sessionimpl = [Sessionbase]
|
Sessionimpl = [Sessionbase]
|
||||||
|
|
||||||
@ -369,3 +377,5 @@ def session():
|
|||||||
get = partial(request, "GET")
|
get = partial(request, "GET")
|
||||||
post = partial(request, "POST")
|
post = partial(request, "POST")
|
||||||
options = partial(request, "OPTIONS")
|
options = partial(request, "OPTIONS")
|
||||||
|
patch = partial(request, "PATCH")
|
||||||
|
delete = partial(request, "DELETE")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from myutils.config import noundictconfig
|
from myutils.config import noundictconfig
|
||||||
import gobject, re
|
import gobject, re, functools
|
||||||
from qtsymbols import *
|
from qtsymbols import *
|
||||||
from traceback import print_exc
|
from traceback import print_exc
|
||||||
from myutils.config import (
|
from myutils.config import (
|
||||||
@ -9,15 +9,45 @@ from myutils.config import (
|
|||||||
)
|
)
|
||||||
import gobject
|
import gobject
|
||||||
from gui.usefulwidget import getQMessageBox, threebuttons
|
from gui.usefulwidget import getQMessageBox, threebuttons
|
||||||
from myutils.wrapper import Singleton
|
from myutils.wrapper import Singleton_close
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton_close
|
||||||
class noundictconfigdialog(QDialog):
|
class noundictconfigdialog(QDialog):
|
||||||
def closeEvent(self, a0: QCloseEvent) -> None:
|
def closeEvent(self, a0: QCloseEvent) -> None:
|
||||||
self.button.setFocus()
|
self.button.setFocus()
|
||||||
self.apply()
|
self.apply()
|
||||||
|
|
||||||
|
def showmenu(self, table: QTableView, pos):
|
||||||
|
r = table.currentIndex().row()
|
||||||
|
if r < 0:
|
||||||
|
return
|
||||||
|
menu = QMenu(table)
|
||||||
|
up = QAction(_TR("上移"))
|
||||||
|
down = QAction(_TR("下移"))
|
||||||
|
menu.addAction(up)
|
||||||
|
menu.addAction(down)
|
||||||
|
action = menu.exec(table.cursor().pos())
|
||||||
|
|
||||||
|
if action == up:
|
||||||
|
|
||||||
|
self.moverank(table, -1)
|
||||||
|
|
||||||
|
elif action == down:
|
||||||
|
self.moverank(table, 1)
|
||||||
|
|
||||||
|
def moverank(self, table: QTableView, dy):
|
||||||
|
curr = table.currentIndex()
|
||||||
|
target = (curr.row() + dy) % table.model().rowCount()
|
||||||
|
texts = [
|
||||||
|
table.model().item(curr.row(), i).text()
|
||||||
|
for i in range(table.model().columnCount())
|
||||||
|
]
|
||||||
|
|
||||||
|
table.model().removeRow(curr.row())
|
||||||
|
table.model().insertRow(target, [QStandardItem(text) for text in texts])
|
||||||
|
table.setCurrentIndex(table.model().index(target, curr.column()))
|
||||||
|
|
||||||
def apply(self):
|
def apply(self):
|
||||||
rows = self.model.rowCount()
|
rows = self.model.rowCount()
|
||||||
newdict = {}
|
newdict = {}
|
||||||
@ -64,9 +94,12 @@ class noundictconfigdialog(QDialog):
|
|||||||
table = QTableView(self)
|
table = QTableView(self)
|
||||||
table.setModel(model)
|
table.setModel(model)
|
||||||
table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
||||||
# table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
|
table.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||||
# table.clicked.connect(self.show_info)
|
table.customContextMenuRequested.connect(
|
||||||
button = threebuttons()
|
functools.partial(self.showmenu, table)
|
||||||
|
)
|
||||||
|
button = threebuttons(texts=["添加行", "删除行", "上移", "下移", "立即应用"])
|
||||||
|
self.table = table
|
||||||
|
|
||||||
def clicked1():
|
def clicked1():
|
||||||
try:
|
try:
|
||||||
@ -84,19 +117,31 @@ class noundictconfigdialog(QDialog):
|
|||||||
|
|
||||||
def clicked2():
|
def clicked2():
|
||||||
|
|
||||||
model.removeRow(table.currentIndex().row())
|
skip = []
|
||||||
|
for index in self.table.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
skip = reversed(sorted(skip))
|
||||||
|
|
||||||
|
for row in skip:
|
||||||
|
model.removeRow(row)
|
||||||
|
|
||||||
button.btn2clicked.connect(clicked2)
|
button.btn2clicked.connect(clicked2)
|
||||||
button.btn3clicked.connect(self.apply)
|
button.btn3clicked.connect(functools.partial(self.moverank, table, -1))
|
||||||
button5 = QPushButton(self)
|
button.btn4clicked.connect(functools.partial(self.moverank, table, 1))
|
||||||
button5.setText(_TR("设置所有词条为全局词条"))
|
|
||||||
|
button.btn5clicked.connect(self.apply)
|
||||||
|
button2 = threebuttons(
|
||||||
|
texts=["设置所有词条为全局词条", "以当前md5复制选中行"]
|
||||||
|
)
|
||||||
|
|
||||||
def clicked5():
|
def clicked5():
|
||||||
rows = model.rowCount()
|
rows = model.rowCount()
|
||||||
for row in range(rows):
|
for row in range(rows):
|
||||||
model.item(row, 0).setText("0")
|
model.item(row, 0).setText("0")
|
||||||
|
|
||||||
button5.clicked.connect(
|
button2.btn1clicked.connect(
|
||||||
lambda: getQMessageBox(
|
lambda: getQMessageBox(
|
||||||
self,
|
self,
|
||||||
"警告",
|
"警告",
|
||||||
@ -107,6 +152,8 @@ class noundictconfigdialog(QDialog):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
button2.btn2clicked.connect(self.copysetmd5)
|
||||||
|
|
||||||
search = QHBoxLayout()
|
search = QHBoxLayout()
|
||||||
searchcontent = QLineEdit()
|
searchcontent = QLineEdit()
|
||||||
search.addWidget(searchcontent)
|
search.addWidget(searchcontent)
|
||||||
@ -132,7 +179,7 @@ class noundictconfigdialog(QDialog):
|
|||||||
formLayout.addWidget(table)
|
formLayout.addWidget(table)
|
||||||
formLayout.addLayout(search)
|
formLayout.addLayout(search)
|
||||||
formLayout.addWidget(button)
|
formLayout.addWidget(button)
|
||||||
formLayout.addWidget(button5)
|
formLayout.addWidget(button2)
|
||||||
setmd5layout = QHBoxLayout()
|
setmd5layout = QHBoxLayout()
|
||||||
setmd5layout.addWidget(QLabel(_TR("当前MD5")))
|
setmd5layout.addWidget(QLabel(_TR("当前MD5")))
|
||||||
md5content = QLineEdit(gobject.baseobject.currentmd5)
|
md5content = QLineEdit(gobject.baseobject.currentmd5)
|
||||||
@ -150,6 +197,25 @@ class noundictconfigdialog(QDialog):
|
|||||||
self.resize(QSize(600, 400))
|
self.resize(QSize(600, 400))
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
|
def copysetmd5(self):
|
||||||
|
if len(self.table.selectedIndexes()) == 0:
|
||||||
|
return
|
||||||
|
md5 = gobject.baseobject.currentmd5
|
||||||
|
row = self.table.selectedIndexes()[0].row()
|
||||||
|
skip = []
|
||||||
|
for index in self.table.selectedIndexes():
|
||||||
|
if index.row() in skip:
|
||||||
|
continue
|
||||||
|
skip.append(index.row())
|
||||||
|
self.model.insertRow(
|
||||||
|
row,
|
||||||
|
[
|
||||||
|
QStandardItem(md5),
|
||||||
|
QStandardItem(self.model.item(index.row(), 1).text()),
|
||||||
|
QStandardItem(self.model.item(index.row(), 2).text()),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Process:
|
class Process:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -235,7 +235,10 @@
|
|||||||
"downloadtasks": [],
|
"downloadtasks": [],
|
||||||
"useproxy": false,
|
"useproxy": false,
|
||||||
"target": "vid",
|
"target": "vid",
|
||||||
"idtype": 0
|
"idtype": 0,
|
||||||
|
"args": {
|
||||||
|
"Token": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"dlsite": {
|
"dlsite": {
|
||||||
"name": "dlsite",
|
"name": "dlsite",
|
||||||
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "المنتديات",
|
"论坛": "المنتديات",
|
||||||
"请选择": "الرجاء اختيار",
|
"请选择": "الرجاء اختيار",
|
||||||
"安装成功": "تثبيت بنجاح",
|
"安装成功": "تثبيت بنجاح",
|
||||||
"添加成功": "إضافة ناجحة"
|
"添加成功": "إضافة ناجحة",
|
||||||
|
"获取游戏列表": "الحصول على قائمة الألعاب",
|
||||||
|
"上传游戏列表": "تحميل قائمة الألعاب",
|
||||||
|
"上传游戏": "تحميل العاب",
|
||||||
|
"以当前md5复制选中行": "حدد صف مع نسخة MD5 الحالي"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "論壇",
|
"论坛": "論壇",
|
||||||
"请选择": "請選擇",
|
"请选择": "請選擇",
|
||||||
"安装成功": "安裝成功",
|
"安装成功": "安裝成功",
|
||||||
"添加成功": "添加成功"
|
"添加成功": "添加成功",
|
||||||
|
"获取游戏列表": "獲取遊戲清單",
|
||||||
|
"上传游戏列表": "上傳遊戲清單",
|
||||||
|
"上传游戏": "上傳遊戲",
|
||||||
|
"以当前md5复制选中行": "以當前md5複製選中行"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "forum",
|
"论坛": "forum",
|
||||||
"请选择": "Please select",
|
"请选择": "Please select",
|
||||||
"安装成功": "Installation successful",
|
"安装成功": "Installation successful",
|
||||||
"添加成功": "Successfully added"
|
"添加成功": "Successfully added",
|
||||||
|
"获取游戏列表": "Get game list",
|
||||||
|
"上传游戏列表": "Upload game list",
|
||||||
|
"上传游戏": "Upload game",
|
||||||
|
"以当前md5复制选中行": "Copy the selected row with the current MD5"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "Foro",
|
"论坛": "Foro",
|
||||||
"请选择": "Por favor, elija",
|
"请选择": "Por favor, elija",
|
||||||
"安装成功": "Instalación exitosa",
|
"安装成功": "Instalación exitosa",
|
||||||
"添加成功": "Se agregó con éxito"
|
"添加成功": "Se agregó con éxito",
|
||||||
|
"获取游戏列表": "Obtener la lista de juegos",
|
||||||
|
"上传游戏列表": "Subir la lista de juegos",
|
||||||
|
"上传游戏": "Sube el juego",
|
||||||
|
"以当前md5复制选中行": "Copiar la línea seleccionada con el MD5 actual"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "Le Forum",
|
"论坛": "Le Forum",
|
||||||
"请选择": "Veuillez sélectionner",
|
"请选择": "Veuillez sélectionner",
|
||||||
"安装成功": "Installation réussie",
|
"安装成功": "Installation réussie",
|
||||||
"添加成功": "Ajouté avec succès"
|
"添加成功": "Ajouté avec succès",
|
||||||
|
"获取游戏列表": "Obtenir une liste de jeux",
|
||||||
|
"上传游戏列表": "Télécharger une liste de jeux",
|
||||||
|
"上传游戏": "Télécharger un jeu",
|
||||||
|
"以当前md5复制选中行": "Copier la ligne sélectionnée avec le MD5 actuel"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "forum",
|
"论坛": "forum",
|
||||||
"请选择": "Seleziona",
|
"请选择": "Seleziona",
|
||||||
"安装成功": "Installazione riuscita",
|
"安装成功": "Installazione riuscita",
|
||||||
"添加成功": "Aggiunta con successo"
|
"添加成功": "Aggiunta con successo",
|
||||||
|
"获取游戏列表": "Ottieni la lista dei giochi",
|
||||||
|
"上传游戏列表": "Carica la lista dei giochi",
|
||||||
|
"上传游戏": "Carica gioco",
|
||||||
|
"以当前md5复制选中行": "Copia la riga selezionata con l'MD5 corrente"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "フォーラム",
|
"论坛": "フォーラム",
|
||||||
"请选择": "選択してください",
|
"请选择": "選択してください",
|
||||||
"安装成功": "インストールに成功しました",
|
"安装成功": "インストールに成功しました",
|
||||||
"添加成功": "追加成功"
|
"添加成功": "追加成功",
|
||||||
|
"获取游戏列表": "ゲームリストの取得",
|
||||||
|
"上传游戏列表": "ゲームリストをアップロード",
|
||||||
|
"上传游戏": "ゲームをアップロード",
|
||||||
|
"以当前md5复制选中行": "選択した行を現在のmd 5でコピー"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "포럼",
|
"论坛": "포럼",
|
||||||
"请选择": "선택하십시오.",
|
"请选择": "선택하십시오.",
|
||||||
"安装成功": "설치 성공",
|
"安装成功": "설치 성공",
|
||||||
"添加成功": "추가 성공"
|
"添加成功": "추가 성공",
|
||||||
|
"获取游戏列表": "게임 목록 가져오기",
|
||||||
|
"上传游戏列表": "게임 목록 업로드",
|
||||||
|
"上传游戏": "게임 업로드",
|
||||||
|
"以当前md5复制选中行": "선택된 행을 현재 md5로 복사"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "forum",
|
"论坛": "forum",
|
||||||
"请选择": "Proszę wybrać",
|
"请选择": "Proszę wybrać",
|
||||||
"安装成功": "Instalacja pomyślna",
|
"安装成功": "Instalacja pomyślna",
|
||||||
"添加成功": "Dodano pomyślnie"
|
"添加成功": "Dodano pomyślnie",
|
||||||
|
"获取游戏列表": "Pobierz listę gier",
|
||||||
|
"上传游戏列表": "Wyślij listę gier",
|
||||||
|
"上传游戏": "Przesyłaj grę",
|
||||||
|
"以当前md5复制选中行": "Kopiuj zaznaczony wiersz z bieżącym MD5"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "Форум",
|
"论坛": "Форум",
|
||||||
"请选择": "Выберите",
|
"请选择": "Выберите",
|
||||||
"安装成功": "Установка прошла успешно",
|
"安装成功": "Установка прошла успешно",
|
||||||
"添加成功": "Добавить успех"
|
"添加成功": "Добавить успех",
|
||||||
|
"获取游戏列表": "Получить список игр",
|
||||||
|
"上传游戏列表": "Загрузить список игр",
|
||||||
|
"上传游戏": "Загрузить игру",
|
||||||
|
"以当前md5复制选中行": "Копировать выделенную строку в текущем MD5"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "ฟอรั่ม",
|
"论坛": "ฟอรั่ม",
|
||||||
"请选择": "กรุณาเลือก",
|
"请选择": "กรุณาเลือก",
|
||||||
"安装成功": "ติดตั้งสำเร็จ",
|
"安装成功": "ติดตั้งสำเร็จ",
|
||||||
"添加成功": "เพิ่มความสำเร็จ"
|
"添加成功": "เพิ่มความสำเร็จ",
|
||||||
|
"获取游戏列表": "รับรายการเกม",
|
||||||
|
"上传游戏列表": "อัปโหลดรายการเกม",
|
||||||
|
"上传游戏": "อัปโหลดเกม",
|
||||||
|
"以当前md5复制选中行": "คัดลอกแถวที่เลือกด้วย md5 ปัจจุบัน"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "forum",
|
"论坛": "forum",
|
||||||
"请选择": "Lütfen seçin",
|
"请选择": "Lütfen seçin",
|
||||||
"安装成功": "Yükleme başarılı",
|
"安装成功": "Yükleme başarılı",
|
||||||
"添加成功": "Başarılı eklendi"
|
"添加成功": "Başarılı eklendi",
|
||||||
|
"获取游戏列表": "Oyun listesini alın",
|
||||||
|
"上传游戏列表": "Oyun listesini yükle",
|
||||||
|
"上传游戏": "Oyunu yükle",
|
||||||
|
"以当前md5复制选中行": "Seçili satırı mevcut MD5 ile kopyalayın"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "форум",
|
"论坛": "форум",
|
||||||
"请选择": "Будь ласка, виберіть",
|
"请选择": "Будь ласка, виберіть",
|
||||||
"安装成功": "Встановлення успішно",
|
"安装成功": "Встановлення успішно",
|
||||||
"添加成功": "Успішно додано"
|
"添加成功": "Успішно додано",
|
||||||
|
"获取游戏列表": "Отримати список гри",
|
||||||
|
"上传游戏列表": "Вивантажити список гр",
|
||||||
|
"上传游戏": "Вивантажити гру",
|
||||||
|
"以当前md5复制选中行": "Копіювати вибраний рядок поточним MD5"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "Diễn đàn",
|
"论坛": "Diễn đàn",
|
||||||
"请选择": "Vui lòng chọn",
|
"请选择": "Vui lòng chọn",
|
||||||
"安装成功": "Cài đặt thành công",
|
"安装成功": "Cài đặt thành công",
|
||||||
"添加成功": "Thêm thành công"
|
"添加成功": "Thêm thành công",
|
||||||
|
"获取游戏列表": "Nhận danh sách trò chơi",
|
||||||
|
"上传游戏列表": "Tải lên danh sách trò chơi",
|
||||||
|
"上传游戏": "Tải lên trò chơi",
|
||||||
|
"以当前md5复制选中行": "Dòng đã chọn sao chép md5 hiện tại"
|
||||||
}
|
}
|
@ -812,5 +812,9 @@
|
|||||||
"论坛": "",
|
"论坛": "",
|
||||||
"请选择": "",
|
"请选择": "",
|
||||||
"安装成功": "",
|
"安装成功": "",
|
||||||
"添加成功": ""
|
"添加成功": "",
|
||||||
|
"获取游戏列表": "",
|
||||||
|
"上传游戏列表": "",
|
||||||
|
"上传游戏": "",
|
||||||
|
"以当前md5复制选中行": ""
|
||||||
}
|
}
|
@ -29,7 +29,7 @@ include(generate_product_version)
|
|||||||
|
|
||||||
set(VERSION_MAJOR 5)
|
set(VERSION_MAJOR 5)
|
||||||
set(VERSION_MINOR 3)
|
set(VERSION_MINOR 3)
|
||||||
set(VERSION_PATCH 1)
|
set(VERSION_PATCH 2)
|
||||||
|
|
||||||
add_library(pch pch.cpp)
|
add_library(pch pch.cpp)
|
||||||
target_precompile_headers(pch PUBLIC pch.h)
|
target_precompile_headers(pch PUBLIC pch.h)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user