This commit is contained in:
恍兮惚兮 2024-06-03 13:02:36 +08:00
parent 7b57274041
commit 3821c7089a

View File

@ -1,6 +1,6 @@
from PyQt5.QtGui import QMouseEvent from PyQt5.QtGui import QMouseEvent
from qtsymbols import * from qtsymbols import *
import os, functools, uuid import os, functools, uuid, threading
from datetime import datetime, timedelta from datetime import datetime, timedelta
from traceback import print_exc from traceback import print_exc
import windows, gobject, winsharedutils import windows, gobject, winsharedutils
@ -41,8 +41,10 @@ from gui.usefulwidget import (
auto_select_webview, auto_select_webview,
Prompt_dialog, Prompt_dialog,
getsimplecombobox, getsimplecombobox,
D_getsimpleswitch,
getspinbox, getspinbox,
getcolorbutton, getcolorbutton,
D_getcolorbutton,
makesubtab_lazy, makesubtab_lazy,
tabadd_lazy, tabadd_lazy,
getsimpleswitch, getsimpleswitch,
@ -1538,39 +1540,45 @@ def addgamebatch(callback, targetlist):
@Singleton_close @Singleton_close
class dialog_savedgame_integrated(saveposwindow): class dialog_savedgame_integrated(saveposwindow):
def selectlayout(self, type):
globalconfig["gamemanager_integrated_internal_layout"] = type
klass = [dialog_savedgame_new, dialog_savedgame_v3, dialog_savedgame_lagacy][
type
]
[self.layout1btn, self.layout2btn, self.layout3btn][(type) % 3].setEnabled( def selectlayout(self, type):
False try:
) globalconfig["gamemanager_integrated_internal_layout"] = type
[self.layout1btn, self.layout2btn, self.layout3btn][(type + 1) % 3].setEnabled( klass = [
False dialog_savedgame_new,
) dialog_savedgame_v3,
[self.layout1btn, self.layout2btn, self.layout3btn][(type + 2) % 3].setEnabled( dialog_savedgame_lagacy,
False ][type]
)
[self.layout1btn, self.layout2btn, self.layout3btn][(type + 1) % 3].setChecked( [self.layout1btn, self.layout2btn, self.layout3btn][(type) % 3].setEnabled(
False False
) )
[self.layout1btn, self.layout2btn, self.layout3btn][(type + 2) % 3].setChecked( [self.layout1btn, self.layout2btn, self.layout3btn][
False (type + 1) % 3
) ].setEnabled(False)
_old = self.internallayout.takeAt(0).widget() [self.layout1btn, self.layout2btn, self.layout3btn][
_old.hide() (type + 2) % 3
_ = klass(self) ].setEnabled(False)
self.internallayout.addWidget(_) [self.layout1btn, self.layout2btn, self.layout3btn][
_.directshow() (type + 1) % 3
_old.deleteLater() ].setChecked(False)
[self.layout1btn, self.layout2btn, self.layout3btn][(type + 1) % 3].setEnabled( [self.layout1btn, self.layout2btn, self.layout3btn][
True (type + 2) % 3
) ].setChecked(False)
[self.layout1btn, self.layout2btn, self.layout3btn][(type + 2) % 3].setEnabled( _old = self.internallayout.takeAt(0).widget()
True _old.hide()
) _ = klass(self)
self.internallayout.addWidget(_)
_.directshow()
_old.deleteLater()
[self.layout1btn, self.layout2btn, self.layout3btn][
(type + 1) % 3
].setEnabled(True)
[self.layout1btn, self.layout2btn, self.layout3btn][
(type + 2) % 3
].setEnabled(True)
except:
print_exc()
def __init__(self, parent) -> None: def __init__(self, parent) -> None:
super().__init__( super().__init__(
@ -1693,7 +1701,6 @@ class dialog_savedgame_new(QWidget):
continue continue
self.newline(k) self.newline(k)
def showmenu(self, p): def showmenu(self, p):
menu = QMenu(self) menu = QMenu(self)
startgame = QAction(_TR("开始游戏")) startgame = QAction(_TR("开始游戏"))
@ -1906,12 +1913,88 @@ class dialog_savedgame_new(QWidget):
) )
class LazyLoadTableView(QTableView):
def __init__(self, model: QStandardItemModel) -> None:
super().__init__()
self.widgetfunction = []
self.lock = threading.Lock()
self.setModel(model)
self.started = False
def starttraceir(self):
self.started = True
self.model().rowsRemoved.connect(functools.partial(self.insertremove))
self.model().rowsInserted.connect(functools.partial(self.insert))
def resizeEvent(self, e):
self.loadVisibleRows()
super().resizeEvent(e)
def insertremove(self, index, start, end):
off = end - start + 1
with self.lock:
collect = []
for i in range(len(self.widgetfunction)):
if self.widgetfunction[i][0] > end:
self.widgetfunction[i][0] -= off
elif (
self.widgetfunction[i][0] >= start
and self.widgetfunction[i][0] <= end
):
collect.append(i)
for i in collect:
self.widgetfunction.pop(i)
self.loadVisibleRows()
def insert(self, index, start, end):
off = end - start + 1
with self.lock:
for i in range(len(self.widgetfunction)):
if self.widgetfunction[i][0] >= start:
self.widgetfunction[i][0] += off
print(self.widgetfunction[i])
self.loadVisibleRows()
def setIndexWidget(self, index: QModelIndex, widgetf):
if not self.started:
self.widgetfunction.append([index.row(), index.column(), widgetf])
return
if self.visualRect(index).intersects(self.viewport().rect()):
w = widgetf()
super().setIndexWidget(index, w)
else:
with self.lock:
self.widgetfunction.append([index.row(), index.column(), widgetf])
def scrollContentsBy(self, dx, dy):
super().scrollContentsBy(dx, dy)
self.loadVisibleRows()
def loadVisibleRows(self):
with self.lock:
collect = []
for i, index in enumerate(self.widgetfunction):
row, col, wf = index
if self.visualRect(self.model().index(row, col)).intersects(
self.viewport().rect()
):
collect.insert(0, i)
for i in collect:
row, col, wf = self.widgetfunction.pop(i)
w = wf()
super().setIndexWidget(self.model().index(row, col), w)
class dialog_savedgame_lagacy(QWidget): class dialog_savedgame_lagacy(QWidget):
def directshow(self): def directshow(self):
pass pass
def showsettingdialog(self, k, item): def showsettingdialog(self, k):
dialog_setting_game(self, k) dialog_setting_game(self, k)
def clicked2(self): def clicked2(self):
@ -1935,6 +2018,11 @@ class dialog_savedgame_lagacy(QWidget):
self, self.model.item(self.table.currentIndex().row(), 2).savetext self, self.model.item(self.table.currentIndex().row(), 2).savetext
) )
def delayloadicon(self, k):
return getcolorbutton(
"", "", functools.partial(opendir, k), qicon=getExeIcon(k, cache=True)
)
def newline(self, row, k): def newline(self, row, k):
keyitem = QStandardItem() keyitem = QStandardItem()
keyitem.savetext = k keyitem.savetext = k
@ -1949,21 +2037,19 @@ class dialog_savedgame_lagacy(QWidget):
], ],
) )
self.table.setIndexWidget( self.table.setIndexWidget(
self.model.index(row, 0), getsimpleswitch(savehook_new_data[k], "leuse") self.model.index(row, 0), D_getsimpleswitch(savehook_new_data[k], "leuse")
) )
self.table.setIndexWidget( self.table.setIndexWidget(
self.model.index(row, 1), self.model.index(row, 1),
getcolorbutton( functools.partial(self.delayloadicon, k),
"", "", functools.partial(opendir, k), qicon=getExeIcon(k, cache=True)
),
) )
self.table.setIndexWidget( self.table.setIndexWidget(
self.model.index(row, 2), self.model.index(row, 2),
getcolorbutton( D_getcolorbutton(
"", "",
"", "",
functools.partial(self.showsettingdialog, k, keyitem), functools.partial(self.showsettingdialog, k),
icon="fa.gear", icon="fa.gear",
constcolor="#FF69B4", constcolor="#FF69B4",
), ),
@ -1981,7 +2067,7 @@ class dialog_savedgame_lagacy(QWidget):
self.model = model self.model = model
table = QTableView() table = LazyLoadTableView(model)
table.horizontalHeader().setSectionResizeMode( table.horizontalHeader().setSectionResizeMode(
QHeaderView.ResizeMode.ResizeToContents QHeaderView.ResizeMode.ResizeToContents
) )
@ -1990,10 +2076,10 @@ class dialog_savedgame_lagacy(QWidget):
table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
table.setSelectionMode((QAbstractItemView.SelectionMode.SingleSelection)) table.setSelectionMode((QAbstractItemView.SelectionMode.SingleSelection))
table.setWordWrap(False) table.setWordWrap(False)
table.setModel(model)
self.table = table self.table = table
for row, k in enumerate(savehook_new_list): # 2 for row, k in enumerate(savehook_new_list): # 2
self.newline(row, k) self.newline(row, k)
self.table.starttraceir()
button = QPushButton() button = QPushButton()
button.setText(_TR("开始游戏")) button.setText(_TR("开始游戏"))
self.button = button self.button = button
@ -2236,7 +2322,9 @@ class dialog_savedgame_v3(QWidget):
self.stack = stackedlist() self.stack = stackedlist()
self.stack.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.stack.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.stack.customContextMenuRequested.connect(self.stack_showmenu) self.stack.customContextMenuRequested.connect(self.stack_showmenu)
self.stack.setFixedWidth(globalconfig["dialog_savegame_layout"]["listitemwidth"]) self.stack.setFixedWidth(
globalconfig["dialog_savegame_layout"]["listitemwidth"]
)
self.stack.bgclicked.connect(clickitem.clearfocus) self.stack.bgclicked.connect(clickitem.clearfocus)
lay = QHBoxLayout() lay = QHBoxLayout()
self.setLayout(lay) self.setLayout(lay)