From 8493948ba13315c92db9f0e40c189dc7d99ce410 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 15 Aug 2018 14:06:07 +0200 Subject: [PATCH] Add a favorite materials model Contributes to CURA-5162 --- cura/CuraApplication.py | 11 +++ .../Machines/Models/FavoriteMaterialsModel.py | 70 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 cura/Machines/Models/FavoriteMaterialsModel.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 23a11a2bb3..9823c0fadf 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -69,6 +69,7 @@ from cura.Machines.Models.QualityProfilesDropDownMenuModel import QualityProfile from cura.Machines.Models.CustomQualityProfilesDropDownMenuModel import CustomQualityProfilesDropDownMenuModel from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel from cura.Machines.Models.MaterialManagementModel import MaterialManagementModel +from cura.Machines.Models.FavoriteMaterialsModel import FavoriteMaterialsModel from cura.Machines.Models.GenericMaterialsModel import GenericMaterialsModel from cura.Machines.Models.BrandMaterialsModel import BrandMaterialsModel from cura.Machines.Models.QualityManagementModel import QualityManagementModel @@ -501,6 +502,15 @@ class CuraApplication(QtApplication): preferences.addPreference("cura/sidebar_collapsed", False) self._need_to_show_user_agreement = not self.getPreferences().getValue("general/accepted_user_agreement") + favorites = [ + "ultimaker_cpe_green_ultimaker_s5_AA_0.4", + "ultimaker_pla_green_ultimaker_s5_AA_0.4", + "ultimaker_abs_grey_ultimaker_s5_AA_0.4", + "an_incorrect_id" + ] + preferences.addPreference("cura/favorite_materials", favorites) + print("FAVORITES ARE NOW SET") + for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin @@ -931,6 +941,7 @@ class CuraApplication(QtApplication): qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") + qmlRegisterType(FavoriteMaterialsModel, "Cura", 1, 0, "FavoriteMaterialsModel") qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel") qmlRegisterType(BrandMaterialsModel, "Cura", 1, 0, "BrandMaterialsModel") qmlRegisterType(MaterialManagementModel, "Cura", 1, 0, "MaterialManagementModel") diff --git a/cura/Machines/Models/FavoriteMaterialsModel.py b/cura/Machines/Models/FavoriteMaterialsModel.py new file mode 100644 index 0000000000..f6932a61b8 --- /dev/null +++ b/cura/Machines/Models/FavoriteMaterialsModel.py @@ -0,0 +1,70 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Logger import Logger +from cura.Machines.Models.BaseMaterialsModel import BaseMaterialsModel + +class FavoriteMaterialsModel(BaseMaterialsModel): + + def __init__(self, parent = None): + super().__init__(parent) + + from cura.CuraApplication import CuraApplication + self._preferences = CuraApplication.getInstance().getPreferences() + self._machine_manager = CuraApplication.getInstance().getMachineManager() + self._extruder_manager = CuraApplication.getInstance().getExtruderManager() + self._material_manager = CuraApplication.getInstance().getMaterialManager() + + self._machine_manager.activeStackChanged.connect(self._update) #Update when switching machines. + self._material_manager.materialsUpdated.connect(self._update) #Update when the list of materials changes. + + self._update() + + def _update(self): + Logger.log("d", "Updating {model_class_name}.".format(model_class_name = self.__class__.__name__)) + + global_stack = self._machine_manager.activeMachine + if global_stack is None: + self.setItems([]) + return + extruder_position = str(self._extruder_position) + if extruder_position not in global_stack.extruders: + self.setItems([]) + return + extruder_stack = global_stack.extruders[extruder_position] + + available_material_dict = self._material_manager.getAvailableMaterialsForMachineExtruder(global_stack, extruder_stack) + if available_material_dict is None: + self.setItems([]) + return + + favorite_ids = self._preferences.getValue("cura/favorite_materials") + + item_list = [] + for root_material_id, container_node in available_material_dict.items(): + metadata = container_node.metadata + + # Only add results for favorite materials + if metadata["id"] not in favorite_ids: + continue + + # Do not include the materials from a to-be-removed package + if bool(metadata.get("removed", False)): + continue + + item = { + "root_material_id": root_material_id, + "id": metadata["id"], + "name": metadata["name"], + "brand": metadata["brand"], + "material": metadata["material"], + "color_name": metadata["color_name"], + "container_node": container_node + } + item_list.append(item) + + # Sort the item list by material name alphabetically + item_list = sorted(item_list, key = lambda d: d["name"].upper()) + + print("FINAL FAVORITE LIST:", item_list) + self.setItems(item_list)