mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-06-04 20:46:29 +03:00
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:
@@ -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 ) );
|
||||
|
||||
@@ -559,6 +559,8 @@ class App : public UICodeEditorSplitter::Client {
|
||||
|
||||
std::string getLastUsedFolder();
|
||||
|
||||
void insertRecentFolder( const std::string& rpath );
|
||||
|
||||
void cleanUpRecentFolders();
|
||||
|
||||
void cleanUpRecentFiles();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user