dev: 支持回车加载等

This commit is contained in:
Julian Freeman
2024-07-19 14:42:38 -04:00
parent 85b6456f87
commit 24e2184659
4 changed files with 64 additions and 31 deletions

View File

@@ -1,11 +1,18 @@
# coding: utf8
from pathlib import Path
from PySide6 import QtWidgets, QtGui, QtCore
from pykeepass.exceptions import CredentialsError
from lib.Sqlite3Helper import Sqlite3Worker
from lib.kps_operations import read_kps_to_db
class GbxKpsLogin(QtWidgets.QGroupBox):
def __init__(self, path: str, parent=None):
def __init__(self, path: str, sqh: Sqlite3Worker, config: dict, parent=None):
super().__init__(parent)
self.is_loaded = False
self.sqh = sqh
self.config = config
self.path = path
self.icon_eye = QtGui.QIcon(":/asset/img/eye.svg")
self.icon_eye_off = QtGui.QIcon(":/asset/img/eye-off.svg")
@@ -41,12 +48,21 @@ class GbxKpsLogin(QtWidgets.QGroupBox):
self.lb_loaded.setVisible(False)
self.hly_bottom.addStretch(1)
self.pbn_load = PushButtonWithItem(self, self, "加载")
self.pbn_load = QtWidgets.QPushButton("加载", self)
self.hly_bottom.addWidget(self.pbn_load)
self.pbn_remove = PushButtonWithItem(self, self, "移除")
self.hly_bottom.addWidget(self.pbn_remove)
self.pbn_eye.clicked.connect(self.on_pbn_eye_clicked)
self.pbn_load.clicked.connect(self.on_pbn_load_clicked)
# 回车加载
self.lne_password.returnPressed.connect(self.on_pbn_load_clicked)
def set_loaded(self, loaded: bool):
self.lb_loaded.setVisible(loaded)
self.pbn_load.setDisabled(loaded)
# 防止回车键触发加载
self.lne_password.setDisabled(loaded)
def on_pbn_eye_clicked(self):
is_pass_mode = self.lne_password.echoMode() == QtWidgets.QLineEdit.EchoMode.Password
@@ -57,10 +73,24 @@ class GbxKpsLogin(QtWidgets.QGroupBox):
self.lne_password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
self.pbn_eye.setIcon(self.icon_eye_off)
def set_loaded(self, loaded: bool):
self.is_loaded = loaded
self.lb_loaded.setVisible(loaded)
self.pbn_load.setDisabled(loaded)
def on_pbn_load_clicked(self):
try:
read_kps_to_db(kps_file=self.lne_path.text(),
password=self.lne_password.text(),
table_name=self.config["table_name"],
sqh=self.sqh)
except CredentialsError:
QtWidgets.QMessageBox.critical(self, "密码错误",
f"{self.lne_path.text()}\n密码错误")
return
self.lne_password.clear()
self.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(self.lne_path.text())
class PushButtonWithItem(QtWidgets.QPushButton):

View File

@@ -28,6 +28,11 @@ class UiKpsUnifier(object):
self.act_query = QtGui.QAction("查询", self.cw)
self.menu_view.addActions([self.act_load, self.act_query])
self.menu_help = self.menu_bar.addMenu("帮助")
self.act_about = QtGui.QAction("关于", self.cw)
self.act_about_qt = QtGui.QAction("关于 Qt", self.cw)
self.menu_help.addActions([self.act_about, self.act_about_qt])
self.hly_top = QtWidgets.QHBoxLayout()
self.vly_m.addLayout(self.hly_top)
@@ -35,6 +40,7 @@ class UiKpsUnifier(object):
self.lne_db_path.setEnabled(False)
self.lne_db_path.setPlaceholderText(default_db_path)
self.cmbx_styles = StyleComboBox(self.cw)
self.cmbx_styles.setMinimumWidth(110)
self.hly_top.addWidget(self.lne_db_path)
self.hly_top.addWidget(self.cmbx_styles)
@@ -52,10 +58,11 @@ class UiKpsUnifier(object):
class KpsUnifier(QtWidgets.QMainWindow):
def __init__(self, db_path: str, config: dict, parent=None):
def __init__(self, db_path: str, config: dict, version: str, parent=None):
super().__init__(parent)
self.db_path = db_path
self.config = config
self.version = version
self.sqh = self.init_db()
self.ui = UiKpsUnifier(self.db_path, self.config, self.sqh, self)
@@ -64,6 +71,8 @@ class KpsUnifier(QtWidgets.QMainWindow):
self.ui.act_open.triggered.connect(self.on_act_open_triggered)
self.ui.act_load.triggered.connect(self.on_act_load_triggered)
self.ui.act_query.triggered.connect(self.on_act_query_triggered)
self.ui.act_about.triggered.connect(self.on_act_about_triggered)
self.ui.act_about_qt.triggered.connect(self.on_act_about_qt_triggered)
def __del__(self):
self.config["last_db_path"] = self.db_path
@@ -104,3 +113,13 @@ class KpsUnifier(QtWidgets.QMainWindow):
def on_act_query_triggered(self):
self.ui.sw_m.setCurrentIndex(1)
def on_act_about_triggered(self):
QtWidgets.QMessageBox.about(
self,
"关于",
f"一个可以同时处理多个 keepass 文件的工具。\n\n版本v{self.version}"
)
def on_act_about_qt_triggered(self):
QtWidgets.QMessageBox.aboutQt(self, "关于 Qt")

View File

@@ -3,12 +3,10 @@ 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
class WgLoadKps(QtWidgets.QWidget):
@@ -31,9 +29,13 @@ class WgLoadKps(QtWidgets.QWidget):
wg.set_loaded(False)
def add_kps(self, path: str):
wg = GbxKpsLogin(path, self)
for wg in self.kps_wgs:
if wg.path == path:
QtWidgets.QMessageBox.warning(self, "警告", "该 KPS 文件已添加。")
return
wg = GbxKpsLogin(path, self.sqh, self.config, self)
wg.pbn_remove.clicked_with_item.connect(self.on_item_pbn_remove_clicked)
wg.pbn_load.clicked_with_item.connect(self.on_item_pbn_load_clicked)
# 从倒数第二个位置插入,保证弹簧始终在最后
self.vly_m.insertWidget(self.vly_m.count() - 1, wg)
self.kps_wgs.append(wg)
@@ -46,24 +48,6 @@ class WgLoadKps(QtWidgets.QWidget):
self.kps_wgs.remove(item)
item.deleteLater()
def on_item_pbn_load_clicked(self, item: GbxKpsLogin):
try:
read_kps_to_db(kps_file=item.lne_path.text(),
password=item.lne_password.text(),
table_name=self.config["table_name"],
sqh=self.sqh)
except CredentialsError:
QtWidgets.QMessageBox.critical(self, "密码错误",
f"{item.lne_path.text()}\n密码错误")
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
for wg in self.kps_wgs: