@ ollydbg
Please evaluate this patch.
I've tested it with single and mult-project workspaces, Single file workspace and empty ones as well.
I think I've followed your outline (previous msg) to guard against stowing any stale global status while always allowing ClassBrowser status to be updated.
Index: ccoptionsdlg.cpp
===================================================================
--- ccoptionsdlg.cpp (revision 13610)
+++ ccoptionsdlg.cpp (working copy)
@@ -183,6 +183,12 @@
void CCOptionsDlg::OnApply()
{
+ cbProject* pProject = Manager::Get()->GetProjectManager()->GetActiveProject();
+ // Remember the project that changed the .conf data //(ph 2025/02/04)
+ m_ParseManager->SetOptsChangedByProject(pProject);
+ // Renember the Parser that changed the .conf data //(ph 2025/02/04)
+ m_ParseManager->SetOptsChangedByParser(&(m_ParseManager->GetParser())); //(ph 2025/02/07)
+
ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
// -----------------------------------------------------------------------
Index: parsemanager.h
===================================================================
--- parsemanager.h (revision 13610)
+++ parsemanager.h (working copy)
@@ -9,8 +9,8 @@
#include "parsemanager_base.h"
#include "parser/parser.h"
-#include <queue>
-#include <map>
+//unused #include <queue>
+// unused #include <map>
#include <memory>
#include <unordered_map>
@@ -258,6 +258,14 @@
void SetSymbolsWindowHasFocus(bool trueOrFalse){ m_SymbolsWindowHasFocus = trueOrFalse;}
bool GetSymbolsWindowHasFocus(){return m_SymbolsWindowHasFocus;}
+ // Set or return Project that changed "Global setting" in workspace
+ cbProject* GetOptsChangedByProject(){ return m_pOptsChangedProject;}
+ void SetOptsChangedByProject(cbProject* pProject){m_pOptsChangedProject = pProject;}
+ // Set or return Parser that changed "Global setting" in Single File workspace
+ ParserBase* GetTempParser(){return m_TempParser;}
+ ParserBase* GetOptsChangedByParser(){ return m_pOptsChangedParser;}
+ void SetOptsChangedByParser(ParserBase* pParserBase){m_pOptsChangedParser = &(GetParser());}
+
protected:
/** When a Parser is created, we need a full parsing stage including:
* 1, parse the priority header files firstly.
@@ -474,11 +482,12 @@
*/
bool RemoveProjectFromParser(cbProject* project);
+
private:
typedef std::pair<cbProject*, ParserBase*> ProjectParserPair;
typedef std::list<ProjectParserPair> ParserList;
- /** a list holing all the cbp->parser pairs, if in one parser per project mode, there are many
+ /** a list holding all the cbp->parser pairs, if in one parser per project mode, there are many
* many pairs in this list. In one parser per workspace mode, there is only one pair, and the
* m_ParserList.begin()->second is the common parser for all the projects in workspace.
*/
@@ -527,6 +536,11 @@
bool m_ClassBrowserViewIsStale = true;
bool m_SymbolsWindowHasFocus = false;
+ //The latest project to change the .conf file //(ph 2025/02/04)
+ cbProject* m_pOptsChangedProject = nullptr;
+ //The latest parser to change the .conf file //(ph 2025/02/04)
+ ParserBase* m_pOptsChangedParser = nullptr;
+
};
#endif // PARSEMANAGER_H
Index: parser/parser.cpp
===================================================================
--- parser/parser.cpp (revision 13610)
+++ parser/parser.cpp (working copy)
@@ -32,9 +32,10 @@
#include "parser.h"
#include "parserthreadedtask.h"
+#include "../parsemanager.h" //(ph 2025/02/04)
#include "../classbrowser.h"
-#include "../classbrowserbuilderthread.h"
+//unused - #include "../classbrowserbuilderthread.h"
#ifndef CB_PRECOMP
@@ -921,19 +922,59 @@
void Parser::WriteOptions()
{
+ //(ph 2025/02/06)
+ // Assemble status to determine if a Parser or Project changed a global setting.
+ ProjectManager* pPrjMgr = Manager::Get()->GetProjectManager();
+ cbProject* pActiveProject = pPrjMgr->GetActiveProject();
+ ParseManager* pParseMgr = (ParseManager*)m_Parent;
+ ParserBase* pParser = &(pParseMgr->GetParser());
+ ParserBase* pTempParser = pParseMgr->GetTempParser();
+ cbProject* pOptsChangerProject = pParseMgr->GetOptsChangedByProject();
+
+ int projectsCount = pPrjMgr->GetProjects()->size();
+ bool isTempParser = (pParser == pTempParser);
+ bool globalOptionChanged = pParseMgr->GetOptsChangedByParser() or pParseMgr->GetOptsChangedByProject();
+
ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
- // Page "Code Completion"
- cfg->Write(_T("/use_SmartSense"), m_Options.useSmartSense);
- cfg->Write(_T("/while_typing"), m_Options.whileTyping);
+ // **Debugging** use this global to verify logic
+ // bool parseWhileTypingStatus = m_Options.whileTyping;
- // Page "C / C++ parser"
- cfg->Write(_T("/parser_follow_local_includes"), m_Options.followLocalIncludes);
- cfg->Write(_T("/parser_follow_global_includes"), m_Options.followGlobalIncludes);
- cfg->Write(_T("/want_preprocessor"), m_Options.wantPreprocessor);
- cfg->Write(_T("/parse_complex_macros"), m_Options.parseComplexMacros);
- cfg->Write(_T("/platform_check"), m_Options.platformCheck);
+ // Do not allow stale parser settings to change the global settings
+ bool allowGlobalUpdate = false;
+ if ( (projectsCount == 0) and globalOptionChanged)
+ allowGlobalUpdate = true; //Single file settings changes
+ if (projectsCount and (pOptsChangerProject == pActiveProject) )
+ allowGlobalUpdate = true; // changes made by a project
+ if ( (projectsCount==0) and isTempParser and globalOptionChanged)
+ allowGlobalUpdate = false; // TempParser has stale settings on Close()
+ if (not globalOptionChanged)
+ allowGlobalUpdate = false; // no global settings have changed
+ if (allowGlobalUpdate)
+ {
+ // Page "Code Completion"
+ cfg->Write(_T("/use_SmartSense"), m_Options.useSmartSense);
+ cfg->Write(_T("/while_typing"), m_Options.whileTyping);
+
+ // Page "C / C++ parser"
+ cfg->Write(_T("/parser_follow_local_includes"), m_Options.followLocalIncludes);
+ cfg->Write(_T("/parser_follow_global_includes"), m_Options.followGlobalIncludes);
+ cfg->Write(_T("/want_preprocessor"), m_Options.wantPreprocessor);
+ cfg->Write(_T("/parse_complex_macros"), m_Options.parseComplexMacros);
+ cfg->Write(_T("/platform_check"), m_Options.platformCheck);
+ }
+ if ((projectsCount == 0) and isTempParser and globalOptionChanged)
+ {
+ // When no projects exists but the CB main settings have been changed,
+ // force the TempParser to reread settings/options else stale ones
+ // will be displayed on the next use of MenuBar/Settings/Editor/CodeCompletion dialog
+ ReadOptions();
+ // The global settings changed status can now be reset
+ pParseMgr->SetOptsChangedByParser(nullptr);
+ pParseMgr->SetOptsChangedByProject(nullptr);
+ }
+
// Page "Symbol browser"
cfg->Write(_T("/browser_show_inheritance"), m_BrowserOptions.showInheritance);
cfg->Write(_T("/browser_expand_ns"), m_BrowserOptions.expandNS);
Index: resources/manifest.xml
===================================================================
--- resources/manifest.xml (revision 13610)
+++ resources/manifest.xml (working copy)
@@ -3,7 +3,7 @@
<SdkVersion major="1" minor="10" release="0" />
<Plugin name="CodeCompletion">
<Value title="Code completion" />
- <Value version="1.0.5 24/01/29" />
+ <Value version="1.0.6 25/02/7" />
<Value description="This plugin provides a symbols browser for your projects and code-completion inside the editor.