PerObjectSettingsPanel.qml 16 KB

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