167 lines
6.5 KiB
Python
167 lines
6.5 KiB
Python
# coding: utf8
|
||
import sys
|
||
from PySide6 import QtWidgets, QtCore, QtGui
|
||
|
||
from wg_browser_page import WgBrowserPage
|
||
|
||
|
||
class BrowsersListModel(QtCore.QAbstractListModel):
|
||
|
||
def __init__(self, parent=None):
|
||
super().__init__(parent)
|
||
self.browsers = ["Chrome", "Edge", "Brave"]
|
||
self.browser_vars = ["chrome", "edge", "brave"]
|
||
self.icons = [
|
||
QtGui.QIcon(":/images/browsers/chrome_32.png"),
|
||
QtGui.QIcon(":/images/browsers/edge_32.png"),
|
||
QtGui.QIcon(":/images/browsers/brave_32.png"),
|
||
]
|
||
|
||
def rowCount(self, parent: QtCore.QModelIndex = ...):
|
||
return len(self.browsers)
|
||
|
||
def data(self, index: QtCore.QModelIndex, role: int = ...):
|
||
row = index.row()
|
||
|
||
if role == QtCore.Qt.ItemDataRole.DisplayRole:
|
||
return self.browsers[row]
|
||
if role == QtCore.Qt.ItemDataRole.DecorationRole:
|
||
return self.icons[row]
|
||
if role == QtCore.Qt.ItemDataRole.UserRole:
|
||
return self.browser_vars[row]
|
||
|
||
|
||
class AppStyleListModel(QtCore.QAbstractListModel):
|
||
|
||
def __init__(self, parent=None):
|
||
super().__init__(parent)
|
||
if sys.platform == "win32":
|
||
self.styles = ["fusion", "windowsvista", "windows11", "windows"]
|
||
elif sys.platform == "darwin":
|
||
self.styles = ["fusion", "macos", "windows"]
|
||
else:
|
||
self.styles = []
|
||
|
||
def rowCount(self, parent: QtCore.QModelIndex = ...):
|
||
return len(self.styles)
|
||
|
||
def data(self, index: QtCore.QModelIndex, role: int = ...):
|
||
row = index.row()
|
||
|
||
if role == QtCore.Qt.ItemDataRole.DisplayRole:
|
||
return self.styles[row]
|
||
|
||
|
||
class UiMwPoliciesGen(object):
|
||
|
||
def __init__(self, window: QtWidgets.QWidget):
|
||
self.vly_m = QtWidgets.QVBoxLayout()
|
||
window.setLayout(self.vly_m)
|
||
|
||
self.hly_top = QtWidgets.QHBoxLayout()
|
||
self.vly_m.addLayout(self.hly_top)
|
||
|
||
self.cmbx_browsers = QtWidgets.QComboBox(window)
|
||
self.hly_top.addWidget(self.cmbx_browsers)
|
||
|
||
self.vln_1 = QtWidgets.QFrame(window)
|
||
self.vln_1.setFrameShape(QtWidgets.QFrame.Shape.VLine)
|
||
self.vln_1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
|
||
self.hly_top.addWidget(self.vln_1)
|
||
|
||
self.pbn_export = QtWidgets.QPushButton("导出", window)
|
||
self.hly_top.addWidget(self.pbn_export)
|
||
self.pbn_about = QtWidgets.QPushButton("关于", window)
|
||
self.hly_top.addWidget(self.pbn_about)
|
||
|
||
self.hly_top.addStretch(1)
|
||
self.lb_styles = QtWidgets.QLabel("主题:", window)
|
||
self.hly_top.addWidget(self.lb_styles)
|
||
self.cmbx_styles = QtWidgets.QComboBox(window)
|
||
self.hly_top.addWidget(self.cmbx_styles)
|
||
|
||
self.sw_policies = QtWidgets.QStackedWidget(window)
|
||
self.vly_m.addWidget(self.sw_policies)
|
||
|
||
# ============== Stacks ===========================
|
||
|
||
self.sa_chrome_page = QtWidgets.QScrollArea(self.sw_policies)
|
||
self.sa_edge_page = QtWidgets.QScrollArea(self.sw_policies)
|
||
self.sa_brave_page = QtWidgets.QScrollArea(self.sw_policies)
|
||
|
||
self.sw_policies.addWidget(self.sa_chrome_page)
|
||
self.sw_policies.addWidget(self.sa_edge_page)
|
||
self.sw_policies.addWidget(self.sa_brave_page)
|
||
|
||
# =============== Page ======================
|
||
|
||
self.wg_chrome_page = WgBrowserPage("chrome",
|
||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Google\\Chrome",
|
||
self.sa_chrome_page)
|
||
self.sa_chrome_page.setWidget(self.wg_chrome_page)
|
||
self.sa_chrome_page.setWidgetResizable(True)
|
||
|
||
self.wg_edge_page = WgBrowserPage("edge",
|
||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||
self.sa_edge_page)
|
||
self.sa_edge_page.setWidget(self.wg_edge_page)
|
||
self.sa_edge_page.setWidgetResizable(True)
|
||
|
||
self.wg_brave_page = WgBrowserPage("brave",
|
||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\BraveSoftware\\Brave",
|
||
self.sa_brave_page)
|
||
self.sa_brave_page.setWidget(self.wg_brave_page)
|
||
self.sa_brave_page.setWidgetResizable(True)
|
||
|
||
|
||
class MwPoliciesGen(QtWidgets.QWidget):
|
||
|
||
def __init__(self, version: tuple[int, ...], parent=None):
|
||
super().__init__(parent)
|
||
self.ui = UiMwPoliciesGen(self)
|
||
self.setWindowTitle("浏览器策略生成器")
|
||
self.setWindowIcon(QtGui.QIcon(":/images/policies_gen_128.png"))
|
||
|
||
self.version = version
|
||
|
||
self.ui.cmbx_browsers.setModel(BrowsersListModel(self))
|
||
self.ui.cmbx_browsers.currentIndexChanged.connect(self.ui.sw_policies.setCurrentIndex)
|
||
|
||
self.ui.cmbx_styles.setModel(AppStyleListModel(self))
|
||
self.ui.cmbx_styles.currentIndexChanged.connect(self.on_cmbx_styles_current_index_changed)
|
||
# 手动触发
|
||
self.on_cmbx_styles_current_index_changed(0)
|
||
self.ui.pbn_export.clicked.connect(self.on_pbn_export_clicked)
|
||
self.ui.pbn_about.clicked.connect(self.on_pbn_about_clicked)
|
||
|
||
def on_cmbx_styles_current_index_changed(self, index: int):
|
||
model = self.ui.cmbx_styles.model()
|
||
idx = model.index(index, 0)
|
||
style = model.data(idx, QtCore.Qt.ItemDataRole.DisplayRole)
|
||
QtWidgets.QApplication.setStyle(style)
|
||
|
||
def sizeHint(self):
|
||
return QtCore.QSize(800, 600)
|
||
|
||
def on_pbn_export_clicked(self):
|
||
reg_text = ["Windows Registry Editor Version 5.00"]
|
||
pages = [self.ui.wg_chrome_page, self.ui.wg_edge_page, self.ui.wg_brave_page]
|
||
for page in pages:
|
||
reg_text.append(page.get_recommended_settings())
|
||
reg_text.append(page.get_settings())
|
||
reg_text.append(page.get_extensions())
|
||
reg_text.append(page.get_search_engines())
|
||
|
||
filename, _ = QtWidgets.QFileDialog.getSaveFileName(self, "保存", "..", "注册表文件(*.reg);;所有文件(*)")
|
||
if len(filename) == 0:
|
||
return
|
||
|
||
with open(filename, "w", encoding="utf-8") as f:
|
||
f.write("\n\n".join(reg_text))
|
||
QtWidgets.QMessageBox.information(self, "信息", "已导出注册表文件。")
|
||
|
||
def on_pbn_about_clicked(self):
|
||
ver = f"{self.version[0]}.{self.version[1]}.{self.version[2]}"
|
||
msg = f"一个用于生成以 Chromium 为内核的浏览器策略的注册表文件的工具。\n\n版本:{ver},{self.version[-1]}"
|
||
QtWidgets.QMessageBox.about(self, "关于", msg)
|