This commit is contained in:
恍兮惚兮 2024-09-18 15:55:26 +08:00
parent 31b5f45be3
commit 29cb1bc03a
5 changed files with 80 additions and 66 deletions

View File

@ -62,7 +62,7 @@ class noundictconfigdialog1(LDialog):
self.model = LStandardItemModel()
self.model.setHorizontalHeaderLabels(label)
table = TableViewW(self)
table = TableViewW(self, copypaste=True, updown=True)
table.setModel(self.model)
table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeMode.Stretch)
table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeMode.Stretch)
@ -72,7 +72,6 @@ class noundictconfigdialog1(LDialog):
table.horizontalHeader().setSectionResizeMode(
0, QHeaderView.ResizeMode.ResizeToContents
)
table.setsimplemenu()
self.table = table
for row, item in enumerate(reflist):
@ -122,19 +121,24 @@ class noundictconfigdialog1(LDialog):
def __setindexwidget(self, index: QModelIndex, data):
if index.column() == 0:
data = {"regex": data.lower() == "true"}
self.table.setIndexWidget(index, getsimpleswitch(data, "regex"))
if index.column() == 1:
elif index.column() == 1:
data = {"escape": data.lower() == "true"}
self.table.setIndexWidget(index, getsimpleswitch(data, "escape"))
else:
self.table.model().setItem(index.row(), index.column(), QStandardItem(data))
def __getindexwidgetdata(self, index: QModelIndex):
if index.column() == 0:
return {"regex": self.table.indexWidgetX(index).isChecked()}
return self.table.indexWidgetX(index).isChecked()
if index.column() == 1:
return {"escape": self.table.indexWidgetX(index).isChecked()}
return self.table.indexWidgetX(index).isChecked()
return self.table.safetext(index)
def apply(self):
def __check(row):
k = self.model.item(row, 2).text()
k = self.table.safetext(row, 2)
if k == "":
return ""
switch = self.table.indexWidgetX(row, 0).isChecked()
@ -144,8 +148,8 @@ class noundictconfigdialog1(LDialog):
self.table.dedumpmodel(__check)
self.reflist.clear()
for row in range(self.model.rowCount()):
k = self.model.item(row, 2).text()
v = self.model.item(row, 3).text()
k = self.table.safetext(row, 2)
v = self.table.safetext(row, 3)
switch = self.table.indexWidgetX(row, 0)
es = self.table.indexWidgetX(row, 1)
self.reflist.append(
@ -321,7 +325,7 @@ class yuyinzhidingsetting(LDialog):
self.model = LStandardItemModel()
self.model.setHorizontalHeaderLabels(["正则", "条件", "目标", "指定为"])
table = TableViewW(self)
table = TableViewW(self, updown=True, copypaste=False)
table.setModel(self.model)
table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeMode.Stretch)
table.horizontalHeader().setSectionResizeMode(
@ -333,7 +337,6 @@ class yuyinzhidingsetting(LDialog):
table.horizontalHeader().setSectionResizeMode(
0, QHeaderView.ResizeMode.ResizeToContents
)
table.setsimplemenu({"copypaste": False})
self.table = table
for row, item in enumerate(reflist):
@ -386,7 +389,7 @@ class yuyinzhidingsetting(LDialog):
rows = self.model.rowCount()
self.reflist.clear()
for row in range(rows):
k = self.model.item(row, 2).text()
k = self.table.safetext(row, 2)
switch = self.table.indexWidgetX(row, 0)
con = self.table.indexWidgetX(row, 1)
con2 = self.table.indexWidgetX(row, 3)
@ -732,14 +735,14 @@ class postconfigdialog_(LDialog):
if isinstance(self.configdict, dict):
for row in range(rows):
text = self.model.item(row, 0).text()
self.configdict[text] = self.model.item(row, 1).text()
text = self.table.safetext(row, 0)
self.configdict[text] = self.table.safetext(row, 1)
elif isinstance(self.configdict, list):
for row in range(rows):
text = self.model.item(row, 0).text()
text = self.table.safetext(row, 0)
item = {}
for _i, key in enumerate(self.dictkeys):
item[key] = self.model.item(row, _i).text()
item[key] = self.table.safetext(row, _i)
self.configdict.append(item)
else:
raise
@ -769,11 +772,10 @@ class postconfigdialog_(LDialog):
else:
raise
model.setHorizontalHeaderLabels(headers)
table = TableViewW(self)
table = TableViewW(self, copypaste=True, updown=True)
table.setModel(model)
table.setWordWrap(False)
table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
table.setsimplemenu()
button = threebuttons(texts=["添加行", "删除行", "上移", "下移", "立即应用"])
self.table = table
button.btn1clicked.connect(table.insertplainrow)

View File

@ -1,5 +1,5 @@
from qtsymbols import *
import os, platform, functools, uuid, json, math
import os, platform, functools, uuid, json, math, csv, io
from traceback import print_exc
import windows, qtawesome, winsharedutils, gobject
from webviewpy import webview_native_handle_kind_t, Webview, declare_library_path
@ -87,11 +87,16 @@ class FocusDoubleSpin(QDoubleSpinBox):
class TableViewW(QTableView):
def __init__(self, *argc) -> None:
def __init__(self, *argc, updown=False, copypaste=False) -> None:
super().__init__(*argc)
self.setSelectionMode(QAbstractItemView.SelectionMode.ContiguousSelection)
self.copypaste = copypaste
self.updown = updown
if updown or copypaste:
self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.customContextMenuRequested.connect(self.showmenu)
def showmenu(self, info, pos):
def showmenu(self, pos):
r = self.currentIndex().row()
if r < 0:
return
@ -100,9 +105,10 @@ class TableViewW(QTableView):
down = LAction("下移")
copy = LAction("复制")
paste = LAction("粘贴")
menu.addAction(up)
menu.addAction(down)
if info.get("copypaste", True):
if self.updown:
menu.addAction(up)
menu.addAction(down)
if self.copypaste:
menu.addAction(copy)
menu.addAction(paste)
action = menu.exec(self.cursor().pos())
@ -115,11 +121,19 @@ class TableViewW(QTableView):
elif action == paste:
self.pastetable()
def setsimplemenu(self, info=None):
self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
if info is None:
info = {}
self.customContextMenuRequested.connect(functools.partial(self.showmenu, info))
def keyPressEvent(self, e):
if self.copypaste:
if e.modifiers() == Qt.KeyboardModifier.ControlModifier:
if e.key() == Qt.Key.Key_C:
self.copytable()
elif e.key() == Qt.Key.Key_V:
self.pastetable()
else:
super().keyPressEvent(e)
else:
super().keyPressEvent(e)
else:
super().keyPressEvent(e)
def insertplainrow(self, row=0):
self.model().insertRow(
@ -211,7 +225,8 @@ class TableViewW(QTableView):
def getindexwidgetdata(self, index: QModelIndex): ...
def setindexwidget(self, index, data): ...
def setindexwidget(self, index, data):
self.model().setItem(index.row(), index.column(), QStandardItem(data))
def safetext(self, row_or_index, col=None, mybewidget=False):
if col is None:
@ -229,50 +244,47 @@ class TableViewW(QTableView):
return _1
def copytable(self) -> str:
if len(self.selectedIndexes()) <= 1:
return winsharedutils.clipboard_set(self.safetext(self.currentIndex()))
_data = []
minr = minc = 999999999
maxr = maxc = 0
lastrow = -1
for index in self.selectedIndexes():
minr = min(minr, index.row())
minc = min(minc, index.column())
maxr = max(maxr, index.row())
maxc = max(maxc, index.column())
_data.append(self.safetext(index, mybewidget=True))
data = {
"data": _data,
"row": maxr - minr + 1,
"col": maxc - minc + 1,
}
winsharedutils.clipboard_set(json.dumps(data, ensure_ascii=False))
if index.row() != lastrow:
_data.append([])
lastrow = index.row()
_data[-1].append(self.safetext(index, mybewidget=True))
output = io.StringIO()
csv_writer = csv.writer(output, delimiter="\t")
for row in _data:
csv_writer.writerow(row)
csv_str = output.getvalue()
output.close()
winsharedutils.clipboard_set(csv_str)
def pastetable(self):
string = winsharedutils.clipboard_get()
current = self.currentIndex()
try:
js = json.loads(string)
current = self.currentIndex()
for _ in range(js["row"]):
csv_file = io.StringIO(string)
csv_reader = csv.reader(csv_file, delimiter="\t")
my_list = list(csv_reader)
csv_file.close()
if len(my_list) == 1 and len(my_list[0]) == 1:
self.model().itemFromIndex(current).setText(my_list[0][0])
return
for j, line in enumerate(my_list):
self.insertplainrow(current.row() + 1)
for i, data in enumerate(js.get("data", [])):
c = current.column() + i % js["col"]
if c >= self.model().columnCount():
continue
if isinstance(data, str):
self.model().setItem(
current.row() + 1 + i // js["col"], c, QStandardItem(data)
)
else:
self.model().setItem(
current.row() + 1 + i // js["col"], c, QStandardItem("")
)
for j, line in enumerate(my_list):
for i in range(len(line)):
data = line[i]
c = current.column() + i
if c >= self.model().columnCount():
continue
self.setindexwidget(
self.model().index(current.row() + 1 + i // js["col"], c), data
self.model().index(current.row() + 1 + j, c), data
)
except:
print_exc()
self.model().itemFromIndex(self.currentIndex()).setText(string)
self.model().itemFromIndex(current).setText(string)
def getQMessageBox(

View File

@ -130,7 +130,7 @@ class common:
ff.write(_content)
def dispatchdownloadtask(self, url):
if url is None:
if not url:
return None
__routine = f"cache/metadata/{self.typename}"
if self.typename == "vndb":

View File

@ -144,7 +144,7 @@ def getinfosbyvid(proxy, vid):
return dict(
title=gettitlefromjs(js["results"][0]),
img=js["results"][0]["image"]["url"],
img=js["results"][0]["image"]["url"] if js["results"][0]["image"] else None,
sc=imgs,
dev=dev,
tags=sorted(tags, key=lambda x: -rates[tags.index(x)]),

View File

@ -28,8 +28,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/version)
include(generate_product_version)
set(VERSION_MAJOR 5)
set(VERSION_MINOR 37)
set(VERSION_PATCH 2)
set(VERSION_MINOR 38)
set(VERSION_PATCH 0)
add_library(pch pch.cpp)
target_precompile_headers(pch PUBLIC pch.h)