def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.setupUi(self) self._tabs_file: Optional[str] = None self._tabs_model: QtCore.QAbstractListModel = models.TabsModel() self._all_workflows_model: models.WorkflowListModel2 = \ models.WorkflowListModel2() self._active_tab_worksflows_model: models.WorkflowListModel2 = \ models.WorkflowListModel2() self.tabWorkflowsListView.setModel(self._active_tab_worksflows_model) self.selectedTabComboBox.setModel(self._tabs_model) self.selectedTabComboBox.currentIndexChanged.connect(self._changed_tab) self.newTabButton.clicked.connect(self._create_new_tab) self.deleteCurrentTabButton.clicked.connect(self._delete_tab) self.addItemsButton.clicked.connect(self._add_items_to_tab) self.removeItemsButton.clicked.connect(self._remove_items) self._tabs_model.dataChanged.connect(self.on_modified) self.modified: bool = False self.splitter.setChildrenCollapsible(False)
def __init__( self, parent: QtWidgets.QWidget = None, flags: Union[QtCore.Qt.WindowFlags, QtCore.Qt.WindowType] = QtCore.Qt.WindowFlags() ) -> None: """Create a tab editor widget.""" super().__init__(parent, flags) self.tabs_model = models.TabsModel() self.selected_tab_combo_box.setModel(self.tabs_model) self._tabs_file: Optional[str] = None self._all_workflows_model: models.WorkflowListModel2 = \ models.WorkflowListModel2() self._active_tab_workflows_model: models.WorkflowListModel2 = \ models.WorkflowListModel2() self.tab_workflows_list_view.setModel( self._active_tab_workflows_model ) self.selected_tab_combo_box.currentIndexChanged.connect( self._changed_tab ) self.new_tab_button.clicked.connect(self._create_new_tab) self.delete_current_tab_button.clicked.connect(self._delete_tab) self.add_items_button.clicked.connect(self._add_items_to_tab) self.remove_items_button.clicked.connect(self._remove_items) self.tabs_model.dataChanged.connect(self.on_modified) self.modified: bool = False self.splitter.setChildrenCollapsible(False)
def test_tabs_model_delete_tab(): test_model = models.TabsModel() new_tab = tabs.TabData("My tab", models.WorkflowListModel2()) # new_tab.tab_name = test_model += new_tab second_new_tab = tabs.TabData("second new tab", models.WorkflowListModel2()) test_model += second_new_tab assert test_model.rowCount() == 2 test_model -= second_new_tab assert test_model.rowCount() == 1
def test_tabs_model_delete_all_tabs(): test_model = models.TabsModel() first_new_tab = tabs.TabData("My tab", models.WorkflowListModel2()) test_model += first_new_tab second_new_tab = tabs.TabData("second new tab", models.WorkflowListModel2()) test_model += second_new_tab assert test_model.rowCount() == 2 test_model -= second_new_tab assert test_model.rowCount() == 1 test_model -= first_new_tab assert test_model.rowCount() == 0
def _create_new_tab(self) -> None: while True: new_tab_name: str accepted: bool new_tab_name, accepted = QtWidgets.QInputDialog.getText( self.parentWidget(), "Create New Tab", "Tab name") # The user cancelled if not accepted: return if new_tab_name in self.tabs_model: message = f"Tab named \"{new_tab_name}\" already exists." error = QtWidgets.QMessageBox(self) error.setText(message) error.setWindowTitle("Unable to Create New Tab") error.setIcon(QtWidgets.QMessageBox.Critical) error.exec() continue new_tab = tabs.TabData(new_tab_name, models.WorkflowListModel2()) self.tabs_model.add_tab(new_tab) new_index = self.selected_tab_combo_box.findText(new_tab_name) self.selected_tab_combo_box.setCurrentIndex(new_index) return
def read_tabs_yaml(yaml_file) -> Iterator[TabData]: tabs_file_size = os.path.getsize(yaml_file) if tabs_file_size > 0: try: with open(yaml_file) as f: tabs_config_data = yaml.load(f.read(), Loader=yaml.SafeLoader) if not isinstance(tabs_config_data, dict): raise Exception("Failed to parse file") for tab_name in tabs_config_data: model = models.WorkflowListModel2() for workflow_name in tabs_config_data.get(tab_name, []): empty_workflow = NullWorkflow() empty_workflow.name = workflow_name model.add_workflow(empty_workflow) new_tab = TabData(tab_name, model) yield new_tab except FileNotFoundError as e: print("Custom tabs file not found. " "Reason: {}".format(e), file=sys.stderr) raise except AttributeError as e: print("Custom tabs file failed to load. " "Reason: {}".format(e), file=sys.stderr) raise except yaml.YAMLError as e: print("{} file failed to load. " "Reason: {}".format(yaml_file, e), file=sys.stderr) raise
def test_data(self): workflows_model = models.WorkflowListModel2() mock_workflow = Mock() mock_workflow.name = "Spam" workflows_model.add_workflow(mock_workflow) assert workflows_model.data(workflows_model.index(0, 0), role=QtCore.Qt.DisplayRole) == "Spam"
def _changed_tab(self, tab): model = self.selectedTabComboBox.model() index = model.index(tab) if index.isValid(): data = model.data(index, role=QtCore.Qt.UserRole) self.tabWorkflowsListView.setModel(data.workflows_model) else: self.tabWorkflowsListView.setModel(models.WorkflowListModel2())
def test_workflow_list_model2_remove(self): workflows_model = models.WorkflowListModel2() workflows = job.available_workflows() workflows_model.add_workflow(workflows["Hathi Prep"]) jp2_workflow = workflows['Make JP2'] workflows_model.add_workflow(jp2_workflow) assert workflows_model.rowCount() == 2 workflows_model.remove_workflow(jp2_workflow) assert workflows_model.rowCount() == 1
def _changed_tab(self, tab: int) -> None: model: QtCore.QAbstractListModel = cast( models.TabsModel, self.selected_tab_combo_box.model() ) index = model.index(tab) if index.isValid(): data = model.data(index, role=QtCore.Qt.UserRole) self.tab_workflows_list_view.setModel(data.workflows_model) else: self.tab_workflows_list_view.setModel(models.WorkflowListModel2())
def test_workflow_list_model2_isub(): workflows_model = models.WorkflowListModel2() workflows = job.available_workflows() workflows_model.add_workflow(workflows["Hathi Prep"]) jp2_workflow = workflows['Make JP2'] workflows_model += jp2_workflow assert workflows_model.rowCount() == 2 workflows_model -= jp2_workflow assert workflows_model.rowCount() == 1
def test_sort_defaults_alpha_by_name(self): workflows_model = models.WorkflowListModel2() mock_spam_workflow = Mock() mock_spam_workflow.name = "Spam" workflows_model.add_workflow(mock_spam_workflow) mock_bacon_workflow = Mock() mock_bacon_workflow.name = "Bacon" workflows_model.add_workflow(mock_bacon_workflow) workflows_model.sort() assert workflows_model.data( workflows_model.index(0, 0), role=QtCore.Qt.DisplayRole) == "Bacon" and workflows_model.data( workflows_model.index(1, 0), role=QtCore.Qt.DisplayRole) == "Spam"
def test_workflow_list_model2_add(self): workflows_model = models.WorkflowListModel2() workflows = job.available_workflows() workflows_model.add_workflow(workflows["Hathi Prep"]) assert workflows_model.rowCount() == 1
def test_tabs_model_iadd_tab(self): test_model = models.TabsModel() new_tab = tabs.TabData("My tab", models.WorkflowListModel2()) test_model += new_tab assert test_model.rowCount() == 1
def test_workflow_list_model2_iadd(): workflows_model = models.WorkflowListModel2() workflows = job.available_workflows() workflows_model += workflows["Hathi Prep"] assert workflows_model.rowCount() == 1
def read_tabs_yaml(*args, **kwargs): return [TabData("existing tab", models.WorkflowListModel2())]