mirror of
https://github.com/goldenfishs/MRobot.git
synced 2026-03-31 21:07:14 +08:00
好了
This commit is contained in:
268
app/category_management_dialog.py
Normal file
268
app/category_management_dialog.py
Normal file
@@ -0,0 +1,268 @@
|
||||
"""
|
||||
分类管理对话框
|
||||
提供新增、重命名、删除分类的功能
|
||||
"""
|
||||
|
||||
from typing import Optional
|
||||
from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QListWidget, QListWidgetItem)
|
||||
from PyQt5.QtCore import Qt
|
||||
from qfluentwidgets import (BodyLabel, PushButton, PrimaryPushButton, LineEdit,
|
||||
InfoBar, InfoBarPosition)
|
||||
from .tools.finance_manager import FinanceManager
|
||||
|
||||
|
||||
class CategoryManagementDialog(QDialog):
|
||||
"""分类管理对话框"""
|
||||
|
||||
def __init__(self, parent=None, finance_manager: Optional[FinanceManager] = None, account_id: Optional[str] = None):
|
||||
super().__init__(parent)
|
||||
self.finance_manager = finance_manager
|
||||
self.account_id = account_id
|
||||
self.setWindowTitle("分类管理")
|
||||
self.setGeometry(100, 100, 500, 400)
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
"""初始化UI"""
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 标签
|
||||
title_label = BodyLabel("选择分类进行管理:")
|
||||
main_layout.addWidget(title_label)
|
||||
|
||||
# 分类列表
|
||||
self.category_list = QListWidget()
|
||||
self.category_list.itemSelectionChanged.connect(self.on_category_selected)
|
||||
main_layout.addWidget(self.category_list)
|
||||
|
||||
# 加载分类
|
||||
self.load_categories()
|
||||
|
||||
# 按钮区域
|
||||
btn_layout = QHBoxLayout()
|
||||
btn_layout.addStretch()
|
||||
|
||||
# 新增按钮
|
||||
add_btn = PrimaryPushButton("新增")
|
||||
add_btn.clicked.connect(self.on_add_category)
|
||||
btn_layout.addWidget(add_btn)
|
||||
|
||||
# 重命名按钮
|
||||
self.rename_btn = PushButton("重命名")
|
||||
self.rename_btn.clicked.connect(self.on_rename_category)
|
||||
self.rename_btn.setEnabled(False)
|
||||
btn_layout.addWidget(self.rename_btn)
|
||||
|
||||
# 删除按钮
|
||||
self.delete_btn = PushButton("删除")
|
||||
self.delete_btn.clicked.connect(self.on_delete_category)
|
||||
self.delete_btn.setEnabled(False)
|
||||
btn_layout.addWidget(self.delete_btn)
|
||||
|
||||
# 关闭按钮
|
||||
close_btn = PushButton("关闭")
|
||||
close_btn.clicked.connect(self.accept)
|
||||
btn_layout.addWidget(close_btn)
|
||||
|
||||
main_layout.addLayout(btn_layout)
|
||||
self.setLayout(main_layout)
|
||||
|
||||
def load_categories(self):
|
||||
"""加载分类列表"""
|
||||
if not self.finance_manager or not self.account_id:
|
||||
return
|
||||
|
||||
self.category_list.clear()
|
||||
categories = self.finance_manager.get_categories(self.account_id)
|
||||
for category in categories:
|
||||
item = QListWidgetItem(category)
|
||||
self.category_list.addItem(item)
|
||||
|
||||
def on_category_selected(self):
|
||||
"""分类被选择"""
|
||||
has_selection = self.category_list.currentItem() is not None
|
||||
self.rename_btn.setEnabled(has_selection)
|
||||
self.delete_btn.setEnabled(has_selection)
|
||||
|
||||
def on_add_category(self):
|
||||
"""新增分类"""
|
||||
# 弹出输入对话框
|
||||
from PyQt5.QtWidgets import QDialog as QStdDialog
|
||||
from PyQt5.QtWidgets import QLabel
|
||||
|
||||
dialog = QStdDialog(self)
|
||||
dialog.setWindowTitle("新增分类")
|
||||
dialog.setGeometry(150, 150, 400, 150)
|
||||
|
||||
layout = QVBoxLayout(dialog)
|
||||
layout.addWidget(BodyLabel("分类名称:"))
|
||||
|
||||
input_edit = LineEdit()
|
||||
input_edit.setPlaceholderText("例如:食品、交通、娱乐等")
|
||||
layout.addWidget(input_edit)
|
||||
|
||||
# 按钮
|
||||
btn_layout = QHBoxLayout()
|
||||
btn_layout.addStretch()
|
||||
|
||||
def on_create():
|
||||
category_name = input_edit.text().strip()
|
||||
if not category_name:
|
||||
InfoBar.warning(
|
||||
title="提示",
|
||||
content="分类名称不能为空",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
return
|
||||
|
||||
if self.finance_manager.add_category(self.account_id, category_name):
|
||||
InfoBar.success(
|
||||
title="成功",
|
||||
content=f"分类 '{category_name}' 创建成功",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
self.load_categories()
|
||||
dialog.accept()
|
||||
else:
|
||||
InfoBar.warning(
|
||||
title="提示",
|
||||
content="分类已存在",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
|
||||
cancel_btn = PushButton("取消")
|
||||
cancel_btn.clicked.connect(dialog.reject)
|
||||
btn_layout.addWidget(cancel_btn)
|
||||
|
||||
create_btn = PrimaryPushButton("创建")
|
||||
create_btn.clicked.connect(on_create)
|
||||
btn_layout.addWidget(create_btn)
|
||||
|
||||
layout.addLayout(btn_layout)
|
||||
dialog.exec()
|
||||
|
||||
def on_rename_category(self):
|
||||
"""重命名分类"""
|
||||
current_item = self.category_list.currentItem()
|
||||
if not current_item:
|
||||
return
|
||||
|
||||
old_name = current_item.text()
|
||||
|
||||
# 弹出输入对话框
|
||||
from PyQt5.QtWidgets import QDialog as QStdDialog
|
||||
|
||||
dialog = QStdDialog(self)
|
||||
dialog.setWindowTitle("重命名分类")
|
||||
dialog.setGeometry(150, 150, 400, 150)
|
||||
|
||||
layout = QVBoxLayout(dialog)
|
||||
layout.addWidget(BodyLabel(f"原分类名: {old_name}"))
|
||||
layout.addWidget(BodyLabel("新分类名:"))
|
||||
|
||||
input_edit = LineEdit()
|
||||
input_edit.setText(old_name)
|
||||
input_edit.selectAll()
|
||||
layout.addWidget(input_edit)
|
||||
|
||||
# 按钮
|
||||
btn_layout = QHBoxLayout()
|
||||
btn_layout.addStretch()
|
||||
|
||||
def on_rename():
|
||||
new_name = input_edit.text().strip()
|
||||
if not new_name:
|
||||
InfoBar.warning(
|
||||
title="提示",
|
||||
content="分类名称不能为空",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
return
|
||||
|
||||
if new_name == old_name:
|
||||
dialog.accept()
|
||||
return
|
||||
|
||||
if self.finance_manager.rename_category(self.account_id, old_name, new_name):
|
||||
InfoBar.success(
|
||||
title="成功",
|
||||
content=f"分类已重命名为 '{new_name}'",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
self.load_categories()
|
||||
dialog.accept()
|
||||
else:
|
||||
InfoBar.warning(
|
||||
title="提示",
|
||||
content="重命名失败,可能分类已存在",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
|
||||
cancel_btn = PushButton("取消")
|
||||
cancel_btn.clicked.connect(dialog.reject)
|
||||
btn_layout.addWidget(cancel_btn)
|
||||
|
||||
rename_btn = PrimaryPushButton("重命名")
|
||||
rename_btn.clicked.connect(on_rename)
|
||||
btn_layout.addWidget(rename_btn)
|
||||
|
||||
layout.addLayout(btn_layout)
|
||||
dialog.exec()
|
||||
|
||||
def on_delete_category(self):
|
||||
"""删除分类"""
|
||||
current_item = self.category_list.currentItem()
|
||||
if not current_item:
|
||||
return
|
||||
|
||||
category_name = current_item.text()
|
||||
|
||||
# 确认删除
|
||||
from PyQt5.QtWidgets import QMessageBox
|
||||
|
||||
reply = QMessageBox.question(
|
||||
self,
|
||||
"确认删除",
|
||||
f"确定要删除分类 '{category_name}' 吗?\n\n使用该分类的交易记录分类将被清空。",
|
||||
QMessageBox.Yes | QMessageBox.No,
|
||||
QMessageBox.No
|
||||
)
|
||||
|
||||
if reply == QMessageBox.Yes:
|
||||
if self.finance_manager.delete_category(self.account_id, category_name):
|
||||
InfoBar.success(
|
||||
title="成功",
|
||||
content=f"分类 '{category_name}' 已删除",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
self.load_categories()
|
||||
else:
|
||||
InfoBar.warning(
|
||||
title="错误",
|
||||
content="删除分类失败",
|
||||
isClosable=True,
|
||||
position=InfoBarPosition.TOP,
|
||||
duration=2000,
|
||||
parent=self
|
||||
)
|
||||
Reference in New Issue
Block a user