From 2bccff08dc8d2d1be6d9d1c0459e2dfd834f211e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=81=8D=E5=85=AE=E6=83=9A=E5=85=AE?= <101191390+HIllya51@users.noreply.github.com> Date: Wed, 24 Jan 2024 16:48:55 +0800 Subject: [PATCH] fix --- .../LunaTranslator/LunaTranslator.py | 4 +- .../LunaTranslator/gui/dialog_savedgame.py | 41 +++++++---- .../LunaTranslator/gui/translatorUI.py | 2 +- .../LunaTranslator/myutils/config.py | 9 ++- .../LunaTranslator/myutils/utils.py | 8 ++- LunaTranslator/LunaTranslator/myutils/vndb.py | 2 +- .../LunaTranslator/myutils/wrapper.py | 69 +++++++++---------- plugins/winsharedutils/SimpleBrowser.cpp | 2 +- 8 files changed, 78 insertions(+), 59 deletions(-) diff --git a/LunaTranslator/LunaTranslator/LunaTranslator.py b/LunaTranslator/LunaTranslator/LunaTranslator.py index 85af42f1..867ede81 100644 --- a/LunaTranslator/LunaTranslator/LunaTranslator.py +++ b/LunaTranslator/LunaTranslator/LunaTranslator.py @@ -360,8 +360,8 @@ class MAINUI() : def selectprocess(self,selectedp): self.textsource=None - pids,pexe,hwnd=( selectedp) - checkifnewgame(pexe) + pids,pexe,hwnd=( selectedp) + checkifnewgame(pexe,windows.GetWindowText(hwnd)) if globalconfig['sourcestatus2']['texthook']['use']: self.textsource=texthook(pids,hwnd,pexe) elif globalconfig['sourcestatus2']['fridahook']['use']: diff --git a/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py b/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py index 4c9a2c12..ac0e506f 100644 --- a/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py +++ b/LunaTranslator/LunaTranslator/gui/dialog_savedgame.py @@ -29,7 +29,6 @@ from myutils.utils import checkifnewgame ,loadfridascriptslist from myutils.proxy import getproxy from gui.usefulwidget import yuitsu_switch,saveposwindow,getboxlayout from myutils.vndb import parsehtmlmethod -from webview import Webview class ItemWidget(QWidget): focuschanged=pyqtSignal(bool,str) doubleclicked=pyqtSignal(str) @@ -256,7 +255,7 @@ class browserdialog(QDialog): def parsehtml(self,exepath): try: - newpath=parsehtmlmethod(savehook_new_data[exepath]['vid'],savehook_new_data[exepath]['infopath']) + newpath=parsehtmlmethod(savehook_new_data[exepath]['infopath']) except: print_exc() newpath=savehook_new_data[exepath]['infopath'] @@ -264,42 +263,56 @@ class browserdialog(QDialog): newpath=os.path.abspath(newpath) return newpath def resizeEvent(self, a0: QResizeEvent) -> None: + if self._resizable==False:return self.nettab.resize(a0.size().width(),self.nettab.height()) if self.webviewv==0: self.browser.resize(0,self.nettab.height(),a0.size().width(),a0.size().height()-self.nettab.height()) elif self.webviewv==1: self.browser.set_geo(0,self.nettab.height(),a0.size().width(),a0.size().height()-self.nettab.height()) - def __init__(self, parent,exepath ) -> None: + def __init__(self, parent,textsource_or_exepath ) -> None: super().__init__(parent, Qt.WindowMinMaxButtonsHint|Qt.WindowCloseButtonHint) - self.exepath=exepath + if isinstance(textsource_or_exepath,str): + self.exepath=textsource_or_exepath + else: + try: + self.exepath=textsource_or_exepath.pname + except: + self.exepath='0' + self._resizable=False + self.resize(1300,801) self.webviewv=globalconfig['usewebview'] - self.resize(1300,800) if self.webviewv==0: self.browser= winsharedutils.HTMLBrowser(int(self.winId())) elif self.webviewv==1: - self.browser=Webview(0,int(self.winId())) - self.setWindowTitle(savehook_new_data[exepath]['title']) + from webview import Webview + self.browser=Webview(0,int(self.winId())) #构造函数里会触发ResizeEvent。虽然确实有问题,但很奇怪前一天晚上正常,第二天起来就崩溃了。 + self.setWindowTitle(savehook_new_data[self.exepath]['title']) self.nettab=QTabWidget(self) self.nettab.setFixedHeight(self.nettab.tabBar().height()+10) tabBar = CustomTabBar(self) self.nettab.setTabBar(tabBar) tabBar.lastclick.connect(self.lastclicked) #self.nettab.setSizePolicy( QSizePolicy.Preferred,QSizePolicy.Fixed) - self.nettab.addTab(QWidget(),"vndb") + self.hasvndb=bool(savehook_new_data[self.exepath]['infopath'] and os.path.exists(savehook_new_data[self.exepath]['infopath'])) + if self.hasvndb: + self.nettab.addTab(QWidget(),"vndb") for lnk in savehook_new_data[self.exepath]['relationlinks']: self.nettab.addTab(QWidget(),lnk[0]) self.nettab.addTab(QWidget(),"+") self.nettab.currentChanged.connect(self.changetab) self.nettab.setContextMenuPolicy(Qt.CustomContextMenu) self.nettab.customContextMenuRequested.connect(self.showmenu) - self.changetab(0) + if self.hasvndb + len(savehook_new_data[self.exepath]['relationlinks']): + self.changetab(0) #vbox.addWidget(self.nettab) #vbox.addWidget(qww) + self._resizable=True + self.resize(1300,800) self.show() def showmenu(self,p): tab_index = self.nettab.tabBar().tabAt(p) - if tab_index ==0 or tab_index==self.nettab.count()-1: + if (self.hasvndb and tab_index ==0) or tab_index==self.nettab.count()-1: return menu=QMenu(self ) shanchu=QAction(_TR("删除")) @@ -310,7 +323,7 @@ class browserdialog(QDialog): if action==shanchu: self.nettab.setCurrentIndex(0) self.nettab.removeTab(tab_index) - savehook_new_data[self.exepath]['relationlinks'].pop(tab_index-1) + savehook_new_data[self.exepath]['relationlinks'].pop(tab_index-self.hasvndb) elif action==cache: def cachehtml(exepath,idx): url=savehook_new_data[exepath]['relationlinks'][idx][1] @@ -343,7 +356,7 @@ class browserdialog(QDialog): savehook_new_data[exepath]['relationlinks'][i][2]=fn else: savehook_new_data[exepath]['relationlinks'][i].append(fn) - threading.Thread(target=cachehtml,args=(self.exepath,tab_index-1)).start() + threading.Thread(target=cachehtml,args=(self.exepath,tab_index-self.hasvndb)).start() def lastclicked(self): def callback(texts): if len(texts[0].strip()) and len(texts[1].strip()): @@ -351,13 +364,13 @@ class browserdialog(QDialog): self.nettab.insertTab(self.nettab.count()-1,QWidget(),texts[0]) gobject.baseobject.Prompt.call.emit(_TR('添加关联页面'),_TR('页面类型_页面链接'),[['vndb/2df/...'],'about:blank'],[callback]) def changetab(self,idx): - if idx==0: + if self.hasvndb and idx==0: try: self.browser.navigate((self.parsehtml( self.exepath))) except: self.browser.navigate('about:blank') else: - lnks=savehook_new_data[self.exepath]['relationlinks'][idx-1] + lnks=savehook_new_data[self.exepath]['relationlinks'][idx-self.hasvndb] if len(lnks)==3 and os.path.exists(lnks[2]): link=os.path.abspath(lnks[2]) else: diff --git a/LunaTranslator/LunaTranslator/gui/translatorUI.py b/LunaTranslator/LunaTranslator/gui/translatorUI.py index 99ad6927..61f17195 100644 --- a/LunaTranslator/LunaTranslator/gui/translatorUI.py +++ b/LunaTranslator/LunaTranslator/gui/translatorUI.py @@ -275,7 +275,7 @@ class QUnFrameWindow(resizableframeless): ("simulate_key_ctrl",lambda:threading.Thread(target=simulate_key_ctrl).start()), ("simulate_key_enter",lambda:threading.Thread(target=simulate_key_enter).start() ), ("copy_once",lambda:gobject.baseobject.textgetmethod(winsharedutils.clipboard_get(),False) ), - ("open_relative_link",lambda:browserdialog(gobject.baseobject.settin_ui,gobject.baseobject.textsource.pname) ), + ("open_relative_link",lambda:browserdialog(gobject.baseobject.settin_ui,gobject.baseobject.textsource) ), ("ocr_once",lambda:rangeselct_function(self,ocroncefunction,False,False) ), ("minmize",self.hide_and_disableautohide), diff --git a/LunaTranslator/LunaTranslator/myutils/config.py b/LunaTranslator/LunaTranslator/myutils/config.py index fc1608c0..8f7d1968 100644 --- a/LunaTranslator/LunaTranslator/myutils/config.py +++ b/LunaTranslator/LunaTranslator/myutils/config.py @@ -46,7 +46,7 @@ except: translatorsetting=tryreadconfig('translatorsetting.json') ocrsetting=tryreadconfig('ocrsetting.json') -def getdefaultsavehook(gamepath): +def getdefaultsavehook(gamepath,title=None): default={ 'localeswitcher':0, 'onloadautochangemode2':0, @@ -63,7 +63,6 @@ def getdefaultsavehook(gamepath): 'inserthooktimeout':0, 'needinserthookcode':[], "removeuseless":False, - 'title':os.path.basename(os.path.dirname(gamepath))+'/'+ os.path.basename(gamepath), "codepage_index":0, "allow_tts_auto_names":'', "hooktypeasname":{}, @@ -72,6 +71,12 @@ def getdefaultsavehook(gamepath): "searchnoresulttime":0, 'relationlinks':[] } + if gamepath=='0': + default['title']='No Game' + elif title and len(title): + default['title']=title + else: + default['title']=os.path.basename(os.path.dirname(gamepath))+'/'+ os.path.basename(gamepath) return default _dfsavehook=getdefaultsavehook('') diff --git a/LunaTranslator/LunaTranslator/myutils/utils.py b/LunaTranslator/LunaTranslator/myutils/utils.py index c6626000..93b32f7b 100644 --- a/LunaTranslator/LunaTranslator/myutils/utils.py +++ b/LunaTranslator/LunaTranslator/myutils/utils.py @@ -84,12 +84,14 @@ def everymethodsthread(): if succ==False: savehook_new_data[gamepath]['searchnoresulttime']=time.time() threading.Thread(target=everymethodsthread).start() -def checkifnewgame(gamepath): +def checkifnewgame(gamepath,title=None): if gamepath not in savehook_new_list: savehook_new_list.insert(0,gamepath) if gamepath not in savehook_new_data: - savehook_new_data[gamepath]=getdefaultsavehook(gamepath) - dispatachtask(gamepath) + savehook_new_data[gamepath]=getdefaultsavehook(gamepath,title) + if gamepath!='0': + dispatachtask(gamepath) +checkifnewgame('0') kanjichs2ja=str.maketrans(static_data['kanjichs2ja']) def kanjitrans(k): return k.translate(kanjichs2ja) diff --git a/LunaTranslator/LunaTranslator/myutils/vndb.py b/LunaTranslator/LunaTranslator/myutils/vndb.py index 2c6ccb43..26eb1761 100644 --- a/LunaTranslator/LunaTranslator/myutils/vndb.py +++ b/LunaTranslator/LunaTranslator/myutils/vndb.py @@ -118,7 +118,7 @@ def searchforidimage(title): return {'vid':vid,'infopath':vndbdowloadinfo(vid),'imagepath':vndbdownloadimg(img)} import re -def parsehtmlmethod(vid,infopath): +def parsehtmlmethod(infopath): with open(infopath,'r',encoding='utf8') as ff: text=ff.read() ##隐藏横向滚动 diff --git a/LunaTranslator/LunaTranslator/myutils/wrapper.py b/LunaTranslator/LunaTranslator/myutils/wrapper.py index 26fde13c..af244bc0 100644 --- a/LunaTranslator/LunaTranslator/myutils/wrapper.py +++ b/LunaTranslator/LunaTranslator/myutils/wrapper.py @@ -9,44 +9,43 @@ class stripwrapper(dict): return t.strip() else: return t -def Singleton(cls,**kw): - _instance={} - def _singleton(*args,**kwagrs): - try: - if _instance[cls] .isHidden(): - _instance[cls].deleteLater() - _instance[cls]=cls(*args,**kwagrs) - else: - _instance[cls].activateWindow() - _instance[cls].show() - except: - _instance[cls]=cls(*args,**kwagrs) - return _instance[cls] - return _singleton -def Singleton_close(cls,**kw): - _instance={} +def Singleton_impl(cls,behavior='activate'): _lock=threading.Lock() - _status={} + _instance={} def _singleton(*args,**kwagrs): - _lock.acquire() - if len(_status): #qapp.processevent会导致卡在#1处,从而多次点击鼠标都会弹出 - _lock.release() - return None - _status[0]=0 - _lock.release() - try: - if _instance[cls].isHidden(): - _instance[cls].deleteLater() - _instance[cls]=cls(*args,**kwagrs) #1 - else: - _instance[cls].close() - except: - _instance[cls]=cls(*args,**kwagrs) - _lock.acquire() - _status.pop(0) - _lock.release() - return _instance[cls] + if _lock.locked(): + if cls not in _instance:#__init__很慢,来不及放入_instance + pass + elif behavior=='activate': + _instance[cls].activateWindow() + _instance[cls].show() + elif behavior=='close': + _instance[cls].close() + return + _lock.acquire() + class __(cls): + Singleton_flag=1 + def closeEvent( self, a0 ) -> None: + super().closeEvent(a0) + self.Singleton_flag=0 + if cls not in _instance: + pass #__init__没做完的时候不能deletelator + else: + for child in (self.children()): + if hasattr(child,'Singleton_flag'): + child.close() + self.deleteLater() + _instance.pop(cls) + _lock.release() + _inst=__(*args,**kwagrs) + if _inst.Singleton_flag: + _instance[cls]=_inst + return _inst return _singleton +def Singleton(cls): + return Singleton_impl(cls,behavior='activate') +def Singleton_close(cls): + return Singleton_impl(cls,behavior='close') def retryer(**kw): def wrapper(func): def _wrapper(*args,**kwargs): diff --git a/plugins/winsharedutils/SimpleBrowser.cpp b/plugins/winsharedutils/SimpleBrowser.cpp index aa9c639d..8a20290e 100644 --- a/plugins/winsharedutils/SimpleBrowser.cpp +++ b/plugins/winsharedutils/SimpleBrowser.cpp @@ -153,5 +153,5 @@ extern "C" __declspec(dllexport) void html_release(void* web) { if(!web)return; auto ww = static_cast(web); ww->Destroy(); - ww->Release(); + //ww->Release(); Destroy减少引用计数,自动del } \ No newline at end of file