1 module dlangide.workspace.idesettings; 2 3 import dlangui.core.settings; 4 import dlangui.core.i18n; 5 import dlangui.graphics.fonts; 6 7 import std.algorithm : equal; 8 9 const AVAILABLE_THEMES = ["ide_theme_default", "ide_theme_dark"]; 10 const AVAILABLE_LANGUAGES = ["en", "ru", "es", "cs"]; 11 12 class IDESettings : SettingsFile { 13 14 this(string filename) { 15 super(filename); 16 } 17 18 override void updateDefaults() { 19 Setting ed = editorSettings(); 20 ed.setBooleanDef("useSpacesForTabs", true); 21 ed.setIntegerDef("tabSize", 4); 22 ed.setBooleanDef("smartIndents", true); 23 ed.setBooleanDef("smartIndentsAfterPaste", true); 24 ed.setBooleanDef("showWhiteSpaceMarks", true); 25 ed.setBooleanDef("showTabPositionMarks", true); 26 Setting ui = uiSettings(); 27 ui.setStringDef("theme", "ide_theme_default"); 28 ui.setStringDef("language", "en"); 29 ui.setIntegerDef("hintingMode", 1); 30 ui.setIntegerDef("minAntialiasedFontSize", 0); 31 ui.setFloatingDef("fontGamma", 0.8); 32 version (Windows) { 33 debuggerSettings.setStringDef("executable", "mago-mi"); 34 } else { 35 debuggerSettings.setStringDef("executable", "gdb"); 36 } 37 terminalSettings.setStringDef("executable", "xterm"); 38 dubSettings.setStringDef("executable", "dub"); 39 dubSettings.setStringDef("additional_params", ""); 40 rdmdSettings.setStringDef("executable", "rdmd"); 41 rdmdSettings.setStringDef("additional_params", ""); 42 dmdToolchainSettings.setStringDef("executable", "dmd"); 43 dmdToolchainSettings.setStringDef("dub_additional_params", ""); 44 ldcToolchainSettings.setStringDef("executable", "ldc2"); 45 ldcToolchainSettings.setStringDef("dub_additional_params", ""); 46 ldmdToolchainSettings.setStringDef("executable", "ldmd2"); 47 ldmdToolchainSettings.setStringDef("dub_additional_params", ""); 48 gdcToolchainSettings.setStringDef("executable", "gdc"); 49 gdcToolchainSettings.setStringDef("dub_additional_params", ""); 50 } 51 52 /// override to do something after loading - e.g. set defaults 53 override void afterLoad() { 54 } 55 56 @property Setting editorSettings() { 57 Setting res = _setting.objectByPath("editors/textEditor", true); 58 return res; 59 } 60 61 @property Setting uiSettings() { 62 Setting res = _setting.objectByPath("interface", true); 63 return res; 64 } 65 66 @property Setting debuggerSettings() { 67 Setting res = _setting.objectByPath("dlang/debugger", true); 68 return res; 69 } 70 71 @property Setting terminalSettings() { 72 Setting res = _setting.objectByPath("dlang/terminal", true); 73 return res; 74 } 75 76 @property Setting dubSettings() { 77 Setting res = _setting.objectByPath("dlang/dub", true); 78 return res; 79 } 80 81 @property Setting rdmdSettings() { 82 Setting res = _setting.objectByPath("dlang/rdmd", true); 83 return res; 84 } 85 86 @property Setting dmdToolchainSettings() { 87 Setting res = _setting.objectByPath("dlang/toolchains/dmd", true); 88 return res; 89 } 90 91 @property Setting ldcToolchainSettings() { 92 Setting res = _setting.objectByPath("dlang/toolchains/ldc", true); 93 return res; 94 } 95 96 @property Setting ldmdToolchainSettings() { 97 Setting res = _setting.objectByPath("dlang/toolchains/ldmd", true); 98 return res; 99 } 100 101 @property Setting gdcToolchainSettings() { 102 Setting res = _setting.objectByPath("dlang/toolchains/gdc", true); 103 return res; 104 } 105 106 /// theme 107 @property string uiTheme() { 108 return limitString(uiSettings.getString("theme", "ide_theme_default"), AVAILABLE_THEMES); 109 } 110 /// theme 111 @property IDESettings uiTheme(string v) { 112 uiSettings.setString("theme", limitString(v, AVAILABLE_THEMES)); 113 return this; 114 } 115 116 /// language 117 @property string uiLanguage() { 118 return limitString(uiSettings.getString("language", "en"), AVAILABLE_LANGUAGES); 119 } 120 /// language 121 @property IDESettings uiLanguage(string v) { 122 uiSettings.setString("language", limitString(v, AVAILABLE_LANGUAGES)); 123 return this; 124 } 125 126 /// text editor setting, true if need to insert spaces instead of tabs 127 @property bool useSpacesForTabs() { 128 return editorSettings.getBoolean("useSpacesForTabs", true); 129 } 130 /// text editor setting, true if need to insert spaces instead of tabs 131 @property IDESettings useSpacesForTabs(bool v) { 132 editorSettings.setBoolean("useSpacesForTabs", v); 133 return this; 134 } 135 136 /// text editor setting, true if need to insert spaces instead of tabs 137 @property int tabSize() { 138 return limitInt(editorSettings.getInteger("tabSize", 4), 1, 16); 139 } 140 /// text editor setting, true if need to insert spaces instead of tabs 141 @property IDESettings tabSize(int v) { 142 editorSettings.setInteger("tabSize", limitInt(v, 1, 16)); 143 return this; 144 } 145 146 /// true if smart indents are enabled 147 @property bool smartIndents() { return editorSettings.getBoolean("smartIndents", true); } 148 /// set smart indents enabled flag 149 @property IDESettings smartIndents(bool enabled) { editorSettings.setBoolean("smartIndents", enabled); return this; } 150 151 /// true if white space marks are enabled 152 @property bool showWhiteSpaceMarks() { return editorSettings.getBoolean("showWhiteSpaceMarks", true); } 153 /// set white space marks enabled flag 154 @property IDESettings showWhiteSpaceMarks(bool enabled) { editorSettings.setBoolean("showWhiteSpaceMarks", enabled); return this; } 155 156 /// true if tab position marks are enabled 157 @property bool showTabPositionMarks() { return editorSettings.getBoolean("showTabPositionMarks", true); } 158 /// set tab position marks enabled flag 159 @property IDESettings showTabPositionMarks(bool enabled) { editorSettings.setBoolean("showTabPositionMarks", enabled); return this; } 160 161 162 163 /// true if smart indents are enabled 164 @property bool smartIndentsAfterPaste() { return editorSettings.getBoolean("smartIndentsAfterPaste", true); } 165 /// set smart indents enabled flag 166 @property IDESettings smartIndentsAfterPaste(bool enabled) { editorSettings.setBoolean("smartIndentsAfterPaste", enabled); return this; } 167 168 @property double fontGamma() { 169 double gamma = uiSettings.getFloating("fontGamma", 1.0); 170 if (gamma >= 0.5 && gamma <= 2.0) 171 return gamma; 172 return 1.0; 173 } 174 175 @property HintingMode hintingMode() { 176 long mode = uiSettings.getInteger("hintingMode", HintingMode.Normal); 177 if (mode >= HintingMode.Normal && mode <= HintingMode.Light) 178 return cast(HintingMode)mode; 179 return HintingMode.Normal; 180 } 181 182 @property int minAntialiasedFontSize() { 183 long sz = uiSettings.getInteger("minAntialiasedFontSize", 0); 184 if (sz >= 0) 185 return cast(int)sz; 186 return 0; 187 } 188 189 @property string debuggerExecutable() { 190 version (Windows) { 191 return debuggerSettings.getString("executable", "mago-mi"); 192 } else { 193 return debuggerSettings.getString("executable", "gdb"); 194 } 195 } 196 197 @property string terminalExecutable() { 198 return terminalSettings.getString("executable", "xterm"); 199 } 200 201 @property string dubExecutable() { 202 return dubSettings.getString("executable", "dub"); 203 } 204 205 @property string dubAdditionalParams() { 206 return dubSettings.getString("additional_params", ""); 207 } 208 209 @property string rdmdExecutable() { 210 return rdmdSettings.getString("executable", "rdmd"); 211 } 212 213 @property string rdmdAdditionalParams() { 214 return rdmdSettings.getString("additional_params", ""); 215 } 216 217 string getToolchainCompilerExecutable(string toolchainName) { 218 if (toolchainName.equal("dmd")) 219 return dmdToolchainSettings.getString("executable", "dmd"); 220 if (toolchainName.equal("gdc")) 221 return gdcToolchainSettings.getString("executable", "gdc"); 222 if (toolchainName.equal("ldc")) 223 return ldcToolchainSettings.getString("executable", "ldc2"); 224 if (toolchainName.equal("ldmd")) 225 return ldmdToolchainSettings.getString("executable", "ldmd2"); 226 return null; 227 } 228 229 string getToolchainAdditionalDubParams(string toolchainName) { 230 if (toolchainName.equal("dmd")) 231 return dmdToolchainSettings.getString("dub_additional_params", ""); 232 if (toolchainName.equal("gdc")) 233 return gdcToolchainSettings.getString("dub_additional_params", ""); 234 if (toolchainName.equal("ldc")) 235 return ldcToolchainSettings.getString("dub_additional_params", ""); 236 if (toolchainName.equal("ldmd")) 237 return ldmdToolchainSettings.getString("dub_additional_params", ""); 238 return null; 239 } 240 241 @property string[] recentWorkspaces() { 242 import std.file; 243 Setting obj = _setting.objectByPath("history", true); 244 string[] list = obj.getStringArray("recentWorkspaces"); 245 string[] res; 246 foreach(fn; list) { 247 if (exists(fn) && isFile(fn)) 248 res ~= fn; 249 } 250 return res; 251 } 252 253 void updateRecentWorkspace(string ws) { 254 import std.file; 255 string[] list; 256 list ~= ws; 257 string[] existing = recentWorkspaces; 258 foreach(fn; existing) { 259 if (exists(fn) && isFile(fn) && !ws.equal(fn)) 260 list ~= fn; 261 } 262 Setting obj = _setting.objectByPath("history", true); 263 obj["recentWorkspaces"] = list; 264 save(); 265 } 266 267 } 268