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 /// create DlangIDE settings pages tree
14 SettingsPage createSettingsPages() {
15     SettingsPage res = new SettingsPage("", UIString(""d));
16 
17     SettingsPage ui = res.addChild("interface", UIString("Interface"d));
18     ui.addStringComboBox("interface/theme", UIString("Theme"d), [
19             StringListValue("ide_theme_default", "Default"d), 
20             StringListValue("ide_theme_dark", "Dark"d)]);
21     ui.addStringComboBox("interface/language", UIString("Language"d), [
22             StringListValue("en", "English"d), 
23             StringListValue("ru", "Russian"d), 
24             StringListValue("es", "Spanish"d),
25 	    StringListValue("cs", "Čeština"d)]);
26 
27     ui.addIntComboBox("interface/hintingMode", UIString("Font hinting mode"d), [StringListValue(0, "Normal"d), StringListValue(1, "Force Auto Hint"d), 
28                 StringListValue(2, "Disabled"d), StringListValue(3, "Light"d)]);
29     ui.addIntComboBox("interface/minAntialiasedFontSize", UIString("Minimum font size for antialiasing"d), 
30                       [StringListValue(0, "Always ON"d), 
31                       StringListValue(12, "12"d), 
32                       StringListValue(14, "14"d), 
33                       StringListValue(16, "16"d), 
34                       StringListValue(20, "20"d), 
35                       StringListValue(24, "24"d), 
36                       StringListValue(32, "32"d), 
37                       StringListValue(48, "48"d), 
38                       StringListValue(255, "Always OFF"d)]);
39     ui.addFloatComboBox("interface/fontGamma", UIString("Font gamma"d), 
40                    [
41                     StringListValue(500,  "0.5   "d),
42                     StringListValue(600,  "0.6   "d),
43                     StringListValue(700,  "0.7   "d),
44                     StringListValue(800,  "0.8   "d),
45                     StringListValue(850,  "0.85  "d),
46                     StringListValue(900,  "0.9   "d),
47                     StringListValue(950,  "0.95  "d),
48                     StringListValue(1000, "1.0   "d),
49                     StringListValue(1050, "1.05  "d),
50                     StringListValue(1100, "1.1   "d), 
51                     StringListValue(1150, "1.15  "d), 
52                     StringListValue(1200, "1.2   "d), 
53                     StringListValue(1250, "1.25  "d), 
54                     StringListValue(1300, "1.3   "d), 
55                     StringListValue(1400, "1.4   "d), 
56                     StringListValue(1500, "1.5   "d), 
57                     StringListValue(1700, "1.7   "d), 
58                     StringListValue(2000, "2.0   "d)]);
59 
60     SettingsPage ed = res.addChild("editors", UIString("Editors"d));
61     SettingsPage texted = ed.addChild("editors/textEditor", UIString("Text Editors"d));
62 
63     // font faces
64     StringListValue[] faces;
65     faces ~= StringListValue("Default", "Default"d);
66     import dlangui.graphics.fonts;
67     import std.utf : toUTF32;
68     FontFaceProps[] allFaces = FontManager.instance.getFaces();
69     import std.algorithm.sorting : sort;
70     auto fontComp = function(ref FontFaceProps a, ref FontFaceProps b) {
71         if (a.family == FontFamily.MonoSpace && b.family != FontFamily.MonoSpace)
72             return -1;
73         if (a.family != FontFamily.MonoSpace && b.family == FontFamily.MonoSpace)
74             return 1;
75         if (a.face < b.face)
76             return -1;
77         if (a.face > b.face)
78             return 1;
79         return 0;
80     };
81     //auto sorted = allFaces.sort!((a, b) => (a.family == FontFamily.MonoSpace && b.family != FontFamily.MonoSpace) || (a.face < b.face));
82     auto sorted = sort!((a, b) => fontComp(a, b) < 0)(allFaces);
83     
84     //allFaces = allFaces.sort!((a, b) => a.family == FontFamily.MonoSpace && b.family == FontFamily.MonoSpace || a.face < b.face);
85     //for (int i = 0; i < allFaces.length; i++) {
86     foreach (face; sorted) {
87         if (face.family == FontFamily.MonoSpace)
88             faces ~= StringListValue(face.face, "*"d ~ toUTF32(face.face));
89         else
90             faces ~= StringListValue(face.face, toUTF32(face.face));
91     }
92     texted.addStringComboBox("editors/textEditor/fontFace", UIString("Font face"d), faces);
93 
94     texted.addNumberEdit("editors/textEditor/tabSize", UIString("Tab size"d), 1, 16, 4);
95     texted.addCheckbox("editors/textEditor/useSpacesForTabs", UIString("Use spaces for tabs"d));
96     texted.addCheckbox("editors/textEditor/smartIndents", UIString("Smart indents"d));
97     texted.addCheckbox("editors/textEditor/smartIndentsAfterPaste", UIString("Smart indent after paste"d));
98     texted.addCheckbox("editors/textEditor/showWhiteSpaceMarks", UIString("Show white space marks"d));
99     texted.addCheckbox("editors/textEditor/showTabPositionMarks", UIString("Show tab position marks"d));
100 
101 
102     SettingsPage dlang = res.addChild("dlang", UIString("D"d));
103     SettingsPage dub = dlang.addChild("dlang/dub", UIString("DUB"d));
104     dub.addExecutableFileNameEdit("dlang/dub/executable", UIString("DUB executable"d), "dub");
105     dub.addStringEdit("dlang/dub/additional_params", UIString("DUB additional params"d), "");
106     SettingsPage rdmd = dlang.addChild("dlang/rdmd", UIString("rdmd"d));
107     rdmd.addExecutableFileNameEdit("dlang/rdmd/executable", UIString("rdmd executable"d), "rdmd");
108     rdmd.addStringEdit("dlang/rdmd/additional_params", UIString("rdmd additional params"d), "");
109     SettingsPage ddebug = dlang.addChild("dlang/debugger", UIString("Debugger"d));
110     version (Windows) {
111         ddebug.addExecutableFileNameEdit("dlang/debugger/executable", UIString("Debugger executable"d), "gdb");
112     } else {
113         ddebug.addExecutableFileNameEdit("dlang/debugger/executable", UIString("Debugger executable"d), "mago-mi");
114     }
115     SettingsPage terminal = dlang.addChild("dlang/terminal", UIString("Terminal"d));
116     terminal.addExecutableFileNameEdit("dlang/terminal/executable", UIString("Terminal executable"d), "xterm");
117 
118     SettingsPage toolchains = dlang.addChild("dlang/toolchains", UIString("Toolchains"d));
119     SettingsPage dmdtoolchain = toolchains.addChild("dlang/toolchains/dmd", UIString("DMD"d));
120     dmdtoolchain.addExecutableFileNameEdit("dlang/toolchains/dmd/executable", UIString("DMD executable"d), "dmd");
121     dmdtoolchain.addStringEdit("dlang/toolchains/dmd/dub_additional_params", UIString("DUB additional params"d), "");
122     SettingsPage ldctoolchain = toolchains.addChild("dlang/toolchains/ldc", UIString("LDC"d));
123     ldctoolchain.addExecutableFileNameEdit("dlang/toolchains/ldc/executable", UIString("LDC2 executable"d), "ldc2");
124     ldctoolchain.addStringEdit("dlang/toolchains/ldc/dub_additional_params", UIString("DUB additional params"d), "");
125     SettingsPage ldmdtoolchain = toolchains.addChild("dlang/toolchains/ldmd", UIString("LDMD"d));
126     ldmdtoolchain.addExecutableFileNameEdit("dlang/toolchains/ldmd/executable", UIString("LDMD2 executable"d), "ldmd2");
127     ldmdtoolchain.addStringEdit("dlang/toolchains/ldmd/dub_additional_params", UIString("DUB additional params"d), "");
128     SettingsPage gdctoolchain = toolchains.addChild("dlang/toolchains/gdc", UIString("GDC"d));
129     gdctoolchain.addExecutableFileNameEdit("dlang/toolchains/gdc/executable", UIString("GDC executable"d), "gdc");
130     gdctoolchain.addStringEdit("dlang/toolchains/gdc/dub_additional_params", UIString("DUB additional params"d), "");
131 
132     return res;
133 }
134 
135 /// create DlangIDE settings pages tree
136 SettingsPage createProjectSettingsPages() {
137     SettingsPage res = new SettingsPage("", UIString(""d));
138 
139     SettingsPage build = res.addChild("build", UIString("Build"d));
140     build.addStringComboBox("build/toolchain", UIString("Toolchain"d), [
141             StringListValue("default", "Default"d), 
142             StringListValue("dmd", "DMD"d), 
143             StringListValue("ldc", "LDC"d), 
144             StringListValue("ldmd", "LDMD"d), 
145             StringListValue("gdc", "GDC"d)]);
146     build.addStringComboBox("build/arch", UIString("Architecture"d), [
147             StringListValue("default", "Default"d), 
148             StringListValue("x86", "x86"d), 
149             StringListValue("x86_64", "x86_64"d),
150             StringListValue("arm", "arm"d),
151             StringListValue("arm64", "arm64"d),
152     ]);
153     build.addCheckbox("build/verbose", UIString("Verbose"d), true);
154     build.addStringEdit("build/dub_additional_params", UIString("DUB additional params"d), "");
155 
156     SettingsPage dbg = res.addChild("debug", UIString("Run and Debug"d));
157     dbg.addStringEdit("debug/run_args", UIString("Command line args"d), "");
158     dbg.addDirNameEdit("debug/working_dir", UIString("Working directory"d), "");
159     dbg.addCheckbox("debug/external_console", UIString("Run in external console"d), true);
160 
161     return res;
162 }