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