SaveAs.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /**
  2. * Copyright (c) 2011-2018 by Andrew Mustun. All rights reserved.
  3. *
  4. * This file is part of the QCAD project.
  5. *
  6. * QCAD is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * QCAD is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with QCAD.
  18. */
  19. include("../Save/Save.js");
  20. include("scripts/File/NewFile/NewFile.js");
  21. include("scripts/Tools/arguments.js");
  22. /**
  23. * This action handles all user interaction to save drawings under a new name.
  24. */
  25. function SaveAs(guiAction) {
  26. Save.call(this, guiAction);
  27. if (!isNull(guiAction)) {
  28. this.args = guiAction.getArguments();
  29. }
  30. }
  31. SaveAs.prototype = new Save();
  32. SaveAs.getPreferencesCategory = function() {
  33. return [ qsTr("File"), qsTr("Open/Save")];
  34. };
  35. SaveAs.initPreferences = function(pageWidget, calledByPrefDialog, document) {
  36. var widgets = getWidgets(pageWidget);
  37. var filterStrings = RFileExporterRegistry.getFilterStrings();
  38. filterStrings = translateFilterStrings(filterStrings);
  39. // Offer only a limited choice here as not all file format versions
  40. // are suitable for saving all information (e.g. 24 bit colors):
  41. var defaultIndex = 0;
  42. for (var i=0; i<filterStrings.length; i++) {
  43. var filterString = filterStrings[i];
  44. if (File.isRecommendedVersion(filterString)) {
  45. widgets["Filter"].addItem(filterString);
  46. if (filterString.contains("R27") && filterString.contains("*.dxf")) {
  47. defaultIndex = widgets["Filter"].count-1;
  48. }
  49. }
  50. }
  51. widgets["Filter"].currentIndex = defaultIndex;
  52. };
  53. SaveAs.prototype.beginEvent = function() {
  54. File.prototype.beginEvent.call(this);
  55. var appWin = EAction.getMainWindow();
  56. var i;
  57. var filterStrings = RFileExporterRegistry.getFilterStrings();
  58. filterStrings = translateFilterStrings(filterStrings);
  59. if (filterStrings.length===0) {
  60. EAction.handleUserWarning(qsTr("No export filters have been found. Aborting..."));
  61. this.terminate();
  62. return;
  63. }
  64. var nameFilter;
  65. var file;
  66. var forceOverwrite = false;
  67. if (!isNull(this.args) && this.args.length>=1) {
  68. forceOverwrite = testArgument(this.args, "-f", "-force");
  69. file = this.args[this.args.length-1];
  70. if (!new QFileInfo(file).isAbsolute()) {
  71. file = RSettings.getLaunchPath() + QDir.separator + file;
  72. }
  73. nameFilter = getArgument(this.args, "-t", "-filter");
  74. }
  75. else {
  76. var lastSaveAsFileDir = RSettings.getStringValue("SaveAs/Path", QDir.homePath());
  77. var defaultNameFilter = RSettings.getStringValue("SaveAs/Filter", "");
  78. var fileDialog = new QFileDialog(appWin);
  79. fileDialog.setOption(QFileDialog.DontUseNativeDialog, getDontUseNativeDialog());
  80. // overwrite is handled after extension has been added:
  81. fileDialog.setOption(QFileDialog.DontConfirmOverwrite, true);
  82. if (!isNull(QFileDialog.DontUseCustomDirectoryIcons)) {
  83. fileDialog.setOption(QFileDialog.DontUseCustomDirectoryIcons, true);
  84. }
  85. fileDialog.fileMode = QFileDialog.AnyFile;
  86. fileDialog.acceptMode = QFileDialog.AcceptSave;
  87. fileDialog.setNameFilters(filterStrings);
  88. var fileName = this.getDocument().getFileName();
  89. var fileInfo = new QFileInfo(fileName);
  90. var suffix = fileInfo.suffix().toLowerCase();
  91. // select first name filter in case everything else fails:
  92. fileDialog.selectNameFilter(filterStrings[0]);
  93. if (suffix.length!==0 && !defaultNameFilter.containsIgnoreCase(suffix)) {
  94. // preselect first name filter that matches current extension:
  95. for (i=0; i<filterStrings.length; ++i) {
  96. // for DXF, DWG:
  97. if (suffix==="dxf" || suffix==="dwg") {
  98. if (filterStrings[i].contains("R27") && filterStrings[i].contains("*." + suffix)) {
  99. fileDialog.selectNameFilter(filterStrings[i]);
  100. break;
  101. }
  102. }
  103. else {
  104. // for CXF, etc.:
  105. if (filterStrings[i].contains("*." + suffix)) {
  106. fileDialog.selectNameFilter(filterStrings[i]);
  107. break;
  108. }
  109. }
  110. }
  111. }
  112. else {
  113. // preselect configured name filter:
  114. if (defaultNameFilter.length===0) {
  115. // preselect default name filter DXF R27:
  116. for (i=0; i<filterStrings.length; ++i) {
  117. if (filterStrings[i].contains("R27") && filterStrings[i].contains("*.dxf")) {
  118. fileDialog.selectNameFilter(filterStrings[i]);
  119. break;
  120. }
  121. }
  122. }
  123. else {
  124. fileDialog.selectNameFilter(defaultNameFilter);
  125. }
  126. }
  127. if (fileName.length!==0) {
  128. fileDialog.setDirectory(fileInfo.absolutePath());
  129. fileDialog.selectFile(fileInfo.absoluteFilePath());
  130. }
  131. else {
  132. fileDialog.setDirectory(lastSaveAsFileDir);
  133. }
  134. fileDialog.setLabelText(QFileDialog.FileType, qsTr("Format:"));
  135. // global function qcadInitFileDialog may be registered to perform
  136. // additional initialization
  137. if (typeof qcadInitFileDialog!="undefined" && isFunction(qcadInitFileDialog)) {
  138. qcadInitFileDialog(fileDialog);
  139. }
  140. if (!fileDialog.exec()) {
  141. destr(fileDialog);
  142. EAction.activateMainWindow();
  143. this.terminate();
  144. return;
  145. }
  146. RSettings.setValue("SaveAs/Path", fileDialog.directory().absolutePath());
  147. file = fileDialog.selectedFiles()[0];
  148. nameFilter = fileDialog.selectedNameFilter();
  149. destr(fileDialog);
  150. EAction.activateMainWindow();
  151. }
  152. this.save(file, nameFilter, !forceOverwrite);
  153. var mdiArea = EAction.getMdiArea();
  154. if (!isNull(mdiArea)) {
  155. mdiArea.updateTabBar();
  156. NewFile.updateTitle();
  157. }
  158. this.terminate();
  159. };