示例#1
0
class members_table(iface_gui_plugin):
    def __init__(self):
        super(members_table, self).__init__()
        self.membersTable = None
    
    def activate(self):
        iface_gui_plugin.activate(self)
        
    def deactivate(self):
        iface_gui_plugin.deactivate(self)
        
    def get_displayed_name(self):
        return "Peers"
        
    def addHostClicked(self, text):
        if get_server().controller != None:
            get_server().controller.addHostClicked(text)        
    
    def create_widget(self, parent):
        from PyQt4.QtGui import QSortFilterProxyModel
        from PyQt4.QtCore import QTimer, Qt
        from members_table.members_table_model import MembersTableModel
        from lunchinator.table_widget import TableWidget
        
        class NameSortProxyModel(QSortFilterProxyModel):
            def lessThan(self, left, right):
                # compare by lunch time
                ldata = self.sourceModel().data(left, MembersTableModel.SORT_ROLE)
                rdata = self.sourceModel().data(right, MembersTableModel.SORT_ROLE)
                if ldata != rdata:
                    return super(NameSortProxyModel, self).lessThan(left, right)
                
                # compare by name, case sensitive
                lindex = self.sourceModel().index(left.row(), MembersTableModel.NAME_COL_INDEX)
                rindex = self.sourceModel().index(right.row(), MembersTableModel.NAME_COL_INDEX)
                
                res = super(NameSortProxyModel, self).lessThan(lindex, rindex)
                if res or super(NameSortProxyModel, self).lessThan(rindex, lindex):
                    return res
                
                # compare by name, byte order
                ls = convert_string(self.sourceModel().data(lindex, MembersTableModel.SORT_ROLE).toString())
                rs = convert_string(self.sourceModel().data(rindex, MembersTableModel.SORT_ROLE).toString())
                if ls != rs:
                    return ls < rs
                
                # compare by peer ID 
                return self.sourceModel().keys[left.row()] < self.sourceModel().keys[right.row()]
        
        self.membersTable = TableWidget(parent, "Add Host", self.addHostClicked, sortedColumn=MembersTableModel.LUNCH_TIME_COL_INDEX, placeholderText="Enter hostname")
        self.membersTable.getTable().setContextMenuPolicy(Qt.CustomContextMenu)
        self.membersTable.getTable().customContextMenuRequested.connect(self._showContextMenu)
        
        # initialize members table
        self.membersModel = MembersTableModel(get_peers(), self.logger)
        self.membersProxyModel = NameSortProxyModel(self.membersTable)
        self.membersProxyModel.setSortCaseSensitivity(Qt.CaseInsensitive)
        self.membersProxyModel.setSortRole(MembersTableModel.SORT_ROLE)
        self.membersProxyModel.setDynamicSortFilter(True)
        self.membersProxyModel.setSourceModel(self.membersModel)
        self.membersTable.setModel(self.membersProxyModel)
        
        self.membersTable.setColumnWidth(MembersTableModel.NAME_COL_INDEX, 150)
        self.membersTable.setColumnWidth(MembersTableModel.GROUP_COL_INDEX, 150)
        
        get_notification_center().connectPeerAppended(self.membersModel.externalRowAppended)
        get_notification_center().connectPeerUpdated(self.membersModel.externalRowUpdated)
        get_notification_center().connectPeerRemoved(self.membersModel.externalRowRemoved)
        
        get_notification_center().connectMemberAppended(self._updatePeer)
        get_notification_center().connectMemberRemoved(self._updatePeer)
        
        get_notification_center().connectDisplayedPeerNameChanged(self._displayedNameChanged)
        
        self._lunchTimeColumnTimer = QTimer(self.membersModel)
        self._lunchTimeColumnTimer.timeout.connect(self._startSyncedTimer)
        self._lunchTimeColumnTimer.start(msecUntilNextMinute())
        
        return self.membersTable
    
    @loggingFunc
    def _displayedNameChanged(self, peerID, _newName, infoDict):
        self._updatePeer(peerID, infoDict)

    def _updatePeer(self, peerID, infoDict=None):
        peerID = convert_string(peerID)
        if infoDict == None:
            infoDict = get_peers().getPeerInfo(pID=peerID)
        
        if infoDict == None:
            #this happens when a peer that is also a member is removed 
            #-> the peer is not there anymore when the member removed signal arrives
            return
        
        self.membersModel.externalRowUpdated(peerID, infoDict)
    
    @loggingFunc
    def _startSyncedTimer(self):
        self.membersModel.updateLunchTimeColumn()
        self._lunchTimeColumnTimer.timeout.disconnect(self._startSyncedTimer)
        self._lunchTimeColumnTimer.timeout.connect(self.membersModel.updateLunchTimeColumn)
        self._lunchTimeColumnTimer.start(60000)

    @loggingFunc
    def _showContextMenu(self, point):
        from PyQt4.QtGui import QMenu, QCursor
        index = self.membersTable.getTable().indexAt(point)
        index = self.membersProxyModel.mapToSource(index)
        if index != None:
            peerID = self.membersModel.keyAtIndex(index)
            peer_action_utils.showPeerActionsPopup(peerID, lambda _pluginName, _action : True, self.membersTable.getTable())

    def destroy_widget(self):
        iface_gui_plugin.destroy_widget(self)
        
        get_notification_center().disconnectPeerAppended(self.membersModel.externalRowAppended)
        get_notification_center().disconnectPeerUpdated(self.membersModel.externalRowUpdated)
        get_notification_center().disconnectPeerRemoved(self.membersModel.externalRowRemoved)

        get_notification_center().disconnectMemberAppended(self._updatePeer)
        get_notification_center().disconnectMemberRemoved(self._updatePeer)
        
        get_notification_center().disconnectDisplayedPeerNameChanged(self._displayedNameChanged)
        
        self._lunchTimeColumnTimer.stop()
        self._lunchTimeColumnTimer.deleteLater()

        self.membersTable = None
        self.membersModel = None
        self.membersProxyModel = None
        
    def add_menu(self,menu):
        pass
示例#2
0
 def create_widget(self, parent):
     from PyQt4.QtGui import QSortFilterProxyModel
     from PyQt4.QtCore import QTimer, Qt
     from members_table.members_table_model import MembersTableModel
     from lunchinator.table_widget import TableWidget
     
     class NameSortProxyModel(QSortFilterProxyModel):
         def lessThan(self, left, right):
             # compare by lunch time
             ldata = self.sourceModel().data(left, MembersTableModel.SORT_ROLE)
             rdata = self.sourceModel().data(right, MembersTableModel.SORT_ROLE)
             if ldata != rdata:
                 return super(NameSortProxyModel, self).lessThan(left, right)
             
             # compare by name, case sensitive
             lindex = self.sourceModel().index(left.row(), MembersTableModel.NAME_COL_INDEX)
             rindex = self.sourceModel().index(right.row(), MembersTableModel.NAME_COL_INDEX)
             
             res = super(NameSortProxyModel, self).lessThan(lindex, rindex)
             if res or super(NameSortProxyModel, self).lessThan(rindex, lindex):
                 return res
             
             # compare by name, byte order
             ls = convert_string(self.sourceModel().data(lindex, MembersTableModel.SORT_ROLE).toString())
             rs = convert_string(self.sourceModel().data(rindex, MembersTableModel.SORT_ROLE).toString())
             if ls != rs:
                 return ls < rs
             
             # compare by peer ID 
             return self.sourceModel().keys[left.row()] < self.sourceModel().keys[right.row()]
     
     self.membersTable = TableWidget(parent, "Add Host", self.addHostClicked, sortedColumn=MembersTableModel.LUNCH_TIME_COL_INDEX, placeholderText="Enter hostname")
     self.membersTable.getTable().setContextMenuPolicy(Qt.CustomContextMenu)
     self.membersTable.getTable().customContextMenuRequested.connect(self._showContextMenu)
     
     # initialize members table
     self.membersModel = MembersTableModel(get_peers(), self.logger)
     self.membersProxyModel = NameSortProxyModel(self.membersTable)
     self.membersProxyModel.setSortCaseSensitivity(Qt.CaseInsensitive)
     self.membersProxyModel.setSortRole(MembersTableModel.SORT_ROLE)
     self.membersProxyModel.setDynamicSortFilter(True)
     self.membersProxyModel.setSourceModel(self.membersModel)
     self.membersTable.setModel(self.membersProxyModel)
     
     self.membersTable.setColumnWidth(MembersTableModel.NAME_COL_INDEX, 150)
     self.membersTable.setColumnWidth(MembersTableModel.GROUP_COL_INDEX, 150)
     
     get_notification_center().connectPeerAppended(self.membersModel.externalRowAppended)
     get_notification_center().connectPeerUpdated(self.membersModel.externalRowUpdated)
     get_notification_center().connectPeerRemoved(self.membersModel.externalRowRemoved)
     
     get_notification_center().connectMemberAppended(self._updatePeer)
     get_notification_center().connectMemberRemoved(self._updatePeer)
     
     get_notification_center().connectDisplayedPeerNameChanged(self._displayedNameChanged)
     
     self._lunchTimeColumnTimer = QTimer(self.membersModel)
     self._lunchTimeColumnTimer.timeout.connect(self._startSyncedTimer)
     self._lunchTimeColumnTimer.start(msecUntilNextMinute())
     
     return self.membersTable