diff --git a/lib/Sqlite3Helper.py b/lib/Sqlite3Helper.py index 4d0cb66..40482a7 100644 --- a/lib/Sqlite3Helper.py +++ b/lib/Sqlite3Helper.py @@ -255,6 +255,7 @@ def order(column: Column | str | int, class Sqlite3Worker(object): def __init__(self, db_name: str | PathLike[str] = ":memory:"): + self._db_name = db_name self._conn = sqlite3.connect(db_name) self._cursor = self._conn.cursor() self._is_closed = False @@ -262,6 +263,10 @@ class Sqlite3Worker(object): def __del__(self): self.close() + @property + def db_name(self) -> str: + return self._db_name + def close(self): if self._is_closed is False: self._cursor.close() diff --git a/src/page_load.py b/src/page_load.py index 669d05b..71e76ec 100644 --- a/src/page_load.py +++ b/src/page_load.py @@ -1,8 +1,12 @@ # coding: utf8 +import sqlite3 +from pathlib import Path + from PySide6 import QtWidgets from pykeepass.exceptions import CredentialsError from .gbx_kps_login import GbxKpsLogin +from .utils import accept_warning from lib.Sqlite3Helper import Sqlite3Worker from lib.kps_operations import read_kps_to_db @@ -18,6 +22,14 @@ class WgLoadKps(QtWidgets.QWidget): self.setLayout(self.vly_m) self.vly_m.addStretch(1) + def update_load_status(self, wg: GbxKpsLogin): + db_name = Path(self.sqh.db_name).name + loaded_mem = self.config["loaded_memory"] + if db_name in loaded_mem and wg.lne_path.text() in loaded_mem[db_name]: + wg.set_loaded(True) + else: + wg.set_loaded(False) + def add_kps(self, path: str): wg = GbxKpsLogin(path, self) wg.pbn_remove.clicked_with_item.connect(self.on_item_pbn_remove_clicked) @@ -26,6 +38,9 @@ class WgLoadKps(QtWidgets.QWidget): self.vly_m.insertWidget(self.vly_m.count() - 1, wg) self.kps_wgs.append(wg) + # 检查是否已经加载过 + self.update_load_status(wg) + def on_item_pbn_remove_clicked(self, item: GbxKpsLogin): self.vly_m.removeWidget(item) self.kps_wgs.remove(item) @@ -43,6 +58,11 @@ class WgLoadKps(QtWidgets.QWidget): return item.set_loaded(True) + loaded_mem = self.config["loaded_memory"] + db_name = Path(self.sqh.db_name).name + if db_name not in loaded_mem: + loaded_mem[db_name] = [] + loaded_mem[db_name].append(item.lne_path.text()) def update_sqh(self, sqh: Sqlite3Worker): self.sqh = sqh @@ -53,18 +73,26 @@ class WgLoadKps(QtWidgets.QWidget): class PageLoad(QtWidgets.QWidget): def __init__(self, sqh: Sqlite3Worker, config: dict, parent=None): super().__init__(parent) + self.sqh = sqh + self.config = config + self.hly_m = QtWidgets.QHBoxLayout() self.setLayout(self.hly_m) self.vly_left = QtWidgets.QVBoxLayout() self.hly_m.addLayout(self.vly_left) - self.pbn_add = QtWidgets.QPushButton("添加", self) - self.pbn_add.setMinimumWidth(config["button_min_width"]) - self.vly_left.addWidget(self.pbn_add) - self.pbn_load_all = QtWidgets.QPushButton("加载全部", self) - self.pbn_load_all.setMinimumWidth(config["button_min_width"]) - self.pbn_load_all.setDisabled(True) - self.vly_left.addWidget(self.pbn_load_all) + self.pbn_add_kps = QtWidgets.QPushButton("添加 KPS", self) + self.pbn_add_kps.setMinimumWidth(config["button_min_width"]) + self.vly_left.addWidget(self.pbn_add_kps) + + self.pbn_clear_db = QtWidgets.QPushButton("清空数据库", self) + self.pbn_clear_db.setMinimumWidth(config["button_min_width"]) + self.vly_left.addWidget(self.pbn_clear_db) + + self.pbn_clear_loaded_mem = QtWidgets.QPushButton("清空加载记忆", self) + self.pbn_clear_loaded_mem.setMinimumWidth(config["button_min_width"]) + self.vly_left.addWidget(self.pbn_clear_loaded_mem) + self.vly_left.addStretch(1) self.sa_m = QtWidgets.QScrollArea(self) @@ -73,9 +101,14 @@ class PageLoad(QtWidgets.QWidget): self.wg_sa = WgLoadKps(sqh, config, self.sa_m) self.sa_m.setWidget(self.wg_sa) - self.pbn_add.clicked.connect(self.on_pbn_add_clicked) + self.pbn_add_kps.clicked.connect(self.on_pbn_add_kps_clicked) + self.pbn_clear_db.clicked.connect(self.on_pbn_clear_db_clicked) + self.pbn_clear_loaded_mem.clicked.connect(self.on_pbn_clear_loaded_mem_clicked) - def on_pbn_add_clicked(self): + def update_sqh(self, sqh: Sqlite3Worker): + self.wg_sa.update_sqh(sqh) + + def on_pbn_add_kps_clicked(self): filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "选择", "../", filter="KeePass 2 数据库 (*.kdbx);;所有文件 (*)") if len(filenames) == 0: @@ -83,5 +116,35 @@ class PageLoad(QtWidgets.QWidget): for filename in filenames: self.wg_sa.add_kps(filename) - def update_sqh(self, sqh: Sqlite3Worker): - self.wg_sa.update_sqh(sqh) + def on_pbn_clear_db_clicked(self): + if accept_warning(self, True, "警告", "你确定要清空当前数据库吗?"): + return + + try: + self.sqh.delete_from(self.config["table_name"]) + except sqlite3.OperationalError as e: + QtWidgets.QMessageBox.critical(self, "错误", f"清空数据库失败:\n{e}") + else: + QtWidgets.QMessageBox.information(self, "提示", "已清空数据库") + + # 清空配置文件加载记忆 + loaded_mem = self.config["loaded_memory"] + db_name = Path(self.sqh.db_name).name + if db_name in loaded_mem: + loaded_mem[db_name].clear() + + # 更新kps加载状态 + for wg in self.wg_sa.kps_wgs: + self.wg_sa.update_load_status(wg) + + def on_pbn_clear_loaded_mem_clicked(self): + if accept_warning(self, True, "警告", "你确定要清空所有加载记忆吗?"): + return + + loaded_mem: dict = self.config["loaded_memory"] + loaded_mem.clear() + QtWidgets.QMessageBox.information(self, "提示", "已清空加载记忆") + + # 更新kps加载状态 + for wg in self.wg_sa.kps_wgs: + self.wg_sa.update_load_status(wg) diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..7f71862 --- /dev/null +++ b/src/utils.py @@ -0,0 +1,11 @@ +# coding: utf8 +from PySide6 import QtWidgets + + +def accept_warning(widget: QtWidgets.QWidget, condition: bool, + caption: str = "Warning", text: str = "Are you sure to continue?") -> bool: + if condition: + b = QtWidgets.QMessageBox.question(widget, caption, text) + if b == QtWidgets.QMessageBox.StandardButton.No: + return True + return False