/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "filesystemwidget.h" #include "filesystemdirproxy.h" #include "fileview.h" #include "shemoviconprovider.h" #include "filesystemfileproxy.h" #include "helper.h" FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent) { mModel = new QDirModel; mModel->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); mModel->setSorting(QDir::DirsFirst | QDir::IgnoreCase); SheMovIconProvider *p = new SheMovIconProvider; mModel->setIconProvider(p); mDirProxy = new FilesystemDirProxy; mDirProxy->setSourceModel(mModel); mDirView = new QTreeView; mDirView->setModel(mDirProxy); mDirView->setColumnHidden(1, true); mDirView->setColumnHidden(2, true); mDirView->setColumnHidden(3, true); mDirView->setRootIsDecorated(false); mDirView->setSelectionMode(QAbstractItemView::SingleSelection); mFileView = new FileView; mFileProxy = new FilesystemFileProxy; mFileProxy->setSourceModel(mModel); mFileView->setModel(mFileProxy); mFileView->setSortingEnabled(true); mFileView->sortByColumn(0, Qt::AscendingOrder); mFileView->setItemsExpandable(false); mFileView->setSelectionMode(QAbstractItemView::MultiSelection); QWidget *fileWidget = new QWidget; QHBoxLayout *directoryEdit = new QHBoxLayout; QLabel *dirLabel = new QLabel(tr("&Directory")); mDirEdit = new QLineEdit; QCompleter *completer = new QCompleter(this); completer->setModel(mModel); completer->setCompletionMode(QCompleter::PopupCompletion); mDirEdit->setCompleter(completer); dirLabel->setBuddy(mDirEdit); directoryEdit->addWidget(dirLabel); directoryEdit->addWidget(mDirEdit); QVBoxLayout *fwLayout = new QVBoxLayout; fwLayout->addLayout(directoryEdit); fwLayout->addWidget(mFileView); fileWidget->setLayout(fwLayout); connect(mDirView->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(directoryChanged(const QModelIndex &, const QModelIndex &))); connect(mFileView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(fileViewActivated(const QModelIndex &))); connect(mFileView, SIGNAL(enterPressed(const QModelIndex &)), this, SLOT(fileViewActivated(const QModelIndex &))); connect(mFileView, SIGNAL(upDir()), this, SLOT(parentDir())); connect(mDirEdit, SIGNAL(returnPressed()), this, SLOT(directoryEdited())); QSettings s; QString startDir = s.value("paths/start", QDir::homePath()).toString(); windowTitle(startDir); QModelIndex startIndex = mModel->index(startDir); if(startIndex.isValid()){ QModelIndex proxyIndex = mDirProxy->mapFromSource(startIndex); mDirView->setCurrentIndex(proxyIndex); mDirView->setExpanded(proxyIndex, true); QModelIndex parent = proxyIndex.parent(); do { mDirView->setExpanded(parent, true); parent = parent.parent(); }while(parent.isValid()); } mFileView->resizeColumnToContents(0); QVBoxLayout *mainLayout = new QVBoxLayout; QSplitter *splitter = new QSplitter; splitter->addWidget(mDirView); splitter->addWidget(fileWidget); splitter->setStretchFactor(0, 1); splitter->setStretchFactor(1, 2); mainLayout->addWidget(splitter); setLayout(mainLayout); } void FilesystemWidget::directoryChanged(const QModelIndex &selected, const QModelIndex &deselected){ QModelIndex real = mDirProxy->mapToSource(selected); if(!real.isValid()){ return; } mDirEdit->setText(mModel->filePath(real)); windowTitle(mModel->filePath(real)); QModelIndex oldSelected = mDirProxy->mapToSource(deselected); mFileView->selectionModel()->setCurrentIndex(mFileProxy->mapFromSource(oldSelected), QItemSelectionModel::NoUpdate); mFileView->setRootIndex(mFileProxy->mapFromSource(real)); } void FilesystemWidget::directoryEdited(){ QString path = mDirEdit->text(); if(path.isEmpty()){ return; } QModelIndex index = mModel->index(path); if(index.isValid()){ mDirView->setCurrentIndex(mDirProxy->mapFromSource(index)); } } void FilesystemWidget::fileViewActivated(const QModelIndex &idx){ qDebug() << "trying to activate elem"; QModelIndex real = mFileProxy->mapToSource(idx); if(mModel->isDir(real)){ mDirView->setCurrentIndex(mDirProxy->mapFromSource(real)); return; } QString path = mModel->filePath(real); QString mt = Helper::mimeType(path); QSettings s; QStringList programArgs; QString program; if(mt.toLower().startsWith("video")){ program = s.value("paths/video").toString(); programArgs = s.value("paths/videoargs").toStringList(); } if(mt.toLower().startsWith("image")){ program = s.value("paths/picture").toString(); } programArgs << path; QProcess::execute(program, programArgs); } void FilesystemWidget::parentDir(){ QModelIndex idx = mDirView->currentIndex(); if(idx.parent().isValid()){ mDirView->setCurrentIndex(idx.parent()); } mFileView->selectionModel()->clearSelection(); } void FilesystemWidget::setWindowTitle(const QString &dir){ QString title = QString("%1 - %2").arg(qApp->applicationName(), dir); emit windowTitle(title); }