1# Copyright (c) 2015 Ultimaker B.V. 2# Uranium is released under the terms of the LGPLv3 or higher. 3 4from PyQt5.QtCore import Qt 5 6from UM.Application import Application 7from UM.FlameProfiler import pyqtSlot 8from UM.Qt.ListModel import ListModel 9 10 11class VisibleMessagesModel(ListModel): 12 TextRole = Qt.UserRole + 1 13 MaxProgressRole = Qt.UserRole + 2 14 ProgressRole = Qt.UserRole + 3 15 IDRole = Qt.UserRole + 4 16 ActionsRole = Qt.UserRole + 5 17 IconRole = Qt.UserRole + 6 18 DescriptionRole = Qt.UserRole + 7 19 DismissableRole = Qt.UserRole + 8 20 TileRole = Qt.UserRole + 9 21 StyleRole = Qt.UserRole + 10 22 ImageSourceRole = Qt.UserRole + 11 23 ImageCaptionRole = Qt.UserRole + 12 24 OptionTextRole = Qt.UserRole + 13 25 OptionStateRole = Qt.UserRole + 14 26 27 def __init__(self, parent=None): 28 super().__init__(parent) 29 Application.getInstance().visibleMessageAdded.connect(self.addMessage) 30 Application.getInstance().visibleMessageRemoved.connect(self.removeMessage) 31 self.addRoleName(self.TextRole, "text") 32 self.addRoleName(self.MaxProgressRole, "max_progress") 33 self.addRoleName(self.ProgressRole, "progress") 34 self.addRoleName(self.IDRole, "id") 35 self.addRoleName(self.ActionsRole, "actions") 36 self.addRoleName(self.DismissableRole, "dismissable") 37 self.addRoleName(self.TileRole, "title") 38 self.addRoleName(self.ImageSourceRole, "image_source") 39 self.addRoleName(self.ImageCaptionRole, "image_caption") 40 self.addRoleName(self.OptionTextRole, "option_text") 41 self.addRoleName(self.OptionStateRole, "option_state") 42 self._populateMessageList() 43 44 def _populateMessageList(self): 45 for message in Application.getInstance().getVisibleMessages(): 46 self.addMessage(message) 47 48 def addMessage(self, message): 49 self.appendItem({ 50 "text": message.getText(), 51 "progress": message.getProgress(), 52 "max_progress": message.getMaxProgress(), 53 "id": str(id(message)), 54 "actions": self.createActionsModel(message.getActions()), 55 "dismissable": message.isDismissable(), 56 "title": message.getTitle(), 57 "image_source": message.getImageSource(), 58 "image_caption": message.getImageCaption(), 59 "option_text": message.getOptionText(), 60 "option_state": message.getOptionState() 61 }) 62 message.titleChanged.connect(self._onMessageTitleChanged) 63 message.textChanged.connect(self._onMessageTextChanged) 64 message.progressChanged.connect(self._onMessageProgress) 65 66 def createActionsModel(self, actions): 67 model = ListModel() 68 model.addRoleName(self.IDRole, "action_id") 69 model.addRoleName(self.TextRole,"name") 70 model.addRoleName(self.IconRole, "icon") 71 model.addRoleName(self.DescriptionRole, "description") 72 model.addRoleName(self.StyleRole, "button_style") 73 74 for action in actions: 75 model.appendItem(action) 76 return model 77 78 @pyqtSlot(str) 79 def hideMessage(self, message_id): 80 Application.getInstance().hideMessageById(message_id) 81 82 @pyqtSlot(str, bool) 83 def optionToggled(self, message_id, value): 84 for message in Application.getInstance().getVisibleMessages(): 85 if str(id(message)) == message_id: 86 message.optionToggled.emit(value) 87 break 88 89 @pyqtSlot(str, str) 90 def actionTriggered(self, message_id, action_id): 91 for message in Application.getInstance().getVisibleMessages(): 92 if str(id(message)) == message_id: 93 message.actionTriggered.emit(message, action_id) 94 break 95 96 def removeMessage(self, message): 97 message_id = str(id(message)) 98 for index in range(0,len(self.items)): 99 if self.items[index]["id"] == message_id: 100 self.removeItem(index) 101 break 102 103 def _onMessageTitleChanged(self, message): 104 index = self.find("id", str(id(message))) 105 106 if index != -1: 107 self.setProperty(index, "title", message.getTitle()) 108 109 def _onMessageTextChanged(self, message): 110 index = self.find("id", str(id(message))) 111 112 if index != -1: 113 self.setProperty(index, "text", message.getText()) 114 115 def _onMessageProgress(self, message): 116 index = self.find("id", str(id(message))) 117 118 if index != -1: 119 self.setProperty(index, "progress", message.getProgress()) 120