From c0aabb56d86b5b7687e32664a72779f1bd677c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Tue, 13 Jun 2023 20:44:49 -0300 Subject: [PATCH] eepp: Fixed UI Editor crash when opening projects. ecode: Status Build Output Controller crash fix. Added icons to the status bar buttons. --- src/tools/ecode/ecode.cpp | 45 ++++++++------ src/tools/ecode/ecode.hpp | 2 + .../ecode/statusbuildoutputcontroller.cpp | 37 ++++++------ .../ecode/statusbuildoutputcontroller.hpp | 3 +- src/tools/uieditor/uieditor.cpp | 59 ++++++++++--------- 5 files changed, 83 insertions(+), 63 deletions(-) diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 7a41b77c4..24388f644 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -247,6 +247,15 @@ std::string App::getLastUsedFolder() { return "."; } +void App::insertRecentFolder( const std::string& rpath ) { + auto found = std::find( mRecentFolders.begin(), mRecentFolders.end(), rpath ); + if ( found != mRecentFolders.end() ) + mRecentFolders.erase( found ); + mRecentFolders.insert( mRecentFolders.begin(), rpath ); + if ( mRecentFolders.size() > 10 ) + mRecentFolders.resize( 10 ); +} + void App::refreshFolderView() { if ( !mFileSystemModel ) return; @@ -2924,13 +2933,7 @@ void App::loadFolder( const std::string& path ) { if ( mFileSystemListener ) mFileSystemListener->setFileSystemModel( mFileSystemModel ); - auto found = std::find( mRecentFolders.begin(), mRecentFolders.end(), rpath ); - if ( found != mRecentFolders.end() ) - mRecentFolders.erase( found ); - mRecentFolders.insert( mRecentFolders.begin(), rpath ); - if ( mRecentFolders.size() > 10 ) - mRecentFolders.resize( 10 ); - + insertRecentFolder( rpath ); cleanUpRecentFolders(); updateRecentFolders(); mSettings->updateProjectSettingsMenu(); @@ -3288,17 +3291,20 @@ TableView#locate_bar_table > tableview::row:selected > tableview::cell:nth-child padding-top: 1dp; padding-bottom: 1dp; } -#status_bar > TextView { - padding-left: 4dp; - padding-right: 5dp; +#status_bar > * { + padding: 0dp 5dp 0dp 4dp; background-color: var(--list-back); + border-radius: 0dp; + border-left-color: transparent; + border-top-color: transparent; + border-bottom-color: transparent; border-right-color: var(--tab-line); font-size: 10dp; } -#status_bar > TextView:hover { +#status_bar > *:hover { background-color: var(--item-hover); } -#status_bar > TextView.selected { +#status_bar > *.selected { background-color: var(--primary); } #panel > tabwidget::container > * { @@ -3598,10 +3604,10 @@ Anchor.error:hover { - - - - + + + + @@ -3674,7 +3680,9 @@ Anchor.error:hover { { "hearth-pulse", 0xee10 }, { "add", 0xea12 }, { "hammer", 0xedee }, - { "eraser", 0xec9e } }; + { "eraser", 0xec9e }, + { "file-search", 0xed05 } }; + for ( const auto& icon : icons ) iconTheme->add( UIGlyphIcon::New( icon.first, iconFont, icon.second ) ); @@ -3797,7 +3805,8 @@ Anchor.error:hover { { "layout-sidebar-left-off", 0xec02 }, { "layout-sidebar-left", 0xebf3 }, { "warning", 0xea6c }, - { "error", 0xea87 } }; + { "error", 0xea87 }, + { "search-fuzzy", 0xec0d } }; for ( const auto& icon : codIcons ) iconTheme->add( UIGlyphIcon::New( icon.first, codIconFont, icon.second ) ); diff --git a/src/tools/ecode/ecode.hpp b/src/tools/ecode/ecode.hpp index 95bdf7c46..7b3eab602 100644 --- a/src/tools/ecode/ecode.hpp +++ b/src/tools/ecode/ecode.hpp @@ -559,6 +559,8 @@ class App : public UICodeEditorSplitter::Client { std::string getLastUsedFolder(); + void insertRecentFolder( const std::string& rpath ); + void cleanUpRecentFolders(); void cleanUpRecentFiles(); diff --git a/src/tools/ecode/statusbuildoutputcontroller.cpp b/src/tools/ecode/statusbuildoutputcontroller.cpp index d3eb43eda..6d37aa4e5 100644 --- a/src/tools/ecode/statusbuildoutputcontroller.cpp +++ b/src/tools/ecode/statusbuildoutputcontroller.cpp @@ -455,15 +455,19 @@ void StatusBuildOutputController::createContainer() { if ( mContainer ) return; const auto XML = R"xml( - - - - - - - - + + + + + + )xml"; + + if ( mMainSplitter->getLastWidget() != nullptr ) { + mMainSplitter->getLastWidget()->setVisible( false ); + mMainSplitter->getLastWidget()->setParent( mUISceneNode ); + } + mContainer = mApp->getUISceneNode() ->loadLayoutFromString( XML, mMainSplitter ) ->asType(); @@ -513,19 +517,18 @@ void StatusBuildOutputController::createContainer() { } ); mBuildOutput = editor; mContainer->setVisible( false ); - auto cont = mContainer->getFirstChild()->asType(); - cont->setCommand( "build-output-show-build-output", [this]() { showBuildOutput(); } ); - cont->setCommand( "build-output-show-build-issues", [this]() { showIssues(); } ); - cont->getKeyBindings().addKeybind( { KEY_1, KeyMod::getDefaultModifier() }, - "build-output-show-build-output" ); - cont->getKeyBindings().addKeybind( { KEY_2, KeyMod::getDefaultModifier() }, - "build-output-show-build-issues" ); + mContainer->setCommand( "build-output-show-build-output", [this]() { showBuildOutput(); } ); + mContainer->setCommand( "build-output-show-build-issues", [this]() { showIssues(); } ); + mContainer->getKeyBindings().addKeybind( { KEY_1, KeyMod::getDefaultModifier() }, + "build-output-show-build-output" ); + mContainer->getKeyBindings().addKeybind( { KEY_2, KeyMod::getDefaultModifier() }, + "build-output-show-build-issues" ); mButOutput->onClick( [this]( auto ) { showBuildOutput(); } ); mButIssues->onClick( [this]( auto ) { showIssues(); } ); mButOutput->setTooltipText( - cont->getKeyBindings().getCommandKeybindString( "build-output-show-build-output" ) ); + mContainer->getKeyBindings().getCommandKeybindString( "build-output-show-build-output" ) ); mButIssues->setTooltipText( - cont->getKeyBindings().getCommandKeybindString( "build-output-show-build-issues" ) ); + mContainer->getKeyBindings().getCommandKeybindString( "build-output-show-build-issues" ) ); } } // namespace ecode diff --git a/src/tools/ecode/statusbuildoutputcontroller.hpp b/src/tools/ecode/statusbuildoutputcontroller.hpp index 9c346c947..4f66689d7 100644 --- a/src/tools/ecode/statusbuildoutputcontroller.hpp +++ b/src/tools/ecode/statusbuildoutputcontroller.hpp @@ -2,6 +2,7 @@ #define ECODE_STATUSBUILDOUTPUTCONTROLLER_HPP #include "projectbuild.hpp" +#include "widgetcommandexecuter.hpp" #include #include #include @@ -61,7 +62,7 @@ class StatusBuildOutputController { App* mApp{ nullptr }; UICodeEditorSplitter* mSplitter{ nullptr }; - UIRelativeLayout* mContainer{ nullptr }; + UIRelativeLayoutCommandExecuter* mContainer{ nullptr }; UICodeEditor* mBuildOutput{ nullptr }; UISelectButton* mButOutput{ nullptr }; UISelectButton* mButIssues{ nullptr }; diff --git a/src/tools/uieditor/uieditor.cpp b/src/tools/uieditor/uieditor.cpp index db170599c..e6275bb3d 100644 --- a/src/tools/uieditor/uieditor.cpp +++ b/src/tools/uieditor/uieditor.cpp @@ -790,56 +790,61 @@ void App::loadLayoutFile( std::string layoutPath ) { } void App::loadProject( std::string projectPath ) { - if ( FileSystem::fileExists( projectPath ) ) { - closeProject(); + if ( !FileSystem::fileExists( projectPath ) ) + return; - mBasePath = FileSystem::fileRemoveFileName( projectPath ); + closeProject(); - FileSystem::changeWorkingDirectory( mBasePath ); + mBasePath = FileSystem::fileRemoveFileName( projectPath ); - pugi::xml_document doc; - pugi::xml_parse_result result = doc.load_file( projectPath.c_str() ); + FileSystem::changeWorkingDirectory( mBasePath ); - if ( result ) { - loadProjectNodes( doc.first_child() ); + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file( projectPath.c_str() ); - for ( auto pathIt = mRecentProjects.begin(); pathIt != mRecentProjects.end(); - pathIt++ ) { - if ( *pathIt == projectPath ) { - mRecentProjects.erase( pathIt ); - break; - } + if ( result ) { + loadProjectNodes( doc.first_child() ); + + for ( auto pathIt = mRecentProjects.begin(); pathIt != mRecentProjects.end(); pathIt++ ) { + if ( *pathIt == projectPath ) { + mRecentProjects.erase( pathIt ); + break; } - - mRecentProjects.insert( mRecentProjects.begin(), projectPath ); - - if ( mRecentProjects.size() > 10 ) - mRecentProjects.resize( 10 ); - - updateRecentProjects(); - } else { - Log::error( "Couldn't load UI Layout: %s", projectPath.c_str() ); - Log::error( "Error description: %s", result.description() ); - Log::error( "Error offset: %d", result.offset ); } + + mRecentProjects.insert( mRecentProjects.begin(), projectPath ); + + if ( mRecentProjects.size() > 10 ) + mRecentProjects.resize( 10 ); + + updateRecentProjects(); + } else { + Log::error( "Couldn't load UI Layout: %s", projectPath.c_str() ); + Log::error( "Error description: %s", result.description() ); + Log::error( "Error offset: %d", result.offset ); } } void App::closeEditors() { + UISceneNode* prevUISceneNode = SceneManager::instance()->getUISceneNode(); + SceneManager::instance()->setCurrentUISceneNode( mSplitter->getUISceneNode() ); std::vector editors = mSplitter->getAllEditors(); while ( !editors.empty() ) { UICodeEditor* editor = editors[0]; UITabWidget* tabWidget = mSplitter->tabWidgetFromEditor( editor ); - tabWidget->removeTab( (UITab*)editor->getData(), true, true ); + tabWidget->removeTab( (UITab*)editor->getData(), true, false ); editors = mSplitter->getAllEditors(); if ( editors.size() == 1 && editors[0]->getDocument().isEmpty() ) break; }; if ( !mSplitter->getTabWidgets().empty() && mSplitter->getTabWidgets()[0]->getTabCount() == 0 ) mSplitter->createCodeEditorInTabWidget( mSplitter->getTabWidgets()[0] ); + SceneManager::instance()->setCurrentUISceneNode( prevUISceneNode ); } void App::closeProject() { + SceneManager::instance()->setCurrentUISceneNode( mUISceneNode ); + mCurrentLayout = ""; mCurrentStyleSheet = ""; mUIContainer->getContainer()->childsCloseAll(); @@ -1373,7 +1378,7 @@ void App::init( const Float& pixelDensityConf, const bool& useAppTheme, const st mAppUISceneNode->bind( "project_splitter", mProjectSplitter ); mSidePanel = mProjectSplitter->getFirstWidget(); SceneManager::instance()->setCurrentUISceneNode( mAppUISceneNode ); - mSplitter = UICodeEditorSplitter::New( this, mUISceneNode, colorSchemes, "eepp" ); + mSplitter = UICodeEditorSplitter::New( this, mAppUISceneNode, colorSchemes, "eepp" ); mSplitter->setHideTabBarOnSingleTab( false ); mSplitter->createEditorWithTabWidget( mBaseLayout ); SceneManager::instance()->setCurrentUISceneNode( mUISceneNode );