1 module dlangide.workspace.idesettings;
2 
3 import dlangui.core.settings;
4 import dlangui.core.i18n;
5 import dlangui.graphics.fonts;
6 
7 const AVAILABLE_THEMES = ["ide_theme_default", "ide_theme_dark"];
8 const AVAILABLE_LANGUAGES = ["en", "ru", "es"];
9 
10 class IDESettings : SettingsFile {
11 
12     this(string filename) {
13         super(filename);
14     }
15 
16     override void updateDefaults() {
17         Setting ed = editorSettings();
18         ed.setBooleanDef("useSpacesForTabs", true);
19         ed.setIntegerDef("tabSize", 4);
20         ed.setBooleanDef("smartIndents", true);
21         ed.setBooleanDef("smartIndentsAfterPaste", true);
22         Setting ui = uiSettings();
23         ui.setStringDef("theme", "ide_theme_default");
24         ui.setStringDef("language", "en");
25         ui.setIntegerDef("hintingMode", 1);
26         ui.setIntegerDef("minAntialiasedFontSize", 0);
27         ui.setFloatingDef("fontGamma", 0.8);
28         debuggerSettings.setStringDef("executable", "gdb");
29         terminalSettings.setStringDef("executable", "xterm");
30         dubSettings.setStringDef("executable", "dub");
31         dubSettings.setStringDef("additional_params", "");
32         dmdToolchainSettings.setStringDef("executable", "dmd");
33         ldcToolchainSettings.setStringDef("executable", "ldc2");
34         gdcToolchainSettings.setStringDef("executable", "gdc");
35     }
36 
37     /// override to do something after loading - e.g. set defaults
38     override void afterLoad() {
39     }
40 
41     @property Setting editorSettings() {
42         Setting res = _setting.objectByPath("editors/textEditor", true);
43         return res;
44     }
45 
46     @property Setting uiSettings() {
47         Setting res = _setting.objectByPath("interface", true);
48         return res;
49     }
50 
51     @property Setting debuggerSettings() {
52         Setting res = _setting.objectByPath("dlang/debugger", true);
53         return res;
54     }
55 
56     @property Setting terminalSettings() {
57         Setting res = _setting.objectByPath("dlang/terminal", true);
58         return res;
59     }
60 
61     @property Setting dubSettings() {
62         Setting res = _setting.objectByPath("dlang/dub", true);
63         return res;
64     }
65 
66     @property Setting dmdToolchainSettings() {
67         Setting res = _setting.objectByPath("dlang/toolchains/dmd", true);
68         return res;
69     }
70 
71     @property Setting ldcToolchainSettings() {
72         Setting res = _setting.objectByPath("dlang/toolchains/ldc", true);
73         return res;
74     }
75 
76     @property Setting gdcToolchainSettings() {
77         Setting res = _setting.objectByPath("dlang/toolchains/gdc", true);
78         return res;
79     }
80 
81     /// theme
82     @property string uiTheme() {
83         return limitString(uiSettings.getString("theme", "ide_theme_default"), AVAILABLE_THEMES);
84     }
85     /// theme
86     @property IDESettings uiTheme(string v) {
87         uiSettings.setString("theme", limitString(v, AVAILABLE_THEMES));
88         return this;
89     }
90 
91     /// language
92     @property string uiLanguage() {
93         return limitString(uiSettings.getString("language", "en"), AVAILABLE_LANGUAGES);
94     }
95     /// language
96     @property IDESettings uiLanguage(string v) {
97         uiSettings.setString("language", limitString(v, AVAILABLE_LANGUAGES));
98         return this;
99     }
100 
101     /// text editor setting, true if need to insert spaces instead of tabs
102     @property bool useSpacesForTabs() {
103         return editorSettings.getBoolean("useSpacesForTabs", true);
104     }
105     /// text editor setting, true if need to insert spaces instead of tabs
106     @property IDESettings useSpacesForTabs(bool v) {
107         editorSettings.setBoolean("useSpacesForTabs", v);
108         return this;
109     }
110 
111     /// text editor setting, true if need to insert spaces instead of tabs
112     @property int tabSize() {
113         return limitInt(editorSettings.getInteger("tabSize", 4), 1, 16);
114     }
115     /// text editor setting, true if need to insert spaces instead of tabs
116     @property IDESettings tabSize(int v) {
117         editorSettings.setInteger("tabSize", limitInt(v, 1, 16));
118         return this;
119     }
120 
121     /// true if smart indents are enabled
122     @property bool smartIndents() { return editorSettings.getBoolean("smartIndents", true); }
123     /// set smart indents enabled flag
124     @property IDESettings smartIndents(bool enabled) { editorSettings.setBoolean("smartIndents", enabled); return this; }
125 
126     /// true if smart indents are enabled
127     @property bool smartIndentsAfterPaste() { return editorSettings.getBoolean("smartIndentsAfterPaste", true); }
128     /// set smart indents enabled flag
129     @property IDESettings smartIndentsAfterPaste(bool enabled) { editorSettings.setBoolean("smartIndentsAfterPaste", enabled); return this; }
130 
131     @property double fontGamma() {
132         double gamma = uiSettings.getFloating("fontGamma", 1.0);
133         if (gamma >= 0.5 && gamma <= 2.0)
134             return gamma;
135         return 1.0;
136     }
137 
138     @property HintingMode hintingMode() {
139         long mode = uiSettings.getInteger("hintingMode", HintingMode.Normal);
140         if (mode >= HintingMode.Normal && mode <= HintingMode.Light)
141             return cast(HintingMode)mode;
142         return HintingMode.Normal;
143     }
144 
145     @property int minAntialiasedFontSize() {
146         long sz = uiSettings.getInteger("minAntialiasedFontSize", 0);
147         if (sz >= 0)
148             return cast(int)sz;
149         return 0;
150     }
151 
152     @property string debuggerExecutable() {
153         return debuggerSettings.getString("executable", "gdb");
154     }
155 
156     @property string terminalExecutable() {
157         return terminalSettings.getString("executable", "xterm");
158     }
159 
160     @property string dubExecutable() {
161         return dubSettings.getString("executable", "dub");
162     }
163 
164     @property string dubAdditionalParams() {
165         return dubSettings.getString("additional_params", "");
166     }
167 
168     string getToolchainSettings(string toolchainName) {
169         if (toolchainName.equal("dmd"))
170             return dmdToolchainSettings.getString("executable", "dmd");
171         if (toolchainName.equal("gdc"))
172             return gdcToolchainSettings.getString("executable", "gdc");
173         if (toolchainName.equal("ldc"))
174             return ldcToolchainSettings.getString("executable", "ldc2");
175         return null;
176     }
177 
178 }
179