dev 02011812

This commit is contained in:
Julian Freeman
2024-02-01 18:12:45 -04:00
parent 3e17def627
commit 38d98dee94
14 changed files with 536 additions and 406 deletions

View File

@@ -1,12 +1,9 @@
# coding: utf8
import json
from pathlib import Path
from PySide6 import QtWidgets, QtCore, QtGui
from util_ext import scan_extensions, ExtensionsData
from global_vars import (
ExtensionStatusRole,
ExtensionIdRole,
accept_warning,
)
@@ -26,35 +23,37 @@ class UiWgExtensions(object):
self.cbx_unsafe.setChecked(True)
self.cbx_unknown.setChecked(True)
self.cbx_chrome_compat = QtWidgets.QCheckBox("谷歌兼容模式", window)
self.pbn_export_unknown = QtWidgets.QPushButton("导出未知", window)
self.pbn_update = QtWidgets.QPushButton("更新", window)
self.hly_top.addWidget(self.cmbx_browsers)
self.hly_top.addWidget(self.cbx_safe)
self.hly_top.addWidget(self.cbx_unsafe)
self.hly_top.addWidget(self.cbx_unknown)
self.hly_top.addStretch(1)
self.hly_top.addWidget(self.cbx_chrome_compat)
self.hly_top.addWidget(self.pbn_export_unknown)
self.hly_top.addWidget(self.pbn_update)
self.lv_extensions = QtWidgets.QListView(window)
self.vly_m.addWidget(self.lv_extensions)
class ExtensionsListModel(QtCore.QAbstractListModel):
class BaseExtensionsListModel(QtCore.QAbstractListModel):
def __init__(self, browser: str, parent=None):
def __init__(self, parent=None):
super().__init__(parent)
self.all_extensions = {} # type: ExtensionsData
self.names = [] # type: list[tuple[str, str]]
self.icons = {} # type: dict[str, QtGui.QIcon]
self.safe_info = {} # type: dict[str, dict]
self.blank_icon = QtGui.QIcon(":/images/blank_128.png")
self.update(browser)
def update(self, browser: str, is_chrome_compat=False):
def update(self, **kwargs):
raise NotImplementedError
def update_ext(self, browser: str, is_chrome_compat=False):
"""内部用"""
self.all_extensions.clear()
self.names.clear()
self.icons.clear()
self.safe_info.clear()
self.all_extensions = scan_extensions(browser, is_chrome_compat)
for ext_id in self.all_extensions:
@@ -67,8 +66,11 @@ class ExtensionsListModel(QtCore.QAbstractListModel):
self.icons[ext_id] = QtGui.QIcon(icon)
self.names.sort(key=lambda x: x[1].lower())
with open("plg_db_v2.0.json", "r", encoding="utf-8") as f:
self.safe_info = json.load(f)
# print("updated " + browser)
def update_safe_info(self, safe_info: dict):
self.safe_info.clear()
self.safe_info = safe_info
def rowCount(self, parent: QtCore.QModelIndex = ...):
return len(self.names)
@@ -83,7 +85,6 @@ class ExtensionsListModel(QtCore.QAbstractListModel):
return self.icons[ext_id]
if role == QtCore.Qt.ItemDataRole.BackgroundRole:
is_safe = self.data(index, ExtensionStatusRole)
if is_safe is True:
return QtGui.QBrush(QtGui.QColor("lightgreen"))
elif is_safe is False:
@@ -99,6 +100,24 @@ class ExtensionsListModel(QtCore.QAbstractListModel):
return ext_id
class ChromeExtensionsListModel(BaseExtensionsListModel):
def update(self, is_chrome_compat=False):
super().update_ext("Chrome", is_chrome_compat)
class EdgeExtensionsListModel(BaseExtensionsListModel):
def update(self, **kwargs):
super().update_ext("Edge")
class BraveExtensionsListModel(BaseExtensionsListModel):
def update(self, **kwargs):
super().update_ext("Brave")
class BrowsersListModel(QtCore.QAbstractListModel):
def __init__(self, parent=None):
@@ -131,16 +150,24 @@ class WgExtensions(QtWidgets.QWidget):
self.browsers_list_model = BrowsersListModel(self)
self.ui.cmbx_browsers.setModel(self.browsers_list_model)
browser = self.get_current_browser()
self.extensions_list_model = ExtensionsListModel(browser, self)
self.ui.lv_extensions.setModel(self.extensions_list_model)
self.ext_list_models: dict[str, BaseExtensionsListModel] = {
"Chrome": ChromeExtensionsListModel(self),
"Edge": EdgeExtensionsListModel(self),
"Brave": BraveExtensionsListModel(self),
}
self.model_is_initial = {
"Chrome": True,
"Edge": True,
"Brave": True,
}
self.switch_model(self.get_current_browser())
self.ui.cbx_chrome_compat.clicked.connect(self.on_cbx_chrome_compat_clicked)
self.ui.cmbx_browsers.currentTextChanged.connect(self.on_cmbx_browsers_current_text_changed)
self.ui.cbx_safe.clicked.connect(self.on_cbx_safe_clicked)
self.ui.cbx_unsafe.clicked.connect(self.on_cbx_unsafe_clicked)
self.ui.cbx_unknown.clicked.connect(self.on_cbx_unknown_clicked)
self.ui.pbn_export_unknown.clicked.connect(self.on_pbn_export_unknown_clicked)
self.ui.pbn_update.clicked.connect(self.on_pbn_update_clicked)
def get_current_browser(self) -> str:
return self.ui.cmbx_browsers.currentData(QtCore.Qt.ItemDataRole.DisplayRole)
@@ -158,21 +185,31 @@ class WgExtensions(QtWidgets.QWidget):
self.filters_clicked(None, self.ui.cbx_unknown.isChecked())
def update_model(self, browser: str):
# 切换浏览器时
model = self.ext_list_models[browser]
self.show_all_rows()
self.extensions_list_model.update(browser, self.ui.cbx_chrome_compat.isChecked())
model.update(is_chrome_compat=self.ui.cbx_chrome_compat.isChecked())
self.apply_rows_hidden()
def switch_model(self, browser: str):
if self.model_is_initial[browser] is True:
self.update_model(browser)
self.model_is_initial[browser] = False
self.ui.lv_extensions.setModel(self.ext_list_models[browser])
def on_cbx_chrome_compat_clicked(self):
self.update_model(self.get_current_browser())
if self.get_current_browser() == "Chrome":
self.update_model("Chrome")
def on_cmbx_browsers_current_text_changed(self, text: str):
self.update_model(text)
self.switch_model(text)
self.ui.cbx_chrome_compat.setVisible(self.ui.cmbx_browsers.currentText() == "Chrome")
def filters_clicked(self, safe_mark: bool | None, checked: bool):
for row in range(self.extensions_list_model.rowCount()):
idx = self.extensions_list_model.index(row)
is_safe = self.extensions_list_model.data(idx, ExtensionStatusRole)
model = self.ext_list_models[self.get_current_browser()]
for row in range(model.rowCount()):
idx = model.index(row)
is_safe = model.data(idx, ExtensionStatusRole)
if is_safe is safe_mark:
self.ui.lv_extensions.setRowHidden(row, not checked)
@@ -185,26 +222,22 @@ class WgExtensions(QtWidgets.QWidget):
def on_cbx_unknown_clicked(self, checked: bool):
self.filters_clicked(None, checked)
def on_pbn_export_unknown_clicked(self):
dirname = QtWidgets.QFileDialog.getExistingDirectory(self, "导出未知")
if len(dirname) == 0:
return
def on_pbn_update_clicked(self):
self.update_model(self.get_current_browser())
browser = self.get_current_browser()
ex_file = Path(dirname, f"未知插件_{browser}.json")
if accept_warning(self, ex_file.exists(), "警告", "文件已存在,确认覆盖吗?"):
return
def update_safe(self, safe_info: dict):
for browser in self.ext_list_models:
self.ext_list_models[browser].update_safe_info(safe_info)
def export_unknown(self) -> dict[str, dict]:
unknown_ext = {}
for row in range(self.extensions_list_model.rowCount()):
idx = self.extensions_list_model.index(row)
is_safe = self.extensions_list_model.data(idx, ExtensionStatusRole)
if is_safe is None:
ext_id = self.extensions_list_model.data(idx, ExtensionIdRole)
name = self.extensions_list_model.data(idx, QtCore.Qt.ItemDataRole.DisplayRole)
unknown_ext[ext_id] = {"name": name}
with open(ex_file, "w", encoding="utf8") as f:
json.dump(unknown_ext, f, indent=4, ensure_ascii=False)
QtWidgets.QMessageBox.information(self, "提示", f"已导出到 {ex_file}")
for browser in self.ext_list_models:
model = self.ext_list_models[browser]
for row in range(model.rowCount()):
idx = model.index(row)
is_safe = model.data(idx, ExtensionStatusRole)
if is_safe is None:
ext_id = model.data(idx, ExtensionIdRole)
name = model.data(idx, QtCore.Qt.ItemDataRole.DisplayRole)
unknown_ext[ext_id] = {"name": name}
return unknown_ext