def init_ui(self): self.setWindowTitle(self.title) self.setGeometry(self.top, self.left, self.width, self.height) # layout root of application main_layout = QVBoxLayout(self) self.setLayout(main_layout) # to set the model of tree model = QFileSystemModel() model.setRootPath("/home/denison/Downloads/music") model.setNameFilters(['*.mp3', '*.m4a', '*.flac']) model.setNameFilterDisables(False) self.tree = QTreeView() self.tree.setModel(model) self.tree.setAnimated(True) self.tree.setColumnWidth(0, 500) file_layout = QHBoxLayout() label_file = QLabel('file/directory') text_file = QLineEdit() btn_load = QPushButton('load') file_layout.addWidget(label_file) file_layout.addWidget(text_file) file_layout.addWidget(btn_load) grid_info_layout = QGridLayout() # strings to labels self.labels = [ 'ARTIST', 'ALBUMARTIST', 'ALBUM', 'TITLE', 'GENRE', 'DATE' ] # line edits to tags self.text_artist = QLineEdit('ARTIST') self.text_album = QLineEdit('ALBUM') self.text_album_artist = QLineEdit('ALBUMARTIST') self.text_title = QLineEdit('TITLE') self.text_genre = QLineEdit('GENRE') self.text_date = QLineEdit('DATE') self.text_tags = [ self.text_artist, self.text_album_artist, self.text_album, self.text_title, self.text_genre, self.text_date ] for text in self.text_tags: text.setEnabled(False) #text.textChanged.connect(self.enable_save) # labels for label, i in zip(self.labels, range(6)): grid_info_layout.addWidget(QLabel(label), i, 0) # cb_artist = QCheckBox() # cb_album_artist = QCheckBox() # cb_album = QCheckBox() # cb_title = QCheckBox() # cb_genre = QCheckBox() # cb_date = QCheckBox() # self.checkboxes = [ # cb_artist, cb_album_artist, cb_album, # cb_title, cb_genre, cb_date # ] # for cb in self.checkboxes: # cb.setText('editar') # cb_artist.stateChanged.connect(lambda: self.enable_tag_edit(self.text_artist)) # cb_album_artist.stateChanged.connect(lambda: self.enable_tag_edit(self.text_album_artist)) # cb_album.stateChanged.connect(lambda: self.enable_tag_edit(self.text_album)) # cb_title.stateChanged.connect(lambda: self.enable_tag_edit(self.text_title)) # cb_genre.stateChanged.connect(lambda: self.enable_tag_edit(self.text_genre)) # cb_date.stateChanged.connect(lambda: self.enable_tag_edit(self.text_date)) for i, text in zip(range(6), self.text_tags): grid_info_layout.addWidget(text, i, 1) # for cb, i in zip(self.checkboxes, range(6)) : # grid_info_layout.addWidget(cb, i, 2) action_layout = QHBoxLayout() btn_exit = QPushButton('Exit') self.btn_save = QPushButton('save changes') self.btn_save.setDisabled(True) action_layout.addWidget(btn_exit) action_layout.addWidget(self.btn_save) #main_layout.addLayout(file_layout) main_layout.addWidget(self.tree) main_layout.addLayout(grid_info_layout) main_layout.addLayout(action_layout) btn_load.clicked.connect(self.open_file) btn_exit.clicked.connect(self.close_application) self.btn_save.clicked.connect(self.edit_tags) self.tree.doubleClicked.connect(self.get_selected_file) self.show()
class FileBrowser(QObject): file_selected = Signal(str) file_activated = Signal(str) def __init__(self, app, window): QObject.__init__(self) self.app = app self.view = window.file_tree self.show_hidden_chk = window.show_hidden self.name_filter_combo = window.name_filter self.model = QFileSystemModel(self.view) self.icon_provider = FileIconProvider() if app.args.root: self.model.setRootPath(app.args.root) self.current_path = app.args.root else: self.model.setRootPath("") self.current_path = os.path.realpath(os.curdir) self.model.setIconProvider(self.icon_provider) self.view.setModel(self.model) self.view.sortByColumn(0, Qt.AscendingOrder) self.view.setSortingEnabled(True) index = self.model.index(self.current_path) if app.args.root: self.view.setRootIndex(index) self.view.setExpanded(index, True) self.view.setCurrentIndex(index) self.view.setDragDropMode(QAbstractItemView.DragDropMode.DragOnly) self.view.setSelectionMode(QAbstractItemView.ExtendedSelection) self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.add_name_filters() self.apply_show_hidden() self.apply_name_filters() self.model.setNameFilterDisables(False) self.model.directoryLoaded.connect(self.directory_loaded) self.model.dataChanged.connect(self.data_changed) selection_model = self.view.selectionModel() selection_model.selectionChanged.connect(self.selection_changed) self.show_hidden_chk.stateChanged.connect(self.apply_show_hidden) self.name_filter_combo.currentIndexChanged.connect( self.apply_name_filters) self.view.doubleClicked.connect(self.double_clicked) def add_name_filters(self): for name, filters in NAME_FILTERS: label = "{} ({})".format(name, ", ".join(filters)) self.name_filter_combo.addItem(label, filters) self.name_filter_combo.setCurrentIndex(0) @Slot() def apply_show_hidden(self): show = self.show_hidden_chk.checkState() logging.debug("apply_show_hidden(): %r", show) flags = QDir.AllDirs | QDir.Files | QDir.NoDotAndDotDot if show: flags |= QDir.Hidden self.model.setFilter(flags) QTimer.singleShot(100, self.scroll_to_current) @Slot() def apply_name_filters(self): filters = self.name_filter_combo.currentData() self.model.setNameFilters(filters) QTimer.singleShot(100, self.scroll_to_current) @Slot(str) def directory_loaded(self, path): logger.debug("directory loaded: %s", path) if path == self.current_path: logger.debug("requesting scrolling") QTimer.singleShot(100, self.scroll_to_current) @Slot() def data_changed(self, *args): logger.debug("Data changed: %r", args) @Slot() def scroll_to_current(self): index = self.model.index(self.current_path) self.view.scrollTo(index) self.view.resizeColumnToContents(0) @Slot(QItemSelection) def selection_changed(self, selection): indexes = selection.indexes() if indexes: index = indexes[0] path = self.model.filePath(index) if os.path.isfile(path): self.file_selected.emit(path) self.current_path = path @Slot(QModelIndex) def double_clicked(self, index): path = self.model.filePath(index) if os.path.isfile(path): self.file_activated.emit(path)
class FileSystemWidget(QWidget): def __init__(self, parent, *args, **kwargs): super().__init__(*args, **kwargs) self.currentRootPath = '/' self.currentPath = QDir.currentPath() self.mainWindow = parent self.chooseDirAction = QAction(IconFactory.getIcon('folder'), 'Root directory', self, statusTip="Change root directory", triggered=self.chooseRootDir) self.showOFAction = QAction(IconFactory.getIcon('filter_alt'), 'Show only FITS files', self, statusTip="Show only FITS/all files", triggered=self.showOFFiles) self.showOFAction.setCheckable(True) self.showOFAction.toggled.connect(self.showOFFiles) self.chooseDirBtn = QToolButton() self.chooseDirBtn.setDefaultAction(self.chooseDirAction) self.showOFBtn = QToolButton() self.showOFBtn.setDefaultAction(self.showOFAction) iconlayout = QHBoxLayout() iconlayout.setAlignment(Qt.AlignLeft) iconlayout.addWidget(self.chooseDirBtn) iconlayout.addWidget(self.showOFBtn) self.viewsSplitter = QSplitter(Qt.Horizontal) self.viewsSplitter.splitterMoved.connect(self.splitterMoved) self.dirsModel = QFileSystemModel(self) self.dirsModel.setOption(QFileSystemModel.DontWatchForChanges, True) self.dirsModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs) self.dirsModel.setNameFilterDisables(False) self.dirs = QTreeView() self.dirs.setModel(self.dirsModel) self.dirs.hideColumn(1) self.dirs.hideColumn(2) self.dirs.hideColumn(3) self.dirs.clicked.connect(self.onDirsClick) self.dirs.doubleClicked.connect(self.onDirsDoubleClick) self.filesModel = QFileSystemModel(self) self.filesModel.setOption(QFileSystemModel.DontWatchForChanges, True) self.filesModel.setFilter(QDir.NoDotAndDotDot | QDir.Files) self.filesModel.setNameFilterDisables(False) self.files = QListView() self.files.setModel(self.filesModel) self.files.doubleClicked.connect(self.onFilesDoubleClick) self.viewsSplitter.addWidget(self.dirs) self.viewsSplitter.addWidget(self.files) viewslayout = QHBoxLayout() viewslayout.addWidget(self.viewsSplitter) layout = QVBoxLayout() layout.addLayout(iconlayout) layout.addLayout(viewslayout) self.setLayout(layout) self.dirsModel.setRootPath(self.currentRootPath) self.dirs.setRootIndex(self.dirsModel.index(self.currentRootPath)) index = self.dirsModel.index(self.currentPath) self.dirs.setCurrentIndex(index) self.dirs.setExpanded(index, True) self.filesModel.setRootPath(self.currentPath) self.files.setRootIndex(self.filesModel.index(self.currentPath)) def splitterMoved(self, pos, index): if pos == 0: self.filesModel.setFilter(QDir.NoDot | QDir.AllEntries | QDir.DirsFirst | QDir.Type) elif pos == self.viewsSplitter.width( ) - self.viewsSplitter.handleWidth(): self.dirsModel.setFilter(QDir.NoDotAndDotDot | QDir.AllEntries) else: self.dirsModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs) self.filesModel.setFilter(QDir.NoDotAndDotDot | QDir.Files) def onDirsClick(self, item): index = self.dirs.selectedIndexes()[0] info = self.dirsModel.fileInfo(index) if info.isDir(): self.currentPath = info.filePath() self.files.setRootIndex( self.filesModel.setRootPath(info.filePath())) def onDirsDoubleClick(self, item): index = self.dirs.selectedIndexes()[0] info = self.dirsModel.fileInfo(index) if info.isDir(): self.currentPath = info.filePath() self.files.setRootIndex( self.filesModel.setRootPath(info.filePath())) else: self.mainWindow.open_fits(info.filePath()) def onFilesDoubleClick(self, item): index = self.files.selectedIndexes()[0] info = self.filesModel.fileInfo(index) if info.isDir(): self.setPath(info.filePath()) else: try: self.mainWindow.open_fits(info.filePath()) except FileNotFoundError: self.setPath(self.currentPath) # refesh maybe? def setPath(self, path): self.currentPath = path index = self.dirsModel.index(self.currentPath) self.dirs.setCurrentIndex(index) self.dirs.setExpanded(index, True) self.files.setRootIndex(self.filesModel.setRootPath(self.currentPath)) def chooseRootDir(self): dir = QFileDialog.getExistingDirectory(self, 'Select directory') if dir: self.setRootPath(dir) def setRootPath(self, dir): self.currentRootPath = dir self.dirsModel.setRootPath(self.currentRootPath) self.dirs.setRootIndex(self.dirsModel.index(self.currentRootPath)) self.setPath(self.currentRootPath) def showOFFiles(self): if self.showOFAction.isChecked(): self.dirsModel.setNameFilters(["*.FITS", "*.fits"]) self.filesModel.setNameFilters(["*.FITS", "*.fits"]) else: self.dirsModel.setNameFilters(["*"]) self.filesModel.setNameFilters(["*"]) def writeSettings(self, settings): settings.beginGroup("fileWidget") settings.setValue('splitterGeometry', self.viewsSplitter.saveGeometry()) settings.setValue('splitterState', self.viewsSplitter.saveState()) settings.setValue('rootPath', self.currentRootPath) settings.setValue('path', self.currentPath) settings.endGroup() def readSettings(self, settings): settings.beginGroup("fileWidget") self.viewsSplitter.restoreGeometry(settings.value("splitterGeometry")) self.viewsSplitter.restoreState(settings.value("splitterState")) rootPath = settings.value("rootPath") path = settings.value("path") settings.endGroup() if rootPath is None: rootPath = '/' self.setRootPath(rootPath) if path is None: path = QDir.currentPath() self.setPath(path) self.splitterMoved(self.viewsSplitter.handle(1).pos().x(), 0)