WorkspaceDialog.qml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  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 == catalog.i18nc("@button", "Create new") ? "" : 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. toggleContent()
  112. manager.setResolveStrategy("machine", "new")
  113. machineSelector.machineName = catalog.i18nc("@button", "Create new")
  114. manager.setIsAbstractMachine(false)
  115. manager.setIsNetworkedMachine(false)
  116. }
  117. }
  118. ]
  119. onSelectPrinter: function(machine)
  120. {
  121. toggleContent();
  122. machineSelector.machineName = machine.name
  123. manager.setResolveStrategy("machine", "override")
  124. manager.setMachineToOverride(machine.id)
  125. manager.setIsAbstractMachine(machine.isAbstractMachine)
  126. manager.setIsNetworkedMachine(machine.isNetworked)
  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. UM.CheckBox
  163. {
  164. text: catalog.i18nc("@action:checkbox", "Select the same profile")
  165. enabled: manager.isCompatibleMachine
  166. onEnabledChanged: checked = enabled
  167. tooltip: enabled ? "" : catalog.i18nc("@tooltip", "You can use the same profile only if you have the same printer as the project was published with")
  168. visible: manager.hasVisibleSelectSameProfile
  169. }
  170. }
  171. comboboxVisible: manager.qualityChangesConflict
  172. combobox: Cura.ComboBox
  173. {
  174. id: qualityChangesResolveComboBox
  175. model: resolveStrategiesModel
  176. textRole: "label"
  177. visible: manager.qualityChangesConflict
  178. contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
  179. textFont: UM.Theme.getFont("medium")
  180. background: Cura.RoundedRectangle
  181. {
  182. border.width: UM.Theme.getSize("default_lining").width
  183. border.color: UM.Theme.getColor("lining")
  184. color: qualityChangesResolveComboBox.hovered ? UM.Theme.getColor("expandable_hover") : UM.Theme.getColor("action_button")
  185. cornerSide: Cura.RoundedRectangle.Direction.All
  186. radius: UM.Theme.getSize("default_radius").width
  187. }
  188. // This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
  189. currentIndex:
  190. {
  191. currentIndex = 0
  192. }
  193. onCurrentIndexChanged:
  194. {
  195. manager.setResolveStrategy("quality_changes", resolveStrategiesModel.get(currentIndex).key)
  196. }
  197. }
  198. }
  199. WorkspaceSection
  200. {
  201. id: materialSection
  202. title: catalog.i18nc("@action:label", "Material settings")
  203. iconSource: UM.Theme.getIcon("Spool")
  204. content: Column
  205. {
  206. spacing: UM.Theme.getSize("default_margin").height
  207. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  208. Repeater
  209. {
  210. model: manager.materialLabels
  211. delegate: WorkspaceRow
  212. {
  213. leftLabelText: catalog.i18nc("@action:label", "Name")
  214. rightLabelText: modelData
  215. }
  216. }
  217. }
  218. comboboxVisible: manager.materialConflict
  219. combobox: Cura.ComboBox
  220. {
  221. id: materialResolveComboBox
  222. model: resolveStrategiesModel
  223. textRole: "label"
  224. visible: manager.materialConflict
  225. contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
  226. textFont: UM.Theme.getFont("medium")
  227. background: Cura.RoundedRectangle
  228. {
  229. border.width: UM.Theme.getSize("default_lining").width
  230. border.color: UM.Theme.getColor("lining")
  231. color: materialResolveComboBox.hovered ? UM.Theme.getColor("expandable_hover") : UM.Theme.getColor("action_button")
  232. cornerSide: Cura.RoundedRectangle.Direction.All
  233. radius: UM.Theme.getSize("default_radius").width
  234. }
  235. // This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
  236. currentIndex:
  237. {
  238. currentIndex = 0
  239. }
  240. onCurrentIndexChanged:
  241. {
  242. manager.setResolveStrategy("material", resolveStrategiesModel.get(currentIndex).key)
  243. }
  244. }
  245. }
  246. WorkspaceSection
  247. {
  248. id: visibilitySection
  249. title: catalog.i18nc("@action:label", "Setting visibility")
  250. iconSource: UM.Theme.getIcon("Eye")
  251. content: Column
  252. {
  253. spacing: UM.Theme.getSize("default_margin").height
  254. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  255. bottomPadding: UM.Theme.getSize("narrow_margin").height
  256. WorkspaceRow
  257. {
  258. leftLabelText: catalog.i18nc("@action:label", "Mode")
  259. rightLabelText: manager.activeMode
  260. }
  261. WorkspaceRow
  262. {
  263. leftLabelText: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(manager.totalNumberOfSettings)
  264. rightLabelText: manager.activeMode
  265. visible: manager.hasVisibleSettingsField
  266. }
  267. }
  268. }
  269. Row
  270. {
  271. id: clearBuildPlateWarning
  272. width: parent.width
  273. height: childrenRect.height
  274. spacing: UM.Theme.getSize("default_margin").width
  275. visible: manager.hasObjectsOnPlate
  276. UM.ColorImage
  277. {
  278. width: warningLabel.height
  279. height: width
  280. source: UM.Theme.getIcon("Information")
  281. color: UM.Theme.getColor("text")
  282. }
  283. UM.Label
  284. {
  285. id: warningLabel
  286. text: catalog.i18nc("@action:warning", "Loading a project will clear all models on the build plate.")
  287. }
  288. }
  289. }
  290. }
  291. }
  292. property bool warning: manager.missingPackages.length > 0
  293. footerComponent: Rectangle
  294. {
  295. color: warning ? UM.Theme.getColor("warning") : "transparent"
  296. anchors.bottom: parent.bottom
  297. width: parent.width
  298. height: childrenRect.height + (warning ? 2 * workspaceDialog.margin : workspaceDialog.margin)
  299. Column
  300. {
  301. height: childrenRect.height
  302. spacing: workspaceDialog.margin
  303. anchors.leftMargin: workspaceDialog.margin
  304. anchors.rightMargin: workspaceDialog.margin
  305. anchors.bottomMargin: workspaceDialog.margin
  306. anchors.topMargin: warning ? workspaceDialog.margin : 0
  307. anchors.left: parent.left
  308. anchors.right: parent.right
  309. anchors.top: parent.top
  310. RowLayout
  311. {
  312. id: warningRow
  313. height: childrenRect.height
  314. visible: warning
  315. spacing: workspaceDialog.margin
  316. UM.ColorImage
  317. {
  318. width: UM.Theme.getSize("extruder_icon").width
  319. height: UM.Theme.getSize("extruder_icon").height
  320. source: UM.Theme.getIcon("Warning")
  321. }
  322. UM.Label
  323. {
  324. id: warningText
  325. text: catalog.i18nc("@label", "This project contains materials or plugins that are currently not installed in Cura.<br/>Install the missing packages and reopen the project.")
  326. }
  327. }
  328. Loader
  329. {
  330. width: parent.width
  331. height: childrenRect.height
  332. sourceComponent: buttonRow
  333. }
  334. }
  335. }
  336. buttonSpacing: UM.Theme.getSize("wide_margin").width
  337. rightButtons: [
  338. Cura.TertiaryButton
  339. {
  340. visible: !warning
  341. text: catalog.i18nc("@action:button", "Cancel")
  342. onClicked: reject()
  343. },
  344. Cura.PrimaryButton
  345. {
  346. visible: !warning
  347. text: catalog.i18nc("@action:button", "Open")
  348. onClicked: accept()
  349. },
  350. Cura.TertiaryButton
  351. {
  352. visible: warning
  353. text: catalog.i18nc("@action:button", "Open project anyway")
  354. onClicked: {
  355. manager.showMissingMaterialsWarning();
  356. accept();
  357. }
  358. },
  359. Cura.PrimaryButton
  360. {
  361. visible: warning
  362. text: catalog.i18nc("@action:button", "Install missing packages")
  363. onClicked: manager.installMissingPackages()
  364. }
  365. ]
  366. onClosing: manager.notifyClosed()
  367. onRejected: manager.onCancelButtonClicked()
  368. onAccepted: manager.onOkButtonClicked()
  369. onVisibleChanged:
  370. {
  371. if (visible)
  372. {
  373. // Force relead the comboboxes
  374. // Since this dialog is only created once the first time you open it, these comboxes need to be reloaded
  375. // each time it is shown after the first time so that the indexes will update correctly.
  376. materialSection.reloadValues()
  377. profileSection.reloadValues()
  378. printerSection.reloadValues()
  379. }
  380. }
  381. }