WorkspaceDialog.qml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. // Copyright (c) 2022 Ultimaker B.V.
  2. // Cura is released under the terms of the LGPLv3 or higher.
  3. import QtQuick 2.10
  4. import QtQuick.Controls 2.3
  5. import QtQuick.Layouts 1.3
  6. import QtQuick.Window 2.2
  7. import UM 1.5 as UM
  8. import Cura 1.1 as Cura
  9. UM.Dialog
  10. {
  11. id: workspaceDialog
  12. title: catalog.i18nc("@title:window", "Open Project")
  13. margin: UM.Theme.getSize("default_margin").width
  14. minimumWidth: UM.Theme.getSize("modal_window_minimum").width
  15. minimumHeight: UM.Theme.getSize("modal_window_minimum").height
  16. backgroundColor: UM.Theme.getColor("detail_background")
  17. headerComponent: Rectangle
  18. {
  19. height: childrenRect.height + 2 * UM.Theme.getSize("default_margin").height
  20. color: UM.Theme.getColor("main_background")
  21. UM.Label
  22. {
  23. id: titleLabel
  24. text: catalog.i18nc("@action:title", "Summary - Cura Project")
  25. font: UM.Theme.getFont("large")
  26. anchors.top: parent.top
  27. anchors.left: parent.left
  28. anchors.topMargin: UM.Theme.getSize("default_margin").height
  29. anchors.leftMargin: UM.Theme.getSize("default_margin").height
  30. }
  31. }
  32. Rectangle
  33. {
  34. anchors.fill: parent
  35. UM.I18nCatalog { id: catalog; name: "cura" }
  36. color: UM.Theme.getColor("main_background")
  37. Flickable
  38. {
  39. id: dialogSummaryItem
  40. width: parent.width
  41. height: parent.height
  42. clip: true
  43. contentHeight: contentColumn.height
  44. ScrollBar.vertical: UM.ScrollBar { id: scrollbar }
  45. ListModel
  46. {
  47. id: resolveStrategiesModel
  48. // Instead of directly adding the list elements, we add them afterwards.
  49. // This is because it's impossible to use setting function results to be bound to listElement properties directly.
  50. // See http://stackoverflow.com/questions/7659442/listelement-fields-as-properties
  51. Component.onCompleted:
  52. {
  53. append({"key": "override", "label": catalog.i18nc("@action:ComboBox Update/override existing profile", "Update existing")});
  54. append({"key": "new", "label": catalog.i18nc("@action:ComboBox Save settings in a new profile", "Create new")});
  55. }
  56. }
  57. Column
  58. {
  59. id: contentColumn
  60. width: parent.width - scrollbar.width - UM.Theme.getSize("default_margin").width
  61. height: childrenRect.height
  62. spacing: UM.Theme.getSize("default_margin").height
  63. leftPadding: UM.Theme.getSize("default_margin").width
  64. rightPadding: UM.Theme.getSize("default_margin").width
  65. WorkspaceSection
  66. {
  67. id: printerSection
  68. title: catalog.i18nc("@action:label", "Printer settings")
  69. iconSource: UM.Theme.getIcon("Printer")
  70. content: Column
  71. {
  72. spacing: UM.Theme.getSize("default_margin").height
  73. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  74. WorkspaceRow
  75. {
  76. leftLabelText: catalog.i18nc("@action:label", "Type")
  77. rightLabelText: manager.machineType
  78. }
  79. WorkspaceRow
  80. {
  81. leftLabelText: catalog.i18nc("@action:label", manager.isPrinterGroup ? "Printer Group" : "Printer Name")
  82. rightLabelText: manager.machineName
  83. }
  84. }
  85. comboboxTitle: catalog.i18nc("@action:label", "Open With")
  86. comboboxTooltipText: catalog.i18nc("@info:tooltip", "Printer settings will be updated to match the settings saved with the project.")
  87. comboboxVisible: workspaceDialog.visible && manager.updatableMachinesModel.count > 1
  88. combobox: Cura.MachineSelector
  89. {
  90. id: machineSelector
  91. headerCornerSide: Cura.RoundedRectangle.Direction.All
  92. width: parent.width
  93. height: parent.height
  94. machineListModel: manager.updatableMachinesModel
  95. machineName: manager.machineName
  96. isConnectedCloudPrinter: false
  97. isCloudRegistered: false
  98. isNetworkPrinter: manager.isNetworked
  99. isGroup: manager.isAbstractMachine
  100. connectionStatus: ""
  101. minDropDownWidth: machineSelector.width
  102. buttons: [
  103. Cura.SecondaryButton
  104. {
  105. id: createNewPrinter
  106. text: catalog.i18nc("@button", "Create new")
  107. fixedWidthMode: true
  108. width: parent.width - leftPadding * 1.5
  109. onClicked:
  110. {
  111. machineSelector.machineName = catalog.i18nc("@button", "Create new")
  112. manager.setIsAbstractMachine(false)
  113. manager.setIsNetworkedMachine(false)
  114. toggleContent()
  115. manager.setResolveStrategy("machine", "new")
  116. }
  117. }
  118. ]
  119. onSelectPrinter: function(machine)
  120. {
  121. toggleContent();
  122. manager.setResolveStrategy("machine", "override")
  123. manager.setMachineToOverride(machine.id)
  124. manager.setIsAbstractMachine(machine.isAbstractMachine)
  125. manager.setIsNetworkedMachine(machine.isNetworked)
  126. machineSelector.machineName = machine.name
  127. }
  128. }
  129. }
  130. WorkspaceSection
  131. {
  132. id: profileSection
  133. title: catalog.i18nc("@action:label", "Profile settings")
  134. iconSource: UM.Theme.getIcon("Sliders")
  135. content: Column
  136. {
  137. id: profileSettingsValuesTable
  138. spacing: UM.Theme.getSize("default_margin").height
  139. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  140. WorkspaceRow
  141. {
  142. leftLabelText: catalog.i18nc("@action:label", "Name")
  143. rightLabelText: manager.qualityName
  144. }
  145. WorkspaceRow
  146. {
  147. leftLabelText: catalog.i18nc("@action:label", "Intent")
  148. rightLabelText: manager.intentName
  149. }
  150. WorkspaceRow
  151. {
  152. leftLabelText: catalog.i18nc("@action:label", "Not in profile")
  153. rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings)
  154. visible: manager.numUserSettings != 0
  155. }
  156. WorkspaceRow
  157. {
  158. leftLabelText: catalog.i18nc("@action:label", "Derivative from")
  159. rightLabelText: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
  160. visible: manager.numSettingsOverridenByQualityChanges != 0
  161. }
  162. }
  163. comboboxVisible: manager.qualityChangesConflict
  164. combobox: Cura.ComboBox
  165. {
  166. id: qualityChangesResolveComboBox
  167. model: resolveStrategiesModel
  168. textRole: "label"
  169. visible: manager.qualityChangesConflict
  170. // This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
  171. currentIndex:
  172. {
  173. currentIndex = 0
  174. }
  175. onCurrentIndexChanged:
  176. {
  177. manager.setResolveStrategy("quality_changes", resolveStrategiesModel.get(currentIndex).key)
  178. }
  179. }
  180. }
  181. WorkspaceSection
  182. {
  183. id: materialSection
  184. title: catalog.i18nc("@action:label", "Material settings")
  185. iconSource: UM.Theme.getIcon("Spool")
  186. content: Column
  187. {
  188. spacing: UM.Theme.getSize("default_margin").height
  189. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  190. Repeater
  191. {
  192. model: manager.materialLabels
  193. delegate: WorkspaceRow
  194. {
  195. leftLabelText: catalog.i18nc("@action:label", "Name")
  196. rightLabelText: modelData
  197. }
  198. }
  199. }
  200. comboboxVisible: manager.materialConflict
  201. combobox: Cura.ComboBox
  202. {
  203. id: materialResolveComboBox
  204. model: resolveStrategiesModel
  205. textRole: "label"
  206. visible: manager.materialConflict
  207. // This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
  208. currentIndex:
  209. {
  210. currentIndex = 0
  211. }
  212. onCurrentIndexChanged:
  213. {
  214. manager.setResolveStrategy("material", resolveStrategiesModel.get(currentIndex).key)
  215. }
  216. }
  217. }
  218. WorkspaceSection
  219. {
  220. id: visibilitySection
  221. title: catalog.i18nc("@action:label", "Setting visibility")
  222. iconSource: UM.Theme.getIcon("Eye")
  223. content: Column
  224. {
  225. spacing: UM.Theme.getSize("default_margin").height
  226. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  227. bottomPadding: UM.Theme.getSize("narrow_margin").height
  228. WorkspaceRow
  229. {
  230. leftLabelText: catalog.i18nc("@action:label", "Mode")
  231. rightLabelText: manager.activeMode
  232. }
  233. WorkspaceRow
  234. {
  235. leftLabelText: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(manager.totalNumberOfSettings)
  236. rightLabelText: manager.activeMode
  237. visible: manager.hasVisibleSettingsField
  238. }
  239. }
  240. }
  241. Row
  242. {
  243. id: clearBuildPlateWarning
  244. width: parent.width
  245. height: childrenRect.height
  246. spacing: UM.Theme.getSize("default_margin").width
  247. visible: manager.hasObjectsOnPlate
  248. UM.ColorImage
  249. {
  250. width: warningLabel.height
  251. height: width
  252. source: UM.Theme.getIcon("Information")
  253. color: UM.Theme.getColor("text")
  254. }
  255. UM.Label
  256. {
  257. id: warningLabel
  258. text: catalog.i18nc("@action:warning", "Loading a project will clear all models on the build plate.")
  259. }
  260. }
  261. }
  262. }
  263. }
  264. property bool warning: manager.missingPackages.length > 0
  265. footerComponent: Rectangle
  266. {
  267. color: warning ? UM.Theme.getColor("warning") : "transparent"
  268. anchors.bottom: parent.bottom
  269. width: parent.width
  270. height: childrenRect.height + (warning ? 2 * workspaceDialog.margin : workspaceDialog.margin)
  271. Column
  272. {
  273. height: childrenRect.height
  274. spacing: workspaceDialog.margin
  275. anchors.leftMargin: workspaceDialog.margin
  276. anchors.rightMargin: workspaceDialog.margin
  277. anchors.bottomMargin: workspaceDialog.margin
  278. anchors.topMargin: warning ? workspaceDialog.margin : 0
  279. anchors.left: parent.left
  280. anchors.right: parent.right
  281. anchors.top: parent.top
  282. RowLayout
  283. {
  284. id: warningRow
  285. height: childrenRect.height
  286. visible: warning
  287. spacing: workspaceDialog.margin
  288. UM.ColorImage
  289. {
  290. width: UM.Theme.getSize("extruder_icon").width
  291. height: UM.Theme.getSize("extruder_icon").height
  292. source: UM.Theme.getIcon("Warning")
  293. }
  294. UM.Label
  295. {
  296. id: warningText
  297. text: catalog.i18nc("@label", "The material used in this project is currently not installed in Cura.<br/>Install the material profile and reopen the project.")
  298. }
  299. }
  300. Loader
  301. {
  302. width: parent.width
  303. height: childrenRect.height
  304. sourceComponent: buttonRow
  305. }
  306. }
  307. }
  308. buttonSpacing: UM.Theme.getSize("wide_margin").width
  309. rightButtons: [
  310. Cura.TertiaryButton
  311. {
  312. visible: !warning
  313. text: catalog.i18nc("@action:button", "Cancel")
  314. onClicked: reject()
  315. },
  316. Cura.PrimaryButton
  317. {
  318. visible: !warning
  319. text: catalog.i18nc("@action:button", "Open")
  320. onClicked: accept()
  321. },
  322. Cura.TertiaryButton
  323. {
  324. visible: warning
  325. text: catalog.i18nc("@action:button", "Open project anyway")
  326. onClicked: {
  327. manager.showMissingMaterialsWarning();
  328. accept();
  329. }
  330. },
  331. Cura.PrimaryButton
  332. {
  333. visible: warning
  334. text: catalog.i18nc("@action:button", "Install missing material")
  335. onClicked: manager.installMissingPackages()
  336. }
  337. ]
  338. onClosing: manager.notifyClosed()
  339. onRejected: manager.onCancelButtonClicked()
  340. onAccepted: manager.onOkButtonClicked()
  341. onVisibleChanged:
  342. {
  343. if (visible)
  344. {
  345. // Force relead the comboboxes
  346. // Since this dialog is only created once the first time you open it, these comboxes need to be reloaded
  347. // each time it is shown after the first time so that the indexes will update correctly.
  348. materialSection.reloadValues()
  349. profileSection.reloadValues()
  350. printerSection.reloadValues()
  351. }
  352. }
  353. }