- Renamed `check_environment` to `check_api_key_configured` for clarity, simplifying the API key validation logic. - Removed the blocking behavior of the API key check during application startup, allowing the app to run while providing a prompt for configuration. - Updated `LocalAgentApp` to accept an `api_configured` parameter, enabling conditional messaging for API key setup. - Enhanced the `SandboxRunner` to support backup management and improved execution result handling with detailed metrics. - Integrated data governance strategies into the `HistoryManager`, ensuring compliance and improved data management. - Added privacy settings and metrics tracking across various components to enhance user experience and application safety.
193 lines
5.5 KiB
Python
193 lines
5.5 KiB
Python
"""
|
||
清理确认对话框
|
||
在清空工作区前显示确认对话框,支持备份和恢复
|
||
"""
|
||
|
||
import tkinter as tk
|
||
from tkinter import ttk
|
||
from typing import Callable, Optional
|
||
|
||
|
||
class ClearConfirmDialog:
|
||
"""
|
||
清理确认对话框
|
||
|
||
功能:
|
||
1. 显示当前工作区内容统计
|
||
2. 提供"清空并备份"、"仅清空"、"取消"选项
|
||
3. 显示最近的备份信息
|
||
"""
|
||
|
||
def __init__(
|
||
self,
|
||
parent: tk.Tk,
|
||
file_count: int,
|
||
total_size: str,
|
||
has_recent_backup: bool,
|
||
on_confirm: Callable[[bool], None], # 参数:是否创建备份
|
||
on_cancel: Callable[[], None]
|
||
):
|
||
self.parent = parent
|
||
self.file_count = file_count
|
||
self.total_size = total_size
|
||
self.has_recent_backup = has_recent_backup
|
||
self.on_confirm = on_confirm
|
||
self.on_cancel = on_cancel
|
||
|
||
self.dialog = None
|
||
self.result = None
|
||
|
||
def show(self):
|
||
"""显示对话框"""
|
||
self.dialog = tk.Toplevel(self.parent)
|
||
self.dialog.title("确认清空工作区")
|
||
self.dialog.geometry("500x300")
|
||
self.dialog.resizable(False, False)
|
||
|
||
# 居中显示
|
||
self.dialog.transient(self.parent)
|
||
self.dialog.grab_set()
|
||
|
||
# 主容器
|
||
main_frame = ttk.Frame(self.dialog, padding="20")
|
||
main_frame.pack(fill=tk.BOTH, expand=True)
|
||
|
||
# 警告图标和标题
|
||
title_frame = ttk.Frame(main_frame)
|
||
title_frame.pack(fill=tk.X, pady=(0, 15))
|
||
|
||
warning_label = ttk.Label(
|
||
title_frame,
|
||
text="⚠️",
|
||
font=("Segoe UI Emoji", 24)
|
||
)
|
||
warning_label.pack(side=tk.LEFT, padx=(0, 10))
|
||
|
||
title_label = ttk.Label(
|
||
title_frame,
|
||
text="即将清空工作区",
|
||
font=("Microsoft YaHei UI", 14, "bold")
|
||
)
|
||
title_label.pack(side=tk.LEFT)
|
||
|
||
# 内容统计
|
||
info_frame = ttk.LabelFrame(main_frame, text="当前工作区内容", padding="10")
|
||
info_frame.pack(fill=tk.X, pady=(0, 15))
|
||
|
||
info_text = f"• 文件数量:{self.file_count} 个\n• 总大小:{self.total_size}"
|
||
info_label = ttk.Label(
|
||
info_frame,
|
||
text=info_text,
|
||
font=("Microsoft YaHei UI", 10)
|
||
)
|
||
info_label.pack(anchor=tk.W)
|
||
|
||
# 备份提示
|
||
if self.has_recent_backup:
|
||
backup_hint = ttk.Label(
|
||
main_frame,
|
||
text="💡 提示:检测到最近的备份,您可以随时恢复",
|
||
font=("Microsoft YaHei UI", 9),
|
||
foreground="#666666"
|
||
)
|
||
backup_hint.pack(fill=tk.X, pady=(0, 15))
|
||
|
||
# 说明文字
|
||
desc_label = ttk.Label(
|
||
main_frame,
|
||
text="清空后,input 和 output 目录中的所有文件将被删除。\n建议选择\"清空并备份\"以便后续恢复。",
|
||
font=("Microsoft YaHei UI", 9),
|
||
foreground="#666666",
|
||
wraplength=450
|
||
)
|
||
desc_label.pack(fill=tk.X, pady=(0, 20))
|
||
|
||
# 按钮区域
|
||
button_frame = ttk.Frame(main_frame)
|
||
button_frame.pack(fill=tk.X)
|
||
|
||
# 取消按钮
|
||
cancel_btn = ttk.Button(
|
||
button_frame,
|
||
text="取消",
|
||
command=self._on_cancel,
|
||
width=12
|
||
)
|
||
cancel_btn.pack(side=tk.RIGHT, padx=(5, 0))
|
||
|
||
# 仅清空按钮
|
||
clear_only_btn = ttk.Button(
|
||
button_frame,
|
||
text="仅清空(不备份)",
|
||
command=self._on_clear_only,
|
||
width=15
|
||
)
|
||
clear_only_btn.pack(side=tk.RIGHT, padx=(5, 0))
|
||
|
||
# 清空并备份按钮(推荐)
|
||
clear_backup_btn = ttk.Button(
|
||
button_frame,
|
||
text="清空并备份(推荐)",
|
||
command=self._on_clear_with_backup,
|
||
width=18
|
||
)
|
||
clear_backup_btn.pack(side=tk.RIGHT)
|
||
|
||
# 设置默认焦点
|
||
clear_backup_btn.focus_set()
|
||
|
||
# 绑定 ESC 键
|
||
self.dialog.bind("<Escape>", lambda e: self._on_cancel())
|
||
|
||
# 等待对话框关闭
|
||
self.dialog.wait_window()
|
||
|
||
def _on_clear_with_backup(self):
|
||
"""清空并备份"""
|
||
self.result = "backup"
|
||
self.dialog.destroy()
|
||
self.on_confirm(True)
|
||
|
||
def _on_clear_only(self):
|
||
"""仅清空"""
|
||
self.result = "clear"
|
||
self.dialog.destroy()
|
||
self.on_confirm(False)
|
||
|
||
def _on_cancel(self):
|
||
"""取消"""
|
||
self.result = "cancel"
|
||
self.dialog.destroy()
|
||
self.on_cancel()
|
||
|
||
|
||
def show_clear_confirm_dialog(
|
||
parent: tk.Tk,
|
||
file_count: int,
|
||
total_size: str,
|
||
has_recent_backup: bool,
|
||
on_confirm: Callable[[bool], None],
|
||
on_cancel: Callable[[], None]
|
||
):
|
||
"""
|
||
显示清理确认对话框
|
||
|
||
Args:
|
||
parent: 父窗口
|
||
file_count: 文件数量
|
||
total_size: 总大小(格式化字符串)
|
||
has_recent_backup: 是否有最近的备份
|
||
on_confirm: 确认回调(参数:是否创建备份)
|
||
on_cancel: 取消回调
|
||
"""
|
||
dialog = ClearConfirmDialog(
|
||
parent=parent,
|
||
file_count=file_count,
|
||
total_size=total_size,
|
||
has_recent_backup=has_recent_backup,
|
||
on_confirm=on_confirm,
|
||
on_cancel=on_cancel
|
||
)
|
||
dialog.show()
|
||
|