eepp: Fixed UI Editor crash when opening projects.

ecode: Status Build Output Controller crash fix. Added icons to the status bar buttons.
This commit is contained in:
Martín Lucas Golini
2023-06-13 20:44:49 -03:00
parent de4875b255
commit c0aabb56d8
5 changed files with 83 additions and 63 deletions

View File

@@ -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 {
</hbox>
</globalsearchbar>
<statusbar lw="mp" lh="wc" id="status_bar">
<TextView class="status_but" id="status_locate_bar" text="@string(locate, Locate)" />
<TextView class="status_but" id="status_global_search_bar" text="@string(search, Search)" />
<TextView class="status_but" id="status_terminal" text="@string(terminal, Terminal)" />
<TextView class="status_but" id="status_build_output" text="@string(build, Build)" />
<PushButton class="status_but" id="status_locate_bar" text="@string(locate, Locate)" icon="icon(search-fuzzy, 12dp)" />
<PushButton class="status_but" id="status_global_search_bar" text="@string(search, Search)" icon="icon(file-search, 12dp)" />
<PushButton class="status_but" id="status_terminal" text="@string(terminal, Terminal)" icon="icon(terminal, 12dp)" />
<PushButton class="status_but" id="status_build_output" text="@string(build, Build)" icon="icon(symbol-property, 12dp)" />
<View lw="0" lw8="1" lh="mp" />
</statusbar>
</vbox>
@@ -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 ) );

View File

@@ -559,6 +559,8 @@ class App : public UICodeEditorSplitter::Client {
std::string getLastUsedFolder();
void insertRecentFolder( const std::string& rpath );
void cleanUpRecentFolders();
void cleanUpRecentFiles();

View File

@@ -455,15 +455,19 @@ void StatusBuildOutputController::createContainer() {
if ( mContainer )
return;
const auto XML = R"xml(
<RelativeLayout id="build_output" lw="mp" lh="mp" visible="false">
<rellayce class="status_build_output_cont" lw="mp" lh="mp">
<CodeEditor id="build_output_output" lw="mp" lh="mp" />
<TableView id="build_output_issues" lw="mp" lh="mp" visible="false" />
<SelectButton id="but_build_output_issues" text="@string(issues, Issues)" lg="bottom|right" margin-right="1dp" margin-bottom="18dp" margin-right="18dp" />
<SelectButton id="but_build_output_output" text="@string(output, Output)" layout-to-left-of="but_build_output_issues" selected="true" />
</rellayce>
</RelativeLayout>
<rellayce id="build_output" lw="mp" lh="mp" visible="false" class="status_build_output_cont" lw="mp" lh="mp">
<CodeEditor id="build_output_output" lw="mp" lh="mp" />
<TableView id="build_output_issues" lw="mp" lh="mp" visible="false" />
<SelectButton id="but_build_output_issues" text="@string(issues, Issues)" lg="bottom|right" margin-right="1dp" margin-bottom="18dp" margin-right="18dp" />
<SelectButton id="but_build_output_output" text="@string(output, Output)" layout-to-left-of="but_build_output_issues" selected="true" />
</rellayce>
)xml";
if ( mMainSplitter->getLastWidget() != nullptr ) {
mMainSplitter->getLastWidget()->setVisible( false );
mMainSplitter->getLastWidget()->setParent( mUISceneNode );
}
mContainer = mApp->getUISceneNode()
->loadLayoutFromString( XML, mMainSplitter )
->asType<UIRelativeLayoutCommandExecuter>();
@@ -513,19 +517,18 @@ void StatusBuildOutputController::createContainer() {
} );
mBuildOutput = editor;
mContainer->setVisible( false );
auto cont = mContainer->getFirstChild()->asType<UIRelativeLayoutCommandExecuter>();
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

View File

@@ -2,6 +2,7 @@
#define ECODE_STATUSBUILDOUTPUTCONTROLLER_HPP
#include "projectbuild.hpp"
#include "widgetcommandexecuter.hpp"
#include <eepp/system/luapattern.hpp>
#include <eepp/ui/tools/uicodeeditorsplitter.hpp>
#include <eepp/ui/uicodeeditor.hpp>
@@ -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 };

View File

@@ -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<UICodeEditor*> 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 );