diff --git a/src/eepp/ui/uiborderdrawable.cpp b/src/eepp/ui/uiborderdrawable.cpp index 37acb9452..4f834a5e3 100644 --- a/src/eepp/ui/uiborderdrawable.cpp +++ b/src/eepp/ui/uiborderdrawable.cpp @@ -43,6 +43,7 @@ void UIBorderDrawable::draw( const Vector2f& position, const Sizef& size ) { } // TODO: Implement color update. + // TODO: Optimize position update. if ( mNeedsUpdate || mColorNeedsUpdate ) { update(); } diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index 19c634706..7c4e8b755 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -2550,7 +2550,7 @@ void UICodeEditor::updateHighlightWordCache() { mHighlightWord.caseSensitive, mHighlightWord.wholeWord, mHighlightWord.type, mHighlightWord.range ); Log::info( "Document search triggered in document: \"%s\", searched for " - "\"%s\" and took %2.f ms", + "\"%s\" and took %.2f ms", mDoc->getFilename().c_str(), mHighlightWord.text.toUtf8().c_str(), docSearch.getElapsedTime().asMilliseconds() ); diff --git a/src/eepp/ui/uiscrollview.cpp b/src/eepp/ui/uiscrollview.cpp index a71c8ad87..73ca29309 100644 --- a/src/eepp/ui/uiscrollview.cpp +++ b/src/eepp/ui/uiscrollview.cpp @@ -179,7 +179,10 @@ void UIScrollView::containerUpdate() { } mContainer->setPosition( mPadding.Left, mPadding.Top ); - mContainer->setSize( size ); + + // TODO: Fix layouting to avoid needing this hack. + if ( size != mContainer->getSize() ) + runOnMainThread( [this, size]() { mContainer->setSize( size ); } ); mVScroll->setPosition( getSize().getWidth() - mVScroll->getSize().getWidth() - mPadding.Right, mPadding.Top ); diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 0451e7f47..cb6226524 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -3352,7 +3352,8 @@ TableView#locate_bar_table > tableview::row:selected > tableview::cell:nth-child .settings_panel .span { margin-top: 4dp; } -.settings_panel #build_type_list { +.settings_panel #build_type_list, +.settings_panel #build_type_add { margin-right: 4dp; } .settings_panel .build_types_cont { diff --git a/src/tools/ecode/projectbuild.cpp b/src/tools/ecode/projectbuild.cpp index 8b0dff933..7b4b3a97e 100644 --- a/src/tools/ecode/projectbuild.cpp +++ b/src/tools/ecode/projectbuild.cpp @@ -18,8 +18,8 @@ using json = nlohmann::json; using namespace EE::Scene; /** @return The process environment variables */ -static std::unordered_map getEnvironmentVariables() { - std::unordered_map ret; +static ecode::ProjectBuildKeyVal getEnvironmentVariables() { + ecode::ProjectBuildKeyVal ret; char** env; #if defined( WIN ) && ( _MSC_VER >= 1900 ) env = *__p__environ(); @@ -32,12 +32,12 @@ static std::unordered_map getEnvironmentVariables() { auto var = String::split( *env, "=" ); if ( var.size() == 2 ) { - ret[var[0]] = var[1]; + ret.push_back( std::make_pair( var[0], var[1] ) ); } else if ( var.size() > 2 ) { auto val( var[1] ); for ( size_t i = 2; i < var.size(); ++i ) val += var[i]; - ret[var[0]] = val; + ret.push_back( std::make_pair( var[0], val ) ); } } @@ -59,18 +59,18 @@ static void replaceVar( ProjectBuildStep& s, const std::string& var, const std:: String::replaceAll( s.workingDir, slashDup, FileSystem::getOSSlash() ); } -void ProjectBuild::replaceVars() { - const std::vector steps{ &mBuild, &mClean }; - for ( auto& step : steps ) { - for ( auto& s : *step ) { - replaceVar( s, VAR_PROJECT_ROOT, mProjectRoot ); - for ( auto& var : mVars ) { - std::string varKey( "${" + var.first + "}" ); - String::replaceAll( var.second, VAR_PROJECT_ROOT, mProjectRoot ); - replaceVar( s, varKey, var.second ); - } +ProjectBuildSteps ProjectBuild::replaceVars( const ProjectBuildSteps& steps ) const { + ProjectBuildSteps newSteps( steps ); + for ( auto& s : newSteps ) { + replaceVar( s, VAR_PROJECT_ROOT, mProjectRoot ); + for ( auto& var : mVars ) { + std::string varKey( "${" + var.first + "}" ); + std::string varVal( var.second ); + String::replaceAll( varVal, VAR_PROJECT_ROOT, mProjectRoot ); + replaceVar( s, varKey, varVal ); } } + return newSteps; } bool ProjectBuild::isOSSupported( const std::string& os ) const { @@ -133,7 +133,9 @@ ProjectBuildCommandsRes ProjectBuildManager::generateBuildCommands( const std::s std::string nproc = String::format( "%d", Sys::getCPUCount() ); ProjectBuildCommandsRes res; - for ( const auto& step : build.mBuild ) { + auto finalBuild( build.replaceVars( build.mBuild ) ); + + for ( const auto& step : finalBuild ) { ProjectBuildCommand buildCmd( step, build.mEnvs ); replaceVar( buildCmd, VAR_OS, currentOS ); replaceVar( buildCmd, VAR_NPROC, nproc ); @@ -191,7 +193,9 @@ ProjectBuildCommandsRes ProjectBuildManager::generateCleanCommands( const std::s std::string nproc = String::format( "%d", Sys::getCPUCount() ); ProjectBuildCommandsRes res; - for ( const auto& step : build.mClean ) { + auto finalBuild( build.replaceVars( build.mClean ) ); + + for ( const auto& step : finalBuild ) { ProjectBuildCommand buildCmd( step, build.mEnvs ); replaceVar( buildCmd, VAR_OS, currentOS ); replaceVar( buildCmd, VAR_NPROC, nproc ); @@ -286,13 +290,13 @@ bool ProjectBuildManager::load() { if ( buildObj.contains( "var" ) && buildObj["var"].is_object() ) { const auto& vars = buildObj["var"]; for ( const auto& var : vars.items() ) - b.mVars[var.key()] = var.value(); + b.mVars.push_back( std::make_pair( var.key(), var.value() ) ); } if ( buildObj.contains( "env" ) && buildObj["env"].is_object() ) { const auto& vars = buildObj["env"]; for ( const auto& var : vars.items() ) - b.mEnvs[var.key()] = var.value(); + b.mEnvs.push_back( std::make_pair( var.key(), var.value() ) ); } if ( buildObj.contains( "build" ) && buildObj["build"].is_array() ) { @@ -374,8 +378,6 @@ bool ProjectBuildManager::load() { b.mOutputParser = outputParser; } - b.replaceVars(); - mBuilds.insert( { build.key(), std::move( b ) } ); } @@ -446,6 +448,14 @@ void ProjectBuildManager::cleanCurrentConfig( StatusBuildOutputController* sboc } } +static std::unordered_map +toUnorderedMap( const ProjectBuildKeyVal& vec ) { + std::unordered_map map; + for ( const auto& v : vec ) + map[v.first] = v.second; + return map; +} + void ProjectBuildManager::runBuild( const std::string& buildName, const std::string& buildType, const ProjectBuildi18nFn& i18n, const ProjectBuildCommandsRes& res, @@ -489,11 +499,11 @@ void ProjectBuildManager::runBuild( const std::string& buildName, const std::str int progress = c > 0 ? c / (Float)totSteps : 0; mProcess = std::make_unique(); auto options = Process::SearchUserPath | Process::NoWindow | Process::CombinedStdoutStderr; - std::unordered_map env; + ProjectBuildKeyVal env; if ( !cmd.config.clearSysEnv ) { if ( !env.empty() ) { env = getEnvironmentVariables(); - env.insert( cmd.envs.begin(), cmd.envs.end() ); + env.insert( env.begin(), cmd.envs.begin(), cmd.envs.end() ); } else { options |= Process::InheritEnvironment; } @@ -506,7 +516,8 @@ void ProjectBuildManager::runBuild( const std::string& buildName, const std::str continue; } - if ( mProcess->create( cmd.cmd, cmd.args, options, env, cmd.workingDir ) ) { + if ( mProcess->create( cmd.cmd, cmd.args, options, toUnorderedMap( env ), + cmd.workingDir ) ) { if ( progressFn ) progressFn( progress, Sys::getDateTimeStr() + ": " + @@ -644,12 +655,13 @@ void ProjectBuildManager::updateSidePanelTab() { updateBuildType(); buildList->removeEventsOfType( Event::OnItemSelected ); - buildList->addEventListener( Event::OnItemSelected, [this, buildEdit, buildList]( const Event* ) { - mConfig.buildName = buildList->getListBox()->getItemSelectedText(); - mConfig.buildType = ""; - buildEdit->setEnabled( true ); - updateBuildType(); - } ); + buildList->addEventListener( + Event::OnItemSelected, [this, buildEdit, buildList]( const Event* ) { + mConfig.buildName = buildList->getListBox()->getItemSelectedText(); + mConfig.buildType = ""; + buildEdit->setEnabled( true ); + updateBuildType(); + } ); buildButton->setEnabled( !mConfig.buildName.empty() && hasBuild( mConfig.buildName ) && hasBuildCommands( mConfig.buildName ) ); @@ -681,7 +693,7 @@ void ProjectBuildManager::updateSidePanelTab() { [this]( const Event* ) { mNewBuild = ProjectBuild( mApp->i18n( "new_name", "new_name" ), mProjectRoot ); auto ret = mApp->getSplitter()->createWidget( - UIBuildSettings::New( mNewBuild ), + UIBuildSettings::New( mNewBuild, mConfig ), mApp->i18n( "build_settings", "Build Settings" ) ); ret.first->setIcon( mApp->findIcon( "hammer" ) ); }, @@ -693,7 +705,7 @@ void ProjectBuildManager::updateSidePanelTab() { auto build = mBuilds.find( mConfig.buildName ); if ( build != mBuilds.end() ) { auto ret = mApp->getSplitter()->createWidget( - UIBuildSettings::New( build->second ), + UIBuildSettings::New( build->second, mConfig ), mApp->i18n( "build_settings", "Build Settings" ) ); ret.first->setIcon( mApp->findIcon( "hammer" ) ); } diff --git a/src/tools/ecode/projectbuild.hpp b/src/tools/ecode/projectbuild.hpp index b66072812..da6bcfe90 100644 --- a/src/tools/ecode/projectbuild.hpp +++ b/src/tools/ecode/projectbuild.hpp @@ -87,7 +87,7 @@ struct ProjectBuildStep { }; using ProjectBuildSteps = std::vector; -using ProjectBuildKeyVal = std::unordered_map; +using ProjectBuildKeyVal = std::vector>; struct ProjectBuildConfig { bool clearSysEnv{ false }; @@ -142,6 +142,8 @@ class ProjectBuild { bool hasClean() const { return !mClean.empty(); } + ProjectBuildSteps replaceVars( const ProjectBuildSteps& steps ) const; + protected: friend class ProjectBuildManager; friend class UIBuildSettings; @@ -156,8 +158,6 @@ class ProjectBuild { ProjectBuildKeyVal mVars; ProjectBuildConfig mConfig; ProjectBuildOutputParser mOutputParser; - - void replaceVars(); }; using ProjectBuildMap = std::unordered_map; diff --git a/src/tools/ecode/uibuildsettings.cpp b/src/tools/ecode/uibuildsettings.cpp index ed3fbbb56..4aa9a224b 100644 --- a/src/tools/ecode/uibuildsettings.cpp +++ b/src/tools/ecode/uibuildsettings.cpp @@ -1,7 +1,11 @@ #include "uibuildsettings.hpp" +#include #include #include #include +#include + +using namespace EE::UI::Models; namespace ecode { @@ -115,9 +119,9 @@ static const auto SETTINGS_PANEL_XML = R"xml( - + + - @@ -128,7 +132,7 @@ static const auto SETTINGS_PANEL_XML = R"xml( - + @@ -151,7 +155,7 @@ static const auto SETTINGS_PANEL_XML = R"xml( - + @@ -163,11 +167,12 @@ static const auto SETTINGS_PANEL_XML = R"xml( )xml"; -UIBuildSettings* UIBuildSettings::New( ProjectBuild& build ) { - return eeNew( UIBuildSettings, ( build ) ); +UIBuildSettings* UIBuildSettings::New( ProjectBuild& build, ProjectBuildConfiguration& config ) { + return eeNew( UIBuildSettings, ( build, config ) ); } -UIBuildSettings::UIBuildSettings( ProjectBuild& build ) : mBuild( build ) { +UIBuildSettings::UIBuildSettings( ProjectBuild& build, ProjectBuildConfiguration& config ) : + mBuild( build ), mConfig( config ) { mUISceneNode->loadLayoutFromString( SETTINGS_PANEL_XML, this, String::hash( "build_settings" ) ); mDataBindHolder += UIDataBindString::New( &mBuild.mName, find( "build_name" ) ); @@ -202,7 +207,10 @@ UIBuildSettings::UIBuildSettings( ProjectBuild& build ) : mBuild( build ) { for ( const auto& type : mBuild.mBuildTypes ) buildTypes.push_back( type ); buildTypeDropDown->getListBox()->addListBoxItems( buildTypes ); - buildTypeDropDown->getListBox()->setSelected( 0 ); + buildTypeDropDown->getListBox()->setSelected( mConfig.buildType ); + buildTypeDropDown->on( Event::OnItemSelected, [this, buildTypeDropDown]( const Event* ) { + mConfig.buildType = buildTypeDropDown->getListBox()->getItemSelectedText().toUtf8(); + } ); auto advTitle = querySelector( ".settings_panel > .advanced_options > .title" ); advTitle->addMouseClickListener( @@ -212,6 +220,16 @@ UIBuildSettings::UIBuildSettings( ProjectBuild& build ) : mBuild( build ) { img->toggleClass( "expanded" ); }, MouseButton::EE_BUTTON_LEFT ); + + mDataBindHolder += + UIDataBindBool::New( &mBuild.mConfig.clearSysEnv, find( "clear_sys_env" ) ); + + UITableView* tableVars = find( "table_vars" ); + auto model = ItemPairListModel::create( mBuild.mVars ); + model->setColumnName( 0, getTranslatorString( "var_name", "Name" ) ); + model->setColumnName( 1, getTranslatorString( "var_value", "Value" ) ); + tableVars->setAutoColumnsWidth( true ); + tableVars->setModel( model ); } void UIBuildSettings::updateOS() { diff --git a/src/tools/ecode/uibuildsettings.hpp b/src/tools/ecode/uibuildsettings.hpp index 332297459..21e4eaec0 100644 --- a/src/tools/ecode/uibuildsettings.hpp +++ b/src/tools/ecode/uibuildsettings.hpp @@ -2,8 +2,8 @@ #define EE_UI_UIBUILDSETTINGS_HPP #include "projectbuild.hpp" -#include #include +#include using namespace EE::UI; @@ -11,13 +11,14 @@ namespace ecode { class UIBuildSettings : public UIRelativeLayout { public: - static UIBuildSettings* New( ProjectBuild& build ); + static UIBuildSettings* New( ProjectBuild& build, ProjectBuildConfiguration& config ); protected: ProjectBuild& mBuild; + ProjectBuildConfiguration& mConfig; UIDataBindHolder mDataBindHolder; - explicit UIBuildSettings( ProjectBuild& build ); + explicit UIBuildSettings( ProjectBuild& build, ProjectBuildConfiguration& config ); void updateOS(); };