349 lines
22 KiB
Python
349 lines
22 KiB
Python
from imgui_bundle import imgui, imgui_ctx
|
|
|
|
class EditorPanelsTopMixin:
|
|
"""Auto-split mixin from editor_panels.py."""
|
|
|
|
def draw_menu_bar(self):
|
|
"""绘制菜单栏"""
|
|
with imgui_ctx.begin_main_menu_bar() as main_menu:
|
|
if main_menu:
|
|
# 文件菜单
|
|
with imgui_ctx.begin_menu("文件") as file_menu:
|
|
if file_menu:
|
|
if imgui.menu_item("新建项目", "Ctrl+N", False, True)[1]:
|
|
self.app._on_new_project()
|
|
if imgui.menu_item("打开项目", "Ctrl+O", False, True)[1]:
|
|
self.app._on_open_project()
|
|
imgui.separator()
|
|
if imgui.menu_item("保存", "Ctrl+S", False, True)[1]:
|
|
self.app._on_save_project()
|
|
if imgui.menu_item("另存为", "", False, True)[1]:
|
|
self.app._on_save_as_project()
|
|
imgui.separator()
|
|
if imgui.menu_item("退出", "Alt+F4", False, True)[1]:
|
|
self.app._on_exit()
|
|
|
|
# 编辑菜单
|
|
with imgui_ctx.begin_menu("编辑") as edit_menu:
|
|
if edit_menu:
|
|
if imgui.menu_item("撤销", "Ctrl+Z", False, True)[1]:
|
|
self.app._on_undo()
|
|
if imgui.menu_item("重做", "Ctrl+Y", False, True)[1]:
|
|
self.app._on_redo()
|
|
imgui.separator()
|
|
if imgui.menu_item("剪切", "Ctrl+X", False, True)[1]:
|
|
self.app._on_cut()
|
|
if imgui.menu_item("复制", "Ctrl+C", False, True)[1]:
|
|
self.app._on_copy()
|
|
if imgui.menu_item("粘贴", "Ctrl+V", False, True)[1]:
|
|
self.app._on_paste()
|
|
imgui.separator()
|
|
if imgui.menu_item("删除", "Del", False, True)[1]:
|
|
self.app._on_delete()
|
|
|
|
# 创建菜单
|
|
with imgui_ctx.begin_menu("创建") as create_menu:
|
|
if create_menu:
|
|
if imgui.menu_item("导入模型", "", False, True)[1]:
|
|
self.app._on_import_model()
|
|
|
|
imgui.separator()
|
|
|
|
if imgui.menu_item("空对象", "", False, True)[1]:
|
|
self.app._on_create_empty_object()
|
|
|
|
# 3D对象子菜单
|
|
with imgui_ctx.begin_menu("3D对象") as three_d_menu:
|
|
if three_d_menu:
|
|
if imgui.menu_item("立方体", "", False, True)[1]:
|
|
self.app._on_create_cube()
|
|
if imgui.menu_item("球体", "", False, True)[1]:
|
|
self.app._on_create_sphere()
|
|
if imgui.menu_item("圆柱体", "", False, True)[1]:
|
|
self.app._on_create_cylinder()
|
|
if imgui.menu_item("平面", "", False, True)[1]:
|
|
self.app._on_create_plane()
|
|
|
|
# 3D GUI子菜单
|
|
# with imgui_ctx.begin_menu("3D GUI") as three_d_gui_menu:
|
|
# if three_d_gui_menu:
|
|
# if imgui.menu_item("3D文本", "", False, True)[1]:
|
|
# self.app._on_create_3d_text()
|
|
# if imgui.menu_item("3D图片", "", False, True)[1]:
|
|
# self.app._on_create_3d_image()
|
|
|
|
# # GUI子菜单
|
|
# with imgui_ctx.begin_menu("GUI") as gui_menu:
|
|
# if gui_menu:
|
|
# if imgui.menu_item("创建按钮", "", False, True)[1]:
|
|
# self.app._on_create_gui_button()
|
|
# if imgui.menu_item("创建标签", "", False, True)[1]:
|
|
# self.app._on_create_gui_label()
|
|
# if imgui.menu_item("创建输入框", "", False, True)[1]:
|
|
# self.app._on_create_gui_entry()
|
|
# if imgui.menu_item("创建图片", "", False, True)[1]:
|
|
# self.app._on_create_gui_image()
|
|
# imgui.separator()
|
|
# if imgui.menu_item("创建视频屏幕", "", False, True)[1]:
|
|
# self.app._on_create_video_screen()
|
|
# if imgui.menu_item("创建2D视频屏幕", "", False, True)[1]:
|
|
# self.app._on_create_2d_video_screen()
|
|
# if imgui.menu_item("创建球形视频", "", False, True)[1]:
|
|
# self.app._on_create_spherical_video()
|
|
# if imgui.menu_item("创建虚拟屏幕", "", False, True)[1]:
|
|
# self.app._on_create_virtual_screen()
|
|
|
|
# 光源子菜单
|
|
with imgui_ctx.begin_menu("光源") as light_menu:
|
|
if light_menu:
|
|
if imgui.menu_item("聚光灯", "", False, True)[1]:
|
|
self.app._on_create_spot_light()
|
|
if imgui.menu_item("点光源", "", False, True)[1]:
|
|
self.app._on_create_point_light()
|
|
|
|
# 地形子菜单
|
|
with imgui_ctx.begin_menu("地形") as terrain_menu:
|
|
if terrain_menu:
|
|
if imgui.menu_item("创建平面地形", "", False, True)[1]:
|
|
self.app._on_create_flat_terrain()
|
|
if imgui.menu_item("从高度图创建地形", "", False, True)[1]:
|
|
self.app._on_create_heightmap_terrain()
|
|
|
|
# 脚本子菜单
|
|
with imgui_ctx.begin_menu("脚本") as script_menu:
|
|
if script_menu:
|
|
hot_reload_enabled = False
|
|
if getattr(self.app, "script_manager", None):
|
|
hot_reload_enabled = bool(self.app.script_manager.hot_reload_enabled)
|
|
if imgui.menu_item("创建脚本...", "", False, True)[1]:
|
|
self.app._on_create_script()
|
|
if imgui.menu_item("加载脚本文件...", "", False, True)[1]:
|
|
self.app._on_load_script()
|
|
imgui.separator()
|
|
if imgui.menu_item("重载所有脚本", "", False, True)[1]:
|
|
self.app._on_reload_all_scripts()
|
|
changed, new_hot_reload = imgui.menu_item("启用热重载", "", hot_reload_enabled, True)
|
|
if changed:
|
|
self.app._set_hot_reload_enabled(new_hot_reload)
|
|
if imgui.menu_item("脚本管理器", "", False, True)[1]:
|
|
self.app._on_open_scripts_manager()
|
|
|
|
# 信息面板子菜单
|
|
with imgui_ctx.begin_menu("信息面板") as info_panel_menu:
|
|
if info_panel_menu:
|
|
# if imgui.menu_item("创建2D示例面板", "", False, True)[1]:
|
|
# self.app._on_create_2d_sample_panel()
|
|
# if imgui.menu_item("创建3D实例面板", "", False, True)[1]:
|
|
# self.app._on_create_3d_sample_panel()
|
|
if imgui.menu_item("Web面板", "", False, True)[1]:
|
|
self.app._on_create_web_panel()
|
|
|
|
# 视图菜单
|
|
with imgui_ctx.begin_menu("视图") as view_menu:
|
|
if view_menu:
|
|
changed, visible = imgui.menu_item("工具栏", "", self.app.is_panel_visible("toolbar"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("toolbar", visible)
|
|
changed, visible = imgui.menu_item("场景树", "", self.app.is_panel_visible("scene_tree"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("scene_tree", visible)
|
|
changed, visible = imgui.menu_item("资源管理器", "", self.app.is_panel_visible("resources"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("resources", visible)
|
|
changed, visible = imgui.menu_item("属性面板", "", self.app.is_panel_visible("property"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("property", visible)
|
|
changed, visible = imgui.menu_item("控制台", "", self.app.is_panel_visible("console"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("console", visible)
|
|
changed, visible = imgui.menu_item("脚本管理", "", self.app.is_panel_visible("script"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("script", visible)
|
|
changed, visible = imgui.menu_item("LUI编辑器", "", self.app.is_panel_visible("lui_editor"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("lui_editor", visible)
|
|
changed, visible = imgui.menu_item("Web面板", "", self.app.is_panel_visible("web"), True)
|
|
if changed:
|
|
self.app.set_panel_visible("web", visible)
|
|
imgui.separator()
|
|
if imgui.menu_item("恢复默认面板", "", False, True)[1]:
|
|
self.app.reset_panel_visibility_to_defaults()
|
|
if imgui.menu_item("重置布局", "", False, True)[1]:
|
|
self.app._reset_imgui_layout()
|
|
|
|
# 工具菜单
|
|
with imgui_ctx.begin_menu("工具") as tools_menu:
|
|
if tools_menu:
|
|
# 工具切换选项
|
|
if imgui.menu_item("选择工具", "", False, True)[1]:
|
|
self.app.tool_manager.setCurrentTool("选择")
|
|
if imgui.menu_item("移动工具", "", False, True)[1]:
|
|
self.app.tool_manager.setCurrentTool("移动")
|
|
if imgui.menu_item("旋转工具", "", False, True)[1]:
|
|
self.app.tool_manager.setCurrentTool("旋转")
|
|
if imgui.menu_item("缩放工具", "", False, True)[1]:
|
|
self.app.tool_manager.setCurrentTool("缩放")
|
|
|
|
imgui.separator()
|
|
|
|
# 编辑工具
|
|
# if imgui.menu_item("光照编辑", "", False, True)[1]:
|
|
# self.app.tool_manager.setCurrentTool("光照编辑")
|
|
# if imgui.menu_item("图形编辑", "", False, True)[1]:
|
|
# self.app.tool_manager.setCurrentTool("图形编辑")
|
|
|
|
imgui.separator()
|
|
|
|
# VR子菜单
|
|
with imgui_ctx.begin_menu("VR") as vr_menu:
|
|
if vr_menu:
|
|
if imgui.menu_item("进入VR模式", "", False, True)[1]:
|
|
self.app._toggle_vr_mode()
|
|
if imgui.menu_item("退出VR模式", "", False, True)[1]:
|
|
self.app._exit_vr_mode()
|
|
|
|
imgui.separator()
|
|
|
|
if imgui.menu_item("VR状态", "", False, True)[1]:
|
|
self.app._show_vr_status()
|
|
if imgui.menu_item("VR设置", "", False, True)[1]:
|
|
self.app._show_vr_settings()
|
|
|
|
imgui.separator()
|
|
|
|
# VR调试子菜单
|
|
with imgui_ctx.begin_menu("VR调试") as vr_debug_menu:
|
|
if vr_debug_menu:
|
|
_, self.app.vr_debug_enabled = imgui.menu_item("启用调试输出", "", self.app.vr_debug_enabled, True)
|
|
|
|
if imgui.menu_item("立即显示性能报告", "", False, True)[1]:
|
|
self.app._show_vr_performance_report()
|
|
|
|
imgui.separator()
|
|
|
|
# 输出模式
|
|
with imgui_ctx.begin_menu("输出模式") as output_menu:
|
|
if output_menu:
|
|
if imgui.menu_item("简短模式", "", not self.app.vr_detailed_mode, True)[1]:
|
|
self.app.vr_detailed_mode = False
|
|
if imgui.menu_item("详细模式", "", self.app.vr_detailed_mode, True)[1]:
|
|
self.app.vr_detailed_mode = True
|
|
|
|
imgui.separator()
|
|
|
|
_, self.app.vr_performance_monitor = imgui.menu_item("启用性能监控", "", self.app.vr_performance_monitor, True)
|
|
|
|
# 窗口菜单 - 已隐藏
|
|
# with imgui_ctx.begin_menu("窗口") as window_menu:
|
|
# if window_menu:
|
|
# _, self.app.showDemoWindow = imgui.menu_item("ImGui演示", "", self.app.showDemoWindow, True)
|
|
# if self.app.testTexture:
|
|
# imgui.menu_item("关闭纹理测试", "", False, True)
|
|
# else:
|
|
# imgui.menu_item("显示纹理测试", "", False, True)
|
|
|
|
# 帮助菜单
|
|
with imgui_ctx.begin_menu("帮助") as help_menu:
|
|
if help_menu:
|
|
imgui.menu_item("关于", "", False, True)
|
|
imgui.menu_item("文档", "", False, True)
|
|
|
|
# 右侧显示FPS
|
|
imgui.set_cursor_pos_x(imgui.get_window_size().x - 140)
|
|
imgui.text("%.2f FPS (%.2f ms)" % (imgui.get_io().framerate, 1000.0 / imgui.get_io().framerate))
|
|
|
|
def draw_toolbar(self):
|
|
"""绘制工具栏"""
|
|
# 工具栏可以保持无标题栏,但允许移动和调整大小
|
|
flags = self.app.style_manager.get_window_flags("toolbar")
|
|
|
|
with self.app.style_manager.begin_styled_window("工具栏", self.app.showToolbar, flags) as (_, opened):
|
|
if not opened:
|
|
self.app.showToolbar = False
|
|
return
|
|
|
|
self.app.showToolbar = opened
|
|
|
|
# 选择工具按钮
|
|
select_active = self.app.tool_manager.isSelectionTool()
|
|
if self.app.icons.get('select'):
|
|
tint_col = (1.0, 1.0, 0.0, 1.0) if select_active else (1.0, 1.0, 1.0, 1.0)
|
|
if self.app.style_manager.image_button(self.app.icons['select'], (24, 24), tint_col=tint_col):
|
|
self.app.tool_manager.setCurrentTool("选择")
|
|
if imgui.is_item_hovered():
|
|
imgui.set_tooltip("选择工具 (Q)")
|
|
imgui.same_line()
|
|
else:
|
|
if imgui.button("选择##select_tool"):
|
|
self.app.tool_manager.setCurrentTool("选择")
|
|
if select_active:
|
|
draw_list = imgui.get_window_draw_list()
|
|
button_min = imgui.get_item_rect_min()
|
|
button_max = imgui.get_item_rect_max()
|
|
draw_list.add_rect_filled(button_min, button_max, imgui.get_color_u32((0.3, 0.6, 1.0, 0.3)))
|
|
imgui.same_line()
|
|
|
|
# 移动工具按钮
|
|
move_active = self.app.tool_manager.isMoveTool()
|
|
if self.app.icons.get('move'):
|
|
# 使用不同颜色表示活动状态
|
|
tint_col = (1.0, 1.0, 0.0, 1.0) if move_active else (1.0, 1.0, 1.0, 1.0) # 活动时显示黄色
|
|
if self.app.style_manager.image_button(self.app.icons['move'], (24, 24), tint_col=tint_col):
|
|
self.app.tool_manager.setCurrentTool("移动")
|
|
if imgui.is_item_hovered():
|
|
imgui.set_tooltip("移动工具 (W)")
|
|
imgui.same_line()
|
|
else:
|
|
if imgui.button("移动##move_tool"):
|
|
self.app.tool_manager.setCurrentTool("移动")
|
|
if move_active:
|
|
# 为活动按钮添加背景色
|
|
draw_list = imgui.get_window_draw_list()
|
|
button_min = imgui.get_item_rect_min()
|
|
button_max = imgui.get_item_rect_max()
|
|
draw_list.add_rect_filled(button_min, button_max, imgui.get_color_u32((0.3, 0.6, 1.0, 0.3)))
|
|
imgui.same_line()
|
|
|
|
# 旋转工具按钮
|
|
rotate_active = self.app.tool_manager.isRotateTool()
|
|
if self.app.icons.get('rotate'):
|
|
tint_col = (1.0, 1.0, 0.0, 1.0) if rotate_active else (1.0, 1.0, 1.0, 1.0)
|
|
if self.app.style_manager.image_button(self.app.icons['rotate'], (24, 24), tint_col=tint_col):
|
|
self.app.tool_manager.setCurrentTool("旋转")
|
|
if imgui.is_item_hovered():
|
|
imgui.set_tooltip("旋转工具 (E)")
|
|
imgui.same_line()
|
|
else:
|
|
if imgui.button("旋转##rotate_tool"):
|
|
self.app.tool_manager.setCurrentTool("旋转")
|
|
if rotate_active:
|
|
draw_list = imgui.get_window_draw_list()
|
|
button_min = imgui.get_item_rect_min()
|
|
button_max = imgui.get_item_rect_max()
|
|
draw_list.add_rect_filled(button_min, button_max, imgui.get_color_u32((0.3, 0.6, 1.0, 0.3)))
|
|
imgui.same_line()
|
|
|
|
# 缩放工具按钮
|
|
scale_active = self.app.tool_manager.isScaleTool()
|
|
if self.app.icons.get('scale'):
|
|
tint_col = (1.0, 1.0, 0.0, 1.0) if scale_active else (1.0, 1.0, 1.0, 1.0)
|
|
if self.app.style_manager.image_button(self.app.icons['scale'], (24, 24), tint_col=tint_col):
|
|
self.app.tool_manager.setCurrentTool("缩放")
|
|
if imgui.is_item_hovered():
|
|
imgui.set_tooltip("缩放工具 (R)")
|
|
else:
|
|
if imgui.button("缩放##scale_tool"):
|
|
self.app.tool_manager.setCurrentTool("缩放")
|
|
if scale_active:
|
|
draw_list = imgui.get_window_draw_list()
|
|
button_min = imgui.get_item_rect_min()
|
|
button_max = imgui.get_item_rect_max()
|
|
draw_list.add_rect_filled(button_min, button_max, imgui.get_color_u32((0.3, 0.6, 1.0, 0.3)))
|
|
|
|
imgui.same_line()
|
|
imgui.separator()
|
|
imgui.same_line()
|
|
|
|
# 工具按钮已移除(导入、保存、播放)
|
|
|