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 }