From 953b0ecb034800ecf916293ab234641d8b8ce12b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Tue, 11 Aug 2026 20:01:36 -0300 Subject: [PATCH] Remember Project Tree View "Show Hidden Files" state between sessions. --- src/tools/ecode/appconfig.cpp | 9 +++++++-- src/tools/ecode/appconfig.hpp | 4 ++-- src/tools/ecode/ecode.cpp | 10 ++++++---- src/tools/ecode/ecode.hpp | 1 + 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/tools/ecode/appconfig.cpp b/src/tools/ecode/appconfig.cpp index b25caccd4..302141ea7 100644 --- a/src/tools/ecode/appconfig.cpp +++ b/src/tools/ecode/appconfig.cpp @@ -590,7 +590,8 @@ json AppConfig::saveNode( Node* node ) { void AppConfig::saveProject( std::string projectFolder, UICodeEditorSplitter* editorSplitter, const std::string& configPath, const ProjectConfig& docConfig, const ProjectBuildConfiguration& buildConfig, bool onlyIfNeeded, - bool sessionSnapshot, PluginManager* pluginManager ) { + bool sessionSnapshot, bool showHiddenFiles, + PluginManager* pluginManager ) { FileSystem::dirAddSlashAtEnd( projectFolder ); std::string projectsPath( configPath + "projects" + FileSystem::getOSSlash() ); if ( !FileSystem::fileExists( projectsPath ) ) @@ -599,6 +600,7 @@ void AppConfig::saveProject( std::string projectFolder, UICodeEditorSplitter* ed std::string projectCfgPath( projectsPath + hash.toHexString() + ".cfg" ); IniFile cfg( projectCfgPath, false ); cfg.setValue( "path", "folder_path", projectFolder ); + cfg.setValueB( "project_tree", "show_hidden_files", showHiddenFiles ); cfg.setValueB( "document", "use_global_settings", docConfig.useGlobalSettings ); cfg.setValue( "document", "h_ext_language_type", HExtLanguageTypeHelper::toString( docConfig.hExtLanguageType ) ); @@ -873,14 +875,17 @@ void AppConfig::loadDocuments( UICodeEditorSplitter* editorSplitter, json j, void AppConfig::loadProject( std::string projectFolder, UICodeEditorSplitter* editorSplitter, const std::string& configPath, ProjectConfig& docConfig, - ecode::App* app, bool sessionSnapshot, PluginManager* pluginManager ) { + ecode::App* app, bool sessionSnapshot, bool& showHiddenFiles, + PluginManager* pluginManager ) { FileSystem::dirAddSlashAtEnd( projectFolder ); std::string projectsPath( configPath + "projects" + FileSystem::getOSSlash() ); MD5::Result hash = MD5::fromString( projectFolder ); std::string projectCfgPath( projectsPath + hash.toHexString() + ".cfg" ); + showHiddenFiles = false; if ( !FileSystem::fileExists( projectCfgPath ) ) return; IniFile cfg( projectCfgPath ); + showHiddenFiles = cfg.getValueB( "project_tree", "show_hidden_files", false ); docConfig.useGlobalSettings = cfg.getValueB( "document", "use_global_settings", true ); diff --git a/src/tools/ecode/appconfig.hpp b/src/tools/ecode/appconfig.hpp index 0cba80b72..ce5abdf75 100644 --- a/src/tools/ecode/appconfig.hpp +++ b/src/tools/ecode/appconfig.hpp @@ -333,11 +333,11 @@ class AppConfig { void saveProject( std::string projectFolder, UICodeEditorSplitter* editorSplitter, const std::string& configPath, const ProjectConfig& docConfig, const ProjectBuildConfiguration& buildConfig, bool onlyIfNeeded, - bool sessionSnapshot, PluginManager* ); + bool sessionSnapshot, bool showHiddenFiles, PluginManager* ); void loadProject( std::string projectFolder, UICodeEditorSplitter* editorSplitter, const std::string& configPath, ProjectConfig& docConfig, ecode::App* app, - bool sessionSnapshot, PluginManager* pluginManager ); + bool sessionSnapshot, bool& showHiddenFiles, PluginManager* pluginManager ); void addTabWidgetType( const std::string& type, TabWidgetCbs tabWidget ) { Lock l( tabWidgetTypesMutex ); diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 030733c88..b47609340 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -2260,7 +2260,7 @@ void App::saveProject( bool onlyIfNeeded, bool sessionSnapshotEnabled ) { mCurrentProject, mSplitter, mConfigPath, mProjectDocConfig, mProjectBuildManager ? mProjectBuildManager->getConfig() : ProjectBuildConfiguration(), onlyIfNeeded, sessionSnapshotEnabled && mConfig.workspace.sessionSnapshot, - mPluginManager.get() ); + mShowHiddenFiles, mPluginManager.get() ); } } @@ -3685,11 +3685,12 @@ void App::openAllFilesInFolder( const FileInfo& folder ) { } void App::toggleHiddenFiles() { + mShowHiddenFiles = !mShowHiddenFiles; mFileSystemModel = FileSystemModel::New( mFileSystemModel->getRootPath(), FileSystemModel::Mode::FilesAndDirectories, { true, true, - !mFileSystemModel->getDisplayConfig().ignoreHidden, + !mShowHiddenFiles, {}, [this]( const std::string& filePath ) -> bool { return isFileVisibleInTreeView( filePath ); @@ -4223,7 +4224,8 @@ void App::loadFolder( std::string path, bool forceNewWindow ) { mProjectBuildManager = std::make_unique( rpath, mThreadPool, mSidePanel, this ); mConfig.loadProject( rpath, mSplitter, mConfigPath, mProjectDocConfig, this, - mConfig.workspace.sessionSnapshot, mPluginManager.get() ); + mConfig.workspace.sessionSnapshot, mShowHiddenFiles, + mPluginManager.get() ); Log::info( "Load project took: %.2f ms", projClock.getElapsedTime().asMilliseconds() ); loadFileSystemMatcher( rpath ); @@ -4231,7 +4233,7 @@ void App::loadFolder( std::string path, bool forceNewWindow ) { mFileSystemModel = FileSystemModel::New( rpath, FileSystemModel::Mode::FilesAndDirectories, { true, true, - true, + !mShowHiddenFiles, {}, [this]( const std::string& filePath ) -> bool { return isFileVisibleInTreeView( filePath ); diff --git a/src/tools/ecode/ecode.hpp b/src/tools/ecode/ecode.hpp index 6db3695d7..51282e289 100644 --- a/src/tools/ecode/ecode.hpp +++ b/src/tools/ecode/ecode.hpp @@ -728,6 +728,7 @@ class App : public UICodeEditorSplitter::Client, public PluginContextProvider { std::shared_ptr mFileSystemMatcher; size_t mMenuIconSize{ 16 }; bool mDirTreeReady{ false }; + bool mShowHiddenFiles{ false }; bool mUseFrameBuffer{ false }; bool mBenchmarkMode{ false }; bool mDisablePlugins{ false };