MaterialMenu.qml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Copyright (c) 2016 Ultimaker B.V.
  2. // Cura is released under the terms of the AGPLv3 or higher.
  3. import QtQuick 2.2
  4. import QtQuick.Controls 1.1
  5. import UM 1.2 as UM
  6. import Cura 1.0 as Cura
  7. Menu
  8. {
  9. id: menu
  10. title: "Material"
  11. property int extruderIndex: 0
  12. property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0
  13. MenuItem
  14. {
  15. id: automaticMaterial
  16. text:
  17. {
  18. if(printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex)
  19. {
  20. var materialName = Cura.MachineManager.printerOutputDevices[0].materialNames[extruderIndex];
  21. return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(materialName);
  22. }
  23. return "";
  24. }
  25. visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex
  26. onTriggered:
  27. {
  28. var material_id = Cura.MachineManager.printerOutputDevices[0].materialIds[extruderIndex];
  29. var items = materialsModel.items;
  30. // materialsModel.find cannot be used because we need to look inside the metadata property of items
  31. for(var i in items)
  32. {
  33. if (items[i]["metadata"]["GUID"] == material_id)
  34. {
  35. Cura.MachineManager.setActiveMaterial(items[i].id);
  36. break;
  37. }
  38. }
  39. }
  40. }
  41. MenuSeparator
  42. {
  43. visible: automaticMaterial.visible
  44. }
  45. Instantiator
  46. {
  47. model: genericMaterialsModel
  48. MenuItem
  49. {
  50. text: model.name
  51. checkable: true;
  52. checked: model.id == Cura.MachineManager.activeMaterialId;
  53. exclusiveGroup: group;
  54. onTriggered:
  55. {
  56. Cura.MachineManager.setActiveMaterial(model.id);
  57. }
  58. }
  59. onObjectAdded: menu.insertItem(index, object)
  60. onObjectRemoved: menu.removeItem(object)
  61. }
  62. MenuSeparator { }
  63. Instantiator
  64. {
  65. model: brandModel
  66. Menu
  67. {
  68. id: brandMenu
  69. title: brandName
  70. property string brandName: model.name
  71. property var brandMaterials: model.materials
  72. Instantiator
  73. {
  74. model: brandMaterials
  75. Menu
  76. {
  77. id: brandMaterialsMenu
  78. title: materialName
  79. property string materialName: model.name
  80. property var brandMaterialColors: model.colors
  81. Instantiator
  82. {
  83. model: brandMaterialColors
  84. MenuItem
  85. {
  86. text: model.name
  87. checkable: true;
  88. checked: model.id == Cura.MachineManager.activeMaterialId;
  89. exclusiveGroup: group;
  90. onTriggered:
  91. {
  92. Cura.MachineManager.setActiveMaterial(model.id);
  93. }
  94. }
  95. onObjectAdded: brandMaterialsMenu.insertItem(index, object)
  96. onObjectRemoved: brandMaterialsMenu.removeItem(object)
  97. }
  98. }
  99. onObjectAdded: brandMenu.insertItem(index, object)
  100. onObjectRemoved: brandMenu.removeItem(object)
  101. }
  102. }
  103. onObjectAdded: menu.insertItem(index, object)
  104. onObjectRemoved: menu.removeItem(object)
  105. }
  106. ListModel
  107. {
  108. id: genericMaterialsModel
  109. Component.onCompleted: populateMenuModels()
  110. }
  111. ListModel
  112. {
  113. id: brandModel
  114. }
  115. //: Model used to populate the brandModel
  116. UM.InstanceContainersModel
  117. {
  118. id: materialsModel
  119. filter: materialFilter()
  120. onModelReset: populateMenuModels()
  121. onDataChanged: populateMenuModels()
  122. }
  123. ExclusiveGroup { id: group }
  124. MenuSeparator { }
  125. MenuItem { action: Cura.Actions.manageMaterials }
  126. function materialFilter()
  127. {
  128. var result = { "type": "material" };
  129. if(Cura.MachineManager.filterMaterialsByMachine)
  130. {
  131. result.definition = Cura.MachineManager.activeQualityDefinitionId;
  132. if(Cura.MachineManager.hasVariants)
  133. {
  134. result.variant = Cura.MachineManager.activeQualityVariantId;
  135. }
  136. }
  137. else
  138. {
  139. result.definition = "fdmprinter";
  140. }
  141. return result;
  142. }
  143. function populateMenuModels()
  144. {
  145. // Create a structure of unique brands and their material-types
  146. genericMaterialsModel.clear()
  147. brandModel.clear();
  148. var items = materialsModel.items;
  149. var materialsByBrand = {};
  150. for (var i in items) {
  151. var brandName = items[i]["metadata"]["brand"];
  152. var materialName = items[i]["metadata"]["material"];
  153. if (brandName == "Generic")
  154. {
  155. // Add to top section
  156. var materialId = items[i].id;
  157. genericMaterialsModel.append({
  158. id:materialId,
  159. name:items[i].name
  160. });
  161. }
  162. else
  163. {
  164. // Add to per-brand, per-material menu
  165. if (!materialsByBrand.hasOwnProperty(brandName))
  166. {
  167. materialsByBrand[brandName] = {};
  168. }
  169. if (!materialsByBrand[brandName].hasOwnProperty(materialName))
  170. {
  171. materialsByBrand[brandName][materialName] = [];
  172. }
  173. materialsByBrand[brandName][materialName].push({
  174. id: items[i].id,
  175. name: items[i].name
  176. });
  177. }
  178. }
  179. for (var brand in materialsByBrand)
  180. {
  181. var materialsByBrandModel = [];
  182. var materials = materialsByBrand[brand];
  183. for (var material in materials)
  184. {
  185. materialsByBrandModel.push({
  186. name: material,
  187. colors: materials[material]
  188. })
  189. }
  190. brandModel.append({
  191. name: brand,
  192. materials: materialsByBrandModel
  193. });
  194. }
  195. }
  196. }