// Copyright (c) 2022 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 import QtQuick.Layouts 1.3 import QtQuick.Dialogs import UM 1.2 as UM import Cura 1.0 as Cura Item { id: materialList height: childrenRect.height // Children Cura.MaterialBrandsModel { id: materialsModel extruderPosition: Cura.ExtruderManager.activeExtruderIndex } Cura.FavoriteMaterialsModel { id: favoriteMaterialsModel extruderPosition: Cura.ExtruderManager.activeExtruderIndex } Cura.GenericMaterialsModel { id: genericMaterialsModel extruderPosition: Cura.ExtruderManager.activeExtruderIndex } property var currentType: null property var currentBrand: null property var expandedBrands: UM.Preferences.getValue("cura/expanded_brands").split(";") property var expandedTypes: UM.Preferences.getValue("cura/expanded_types").split(";") // Store information about which parts of the tree are expanded function persistExpandedCategories() { UM.Preferences.setValue("cura/expanded_brands", materialList.expandedBrands.join(";")) UM.Preferences.setValue("cura/expanded_types", materialList.expandedTypes.join(";")) } // Expand the list of materials in order to select the current material function expandActiveMaterial(search_root_id) { if (search_root_id == "") { // When this happens it means that the information of one of the materials has changed, so the model // was updated and the list has to highlight the current item. var currentItemId = base.currentItem == null ? "" : base.currentItem.root_material_id search_root_id = currentItemId } for (var material_idx = 0; material_idx < genericMaterialsModel.count; material_idx++) { var material = genericMaterialsModel.getItem(material_idx) if (material.root_material_id == search_root_id) { if (materialList.expandedBrands.indexOf("Generic") == -1) { materialList.expandedBrands.push("Generic") } materialList.currentBrand = "Generic" base.currentItem = material persistExpandedCategories() return true } } for (var brand_idx = 0; brand_idx < materialsModel.count; brand_idx++) { var brand = materialsModel.getItem(brand_idx) var types_model = brand.material_types for (var type_idx = 0; type_idx < types_model.count; type_idx++) { var type = types_model.getItem(type_idx) var colors_model = type.colors for (var material_idx = 0; material_idx < colors_model.count; material_idx++) { var material = colors_model.getItem(material_idx) if (material.root_material_id == search_root_id) { if (materialList.expandedBrands.indexOf(brand.name) == -1) { materialList.expandedBrands.push(brand.name) } materialList.currentBrand = brand.name if (materialList.expandedTypes.indexOf(brand.name + "_" + type.name) == -1) { materialList.expandedTypes.push(brand.name + "_" + type.name) } materialList.currentType = brand.name + "_" + type.name base.currentItem = material persistExpandedCategories() return true } } } } base.currentItem = null return false } function updateAfterModelChanges() { var correctlyExpanded = materialList.expandActiveMaterial(base.newRootMaterialIdToSwitchTo) if (correctlyExpanded) { if (base.toActivateNewMaterial) { var position = Cura.ExtruderManager.activeExtruderIndex Cura.MachineManager.setMaterialById(position, base.newRootMaterialIdToSwitchTo) } base.newRootMaterialIdToSwitchTo = "" base.toActivateNewMaterial = false } } Connections { target: materialsModel function onItemsChanged() { updateAfterModelChanges() } } Connections { target: genericMaterialsModel function onItemsChanged() { updateAfterModelChanges() } } Column { width: materialList.width height: childrenRect.height MaterialsBrandSection { id: favoriteSection sectionName: "Favorites" elementsModel: favoriteMaterialsModel hasMaterialTypes: false } MaterialsBrandSection { id: genericSection sectionName: "Generic" elementsModel: genericMaterialsModel hasMaterialTypes: false } Repeater { model: materialsModel delegate: MaterialsBrandSection { id: brandSection sectionName: model.name elementsModel: model.material_types hasMaterialTypes: true } } } }