MaterialView.qml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. // Copyright (c) 2016 Ultimaker B.V.
  2. // Uranium is released under the terms of the AGPLv3 or higher.
  3. import QtQuick 2.1
  4. import QtQuick.Controls 1.3
  5. import QtQuick.Dialogs 1.2
  6. import UM 1.2 as UM
  7. import Cura 1.0 as Cura
  8. TabView
  9. {
  10. id: base
  11. property QtObject properties;
  12. property bool editingEnabled: false;
  13. property string currency: UM.Preferences.getValue("cura/currency") ? UM.Preferences.getValue("cura/currency") : "€"
  14. property real firstColumnWidth: width * 0.45
  15. property real secondColumnWidth: width * 0.45
  16. property string containerId: ""
  17. property var materialPreferenceValues: UM.Preferences.getValue("cura/material_settings") ? JSON.parse(UM.Preferences.getValue("cura/material_settings")) : {}
  18. Tab
  19. {
  20. title: catalog.i18nc("@title","Information")
  21. anchors
  22. {
  23. leftMargin: UM.Theme.getSize("default_margin").width
  24. topMargin: UM.Theme.getSize("default_margin").height
  25. bottomMargin: UM.Theme.getSize("default_margin").height
  26. rightMargin: 0
  27. }
  28. ScrollView
  29. {
  30. anchors.fill: parent
  31. horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
  32. Flow
  33. {
  34. id: containerGrid
  35. width: base.width;
  36. property real rowHeight: textField.height;
  37. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Display Name") }
  38. ReadOnlyTextField
  39. {
  40. id: displayNameTextField;
  41. width: base.secondColumnWidth;
  42. text: properties.name;
  43. readOnly: !base.editingEnabled;
  44. onEditingFinished: base.setName(properties.name, text)
  45. }
  46. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Brand") }
  47. ReadOnlyTextField
  48. {
  49. id: textField;
  50. width: base.secondColumnWidth;
  51. text: properties.supplier;
  52. readOnly: !base.editingEnabled;
  53. onEditingFinished: base.setMetaDataEntry("brand", properties.supplier, text)
  54. }
  55. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Material Type") }
  56. ReadOnlyTextField
  57. {
  58. width: base.secondColumnWidth;
  59. text: properties.material_type;
  60. readOnly: !base.editingEnabled;
  61. onEditingFinished: base.setMetaDataEntry("material", properties.material_type, text)
  62. }
  63. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Color") }
  64. Row
  65. {
  66. width: base.secondColumnWidth;
  67. height: parent.rowHeight;
  68. spacing: UM.Theme.getSize("default_margin").width/2
  69. Rectangle
  70. {
  71. id: colorSelector
  72. color: properties.color_code
  73. width: colorLabel.height * 0.75
  74. height: colorLabel.height * 0.75
  75. border.width: UM.Theme.getSize("default_lining").height
  76. anchors.verticalCenter: parent.verticalCenter
  77. MouseArea { anchors.fill: parent; onClicked: colorDialog.open(); enabled: base.editingEnabled }
  78. }
  79. ReadOnlyTextField
  80. {
  81. id: colorLabel;
  82. text: properties.color_name;
  83. readOnly: !base.editingEnabled
  84. onEditingFinished: base.setMetaDataEntry("color_name", properties.color_name, text)
  85. }
  86. ColorDialog { id: colorDialog; color: properties.color_code; onAccepted: base.setMetaDataEntry("color_code", properties.color_code, color) }
  87. }
  88. Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
  89. Label { width: parent.width; height: parent.rowHeight; font.bold: true; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Properties") }
  90. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Density") }
  91. ReadOnlySpinBox
  92. {
  93. width: base.secondColumnWidth
  94. value: properties.density
  95. decimals: 2
  96. suffix: " g/cm³"
  97. stepSize: 0.01
  98. readOnly: !base.editingEnabled
  99. onEditingFinished: base.setMetaDataEntry("properties/density", properties.density, value)
  100. }
  101. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Diameter") }
  102. ReadOnlySpinBox
  103. {
  104. width: base.secondColumnWidth
  105. value: properties.diameter
  106. decimals: 2
  107. suffix: " mm"
  108. stepSize: 0.01
  109. readOnly: !base.editingEnabled
  110. onEditingFinished: base.setMetaDataEntry("properties/diameter", properties.diameter, value)
  111. }
  112. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament Cost") }
  113. SpinBox
  114. {
  115. width: base.secondColumnWidth
  116. value: base.getMaterialPreferenceValue(properties.guid, "spool_cost")
  117. prefix: base.currency + " "
  118. decimals: 2
  119. maximumValue: 1000
  120. onEditingFinished: base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value))
  121. }
  122. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament weight") }
  123. SpinBox
  124. {
  125. width: base.secondColumnWidth
  126. value: base.getMaterialPreferenceValue(properties.guid, "spool_weight")
  127. suffix: " g"
  128. stepSize: 100
  129. decimals: 0
  130. maximumValue: 10000
  131. onEditingFinished: base.setMaterialPreferenceValue(properties.guid, "spool_weight", parseFloat(value))
  132. }
  133. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament length") }
  134. Label
  135. {
  136. width: base.secondColumnWidth
  137. text: "%1 m".arg(properties.spool_length)
  138. verticalAlignment: Qt.AlignVCenter
  139. height: parent.rowHeight
  140. }
  141. Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Cost per Meter (Approx.)") }
  142. Label
  143. {
  144. width: base.secondColumnWidth
  145. text: "%1 %2/m".arg(parseFloat(properties.cost_per_meter).toFixed(2)).arg(base.currency)
  146. verticalAlignment: Qt.AlignVCenter
  147. height: parent.rowHeight
  148. }
  149. Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
  150. Label { width: parent.width; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Description") }
  151. ReadOnlyTextArea
  152. {
  153. text: properties.description;
  154. width: base.firstColumnWidth + base.secondColumnWidth
  155. wrapMode: Text.WordWrap
  156. readOnly: !base.editingEnabled;
  157. onEditingFinished: base.setMetaDataEntry("description", properties.description, text)
  158. }
  159. Label { width: parent.width; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Adhesion Information") }
  160. ReadOnlyTextArea
  161. {
  162. text: properties.adhesion_info;
  163. width: base.firstColumnWidth + base.secondColumnWidth
  164. wrapMode: Text.WordWrap
  165. readOnly: !base.editingEnabled;
  166. onEditingFinished: base.setMetaDataEntry("adhesion_info", properties.adhesion_info, text)
  167. }
  168. }
  169. }
  170. }
  171. Tab
  172. {
  173. title: catalog.i18nc("@label", "Print settings")
  174. anchors
  175. {
  176. leftMargin: UM.Theme.getSize("default_margin").width
  177. topMargin: UM.Theme.getSize("default_margin").height
  178. bottomMargin: UM.Theme.getSize("default_margin").height
  179. rightMargin: 0
  180. }
  181. ScrollView
  182. {
  183. anchors.fill: parent;
  184. ListView
  185. {
  186. model: UM.SettingDefinitionsModel
  187. {
  188. containerId: Cura.MachineManager.activeDefinitionId
  189. visibilityHandler: Cura.MaterialSettingsVisibilityHandler { }
  190. expanded: ["*"]
  191. }
  192. delegate: UM.TooltipArea
  193. {
  194. width: childrenRect.width
  195. height: childrenRect.height
  196. text: model.description
  197. Label
  198. {
  199. id: label
  200. width: base.firstColumnWidth;
  201. height: spinBox.height
  202. text: model.label
  203. }
  204. ReadOnlySpinBox
  205. {
  206. id: spinBox
  207. anchors.left: label.right
  208. value: parseFloat(provider.properties.value);
  209. width: base.secondColumnWidth;
  210. readOnly: !base.editingEnabled
  211. suffix: model.unit
  212. maximumValue: 99999
  213. decimals: model.unit == "mm" ? 2 : 0
  214. onEditingFinished: provider.setPropertyValue("value", value)
  215. }
  216. UM.ContainerPropertyProvider { id: provider; containerId: base.containerId; watchedProperties: [ "value" ]; key: model.key }
  217. }
  218. }
  219. }
  220. }
  221. // Tiny convenience function to check if a value really changed before trying to set it.
  222. function setMetaDataEntry(entry_name, old_value, new_value)
  223. {
  224. if(old_value != new_value)
  225. {
  226. Cura.ContainerManager.setContainerMetaDataEntry(base.containerId, entry_name, new_value);
  227. }
  228. }
  229. function setMaterialPreferenceValue(material_guid, entry_name, new_value)
  230. {
  231. if(!(material_guid in materialPreferenceValues))
  232. {
  233. materialPreferenceValues[material_guid] = {};
  234. }
  235. if(entry_name in materialPreferenceValues[material_guid] && materialPreferenceValues[material_guid][entry_name] == new_value)
  236. {
  237. // value has not changed
  238. return
  239. }
  240. materialPreferenceValues[material_guid][entry_name] = new_value;
  241. // store preference
  242. UM.Preferences.setValue("cura/material_settings", JSON.stringify(materialPreferenceValues));
  243. }
  244. function getMaterialPreferenceValue(material_guid, entry_name)
  245. {
  246. if(material_guid in materialPreferenceValues && entry_name in materialPreferenceValues[material_guid])
  247. {
  248. return materialPreferenceValues[material_guid][entry_name];
  249. }
  250. return 0;
  251. }
  252. function setName(old_value, new_value)
  253. {
  254. if(old_value != new_value)
  255. {
  256. Cura.ContainerManager.setContainerName(base.containerId, new_value);
  257. // update material name label. not so pretty, but it works
  258. materialProperties.name = new_value;
  259. }
  260. }
  261. }