diff --git a/dub.json b/dub.json index 5cdbc52..aac32c5 100644 --- a/dub.json +++ b/dub.json @@ -9,10 +9,10 @@ "targetPath": "bin", "targetType": "executable", - "stringImportPaths": ["views", "views/res", "views/res/i18n", "views/res/mdpi", "views/res/hdpi"], + "stringImportPaths": ["views"], "dependencies": { - "dlangui": "==0.9.127", + "dlangui": "==0.9.131", "dsymbol": "~>0.2.9", "dcd": "~>0.9.1" }, diff --git a/src/dlangide.d b/src/dlangide.d index cf4a506..62e0133 100644 --- a/src/dlangide.d +++ b/src/dlangide.d @@ -105,6 +105,8 @@ extern (C) int UIAppMain(string[] args) { // show window window.show(); + // restore window state, size, position + frame.restoreUIStateOnStartup(); //jsonTest(); diff --git a/src/dlangide/ui/commands.d b/src/dlangide/ui/commands.d index 581c63c..d8cf0ec 100644 --- a/src/dlangide/ui/commands.d +++ b/src/dlangide/ui/commands.d @@ -80,7 +80,7 @@ const Action ACTION_PROJECT_FOLDER_OPEN_ITEM = new Action(IDEActions.ProjectFold const Action ACTION_PROJECT_FOLDER_REMOVE_ITEM = new Action(IDEActions.ProjectFolderRemoveItem, "MENU_PROJECT_FOLDER_REMOVE_ITEM"c); const Action ACTION_PROJECT_FOLDER_RENAME_ITEM = new Action(IDEActions.ProjectFolderRenameItem, "MENU_PROJECT_FOLDER_RENAME_ITEM"c); const Action ACTION_PROJECT_FOLDER_REFRESH = new Action(IDEActions.ProjectFolderRefresh, "MENU_PROJECT_FOLDER_REFRESH"c); -const Action ACTION_FILE_WORKSPACE_CLOSE = new Action(IDEActions.CloseWorkspace, "MENU_FILE_WORKSPACE_CLOSE"c); +const Action ACTION_FILE_WORKSPACE_CLOSE = new Action(IDEActions.CloseWorkspace, "MENU_FILE_WORKSPACE_CLOSE"c).disableByDefault(); const Action ACTION_FILE_NEW_SOURCE_FILE = new Action(IDEActions.FileNew, "MENU_FILE_NEW_SOURCE_FILE"c, "document-new", KeyCode.KEY_N, KeyFlag.Control); const Action ACTION_FILE_NEW_PROJECT = new Action(IDEActions.FileNewProject, "MENU_FILE_NEW_PROJECT"c); @@ -88,7 +88,7 @@ const Action ACTION_FILE_NEW_WORKSPACE = new Action(IDEActions.FileNewWorkspace, const Action ACTION_FILE_OPEN = new Action(IDEActions.FileOpen, "MENU_FILE_OPEN"c, "document-open", KeyCode.KEY_O, KeyFlag.Control); const Action ACTION_FILE_OPEN_WORKSPACE = new Action(IDEActions.FileOpenWorkspace, "MENU_FILE_OPEN_WORKSPACE"c, null, KeyCode.KEY_O, KeyFlag.Control | KeyFlag.Shift); const Action ACTION_FILE_SAVE = (new Action(IDEActions.FileSave, "MENU_FILE_SAVE"c, "document-save", KeyCode.KEY_S, KeyFlag.Control)).disableByDefault(); -const Action ACTION_FILE_SAVE_AS = (new Action(IDEActions.FileSaveAs, "MENU_FILE_SAVE_AS"c)).disableByDefault(); +const Action ACTION_FILE_SAVE_AS = (new Action(IDEActions.FileSaveAs, "MENU_FILE_SAVE_AS"c)).disableByDefault().disableByDefault(); const Action ACTION_FILE_SAVE_ALL = (new Action(IDEActions.FileSaveAll, "MENU_FILE_SAVE_ALL"c, null, KeyCode.KEY_S, KeyFlag.Control | KeyFlag.Shift)).disableByDefault(); const Action ACTION_FILE_EXIT = new Action(IDEActions.FileExit, "MENU_FILE_EXIT"c, "document-close"c, KeyCode.KEY_X, KeyFlag.Alt); const Action ACTION_WORKSPACE_BUILD = new Action(IDEActions.BuildWorkspace, "MENU_BUILD_WORKSPACE_BUILD"c); @@ -133,8 +133,8 @@ const Action ACTION_EDIT_PREFERENCES = (new Action(IDEActions.EditPreferences, " const Action ACTION_HELP_ABOUT = new Action(IDEActions.HelpAbout, "MENU_HELP_ABOUT"c); const Action ACTION_HELP_VIEW_HELP = new Action(IDEActions.HelpViewHelp, "MENU_HELP_VIEW_HELP"c); const Action ACTION_HELP_DONATE = new Action(IDEActions.HelpDonate, "MENU_HELP_DONATE"c); -const Action ACTION_WINDOW_CLOSE_DOCUMENT = new Action(IDEActions.WindowCloseDocument, "MENU_WINDOW_CLOSE_DOCUMENT"c, null, KeyCode.KEY_W, KeyFlag.Control); -const Action ACTION_WINDOW_CLOSE_ALL_DOCUMENTS = new Action(IDEActions.WindowCloseAllDocuments, "MENU_WINDOW_CLOSE_ALL_DOCUMENTS"c); +const Action ACTION_WINDOW_CLOSE_DOCUMENT = new Action(IDEActions.WindowCloseDocument, "MENU_WINDOW_CLOSE_DOCUMENT"c, null, KeyCode.KEY_W, KeyFlag.Control).disableByDefault(); +const Action ACTION_WINDOW_CLOSE_ALL_DOCUMENTS = new Action(IDEActions.WindowCloseAllDocuments, "MENU_WINDOW_CLOSE_ALL_DOCUMENTS"c).disableByDefault(); const Action ACTION_WINDOW_SHOW_HOME_SCREEN = new Action(IDEActions.WindowShowHomeScreen, "MENU_WINDOW_SHOW_HOME_SCREEN"c); const Action ACTION_CREATE_NEW_WORKSPACE = new Action(IDEActions.CreateNewWorkspace, "OPTION_CREATE_NEW_WORKSPACE"c); diff --git a/src/dlangide/ui/frame.d b/src/dlangide/ui/frame.d index ed19890..da20d1a 100644 --- a/src/dlangide/ui/frame.d +++ b/src/dlangide/ui/frame.d @@ -830,8 +830,6 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL return true; case IDEActions.FileExit: case IDEActions.FileOpen: - case IDEActions.WindowCloseDocument: - case IDEActions.WindowCloseAllDocuments: case IDEActions.WindowShowHomeScreen: case IDEActions.FileOpenWorkspace: // disable when background operation in progress @@ -893,6 +891,15 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL case IDEActions.FindInFiles: a.state = currentWorkspace !is null ? ACTION_STATE_ENABLED : ACTION_STATE_DISABLE; return true; + case IDEActions.CloseWorkspace: + a.state = (currentWorkspace !is null && !_currentBackgroundOperation) ? ACTION_STATE_ENABLED : ACTION_STATE_DISABLE; + return true; + case IDEActions.WindowCloseDocument: + case IDEActions.WindowCloseAllDocuments: + case IDEActions.FileSaveAll: + case IDEActions.FileSaveAs: + a.state = (currentEditor !is null && !_currentBackgroundOperation) ? ACTION_STATE_ENABLED : ACTION_STATE_DISABLE; + return true; default: return super.handleActionStateRequest(a); } @@ -926,8 +933,11 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL //debug { // testDCDFailAfterThreadCreation(); //} + dstring msg = "DLangIDE\n(C) Vadim Lopatin, 2014-2017\nhttp://github.com/buggins/dlangide\n" + ~ "IDE for D programming language written in D\nUses DlangUI library " + ~ DLANGUI_VERSION ~ " for GUI"d; window.showMessageBox(UIString.fromId("ABOUT"c) ~ " " ~ DLANGIDE_VERSION, - UIString.fromRaw("DLangIDE\n(C) Vadim Lopatin, 2014-2017\nhttp://github.com/buggins/dlangide\nIDE for D programming language written in D\nUses DlangUI library for GUI"d)); + UIString.fromRaw(msg)); return true; case StandardAction.OpenUrl: platform.openURL(a.stringParam); @@ -1382,7 +1392,7 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL if (!project) return; Setting s = project.settings.copySettings(); - SettingsDialog dlg = new SettingsDialog(UIString.fromRaw(project.name ~ " settings"d), window, s, createProjectSettingsPages()); + SettingsDialog dlg = new SettingsDialog(UIString.fromRaw(project.name ~ " - "d ~ UIString.fromId("HEADER_PROJECT_SETTINGS"c)), 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)); @@ -1664,6 +1674,10 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL } } + void restoreUIStateOnStartup() { + window.restoreWindowState(_settings.uiState); + } + /// return false to prevent closing bool onCanClose() { askForUnsavedEdits(delegate() { @@ -1677,6 +1691,8 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL } /// called when main window is closing void onWindowClose() { + window.saveWindowState(_settings.uiState); + _settings.save(); Log.i("onWindowClose()"); stopExecution(); } diff --git a/src/dlangide/ui/newfile.d b/src/dlangide/ui/newfile.d index c43eb8a..40bb2a4 100644 --- a/src/dlangide/ui/newfile.d +++ b/src/dlangide/ui/newfile.d @@ -39,7 +39,7 @@ class NewFileDlg : Dialog { ProjectFolder _folder; string[] _sourcePaths; this(IDEFrame parent, Project currentProject, ProjectFolder folder) { - super(UIString.fromRaw("New source file"d), parent.window, + super(UIString.fromId("OPTION_NEW_SOURCE_FILE"c), parent.window, DialogFlag.Modal | DialogFlag.Resizable | DialogFlag.Popup, 500, 400); _ide = parent; _icon = "dlangui-logo1"; @@ -68,7 +68,7 @@ class NewFileDlg : Dialog { VerticalLayout { margins: 5 layoutWidth: 50%; layoutHeight: fill - TextWidget { text: "Project template" } + TextWidget { text: OPTION_PROJECT_TEMPLATE } StringListWidget { id: projectTemplateList layoutWidth: wrap; layoutHeight: fill @@ -77,7 +77,7 @@ class NewFileDlg : Dialog { VerticalLayout { margins: 5 layoutWidth: 50%; layoutHeight: fill - TextWidget { text: "Template description" } + TextWidget { text: OPTION_TEMPLATE_DESCR } EditBox { id: templateDescription; readOnly: true layoutWidth: fill; layoutHeight: fill @@ -88,13 +88,13 @@ class NewFileDlg : Dialog { margins: 5 colCount: 2 layoutWidth: fill; layoutHeight: wrap - TextWidget { text: "Name" } + TextWidget { text: NAME } EditLine { id: edName; text: "newfile"; layoutWidth: fill } - TextWidget { text: "Location" } + TextWidget { text: LOCATION } DirEditLine { id: edLocation; layoutWidth: fill } - TextWidget { text: "Module name" } + TextWidget { text: OPTION_MODULE_NAME } EditLine { id: edModuleName; text: ""; layoutWidth: fill; readOnly: true } - TextWidget { text: "File path" } + TextWidget { text: OPTION_FILE_PATH } EditLine { id: edFilePath; text: ""; layoutWidth: fill; readOnly: true } } TextWidget { id: statusText; text: ""; layoutWidth: fill; textColor: #FF0000 } @@ -119,7 +119,7 @@ class NewFileDlg : Dialog { _edLocation.filetypeIcons["dub.json"] = "project-d"; _edLocation.filetypeIcons["package.json"] = "project-d"; _edLocation.filetypeIcons[".dlangidews"] = "project-development"; - _edLocation.addFilter(FileFilterEntry(UIString.fromRaw("DlangIDE files"d), "*.dlangidews;*.d;*.dd;*.di;*.ddoc;*.dh;*.json;*.xml;*.ini;*.dt")); + _edLocation.addFilter(FileFilterEntry(UIString.fromId("IDE_FILES"c), "*.dlangidews;*.d;*.dd;*.di;*.ddoc;*.dh;*.json;*.xml;*.ini;*.dt")); _edLocation.caption = "Select directory"d; _edFileName.editorAction.connect(&onEditorAction); @@ -304,11 +304,11 @@ class NewFileDlg : Dialog { Action newaction = action.clone(); if (action.id == IDEActions.FileNew) { if (!validate()) { - window.showMessageBox(UIString.fromRaw("Error"d), UIString.fromRaw("Invalid parameters")); + window.showMessageBox(UIString.fromId("ERROR"c), UIString.fromId("ERROR_INVALID_PARAMETERS"c)); return; } if (!createItem()) { - window.showMessageBox(UIString.fromRaw("Error"d), UIString.fromRaw("Failed to create project item")); + window.showMessageBox(UIString.fromId("ERROR"c), UIString.fromId("ERROR_INVALID_PARAMETERS"c)); return; } newaction.objectParam = _result; diff --git a/src/dlangide/ui/newproject.d b/src/dlangide/ui/newproject.d index 8c1f181..8e08426 100644 --- a/src/dlangide/ui/newproject.d +++ b/src/dlangide/ui/newproject.d @@ -38,7 +38,7 @@ class NewProjectDlg : Dialog { IDEFrame _ide; this(IDEFrame parent, bool newWorkspace, Workspace currentWorkspace, string dir) { - super(newWorkspace ? UIString.fromRaw("New Workspace"d) : UIString.fromRaw("New Project"d), parent.window, + super(newWorkspace ? UIString.fromId("OPTION_NEW_WORKSPACE"c) : UIString.fromId("OPTION_NEW_PROJECT"c), parent.window, DialogFlag.Modal | DialogFlag.Resizable | DialogFlag.Popup, 500, 400); _ide = parent; _icon = "dlangui-logo1"; @@ -63,7 +63,7 @@ class NewProjectDlg : Dialog { VerticalLayout { margins: 5 layoutWidth: 25%; layoutHeight: fill - TextWidget { text: "Project template" } + TextWidget { text: OPTION_PROJECT_TEMPLATE } StringListWidget { id: projectTemplateList layoutWidth: wrap; layoutHeight: fill @@ -72,7 +72,7 @@ class NewProjectDlg : Dialog { VerticalLayout { margins: 5 layoutWidth: 40%; layoutHeight: fill - TextWidget { text: "Template description" } + TextWidget { text: OPTION_TEMPLATE_DESCR } EditBox { id: templateDescription; readOnly: true layoutWidth: fill; layoutHeight: fill @@ -81,7 +81,7 @@ class NewProjectDlg : Dialog { VerticalLayout { layoutWidth: 35%; layoutHeight: fill margins: 5 - TextWidget { text: "Directory layout" } + TextWidget { text: OPTION_DIRECTORY_LAYOUT } EditBox { id: directoryLayout; readOnly: true layoutWidth: fill; layoutHeight: fill @@ -93,16 +93,16 @@ class NewProjectDlg : Dialog { colCount: 2 layoutWidth: fill; layoutHeight: wrap TextWidget { text: "" } - CheckBox { id: cbCreateWorkspace; text: "Create new solution"; checked: true } - TextWidget { text: "Workspace name" } + CheckBox { id: cbCreateWorkspace; text: OPTION_CREATE_NEW_SOLUTION; checked: true } + TextWidget { text: OPTION_WORKSPACE_NAME } EditLine { id: edWorkspaceName; text: "newworkspace"; layoutWidth: fill } TextWidget { text: "" } - CheckBox { id: cbCreateWorkspaceSubdir; text: "Create subdirectory for workspace"; checked: true } - TextWidget { text: "Project name" } + CheckBox { id: cbCreateWorkspaceSubdir; text: OPTION_CREATE_SUBDIRECTORY_FOR_WORKSPACE; checked: true } + TextWidget { text: OPTION_PROJECT_NAME } EditLine { id: edProjectName; text: "newproject"; layoutWidth: fill } TextWidget { text: "" } - CheckBox { id: cbCreateSubdir; text: "Create subdirectory for project"; checked: true } - TextWidget { text: "Location" } + CheckBox { id: cbCreateSubdir; text: OPTION_CREATE_SUBDIRECTORY_FOR_PROJECT; checked: true } + TextWidget { text: LOCATION } DirEditLine { id: edLocation; layoutWidth: fill } } TextWidget { id: statusText; text: ""; layoutWidth: fill } @@ -130,8 +130,8 @@ class NewProjectDlg : Dialog { _edLocation.filetypeIcons["dub.json"] = "project-d"; _edLocation.filetypeIcons["package.json"] = "project-d"; _edLocation.filetypeIcons[".dlangidews"] = "project-development"; - _edLocation.addFilter(FileFilterEntry(UIString.fromRaw("DlangIDE files"d), "*.dlangidews;*.d;*.dd;*.di;*.ddoc;*.dh;*.json;*.xml;*.ini")); - _edLocation.caption = "Select directory"d; + _edLocation.addFilter(FileFilterEntry(UIString.fromId("IDE_FILES"c), "*.dlangidews;*.d;*.dd;*.di;*.ddoc;*.dh;*.json;*.xml;*.ini")); + _edLocation.caption = UIString.fromId("MSG_SELECT_DIR"c); if (_currentWorkspace) { _workspaceName = toUTF8(_currentWorkspace.name); @@ -273,14 +273,14 @@ class NewProjectDlg : Dialog { if (action.id == IDEActions.FileNewWorkspace || action.id == IDEActions.FileNewProject) { if (!exists(_location)) { // show message box with OK and CANCEL buttons, cancel by default, and handle its result - window.showMessageBox(UIString.fromRaw("Cannot create project"d), UIString.fromRaw("The target location does not exist.\nDo you want to create the target directory?"), [ACTION_YES, ACTION_CANCEL], 1, delegate(const Action a) { + window.showMessageBox(UIString.fromId("ERROR_CANNOT_CREATE_PROJECT"c), UIString.fromId("QUESTION_CREATE_DIR"c), [ACTION_YES, ACTION_CANCEL], 1, delegate(const Action a) { if (a.id == StandardAction.Yes) { try { mkdirRecurse(_location); close(action); } catch (Exception e) { setError("Cannot create target location"); - window.showMessageBox(UIString.fromRaw("Cannot create project"d), UIString.fromRaw(getError())); + window.showMessageBox(UIString.fromId("ERROR_CANNOT_CREATE_PROJECT"c), UIString.fromRaw(getError())); } } return true; @@ -288,11 +288,11 @@ class NewProjectDlg : Dialog { return; } if (!validate()) { - window.showMessageBox(UIString.fromRaw("Cannot create project"d), UIString.fromRaw(getError())); + window.showMessageBox(UIString.fromId("ERROR_CANNOT_CREATE_PROJECT"c), UIString.fromRaw(getError())); return; } if (!createProject()) { - window.showMessageBox(UIString.fromRaw("Cannot create project"d), UIString.fromRaw("Failed to create project")); + window.showMessageBox(UIString.fromId("ERROR_CANNOT_CREATE_PROJECT"c), UIString.fromId("ERROR_FAILED_CREATE_PROJECT"c)); return; } newaction.objectParam = _result; @@ -496,8 +496,8 @@ extern (C) int UIAppMain(string[] args) { }; // show message box with content of editors window.mainWidget.childById!Button("btnOk").click = delegate(Widget w) { - window.showMessageBox(UIString.fromRaw("Ok button pressed"d), - UIString.fromRaw("Editors content\nEdit1: "d ~ edit1.text ~ "\nEdit2: "d ~ edit2.text)); + window.showMessageBox(UIString.fromId("MSG_OK_BUTTON"c), + UIString.fromId("EDITOR_CONTENT"c) ~ "\nEdit1: "d ~ edit1.text ~ "\nEdit2: "d ~ edit2.text); return true; }; diff --git a/src/dlangide/ui/settings.d b/src/dlangide/ui/settings.d index 384c094..b5fb8ff 100644 --- a/src/dlangide/ui/settings.d +++ b/src/dlangide/ui/settings.d @@ -13,7 +13,7 @@ public import dlangide.workspace.workspacesettings; StringListValue[] createFaceList(bool monospaceFirst) { StringListValue[] faces; faces.assumeSafeAppend(); - faces ~= StringListValue("Default", "OPTION_DEFAULT"c); + faces ~= StringListValue("Default", UIString.fromId("OPTION_DEFAULT"c)); import dlangui.graphics.fonts; import std.utf : toUTF32; FontFaceProps[] allFaces = FontManager.instance.getFaces(); @@ -153,7 +153,7 @@ SettingsPage createSettingsPages() { SettingsPage terminal = dlang.addChild("dlang/terminal", UIString.fromId("OPTION_TERMINAL"c)); terminal.addExecutableFileNameEdit("dlang/terminal/executable", UIString.fromId("OPTION_TERMINAL_EXECUTABLE"c), "xterm"); - SettingsPage toolchains = dlang.addChild("dlang/toolchains", UIString.fromId("OPTION_TOOLCHANS"c)); + SettingsPage toolchains = dlang.addChild("dlang/toolchains", UIString.fromId("OPTION_TOOLCHAINS"c)); SettingsPage dmdtoolchain = toolchains.addChild("dlang/toolchains/dmd", UIString.fromRaw("DMD"d)); dmdtoolchain.addExecutableFileNameEdit("dlang/toolchains/dmd/executable", UIString.fromId("OPTION_DMD_EXECUTABLE"c), "dmd"); dmdtoolchain.addStringEdit("dlang/toolchains/dmd/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); @@ -174,27 +174,27 @@ SettingsPage createSettingsPages() { SettingsPage createProjectSettingsPages() { SettingsPage res = new SettingsPage("", UIString.fromRaw(""d)); - SettingsPage build = res.addChild("build", UIString.fromRaw("Build"d)); - build.addStringComboBox("build/toolchain", UIString.fromRaw("Toolchain"d), [ - StringListValue("default", "Default"d), + SettingsPage build = res.addChild("build", UIString.fromId("OPTION_BUILD"c)); + build.addStringComboBox("build/toolchain", UIString.fromId("OPTION_TOOLCHAIN"c), [ + StringListValue("default", UIString.fromId("OPTION_DEFAULT"c)), StringListValue("dmd", "DMD"d), StringListValue("ldc", "LDC"d), StringListValue("ldmd", "LDMD"d), StringListValue("gdc", "GDC"d)]); - build.addStringComboBox("build/arch", UIString.fromRaw("Architecture"d), [ - StringListValue("default", "Default"d), + build.addStringComboBox("build/arch", UIString.fromId("OPTION_ARCHITECTURE"c), [ + StringListValue("default", UIString.fromId("OPTION_DEFAULT"c)), StringListValue("x86", "x86"d), StringListValue("x86_64", "x86_64"d), StringListValue("arm", "arm"d), StringListValue("arm64", "arm64"d), ]); - build.addCheckbox("build/verbose", UIString.fromRaw("Verbose"d), true); - build.addStringEdit("build/dub_additional_params", UIString.fromRaw("DUB additional params"d), ""); + build.addCheckbox("build/verbose", UIString.fromId("OPTION_VERBOSE"c), true); + build.addStringEdit("build/dub_additional_params", UIString.fromId("OPTION_DUB_ADDITIONAL_PARAMS"c), ""); - SettingsPage dbg = res.addChild("debug", UIString.fromRaw("Run and Debug"d)); - dbg.addStringEdit("debug/run_args", UIString.fromRaw("Command line args"d), ""); - dbg.addDirNameEdit("debug/working_dir", UIString.fromRaw("Working directory"d), ""); - dbg.addCheckbox("debug/external_console", UIString.fromRaw("Run in external console"d), false); + SettingsPage dbg = res.addChild("debug", UIString.fromId("OPTION_RUN_DEBUG"c)); + dbg.addStringEdit("debug/run_args", UIString.fromId("OPTION_COMMAND_LINE"c), ""); + dbg.addDirNameEdit("debug/working_dir", UIString.fromId("OPTION_WORKING_DIR"c), ""); + dbg.addCheckbox("debug/external_console", UIString.fromId("OPTION_RUN_IN_EXTERNAL_CONSOLE"c), false); return res; } diff --git a/src/dlangide/workspace/idesettings.d b/src/dlangide/workspace/idesettings.d index 2e4f4f1..59be402 100644 --- a/src/dlangide/workspace/idesettings.d +++ b/src/dlangide/workspace/idesettings.d @@ -302,5 +302,10 @@ class IDESettings : SettingsFile { Setting obj =_setting.objectByPath("common", true); obj.setBoolean("autoOpenLastProject", value); } + + /// for saving window state, position, and other UI states + @property Setting uiState() { + return _setting.objectByPath("uiState", true); + } } diff --git a/views/VERSION b/views/VERSION index 63eee66..26731c8 100644 --- a/views/VERSION +++ b/views/VERSION @@ -1 +1 @@ -v0.7.77 \ No newline at end of file +v0.7.79 \ No newline at end of file diff --git a/views/res/i18n/en.ini b/views/res/i18n/en.ini index bc73334..3486036 100644 --- a/views/res/i18n/en.ini +++ b/views/res/i18n/en.ini @@ -21,6 +21,11 @@ EXIT=Exit ALL_FILES=All files SOURCE_FILES=Source files WORKSPACE_AND_PROJECT_FILES=Workspace and project files +IDE_FILES=DlangIDE files + +EDITOR_CONTENT=Editors content +LOCATION=Location +NAME=Name MENU_FILE=&File MENU_FILE_NEW=&Create @@ -128,21 +133,31 @@ HEADER_OPEN_WORKSPACE_OR_PROJECT=Open Workspace or Project HEADER_OPEN_TEXT_FILE=Open Text File HEADER_CLOSE_FILE=Close file HEADER_CLOSE_TAB=Close tab +HEADER_PROJECT_SETTINGS=project settings +HEADER_REMOVE_FILE=Remove file HEADER_SAVE_FILE_AS=Save File As OPTION_ADD_TO_CURRENT_WORKSPACE=Add to current workspace +OPTION_ARCHITECTURE=Architecture OPTION_AUTO_OPEN_LAST_PROJECT=Auto open last project +OPTION_BUILD=Build +OPTION_COMMAND_LINE=Command line args OPTION_COMMON=Common +OPTION_CREATE_NEW_SOLUTION=Create new solution OPTION_CREATE_NEW_WORKSPACE=Create new workspace +OPTION_CREATE_SUBDIRECTORY_FOR_PROJECT=Create subdirectory for project +OPTION_CREATE_SUBDIRECTORY_FOR_WORKSPACE=Create subdirectory for workspace OPTION_DARK=Dark OPTION_DEBUGGER=Debugger OPTION_DEBUGGER_EXECUTABLE=Debugger executable OPTION_DEFAULT=Default +OPTION_DIRECTORY_LAYOUT=Directory layout OPTION_DMD_EXECUTABLE=DMD executable OPTION_DUB_ADDITIONAL_PARAMS=DUB additional params OPTION_DUB_EXECUTABLE=DUB executable OPTION_EDITORS=Editors OPTION_INTERFACE=Interface +OPTION_FILE_PATH=File path OPTION_FONT_ANTIALIASING=Minimum font size for antialiasing OPTION_FONT_ANTIALIASING_ALWAYS_OFF=Always OFF OPTION_FONT_ANTIALIASING_ALWAYS_ON=Always ON @@ -158,26 +173,45 @@ OPTION_GDC_EXECUTABLE=GDC executable OPTION_LANGUAGE=Language OPTION_LDC2_EXECUTABLE=LDC2 executable OPTION_LDMD2_EXECUTABLE=LDMD2 executable +OPTION_MODULE_NAME=Module name +OPTION_NEW_PROJECT=New project +OPTION_NEW_SOURCE_FILE=New source file +OPTION_NEW_WORKSPACE=New workspace +OPTION_PROJECT_NAME=Project name +OPTION_PROJECT_TEMPLATE=Project template OPTION_RDMD_ADDITIONAL_PARAMS=rdmd additional params OPTION_RDMD_EXECUTABLE=rdmd executable +OPTION_RUN_IN_EXTERNAL_CONSOLE=Run in external console +OPTION_RUN_DEBUG=Run and Debug OPTION_SHOW_SPACES=Show white space marks OPTION_SHOW_TABS=Show tab position marks OPTION_SMART_INDENTS=Smart indents OPTION_SMART_INDENTS_PASTE=Smart indent after paste OPTION_TAB=Tab size +OPTION_TEMPLATE_DESCR=Template description OPTION_TEXT_EDITORS=Text Editors OPTION_TERMINAL=Terminal OPTION_TERMINAL_EXECUTABLE=Terminal executable OPTION_THEME=Theme -OPTION_TOOLCHANS=Toolchains +OPTION_TOOLCHAIN=Toolchain +OPTION_TOOLCHAINS=Toolchains +OPTION_VERBOSE=Verbose +OPTION_WORKING_DIR=Working directory +OPTION_WORKSPACE_NAME=Workspace name OPTION_USE_SPACES=Use spaces for tabs ERROR=Error +ERROR_CANNOT_CREATE_PROJECT=Cannot create project ERROR_CANNOT_DEBUG_PROJECT=Cannot debug project +ERROR_CANNOT_FIND_EXEC=Cannot find executable file +ERROR_CANNOT_RUN_PROJECT=Cannot run project +ERROR_FAILED_CREATE_PROJECT=Failed to create project ERROR_STARTUP_PROJECT_ABSENT=Startup project is not specified ERROR_INVALID_NUMBER=Invalid number +ERROR_INVALID_PARAMETERS=Invalid parameters ERROR_INVALID_WORKSPACE_FILE=Invalid workspace file ERROR_INVALID_WS_OR_PROJECT_FILE=This file is not a valid workspace or project file +ERROR_NO_DEBUGGER=No debugger executable specified in settings ERROR_NO_SUCH_LINE=No such line ERROR_OPEN_FILE=File open error ERROR_OPEN_PROJECT=Cannot open project @@ -188,12 +222,16 @@ ERROR_OPENING_WORKSPACE=Error occured while opening workspace MSG_FILE_CONTENT_CHANGED=Content of this file has been changed. MSG_TAB_CONTENT_CHANGED=Content of tab has been changed +MSG_OK_BUTTON=Ok button pressed MSG_OPEN_PROJECT=Open project MSG_PROJECT_ALREADY_OPENED=Project is already in workspace +MSG_SELECT_DIR=Select directory MSG_STARTING=Starting MSG_STARTING_DEBUGGER=Starting debugger for MSG_TRY_OPEN_PROJECT=Trying to open project from DEBUGGING=debugging... RUNNING=running... +QUESTION_CREATE_DIR=The target location does not exist. Do you want to create the target directory? QUESTION_NEW_WORKSPACE=Do you want to create new workspace or use current one? +QUESTION_REMOVE_FILE=Do you want to remove file diff --git a/views/res/i18n/ru.ini b/views/res/i18n/ru.ini index 1c66b31..ced1a2f 100644 --- a/views/res/i18n/ru.ini +++ b/views/res/i18n/ru.ini @@ -21,12 +21,17 @@ EXIT=Выход ALL_FILES=Все файлы SOURCE_FILES=Исходники WORKSPACE_AND_PROJECT_FILES=Файлы проектов и раб. прост. +IDE_FILES=Файлы DlangIDE + +EDITOR_CONTENT=Содержимое редактора +LOCATION=Место +NAME=Имя MENU_FILE=&Файл MENU_FILE_NEW=&Создать MENU_FILE_NEW_SOURCE_FILE=Новый файл MENU_FILE_NEW_PROJECT=Новый проект -MENU_FILE_NEW_WORKSPACE=Новый рабочее пространство +MENU_FILE_NEW_WORKSPACE=Новое рабочее пространство MENU_FILE_OPEN=&Открыть файл MENU_FILE_OPEN_WORKSPACE=Открыть проект или рабочее пространство... MENU_FILE_OPEN_RECENT=Открыть недавние @@ -128,21 +133,31 @@ HEADER_OPEN_WORKSPACE_OR_PROJECT=Открыть рабочее простран HEADER_OPEN_TEXT_FILE=Открыть текстовый файл HEADER_CLOSE_FILE=Закрыть файл HEADER_CLOSE_TAB=Закрыть вкладку +HEADER_PROJECT_SETTINGS=настройки проекта +HEADER_REMOVE_FILE=Удалить файл HEADER_SAVE_FILE_AS=Сохранить как OPTION_ADD_TO_CURRENT_WORKSPACE=Добавить в текущее пр-во +OPTION_ARCHITECTURE=Архитектура OPTION_AUTO_OPEN_LAST_PROJECT=Авт.открывать последний проект +OPTION_BUILD=Сборка +OPTION_COMMAND_LINE=Аргументы командной строки OPTION_COMMON=Общие +OPTION_CREATE_NEW_SOLUTION=Создать новое решение OPTION_CREATE_NEW_WORKSPACE=Создать новое пр-во +OPTION_CREATE_SUBDIRECTORY_FOR_PROJECT=Создать подкаталог для проекта +OPTION_CREATE_SUBDIRECTORY_FOR_WORKSPACE=Создать подкаталог для раб.пространства OPTION_DARK=Темная OPTION_DEBUGGER=Отладчик OPTION_DEBUGGER_EXECUTABLE=Исполняемый файл отладчика OPTION_DEFAULT=По умолчанию +OPTION_DIRECTORY_LAYOUT=Структура каталога OPTION_DMD_EXECUTABLE=Исполняемый файл DMD OPTION_DUB_ADDITIONAL_PARAMS=Доп.параметры DUB OPTION_DUB_EXECUTABLE=Исполняемый файл DUB OPTION_EDITORS=Редакторы OPTION_INTERFACE=Внешний вид +OPTION_FILE_PATH=Путь к файлу OPTION_FONT_ANTIALIASING=Минимальный размер шрифта для сглаживания OPTION_FONT_ANTIALIASING_ALWAYS_OFF=Всегда выключено OPTION_FONT_ANTIALIASING_ALWAYS_ON=Всегда включено @@ -157,26 +172,45 @@ OPTION_GDC_EXECUTABLE=Исполняемый файл GDC OPTION_LANGUAGE=Язык OPTION_LDC2_EXECUTABLE=Исполняемый файл LDC2 OPTION_LDMD2_EXECUTABLE=Исполняемый файл LDMD2 +OPTION_MODULE_NAME=Имя модуля +OPTION_NEW_PROJECT=Новый проект +OPTION_NEW_SOURCE_FILE=Новый исходный файл +OPTION_NEW_WORKSPACE=Новое рабочее пространство +OPTION_PROJECT_NAME=Имя проекта +OPTION_PROJECT_TEMPLATE=Шаблон проекта OPTION_RDMD_ADDITIONAL_PARAMS=Доп.параметры rdmd OPTION_RDMD_EXECUTABLE=Исполняемый файл rdmd +OPTION_RUN_IN_EXTERNAL_CONSOLE=Запустить во внешней консоли +OPTION_RUN_DEBUG=Запуск и отладка OPTION_SHOW_SPACES=Показать пробелы OPTION_SHOW_TABS=Показать табуляцию OPTION_SMART_INDENTS=Умные отступы OPTION_SMART_INDENTS_PASTE=Умные отступы после вставки OPTION_TAB=Размер Tab +OPTION_TEMPLATE_DESCR=Описание шаблона OPTION_TEXT_EDITORS=Текстовые редакторы OPTION_TERMINAL=Командная строка OPTION_TERMINAL_EXECUTABLE=Исполняемый файл терминала OPTION_THEME=Тема оформления -OPTION_TOOLCHANS=Наборы инструментов +OPTION_TOOLCHAIN=Инструмент +OPTION_TOOLCHAINS=Наборы инструментов +OPTION_VERBOSE=Показать подробности +OPTION_WORKING_DIR=Рабочий каталог +OPTION_WORKSPACE_NAME=Имя рабочего пространства OPTION_USE_SPACES=Использовать пробелы вместо табуляции ERROR=Ошибка +ERROR_CANNOT_CREATE_PROJECT=Не могу создать проект ERROR_CANNOT_DEBUG_PROJECT=Невозможно отлаживать проект +ERROR_CANNOT_FIND_EXEC=Не могу найти исполняемый файл +ERROR_CANNOT_RUN_PROJECT=Невозможно запустить проект +ERROR_FAILED_CREATE_PROJECT=Ошибка создания проекта ERROR_STARTUP_PROJECT_ABSENT=Стартовый проект не указан ERROR_INVALID_NUMBER=Неверное число +ERROR_INVALID_PARAMETERS=Неверные параметры ERROR_INVALID_WORKSPACE_FILE=Неверный файл раб.пространства ERROR_INVALID_WS_OR_PROJECT_FILE=Файл не является ни файлом раб.пространства, ни проектным +ERROR_NO_DEBUGGER=Отладчика нет в настройках ERROR_NO_SUCH_LINE=Строка не существует ERROR_OPEN_FILE=Невозможно открыть файл ERROR_OPEN_PROJECT=Невозможно открыть проект @@ -187,12 +221,16 @@ ERROR_OPENING_WORKSPACE=Ошибка в ходе открытия рабочег MSG_FILE_CONTENT_CHANGED=Содержимое этого файла изменено. MSG_TAB_CONTENT_CHANGED=Содержимое вкладки изменено +MSG_OK_BUTTON=Нажата кнопка Ok MSG_OPEN_PROJECT=Открыть проект MSG_PROJECT_ALREADY_OPENED=Проект уже в рабочем пространстве +MSG_SELECT_DIR=Выберите каталог MSG_STARTING=Выполняем MSG_STARTING_DEBUGGER=Стартуем отладчик для MSG_TRY_OPEN_PROJECT=Попытка открыть проект из DEBUGGING=отладка... RUNNING=выполнение... +QUESTION_CREATE_DIR=Целевой каталог не существует. Желаете создать? QUESTION_NEW_WORKSPACE=Открыть новое рабочее пространство или использовать текущее? +QUESTION_REMOVE_FILE=Вы действительно хотите удалить файл