1
Using Code::Blocks / Re: Hiccups while typing (continuation)
« Last post by Pecan on Yesterday at 09:43:47 pm »@ 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.
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.
Code
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.