This commit is contained in:
恍兮惚兮 2024-04-12 03:46:52 +08:00
parent a63c14c8fd
commit 867faaaca2
4 changed files with 121 additions and 55 deletions

View File

@ -54,7 +54,7 @@ import os
from myutils.hwnd import showintab from myutils.hwnd import showintab
from PyQt5.QtGui import QStandardItem, QStandardItemModel from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtCore import Qt, QSize from PyQt5.QtCore import Qt, QSize
from myutils.config import savehook_new_list, savehook_new_data,vndbtagdata from myutils.config import savehook_new_list, savehook_new_data, vndbtagdata
from myutils.hwnd import getExeIcon from myutils.hwnd import getExeIcon
import gobject import gobject
from myutils.config import _TR, _TRL, globalconfig, static_data from myutils.config import _TR, _TRL, globalconfig, static_data
@ -560,6 +560,13 @@ class dialog_setting_game(QDialog):
icon="fa.book", icon="fa.book",
constcolor="#FF69B4", constcolor="#FF69B4",
), ),
getcolorbutton(
"",
"",
lambda: os.startfile('https://vndb.org/v{}'.format(savehook_new_data[exepath]["vid"])),
icon="fa.chrome",
constcolor="#FF69B4",
),
getcolorbutton( getcolorbutton(
"", "",
"", "",
@ -812,10 +819,10 @@ class dialog_setting_game(QDialog):
formLayout.setContentsMargins(0, 0, 0, 0) formLayout.setContentsMargins(0, 0, 0, 0)
self.labelflow = ScrollFlow() self.labelflow = ScrollFlow()
def newitem(text, removeable, first=False): def newitem(text, removeable, first=False, _type=tagitem.TYPE_RAND):
qw = tagitem(text, removeable) qw = tagitem(text, removeable, _type)
def __(_qw, t): def __(_qw, t, _type):
_qw.remove() _qw.remove()
i = savehook_new_data[exepath]["usertags"].index(t) i = savehook_new_data[exepath]["usertags"].index(t)
self.labelflow.removeidx(i) self.labelflow.removeidx(i)
@ -824,22 +831,24 @@ class dialog_setting_game(QDialog):
if removeable: if removeable:
qw.removesignal.connect(functools.partial(__, qw)) qw.removesignal.connect(functools.partial(__, qw))
def _lbclick(t): def _lbclick(tp, t):
try: try:
self.parent().tagswidget.addTag(t) self.parent().tagswidget.addTag(t, tp)
except: except:
pass pass
qw.labelclicked.connect(_lbclick) qw.labelclicked.connect(functools.partial(_lbclick, _type))
if first: if first:
self.labelflow.insertwidget(0, qw) self.labelflow.insertwidget(0, qw)
else: else:
self.labelflow.addwidget(qw) self.labelflow.addwidget(qw)
for tag in savehook_new_data[exepath]["usertags"]: for tag in savehook_new_data[exepath]["usertags"]:
newitem(tag, True) newitem(tag, True, _type=tagitem.TYPE_USERTAG)
for tag in savehook_new_data[exepath]["developers"]:
newitem(tag, False, _type=tagitem.TYPE_DEVELOPER)
for tag in getvndbrealtags(savehook_new_data[exepath]["vndbtags"]): for tag in getvndbrealtags(savehook_new_data[exepath]["vndbtags"]):
newitem(tag, False) newitem(tag, False, _type=tagitem.TYPE_TAG)
formLayout.addWidget(self.labelflow) formLayout.addWidget(self.labelflow)
_dict = {"new": 0} _dict = {"new": 0}
@ -856,7 +865,7 @@ class dialog_setting_game(QDialog):
# tag = globalconfig["labelset"][_dict["new"]] # tag = globalconfig["labelset"][_dict["new"]]
if tag and tag not in savehook_new_data[exepath]["usertags"]: if tag and tag not in savehook_new_data[exepath]["usertags"]:
savehook_new_data[exepath]["usertags"].insert(0, tag) savehook_new_data[exepath]["usertags"].insert(0, tag)
newitem(tag, True, True) newitem(tag, True, True, _type=tagitem.TYPE_USERTAG)
combo.clearEditText() combo.clearEditText()
button.clicked.connect(_add) button.clicked.connect(_add)
@ -1250,8 +1259,8 @@ class listediter(QDialog):
class ClickableLabel(QLabel): class ClickableLabel(QLabel):
def __init__(self, parent=None): def __init__(self):
super().__init__(parent) super().__init__()
self.setClickable(True) self.setClickable(True)
def setClickable(self, clickable): def setClickable(self, clickable):
@ -1265,8 +1274,12 @@ class ClickableLabel(QLabel):
class tagitem(QWidget): class tagitem(QWidget):
TYPE_RAND = 0
removesignal = pyqtSignal(str) TYPE_DEVELOPER = 1
TYPE_TAG = 2
TYPE_USERTAG = 3
TYPE_EXISTS = 4
removesignal = pyqtSignal(str, int)
labelclicked = pyqtSignal(str) labelclicked = pyqtSignal(str)
def remove(self): def remove(self):
@ -1282,29 +1295,38 @@ class tagitem(QWidget):
def paintEvent(self, event): def paintEvent(self, event):
painter = QPainter(self) painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing) painter.setRenderHint(QPainter.Antialiasing)
if self._type == tagitem.TYPE_RAND:
border_color = Qt.black border_color = Qt.black
elif self._type == tagitem.TYPE_DEVELOPER:
border_color = Qt.red
elif self._type == tagitem.TYPE_TAG:
border_color = Qt.green
elif self._type == tagitem.TYPE_USERTAG:
border_color = Qt.blue
elif self._type == tagitem.TYPE_EXISTS:
border_color = Qt.yellow
border_width = 1 border_width = 1
pen = QPen(border_color) pen = QPen(border_color)
pen.setWidth(border_width) pen.setWidth(border_width)
painter.setPen(pen) painter.setPen(pen)
painter.drawRect(self.rect()) painter.drawRect(self.rect())
def __init__(self, tag, removeable=True) -> None: def __init__(self, tag, removeable=True, _type=TYPE_RAND) -> None:
super().__init__() super().__init__()
tagLayout = QHBoxLayout() tagLayout = QHBoxLayout()
tagLayout.setContentsMargins(0, 0, 0, 0) tagLayout.setContentsMargins(0, 0, 0, 0)
self._type = _type
self.setLayout(tagLayout) self.setLayout(tagLayout)
lb = ClickableLabel(tag) lb = ClickableLabel()
lb.setText(tag)
lb.clicked.connect(lambda: self.labelclicked.emit(tag)) lb.clicked.connect(lambda: self.labelclicked.emit(tag))
tagLayout.addWidget(lb) tagLayout.addWidget(lb)
if removeable: if removeable:
button = getcolorbutton( button = getcolorbutton(
None, None,
None, None,
lambda: self.removesignal.emit(tag), # self.removeTag(tag), lambda: self.removesignal.emit(tag, self._type), # self.removeTag(tag),
qicon=qtawesome.icon( qicon=qtawesome.icon(
"fa.times", "fa.times",
color="#FF69B4", color="#FF69B4",
@ -1349,9 +1371,20 @@ class TagWidget(QWidget):
self.lineEdit = QComboBox() self.lineEdit = QComboBox()
self.lineEdit.setLineEdit(QLineEdit()) self.lineEdit.setLineEdit(QLineEdit())
self.lineEdit.lineEdit().returnPressed.connect(
lambda: self.addTag(self.lineEdit.currentText()) def callback():
) t = self.lineEdit.currentText()
if t in globalconfig["labelset"]:
tp = tagitem.TYPE_USERTAG
else:
tp = tagitem.TYPE_RAND
self.addTag(self.lineEdit.currentText(), tp)
self.lineEdit.clear()
self.lineEdit.addItems(globalconfig["labelset"])
self.lineEdit.clearEditText()
self.lineEdit.lineEdit().returnPressed.connect(callback)
self.lineEdit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) self.lineEdit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
@ -1368,33 +1401,32 @@ class TagWidget(QWidget):
refreshcombo() refreshcombo()
def addTag(self, tag): def addTag(self, tag, _type):
try: try:
if not tag: if not tag:
return return
if tag in self.tag2widget: if (tag, _type) in self.tag2widget:
return return
self.tags.append(tag) self.tags.append(tag)
qw = tagitem(tag) qw = tagitem(tag, _type=_type)
qw.removesignal.connect(self.removeTag) qw.removesignal.connect(self.removeTag)
layout = self.layout() layout = self.layout()
# layout.insertLayout(layout.count() - 1, tagLayout) # layout.insertLayout(layout.count() - 1, tagLayout)
layout.insertWidget(layout.count() - 1, qw) layout.insertWidget(layout.count() - 1, qw)
self.tag2widget[tag] = qw self.tag2widget[(tag, _type)] = qw
self.lineEdit.clearEditText() self.lineEdit.clearEditText()
self.lineEdit.setFocus() self.lineEdit.setFocus()
self.tagschanged.emit(tuple(self.tag2widget.keys())) self.tagschanged.emit(tuple(self.tag2widget.keys()))
except: except:
print_exc() print_exc()
def removeTag(self, tag): def removeTag(self, tag, _type):
_w = self.tag2widget[tag] _w = self.tag2widget[(tag, _type)]
_w.remove() _w.remove()
self.layout().removeWidget(_w) self.layout().removeWidget(_w)
self.tag2widget.pop(tag) self.tag2widget.pop((tag, _type))
self.lineEdit.setFocus() self.lineEdit.setFocus()
self.tagschanged.emit(tuple(self.tag2widget.keys())) self.tagschanged.emit(tuple(self.tag2widget.keys()))
@ -1448,11 +1480,9 @@ class dialog_savedgame_new(saveposwindow):
self.newline(res, True) self.newline(res, True)
def tagschanged(self, tags): def tagschanged(self, tags):
checkexists = _TR("存在") in tags self.currtags = tags
if checkexists: newtags = tags
_ = list(tags) print(tags)
_.remove(_TR("存在"))
tags = tuple(_)
ItemWidget.clearfocus() ItemWidget.clearfocus()
self.formLayout.removeWidget(self.flow) self.formLayout.removeWidget(self.flow)
self.idxsave.clear() self.idxsave.clear()
@ -1460,17 +1490,32 @@ class dialog_savedgame_new(saveposwindow):
self.flow.bgclicked.connect(ItemWidget.clearfocus) self.flow.bgclicked.connect(ItemWidget.clearfocus)
self.formLayout.insertWidget(self.formLayout.count() - 1, self.flow) self.formLayout.insertWidget(self.formLayout.count() - 1, self.flow)
for k in savehook_new_list: for k in savehook_new_list:
if checkexists and os.path.exists(k) == False: if newtags != self.currtags:
continue break
# print(vndbtags)
notshow = False notshow = False
for tag in tags: for tag, _type in tags:
if _type == tagitem.TYPE_EXISTS:
if os.path.exists(k) == False:
notshow = True
break
elif _type == tagitem.TYPE_DEVELOPER:
if tag not in savehook_new_data[k]["developers"]:
notshow = True
break
elif _type == tagitem.TYPE_TAG:
if tag not in getvndbrealtags(savehook_new_data[k]["vndbtags"]):
notshow = True
break
elif _type == tagitem.TYPE_USERTAG:
if tag not in savehook_new_data[k]["usertags"]:
notshow = True
break
elif _type == tagitem.TYPE_RAND:
if ( if (
tag not in getvndbrealtags(savehook_new_data[k]["vndbtags"]) tag not in getvndbrealtags(savehook_new_data[k]["vndbtags"])
and tag not in savehook_new_data[k]["usertags"] and tag not in savehook_new_data[k]["usertags"]
and tag not in savehook_new_data[k]["title"] and tag not in savehook_new_data[k]["title"]
and tag != str(savehook_new_data[k]["vid"]) and tag not in savehook_new_data[k]["developers"]
): ):
notshow = True notshow = True
break break
@ -1526,6 +1571,7 @@ class dialog_savedgame_new(saveposwindow):
showintab(int(self.winId()), True) showintab(int(self.winId()), True)
formLayout = QVBoxLayout() formLayout = QVBoxLayout()
self.tagswidget = TagWidget(self) self.tagswidget = TagWidget(self)
self.currtags = tuple()
self.tagswidget.tagschanged.connect(self.tagschanged) self.tagswidget.tagschanged.connect(self.tagschanged)
formLayout.addWidget(self.tagswidget) formLayout.addWidget(self.tagswidget)
self.flow = ScrollFlow() self.flow = ScrollFlow()
@ -1555,7 +1601,7 @@ class dialog_savedgame_new(saveposwindow):
self.show() self.show()
self.idxsave = [] self.idxsave = []
if globalconfig["hide_not_exists"]: if globalconfig["hide_not_exists"]:
self.tagswidget.addTag(_TR("存在")) self.tagswidget.addTag(_TR("存在"), tagitem.TYPE_EXISTS)
else: else:
self.tagschanged(tuple()) self.tagschanged(tuple())

View File

@ -54,7 +54,6 @@ ocrsetting = tryreadconfig("ocrsetting.json")
vndbtagdata = tryreadconfig("vndbtagdata.json") vndbtagdata = tryreadconfig("vndbtagdata.json")
def getdefaultsavehook(gamepath, title=None): def getdefaultsavehook(gamepath, title=None):
default = { default = {
"localeswitcher": 0, "localeswitcher": 0,
@ -93,6 +92,7 @@ def getdefaultsavehook(gamepath, title=None):
"usertags": [], "usertags": [],
"traceplaytime_v2": [], # [[start,end]] "traceplaytime_v2": [], # [[start,end]]
"autosavesavedata": "", "autosavesavedata": "",
"developers": [],
} }
if gamepath == "0": if gamepath == "0":
default["title"] = "No Game" default["title"] = "No Game"

View File

@ -62,6 +62,7 @@ def checkvid(gamepath):
checkimage(gamepath) checkimage(gamepath)
or checkinfo(gamepath) or checkinfo(gamepath)
or (len(savehook_new_data[gamepath]["vndbtags"]) == 0) or (len(savehook_new_data[gamepath]["vndbtags"]) == 0)
or (len(savehook_new_data[gamepath]["developers"]) == 0)
) )
else: else:
return ( return (
@ -131,6 +132,7 @@ def everymethodsthread():
vid = data.get("vid", None) vid = data.get("vid", None)
title = data.get("title", None) title = data.get("title", None)
namemap = data.get("namemap", None) namemap = data.get("namemap", None)
developers = data.get("developers", None)
vndbtags = data.get("vndbtags", None) vndbtags = data.get("vndbtags", None)
if not vid: if not vid:
continue continue
@ -146,7 +148,8 @@ def everymethodsthread():
savehook_new_data[gamepath]["namemap"] = namemap savehook_new_data[gamepath]["namemap"] = namemap
if vndbtags: if vndbtags:
savehook_new_data[gamepath]["vndbtags"] = vndbtags savehook_new_data[gamepath]["vndbtags"] = vndbtags
if developers:
savehook_new_data[gamepath]["developers"] = developers
succ = True succ = True
break break
if succ == False: if succ == False:

View File

@ -1,6 +1,6 @@
import time, requests, re, os, hashlib import time, requests, re, os, hashlib
from myutils.proxy import getproxy from myutils.proxy import getproxy
from myutils.config import globalconfig,vndbtagdata from myutils.config import globalconfig, vndbtagdata
from threading import Thread from threading import Thread
import gzip, json import gzip, json
import shutil import shutil
@ -138,6 +138,20 @@ def getvidbytitle_release(title):
) )
def getdevelopersbyid(vid):
def _js(js):
_ = []
for item in js["results"][0]["developers"]:
_.append(item["name"])
return _
return safegetvndbjson(
"https://api.vndb.org/kana/vn",
{"filters": ["id", "=", vid], "fields": "developers.name"},
_js,
)
def getvidbytitle(title): def getvidbytitle(title):
vid = getvidbytitle_vn(title) vid = getvidbytitle_vn(title)
if vid: if vid:
@ -188,12 +202,13 @@ def safedownload():
js = json.load(ff) js = json.load(ff)
newjs = {} newjs = {}
for item in js: for item in js:
gid = 'g'+str(item['id']) gid = "g" + str(item["id"])
name = item["name"] name = item["name"]
newjs[gid] = name newjs[gid] = name
return newjs return newjs
except: except:
from traceback import print_exc from traceback import print_exc
print_exc() print_exc()
return None return None
@ -243,6 +258,7 @@ def searchforidimage(titleorid):
title = gettitlebyid(vid) title = gettitlebyid(vid)
namemap = getcharnamemapbyid(vid) namemap = getcharnamemapbyid(vid)
vndbtags = getvntagsbyid(vid) vndbtags = getvntagsbyid(vid)
developers = getdevelopersbyid(vid)
return { return {
"namemap": namemap, "namemap": namemap,
"title": title, "title": title,
@ -250,6 +266,7 @@ def searchforidimage(titleorid):
"infopath": vndbdowloadinfo(vid), "infopath": vndbdowloadinfo(vid),
"imagepath": vndbdownloadimg(img), "imagepath": vndbdownloadimg(img),
"vndbtags": vndbtags, "vndbtags": vndbtags,
"developers": developers,
} }