优化程序

This commit is contained in:
hero920103 committed 2026-10-12 14:57:46 +08:00
1 parent 68e8eb91a7
commit 6df29c9254
27 files changed
+1974 -203

No files matched your search

+88
View File
@@ -486,6 +486,13 @@ class GroupWidget(QWidget):
self._add_btn.click() if e.button() == Qt.MouseButton.LeftButton else None
)
# 🖥️ 变成桌面文件框按钮(放在加号左边)
self._dock_btn = QPushButton()
self._dock_btn.setFixedSize(22, 22)
self._dock_btn.setToolTip("变成桌面文件框")
self._dock_btn.setStyleSheet("border:none; background:transparent;")
self._dock_btn.clicked.connect(self._toggle_dock_box)
self._more_btn = QPushButton()
self._more_btn.setFixedSize(22, 22)
self._more_btn.setStyleSheet("border:none; background:transparent;")
@@ -496,6 +503,7 @@ class GroupWidget(QWidget):
h_layout.addWidget(self.title_label)
h_layout.addStretch()
h_layout.addWidget(self.path_label)
h_layout.addWidget(self._dock_btn)
h_layout.addWidget(self._add_btn)
h_layout.addWidget(self._more_btn)
@@ -511,10 +519,65 @@ class GroupWidget(QWidget):
n = item_count_for_group(self.group_data["id"])
self.title_label.setText(f"{self.group_data['name']} ({n})")
def _has_docked_box(self) -> bool:
"""检查本分组是否已有关联的桌面文件框。"""
conn = database.get_conn()
row = conn.execute("SELECT id FROM file_boxes WHERE group_id=?",
(self.group_data["id"],)).fetchone()
conn.close()
return row is not None
def _toggle_dock_box(self):
"""点击 🖥️ 按钮:创建或恢复/聚焦已关联的桌面文件框。"""
from db import database as db_mod
from ui.box import FileBox
gid = self.group_data["id"]
box_id = db_mod.create_file_box_from_group(gid)
if box_id is None:
# 已存在 → 找出来 show + raise
conn = db_mod.get_conn()
row = conn.execute("SELECT id FROM file_boxes WHERE group_id=?", (gid,)).fetchone()
conn.close()
if row:
box_id = row["id"]
# 拿到 PanelWindow 引用
main = self.window() if hasattr(self, "window") else None
from ui.dock import PanelWindow
if isinstance(main, PanelWindow):
main._load_file_boxes()
else:
# 直接构造一个 FileBox 并 show
conn = db_mod.get_conn()
box_row = conn.execute("SELECT * FROM file_boxes WHERE id=?", (box_id,)).fetchone()
conn.close()
if box_row:
box_data = dict(box_row)
# 如果 FileBox._panel_ref 还没设,尝试找一个
if FileBox._panel_ref is None:
# 扫描 QApplication topLevelWidgets 找 PanelWindow
from PyQt6.QtWidgets import QApplication
for w in QApplication.topLevelWidgets():
if isinstance(w, PanelWindow):
FileBox._panel_ref = w; break
box = FileBox(box_data)
box.show()
self._apply_theme() # 刷新按钮状态色
def _apply_theme(self):
t = theme.current()
ic = "#cccccc" if theme.name() == "dark" else "#555555"
# 已关联文件框 → 用蓝色高亮按钮
if self._has_docked_box():
dock_color = "#4a9eff"
self._dock_btn.setToolTip("已在桌面文件框(点击聚焦)")
else:
dock_color = ic
self._dock_btn.setToolTip("变成桌面文件框")
self.header.setStyleSheet(f"""
QWidget {{ background:{t['header_bg']}; border-radius:5px; }}
QWidget:hover {{ background:{t['header_hover']}; }}
@@ -526,6 +589,8 @@ class GroupWidget(QWidget):
arrow = "fa5s.chevron-down" if not self.collapsed else "fa5s.chevron-right"
self.toggle_icon.setPixmap(qta.icon(arrow, color=ic).pixmap(14, 14))
self._dock_btn.setIcon(qta.icon("fa5s.desktop", color=dock_color))
self._dock_btn.setIconSize(QSize(11, 11))
self._add_btn.setIcon(qta.icon("fa5s.plus", color=ic))
self._add_btn.setIconSize(QSize(11, 11))
self._more_btn.setIcon(qta.icon("fa5s.ellipsis-h", color=ic))
@@ -573,6 +638,7 @@ class GroupWidget(QWidget):
QMenu::item:selected {{ background:{t['menu_selected']}; }}
""")
rename_act = menu.addAction("重命名")
dock_act = menu.addAction("🖥️ 变成桌面文件框")
del_act = menu.addAction("删除分组")
action = menu.exec(QCursor.pos())
if action == rename_act:
@@ -583,6 +649,28 @@ class GroupWidget(QWidget):
database.rename_group(self.group_data["id"], name.strip())
self.group_data["name"] = name.strip()
self._update_title_count()
elif action == dock_act:
from db import database as db_mod
from ui.dock import PanelWindow # 延迟 import
box_id = db_mod.create_file_box_from_group(self.group_data["id"])
if box_id is None:
dialog_style.information(self, "提示", "该分组已关联桌面文件框")
else:
# 通知主面板立即加载这个新 FileBox
main_window = self.window()
if isinstance(main_window, PanelWindow):
main_window._load_file_boxes()
# 找到刚创建的 FileBox 并 show
from ui.box import FileBox
for b in FileBox._instances:
if b._group_id == self.group_data["id"] and not b.isVisible():
b.show()
break
dialog_style.information(
self, "成功",
f"分组「{self.group_data['name']}」已变成桌面文件框 ✅\n"
f"两者数据实时联动"
)
elif action == del_act:
ret = dialog_style.question(
self,