PerObjectSettingsPanel.qml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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. }
  41. visible: extruders_model.rowCount() > 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: extruders_model.getItem(extruderSelector.currentIndex).colour
  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: UM.ActiveTool.setProperty("SelectedActiveExtruder", extruders_model.getItem(index).id);
  112. onModelChanged: updateCurrentIndex();
  113. function updateCurrentIndex()
  114. {
  115. for(var i = 0; i < extruders_model.rowCount(); ++i)
  116. {
  117. if(extruders_model.getItem(i).id == UM.ActiveTool.properties.getValue("SelectedActiveExtruder"))
  118. {
  119. extruderSelector.currentIndex = i;
  120. return;
  121. }
  122. }
  123. extruderSelector.currentIndex = -1;
  124. }
  125. }
  126. }
  127. Repeater
  128. {
  129. id: contents
  130. height: childrenRect.height;
  131. model: UM.SettingDefinitionsModel
  132. {
  133. id: addedSettingsModel;
  134. containerId: Cura.MachineManager.activeDefinitionId
  135. visibilityHandler: Cura.PerObjectSettingVisibilityHandler
  136. {
  137. selectedObjectId: UM.ActiveTool.properties.getValue("SelectedObjectId")
  138. }
  139. }
  140. delegate: Row
  141. {
  142. Loader
  143. {
  144. id: settingLoader
  145. width: UM.Theme.getSize("setting").width;
  146. height: UM.Theme.getSize("section").height;
  147. property var definition: model
  148. property var settingDefinitionsModel: addedSettingsModel
  149. property var propertyProvider: provider
  150. //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989
  151. //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes,
  152. //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely.
  153. asynchronous: model.type != "enum" && model.type != "extruder"
  154. onLoaded: {
  155. settingLoader.item.showRevertButton = false
  156. settingLoader.item.showInheritButton = false
  157. settingLoader.item.doDepthIndentation = false
  158. }
  159. sourceComponent:
  160. {
  161. switch(model.type)
  162. {
  163. case "int":
  164. return settingTextField
  165. case "float":
  166. return settingTextField
  167. case "enum":
  168. return settingComboBox
  169. case "extruder":
  170. return settingExtruder
  171. case "bool":
  172. return settingCheckBox
  173. case "str":
  174. return settingTextField
  175. case "category":
  176. return settingCategory
  177. default:
  178. return settingUnknown
  179. }
  180. }
  181. }
  182. Button
  183. {
  184. width: UM.Theme.getSize("setting").height;
  185. height: UM.Theme.getSize("setting").height;
  186. onClicked: addedSettingsModel.setVisible(model.key, false);
  187. style: ButtonStyle
  188. {
  189. background: Rectangle
  190. {
  191. color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor;
  192. UM.RecolorImage
  193. {
  194. anchors.verticalCenter: parent.verticalCenter
  195. anchors.horizontalCenter: parent.horizontalCenter
  196. width: parent.width/2
  197. height: parent.height/2
  198. sourceSize.width: width
  199. sourceSize.height: width
  200. color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button")
  201. source: UM.Theme.getIcon("cross1")
  202. }
  203. }
  204. }
  205. }
  206. UM.SettingPropertyProvider
  207. {
  208. id: provider
  209. containerStackId: UM.ActiveTool.properties.getValue("ContainerID")
  210. key: model.key
  211. watchedProperties: [ "value", "enabled", "validationState" ]
  212. storeIndex: 0
  213. }
  214. }
  215. }
  216. Button
  217. {
  218. id: customise_settings_button;
  219. height: UM.Theme.getSize("setting").height;
  220. visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
  221. text: catalog.i18nc("@action:button", "Add Setting");
  222. style: ButtonStyle
  223. {
  224. background: Rectangle
  225. {
  226. width: control.width;
  227. height: control.height;
  228. border.width: UM.Theme.getSize("default_lining").width;
  229. border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") :
  230. control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
  231. color: control.pressed ? UM.Theme.getColor("action_button_active") :
  232. control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
  233. }
  234. label: Label
  235. {
  236. text: control.text;
  237. color: UM.Theme.getColor("setting_control_text");
  238. anchors.centerIn: parent
  239. }
  240. }
  241. onClicked: settingPickDialog.visible = true;
  242. Connections
  243. {
  244. target: UM.Preferences;
  245. onPreferenceChanged:
  246. {
  247. customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
  248. }
  249. }
  250. }
  251. }
  252. UM.Dialog {
  253. id: settingPickDialog
  254. title: catalog.i18nc("@title:window", "Pick a Setting to Customize")
  255. property string labelFilter: ""
  256. TextField {
  257. id: filter;
  258. anchors {
  259. top: parent.top;
  260. left: parent.left;
  261. right: parent.right;
  262. }
  263. placeholderText: catalog.i18nc("@label:textbox", "Filter...");
  264. onTextChanged:
  265. {
  266. if(text != "")
  267. {
  268. listview.model.filter = {"settable_per_mesh": true, "label": "*" + text}
  269. }
  270. else
  271. {
  272. listview.model.filter = {"settable_per_mesh": true}
  273. }
  274. }
  275. }
  276. ScrollView
  277. {
  278. id: scrollView
  279. anchors
  280. {
  281. top: filter.bottom;
  282. left: parent.left;
  283. right: parent.right;
  284. bottom: parent.bottom;
  285. }
  286. ListView
  287. {
  288. id:listview
  289. model: UM.SettingDefinitionsModel
  290. {
  291. id: definitionsModel;
  292. containerId: Cura.MachineManager.activeDefinitionId
  293. filter:
  294. {
  295. "settable_per_mesh": true
  296. }
  297. visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
  298. }
  299. delegate:Loader
  300. {
  301. id: loader
  302. width: parent.width
  303. height: model.type != undefined ? UM.Theme.getSize("section").height : 0;
  304. property var definition: model
  305. property var settingDefinitionsModel: definitionsModel
  306. asynchronous: true
  307. source:
  308. {
  309. switch(model.type)
  310. {
  311. case "category":
  312. return "PerObjectCategory.qml"
  313. default:
  314. return "PerObjectItem.qml"
  315. }
  316. }
  317. }
  318. }
  319. }
  320. rightButtons: [
  321. Button {
  322. text: catalog.i18nc("@action:button", "Cancel");
  323. onClicked: {
  324. settingPickDialog.visible = false;
  325. }
  326. }
  327. ]
  328. }
  329. SystemPalette { id: palette; }
  330. Component
  331. {
  332. id: settingTextField;
  333. Cura.SettingTextField { }
  334. }
  335. Component
  336. {
  337. id: settingComboBox;
  338. Cura.SettingComboBox { }
  339. }
  340. Component
  341. {
  342. id: settingExtruder;
  343. Cura.SettingExtruder { }
  344. }
  345. Component
  346. {
  347. id: settingCheckBox;
  348. Cura.SettingCheckBox { }
  349. }
  350. Component
  351. {
  352. id: settingCategory;
  353. Cura.SettingCategory { }
  354. }
  355. Component
  356. {
  357. id: settingUnknown;
  358. Cura.SettingUnknown { }
  359. }
  360. }