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 // Root page 66 SettingsPage res = new SettingsPage("", UIString.fromRaw(""d)); 67 68 // UI settings page 69 SettingsPage ui = res.addChild("interface", UIString.fromId("OPTION_INTERFACE"c)); 70 ui.addStringComboBox("interface/theme", UIString.fromId("OPTION_THEME"c), [ 71 StringListValue("ide_theme_default", "OPTION_DEFAULT"c), 72 StringListValue("ide_theme_dark", "OPTION_DARK"c)]); 73 ui.addStringComboBox("interface/language", UIString.fromId("OPTION_LANGUAGE"c), [ 74 StringListValue("en", "MENU_VIEW_LANGUAGE_EN"c), 75 StringListValue("ru", "MENU_VIEW_LANGUAGE_RU"c), 76 StringListValue("es", "MENU_VIEW_LANGUAGE_ES"c), 77 StringListValue("cs", "MENU_VIEW_LANGUAGE_CS"c)]); 78 79 // UI font faces 80 ui.addStringComboBox("interface/uiFontFace", UIString.fromId("OPTION_FONT_FACE"c), 81 createFaceList(false)); 82 ui.addIntComboBox("interface/uiFontSize", UIString.fromId("OPTION_FONT_SIZE"c), 83 createIntValueList([6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,30,32])); 84 85 86 ui.addIntComboBox("interface/hintingMode", UIString.fromId("OPTION_FONT_HINTING"c), [StringListValue(0, "OPTION_FONT_HINTING_NORMAL"c), 87 StringListValue(1, "OPTION_FONT_HINTING_FORCE"c), 88 StringListValue(2, "OPTION_FONT_HINTING_DISABLED"c), StringListValue(3, "OPTION_FONT_HINTING_LIGHT"c)]); 89 ui.addIntComboBox("interface/minAntialiasedFontSize", UIString.fromId("OPTION_FONT_ANTIALIASING"c), 90 [StringListValue(0, "OPTION_FONT_ANTIALIASING_ALWAYS_ON"c), 91 StringListValue(12, "12"d), 92 StringListValue(14, "14"d), 93 StringListValue(16, "16"d), 94 StringListValue(20, "20"d), 95 StringListValue(24, "24"d), 96 StringListValue(32, "32"d), 97 StringListValue(48, "48"d), 98 StringListValue(255, "OPTION_FONT_ANTIALIASING_ALWAYS_OFF"c)]); 99 ui.addFloatComboBox("interface/fontGamma", UIString.fromId("OPTION_FONT_GAMMA"c), 100 [ 101 StringListValue(500, "0.5 "d), 102 StringListValue(600, "0.6 "d), 103 StringListValue(700, "0.7 "d), 104 StringListValue(800, "0.8 "d), 105 StringListValue(850, "0.85 "d), 106 StringListValue(900, "0.9 "d), 107 StringListValue(950, "0.95 "d), 108 StringListValue(1000, "1.0 "d), 109 StringListValue(1050, "1.05 "d), 110 StringListValue(1100, "1.1 "d), 111 StringListValue(1150, "1.15 "d), 112 StringListValue(1200, "1.2 "d), 113 StringListValue(1250, "1.25 "d), 114 StringListValue(1300, "1.3 "d), 115 StringListValue(1400, "1.4 "d), 116 StringListValue(1500, "1.5 "d), 117 StringListValue(1700, "1.7 "d), 118 StringListValue(2000, "2.0 "d)]); 119 120 ui.addIntComboBox("interface/screenDpiOverride", UIString.fromId("OPTION_SCREEN_DPI_OVERRIDE"c), 121 [StringListValue(0, UIString.fromId("OPTION_SCREEN_DPI_OVERRIDE_NONE"c).value ~ " ("d ~ to!dstring(systemScreenDPI) ~ ")"d), 122 StringListValue(72, "72"d), 123 StringListValue(96, "96"d), 124 StringListValue(120, "120"d), 125 StringListValue(140, "140"d), 126 StringListValue(150, "150"d), 127 StringListValue(300, "300"d), 128 StringListValue(400, "400"d), 129 StringListValue(600, "600"d)]); 130 131 SettingsPage ed = res.addChild("editors", UIString.fromId("OPTION_EDITORS"c)); 132 SettingsPage texted = ed.addChild("editors/textEditor", UIString.fromId("OPTION_TEXT_EDITORS"c)); 133 134 // editor font faces 135 texted.addStringComboBox("editors/textEditor/fontFace", UIString.fromId("OPTION_FONT_FACE"c), createFaceList(true)); 136 texted.addIntComboBox("editors/textEditor/fontSize", UIString.fromId("OPTION_FONT_SIZE"c), 137 createIntValueList([6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,30,32])); 138 139 texted.addNumberEdit("editors/textEditor/tabSize", UIString.fromId("OPTION_TAB"c), 1, 16, 4); 140 texted.addCheckbox("editors/textEditor/useSpacesForTabs", UIString.fromId("OPTION_USE_SPACES"c)); 141 texted.addCheckbox("editors/textEditor/smartIndents", UIString.fromId("OPTION_SMART_INDENTS"c)); 142 texted.addCheckbox("editors/textEditor/smartIndentsAfterPaste", UIString.fromId("OPTION_SMART_INDENTS_PASTE"c)); 143 texted.addCheckbox("editors/textEditor/showWhiteSpaceMarks", UIString.fromId("OPTION_SHOW_SPACES"c)); 144 texted.addCheckbox("editors/textEditor/showTabPositionMarks", UIString.fromId("OPTION_SHOW_TABS"c)); 145 146 // Common page 147 SettingsPage common = res.addChild("common", UIString.fromId("OPTION_COMMON"c)); 148 common.addCheckbox("common/autoOpenLastProject", UIString.fromId("OPTION_AUTO_OPEN_LAST_PROJECT"c)); 149 150 151 SettingsPage dlang = res.addChild("dlang", UIString.fromRaw("D"d)); 152 SettingsPage dub = dlang.addChild("dlang/dub", UIString.fromRaw("DUB"d)); 153 dub.addExecutableFileNameEdit("dlang/dub/executable", UIString.fromId("OPTION_DUB_EXECUTABLE"c), "dub"); 154 dub.addStringEdit("dlang/dub/additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); 155 SettingsPage rdmd = dlang.addChild("dlang/rdmd", UIString.fromRaw("rdmd"d)); 156 rdmd.addExecutableFileNameEdit("dlang/rdmd/executable", UIString.fromId("OPTION_RDMD_EXECUTABLE"c), "rdmd"); 157 rdmd.addStringEdit("dlang/rdmd/additional_params", UIString.fromId("OPTION_RDMD_ADDITIONAL_PARAMS"c), ""); 158 SettingsPage ddebug = dlang.addChild("dlang/debugger", UIString.fromId("OPTION_DEBUGGER"c)); 159 version (Windows) { 160 ddebug.addExecutableFileNameEdit("dlang/debugger/executable", UIString.fromId("OPTION_DEBUGGER_EXECUTABLE"c), "gdb"); 161 } else { 162 ddebug.addExecutableFileNameEdit("dlang/debugger/executable", UIString.fromId("OPTION_DEBUGGER_EXECUTABLE"c), "mago-mi"); 163 } 164 SettingsPage terminal = dlang.addChild("dlang/terminal", UIString.fromId("OPTION_TERMINAL"c)); 165 terminal.addExecutableFileNameEdit("dlang/terminal/executable", UIString.fromId("OPTION_TERMINAL_EXECUTABLE"c), "xterm"); 166 167 SettingsPage toolchains = dlang.addChild("dlang/toolchains", UIString.fromId("OPTION_TOOLCHAINS"c)); 168 SettingsPage dmdtoolchain = toolchains.addChild("dlang/toolchains/dmd", UIString.fromRaw("DMD"d)); 169 dmdtoolchain.addExecutableFileNameEdit("dlang/toolchains/dmd/executable", UIString.fromId("OPTION_DMD_EXECUTABLE"c), "dmd"); 170 dmdtoolchain.addStringEdit("dlang/toolchains/dmd/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); 171 SettingsPage ldctoolchain = toolchains.addChild("dlang/toolchains/ldc", UIString.fromRaw("LDC"d)); 172 ldctoolchain.addExecutableFileNameEdit("dlang/toolchains/ldc/executable", UIString.fromId("OPTION_LDC2_EXECUTABLE"c), "ldc2"); 173 ldctoolchain.addStringEdit("dlang/toolchains/ldc/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); 174 SettingsPage ldmdtoolchain = toolchains.addChild("dlang/toolchains/ldmd", UIString.fromRaw("LDMD"d)); 175 ldmdtoolchain.addExecutableFileNameEdit("dlang/toolchains/ldmd/executable", UIString.fromId("OPTION_LDMD2_EXECUTABLE"c), "ldmd2"); 176 ldmdtoolchain.addStringEdit("dlang/toolchains/ldmd/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); 177 SettingsPage gdctoolchain = toolchains.addChild("dlang/toolchains/gdc", UIString.fromRaw("GDC"d)); 178 gdctoolchain.addExecutableFileNameEdit("dlang/toolchains/gdc/executable", UIString.fromId("OPTION_GDC_EXECUTABLE"c), "gdc"); 179 gdctoolchain.addStringEdit("dlang/toolchains/gdc/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); 180 181 return res; 182 } 183 184 /// create DlangIDE settings pages tree 185 SettingsPage createProjectSettingsPages() { 186 SettingsPage res = new SettingsPage("", UIString.fromRaw(""d)); 187 188 SettingsPage build = res.addChild("build", UIString.fromId("OPTION_BUILD"c)); 189 build.addStringComboBox("build/toolchain", UIString.fromId("OPTION_TOOLCHAIN"c), [ 190 StringListValue("default", UIString.fromId("OPTION_DEFAULT"c)), 191 StringListValue("dmd", "DMD"d), 192 StringListValue("ldc", "LDC"d), 193 StringListValue("ldmd", "LDMD"d), 194 StringListValue("gdc", "GDC"d)]); 195 build.addStringComboBox("build/arch", UIString.fromId("OPTION_ARCHITECTURE"c), [ 196 StringListValue("default", UIString.fromId("OPTION_DEFAULT"c)), 197 StringListValue("x86", "x86"d), 198 StringListValue("x86_64", "x86_64"d), 199 StringListValue("arm", "arm"d), 200 StringListValue("arm64", "arm64"d), 201 ]); 202 build.addCheckbox("build/verbose", UIString.fromId("OPTION_VERBOSE"c), true); 203 build.addStringEdit("build/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); 204 205 SettingsPage dbg = res.addChild("debug", UIString.fromId("OPTION_RUN_DEBUG"c)); 206 dbg.addStringEdit("debug/run_args", UIString.fromId("OPTION_COMMAND_LINE"c), ""); 207 dbg.addDirNameEdit("debug/working_dir", UIString.fromId("OPTION_WORKING_DIR"c), ""); 208 dbg.addCheckbox("debug/external_console", UIString.fromId("OPTION_RUN_IN_EXTERNAL_CONSOLE"c), false); 209 210 return res; 211 }