WorkspaceDialog.qml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  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.6 as UM
  8. import Cura 1.1 as Cura
  9. UM.Dialog
  10. {
  11. id: workspaceDialog
  12. title: manager.isUcp? catalog.i18nc("@title:window Don't translate 'Universal Cura Project'", "Open Universal Cura Project (UCP)"): 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: manager.isUcp? catalog.i18nc("@action:title Don't translate 'Universal Cura Project'", "Summary - Open Universal Cura Project (UCP)"): 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.isUcp? manager.machineType: 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. Component
  103. {
  104. id: componentNewPrinter
  105. Cura.SecondaryButton
  106. {
  107. id: createNewPrinter
  108. text: catalog.i18nc("@button", "Create new")
  109. fixedWidthMode: true
  110. width: parent.width - leftPadding * 1.5
  111. visible: manager.allowCreateMachine
  112. onClicked:
  113. {
  114. toggleContent()
  115. manager.setResolveStrategy("machine", "new")
  116. machineSelector.machineName = catalog.i18nc("@button", "Create new")
  117. manager.setIsAbstractMachine(false)
  118. manager.setIsNetworkedMachine(false)
  119. }
  120. }
  121. }
  122. buttons: manager.allowCreateMachine ? [componentNewPrinter.createObject()] : []
  123. onSelectPrinter: function(machine)
  124. {
  125. toggleContent();
  126. machineSelector.machineName = machine.name
  127. manager.setResolveStrategy("machine", "override")
  128. manager.setMachineToOverride(machine.id)
  129. manager.setIsAbstractMachine(machine.isAbstractMachine)
  130. manager.setIsNetworkedMachine(machine.isNetworked)
  131. }
  132. }
  133. }
  134. WorkspaceSection
  135. {
  136. id: ucpProfileSection
  137. visible: manager.isUcp
  138. title: catalog.i18nc("@action:label", "Settings Loaded from UCP file")
  139. iconSource: UM.Theme.getIcon("Settings")
  140. content: Column
  141. {
  142. id: ucpProfileSettingsValuesTable
  143. spacing: UM.Theme.getSize("default_margin").height
  144. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  145. WorkspaceRow
  146. {
  147. leftLabelText: catalog.i18nc("@action:label", "Settings Loaded from UCP file")
  148. rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.exportedSettingModel.rowCount()).arg(manager.exportedSettingModel.rowCount())
  149. buttonText: tableViewSpecificSettings.shouldBeVisible ? catalog.i18nc("@action:button", "Hide settings") : catalog.i18nc("@action:button", "Show settings")
  150. onButtonClicked: tableViewSpecificSettings.shouldBeVisible = !tableViewSpecificSettings.shouldBeVisible
  151. }
  152. Cura.TableView
  153. {
  154. id: tableViewSpecificSettings
  155. width: parent.width - parent.leftPadding - UM.Theme.getSize("default_margin").width
  156. height: UM.Theme.getSize("card").height
  157. visible: shouldBeVisible && manager.isUcp
  158. property bool shouldBeVisible: true
  159. columnHeaders:
  160. [
  161. catalog.i18nc("@title:column", "Applies on"),
  162. catalog.i18nc("@title:column", "Setting"),
  163. catalog.i18nc("@title:column", "Value")
  164. ]
  165. model: UM.TableModel
  166. {
  167. id: tableModel
  168. headers: ["category", "label", "value"]
  169. rows: manager.exportedSettingModel.items
  170. }
  171. }
  172. property var modelRows: manager.exportedSettingModel.items
  173. onModelRowsChanged:
  174. {
  175. tableModel.clear()
  176. tableModel.rows = modelRows
  177. }
  178. }
  179. comboboxVisible: manager.qualityChangesConflict
  180. combobox: Cura.ComboBox
  181. {
  182. id: qualityChangesResolveComboBox
  183. model: resolveStrategiesModel
  184. textRole: "label"
  185. visible: manager.qualityChangesConflict && !manager.isUcp
  186. contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
  187. textFont: UM.Theme.getFont("medium")
  188. background: Cura.RoundedRectangle
  189. {
  190. border.width: UM.Theme.getSize("default_lining").width
  191. border.color: UM.Theme.getColor("lining")
  192. color: qualityChangesResolveComboBox.hovered ? UM.Theme.getColor("expandable_hover") : UM.Theme.getColor("action_button")
  193. cornerSide: Cura.RoundedRectangle.Direction.All
  194. radius: UM.Theme.getSize("default_radius").width
  195. }
  196. // This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
  197. currentIndex:
  198. {
  199. currentIndex = 0
  200. }
  201. onCurrentIndexChanged:
  202. {
  203. manager.setResolveStrategy("quality_changes", resolveStrategiesModel.get(currentIndex).key)
  204. }
  205. }
  206. }
  207. WorkspaceSection
  208. {
  209. id: profileSection
  210. title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Profile settings"):catalog.i18nc("@action:label", "Profile settings")
  211. iconSource: UM.Theme.getIcon("Sliders")
  212. content: Column
  213. {
  214. id: profileSettingsValuesTable
  215. spacing: UM.Theme.getSize("default_margin").height
  216. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  217. WorkspaceRow
  218. {
  219. leftLabelText: catalog.i18nc("@action:label", "Name")
  220. rightLabelText: manager.qualityName
  221. visible: manager.isCompatibleMachine
  222. }
  223. WorkspaceRow
  224. {
  225. leftLabelText: catalog.i18nc("@action:label", "Intent")
  226. rightLabelText: manager.intentName
  227. visible: manager.isCompatibleMachine
  228. }
  229. WorkspaceRow
  230. {
  231. leftLabelText: catalog.i18nc("@action:label", "Not in profile")
  232. rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings)
  233. visible: manager.numUserSettings != 0 && !manager.isUcp
  234. }
  235. WorkspaceRow
  236. {
  237. leftLabelText: catalog.i18nc("@action:label", "Derivative from")
  238. rightLabelText: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
  239. visible: manager.numSettingsOverridenByQualityChanges != 0 && manager.isCompatibleMachine
  240. }
  241. }
  242. }
  243. WorkspaceSection
  244. {
  245. id: materialSection
  246. title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Material settings"): catalog.i18nc("@action:label", "Material settings")
  247. iconSource: UM.Theme.getIcon("Spool")
  248. content: Column
  249. {
  250. spacing: UM.Theme.getSize("default_margin").height
  251. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  252. Repeater
  253. {
  254. model: manager.materialLabels
  255. delegate: WorkspaceRow
  256. {
  257. leftLabelText: catalog.i18nc("@action:label", "Name")
  258. rightLabelText: modelData
  259. }
  260. }
  261. }
  262. comboboxVisible: manager.materialConflict
  263. combobox: Cura.ComboBox
  264. {
  265. id: materialResolveComboBox
  266. model: resolveStrategiesModel
  267. textRole: "label"
  268. visible: manager.materialConflict && !manager.isUcp
  269. contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
  270. textFont: UM.Theme.getFont("medium")
  271. background: Cura.RoundedRectangle
  272. {
  273. border.width: UM.Theme.getSize("default_lining").width
  274. border.color: UM.Theme.getColor("lining")
  275. color: materialResolveComboBox.hovered ? UM.Theme.getColor("expandable_hover") : UM.Theme.getColor("action_button")
  276. cornerSide: Cura.RoundedRectangle.Direction.All
  277. radius: UM.Theme.getSize("default_radius").width
  278. }
  279. // This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
  280. currentIndex:
  281. {
  282. currentIndex = 0
  283. }
  284. onCurrentIndexChanged:
  285. {
  286. manager.setResolveStrategy("material", resolveStrategiesModel.get(currentIndex).key)
  287. }
  288. }
  289. }
  290. WorkspaceSection
  291. {
  292. id: visibilitySection
  293. title: catalog.i18nc("@action:label", "Setting visibility")
  294. iconSource: UM.Theme.getIcon("Eye")
  295. visible : !manager.isUcp
  296. content: Column
  297. {
  298. spacing: UM.Theme.getSize("default_margin").height
  299. leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
  300. bottomPadding: UM.Theme.getSize("narrow_margin").height
  301. WorkspaceRow
  302. {
  303. leftLabelText: catalog.i18nc("@action:label", "Mode")
  304. rightLabelText: manager.activeMode
  305. }
  306. WorkspaceRow
  307. {
  308. leftLabelText: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(manager.totalNumberOfSettings)
  309. rightLabelText: manager.activeMode
  310. visible: manager.hasVisibleSettingsField
  311. }
  312. }
  313. }
  314. Row
  315. {
  316. id: clearBuildPlateWarning
  317. width: parent.width
  318. height: childrenRect.height
  319. spacing: UM.Theme.getSize("default_margin").width
  320. visible: manager.hasObjectsOnPlate
  321. UM.ColorImage
  322. {
  323. width: warningLabel.height
  324. height: width
  325. source: UM.Theme.getIcon("Information")
  326. color: UM.Theme.getColor("text")
  327. }
  328. UM.Label
  329. {
  330. id: warningLabel
  331. text: catalog.i18nc("@action:warning", "Loading a project will clear all models on the build plate.")
  332. }
  333. }
  334. }
  335. }
  336. }
  337. property bool warning: manager.missingPackages.length > 0
  338. footerComponent: Rectangle
  339. {
  340. color: warning ? UM.Theme.getColor("warning") : "transparent"
  341. anchors.bottom: parent.bottom
  342. width: parent.width
  343. height: childrenRect.height + (warning ? 2 * workspaceDialog.margin : workspaceDialog.margin)
  344. Column
  345. {
  346. height: childrenRect.height
  347. spacing: workspaceDialog.margin
  348. anchors.leftMargin: workspaceDialog.margin
  349. anchors.rightMargin: workspaceDialog.margin
  350. anchors.bottomMargin: workspaceDialog.margin
  351. anchors.topMargin: warning ? workspaceDialog.margin : 0
  352. anchors.left: parent.left
  353. anchors.right: parent.right
  354. anchors.top: parent.top
  355. RowLayout
  356. {
  357. id: warningRow
  358. height: childrenRect.height
  359. visible: warning
  360. spacing: workspaceDialog.margin
  361. UM.ColorImage
  362. {
  363. width: UM.Theme.getSize("extruder_icon").width
  364. height: UM.Theme.getSize("extruder_icon").height
  365. source: UM.Theme.getIcon("Warning")
  366. }
  367. UM.Label
  368. {
  369. id: warningText
  370. 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.")
  371. }
  372. }
  373. Loader
  374. {
  375. width: parent.width
  376. height: childrenRect.height
  377. sourceComponent: buttonRow
  378. }
  379. }
  380. }
  381. buttonSpacing: UM.Theme.getSize("wide_margin").width
  382. rightButtons: [
  383. Cura.TertiaryButton
  384. {
  385. visible: !warning
  386. text: catalog.i18nc("@action:button", "Cancel")
  387. onClicked: reject()
  388. },
  389. Cura.PrimaryButton
  390. {
  391. visible: !warning
  392. text: catalog.i18nc("@action:button", "Open")
  393. onClicked: accept()
  394. },
  395. Cura.TertiaryButton
  396. {
  397. visible: warning
  398. text: catalog.i18nc("@action:button", "Open project anyway")
  399. onClicked: {
  400. manager.showMissingMaterialsWarning();
  401. accept();
  402. }
  403. },
  404. Cura.PrimaryButton
  405. {
  406. visible: warning
  407. text: catalog.i18nc("@action:button", "Install missing packages")
  408. onClicked: manager.installMissingPackages()
  409. }
  410. ]
  411. onClosing: manager.notifyClosed()
  412. onRejected: manager.onCancelButtonClicked()
  413. onAccepted: manager.onOkButtonClicked()
  414. onVisibleChanged:
  415. {
  416. if (visible)
  417. {
  418. // Force reload the comboboxes
  419. // Since this dialog is only created once the first time you open it, these comboxes need to be reloaded
  420. // each time it is shown after the first time so that the indexes will update correctly.
  421. materialSection.reloadValues()
  422. profileSection.reloadValues()
  423. printerSection.reloadValues()
  424. ucpProfileSection.reloadValues()
  425. }
  426. }
  427. }