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