void ScriptEditorApplication::internal_ToggleToolbarItem(MonoString* name, bool on) { String nativeName = MonoUtil::monoToString(name); MainEditorWindow* editorWindow = EditorWindowManager::instance().getMainWindow(); editorWindow->getMenuBar().toggleToolbarButton(nativeName, on); }
void ScriptEditorApplication::internal_SetStatusScene(MonoString* name, bool modified) { String nativeScene = MonoUtil::monoToString(name); MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); mainWindow->getStatusBar().setScene(nativeScene, modified); }
void MenuItemManager::reloadAssemblyData() { clearMenuItems(); // Reload MenuItem attribute from editor assembly MonoAssembly* editorAssembly = MonoManager::instance().getAssembly(EDITOR_ASSEMBLY); mMenuItemAttribute = editorAssembly->getClass(EDITOR_NS, "MenuItem"); if (mMenuItemAttribute == nullptr) BS_EXCEPT(InvalidStateException, "Cannot find MenuItem managed class."); mPathField = mMenuItemAttribute->getField("path"); mShortcutField = mMenuItemAttribute->getField("shortcut"); mPriorityField = mMenuItemAttribute->getField("priority"); mSeparatorField = mMenuItemAttribute->getField("separator"); MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); Vector<String> scriptAssemblyNames = mScriptObjectManager.getScriptAssemblies(); for (auto& assemblyName : scriptAssemblyNames) { MonoAssembly* assembly = MonoManager::instance().getAssembly(assemblyName); // Find new menu item methods const Vector<MonoClass*>& allClasses = assembly->getAllClasses(); for (auto curClass : allClasses) { const Vector<MonoMethod*>& methods = curClass->getAllMethods(); for (auto& curMethod : methods) { String path; ShortcutKey shortcutKey = ShortcutKey::NONE; INT32 priority = 0; bool separator = false; if (parseMenuItemMethod(curMethod, path, shortcutKey, priority, separator)) { std::function<void()> callback = std::bind(&MenuItemManager::menuItemCallback, curMethod); if (separator) { Vector<String> pathElements = StringUtil::split(path, "/"); String separatorPath; if (pathElements.size() > 1) { const String& lastElem = pathElements[pathElements.size() - 1]; separatorPath = path; separatorPath.erase(path.size() - lastElem.size() - 1, lastElem.size() + 1); } GUIMenuItem* separatorItem = mainWindow->getMenuBar().addMenuItemSeparator(separatorPath, priority); mMenuItems.push_back(separatorItem); } GUIMenuItem* menuItem = mainWindow->getMenuBar().addMenuItem(path, callback, priority, shortcutKey); mMenuItems.push_back(menuItem); } } } } }
void ScriptEditorApplication::internal_SetStatusProject(bool modified) { MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); if (gEditorApplication().isProjectLoaded()) mainWindow->getStatusBar().setProject(gEditorApplication().getProjectName(), modified); else mainWindow->getStatusBar().setProject("None", false); }
SPtr<EditorWidgetLayout> EditorWidgetManager::getLayout() const { auto GetWidgetNamesInContainer = [&] (const EditorWidgetContainer* container) { Vector<String> widgetNames; if(container != nullptr) { UINT32 numWidgets = container->getNumWidgets(); for(UINT32 i = 0; i < numWidgets; i++) { EditorWidgetBase* widget = container->getWidget(i); widgetNames.push_back(widget->getName()); } } return widgetNames; }; MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); DockManager& dockManager = mainWindow->getDockManager(); SPtr<EditorWidgetLayout> layout = bs_shared_ptr_new<EditorWidgetLayout>(dockManager.getLayout()); Vector<EditorWidgetLayout::Entry>& layoutEntries = layout->getEntries(); UnorderedSet<EditorWidgetContainer*> widgetContainers; for(auto& widget : mActiveWidgets) { widgetContainers.insert(widget.second->_getParent()); } for(auto& widgetContainer : widgetContainers) { if(widgetContainer == nullptr) continue; layoutEntries.push_back(EditorWidgetLayout::Entry()); EditorWidgetLayout::Entry& entry = layoutEntries.back(); entry.widgetNames = GetWidgetNamesInContainer(widgetContainer); EditorWindowBase* parentWindow = widgetContainer->getParentWindow(); entry.isDocked = parentWindow->isMain(); // Assumed widget is docked if part of main window if(!entry.isDocked) { entry.x = parentWindow->getLeft(); entry.y = parentWindow->getTop(); entry.width = parentWindow->getWidth(); entry.height = parentWindow->getHeight(); } } layout->setIsMainWindowMaximized(mainWindow->getRenderWindow()->getProperties().isMaximized()); return layout; }
void EditorWidgetManager::setLayout(const SPtr<EditorWidgetLayout>& layout) { // Unparent all widgets Vector<EditorWidgetBase*> unparentedWidgets; for(auto& widget : mActiveWidgets) { if(widget.second->_getParent() != nullptr) widget.second->_getParent()->remove(*(widget.second)); unparentedWidgets.push_back(widget.second); } // Restore floating widgets for(auto& entry : layout->getEntries()) { if(entry.isDocked) continue; EditorWindow* window = EditorWindow::create(); for(auto& widgetName : entry.widgetNames) { create(widgetName, window->widgets()); } window->setPosition(entry.x, entry.y); window->setSize(entry.width, entry.height); if(window->widgets().getNumWidgets() == 0) window->close(); } // Restore docked widgets MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); DockManager& dockManager = mainWindow->getDockManager(); dockManager.setLayout(layout->getDockLayout()); // Destroy any widgets that are no longer have parents for(auto& widget : unparentedWidgets) { if(widget->_getParent() == nullptr) widget->close(); } if (layout->getIsMainWindowMaximized()) mainWindow->getRenderWindow()->maximize(gCoreAccessor()); }
EditorWindowBase::EditorWindowBase(bool isModal) :mOwnsRenderWindow(true), mIsModal(isModal) { UINT32 width = 200; UINT32 height = 200; INT32 left = -1; INT32 top = -1; // If possible open the window in the center of the main editor window MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); if(mainWindow != nullptr) { left = mainWindow->getLeft() + mainWindow->getWidth() / 2 - width / 2; top = mainWindow->getTop() + mainWindow->getHeight() / 2 - height / 2; } RENDER_WINDOW_DESC renderWindowDesc; renderWindowDesc.videoMode = VideoMode(width, height); renderWindowDesc.title = "EditorWindow"; renderWindowDesc.fullscreen = false; renderWindowDesc.showTitleBar = false; renderWindowDesc.showBorder = false; renderWindowDesc.allowResize = !isModal; renderWindowDesc.toolWindow = true; renderWindowDesc.modal = isModal; renderWindowDesc.hideUntilSwap = true; renderWindowDesc.left = left; renderWindowDesc.top = top; renderWindowDesc.depthBuffer = false; if(EditorWindowManager::instance().areNewWindowsHidden()) renderWindowDesc.hidden = true; mRenderWindow = RenderWindow::create(renderWindowDesc, gCoreApplication().getPrimaryWindow()); construct(mRenderWindow); }
void MenuItemManager::clearMenuItems() { MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); UINT32 numItems = (UINT32)mMenuItems.size(); Vector<bool> destroyedItems(numItems, false); // Remove leaf elements only to avoid deleting child menu items bool changesMade; do { changesMade = false; for (UINT32 i = 0; i < numItems; i++) { GUIMenuItem* menuItem = mMenuItems[i]; if (!destroyedItems[i] && menuItem->getNumChildren() == 0) { mainWindow->getMenuBar().removeMenuItem(menuItem); destroyedItems[i] = true; changesMade = true; } } } while (changesMade); // Remove remaining items regardless (none of their children are our concern). But when running properly there // should be no entries to remove at this step. for (UINT32 i = 0; i < numItems; i++) { GUIMenuItem* menuItem = mMenuItems[i]; if (!destroyedItems[i]) mainWindow->getMenuBar().removeMenuItem(menuItem); } mMenuItems.clear(); }
void ScriptEditorApplication::startUp() { MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); OnStatusBarClickedConn = mainWindow->getStatusBar().onMessageClicked.connect(&ScriptEditorApplication::onStatusBarClicked); }
void ScriptEditorApplication::internal_SetStatusImporting(bool importing, float percent) { MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); mainWindow->getStatusBar().setIsImporting(importing, percent); }
void ScriptEditorApplication::internal_SetStatusCompiling(bool compiling) { MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); mainWindow->getStatusBar().setIsCompiling(compiling); }