def _add_exclude_filter(self, filter_index=False): """ :param filter_index: if false then this function shows a QMenu to allow the user to choose a type of message filter. ''bool'' OR :param filter_index: the index of the filter to be added, ''int'' :return: if a filter was added then the index is returned, ''int'' OR :return: if no filter was added then None is returned, ''NoneType'' """ if filter_index is False: filter_index = -1 filter_select_menu = QMenu() for index in self._filter_factory_order: # flattens the _exclude filters list and only adds the item if it doesn't # already exist if index in ['message', 'location'] or \ not self.filter_factory[index][1] in \ [type(item) for sublist in self._exclude_filters for item in sublist]: filter_select_menu.addAction(self.filter_factory[index][0]) action = filter_select_menu.exec_(QCursor.pos()) if action is None: return None for index in self._filter_factory_order: if self.filter_factory[index][0] == action.text(): filter_index = index if filter_index == -1: return None index = len(self._exclude_filters) newfilter = self.filter_factory[filter_index][1]() if len(self.filter_factory[filter_index]) >= 4: newwidget = self.filter_factory[filter_index][2]( newfilter, self._rospack, self.filter_factory[filter_index][3]) else: newwidget = self.filter_factory[filter_index][2](newfilter, self._rospack) # pack the new filter tuple onto the filter list self._exclude_filters.append( (newfilter, FilterWrapperWidget(newwidget, self.filter_factory[filter_index][0]), filter_index)) self._proxy_model.add_exclude_filter(newfilter) newfilter.filter_changed_signal.connect( self._proxy_model.handle_exclude_filters_changed) self._exclude_filters[index][1].delete_button.clicked.connect( self._delete_exclude_filter) self._model.rowsInserted.connect( self._exclude_filters[index][1].repopulate) # place the widget in the proper location self.exclude_table.insertRow(index) self.exclude_table.setCellWidget(index, 0, self._exclude_filters[index][1]) self.exclude_table.resizeColumnsToContents() self.exclude_table.resizeRowsToContents() newfilter.filter_changed_signal.emit() return index
def _add_exclude_filter(self, filter_index=False): """ :param filter_index: if false then this function shows a QMenu to allow the user to choose a type of message filter. ''bool'' OR :param filter_index: the index of the filter to be added, ''int'' :return: if a filter was added then the index is returned, ''int'' OR :return: if no filter was added then None is returned, ''NoneType'' """ if filter_index is False: filter_index = -1 filter_select_menu = QMenu() for index in self._filter_factory_order: # flattens the _exclude filters list and only adds the item if it doesn't already exist if index in ['message', 'location'] or not self.filter_factory[index][1] in [type(item) for sublist in self._exclude_filters for item in sublist]: filter_select_menu.addAction(self.filter_factory[index][0]) action = filter_select_menu.exec_(QCursor.pos()) if action is None: return None for index in self._filter_factory_order: if self.filter_factory[index][0] == action.text(): filter_index = index if filter_index == -1: return None index = len(self._exclude_filters) newfilter = self.filter_factory[filter_index][1]() if len(self.filter_factory[filter_index]) >= 4: newwidget = self.filter_factory[filter_index][2](newfilter, self._rospack, self.filter_factory[filter_index][3]) else: newwidget = self.filter_factory[filter_index][2](newfilter, self._rospack) # pack the new filter tuple onto the filter list self._exclude_filters.append((newfilter, FilterWrapperWidget(newwidget, self.filter_factory[filter_index][0]), filter_index)) self._proxy_model.add_exclude_filter(newfilter) newfilter.filter_changed_signal.connect(self._proxy_model.handle_exclude_filters_changed) self._exclude_filters[index][1].delete_button.clicked.connect(self._delete_exclude_filter) self._model.rowsInserted.connect(self._exclude_filters[index][1].repopulate) # place the widget in the proper location self.exclude_table.insertRow(index) self.exclude_table.setCellWidget(index, 0, self._exclude_filters[index][1]) self.exclude_table.resizeColumnsToContents() self.exclude_table.resizeRowsToContents() newfilter.filter_changed_signal.emit() return index
def _on_ctrl_info(self, index): popup = self._popup_widget ctrl = self._controllers[index.row()] popup.ctrl_name.setText(ctrl.name) popup.ctrl_type.setText(ctrl.type) res_model = QStandardItemModel() model_root = QStandardItem('Claimed Resources') res_model.appendRow(model_root) for hw_res in ctrl.claimed_resources: hw_iface_item = QStandardItem(hw_res.hardware_interface) model_root.appendRow(hw_iface_item) for res in hw_res.resources: res_item = QStandardItem(res) hw_iface_item.appendRow(res_item) popup.resource_tree.setModel(res_model) popup.resource_tree.setItemDelegate(FontDelegate(popup.resource_tree)) popup.resource_tree.expandAll() popup.move(QCursor.pos()) popup.show()
def showEvent(self, event): geom = self.frameGeometry() geom.moveTopLeft(QCursor.pos()) self.setGeometry(geom) super(QDialog, self).showEvent(event)
class DetachableTabBar(QTabBar): ''' The TabBar class re-implements some of the functionality of the QTabBar widget ''' detach_tab_signal = Signal(int, QPoint, bool) # tab at pos, mouse cursor position, by double click move_tab_signal = Signal(int, int) empty_signal = Signal() def __init__(self, parent=None): QTabBar.__init__(self, parent) self.setAcceptDrops(True) self.setElideMode(Qt.ElideRight) self.setSelectionBehaviorOnRemove(QTabBar.SelectLeftTab) self.drag_start_pos = QPoint() self.drag_droped_pos = QPoint() self.mouse_cursor = QCursor() self.drag_initiated = False def mouseDoubleClickEvent(self, event): ''' Send the detach_tab_signal when a tab is double clicked ''' event.accept() self.detach_tab_signal.emit(self.tabAt(event.pos()), self.mouse_cursor.pos(), True) def mousePressEvent(self, event): ''' Set the starting position for a drag event when the mouse button is pressed ''' self.drag_droped_pos = QPoint(0, 0) self.drag_initiated = False if event.button() == Qt.LeftButton: self.drag_start_pos = event.pos() QTabBar.mousePressEvent(self, event) def mouseMoveEvent(self, event): ''' Determine if the current movement is a drag. If it is, convert it into a QDrag. If the drag ends inside the tab bar, emit an move_tab_signal. If the drag ends outside the tab bar, emit an detach_tab_signal. ''' # Determine if the current movement is detected as a drag if not self.drag_start_pos.isNull() and ((event.pos() - self.drag_start_pos).manhattanLength() > QApplication.startDragDistance()): self.drag_initiated = True # If the current movement is a drag initiated by the left button if ((event.buttons() & Qt.LeftButton)) and self.drag_initiated: # Stop the move event finishMoveEvent = QMouseEvent(QEvent.MouseMove, event.pos(), Qt.NoButton, Qt.NoButton, Qt.NoModifier) QTabBar.mouseMoveEvent(self, finishMoveEvent) # Convert the move event into a drag drag = QDrag(self) mime_data = QMimeData() mime_data.setData('action', b'application/tab-detach') drag.setMimeData(mime_data) # Create the appearance of dragging the tab content # tab_index = self.tabAt(self.drag_start_pos) pixmap = self.parentWidget().grab() targetPixmap = QPixmap(pixmap.size()) targetPixmap.fill(Qt.transparent) painter = QPainter(targetPixmap) painter.setOpacity(0.85) painter.drawPixmap(0, 0, pixmap) painter.end() drag.setPixmap(targetPixmap) # Initiate the drag dropAction = drag.exec_(Qt.MoveAction | Qt.CopyAction) # If the drag completed outside of the tab bar, detach the tab and move # the content to the current cursor position if dropAction == Qt.IgnoreAction: event.accept() self.detach_tab_signal.emit(self.tabAt(self.drag_start_pos), self.mouse_cursor.pos(), False) elif dropAction == Qt.MoveAction: # else if the drag completed inside the tab bar, move the selected tab to the new position if not self.drag_droped_pos.isNull(): self.move_tab_signal.emit(self.tabAt(self.drag_start_pos), self.tabAt(self.drag_droped_pos)) else: # else if the drag completed inside the tab bar new TabBar, move the selected tab to the new TabBar self.detach_tab_signal.emit(self.tabAt(self.drag_start_pos), self.mouse_cursor.pos(), False) event.accept() else: QTabBar.mouseMoveEvent(self, event) def dragEnterEvent(self, event): ''' Determine if the drag has entered a tab position from another tab position ''' self.drag_droped_pos = QPoint(0, 0) mime_data = event.mimeData() formats = mime_data.formats() if 'action' in formats and mime_data.data('action') == 'application/tab-detach': event.acceptProposedAction() QTabBar.dragMoveEvent(self, event) def dropEvent(self, event): ''' Get the position of the end of the drag ''' self.drag_droped_pos = event.pos() mime_data = event.mimeData() formats = mime_data.formats() if 'action' in formats and mime_data.data('action') == 'application/tab-detach': event.acceptProposedAction() QTabBar.dropEvent(self, event) def prepared_for_drop(self): return not self.drag_droped_pos.isNull() def tabRemoved(self, index): QTabBar.tabRemoved(self, index) if self.count() == 0: self.empty_signal.emit()