class DirWidget(CompositeWidget): """ widget gives ability to choose a directory """ def __init__(self, parent, **params): layout = QHBoxLayout() layout.setAlignment(Qt.AlignLeft) get_or_put(params, 'layout', layout) super(DirWidget, self).__init__(parent, **params) LabelWidget(self, i18n_def='Directory:') self.__dir_label__ = LabelWidget(self, i18n_def=__NOT_SET_LABEL__, sizePolicy=QSizePolicy( QSizePolicy.MinimumExpanding, QSizePolicy.Minimum)) PushButtonWidget(self, i18n_def="Browse", clicked_handler=self.__clicked_handler__) def __clicked_handler__(self): _dir = self.__dir_label__.text() if self.__dir_label__.text() else '.' output_dir = QFileDialog.getExistingDirectory( self, caption='Choose dir', directory=_dir, options=QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks) if output_dir: self.setDirectory(output_dir) @property def directory(self): _dir = str(self.__dir_label__.text()) if not (is_empty(_dir) or __NOT_SET_LABEL__ == _dir): _dir = str(QDir(_dir[1:-1]).path()) return _dir def validate(self): if self.directory == None: ErrorWindow(message="The directory must be selected !") return False return True def setDirectory(self, output_dir): """ set directory by external code """ self.__dir_label__.setText("[%s]" % output_dir)
class DirWidget(CompositeWidget): """ widget gives ability to choose a directory """ def __init__(self, parent, **params): layout = QHBoxLayout() layout.setAlignment(Qt.AlignLeft) get_or_put(params, "layout", layout) super(DirWidget, self).__init__(parent, **params) LabelWidget(self, i18n_def="Directory:") self.__dir_label__ = LabelWidget( self, i18n_def=__NOT_SET_LABEL__, sizePolicy=QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) ) PushButtonWidget(self, i18n_def="Browse", clicked_handler=self.__clicked_handler__) def __clicked_handler__(self): _dir = self.__dir_label__.text() if self.__dir_label__.text() else "." output_dir = QFileDialog.getExistingDirectory( self, caption="Choose dir", directory=_dir, options=QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks, ) if output_dir: self.setDirectory(output_dir) @property def directory(self): _dir = str(self.__dir_label__.text()) if not (is_empty(_dir) or __NOT_SET_LABEL__ == _dir): _dir = str(QDir(_dir[1:-1]).path()) return _dir def validate(self): if self.directory == None: ErrorWindow(message="The directory must be selected !") return False return True def setDirectory(self, output_dir): """ set directory by external code """ self.__dir_label__.setText("[%s]" % output_dir)
class ChooseDatasourcePage(QWizardPage): def __init__(self, _parent): QWizardPage.__init__(self, parent=_parent) def initializePage(self): title_I18N(self, "datasource.page.title", "Datasource chooser") #self.setSubTitle('Setup frame specific data') pageLayout = QVBoxLayout() self.setLayout(pageLayout) self.__createFilesGroupBox(pageLayout) #to force call of isComplete(self) method by the Wizard framework #which causes state next button to be updated self.emit(WIZARD_COMPLETE_CHANGED_SIGNAL) self.rootDir = None def __createFilesGroupBox(self, pageLayout): self.filesGroupBox = GroupBoxWidget( self, i18n="datasource.files.group.title", i18n_def="Files", layout=QVBoxLayout()) self.__createFileConstraintsComposite__(self.filesGroupBox) self.__createReloadButton__(self.filesGroupBox) self.__createTableView__(self.filesGroupBox) self.__createFilesOperationsComposite__(self.filesGroupBox) self.changeEnablemend(False) self.chooseRootDirButton.setEnabled(True) def __createFileConstraintsComposite__(self, parent): fileConstraintsComposite = CompositeWidget(parent, layout=QHBoxLayout()) self.chooseRootDirButton = PushButtonWidget( fileConstraintsComposite, i18n="datasource.datasource.choose.root.dir.button", i18n_def="Choose root dir", clicked_handler=self.chooseRootDirAction) LabelWidget(fileConstraintsComposite, i18n="datasource.root.dir.label", i18n_def="Root dir:") sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.rootDirLabel = LabelWidget(fileConstraintsComposite, i18n="datasource.root.dir.label", i18n_def="[Not set]", sizePolicy=sizePolicy, stretch_after_widget=1) LabelWidget(fileConstraintsComposite, i18n="datasource.file.name.filter.label", i18n_def="Files name filter") self.filesExtension = LineEditWidget( fileConstraintsComposite, maxLength=15, width=get_width_of_n_letters(14), text="*", enabled_precheck_handler=self.enabledPrecheckHandler) self.recursively = CheckBoxWidget( fileConstraintsComposite, i18n="datasource.search.files.recursively.label", i18n_def="Search files recursively", clicked_handler=self.reload, enabled_precheck_handler=self.enabledPrecheckHandler) self.onlyKnownTypes = CheckBoxWidget( fileConstraintsComposite, i18n="datasource.only.known.types.checkbox", i18n_def="Only known types", checked=True, clicked_handler=self.reload, enabled_precheck_handler=self.enabledPrecheckHandler) def __createReloadButton__(self, parent): self.reloadButton = PushButtonWidget( parent, i18n="datasource.reload.button", i18n_def="Reload", clicked_handler=self.reload, alignment=Qt.AlignRight, enabled_precheck_handler=self.enabledPrecheckHandler) def __createTableView__(self, parent): self.filesTableView = FilesTableView( parent, model=QStandardItemModel(self), onClickedAction=self.onClickedAction, wizardButtons=(QWizard.NextButton, ), wizard_handler=self.wizard, sorting=True, enabled_precheck_handler=self.enabledPrecheckHandler) def __createFilesOperationsComposite__(self, parent): filesOperations = CompositeWidget(parent, layout=QHBoxLayout()) self.filePreviewButton = PushButtonWidget( filesOperations, i18n="datasource.file.preview.button", i18n_def="File preview", stretch_after_widget=1, clicked_handler=self.filePreviewAction, enabled_precheck_handler=self.enabledPrecheckHandler) self.selectAllButton = PushButtonWidget( filesOperations, i18n="datasource.accept.select.all.button", i18n_def="Select all", enabled=False, clicked_handler=self.__select_all_handler__, enabled_precheck_handler=self.enabledPrecheckHandler) self.unselectAllButton = PushButtonWidget( filesOperations, i18n="datasource.accept.unselect.all.button", i18n_def="Unselect all", enabled=False, clicked_handler=self.__unselect_all_handler__, enabled_precheck_handler=self.enabledPrecheckHandler) def chooseRootDirAction(self): SettingsFactory.loadSettings(self, Setter(rootDir=None)) rootDir = QFileDialog.getExistingDirectory( self, caption=self.chooseRootDirButton.text(), directory=self.rootDir) if rootDir: self.rootDir = rootDir + os.path.sep SettingsFactory.saveSettings(self, Setter(rootDir=self.rootDir)) self.rootDirLabel.setText(self.rootDir) self.reload() def __select_all_handler__(self): self.__change_selection__(True) def __unselect_all_handler__(self): self.__change_selection__(False) def __change_selection__(self, _select): self.changeEnablemend(False) count = self.filesTableView.getRowCount() progressManager = ProgressDialogManager( self, label_text=("Selecting..." if _select else "Unselecting..."), max_value=count) with progressManager as progress: for idx in range(count): if (progress.wasCanceled()): break progress.increaseCounter() if _select: self.filesTableView.setCheckedRowState(idx, Qt.Checked) else: self.filesTableView.setCheckedRowState(idx, Qt.Unchecked) self.filesTableView.changeCompleteState() self.changeEnablemend(True) def filePreviewAction(self): showFilesPreviewDialog( self.filesTableView.getSelectedPathAndFilename()) def reload(self): self.changeEnablemend(True) if self.rootDirLabel.text(): self.filesTableView.clear() self.changeEnablemend(False) iteratorFlag = QDirIterator.Subdirectories \ if self.recursively.isChecked() \ else QDirIterator.NoIteratorFlags nameFilters = QStringList( self.filesExtension.text()) \ if len(self.filesExtension.text()) > 0 \ and not self.filesExtension.text() \ in ("*", "*.*", "", None) \ else QStringList() self.iterator = QDirIterator(self.rootDirLabel.text(), nameFilters, QDir.Filters(QDir.Files), iteratorFlag) with ProgressDialogManager(self) as progress: while (self.iterator.next()): if (progress.wasCanceled()): break fileInfo = self.iterator.fileInfo() if fileInfo.size() == 0 or fileInfo.isFile() == False: continue if self.filesExtension.text() in ("*", "*.*", "", None): if (sys.platform == 'win32' \ and fileInfo.isExecutable() == True) \ or is_text_file(fileInfo.filePath(), self.onlyKnownTypes.checkState()) == False: continue progress.increaseCounter() checkable = QStandardItem("") checkable.setCheckable(True) filename = QStandardItem(fileInfo.fileName()) progress.setLabelText(fileInfo.fileName()) size = QStandardItem(str(fileInfo.size())) path = QStandardItem(fileInfo.path()) self.filesTableView.addRow( (checkable, filename, size, path)) # @IgnorePep8 self.filesTableView.resizeColumnsToContents() self.filesExtension.setFocus() self.changeEnablemend(True) def onClickedAction(self, idx): self.filePreviewButton.setEnabled(True) self.filesTableView.onClickedAction(idx) def isComplete(self): """ method used by QWizard to check if next/previous buttons have to be disabled/enabled (when False/True is returned) """ return self.filesTableView.isCompletedCount() def changeEnablemend(self, enabled): self.emit(SIGNAL(ENABLED_SIGNAL_NAME), enabled) self.chooseRootDirButton.setEnabled(enabled) def enabledPrecheckHandler(self, widget): """ only interested widgets return bool value others none value """ if widget in (self.selectAllButton, self.unselectAllButton): return self.filesTableView.count() > 0 elif widget == self.filePreviewButton: return self.filesTableView.getSelectedRowCount() > 0 def getDatasourceModel(self): return self.filesTableView.getModel()
class ChooseDatasourcePage(QWizardPage): def __init__(self, _parent): QWizardPage.__init__(self, parent=_parent) def initializePage(self): title_I18N(self, "datasource.page.title", "Datasource chooser") #self.setSubTitle('Setup frame specific data') pageLayout = QVBoxLayout() self.setLayout(pageLayout) self.__createFilesGroupBox(pageLayout) #to force call of isComplete(self) method by the Wizard framework #which causes state next button to be updated self.emit(WIZARD_COMPLETE_CHANGED_SIGNAL) self.rootDir = None def __createFilesGroupBox(self, pageLayout): self.filesGroupBox = GroupBoxWidget(self, i18n="datasource.files.group.title", i18n_def="Files", layout=QVBoxLayout()) self.__createFileConstraintsComposite__(self.filesGroupBox) self.__createReloadButton__(self.filesGroupBox) self.__createTableView__(self.filesGroupBox) self.__createFilesOperationsComposite__(self.filesGroupBox) self.changeEnablemend(False) self.chooseRootDirButton.setEnabled(True) def __createFileConstraintsComposite__(self, parent): fileConstraintsComposite = CompositeWidget(parent, layout=QHBoxLayout()) self.chooseRootDirButton = PushButtonWidget(fileConstraintsComposite, i18n="datasource.datasource.choose.root.dir.button", i18n_def="Choose root dir", clicked_handler=self.chooseRootDirAction) LabelWidget(fileConstraintsComposite, i18n="datasource.root.dir.label", i18n_def="Root dir:") sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.rootDirLabel = LabelWidget(fileConstraintsComposite, i18n="datasource.root.dir.label", i18n_def="[Not set]", sizePolicy=sizePolicy, stretch_after_widget=1) LabelWidget(fileConstraintsComposite, i18n="datasource.file.name.filter.label", i18n_def="Files name filter") self.filesExtension = LineEditWidget(fileConstraintsComposite, maxLength=15, width=get_width_of_n_letters(14), text="*", enabled_precheck_handler=self.enabledPrecheckHandler) self.recursively = CheckBoxWidget(fileConstraintsComposite, i18n="datasource.search.files.recursively.label", i18n_def="Search files recursively", clicked_handler=self.reload, enabled_precheck_handler=self.enabledPrecheckHandler) self.onlyKnownTypes = CheckBoxWidget(fileConstraintsComposite, i18n="datasource.only.known.types.checkbox", i18n_def="Only known types", checked=True, clicked_handler=self.reload, enabled_precheck_handler=self.enabledPrecheckHandler) def __createReloadButton__(self, parent): self.reloadButton = PushButtonWidget(parent, i18n="datasource.reload.button", i18n_def="Reload", clicked_handler=self.reload, alignment=Qt.AlignRight, enabled_precheck_handler=self.enabledPrecheckHandler) def __createTableView__(self, parent): self.filesTableView = FilesTableView(parent, model=QStandardItemModel(self), onClickedAction=self.onClickedAction, wizardButtons=(QWizard.NextButton,), wizard_handler=self.wizard, sorting=True, enabled_precheck_handler=self.enabledPrecheckHandler) def __createFilesOperationsComposite__(self, parent): filesOperations = CompositeWidget(parent, layout=QHBoxLayout()) self.filePreviewButton = PushButtonWidget(filesOperations, i18n="datasource.file.preview.button", i18n_def="File preview", stretch_after_widget=1, clicked_handler=self.filePreviewAction, enabled_precheck_handler=self.enabledPrecheckHandler) self.selectAllButton = PushButtonWidget(filesOperations, i18n="datasource.accept.select.all.button", i18n_def="Select all", enabled=False, clicked_handler=self.__select_all_handler__, enabled_precheck_handler=self.enabledPrecheckHandler) self.unselectAllButton = PushButtonWidget(filesOperations, i18n="datasource.accept.unselect.all.button", i18n_def="Unselect all", enabled=False, clicked_handler=self.__unselect_all_handler__, enabled_precheck_handler=self.enabledPrecheckHandler) def chooseRootDirAction(self): SettingsFactory.loadSettings(self, Setter(rootDir=None)) rootDir = QFileDialog.getExistingDirectory(self, caption=self.chooseRootDirButton.text(), directory=self.rootDir) if rootDir: self.rootDir = rootDir + os.path.sep SettingsFactory.saveSettings(self, Setter(rootDir=self.rootDir)) self.rootDirLabel.setText(self.rootDir) self.reload() def __select_all_handler__(self): self.__change_selection__(True) def __unselect_all_handler__(self): self.__change_selection__(False) def __change_selection__(self, _select): self.changeEnablemend(False) count = self.filesTableView.getRowCount() progressManager = ProgressDialogManager(self, label_text=("Selecting..." if _select else "Unselecting..."), max_value=count) with progressManager as progress: for idx in range(count): if (progress.wasCanceled()): break progress.increaseCounter() if _select: self.filesTableView.setCheckedRowState(idx, Qt.Checked) else: self.filesTableView.setCheckedRowState(idx, Qt.Unchecked) self.filesTableView.changeCompleteState() self.changeEnablemend(True) def filePreviewAction(self): showFilesPreviewDialog( self.filesTableView.getSelectedPathAndFilename()) def reload(self): self.changeEnablemend(True) if self.rootDirLabel.text(): self.filesTableView.clear() self.changeEnablemend(False) iteratorFlag = QDirIterator.Subdirectories \ if self.recursively.isChecked() \ else QDirIterator.NoIteratorFlags nameFilters = QStringList( self.filesExtension.text()) \ if len(self.filesExtension.text()) > 0 \ and not self.filesExtension.text() \ in ("*", "*.*", "", None) \ else QStringList() self.iterator = QDirIterator( self.rootDirLabel.text(), nameFilters, QDir.Filters(QDir.Files), iteratorFlag) with ProgressDialogManager(self) as progress: while(self.iterator.next()): if (progress.wasCanceled()): break fileInfo = self.iterator.fileInfo() if fileInfo.size() == 0 or fileInfo.isFile() == False: continue if self.filesExtension.text() in ("*", "*.*", "", None): if (sys.platform == 'win32' \ and fileInfo.isExecutable() == True) \ or is_text_file(fileInfo.filePath(), self.onlyKnownTypes.checkState()) == False: continue progress.increaseCounter() checkable = QStandardItem("") checkable.setCheckable(True) filename = QStandardItem(fileInfo.fileName()) progress.setLabelText(fileInfo.fileName()) size = QStandardItem(str(fileInfo.size())) path = QStandardItem(fileInfo.path()) self.filesTableView.addRow((checkable, filename, size, path)) # @IgnorePep8 self.filesTableView.resizeColumnsToContents() self.filesExtension.setFocus() self.changeEnablemend(True) def onClickedAction(self, idx): self.filePreviewButton.setEnabled(True) self.filesTableView.onClickedAction(idx) def isComplete(self): """ method used by QWizard to check if next/previous buttons have to be disabled/enabled (when False/True is returned) """ return self.filesTableView.isCompletedCount() def changeEnablemend(self, enabled): self.emit(SIGNAL(ENABLED_SIGNAL_NAME), enabled) self.chooseRootDirButton.setEnabled(enabled) def enabledPrecheckHandler(self, widget): """ only interested widgets return bool value others none value """ if widget in (self.selectAllButton, self.unselectAllButton): return self.filesTableView.count() > 0 elif widget == self.filePreviewButton: return self.filesTableView.getSelectedRowCount() > 0 def getDatasourceModel(self): return self.filesTableView.getModel()