class ChooseSectionsPage(QIWizardPage): """ page to choose the sections that should be compared in the table """ def __init__(self, parent=None): super(ChooseSectionsPage, self).__init__(parent) self.selected_sections = [] # sections in the right tree self.sections = [] # all sections without the selected self.filtered_sections = [] # filtered sections without the selected self.initUI() def initUI(self): mainlayout = QVBoxLayout() # layout containing the treewidgets sectionlistlayout = QHBoxLayout() # layout for filter form filterbox = QGroupBox("Filter") self.LEsecname = QLineEdit() self.LEsectype = QLineEdit() self.LEpropname = QLineEdit() filterlayout = QGridLayout() filterlayout.addWidget(QLabel("Section Name"), 1, 0) filterlayout.addWidget(QLabel("Section Type"), 2, 0) filterlayout.addWidget(QLabel("Property Name"), 3, 0) filterlayout.addWidget(self.LEsecname, 1, 1) filterlayout.addWidget(self.LEsectype, 2, 1) filterlayout.addWidget(self.LEpropname, 3, 1) filterbox.setLayout(filterlayout) self.LEsecname.textChanged.connect(self.filterSections) self.LEsectype.textChanged.connect(self.filterSections) self.LEpropname.textChanged.connect(self.filterSections) # define layout for the trre-widgets containing the sections self.section_tree = QTreeWidget() self.section_tree.setColumnCount(2) self.section_tree.setHeaderLabels(["Name", "Path"]) self.section_tree.itemDoubleClicked.connect(self.toright) self.selection_tree = QTreeWidget() self.selection_tree.setColumnCount(2) self.selection_tree.setHeaderLabels(["Name", "Path"]) self.selection_tree.itemDoubleClicked.connect(self.toleft) self.selection_tree.setSelectionMode(3) self.section_tree.setSelectionMode(3) self.settings.register("selected_secs", self.selected_sections) # buttons to move items of the tree-widgets movebuttonlayout = QVBoxLayout() btn_right = QToolButton() btn_right.setArrowType(Qt.RightArrow) btn_right.clicked.connect(self.toright) btn_left = QToolButton() btn_left.setArrowType(Qt.LeftArrow) btn_left.clicked.connect(self.toleft) movebuttonlayout.addStretch(1) movebuttonlayout.addWidget(btn_right) movebuttonlayout.addSpacing(1) movebuttonlayout.addWidget(btn_left) movebuttonlayout.addStretch(1) sectionlistlayout.addWidget(self.section_tree) sectionlistlayout.addSpacing(1) sectionlistlayout.addLayout(movebuttonlayout) sectionlistlayout.addSpacing(1) sectionlistlayout.addWidget(self.selection_tree) mainlayout.addLayout(sectionlistlayout) self.selectallcb = QCheckBox('select all (Ctrl+A)') self.selectallcb.stateChanged.connect(self.selectall) mainlayout.addWidget(self.selectallcb) mainlayout.addWidget(filterbox) self.setTitle("Select Sections") self.setLayout(mainlayout) self.adjustSize() def initializePage(self): # load sections and properties from the selected file odmldoc = odml.tools.xmlparser.load(self.settings.get_object( "inputfilename")) for section in odmldoc.itersections(): self.sections.append([section.name, section.get_path(), [p.name for p in section.properties], section.type]) # fill tree widget with sections and properties for line in self.sections: parent = QTreeWidgetItem([line[0], line[1]]) for p in line[2]: QTreeWidgetItem(parent, [str(p)]) self.section_tree.addTopLevelItem(parent) self.filtered_sections = list(self.sections) self.setTitle("Choose Sections") self.setSubTitle("Choose the sections you want to compare") def _get_selected_rows(self, tree): """ function to determine the selected rows in a specified QTreeWidget """ rows = [] for index in tree.selectedIndexes(): if index.parent().row() is -1: rows.append(index.row()) else: # if a property is selected, the whole section containing this # property shall be moved rows.append(index.parent().row()) # sort rownumbers in descending order to prevent shifting when moving # the items return sorted(list(set(rows)), reverse=True) def toright(self): """ function to shift items from the left TreeWidget to the right """ rows = self._get_selected_rows(self.section_tree) for row in rows: self.selection_tree.addTopLevelItem( self.section_tree.takeTopLevelItem(row)) self.selected_sections.append(self.sections.pop( self.sections.index(self.filtered_sections[row]))) self.filtered_sections.pop(row) def toleft(self): """ function to shift items from the right TreeWidget to the left """ rows = self._get_selected_rows(self.selection_tree) for row in rows: self.section_tree.addTopLevelItem( self.selection_tree.takeTopLevelItem(row)) item = self.selected_sections.pop(row) self.sections.append(item) self.filtered_sections.append(item) def filterSections(self): # find sections that match the filter self.filtered_sections = [s for s in self.sections if str(self.LEsecname.text()) in s[0] and str(self.LEsectype.text()) in s[3] and any([str(self.LEpropname.text()) in p for p in s[2]])] # clear left treewidget self.section_tree.clear() # fill left treewidget with the filtered sections for line in self.filtered_sections: parent = QTreeWidgetItem([line[0], line[1]]) for p in line[2]: QTreeWidgetItem(parent, [p]) self.section_tree.addTopLevelItem(parent) def selectall(self): if self.selectallcb.isChecked(): self.section_tree.selectAll() else: self.section_tree.clearSelection() def validatePage(self): if not self.settings.get_object("selected_secs"): QMessageBox.warning(self, 'No sections chosen', 'You should choose at least two sections to be ' 'compared in the table.') return 0 return 1
class ClientExceptionsViewer( QWidget ): " Implements the client exceptions viewer for a debugger " def __init__( self, parent, ignoredExceptionsViewer ): QWidget.__init__( self, parent ) self.__ignoredExceptionsViewer = ignoredExceptionsViewer self.__currentItem = None self.__createPopupMenu() self.__createLayout() GlobalData().project.projectChanged.connect( self.__onProjectChanged ) return def setFocus( self ): " Sets the widget focus " self.exceptionsList.setFocus() return def __createPopupMenu( self ): " Creates the popup menu " self.__excptMenu = QMenu() self.__addToIgnoreMenuItem = self.__excptMenu.addAction( "Add to ignore list", self.__onAddToIgnore ) self.__jumpToCodeMenuItem = self.__excptMenu.addAction( "Jump to code", self.__onJumpToCode ) return def __createLayout( self ): " Creates the widget layout " verticalLayout = QVBoxLayout( self ) verticalLayout.setContentsMargins( 0, 0, 0, 0 ) verticalLayout.setSpacing( 0 ) self.headerFrame = QFrame() self.headerFrame.setFrameStyle( QFrame.StyledPanel ) self.headerFrame.setAutoFillBackground( True ) headerPalette = self.headerFrame.palette() headerBackground = headerPalette.color( QPalette.Background ) headerBackground.setRgb( min( headerBackground.red() + 30, 255 ), min( headerBackground.green() + 30, 255 ), min( headerBackground.blue() + 30, 255 ) ) headerPalette.setColor( QPalette.Background, headerBackground ) self.headerFrame.setPalette( headerPalette ) self.headerFrame.setFixedHeight( 24 ) self.__excptLabel = QLabel( "Exceptions" ) fixedSpacer = QSpacerItem( 3, 3 ) headerLayout = QHBoxLayout() headerLayout.setContentsMargins( 0, 0, 0, 0 ) headerLayout.addSpacerItem( fixedSpacer ) headerLayout.addWidget( self.__excptLabel ) self.headerFrame.setLayout( headerLayout ) self.exceptionsList = QTreeWidget( self ) self.exceptionsList.setSortingEnabled( False ) self.exceptionsList.setAlternatingRowColors( True ) self.exceptionsList.setRootIsDecorated( True ) self.exceptionsList.setItemsExpandable( True ) self.exceptionsList.setUniformRowHeights( True ) self.exceptionsList.setSelectionMode( QAbstractItemView.SingleSelection ) self.exceptionsList.setSelectionBehavior( QAbstractItemView.SelectRows ) self.exceptionsList.setItemDelegate( NoOutlineHeightDelegate( 4 ) ) self.exceptionsList.setContextMenuPolicy( Qt.CustomContextMenu ) self.__addToIgnoreButton = QAction( PixmapCache().getIcon( 'add.png' ), "Add exception to the list of ignored", self ) self.__addToIgnoreButton.triggered.connect( self.__onAddToIgnore ) self.__addToIgnoreButton.setEnabled( False ) expandingSpacer = QWidget() expandingSpacer.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding ) self.__jumpToCodeButton = QAction( PixmapCache().getIcon( 'gotoline.png' ), "Jump to the code", self ) self.__jumpToCodeButton.triggered.connect( self.__onJumpToCode ) self.__jumpToCodeButton.setEnabled( False ) self.__delAllButton = QAction( PixmapCache().getIcon( 'trash.png' ), "Delete all the client exceptions", self ) self.__delAllButton.triggered.connect( self.__onDelAll ) self.__delAllButton.setEnabled( False ) self.toolbar = QToolBar() self.toolbar.setOrientation( Qt.Horizontal ) self.toolbar.setMovable( False ) self.toolbar.setAllowedAreas( Qt.TopToolBarArea ) self.toolbar.setIconSize( QSize( 16, 16 ) ) self.toolbar.setFixedHeight( 28 ) self.toolbar.setContentsMargins( 0, 0, 0, 0 ) self.toolbar.addAction( self.__addToIgnoreButton ) self.toolbar.addAction( self.__jumpToCodeButton ) self.toolbar.addWidget( expandingSpacer ) self.toolbar.addAction( self.__delAllButton ) self.exceptionsList.itemDoubleClicked.connect( self.__onExceptionDoubleClicked ) self.exceptionsList.customContextMenuRequested.connect( self.__showContextMenu ) self.exceptionsList.itemSelectionChanged.connect( self.__onSelectionChanged ) self.exceptionsList.setHeaderLabels( [ "Exception" ] ) verticalLayout.addWidget( self.headerFrame ) verticalLayout.addWidget( self.toolbar ) verticalLayout.addWidget( self.exceptionsList ) return def clear( self ): " Clears the content " self.exceptionsList.clear() self.__updateExceptionsLabel() self.__addToIgnoreButton.setEnabled( False ) self.__jumpToCodeButton.setEnabled( False ) self.__delAllButton.setEnabled( False ) self.__currentItem = None self.emit( SIGNAL( 'ClientExceptionsCleared' ) ) return def __onExceptionDoubleClicked( self, item, column ): " Triggered when an exception is double clicked " if self.__currentItem is not None: if self.__currentItem.getType() == STACK_FRAME_ITEM: self.__onJumpToCode() return # This is an exception item itself. # Open a separate dialog window with th detailed info. return def __showContextMenu( self, coord ): " Shows the frames list context menu " self.__contextItem = self.exceptionsList.itemAt( coord ) self.__addToIgnoreMenuItem.setEnabled( self.__addToIgnoreButton.isEnabled() ) self.__jumpToCodeMenuItem.setEnabled( self.__jumpToCodeButton.isEnabled() ) if self.__contextItem is not None: self.__excptMenu.popup( QCursor.pos() ) return def __onAddToIgnore( self ): " Adds an exception into the ignore list " if self.__currentItem is not None: self.__ignoredExceptionsViewer.addExceptionFilter( str( self.__currentItem.getExceptionType() ) ) self.__addToIgnoreButton.setEnabled( False ) return def __onJumpToCode( self ): " Jumps to the corresponding source code line " if self.__currentItem is not None: if self.__currentItem.getType() == STACK_FRAME_ITEM: fileName = self.__currentItem.getFileName() if '<' not in fileName and '>' not in fileName: lineNumber = self.__currentItem.getLineNumber() editorsManager = GlobalData().mainWindow.editorsManager() editorsManager.openFile( fileName, lineNumber ) editor = editorsManager.currentWidget().getEditor() editor.gotoLine( lineNumber ) editorsManager.currentWidget().setFocus() return def __onDelAll( self ): " Triggered when all the exceptions should be deleted " self.clear() return def addException( self, exceptionType, exceptionMessage, stackTrace ): " Adds the exception to the view " for index in xrange( self.exceptionsList.topLevelItemCount() ): item = self.exceptionsList.topLevelItem( index ) if item.equal( exceptionType, exceptionMessage, stackTrace ): item.incrementCounter() self.exceptionsList.clearSelection() self.exceptionsList.setCurrentItem( item ) self.__updateExceptionsLabel() return item = ExceptionItem( self.exceptionsList, exceptionType, exceptionMessage, stackTrace ) self.exceptionsList.clearSelection() self.exceptionsList.setCurrentItem( item ) self.__updateExceptionsLabel() self.__delAllButton.setEnabled( True ) return def __updateExceptionsLabel( self ): " Updates the exceptions header label " total = self.getTotalCount() if total > 0: self.__excptLabel.setText( "Exceptions (total: " + str( total ) + ")" ) else: self.__excptLabel.setText( "Exceptions" ) return def getTotalCount( self ): " Provides the total number of exceptions " count = 0 for index in xrange( self.exceptionsList.topLevelItemCount() ): count += self.exceptionsList.topLevelItem( index ).getCount() return count def __onProjectChanged( self, what ): " Triggered when a project is changed " if what == CodimensionProject.CompleteProject: self.clear() return def __onSelectionChanged( self ): " Triggered when the current item is changed " selected = list( self.exceptionsList.selectedItems() ) if selected: self.__currentItem = selected[ 0 ] if self.__currentItem.getType() == STACK_FRAME_ITEM: fileName = self.__currentItem.getFileName() if '<' in fileName or '>' in fileName: self.__jumpToCodeButton.setEnabled( False ) else: self.__jumpToCodeButton.setEnabled( True ) self.__addToIgnoreButton.setEnabled( False ) else: self.__jumpToCodeButton.setEnabled( False ) excType = str( self.__currentItem.getExceptionType() ) if self.__ignoredExceptionsViewer.isIgnored( excType ) or \ " " in excType or excType.startswith( "unhandled" ): self.__addToIgnoreButton.setEnabled( False ) else: self.__addToIgnoreButton.setEnabled( True ) else: self.__currentItem = None self.__addToIgnoreButton.setEnabled( False ) self.__jumpToCodeButton.setEnabled( False ) return
class CustomStaff(SymbolManager, QWidget): def __init__(self, dialog): QWidget.__init__(self, dialog) SymbolManager.__init__(self) self.setDefaultSymbolSize(40) self.dialog = dialog self.setLayout(QGridLayout()) self.tree = QTreeWidget() self.stack = QStackedWidget() StackFader(self.stack) self.systems = QSpinBox() newStaves = QVBoxLayout() operations = QHBoxLayout() self.layout().addLayout(newStaves, 0, 0) self.layout().addWidget(self.tree, 0, 1) self.layout().addWidget(self.stack, 0, 2, 1, 2) self.layout().addWidget(self.systems, 1, 3) self.systems.setRange(1, 64) l = QLabel(i18n("Systems per page:")) l.setBuddy(self.systems) self.layout().addWidget(l, 1, 2, Qt.AlignRight) self.layout().addLayout(operations, 1, 1) operations.setSpacing(0) operations.setContentsMargins(0, 0, 0, 0) removeButton = KPushButton(KStandardGuiItem.remove()) removeButton.clicked.connect(self.removeSelectedItems) operations.addWidget(removeButton) upButton = QToolButton() upButton.clicked.connect(self.moveSelectedItemsUp) upButton.setIcon(KIcon("go-up")) operations.addWidget(upButton) downButton = QToolButton() downButton.clicked.connect(self.moveSelectedItemsDown) downButton.setIcon(KIcon("go-down")) operations.addWidget(downButton) newStaves.setSpacing(0) newStaves.setContentsMargins(0, 0, 0, 0) self.tree.setIconSize(QSize(32, 32)) self.tree.setDragDropMode(QTreeWidget.InternalMove) self.tree.headerItem().setHidden(True) self.tree.itemSelectionChanged.connect(self.slotSelectionChanged) for staffType in ( BracketItem, BraceItem, StaffItem, ): b = QPushButton(staffType.name()) b.clicked.connect((lambda t: lambda: self.createItem(t))(staffType)) b.setIconSize(QSize(40, 40)) self.addSymbol(b, staffType.symbol()) newStaves.addWidget(b) def createItem(self, staffType): empty = self.tree.topLevelItemCount() == 0 items = self.tree.selectedItems() if len(items) == 1 and items[0].flags() & Qt.ItemIsDropEnabled: parent = items[0] else: parent = self.tree item = staffType(self, parent) if empty: item.setSelected(True) def slotSelectionChanged(self): items = self.tree.selectedItems() if items: self.stack.setCurrentWidget(items[0].widget) def moveSelectedItemsUp(self): items = self.tree.selectedItems() if items: item = items[0] # currently we support only one selected item parent = item.parent() or self.tree.invisibleRootItem() index = parent.indexOfChild(item) if index > 0: parent.takeChild(index) parent.insertChild(index - 1, item) self.tree.clearSelection() item.setSelected(True) item.setExpanded(True) def moveSelectedItemsDown(self): items = self.tree.selectedItems() if items: item = items[0] # currently we support only one selected item parent = item.parent() or self.tree.invisibleRootItem() index = parent.indexOfChild(item) if index < parent.childCount() - 1: parent.takeChild(index) parent.insertChild(index + 1, item) self.tree.clearSelection() item.setSelected(True) item.setExpanded(True) def removeSelectedItems(self): for item in self.tree.selectedItems(): item.remove() def systemCount(self): return self.systems.value() def name(self): return i18n("Custom Staff") def default(self): while self.tree.topLevelItemCount(): self.tree.topLevelItem(0).remove() self.systems.setValue(4) def items(self): for i in range(self.tree.topLevelItemCount()): yield self.tree.topLevelItem(i) def music(self, layout): music = sum((i.music(layout) for i in self.items()), ['<<']) music.append('>>') return music def staffCount(self): return sum(i.staffCount() for i in self.items())