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