EG/ui/panels/interaction_panels.py
2026-03-13 14:44:00 +08:00

141 lines
5.4 KiB
Python

from imgui_bundle import imgui, imgui_ctx
class InteractionPanels:
"""Drag-and-drop and context menu interaction panels."""
def __init__(self, app):
self.app = app
def __getattr__(self, name):
return getattr(self.app, name)
def __setattr__(self, name, value):
if name == "app" or name in self.__dict__ or hasattr(type(self), name):
object.__setattr__(self, name, value)
else:
setattr(self.app, name, value)
def _draw_drag_drop_interface(self):
"""委托到核心拖拽服务。"""
return self.model_drag_drop.draw_drag_drop_interface()
def _handle_drag_drop_completion(self):
"""委托到核心拖拽服务。"""
return self.model_drag_drop.handle_internal_drag_drop_completion()
def _draw_drag_overlay(self):
return self.model_drag_drop.draw_drag_overlay()
def _draw_drag_status(self):
return self.model_drag_drop.draw_drag_status()
def _draw_context_menus(self):
"""绘制右键菜单"""
# 节点右键菜单
if hasattr(self, '_context_menu_node') and self._context_menu_node:
imgui.open_popup("节点右键菜单")
self._context_menu_node = None
if imgui.begin_popup("节点右键菜单"):
if imgui.menu_item("删除节点", "", False, True)[1]:
if hasattr(self, '_context_menu_target') and self._context_menu_target:
self._delete_node(self._context_menu_target)
imgui.close_current_popup()
if imgui.menu_item("重命名", "", False, True)[1]:
self._renaming_node = True
if hasattr(self, "_context_menu_target") and self._context_menu_target:
self._rename_target = self._context_menu_target
self._rename_buffer = self._context_menu_target.getName() or ""
else:
self._rename_target = None
self._rename_buffer = ""
imgui.close_current_popup()
imgui.separator()
if imgui.menu_item("复制", "", False, True)[1]:
if hasattr(self, '_context_menu_target') and self._context_menu_target:
self._copy_node(self._context_menu_target)
imgui.close_current_popup()
if imgui.menu_item("聚焦", "", False, True)[1]:
if hasattr(self, '_context_menu_target') and self._context_menu_target:
if hasattr(self, 'selection') and self.selection:
self.selection.updateSelection(self._context_menu_target)
self.selection.focusCameraOnSelectedNodeAdvanced()
imgui.close_current_popup()
imgui.end_popup()
# 重命名对话框
if hasattr(self, '_renaming_node') and self._renaming_node:
imgui.open_popup("重命名节点")
if imgui.begin_popup("重命名节点"):
changed, new_name = imgui.input_text("新名称", self._rename_buffer, 256)
if changed:
self._rename_buffer = new_name
if imgui.button("确定"):
target = getattr(self, "_rename_target", None) or getattr(self, "_context_menu_target", None)
if target and not target.isEmpty():
old_name = target.getName() or ""
new_name = (self._rename_buffer or "").strip()
if not new_name:
new_name = old_name
if hasattr(self, "editor_panels") and self.editor_panels:
self.editor_panels._record_name_change(target, old_name, new_name)
elif hasattr(self, "_update_node_name"):
self._update_node_name(target, new_name)
else:
target.setName(new_name)
self._renaming_node = False
self._rename_target = None
self._rename_buffer = ""
imgui.close_current_popup()
imgui.same_line()
if imgui.button("取消"):
self._renaming_node = False
self._rename_target = None
self._rename_buffer = ""
imgui.close_current_popup()
imgui.end_popup()
def _delete_node_simple(self, node):
"""删除节点 - 简化版本"""
if not node or node.isEmpty():
return
node_name = node.getName() or "未命名节点"
deleted = self._delete_node(node)
if deleted and hasattr(self, 'selection') and self.selection:
current_node = self.selection.getSelectedNode() if hasattr(self.selection, "getSelectedNode") else self.selection.selectedNode
if current_node == node:
self.selection.clearSelection()
if deleted:
self.add_success_message(f"已删除节点: {node_name}")
def _copy_node(self, node):
"""复制节点"""
if not node or node.isEmpty():
return
# 这里可以实现节点复制逻辑
# 暂时只显示消息
self.add_info_message(f"复制功能暂未实现: {node.getName() or '未命名节点'}")
# ==================== 创建功能实现 ====================