1 module dlangide.ui.settings;
2 
3 import dlangui.core.settings;
4 import dlangui.core.i18n;
5 import dlangui.graphics.fonts;
6 import dlangui.widgets.lists;
7 import dlangui.dialogs.settingsdialog;
8 
9 public import dlangide.workspace.projectsettings;
10 public import dlangide.workspace.idesettings;
11 public import dlangide.workspace.workspacesettings;
12 
13 StringListValue[] createFaceList(bool monospaceFirst) {
14     StringListValue[] faces;
15     faces.assumeSafeAppend();
16     faces ~= StringListValue("Default", UIString.fromId("OPTION_DEFAULT"c));
17     import dlangui.graphics.fonts;
18     import std.utf : toUTF32;
19     FontFaceProps[] allFaces = FontManager.instance.getFaces();
20     import std.algorithm.sorting : sort;
21     auto fontCompMonospaceFirst = function(ref FontFaceProps a, ref FontFaceProps b) {
22         if (a.family == FontFamily.MonoSpace && b.family != FontFamily.MonoSpace)
23             return -1;
24         if (a.family != FontFamily.MonoSpace && b.family == FontFamily.MonoSpace)
25             return 1;
26         if (a.face < b.face)
27             return -1;
28         if (a.face > b.face)
29             return 1;
30         return 0;
31     };
32     auto fontComp = function(ref FontFaceProps a, ref FontFaceProps b) {
33         if (a.face < b.face)
34             return -1;
35         if (a.face > b.face)
36             return 1;
37         return 0;
38     };
39     //auto sorted = allFaces.sort!((a, b) => (a.family == FontFamily.MonoSpace && b.family != FontFamily.MonoSpace) || (a.face < b.face));
40     auto sorted = sort!((a, b) => (monospaceFirst ? fontCompMonospaceFirst(a, b) : fontComp(a, b)) < 0)(allFaces);
41 
42     //allFaces = allFaces.sort!((a, b) => a.family == FontFamily.MonoSpace && b.family == FontFamily.MonoSpace || a.face < b.face);
43     //for (int i = 0; i < allFaces.length; i++) {
44     foreach (face; sorted) {
45         if (face.family == FontFamily.MonoSpace)
46             faces ~= StringListValue(face.face, "*"d ~ toUTF32(face.face));
47         else
48             faces ~= StringListValue(face.face, toUTF32(face.face));
49     }
50     return faces;
51 }
52 
53 StringListValue[] createIntValueList(int[] values, dstring suffix = ""d) {
54     import std.conv : to;
55     StringListValue[] res;
56     res.assumeSafeAppend();
57     foreach(n; values) {
58         res ~= StringListValue(n, to!dstring(n) ~ suffix);
59     }
60     return res;
61 }
62 
63 /// create DlangIDE settings pages tree
64 SettingsPage createSettingsPages() {
65     import std.conv : to;
66     // Root page
67     SettingsPage res = new SettingsPage("", UIString.fromRaw(""d));
68 
69     // UI settings page
70     SettingsPage ui = res.addChild("interface", UIString.fromId("OPTION_INTERFACE"c));
71     ui.addStringComboBox("interface/theme", UIString.fromId("OPTION_THEME"c), [
72             StringListValue("ide_theme_default", "OPTION_DEFAULT"c), 
73             StringListValue("ide_theme_dark", "OPTION_DARK"c)]);
74     ui.addStringComboBox("interface/language", UIString.fromId("OPTION_LANGUAGE"c), [
75             StringListValue("en", "MENU_VIEW_LANGUAGE_EN"c), 
76             StringListValue("ru", "MENU_VIEW_LANGUAGE_RU"c), 
77             StringListValue("es", "MENU_VIEW_LANGUAGE_ES"c),
78             StringListValue("de", "MENU_VIEW_LANGUAGE_DE"c),
79 	    StringListValue("cs", "MENU_VIEW_LANGUAGE_CS"c)]);
80 
81     // UI font faces
82     ui.addStringComboBox("interface/uiFontFace", UIString.fromId("OPTION_FONT_FACE"c), 
83                       createFaceList(false));
84     ui.addIntComboBox("interface/uiFontSize", UIString.fromId("OPTION_FONT_SIZE"c), 
85                       createIntValueList([6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,30,32]));
86 
87 
88     ui.addIntComboBox("interface/hintingMode", UIString.fromId("OPTION_FONT_HINTING"c), [StringListValue(0, "OPTION_FONT_HINTING_NORMAL"c), 
89                 StringListValue(1, "OPTION_FONT_HINTING_FORCE"c), 
90                 StringListValue(2, "OPTION_FONT_HINTING_DISABLED"c), StringListValue(3, "OPTION_FONT_HINTING_LIGHT"c)]);
91     ui.addIntComboBox("interface/minAntialiasedFontSize", UIString.fromId("OPTION_FONT_ANTIALIASING"c), 
92                       [StringListValue(0, "OPTION_FONT_ANTIALIASING_ALWAYS_ON"c), 
93                       StringListValue(12, "12"d), 
94                       StringListValue(14, "14"d), 
95                       StringListValue(16, "16"d), 
96                       StringListValue(20, "20"d), 
97                       StringListValue(24, "24"d), 
98                       StringListValue(32, "32"d), 
99                       StringListValue(48, "48"d), 
100                       StringListValue(255, "OPTION_FONT_ANTIALIASING_ALWAYS_OFF"c)]);
101     ui.addFloatComboBox("interface/fontGamma", UIString.fromId("OPTION_FONT_GAMMA"c), 
102                    [
103                     StringListValue(500,  "0.5   "d),
104                     StringListValue(600,  "0.6   "d),
105                     StringListValue(700,  "0.7   "d),
106                     StringListValue(800,  "0.8   "d),
107                     StringListValue(850,  "0.85  "d),
108                     StringListValue(900,  "0.9   "d),
109                     StringListValue(950,  "0.95  "d),
110                     StringListValue(1000, "1.0   "d),
111                     StringListValue(1050, "1.05  "d),
112                     StringListValue(1100, "1.1   "d), 
113                     StringListValue(1150, "1.15  "d), 
114                     StringListValue(1200, "1.2   "d), 
115                     StringListValue(1250, "1.25  "d), 
116                     StringListValue(1300, "1.3   "d), 
117                     StringListValue(1400, "1.4   "d), 
118                     StringListValue(1500, "1.5   "d), 
119                     StringListValue(1700, "1.7   "d), 
120                     StringListValue(2000, "2.0   "d)]);
121 
122     ui.addIntComboBox("interface/screenDpiOverride", UIString.fromId("OPTION_SCREEN_DPI_OVERRIDE"c), 
123                       [StringListValue(0, UIString.fromId("OPTION_SCREEN_DPI_OVERRIDE_NONE"c).value ~ " ("d ~ to!dstring(systemScreenDPI) ~ ")"d), 
124                       StringListValue(72, "72"d), 
125                       StringListValue(96, "96"d), 
126                       StringListValue(120, "120"d), 
127                       StringListValue(140, "140"d), 
128                       StringListValue(150, "150"d), 
129                       StringListValue(300, "300"d), 
130                       StringListValue(400, "400"d), 
131                       StringListValue(600, "600"d)]);
132 
133     SettingsPage ed = res.addChild("editors", UIString.fromId("OPTION_EDITORS"c));
134     SettingsPage texted = ed.addChild("editors/textEditor", UIString.fromId("OPTION_TEXT_EDITORS"c));
135 
136     // editor font faces
137     texted.addStringComboBox("editors/textEditor/fontFace", UIString.fromId("OPTION_FONT_FACE"c), createFaceList(true));
138     texted.addIntComboBox("editors/textEditor/fontSize", UIString.fromId("OPTION_FONT_SIZE"c),
139                       createIntValueList([6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,30,32]));
140 
141     texted.addNumberEdit("editors/textEditor/tabSize", UIString.fromId("OPTION_TAB"c), 1, 16, 4);
142     texted.addCheckbox("editors/textEditor/useSpacesForTabs", UIString.fromId("OPTION_USE_SPACES"c));
143     texted.addCheckbox("editors/textEditor/smartIndents", UIString.fromId("OPTION_SMART_INDENTS"c));
144     texted.addCheckbox("editors/textEditor/smartIndentsAfterPaste", UIString.fromId("OPTION_SMART_INDENTS_PASTE"c));
145     texted.addCheckbox("editors/textEditor/showWhiteSpaceMarks", UIString.fromId("OPTION_SHOW_SPACES"c));
146     texted.addCheckbox("editors/textEditor/showTabPositionMarks", UIString.fromId("OPTION_SHOW_TABS"c));
147 
148     // Common page
149     SettingsPage common = res.addChild("common", UIString.fromId("OPTION_COMMON"c));
150     common.addCheckbox("common/autoOpenLastProject", UIString.fromId("OPTION_AUTO_OPEN_LAST_PROJECT"c));
151 
152 
153     SettingsPage dlang = res.addChild("dlang", UIString.fromRaw("D"d));
154     SettingsPage dub = dlang.addChild("dlang/dub", UIString.fromRaw("DUB"d));
155     dub.addExecutableFileNameEdit("dlang/dub/executable", UIString.fromId("OPTION_DUB_EXECUTABLE"c), "dub");
156     dub.addStringEdit("dlang/dub/additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), "");
157     SettingsPage rdmd = dlang.addChild("dlang/rdmd", UIString.fromRaw("rdmd"d));
158     rdmd.addExecutableFileNameEdit("dlang/rdmd/executable", UIString.fromId("OPTION_RDMD_EXECUTABLE"c), "rdmd");
159     rdmd.addStringEdit("dlang/rdmd/additional_params", UIString.fromId("OPTION_RDMD_ADDITIONAL_PARAMS"c), "");
160     SettingsPage ddebug = dlang.addChild("dlang/debugger", UIString.fromId("OPTION_DEBUGGER"c));
161     version (Windows) {
162         ddebug.addExecutableFileNameEdit("dlang/debugger/executable", UIString.fromId("OPTION_DEBUGGER_EXECUTABLE"c), "gdb");
163     } else {
164         ddebug.addExecutableFileNameEdit("dlang/debugger/executable", UIString.fromId("OPTION_DEBUGGER_EXECUTABLE"c), "mago-mi");
165     }
166     SettingsPage terminal = dlang.addChild("dlang/terminal", UIString.fromId("OPTION_TERMINAL"c));
167     terminal.addExecutableFileNameEdit("dlang/terminal/executable", UIString.fromId("OPTION_TERMINAL_EXECUTABLE"c), "xterm");
168 
169     SettingsPage toolchains = dlang.addChild("dlang/toolchains", UIString.fromId("OPTION_TOOLCHAINS"c));
170     SettingsPage dmdtoolchain = toolchains.addChild("dlang/toolchains/dmd", UIString.fromRaw("DMD"d));
171     dmdtoolchain.addExecutableFileNameEdit("dlang/toolchains/dmd/executable", UIString.fromId("OPTION_DMD_EXECUTABLE"c), "dmd");
172     dmdtoolchain.addStringEdit("dlang/toolchains/dmd/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), "");
173     SettingsPage ldctoolchain = toolchains.addChild("dlang/toolchains/ldc", UIString.fromRaw("LDC"d));
174     ldctoolchain.addExecutableFileNameEdit("dlang/toolchains/ldc/executable", UIString.fromId("OPTION_LDC2_EXECUTABLE"c), "ldc2");
175     ldctoolchain.addStringEdit("dlang/toolchains/ldc/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), "");
176     SettingsPage ldmdtoolchain = toolchains.addChild("dlang/toolchains/ldmd", UIString.fromRaw("LDMD"d));
177     ldmdtoolchain.addExecutableFileNameEdit("dlang/toolchains/ldmd/executable", UIString.fromId("OPTION_LDMD2_EXECUTABLE"c), "ldmd2");
178     ldmdtoolchain.addStringEdit("dlang/toolchains/ldmd/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), "");
179     SettingsPage gdctoolchain = toolchains.addChild("dlang/toolchains/gdc", UIString.fromRaw("GDC"d));
180     gdctoolchain.addExecutableFileNameEdit("dlang/toolchains/gdc/executable", UIString.fromId("OPTION_GDC_EXECUTABLE"c), "gdc");
181     gdctoolchain.addStringEdit("dlang/toolchains/gdc/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), "");
182 
183     return res;
184 }
185 
186 /// create DlangIDE settings pages tree
187 SettingsPage createProjectSettingsPages() {
188     SettingsPage res = new SettingsPage("", UIString.fromRaw(""d));
189 
190     SettingsPage build = res.addChild("build", UIString.fromId("OPTION_BUILD"c));
191     build.addStringComboBox("build/toolchain", UIString.fromId("OPTION_TOOLCHAIN"c), [
192             StringListValue("default", UIString.fromId("OPTION_DEFAULT"c)), 
193             StringListValue("dmd", "DMD"d), 
194             StringListValue("ldc", "LDC"d), 
195             StringListValue("ldmd", "LDMD"d), 
196             StringListValue("gdc", "GDC"d)]);
197     build.addStringComboBox("build/arch", UIString.fromId("OPTION_ARCHITECTURE"c), [
198             StringListValue("default", UIString.fromId("OPTION_DEFAULT"c)), 
199             StringListValue("x86", "x86"d), 
200             StringListValue("x86_64", "x86_64"d),
201             StringListValue("arm", "arm"d),
202             StringListValue("arm64", "arm64"d),
203     ]);
204     build.addCheckbox("build/verbose", UIString.fromId("OPTION_VERBOSE"c), true);
205     build.addStringEdit("build/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), "");
206 
207     SettingsPage dbg = res.addChild("debug", UIString.fromId("OPTION_RUN_DEBUG"c));
208     dbg.addStringEdit("debug/run_args", UIString.fromId("OPTION_COMMAND_LINE"c), "");
209     dbg.addDirNameEdit("debug/working_dir", UIString.fromId("OPTION_WORKING_DIR"c), "");
210     dbg.addCheckbox("debug/external_console", UIString.fromId("OPTION_RUN_IN_EXTERNAL_CONSOLE"c), false);
211 
212     return res;
213 }