From a32119b9149de12b91a1fd63ca3865c303347dc5 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 10 Dec 2015 12:00:34 +0300 Subject: [PATCH] project settings --- src/dlangide/builders/builder.d | 15 +++++++++++- src/dlangide/ui/frame.d | 31 +++++++++++++++++++++++- src/dlangide/ui/settings.d | 8 +++++- src/dlangide/workspace/idesettings.d | 4 +-- src/dlangide/workspace/project.d | 16 ++++++++++++ src/dlangide/workspace/projectsettings.d | 5 ++++ 6 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/dlangide/builders/builder.d b/src/dlangide/builders/builder.d index df2c5ee..e1670e2 100644 --- a/src/dlangide/builders/builder.d +++ b/src/dlangide/builders/builder.d @@ -7,6 +7,7 @@ import dlangide.ui.outputpanel; import dlangide.builders.extprocess; import dlangui.widgets.appframe; import std.algorithm; +import std.array; import core.thread; import std.string; import std.conv; @@ -24,11 +25,17 @@ class Builder : BackgroundOperationWatcher { protected bool _verbose; protected BuildResultListener _listener; protected int _exitCode = int.min; + protected string _toolchain; + protected string _arch; @property Project project() { return _project; } @property void project(Project p) { _project = p; } - this(AppFrame frame, Project project, OutputPanel log, ProjectConfiguration projectConfig, BuildConfiguration buildConfig, BuildOperation buildOp, bool verbose, BuildResultListener listener = null) { + this(AppFrame frame, Project project, OutputPanel log, ProjectConfiguration projectConfig, BuildConfiguration buildConfig, + BuildOperation buildOp, bool verbose, + string toolchain = null, + string arch = null, + BuildResultListener listener = null) { super(frame); _listener = listener; _projectConfig = projectConfig; @@ -37,6 +44,8 @@ class Builder : BackgroundOperationWatcher { _verbose = verbose; _project = project; _log = log; + _toolchain = toolchain; + _arch = arch; _extprocess = new ExternalProcess(); _box = new ProtectedTextStorage(); } @@ -67,6 +76,10 @@ class Builder : BackgroundOperationWatcher { if (_buildOp == BuildOperation.Rebuild) { params ~= "--force".dup; } + if (!_arch.empty) + params ~= ("--arch=" ~ _arch).dup; + if (!_toolchain.empty) + params ~= ("--compiler=" ~ _toolchain).dup; } else if (_buildOp == BuildOperation.Clean) { params ~= "clean".dup; } else if (_buildOp == BuildOperation.Run) { diff --git a/src/dlangide/ui/frame.d b/src/dlangide/ui/frame.d index 9ac1035..70fce28 100644 --- a/src/dlangide/ui/frame.d +++ b/src/dlangide/ui/frame.d @@ -733,6 +733,9 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener { case IDEActions.EditPreferences: showPreferences(); return true; + case IDEActions.ProjectSettings: + showProjectSettings(); + return true; case IDEActions.FindText: Log.d("Opening Search Field"); import dlangide.ui.searchPanel; @@ -935,6 +938,24 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener { dlg.show(); } + void showProjectSettings() { + if (!currentWorkspace) + return; + Project project = currentWorkspace.startupProject; + if (!project) + return; + Setting s = project.settings.copySettings(); + SettingsDialog dlg = new SettingsDialog(UIString(project.name ~ " settings"d), window, s, createProjectSettingsPages()); + dlg.dialogResult = delegate(Dialog dlg, const Action result) { + if (result.id == ACTION_APPLY.id) { + //Log.d("settings after edit:\n", s.toJSON(true)); + project.settings.applySettings(s); + project.settings.save(); + } + }; + dlg.show(); + } + void applySettings(IDESettings settings) { for (int i = _tabs.tabCount - 1; i >= 0; i--) { DSourceEdit ed = cast(DSourceEdit)_tabs.tabBody(i); @@ -1059,7 +1080,15 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener { _logPanel.logLine("No project is opened"); return; } - Builder op = new Builder(this, currentWorkspace.startupProject, _logPanel, currentWorkspace.projectConfiguration, currentWorkspace.buildConfiguration, buildOp, false, listener); + ProjectSettings projectSettings = currentWorkspace.startupProject.settings; + string toolchain = projectSettings.getToolchain(_settings); + string arch = projectSettings.getArch(_settings); + bool verbose = projectSettings.buildVerbose; + Builder op = new Builder(this, currentWorkspace.startupProject, _logPanel, currentWorkspace.projectConfiguration, currentWorkspace.buildConfiguration, buildOp, + verbose, + toolchain, + arch, + listener); setBackgroundOperation(op); } diff --git a/src/dlangide/ui/settings.d b/src/dlangide/ui/settings.d index 84a93ae..4d771b2 100644 --- a/src/dlangide/ui/settings.d +++ b/src/dlangide/ui/settings.d @@ -13,12 +13,14 @@ public import dlangide.workspace.workspacesettings; /// create DlangIDE settings pages tree SettingsPage createSettingsPages() { SettingsPage res = new SettingsPage("", UIString(""d)); + SettingsPage ed = res.addChild("editors", UIString("Editors"d)); SettingsPage texted = ed.addChild("editors/textEditor", UIString("Text Editors"d)); texted.addNumberEdit("editors/textEditor/tabSize", UIString("Tab size"d), 1, 16, 4); texted.addCheckbox("editors/textEditor/useSpacesForTabs", UIString("Use spaces for tabs"d)); texted.addCheckbox("editors/textEditor/smartIndents", UIString("Smart indents"d)); texted.addCheckbox("editors/textEditor/smartIndentsAfterPaste", UIString("Smart indent after paste"d)); + SettingsPage dlang = res.addChild("dlang", UIString("D"d)); SettingsPage dub = dlang.addChild("dlang/dub", UIString("DUB"d)); dub.addExecutableFileNameEdit("dlang/dub/executable", UIString("DUB executable"d), "dub"); @@ -82,6 +84,7 @@ SettingsPage createSettingsPages() { /// create DlangIDE settings pages tree SettingsPage createProjectSettingsPages() { SettingsPage res = new SettingsPage("", UIString(""d)); + SettingsPage build = res.addChild("build", UIString("Build"d)); build.addStringComboBox("build/toolchain", UIString("Toolchain"d), [ StringListValue("default", "Default"d), @@ -91,10 +94,13 @@ SettingsPage createProjectSettingsPages() { build.addStringComboBox("build/arch", UIString("Architecture"d), [ StringListValue("default", "Default"d), StringListValue("x86", "x86"d), - StringListValue("x86_64", "x86_6"d)]); + StringListValue("x86_64", "x86_64"d)]); + build.addCheckbox("build/verbose", UIString("Verbose"d), true); + SettingsPage dbg = res.addChild("debug", UIString("Run and Debug"d)); dbg.addStringEdit("debug/run_args", UIString("Command line args"d), ""); dbg.addDirNameEdit("debug/working_dir", UIString("Working directory"d), ""); dbg.addCheckbox("debug/external_console", UIString("Run in external console"d), true); + return res; } diff --git a/src/dlangide/workspace/idesettings.d b/src/dlangide/workspace/idesettings.d index 424dc11..4dd8d07 100644 --- a/src/dlangide/workspace/idesettings.d +++ b/src/dlangide/workspace/idesettings.d @@ -169,9 +169,9 @@ class IDESettings : SettingsFile { if (toolchainName.equal("dmd")) return dmdToolchainSettings.getString("executable", "dmd"); if (toolchainName.equal("gdc")) - return dmdToolchainSettings.getString("executable", "gdc"); + return gdcToolchainSettings.getString("executable", "gdc"); if (toolchainName.equal("ldc")) - return dmdToolchainSettings.getString("executable", "ldc2"); + return ldcToolchainSettings.getString("executable", "ldc2"); return null; } diff --git a/src/dlangide/workspace/project.d b/src/dlangide/workspace/project.d index 7766873..af71f8e 100644 --- a/src/dlangide/workspace/project.d +++ b/src/dlangide/workspace/project.d @@ -1,6 +1,7 @@ module dlangide.workspace.project; import dlangide.workspace.workspace; +import dlangide.workspace.projectsettings; import dlangui.core.logger; import dlangui.core.collections; import dlangui.core.settings; @@ -332,6 +333,7 @@ class Project : WorkspaceItem { protected ProjectFolder _items; protected ProjectSourceFile _mainSourceFile; protected SettingsFile _projectFile; + protected ProjectSettings _settingsFile; protected bool _isDependency; protected string _dependencyVersion; @@ -348,6 +350,20 @@ class Project : WorkspaceItem { _projectFile = new SettingsFile(fname); } + @property ProjectSettings settings() { + if (!_settingsFile) { + _settingsFile = new ProjectSettings(settingsFileName); + _settingsFile.updateDefaults(); + _settingsFile.load(); + _settingsFile.save(); + } + return _settingsFile; + } + + @property string settingsFileName() { + return buildNormalizedPath(dir, toUTF8(name) ~ ".settings"); + } + @property bool isDependency() { return _isDependency; } @property string dependencyVersion() { return _dependencyVersion; } diff --git a/src/dlangide/workspace/projectsettings.d b/src/dlangide/workspace/projectsettings.d index de8fa18..15a7a63 100644 --- a/src/dlangide/workspace/projectsettings.d +++ b/src/dlangide/workspace/projectsettings.d @@ -22,6 +22,7 @@ class ProjectSettings : SettingsFile { Setting build = buildSettings(); build.setStringDef("toolchain", "default"); build.setStringDef("arch", "default"); + build.setBooleanDef("verbose", false); Setting dbg = debugSettings(); dbg.setBooleanDef("external_console", true); } @@ -36,6 +37,10 @@ class ProjectSettings : SettingsFile { return res; } + @property bool buildVerbose() { + return buildSettings.getBoolean("verbose", false); + } + string getToolchain(IDESettings idesettings) { string cfg = buildSettings.getString("toolchain"); return idesettings.getToolchainSettings(cfg);