diff --git a/dlangide.visualdproj b/dlangide.visualdproj index c466b60..883e4fd 100644 --- a/dlangide.visualdproj +++ b/dlangide.visualdproj @@ -224,6 +224,7 @@ + diff --git a/src/dlangide/ui/dsourceedit.d b/src/dlangide/ui/dsourceedit.d index 11de49a..074bad9 100644 --- a/src/dlangide/ui/dsourceedit.d +++ b/src/dlangide/ui/dsourceedit.d @@ -13,6 +13,7 @@ import ddc.lexer.tokenizer; import dlangide.workspace.workspace; import dlangide.workspace.project; import dlangide.ui.commands; +import dlangide.ui.settings; import dlangide.tools.d.dsyntaxhighlighter; import std.algorithm; @@ -41,6 +42,20 @@ class DSourceEdit : SourceEdit { this() { this("SRCEDIT"); } + protected IDESettings _settings; + @property DSourceEdit settings(IDESettings s) { + _settings = s; + return this; + } + @property IDESettings settings() { + return _settings; + } + void applySettings() { + if (!_settings) + return; + tabSize = _settings.tabSize; + useSpacesForTabs = _settings.useSpacesForTabs; + } protected ProjectSourceFile _projectSourceFile; @property ProjectSourceFile projectSourceFile() { return _projectSourceFile; } /// load by filename diff --git a/src/dlangide/ui/frame.d b/src/dlangide/ui/frame.d index e4a0f19..67ea836 100644 --- a/src/dlangide/ui/frame.d +++ b/src/dlangide/ui/frame.d @@ -21,6 +21,7 @@ import dlangide.ui.wspanel; import dlangide.ui.outputpanel; import dlangide.ui.dsourceedit; import dlangide.ui.homescreen; +import dlangide.ui.settings; import dlangide.tools.d.dcdserver; import dlangide.workspace.workspace; import dlangide.workspace.project; @@ -66,6 +67,7 @@ class IDEFrame : AppFrame { TabWidget _tabs; EditorTool _editorTool; DCDServer _dcdServer; + IDESettings _settings; dstring frameWindowCaptionSuffix = "DLangIDE"d; @@ -81,7 +83,10 @@ class IDEFrame : AppFrame { _appName = "dlangide"; _editorTool = new DEditorTool(this); _dcdServer = new DCDServer(); - + _settings = new IDESettings(buildNormalizedPath(settingsDir, "settings.json")); + _settings.load(); + _settings.updateDefaults(); + _settings.save(); super.init(); } @@ -100,6 +105,9 @@ class IDEFrame : AppFrame { return openSourceFile(file.filename, file, activate); } + /// returns global IDE settings + @property IDESettings settings() { return _settings; } + /// bool onCompilerLogIssueClick(dstring filename, int line, int column) { @@ -149,6 +157,7 @@ class IDEFrame : AppFrame { TabItem tab = _tabs.tab(filename); tab.objectParam = file; editor.onModifiedStateChangeListener = &onModifiedStateChange; + editor.settings(settings).applySettings(); _tabs.selectTab(index, true); } else { destroy(editor); diff --git a/src/dlangide/ui/settings.d b/src/dlangide/ui/settings.d new file mode 100644 index 0000000..d554473 --- /dev/null +++ b/src/dlangide/ui/settings.d @@ -0,0 +1,53 @@ +module dlangide.ui.settings; + +import dlangui.core.settings; + +class IDESettings : SettingsFile { + + this(string filename) { + super(filename); + } + + override void updateDefaults() { + Setting ed = editorSettings(); + ed.setBooleanDef("useSpacesForTabs", true); + ed.setIntegerDef("tabSize", 4); + } + + /// override to do something after loading - e.g. set defaults + override void afterLoad() { + } + + @property Setting editorSettings() { + Setting res = _setting.objectByPath("editors/textEditor", true); + return res; + } + + static int limitInt(long value, int minvalue, int maxvalue) { + if (value < minvalue) + return minvalue; + else if (value > maxvalue) + return maxvalue; + return cast(int)value; + } + + /// text editor setting, true if need to insert spaces instead of tabs + @property bool useSpacesForTabs() { + return editorSettings.getBoolean("useSpacesForTabs", true); + } + /// text editor setting, true if need to insert spaces instead of tabs + @property IDESettings useSpacesForTabs(bool v) { + editorSettings.setBoolean("useSpacesForTabs", v); + return this; + } + + /// text editor setting, true if need to insert spaces instead of tabs + @property int tabSize() { + return limitInt(editorSettings.getInteger("tabSize", 4), 1, 16); + } + /// text editor setting, true if need to insert spaces instead of tabs + @property IDESettings tabSize(int v) { + editorSettings.setInteger("tabSize", limitInt(v, 1, 16)); + return this; + } +}