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
def init_menu(self, parent): # create the plugin submenu menu = QMenu(parent) plugin_menu = QMenu("PlugIns", menu) self.pluginActions = None if get_settings().get_plugins_enabled(): allPlugins = [x for x in get_plugin_manager().getAllPlugins() if not x.plugin_object.is_activation_forced()] if get_settings().get_group_plugins(): self.pluginActions = {} catMenus = {} for pluginInfo in sorted(allPlugins, key=lambda info : self._getDisplayedName(info)): categoryMenu = None anAction = None for aCat in pluginInfo.categories: if aCat in catMenus: categoryMenu = catMenus[aCat] else: categoryMenu = QMenu(aCat, plugin_menu) catMenus[aCat] = categoryMenu if anAction == None: anAction = self._create_plugin_action(pluginInfo, categoryMenu, aCat) else: categoryMenu.addAction(anAction) if aCat in self.pluginActions: self.pluginActions[aCat].append(anAction) else: self.pluginActions[aCat] = [anAction] for _cat, aMenu in sorted(catMenus.iteritems(), key=lambda aTuple : aTuple[0]): plugin_menu.addMenu(aMenu) else: self.pluginActions = [] for pluginInfo in sorted(allPlugins, key=lambda info : self._getDisplayedName(info)): anAction = self._create_plugin_action(pluginInfo, plugin_menu, pluginInfo.categories[0]) self.pluginActions.append(anAction) # main _menu self._memberStatusAction = menu.addAction("Initializing...") self._memberStatusAction.setEnabled(False) if hasattr(menu, "addSeparator"): menu.addSeparator() get_notification_center().connectMemberAppended(self._updateMemberStatus) get_notification_center().connectMemberUpdated(self._updateMemberStatus) get_notification_center().connectMemberRemoved(self._updateMemberStatus) self.memberStatusUpdateTimer = QTimer(self) self.memberStatusUpdateTimer.timeout.connect(self._startSyncedTimer) self.memberStatusUpdateTimer.start(msecUntilNextMinute()) anAction = menu.addAction('Call for lunch') anAction.triggered.connect(partial(self.sendMessageClicked, u'lunch')) anAction = menu.addAction('Show Lunchinator') anAction.triggered.connect(self.openWindowClicked) anAction = menu.addAction(u"Change today's lunch time") anAction.triggered.connect(self.changeNextLunchTime) if hasattr(menu, "addSeparator"): menu.addSeparator() anAction = menu.addAction('Settings') anAction.triggered.connect(self.openSettingsClicked) menu.addMenu(plugin_menu) if hasattr(menu, "addSeparator"): menu.addSeparator() self._restartStatusAction = menu.addAction(self._restartReason) self._restartStatusAction.setEnabled(False) self._restartAction = menu.addAction("Restart") self._restartAction.triggered.connect(partial(restart, getCoreLogger())) if self._restartReason: self._restartStatusAction.setVisible(True) self._restartAction.setVisible(True) else: self._restartStatusAction.setVisible(False) self._restartAction.setVisible(False) self._appUpdateStatusAction = menu.addAction("Lunchinator can be updated") self._appUpdateStatusAction.setEnabled(False) self._appUpdateStatusAction.setVisible(self._updateAvailable) self._repoUpdateStatusAction = menu.addAction("") self._repoUpdateStatusAction.setEnabled(False) self._updateRepoUpdateStatusAction() self._installUpdatesAction = menu.addAction("Install updates and restart") self._installUpdatesAction.triggered.connect(get_notification_center().emitInstallUpdates) self._installUpdatesAction.setVisible(self._updateAvailable) anAction = menu.addAction('Exit') anAction.triggered.connect(self.quitClicked) return menu