def __init__(self): super(ScriptSelector, self).__init__(None) self.setupUi(self) self.scripts = None allScripts = defaultdict(list) alglist = algList.getProviderFromName("script").algs for script in alglist: allScripts[script.group].append(script) for group, groupScripts in list(allScripts.items()): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) for script in groupScripts: scriptItem = QTreeWidgetItem() scriptItem.setFlags(scriptItem.flags() | Qt.ItemIsUserCheckable) scriptItem.setCheckState(0, Qt.Checked) scriptItem.script = script scriptItem.setText(0, script.name) groupItem.addChild(scriptItem) self.scriptsTree.addTopLevelItem(groupItem) self.scriptsTree.expandAll() self.selectAllLabel.linkActivated.connect(lambda: self.checkScripts(True)) self.unselectAllLabel.linkActivated.connect(lambda: self.checkScripts(False)) self.folderButton.clicked.connect(self.selectFolder) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed)
def __init__(self): super(ScriptSelector, self).__init__(None) self.setupUi(self) self.scripts = None allScripts = defaultdict(list) alglist = QgsApplication.processingRegistry().providerById("script").algorithms() for script in alglist: allScripts[script.group()].append(script) for group, groupScripts in list(allScripts.items()): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) for script in groupScripts: scriptItem = QTreeWidgetItem() scriptItem.setFlags(scriptItem.flags() | Qt.ItemIsUserCheckable) scriptItem.setCheckState(0, Qt.Checked) scriptItem.script = script scriptItem.setText(0, script.name()) groupItem.addChild(scriptItem) self.scriptsTree.addTopLevelItem(groupItem) self.scriptsTree.expandAll() self.selectAllLabel.linkActivated.connect(lambda: self.checkScripts(True)) self.deselectAllLabel.linkActivated.connect(lambda: self.checkScripts(False)) self.folderButton.clicked.connect(self.selectFolder) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed)
def show_task_steps(self): self.trw_task_steps.clear() steps = self._task.get_steps() self.logger.debug( __name__, "Showing task steps in Task Panel. {} task steps found: {}.". format(len(steps), ", ".join([s.get_name() for s in steps]))) for i, step in enumerate(steps): children = [] step_item = QTreeWidgetItem([ QCoreApplication.translate("TaskPanelWidget", "Step {}").format(i + 1) ]) step_item.setData(0, Qt.BackgroundRole, QBrush(GRAY_COLOR)) step_item.setToolTip(0, step.get_name()) step_item.setCheckState( 0, Qt.Checked if step.get_status() else Qt.Unchecked) action_item = QTreeWidgetItem([step.get_name()]) action_item.setData(0, Qt.UserRole, step.get_id()) action_item.setIcon( 0, QIcon(":/Asistente-LADM-COL/resources/images/process.svg")) action_item.setToolTip(0, step.get_description()) step_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) children.append(action_item) step_item.addChildren(children) self.trw_task_steps.addTopLevelItem(step_item) for i in range(self.trw_task_steps.topLevelItemCount()): self.trw_task_steps.topLevelItem( i).setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable) self.trw_task_steps.topLevelItem(i).setExpanded(True)
def createItem(itemRoot, name, class_id, flags, icon): # WidgetItem item = QTreeWidgetItem( itemRoot ) item.setText(0, name ) item.setData(0, Qt.UserRole, class_id ) checkState = Qt.Checked if class_id in self.l_class_id else Qt.Unchecked item.setCheckState(0, checkState ) item.setFlags( flags ) item.setIcon(0, icon ) return item
def create_layers_tree(layer_node): """Builds layers tree widget""" widget = QTreeWidgetItem() widget.setText(0, layer_node.get('title', layer_node['name'])) if 'layers' in layer_node: for child_node in layer_node['layers']: widget.addChild(create_layers_tree(child_node)) else: widget.setData(0, Qt.UserRole, layer_node) widget.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsTristate) widget.setCheckState(0, Qt.Checked) widget.setDisabled(layer_node.get('hidden', False)) return widget
def __setupModelData(self): dsList = DataSourcesList().data_sources.values() groupInfoList = GroupsList().groups groupsItems = [] groups = [] for ds in dsList: if ds.group in groups: group_item = groupsItems[groups.index(ds.group)] else: group_item = QTreeWidgetItem() group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group) group_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") group_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.Unchecked) groupInfo = groupInfoList.get(ds.group) if groupInfo is not None: group_item.setIcon(self.COLUMN_GROUP_DS, QIcon(groupInfo.icon)) else: group_item.setData( self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group + " (%s!)" % self.tr("group not found")) group_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, groupInfo) groups.append(ds.group) groupsItems.append(group_item) self.rootItem.addChild(group_item) ds_item = QTreeWidgetItem() ds_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.alias) ds_item.setIcon(self.COLUMN_GROUP_DS, QIcon(ds.icon_path)) ds_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, ds) ds_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") ds_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) ds_check_state = Qt.Checked if ds.id in PluginSettings.get_hide_ds_id_list(): ds_check_state = Qt.Unchecked ds_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) if group_item.childCount() != 0 and group_item.checkState( 1) != ds_check_state: group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.PartiallyChecked) else: group_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) group_item.addChild(ds_item)
def set_items(self, data=None): """" Build the tree afresh with no selections """ self.tree_products.clear() data = data if data else {} self._data = json.loads(data) if isinstance(data, str) else data for product, measurements in self._data.items(): parent = QTreeWidgetItem(self.tree_products) parent.setText(0, product) # noinspection PyTypeChecker parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) for measurement in measurements: child = QTreeWidgetItem(parent) # noinspection PyTypeChecker child.setFlags(child.flags() | Qt.ItemIsUserCheckable) child.setText(0, measurement) child.setCheckState(0, Qt.Unchecked)
def is_file(self, tree, tree_element, check_format): """ Add file to the tree structure in QTreeWidget :param tree: QTreeWidget element where to display the folder and file architecture :type tree: QTreeWidget :param tree_element: Current element in the os.listdir(startpath) :type tree_element: list :param check_format: Dict of extension user choose to see :type check_format: dict """ extension = ".{}".format(tree_element[0].rpartition('.')[-1]) if extension in check_format.keys() and check_format[extension]: parent_itm = QTreeWidgetItem(tree, tree_element) parent_itm.setCheckState(0, Qt.Unchecked) # parent_itm.setIcon(0, QIcon(':/plugins/plugin_compiler/icons/mIconFile.png')) else: parent_itm = QTreeWidgetItem(tree, tree_element)
def __setupModelData(self): dsList = DataSourcesList().data_sources.values() groupInfoList = GroupsList().groups groupsItems = [] groups = [] for ds in dsList: if ds.group in groups: group_item = groupsItems[groups.index(ds.group)] else: group_item = QTreeWidgetItem() group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group) group_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") group_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.Unchecked) groupInfo = groupInfoList.get(ds.group) if groupInfo is not None: group_item.setIcon(self.COLUMN_GROUP_DS, QIcon(groupInfo.icon)) else: group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group + " (%s!)" % self.tr("group not found")) group_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, groupInfo) groups.append(ds.group) groupsItems.append(group_item) self.rootItem.addChild(group_item) ds_item = QTreeWidgetItem() ds_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.alias) ds_item.setIcon(self.COLUMN_GROUP_DS, QIcon(ds.icon_path)) ds_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, ds) ds_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") ds_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) ds_check_state = Qt.Checked if ds.id in PluginSettings.get_hide_ds_id_list(): ds_check_state = Qt.Unchecked ds_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) if group_item.childCount() != 0 and group_item.checkState(1) != ds_check_state: group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.PartiallyChecked) else: group_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) group_item.addChild( ds_item )
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in iteritems(allTests): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) unitItem = QTreeWidgetItem() unitItem.setText(0, "Fully automated tests") unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate) manualItem = QTreeWidgetItem() manualItem.setText(0, "Manual and semi-automated tests") manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) unitTestsByCategories = defaultdict(list) manualTestsByCategories = defaultdict(list) for test in groupTests: if isinstance(test, UnitTestWrapper): unitTestsByCategories[test.category].append(test) else: manualTestsByCategories[test.category].append(test) for testsList, parentItem in [(unitTestsByCategories, unitItem), (manualTestsByCategories, manualItem) ]: for cat, catTests in iteritems(testsList): categoryItem = QTreeWidgetItem() categoryItem.setText(0, cat) categoryItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) for test in catTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable) testItem.setCheckState(0, Qt.Unchecked) testItem.test = test testItem.setText(0, test.name) categoryItem.addChild(testItem) parentItem.addChild(categoryItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.buttonBox.button( QDialogButtonBox.Ok).setText("Run selected tests") self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect( lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect( lambda: self.checkTests(_onlyUnit)) self.exportButton.clicked.connect(self.export)
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in iteritems(allTests): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) unitItem = QTreeWidgetItem() unitItem.setText(0, "Fully automated tests") unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate) manualItem = QTreeWidgetItem() manualItem.setText(0, "Manual and semi-automated tests") manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) for test in groupTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable) testItem.setCheckState(0, Qt.Unchecked) testItem.test = test testItem.setText(0, test.name) if isinstance(test, UnitTestWrapper): unitItem.addChild(testItem) else: manualItem.addChild(testItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.buttonBox.button(QDialogButtonBox.Ok).setText("Run selected tests") self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect(lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect(lambda: self.checkTests(_onlyUnit)) self.exportButton.clicked.connect(self.export)
class Editor: """ Base class to manage import options for QGEP classes. Editor subclasses are responsible of: - managing a listwidgetitem - providing a widget to edit options - change the current session objects according to widget interaction - validate objects according to the current session """ # Validity INVALID = "INVALID" UNKNOWN = "UNKNOWN" WARNING = "WARNING" VALID = "VALID" # State NEW = "NEW" DELETED = "DELETED" MODIFIED = "MODIFIED" EXISTING = "EXISTING" class_name = "base" widget_name = "base.ui" registry = defaultdict(lambda: Editor) def __init_subclass__(cls): """ Populates Editor.registry """ Editor.registry[cls.class_name] = cls @staticmethod def factory(main_dialog, session, obj): """ Creates an Editor instance, choosing the correct subclass from the registry """ editor_class = Editor.registry[obj.__class__.__name__] return editor_class(main_dialog, session, obj) def __init__(self, main_dialog, session, obj): self.main_dialog = main_dialog self.session = session self.obj = obj self.preprocess() self.update_state() @property def listitem(self): """ The editor's listitem (created on the fly if needed) """ if not hasattr(self, "_listitem"): self._listitem = QTreeWidgetItem() self._listitem.setCheckState( 0, Qt.Checked if self.initially_checked() else Qt.Unchecked) self.update_listitem() return self._listitem def update_listitem(self): disp_id = str( getattr(self.obj, "obj_id", getattr(self.obj, "value_en", "?")) ) # some elements may not have obj_id, such as value_lists self.listitem.setText(0, getattr(self.obj, "identifier", disp_id)) self.listitem.setToolTip(0, disp_id) self.listitem.setText(1, self.status) self.listitem.setText(2, self.validity) if self.status == Editor.EXISTING: color = "lightgray" elif self.validity == Editor.INVALID: color = "red" elif self.validity == Editor.WARNING: color = "orange" elif self.validity == Editor.VALID: color = "lightgreen" else: color = "lightgray" self.listitem.setBackground(2, QBrush(QColor(color))) @property def widget(self): """ The editor's widget (created on the fly if needed) """ if not hasattr(self, "_widget"): class BaseWidget(QWidget): pass self._widget = BaseWidget() loadUi(os.path.join(os.path.dirname(__file__), self.widget_name), self._widget) self.init_widget() return self._widget def preprocess(self): """ Run some preprocessing steps (such as auto-assigning data)... To be overriden by subclasses. """ def init_widget(self): """ Initialize the widget here, for things like connecting signals... To be overriden by subclasses. """ def update_widget(self): """ Update the widget here, for things like repopulating from session... To be overriden by subclasses. """ def update_state(self): """ Updates status and calls validate. Call this when the underlying object may have changed. """ obj_inspect = inspect(self.obj) if obj_inspect.pending: self.status = Editor.NEW elif obj_inspect.deleted: self.status = Editor.DELETED elif obj_inspect.modified: self.status = Editor.MODIFIED elif obj_inspect.persistent: self.status = Editor.EXISTING else: self.status = Editor.UNKNOWN self.validate() def validate(self): """ Updates validity and message. To be overriden by subclasses. You should probably call update_state if you need to revalidate. """ self.validity = Editor.VALID self.message = "No validity check" def initially_checked(self): """ Determines if the item must be initially checked. To be overriden by subclasses. """ return True
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in iteritems(allTests): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate); unitItem = QTreeWidgetItem() unitItem.setText(0, "Fully automated tests") unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate); manualItem = QTreeWidgetItem() manualItem.setText(0, "Manual and semi-automated tests") manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate); unitTestsByCategories = defaultdict(list) manualTestsByCategories = defaultdict(list) for test in groupTests: if isinstance(test, UnitTestWrapper): unitTestsByCategories[test.category].append(test) else: manualTestsByCategories[test.category].append(test) for testsList, parentItem in [(unitTestsByCategories, unitItem), (manualTestsByCategories, manualItem)]: for cat, catTests in iteritems(testsList): categoryItem = QTreeWidgetItem() categoryItem.setText(0, cat) categoryItem.setFlags(manualItem.flags() | Qt.ItemIsTristate); for test in catTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable); testItem.setCheckState(0, Qt.Unchecked); testItem.test = test testItem.setText(0, test.name) categoryItem.addChild(testItem) parentItem.addChild(categoryItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.buttonBox.button(QDialogButtonBox.Ok).setText("Run selected tests") self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect(lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect(lambda: self.checkTests(_onlyUnit)) filepath = os.path.expanduser("~/.testerplugin/failed.txt") if os.path.exists(filepath): with open(filepath) as f: failed = json.load(f) else: failed = [] def _onlyLastFailures(t): if t.group in failed and t.name in failed[t.group]: return Qt.Checked else: return Qt.Unchecked self.onlyLastFailuresLabel.linkActivated.connect(lambda: self.checkTests(_onlyLastFailures)) self.exportButton.clicked.connect(self.export)
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in allTests.items(): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) unitItem = QTreeWidgetItem() unitItem.setText(0, 'Fully Automated Tests') unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate) manualItem = QTreeWidgetItem() manualItem.setText(0, 'Manual and Semi-Automated Tests') manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) unitTestsByCategories = defaultdict(list) manualTestsByCategories = defaultdict(list) for test in groupTests: if isinstance(test, UnitTestWrapper): unitTestsByCategories[test.category].append(test) else: manualTestsByCategories[test.category].append(test) for testsList, parentItem in [(unitTestsByCategories, unitItem), (manualTestsByCategories, manualItem) ]: for cat, catTests in testsList.items(): categoryItem = QTreeWidgetItem() categoryItem.setText(0, cat) categoryItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) for test in catTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable) testItem.setCheckState(0, Qt.Unchecked) testItem.test = test testItem.setText(0, test.name) categoryItem.addChild(testItem) parentItem.addChild(categoryItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.testsTree.itemChanged.connect(self.toggleRunButton) self.buttonBox.button( QDialogButtonBox.Ok).setText('Run Selected Tests') self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect( lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect( lambda: self.checkTests(_onlyUnit)) filepath = os.path.expanduser('~/.testerplugin/failed.txt') if os.path.exists(filepath): with open(filepath) as f: failed = json.load(f) else: failed = [] def _onlyLastFailures(t): if t.group in failed and t.name in failed[t.group]: return Qt.Checked else: return Qt.Unchecked self.onlyLastFailuresLabel.linkActivated.connect( lambda: self.checkTests(_onlyLastFailures)) self.exportButton.clicked.connect(self.export)