X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ide%2Fsrc%2Fide.ec;h=815c3b0e7a711d34549eab07d512dfbf3f3acc5f;hb=84e623c3cb902d941ac9967bcf91767bae8f128b;hp=3506c5378574e51ae330b3d30814a6c2dac5f866;hpb=43fced0f80e9345b9d1ef45a64bec714aab51682;p=sdk diff --git a/ide/src/ide.ec b/ide/src/ide.ec index 3506c53..815c3b0 100644 --- a/ide/src/ide.ec +++ b/ide/src/ide.ec @@ -59,6 +59,24 @@ define pathListSep = ";"; define pathListSep = ":"; #endif +IDEConfigHolder ideConfig { }; + +FontResource panelFont { $"Courier New", 10 }; +FontResource codeFont { $"Courier New", 10 }; + +IDESettings ideSettings; + +IDESettingsContainer settingsContainer +{ + dataOwner = &ideSettings; + dataClass = class(IDESettings); + + void onLoadCompilerConfigs() { ide.UpdateCompilerConfigs(true); } + void onLoadRecentFiles() { ide.updateRecentFilesMenu(); } + void onLoadRecentProjects() { ide.updateRecentProjectsMenu(); } + void onLoad() { ide.ApplyColorScheme(colorScheme); ide.ApplyFont(ideSettings.codeEditorFont, ideSettings.codeEditorFontSize); } +}; + define maxPathLen = 65 * MAX_LOCATION; class PathBackup : struct @@ -151,9 +169,6 @@ FileDialog ideProjectFileDialog GlobalSettingsDialog globalSettingsDialog { - ideSettings = ideSettings; - settingsContainer = settingsContainer; - void OnGlobalSettingChange(GlobalSettingsChange globalSettingsChange) { switch(globalSettingsChange) @@ -303,11 +318,11 @@ class IDEToolbar : ToolBar this, toolTip = $"Active Compiler", size = { 160 }, disabled = true; bool NotifySelect(DropBox dropBox, DataRow row, Modifiers mods) { - if(ide.workspace && ide.projectView && row && strcmp(row.string, ide.workspace.compiler)) + if(ide.workspace && ide.projectView && row && strcmp(row.string, ide.workspace.activeCompiler)) { bool silent = ide.projectView.buildInProgress == none ? false : true; - CompilerConfig compiler = ideSettings.GetCompilerConfig(row.string); - ide.workspace.compiler = row.string; + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(row.string); + ide.workspace.activeCompiler = row.string; ide.projectView.ShowOutputBuildLog(!silent); if(!silent) ide.projectView.DisplayCompiler(compiler, false); @@ -328,7 +343,7 @@ class IDEToolbar : ToolBar if(ide.workspace && ide.projectView && row) { bool silent = ide.projectView.buildInProgress == none ? false : true; - CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(ide.workspace.activeCompiler); ide.workspace.bitDepth = (int)row.tag; ide.projectView.ShowOutputBuildLog(!silent); if(!silent) @@ -429,8 +444,115 @@ class IDEWorkSpace : Window BitmapResource bmpTopFrameHalf { ":codeMarks/topFrameHalf.png", window = this }; BitmapResource bmpTopFrameHalfError { ":codeMarks/topFrameHalfError.png", window = this }; + BuildOutputMode rightClickMenuBuildOutputMode; + Debugger debugger { }; + void ApplyFont(const String faceName, float size) + { + panelFont.faceName = faceName; + panelFont.size = size; + + codeFont.faceName = faceName; + codeFont.size = size; + + { + CodeEditor ce; + for(ce = (CodeEditor)firstChild; ce; ce = (CodeEditor)ce.next) + if(ce._class == class(CodeEditor)) + { + ce.font = { codeFont.faceName, codeFont.size, codeFont.bold, codeFont.italic }; + ce.editBox.font = ce.font; + ce.OnPostCreate(); + } + } + + threadsView.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + callStackView.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + outputView.buildBox.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + outputView.debugBox.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + outputView.findBox.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + #ifdef GDB_DEBUG_OUTPUT + outputView.gdbBox.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + #endif +#ifdef GDB_DEBUG_GUI + if(gdbDialog) + { + gdbDialog.tree.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + gdbDialog.output.font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; + } +#endif + } + + void ApplyColorScheme(IDEColorScheme cs) + { + CodeEditor ce; + + colorScheme = cs; + + for(ce = (CodeEditor)firstChild; ce; ce = (CodeEditor)ce.next) + if(ce._class == class(CodeEditor)) + { + EditBox eb = ce.editBox; + ce.background = cs.marginColor; + eb.selectionColor = cs.selectionColor; + eb.selectionText = cs.selectionText; + eb.background = cs.codeEditorBG; + eb.foreground = cs.codeEditorFG; + eb.syntaxColorScheme = cs.syntaxColors; + } + + if(projectView) + { + projectView.fileList.background = cs.projectViewBackground; + projectView.fileList.foreground = cs.projectViewText; + projectView.fileList.selectionColor = cs.selectionColor; + projectView.fileList.selectionText = cs.selectionText; + } + + sheet.properties.background = cs.viewsBackground; + sheet.properties.foreground = cs.viewsText; + sheet.properties.selectionText = cs.sheetSelectionText; + sheet.properties.selectionColor = cs.sheetSelectionColor; + sheet.methods.background = cs.viewsBackground; + sheet.methods.foreground = cs.viewsText; + + threadsView.editBox.background = cs.viewsBackground; + threadsView.editBox.foreground = cs.viewsText; + threadsView.editBox.selectionColor = cs.selectionColor; + threadsView.editBox.selectionText = cs.selectionText; + + callStackView.editBox.background = cs.viewsBackground; + callStackView.editBox.foreground = cs.viewsText; + callStackView.editBox.selectionColor = cs.selectionColor; + callStackView.editBox.selectionText = cs.selectionText; + + watchesView.listBox.background = cs.viewsBackground; + watchesView.listBox.foreground = cs.viewsText; + watchesView.listBox.selectionColor = cs.selectionColor; + watchesView.listBox.selectionText = cs.selectionText; + + breakpointsView.listBox.background = cs.viewsBackground; + breakpointsView.listBox.foreground = cs.viewsText; + breakpointsView.listBox.selectionColor = cs.selectionColor; + breakpointsView.listBox.selectionText = cs.selectionText; + + outputView.buildBox.background = cs.outputBackground; + outputView.buildBox.foreground = cs.outputText; + outputView.buildBox.selectionColor = cs.selectionColor; + outputView.buildBox.selectionText = cs.selectionText; + + outputView.debugBox.background = cs.outputBackground; + outputView.debugBox.foreground = cs.outputText; + outputView.debugBox.selectionColor = cs.selectionColor; + outputView.debugBox.selectionText = cs.selectionText; + + outputView.findBox.background = cs.outputBackground; + outputView.findBox.foreground = cs.outputText; + outputView.findBox.selectionColor = cs.selectionColor; + outputView.findBox.selectionText = cs.selectionText; + } + ProjectView projectView; OutputView outputView @@ -439,16 +561,18 @@ class IDEWorkSpace : Window void OnGotoError(const char * line, bool noParsing) { - CompilerConfig compiler = ide.workspace ? ideSettings.GetCompilerConfig(ide.workspace.compiler) : null; + CompilerConfig compiler = ide.workspace ? ideConfig.compilers.GetCompilerConfig(ide.workspace.activeCompiler) : null; const char * objectFileExt = compiler ? compiler.objectFileExt : objectDefaultFileExt; ide.GoToError(line, noParsing, objectFileExt); + delete compiler; } void OnCodeLocationParseAndGoTo(const char * line) { - CompilerConfig compiler = ide.workspace ? ideSettings.GetCompilerConfig(ide.workspace.compiler) : null; + CompilerConfig compiler = ide.workspace ? ideConfig.compilers.GetCompilerConfig(ide.workspace.activeCompiler) : null; const char * objectFileExt = compiler ? compiler.objectFileExt : objectDefaultFileExt; ide.CodeLocationParseAndGoTo(line, ide.findInFilesDialog.findProject, ide.findInFilesDialog.findDir, objectFileExt); + delete compiler; } bool OnKeyDown(Key key, unichar ch) @@ -479,7 +603,7 @@ class IDEWorkSpace : Window CallStackView callStackView { - parent = this, font = { panelFont.faceName, panelFont.size }; + parent = this, font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; void OnSelectFrame(int frameIndex) { @@ -581,7 +705,7 @@ class IDEWorkSpace : Window WatchesView watchesView { parent = this }; ThreadsView threadsView { - parent = this, font = { panelFont.faceName, panelFont.size }; + parent = this, font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic }; bool OnKeyDown(Key key, unichar ch) { @@ -722,9 +846,12 @@ class IDEWorkSpace : Window fileMenu, $"Global Settings...", g; bool NotifySelect(MenuItem selection, Modifiers mods) { + // Reload configs here until we setup a configs directory monitor + ideConfig.compilers.read(settingsContainer); + globalSettingsDialog.master = this; - if(ide.workspace && ide.workspace.compiler) - globalSettingsDialog.workspaceActiveCompiler = ide.workspace.compiler; + if(ide.workspace && ide.workspace.activeCompiler) + globalSettingsDialog.workspaceActiveCompiler = ide.workspace.activeCompiler; else if(ideSettings.defaultCompiler) globalSettingsDialog.workspaceActiveCompiler = ideSettings.defaultCompiler; globalSettingsDialog.Modal(); @@ -732,8 +859,8 @@ class IDEWorkSpace : Window } }; MenuDivider { fileMenu }; - Menu recentFiles { fileMenu, $"Recent Files", r }; - Menu recentProjects { fileMenu, $"Recent Projects", p }; + Menu recentFilesMenu { fileMenu, $"Recent Files", r }; + Menu recentProjectsMenu { fileMenu, $"Recent Projects", p }; MenuDivider { fileMenu }; MenuItem exitItem { @@ -749,7 +876,8 @@ class IDEWorkSpace : Window bool FileRecentFile(MenuItem selection, Modifiers mods) { int id = 0; - for(file : ideSettings.recentFiles) + RecentPaths recentFiles = workspace ? workspace.recentFiles : ideConfig.recentFiles; + for(file : recentFiles) { if(id == selection.id) { @@ -757,9 +885,9 @@ class IDEWorkSpace : Window char extension[MAX_EXTENSION] = ""; GetExtension(file, extension); isProjectFile = (!strcmpi(extension, "epj") || !strcmpi(extension, "ews")); - if(mods.ctrl) + if(mods.ctrl && !mods.shift) { - char * command = PrintString("ide ", isProjectFile ? "-t " : "", file); + char * command = PrintString("ecere-ide ", isProjectFile ? "-t " : "", file); Execute(command); delete command; } @@ -778,18 +906,18 @@ class IDEWorkSpace : Window bool FileRecentProject(MenuItem selection, Modifiers mods) { int id = 0; - for(file : ideSettings.recentProjects) + for(file : ideConfig.recentWorkspaces) { if(id == selection.id) { - if(mods.ctrl) + if(mods.ctrl && !mods.shift) { - char * command = PrintString("ide ", file); + char * command = PrintString("ecere-ide ", file); Execute(command); delete command; } else - OpenFile(file, false, true, null, no, normal, mods.ctrl && mods.shift); + OpenFile(file, false, true, (mods.ctrl && mods.shift) ? "txt" : null, no, normal, mods.ctrl && mods.shift); break; } id++; @@ -819,9 +947,9 @@ class IDEWorkSpace : Window newProjectDialog.CreateNewProject(); if(projectView) { - ideSettings.AddRecentProject(projectView.fileName); - ide.UpdateRecentMenus(); - settingsContainer.Save(); + ideConfig.recentWorkspaces.addRecent(projectView.fileName); + ideConfig.recentWorkspaces.write(settingsContainer); + ide.updateRecentProjectsMenu(); } } } @@ -1721,6 +1849,7 @@ class IDEWorkSpace : Window ideMainFrame.SetText("%s - %s", project.topNode.name, titleECEREIDE); AdjustMenus(); + updateRecentMenus(); ide.breakpointsView.LoadFromWorkspace(); ide.watchesView.LoadFromWorkspace(); @@ -1752,6 +1881,7 @@ class IDEWorkSpace : Window outputView.visible = false; ideMainFrame.text = titleECEREIDE; ide.AdjustMenus(); + ide.updateRecentMenus(); return true; } return false; @@ -1818,10 +1948,10 @@ class IDEWorkSpace : Window void DocumentSaved(Window document, const char * fileName) { - ideSettings.AddRecentFile(fileName); - ide.UpdateRecentMenus(); + ideConfig.recentFiles.addRecent(fileName); + ideConfig.recentFiles.write(settingsContainer); + ide.updateRecentFilesMenu(); ide.AdjustFileMenus(); - settingsContainer.Save(); } bool Window::OnFileModified(FileChange fileChange, const char * param) @@ -1829,7 +1959,7 @@ class IDEWorkSpace : Window char temp[4096]; sprintf(temp, $"The document %s was modified by another application.\n" "Would you like to reload it and lose your changes?", this.fileName); - if(MessageBox { type = yesNo, master = this/*.parent*/, + if(MessageBox { creationActivation = flash, type = yesNo, master = this/*.parent*/, text = $"Document has been modified", contents = temp }.Modal() == yes) { bool noParsing = (this._class == class(CodeEditor) && ((CodeEditor)this).noParsing) ? true : false; @@ -1857,7 +1987,7 @@ class IDEWorkSpace : Window { if(workspace) { - CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(workspace.activeCompiler); for(prj : workspace.projects) projectView.ProjectUpdateMakefileForAllConfigs(prj); delete compiler; @@ -1870,7 +2000,7 @@ class IDEWorkSpace : Window if(workspace) { bool silent = mute || (ide.projectView.buildInProgress == none ? false : true); - CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(workspace.activeCompiler); if(!silent) { projectView.ShowOutputBuildLog(true); @@ -1885,10 +2015,10 @@ class IDEWorkSpace : Window void UpdateToolBarActiveCompilers() { toolBar.activeCompiler.Clear(); - for(compiler : ideSettings.compilerConfigs) + for(compiler : ideConfig.compilers) { DataRow row = toolBar.activeCompiler.AddString(compiler.name); - if(workspace && workspace.compiler && !strcmp(compiler.name, workspace.compiler)) + if(workspace && workspace.activeCompiler && !strcmp(compiler.name, workspace.activeCompiler)) toolBar.activeCompiler.currentRow = row; } if(!toolBar.activeCompiler.currentRow && toolBar.activeCompiler.firstRow) @@ -2045,6 +2175,7 @@ class IDEWorkSpace : Window { bool unavailable = project && projectView.buildInProgress; bool naForRun = unavailable || !project || project.GetTargetType(project.config) != executable; + BuildOutputMode mode = ide.rightClickMenuBuildOutputMode; projectNewItem.disabled = unavailable; toolBar.buttonNewProject.disabled = unavailable; @@ -2060,7 +2191,7 @@ class IDEWorkSpace : Window toolBar.buttonRun.disabled = naForRun; projectBuildItem.disabled = false; - projectBuildItem.text = unavailable ? $"Stop Build" : $"Build"; + projectBuildItem.text = unavailable ? $"Stop Build" : bldMnuStrBuild[mode]; projectBuildItem.accelerator = unavailable ? Key { pauseBreak, ctrl = true } : f7; projectLinkItem.disabled = unavailable; @@ -2090,27 +2221,28 @@ class IDEWorkSpace : Window if(projectView && projectView.popupMenu && projectView.popupMenu.menu && projectView.popupMenu.created) { MenuItem menu; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectBuild, 0); + BuildOutputMode mode = ide.rightClickMenuBuildOutputMode; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectBuild, mode); if(menu) { menu.disabled = false; - menu.text = unavailable ? $"Stop Build" : $"Build"; + menu.text = unavailable ? $"Stop Build" : bldMnuStrBuild[mode]; menu.accelerator = unavailable ? Key { pauseBreak, ctrl = true } : f7; } - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectLink, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRebuild, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectCleanTarget, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectClean, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRealClean, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRegenerate, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectInstall, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRemove, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::FileClean, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::FileCompile, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugPrecompile, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugCompile, 0); if(menu) menu.disabled = unavailable; - menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugGenerateSymbols, 0); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectLink, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRebuild, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectCleanTarget, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectClean, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRealClean, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRegenerate, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectInstall, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRemove, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::FileClean, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::FileCompile, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugPrecompile, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugCompile, mode); if(menu) menu.disabled = unavailable; + menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugGenerateSymbols, mode); if(menu) menu.disabled = unavailable; projectView.popupMenu.Update(null); } } @@ -2325,7 +2457,7 @@ class IDEWorkSpace : Window ide.projectView.ShowOutputBuildLog(true); { - CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(ide.workspace.activeCompiler); ide.projectView.DisplayCompiler(compiler, false); delete compiler; } @@ -2344,23 +2476,8 @@ class IDEWorkSpace : Window // this crashes on starting ide with epj file, solution please? // app.UpdateDisplay(); + workspace.OpenPreviouslyOpenedFiles(noParsing); workspace.holdTracking = true; - for(ofi : workspace.openedFiles) - { - if(ofi.state != closed) - { - Window file = OpenFile(ofi.path, false, true, null, no, normal, noParsing); - if(file) - { - char fileName[MAX_LOCATION]; - ProjectNode node; - GetLastDirectory(ofi.path, fileName); - node = projectView.project.topNode.Find(fileName, true); - if(node) - node.EnsureVisible(); - } - } - } ide.RepositionWindows(false); workspace.holdTracking = false; @@ -2443,9 +2560,9 @@ class IDEWorkSpace : Window if(prj) { const char * activeConfigName = null; - CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(workspace.activeCompiler); prj.StartMonitoring(); - workspace.projects.Add(prj); + workspace.AddProject(prj, null); if(toolBar.activeConfig.currentRow && toolBar.activeConfig.currentRow != toolBar.activeConfig.firstRow && toolBar.activeConfig.currentRow.string && toolBar.activeConfig.currentRow.string[0]) activeConfigName = toolBar.activeConfig.currentRow.string; @@ -2548,7 +2665,7 @@ class IDEWorkSpace : Window { document.fileName = filePath; if(workspace && !workspace.holdTracking) - workspace.UpdateOpenedFileInfo(filePath, opened); + workspace.UpdateOpenedFileInfo(filePath, opened, true); } } @@ -2568,21 +2685,7 @@ class IDEWorkSpace : Window if(document) { if(projectView && document._class == class(CodeEditor) && workspace) - { - int lineNumber, position; - Point scroll; - CodeEditor editor = (CodeEditor)document; - editor.openedFileInfo = workspace.UpdateOpenedFileInfo(filePath, opened); - editor.openedFileInfo.holdTracking = true; - lineNumber = Max(editor.openedFileInfo.lineNumber - 1, 0); - position = Max(editor.openedFileInfo.position - 1, 0); - if(editor.editBox.GoToLineNum(lineNumber)) - editor.editBox.GoToPosition(editor.editBox.line, lineNumber, position); - scroll.x = Max(editor.openedFileInfo.scroll.x, 0); - scroll.y = Max(editor.openedFileInfo.scroll.y, 0); - editor.editBox.scroll = scroll; - editor.openedFileInfo.holdTracking = false; - } + workspace.RestorePreviouslyOpenedFileState((CodeEditor)document); if(needFileModified) document.OnFileModified = OnFileModified; @@ -2591,13 +2694,20 @@ class IDEWorkSpace : Window document.state = maximized; if(isProject) - ideSettings.AddRecentProject(document.fileName); + { + ideConfig.recentWorkspaces.addRecent(document.fileName); + ideConfig.recentWorkspaces.write(settingsContainer); + ide.updateRecentProjectsMenu(); + } + else if(workspace) + workspace.recentFiles.addRecent(document.fileName); else - ideSettings.AddRecentFile(document.fileName); - ide.UpdateRecentMenus(); + { + ideConfig.recentFiles.addRecent(document.fileName); + ideConfig.recentFiles.write(settingsContainer); + } + ide.updateRecentFilesMenu(); ide.AdjustFileMenus(); - settingsContainer.Save(); - return document; } else @@ -2608,19 +2718,19 @@ class IDEWorkSpace : Window /*bool Window::GenericDocumentOnClose(bool parentClosing) { if(!parentClosing && ide.workspace) - ide.workspace.UpdateOpenedFileInfo(fileName, unknown); + ide.workspace.UpdateOpenedFileInfo(fileName, unknown, false); return true; }*/ bool ModelView::ModelViewOnClose(bool parentClosing) { if(!parentClosing && ide.workspace) - ide.workspace.UpdateOpenedFileInfo(fileName, unknown); + ide.workspace.UpdateOpenedFileInfo(fileName, unknown, false); return true; } bool PictureEdit::PictureEditOnClose(bool parentClosing) { if(!parentClosing && ide.workspace) - ide.workspace.UpdateOpenedFileInfo(fileName, unknown); + ide.workspace.UpdateOpenedFileInfo(fileName, unknown, false); return true; } @@ -2769,7 +2879,7 @@ class IDEWorkSpace : Window //line = atoi(colon+1); } // support for "Found n match(es) in "file/path"; - else if(path[len-1] == '\"' && strstr(path, $"Found %d match%s in \"%s\"%s\n\n"."Found") && strstr(path, $"match") && strstr(path, $"in") && (s = strstr(path, "\"")) && s != path+len-1) + else if(len > 0 && path[len-1] == '\"' && strstr(path, $"Found %d match%s in \"%s\"%s\n\n"."Found") && strstr(path, $"match") && strstr(path, $"in") && (s = strstr(path, "\"")) && s != path+len-1) { path = s+1; } @@ -3072,7 +3182,7 @@ class IDEWorkSpace : Window { List nodes { }; nodes.Add(node); - projectView.Compile(node.project, nodes, false, false, isCObject ? cObject : normal); + projectView.Compile(node.project, nodes, normal, isCObject ? cObject : normal); delete nodes; } } @@ -3191,9 +3301,9 @@ class IDEWorkSpace : Window newProjectDialog.Modal(); if(projectView) { - ideSettings.AddRecentProject(projectView.fileName); - ide.UpdateRecentMenus(); - settingsContainer.Save(); + ideConfig.recentWorkspaces.addRecent(projectView.fileName); + ideConfig.recentWorkspaces.write(settingsContainer); + ide.updateRecentMenus(); } delete newProjectDialog; // Open only one project @@ -3484,38 +3594,46 @@ class IDEWorkSpace : Window return true; } - void UpdateRecentMenus() + void updateRecentMenus() { - int c; - Menu fileMenu = menu.FindMenu($"File"); - Menu recentFiles = fileMenu.FindMenu($"Recent Files"); - Menu recentProjects = fileMenu.FindMenu($"Recent Projects"); + updateRecentFilesMenu(); + updateRecentProjectsMenu(); + } + + void updateRecentFilesMenu() + { + int c = 0; char * itemPath = new char[MAX_LOCATION]; char * itemName = new char[MAX_LOCATION+4]; - - recentFiles.Clear(); - c = 0; - - for(recent : ideSettings.recentFiles) + Workspace ws = workspace; + RecentPaths recentFiles = ws ? ws.recentFiles : ideConfig.recentFiles; + recentFilesMenu.Clear(); + for(recent : recentFiles) { strncpy(itemPath, recent, MAX_LOCATION); itemPath[MAX_LOCATION-1] = '\0'; MakeSystemPath(itemPath); snprintf(itemName, MAX_LOCATION+4, "%d %s", 1 + c, itemPath); itemName[MAX_LOCATION+4-1] = '\0'; - recentFiles.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentFile }, ide, true); + recentFilesMenu.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentFile }, ide, true); c++; } + delete itemPath; + delete itemName; + } - recentProjects.Clear(); - c = 0; - for(recent : ideSettings.recentProjects) + void updateRecentProjectsMenu() + { + int c = 0; + char * itemPath = new char[MAX_LOCATION]; + char * itemName = new char[MAX_LOCATION+4]; + recentProjectsMenu.Clear(); + for(recent : ideConfig.recentWorkspaces) { strncpy(itemPath, recent, MAX_LOCATION); itemPath[MAX_LOCATION-1] = '\0'; MakeSystemPath(itemPath); snprintf(itemName, MAX_LOCATION+4, "%d %s", 1 + c, itemPath); itemName[MAX_LOCATION+4-1] = '\0'; - recentProjects.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentProject }, ide, true); + recentProjectsMenu.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentProject }, ide, true); c++; } - delete itemPath; delete itemName; } @@ -3680,6 +3798,13 @@ class IDEApp : GuiApplication } } + ide.ApplyFont(ideSettings.codeEditorFont, ideSettings.codeEditorFontSize); + ide.ApplyColorScheme(colorScheme); + + ideConfig.compilers.read(settingsContainer); + ideConfig.recentFiles.read(settingsContainer); + ideConfig.recentWorkspaces.read(settingsContainer); + // First count files arg to decide whether to maximize { bool passThrough = false, debugWorkDir = false;