PerObjectSettingsPanel.qml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. // Copyright (c) 2016 Ultimaker B.V.
  2. // Uranium is released under the terms of the AGPLv3 or higher.
  3. import QtQuick 2.2
  4. import QtQuick.Controls 1.2
  5. import QtQuick.Controls.Styles 1.2
  6. import QtQuick.Window 2.2
  7. import UM 1.2 as UM
  8. import Cura 1.0 as Cura
  9. import ".."
  10. Item {
  11. id: base;
  12. UM.I18nCatalog { id: catalog; name: "cura"; }
  13. width: childrenRect.width;
  14. height: childrenRect.height;
  15. Column
  16. {
  17. id: items
  18. anchors.top: parent.top;
  19. anchors.left: parent.left;
  20. spacing: UM.Theme.getSize("default_margin").height
  21. Row
  22. {
  23. spacing: UM.Theme.getSize("default_margin").width
  24. Label
  25. {
  26. text: catalog.i18nc("@label Followed by extruder selection drop-down.", "Print model with")
  27. anchors.verticalCenter: extruderSelector.verticalCenter
  28. color: UM.Theme.getColor("setting_control_text")
  29. font: UM.Theme.getFont("default")
  30. visible: extruderSelector.visible
  31. }
  32. ComboBox
  33. {
  34. id: extruderSelector
  35. model: Cura.ExtrudersModel
  36. {
  37. id: extrudersModel
  38. onModelChanged: extruderSelector.color = extrudersModel.getItem(extruderSelector.currentIndex).color
  39. }
  40. property string color: extrudersModel.getItem(extruderSelector.currentIndex).color
  41. visible: machineExtruderCount.properties.value > 1
  42. textRole: "name"
  43. width: UM.Theme.getSize("setting_control").width
  44. height: UM.Theme.getSize("section").height
  45. MouseArea
  46. {
  47. anchors.fill: parent
  48. acceptedButtons: Qt.NoButton
  49. onWheel: wheel.accepted = true;
  50. }
  51. style: ComboBoxStyle
  52. {
  53. background: Rectangle
  54. {
  55. color:
  56. {
  57. if(extruderSelector.hovered || base.activeFocus)
  58. {
  59. return UM.Theme.getColor("setting_control_highlight");
  60. }
  61. else
  62. {
  63. return UM.Theme.getColor("setting_control");
  64. }
  65. }
  66. border.width: UM.Theme.getSize("default_lining").width
  67. border.color: UM.Theme.getColor("setting_control_border")
  68. }
  69. label: Item
  70. {
  71. Rectangle
  72. {
  73. id: swatch
  74. height: UM.Theme.getSize("setting_control").height / 2
  75. width: height
  76. anchors.left: parent.left
  77. anchors.leftMargin: UM.Theme.getSize("default_lining").width
  78. anchors.verticalCenter: parent.verticalCenter
  79. color: extruderSelector.color
  80. border.width: UM.Theme.getSize("default_lining").width
  81. border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : UM.Theme.getColor("setting_control_border")
  82. }
  83. Label
  84. {
  85. anchors.left: swatch.right
  86. anchors.leftMargin: UM.Theme.getSize("default_lining").width
  87. anchors.right: downArrow.left
  88. anchors.rightMargin: UM.Theme.getSize("default_lining").width
  89. anchors.verticalCenter: parent.verticalCenter
  90. text: extruderSelector.currentText
  91. font: UM.Theme.getFont("default")
  92. color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text")
  93. elide: Text.ElideRight
  94. verticalAlignment: Text.AlignVCenter
  95. }
  96. UM.RecolorImage
  97. {
  98. id: downArrow
  99. anchors.right: parent.right
  100. anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2
  101. anchors.verticalCenter: parent.verticalCenter
  102. source: UM.Theme.getIcon("arrow_bottom")
  103. width: UM.Theme.getSize("standard_arrow").width
  104. height: UM.Theme.getSize("standard_arrow").height
  105. sourceSize.width: width + 5
  106. sourceSize.height: width + 5
  107. color: UM.Theme.getColor("setting_control_text")
  108. }
  109. }
  110. }
  111. onActivated:
  112. {
  113. UM.ActiveTool.setProperty("SelectedActiveExtruder", extrudersModel.getItem(index).id);
  114. extruderSelector.color = extrudersModel.getItem(index).color;
  115. }
  116. onModelChanged: updateCurrentIndex();
  117. function updateCurrentIndex()
  118. {
  119. for(var i = 0; i < extrudersModel.rowCount(); ++i)
  120. {
  121. if(extrudersModel.getItem(i).id == UM.ActiveTool.properties.getValue("SelectedActiveExtruder"))
  122. {
  123. extruderSelector.currentIndex = i;
  124. extruderSelector.color = extrudersModel.getItem(i).color;
  125. return;
  126. }
  127. }
  128. extruderSelector.currentIndex = -1;
  129. }
  130. }
  131. }
  132. Column
  133. {
  134. // This is to ensure that the panel is first increasing in size up to 200 and then shows a scrollbar.
  135. // It kinda looks ugly otherwise (big panel, no content on it)
  136. property int maximumHeight: 200 * Screen.devicePixelRatio
  137. height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight)
  138. ScrollView
  139. {
  140. height: parent.height
  141. width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height
  142. style: UM.Theme.styles.scrollview
  143. ListView
  144. {
  145. id: contents
  146. spacing: UM.Theme.getSize("default_lining").height
  147. model: UM.SettingDefinitionsModel
  148. {
  149. id: addedSettingsModel;
  150. containerId: Cura.MachineManager.activeDefinitionId
  151. expanded: [ "*" ]
  152. visibilityHandler: Cura.PerObjectSettingVisibilityHandler
  153. {
  154. selectedObjectId: UM.ActiveTool.properties.getValue("SelectedObjectId")
  155. }
  156. }
  157. delegate: Row
  158. {
  159. Loader
  160. {
  161. id: settingLoader
  162. width: UM.Theme.getSize("setting").width
  163. height: UM.Theme.getSize("section").height
  164. property var definition: model
  165. property var settingDefinitionsModel: addedSettingsModel
  166. property var propertyProvider: provider
  167. //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989
  168. //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes,
  169. //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely.
  170. asynchronous: model.type != "enum" && model.type != "extruder"
  171. onLoaded: {
  172. settingLoader.item.showRevertButton = false
  173. settingLoader.item.showInheritButton = false
  174. settingLoader.item.showLinkedSettingIcon = false
  175. settingLoader.item.doDepthIndentation = false
  176. settingLoader.item.doQualityUserSettingEmphasis = false
  177. }
  178. sourceComponent:
  179. {
  180. switch(model.type)
  181. {
  182. case "int":
  183. return settingTextField
  184. case "[int]":
  185. return settingTextField
  186. case "float":
  187. return settingTextField
  188. case "enum":
  189. return settingComboBox
  190. case "extruder":
  191. return settingExtruder
  192. case "bool":
  193. return settingCheckBox
  194. case "str":
  195. return settingTextField
  196. case "category":
  197. return settingCategory
  198. default:
  199. return settingUnknown
  200. }
  201. }
  202. }
  203. Button
  204. {
  205. width: UM.Theme.getSize("setting").height / 2;
  206. height: UM.Theme.getSize("setting").height;
  207. onClicked: addedSettingsModel.setVisible(model.key, false);
  208. style: ButtonStyle
  209. {
  210. background: Item
  211. {
  212. UM.RecolorImage
  213. {
  214. anchors.verticalCenter: parent.verticalCenter
  215. width: parent.width
  216. height: parent.height / 2
  217. sourceSize.width: width
  218. sourceSize.height: width
  219. color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button")
  220. source: UM.Theme.getIcon("minus")
  221. }
  222. }
  223. }
  224. }
  225. UM.SettingPropertyProvider
  226. {
  227. id: provider
  228. containerStackId: UM.ActiveTool.properties.getValue("ContainerID")
  229. key: model.key
  230. watchedProperties: [ "value", "enabled", "validationState" ]
  231. storeIndex: 0
  232. removeUnusedValue: false
  233. }
  234. // If the extruder by which the object needs to be printed is changed, ensure that the
  235. // display is also notified of the fact.
  236. Connections
  237. {
  238. target: extruderSelector
  239. onActivated: provider.forcePropertiesChanged()
  240. }
  241. }
  242. }
  243. }
  244. }
  245. Button
  246. {
  247. id: customise_settings_button;
  248. height: UM.Theme.getSize("setting").height;
  249. visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
  250. text: catalog.i18nc("@action:button", "Select settings");
  251. style: ButtonStyle
  252. {
  253. background: Rectangle
  254. {
  255. width: control.width;
  256. height: control.height;
  257. border.width: UM.Theme.getSize("default_lining").width;
  258. border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") :
  259. control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
  260. color: control.pressed ? UM.Theme.getColor("action_button_active") :
  261. control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
  262. }
  263. label: Label
  264. {
  265. text: control.text;
  266. color: UM.Theme.getColor("setting_control_text");
  267. anchors.centerIn: parent
  268. }
  269. }
  270. onClicked: settingPickDialog.visible = true;
  271. Connections
  272. {
  273. target: UM.Preferences;
  274. onPreferenceChanged:
  275. {
  276. customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
  277. }
  278. }
  279. }
  280. }
  281. UM.Dialog {
  282. id: settingPickDialog
  283. title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
  284. width: Screen.devicePixelRatio * 360;
  285. property string labelFilter: ""
  286. onVisibilityChanged:
  287. {
  288. // force updating the model to sync it with addedSettingsModel
  289. if(visible)
  290. {
  291. listview.model.forceUpdate()
  292. }
  293. }
  294. TextField {
  295. id: filter
  296. anchors {
  297. top: parent.top
  298. left: parent.left
  299. right: toggleShowAll.left
  300. rightMargin: UM.Theme.getSize("default_margin").width
  301. }
  302. placeholderText: catalog.i18nc("@label:textbox", "Filter...");
  303. onTextChanged:
  304. {
  305. if(text != "")
  306. {
  307. listview.model.filter = {"settable_per_mesh": true, "i18n_label": "*" + text}
  308. }
  309. else
  310. {
  311. listview.model.filter = {"settable_per_mesh": true}
  312. }
  313. }
  314. }
  315. CheckBox
  316. {
  317. id: toggleShowAll
  318. anchors {
  319. top: parent.top
  320. right: parent.right
  321. }
  322. text: catalog.i18nc("@label:checkbox", "Show all")
  323. checked: listview.model.showAll
  324. onClicked:
  325. {
  326. listview.model.showAll = checked;
  327. }
  328. }
  329. ScrollView
  330. {
  331. id: scrollView
  332. anchors
  333. {
  334. top: filter.bottom;
  335. left: parent.left;
  336. right: parent.right;
  337. bottom: parent.bottom;
  338. }
  339. ListView
  340. {
  341. id:listview
  342. model: UM.SettingDefinitionsModel
  343. {
  344. id: definitionsModel;
  345. containerId: Cura.MachineManager.activeDefinitionId
  346. filter:
  347. {
  348. "settable_per_mesh": true
  349. }
  350. visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
  351. expanded: [ "*" ]
  352. exclude: [ "machine_settings", "command_line_settings" ]
  353. }
  354. delegate:Loader
  355. {
  356. id: loader
  357. width: parent.width
  358. height: model.type != undefined ? UM.Theme.getSize("section").height : 0;
  359. property var definition: model
  360. property var settingDefinitionsModel: definitionsModel
  361. asynchronous: true
  362. source:
  363. {
  364. switch(model.type)
  365. {
  366. case "category":
  367. return "PerObjectCategory.qml"
  368. default:
  369. return "PerObjectItem.qml"
  370. }
  371. }
  372. }
  373. }
  374. }
  375. rightButtons: [
  376. Button {
  377. text: catalog.i18nc("@action:button", "Close");
  378. onClicked: {
  379. settingPickDialog.visible = false;
  380. }
  381. }
  382. ]
  383. }
  384. UM.SettingPropertyProvider
  385. {
  386. id: machineExtruderCount
  387. containerStackId: Cura.MachineManager.activeMachineId
  388. key: "machine_extruder_count"
  389. watchedProperties: [ "value" ]
  390. storeIndex: 0
  391. }
  392. SystemPalette { id: palette; }
  393. Component
  394. {
  395. id: settingTextField;
  396. Cura.SettingTextField { }
  397. }
  398. Component
  399. {
  400. id: settingComboBox;
  401. Cura.SettingComboBox { }
  402. }
  403. Component
  404. {
  405. id: settingExtruder;
  406. Cura.SettingExtruder { }
  407. }
  408. Component
  409. {
  410. id: settingCheckBox;
  411. Cura.SettingCheckBox { }
  412. }
  413. Component
  414. {
  415. id: settingCategory;
  416. Cura.SettingCategory { }
  417. }
  418. Component
  419. {
  420. id: settingUnknown;
  421. Cura.SettingUnknown { }
  422. }
  423. }