Example #1
0
    def setSession(self, session):
        """ Configures this instance for a session.

        @param session Session instance
        """
        self.session = session
        self.messagesModel = MessagesTableModel(session, self.brushMap, self)
        self.filterModel = MessagesFilter(session.messagesBare, self)
        sortCol = self.messagesModel.columnTitles.index('Fields')
        self.filterModel.setFilterKeyColumn(sortCol)
        self.filterModel.setSourceModel(self.messagesModel)
        self.messageTable.setModel(self.filterModel)
Example #2
0
    def setSession(self, session):
        """ Configures this instance for a session.

        @param session Session instance
        """
        self.session = session
        self.messagesModel = MessagesTableModel(session, self.brushMap, self)
        self.filterModel = MessagesFilter(session.messagesBare, self)
        sortCol = self.messagesModel.columnTitles.index('Fields')
        self.filterModel.setFilterKeyColumn(sortCol)
        self.filterModel.setSourceModel(self.messagesModel)
        self.messageTable.setModel(self.filterModel)
Example #3
0
class MessageDisplay(QFrame, Ui_MessageDisplay, BasicHandler):
    """ MessageDisplay -> table view of session messages with nifty controls

    """
    filterModel = None

    def __init__(self, parent=None):
        """ Initializer.

        @param parent ancestor of this widget
        """
        QFrame.__init__(self, parent)
        self.setupUi(self)
        self.setupWidgets()
        self.setupColors()
        self.requestSession()

    def setupWidgets(self):
        """ Configures our widgets like we like.

        """
        settings = self.settings
        settings.beginGroup(settings.keys.messages)
        self.splitter.restoreState(defaults.rightSplitterState())
        messageDetail = self.messageDetail
        messageDetail.verticalHeader().hide()
        horizHeader = messageDetail.horizontalHeader()
        horizHeader.setResizeMode(horizHeader.Stretch)
        messageTable = self.messageTable
        messageTable.verticalHeader().hide()
        horizHeader = messageTable.horizontalHeader()
        horizHeader.setResizeMode(horizHeader.ResizeToContents)
        for widget in (self.messageTypeDisplay.typesListText,
                       self.messageTypeDisplay.allCheck):
            widget.setText('Display ' + widget.text())

    def setupColors(self):
        """ Configures the colors and icons of the message type items.

        """
        getValue = self.settings.value
        defaultColor = QColor(0, 0, 0)
        brushItems = [(name, getValue('%s/color' % name, defaultColor))
                      for name in messageTypeNames()]
        self.brushMap = brushMap = dict(brushItems)
        items = self.messageTypeDisplay.listItems()
        for item in items:
            color = QColor(brushMap[str(item.text())])
            item.setData(Qt.DecorationRole, QVariant(color))
            item.setIcon(colorIcon(color))

    def setSession(self, session):
        """ Configures this instance for a session.

        @param session Session instance
        """
        self.session = session
        self.messagesModel = MessagesTableModel(session, self.brushMap, self)
        self.filterModel = MessagesFilter(session.messagesBare, self)
        sortCol = self.messagesModel.columnTitles.index('Fields')
        self.filterModel.setFilterKeyColumn(sortCol)
        self.filterModel.setSourceModel(self.messagesModel)
        self.messageTable.setModel(self.filterModel)

    @pyqtSignature('int')
    def on_allCheck_stateChanged(self, state):
        """ Updates the filter model with all types or those checked.

        @param state 0 if unchecked, 1 if checked
        @return None
        """
        model = self.filterModel
        if state:
            model.includeAll()
        else:
            model.excludeAll()
            model.includeTypes(*self.messageTypeDisplay.selectedTypes())

    @pyqtSignature('')
    def on_checkAllButton_clicked(self):
        """ Updates the filter model to include all message types.

        """
        self.filterModel.includeAll()

    @pyqtSignature('')
    def on_checkNoneButton_clicked(self):
        """ Updates the filter model to exclude all message types.

        """
        self.filterModel.excludeAll()

    def on_filterEdit_editingFinished(self):
        """ Sets filter when the user presses enter in the filter line edit.

        """
        self.filterModel.setFilterWildcard(self.filterBar.filterEdit.text())

    def on_messageTable_clicked(self, index):
        """ Displays the message keys and values.

        @param index QModelIndex instance; filterModel index, not messageModel.
        @return None
        """
        firstIndex = index.sibling(index.row(), 0)
        messageIndex, validIndex = firstIndex.data().toInt()
        messageTime, message = self.messagesModel.message(messageIndex)
        messageDetail = self.messageDetail
        messageDetail.clearContents()
        typeName = message.typeName
        itemBrush = QBrush(self.brushMap[typeName])
        items = [('index', messageIndex), ('type', typeName),
                 ('received', ctime(messageTime))] + list(
                     sorted(message.items()))
        messageDetail.setRowCount(len(items))
        for row, pair in enumerate(items):
            for col, text in enumerate(pair):
                item = QTableWidgetItem(str(text))
                item.setForeground(itemBrush)
                messageDetail.setItem(row, col, item)

    def on_syncSource_stateChanged(self, state):
        """ Turns model updates on or off and enables filter bar to match.

        """
        state = bool(state)
        self.messagesModel.setSync(state)
        if state:
            self.filterBar.filterEdit.setText('')
            self.on_filterEdit_editingFinished()
        self.filterBar.setDisabled(state)

    def on_typesList_itemChanged(self, item):
        """ Updates the filter model by including or excluding a type.

        """
        model = self.filterModel
        if model is None:
            return
        call = model.includeTypes if item.checkState() else model.excludeTypes
        call(str(item.text()))

    def on_typesList_itemDoubleClicked(self, item):
        """ Displays a dialog for selecting the color of a message type.

        If the user selects a new color, we update the type list icon
        and color, the message table foreground, and possibly the
        message detail foreground.
        """
        currentColor = QColor(item.data(Qt.DecorationRole))
        newColor = QColorDialog.getColor(currentColor, self)
        if newColor.isValid():
            item.setData(Qt.DecorationRole, QVariant(newColor))
            item.setIcon(colorIcon(newColor))
            self.brushMap[str(item.text())] = itemBrush = QBrush(newColor)
            self.messagesModel.reset()
            self.settings.setValue('%s/color' % item.text(), newColor)
            messageDetail = self.messageDetail
            typeItem = messageDetail.item(1, 1)  # yuk
            if typeItem.text() == item.text():
                for row in range(messageDetail.rowCount()):
                    for col in range(messageDetail.columnCount()):
                        item = messageDetail.item(row, col)
                        item.setForeground(itemBrush)
Example #4
0
class MessageDisplay(QFrame, Ui_MessageDisplay, BasicHandler):
    """ MessageDisplay -> table view of session messages with nifty controls

    """
    filterModel = None

    def __init__(self, parent=None):
        """ Initializer.

        @param parent ancestor of this widget
        """
        QFrame.__init__(self, parent)
        self.setupUi(self)
        self.setupWidgets()
        self.setupColors()
        self.requestSession()

    def setupWidgets(self):
        """ Configures our widgets like we like.

        """
        settings = self.settings
        settings.beginGroup(settings.keys.messages)
        self.splitter.restoreState(defaults.rightSplitterState())
        messageDetail = self.messageDetail
        messageDetail.verticalHeader().hide()
        horizHeader = messageDetail.horizontalHeader()
        horizHeader.setResizeMode(horizHeader.Stretch)
        messageTable = self.messageTable
        messageTable.verticalHeader().hide()
        horizHeader = messageTable.horizontalHeader()
        horizHeader.setResizeMode(horizHeader.ResizeToContents)
        for widget in (self.messageTypeDisplay.typesListText,
                       self.messageTypeDisplay.allCheck):
            widget.setText('Display ' + widget.text())

    def setupColors(self):
        """ Configures the colors and icons of the message type items.

        """
        getValue = self.settings.value
        defaultColor = QColor(0,0,0)
        brushItems = [(name, getValue('%s/color' % name, defaultColor))
                      for name in messageTypeNames()]
        self.brushMap = brushMap = dict(brushItems)
        items = self.messageTypeDisplay.listItems()
        for item in items:
            color = QColor(brushMap[str(item.text())])
            item.setData(Qt.DecorationRole, QVariant(color))
            item.setIcon(colorIcon(color))

    def setSession(self, session):
        """ Configures this instance for a session.

        @param session Session instance
        """
        self.session = session
        self.messagesModel = MessagesTableModel(session, self.brushMap, self)
        self.filterModel = MessagesFilter(session.messagesBare, self)
        sortCol = self.messagesModel.columnTitles.index('Fields')
        self.filterModel.setFilterKeyColumn(sortCol)
        self.filterModel.setSourceModel(self.messagesModel)
        self.messageTable.setModel(self.filterModel)

    @pyqtSignature('int')
    def on_allCheck_stateChanged(self, state):
        """ Updates the filter model with all types or those checked.

        @param state 0 if unchecked, 1 if checked
        @return None
        """
        model = self.filterModel
        if state:
            model.includeAll()
        else:
            model.excludeAll()
            model.includeTypes(*self.messageTypeDisplay.selectedTypes())

    @pyqtSignature('')
    def on_checkAllButton_clicked(self):
        """ Updates the filter model to include all message types.

        """
        self.filterModel.includeAll()

    @pyqtSignature('')
    def on_checkNoneButton_clicked(self):
        """ Updates the filter model to exclude all message types.

        """
        self.filterModel.excludeAll()

    def on_filterEdit_editingFinished(self):
        """ Sets filter when the user presses enter in the filter line edit.

        """
        self.filterModel.setFilterWildcard(self.filterBar.filterEdit.text())

    def on_messageTable_clicked(self, index):
        """ Displays the message keys and values.

        @param index QModelIndex instance; filterModel index, not messageModel.
        @return None
        """
        firstIndex = index.sibling(index.row(), 0)
        messageIndex, validIndex = firstIndex.data().toInt()
        messageTime, message = self.messagesModel.message(messageIndex)
        messageDetail = self.messageDetail
        messageDetail.clearContents()
        typeName = message.typeName
        itemBrush = QBrush(self.brushMap[typeName])
        items = [
            ('index', messageIndex),
            ('type', typeName),
            ('received', ctime(messageTime))
        ] + list(sorted(message.items()))
        messageDetail.setRowCount(len(items))
        for row, pair in enumerate(items):
            for col, text in enumerate(pair):
                item = QTableWidgetItem(str(text))
                item.setForeground(itemBrush)
                messageDetail.setItem(row, col, item)

    def on_syncSource_stateChanged(self, state):
        """ Turns model updates on or off and enables filter bar to match.

        """
        state = bool(state)
        self.messagesModel.setSync(state)
        if state:
            self.filterBar.filterEdit.setText('')
            self.on_filterEdit_editingFinished()
        self.filterBar.setDisabled(state)

    def on_typesList_itemChanged(self, item):
        """ Updates the filter model by including or excluding a type.

        """
        model = self.filterModel
        if model is None:
            return
        call = model.includeTypes if item.checkState() else model.excludeTypes
        call(str(item.text()))

    def on_typesList_itemDoubleClicked(self, item):
        """ Displays a dialog for selecting the color of a message type.

        If the user selects a new color, we update the type list icon
        and color, the message table foreground, and possibly the
        message detail foreground.
        """
        currentColor = QColor(item.data(Qt.DecorationRole))
        newColor = QColorDialog.getColor(currentColor, self)
        if newColor.isValid():
            item.setData(Qt.DecorationRole, QVariant(newColor))
            item.setIcon(colorIcon(newColor))
            self.brushMap[str(item.text())] = itemBrush = QBrush(newColor)
            self.messagesModel.reset()
            self.settings.setValue('%s/color' % item.text(), newColor)
            messageDetail = self.messageDetail
            typeItem = messageDetail.item(1, 1) # yuk
            if typeItem.text() == item.text():
                for row in range(messageDetail.rowCount()):
                    for col in range(messageDetail.columnCount()):
                        item = messageDetail.item(row, col)
                        item.setForeground(itemBrush)