diff options
-rw-r--r-- | filesystemdirproxy.cpp | 27 | ||||
-rw-r--r-- | filesystemdirproxy.h | 23 | ||||
-rw-r--r-- | filesystemfileproxy.cpp | 89 | ||||
-rw-r--r-- | filesystemfileproxy.h | 25 | ||||
-rw-r--r-- | filesystemwidget.cpp | 807 | ||||
-rw-r--r-- | filesystemwidget.h | 137 | ||||
-rw-r--r-- | fileview.cpp | 278 | ||||
-rw-r--r-- | fileview.h | 80 | ||||
-rw-r--r-- | shemov.cpp | 358 | ||||
-rw-r--r-- | shemov.h | 54 | ||||
-rw-r--r-- | shemov.pro | 12 | ||||
-rw-r--r-- | smdirmodel.cpp | 231 | ||||
-rw-r--r-- | smdirmodel.h | 84 | ||||
-rw-r--r-- | smdirwatcher.cpp | 172 | ||||
-rw-r--r-- | smdirwatcher.h | 52 |
15 files changed, 6 insertions, 2423 deletions
diff --git a/filesystemdirproxy.cpp b/filesystemdirproxy.cpp deleted file mode 100644 index d103255..0000000 --- a/filesystemdirproxy.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - 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 <QFileSystemModel> -#include <QModelIndex> - -#include "filesystemdirproxy.h" - -FilesystemDirProxy::FilesystemDirProxy(QObject *parent) : QSortFilterProxyModel(parent) {} - -bool FilesystemDirProxy::filterAcceptsRow(int sourcerow, const QModelIndex &sourceparent) const { - QFileSystemModel *m = static_cast<QFileSystemModel*>(sourceModel()); - QModelIndex idx = m->index(sourcerow, 0, sourceparent); - if(!idx.isValid()){ - return false; - } - QString fName = idx.data().toString(); - if((fName == "." ) || (fName == "..")){ - return false; - } - return m->isDir(idx); -} - diff --git a/filesystemdirproxy.h b/filesystemdirproxy.h deleted file mode 100644 index 4c9c998..0000000 --- a/filesystemdirproxy.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - 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. -*/ - -#ifndef FILESYSTEMDIRPROXY_H -#define FILESYSTEMDIRPROXY_H - -#include <QSortFilterProxyModel> - -class QModelIndex; - -class FilesystemDirProxy : public QSortFilterProxyModel { - Q_OBJECT - public: - FilesystemDirProxy(QObject *parent = 0); - virtual bool filterAcceptsRow(int sourcerow, const QModelIndex &source_parent) const; -}; - -#endif - diff --git a/filesystemfileproxy.cpp b/filesystemfileproxy.cpp deleted file mode 100644 index f68b3d2..0000000 --- a/filesystemfileproxy.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - 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 <QDateTime> - -#include "filesystemfileproxy.h" -#include "smdirmodel.h" -#include "helper.h" - -FilesystemFileProxy::FilesystemFileProxy(QObject *parent) : QSortFilterProxyModel(parent) {} - -QVariant FilesystemFileProxy::data(const QModelIndex &index, int role) const{ - if(!index.isValid()){ - return QVariant(); - } - SmDirModel *source = qobject_cast<SmDirModel*>(sourceModel()); - if(role == Qt::DisplayRole){ - QModelIndex real = mapToSource(index); - QLocale l; - if(index.column() == SmDirModel::Created){ - return real.data().toDateTime().toString("MM-dd-yyyy hh:mm"); - } - if(index.column() == SmDirModel::Size){ - if(source->isDir(real)){ - return QVariant(); - } - return l.toString(real.data().toLongLong()); - } - if(index.column() == SmDirModel::Type){ - if(source->isDir(real)){ - return QVariant(); - } - } - } - if(role == Qt::TextAlignmentRole){ - if(index.column() == SmDirModel::Size || index.column() == SmDirModel::DurSize || index.column() == SmDirModel::Bitrate){ - int retval = Qt::AlignRight | Qt::AlignVCenter; - return retval; - } - } - if(role == Qt::FontRole){ - if(index.column() == SmDirModel::Md5sum || index.column() == SmDirModel::DurSize || index.column() == SmDirModel::Bitrate){ - - return QFont("Monospace"); - } - } - return QSortFilterProxyModel::data(index, role); -} - -bool FilesystemFileProxy::lessThan(const QModelIndex &left, const QModelIndex &right) const { - if(left.model()->headerData(left.column(), Qt::Horizontal).toString() == tr("Name")){ - if(left.data().toString() == ".."){ - if(sortOrder() == Qt::AscendingOrder){ - return true; - }else{ - return false; - } - } - SmDirModel *source = qobject_cast<SmDirModel*>(sourceModel()); - if(source->isDir(left) && source->isDir(right)){ - return left.data().toString().toLower() < right.data().toString().toLower(); - } - if(source->isDir(left)){ - return true; - } - if(source->isDir(right)){ - return false; - } - return left.data().toString().toLower() < right.data().toString().toLower(); - } - if(left.model()->headerData(left.column(), Qt::Horizontal).toString() == tr("Size")){ - SmDirModel *source = qobject_cast<SmDirModel*>(sourceModel()); - QFileInfo lInfo = source->fileInfo(left); - QFileInfo rInfo = source->fileInfo(right); - if(lInfo.isDir() && rInfo.isDir()){ - return lInfo.fileName().toLower() < rInfo.fileName().toLower(); - } - if(lInfo.isDir() && !rInfo.isDir()){ - return true; - } - return lInfo.size() < rInfo.size(); - } - return QSortFilterProxyModel::lessThan(left, right); -} - diff --git a/filesystemfileproxy.h b/filesystemfileproxy.h deleted file mode 100644 index 1d29051..0000000 --- a/filesystemfileproxy.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - 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. -*/ - -#ifndef FILESYSTEMFILEPROXY_H -#define FILESYSTEMFILEPROXY_H - -#include <QSortFilterProxyModel> - -class FilesystemFileProxy : public QSortFilterProxyModel { - Q_OBJECT - public: - FilesystemFileProxy(QObject *parent = 0); - ~FilesystemFileProxy() {} - virtual QVariant data(const QModelIndex &index, int role) const; - - protected: - virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; -}; - -#endif - diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp deleted file mode 100644 index 94455f3..0000000 --- a/filesystemwidget.cpp +++ /dev/null @@ -1,807 +0,0 @@ -/* - 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 <QSettings> -#include <QSplitter> -#include <QHBoxLayout> -#include <QLineEdit> -#include <QLabel> -#include <QCompleter> -#include <QProcess> -#include <QApplication> -#include <QMessageBox> -#include <QTextStream> -#include <QClipboard> -#include <QMimeData> -#include <QUrl> -#include <QTimer> -#include <QProgressDialog> -#include <QToolBar> -#include <QInputDialog> -#include <QKeyEvent> -#include <QDirIterator> - -#include "filesystemwidget.h" -#include "filesystemdirproxy.h" -#include "fileview.h" -#include "shemoviconprovider.h" -#include "filesystemfileproxy.h" -#include "pictureviewer2.h" -#include "smglobals.h" -#include "delegates.h" -#include "smdirmodel.h" -#include "smdialog.h" -#include "archivemodel.h" - -FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent), mClipboardMode(None) { - mModel = new FileSystemModel(this); - mModel->setRootPath("/"); - mModel->setFilter(QDir::AllEntries | QDir::NoDot); - mModel->setReadOnly(false); - mIconProvider = new SheMovIconProvider; - mModel->setIconProvider(mIconProvider); - - QStringList fHeaders = QStringList() << tr("Name") << tr("Size") << tr("Type") << tr("Created") << tr("Md5Sum") << tr("Dur./Size") << tr("Bitrate") << tr("Full Path") << tr("Present"); - mFileModel = new SmDirModel(fHeaders, this); - connect(mFileModel, &SmDirModel::needResize, this, &FilesystemWidget::resizeFileView); - - mDirProxy = new FilesystemDirProxy; - mDirProxy->setSourceModel(mModel); - mDirView = new SmTreeView; - mDirView->setModel(mDirProxy); - mDirView->setColumnHidden(1, true); - mDirView->setColumnHidden(2, true); - mDirView->setColumnHidden(3, true); - mDirView->setRootIsDecorated(false); - mDirView->setSelectionMode(QAbstractItemView::SingleSelection); - mDirView->setEditTriggers(QAbstractItemView::NoEditTriggers); - mDirView->setSortingEnabled(true); - mDirView->sortByColumn(0, Qt::AscendingOrder); - - mFileView = new FileView; - mFileProxy = new FilesystemFileProxy; - - mFileProxy->setSourceModel(mFileModel); - - mFileView->setModel(mFileProxy); - mFileView->setSortingEnabled(true); - mFileView->sortByColumn(0, Qt::AscendingOrder); - mFileView->setItemsExpandable(false); - mFileView->setSelectionMode(QAbstractItemView::ExtendedSelection); - mFileView->setSelectionBehavior(QAbstractItemView::SelectRows); - mFileView->setItemDelegateForColumn(SmDirModel::DurSize, new DurationDelegate(this)); - mFileView->setItemDelegateForColumn(SmDirModel::Bitrate, new BitrateDelegate(this)); - - mFileProxy->setDynamicSortFilter(true); - connect(mFileView->selectionModel(), &QItemSelectionModel::selectionChanged, mFileView, &FileView::selectedFilesChanged); - connect(mFileModel, &SmDirModel::modelAboutToBeReset, mFileView, &FileView::saveSelection); - connect(mFileModel, &SmDirModel::modelReset, mFileView, &FileView::restoreSelection); - - mPicViewer = SmGlobals::instance()->pictureViewer(); - mUnpackDlg = new UnpackDialog(this); - connect(mUnpackDlg, &UnpackDialog::workFinished, this, &FilesystemWidget::selectUnpackDir); - - QWidget *fileWidget = new QWidget; - mIconDirSplitter = new QSplitter(this); - mToolBar = new QToolBar; - mToolBar->setIconSize(QSize(16,16)); - - QHBoxLayout *directoryEditL = 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); - directoryEditL->addWidget(dirLabel); - directoryEditL->addWidget(mDirEdit); - QWidget *dirEditW = new QWidget; - dirEditW->setLayout(directoryEditL); - mIconDirSplitter->addWidget(mToolBar); - mIconDirSplitter->addWidget(dirEditW); - - QVBoxLayout *fwLayout = new QVBoxLayout; - fwLayout->addWidget(mIconDirSplitter); - fwLayout->addWidget(mFileView); - fileWidget->setLayout(fwLayout); - - connect(mDirView->selectionModel(), &QItemSelectionModel::currentChanged, this, &FilesystemWidget::directoryChanged); - connect(mDirView, &SmTreeView::expanded, this, &FilesystemWidget::dirExpanded); - connect(mDirView, &SmTreeView::collapsed, this, &FilesystemWidget::dirCollapsed); - connect(mFileView, &FileView::doubleClicked, this, &FilesystemWidget::fileViewActivated); - connect(mFileView, &FileView::enterPressed, this, &FilesystemWidget::fileViewActivated); - connect(mFileView, &FileView::upDir, this, &FilesystemWidget::parentDir); - connect(mDirEdit, &QLineEdit::returnPressed, this, &FilesystemWidget::directoryEdited); - connect(mFileView, &FileView::delFiles, this, &FilesystemWidget::deleteFiles); - connect(mFileView, &FileView::editorClosed, this, &FilesystemWidget::fileEditorClosed); - connect(this, &FilesystemWidget::upSelected, mFileView, &FileView::selectItem); - - 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); -} - -bool FilesystemWidget::isMounted(){ - QSettings s; - QString mount = s.value("paths/dvdmount").toString(); - if(mount.isEmpty()){ - return false; - } - QFile mounts("/proc/mounts"); - if(!mounts.exists() || !mounts.open(QFile::ReadOnly)){ - return false; - } - QTextStream mountStream(&mounts); - QString line; - do { - line = mountStream.readLine(); - if(line.contains(mount)){ - return true; - } - } while(!line.isNull()); - return false; -} - -const QString FilesystemWidget::currentDir() const { - return mFileModel->dir().absolutePath(); -} - -void FilesystemWidget::directoryChanged(const QModelIndex &selected, const QModelIndex &deselected){ - QModelIndex real = mDirProxy->mapToSource(selected); - if(!real.isValid()){ - return; - } - QModelIndex realPrev = mDirProxy->mapToSource(deselected); - if(realPrev.isValid()){ - mLastFiles[Previous] = mLastFiles[Current]; - mLastFiles[Current] = mFileView->selectedItems(); - mLastDir = realPrev.data(QFileSystemModel::FilePathRole).toString(); - } - mModel->setRootPath(mModel->filePath(real)); - mDirEdit->setText(mModel->filePath(real)); - setWindowTitle(); - - mFileView->selectionModel()->clear(); - mFileModel->setDir(mModel->filePath(real)); - - resizeFileView(); -} - -void FilesystemWidget::directoryEdited(){ - QString path = mDirEdit->text(); - if(path.isEmpty()){ - return; - } - QModelIndex index = mModel->index(path); - if(index.isValid()){ - mDirView->setCurrentIndex(mDirProxy->mapFromSource(index)); - } - mFileView->setFocus(Qt::ActiveWindowFocusReason); -} - -void FilesystemWidget::fileViewActivated(const QModelIndex &idx){ - /* we cannot use idx from the SIGNAL here, since the model - * may already have changed */ - Q_UNUSED(idx); - TimerHandler h(mFileModel->refreshTimer()); - QModelIndexList selected = mFileView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QModelIndex real = mFileProxy->mapToSource(selected.first()); - if(mFileModel->isDir(real)){ - if(real.data().toString() == ".."){ - parentDir(); - return; - } - fileView()->selectionModel()->select(selected.first(), QItemSelectionModel::Deselect); - QModelIndex curDir = mModel->index(real.data(SmDirModel::FullPathRole).toString()); - mDirView->setCurrentIndex(mDirProxy->mapFromSource(curDir)); - return; - } - QString path = real.data(SmDirModel::FullPathRole).toString(); - QString mt = Helper::mimeType(path); - QStringList programArgs; - QString program; - if(mt.toLower().startsWith("video")){ - QPair<QString, QStringList> data = programData("movieviewer", QString()); - if(data.first.isEmpty()){ - QMessageBox::critical(this, tr("Error"), tr("No viedeo viewer configured.")); - return; - } - program = data.first; - programArgs = data.second; - } - if(mt.toLower().startsWith("image")){ - if(!mPicViewer->isVisible()){ - mPicViewer->setVisible(true); - } - mPicViewer->setShowMappingItem(false); - mPicViewer->setShowMarkItem(true); - selectAllPV(); - QFileInfo fi(path); - mPicViewer->setCurrentDir(fi.absolutePath()); - mPicViewer->selectPic(path); - return; - } - programArgs << path; - QProcess::startDetached(program, programArgs); -} - -void FilesystemWidget::parentDir(){ - QModelIndex idx = mDirView->currentIndex(); - QModelIndex prev = idx.sibling(idx.row() - 1, idx.column()); - QString pName; - if(prev.isValid()){ - pName = idx.data().toString(); - } - QString sel = idx.data().toString(); - if(idx.parent().isValid()){ - mDirView->setCurrentIndex(idx.parent()); - } - if(!pName.isEmpty()){ - emit upSelected(sel); - } -} - -void FilesystemWidget::goBack(){ - if(mLastDir.isEmpty()){ - return; - } - QModelIndex lastIdx = mModel->index(mLastDir); - mDirView->selectionModel()->setCurrentIndex(mDirProxy->mapFromSource(lastIdx), QItemSelectionModel::ClearAndSelect); - if(lastIdx.isValid()){ - if(!mLastFiles[Previous].isEmpty()){ - for(const QString &lf : mLastFiles[Previous]){ - mFileView->selectItem(lf); - } - } - } -} - -void FilesystemWidget::deleteFiles(){ - qApp->setOverrideCursor(Qt::WaitCursor); - TimerHandler h(mFileModel->refreshTimer()); - WatcherHandler wh(mFileModel->watcher()); - qApp->restoreOverrideCursor(); - QModelIndexList selected = mFileView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - - QString message = QString(tr("Really delete %1 files?")).arg(QString::number(selected.count())); - int retval = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); - if(retval == QMessageBox::Yes){ - for(const QModelIndex &idx : selected){ - QModelIndex real = mFileProxy->mapToSource(idx); - if(real.isValid()){ - QFileInfo fi(real.data(SmDirModel::FullPathRole).toString()); - if(fi.isDir()){ - QDir d(fi.absoluteFilePath()); - d.removeRecursively(); - }else if(fi.isFile()){ - QFile::remove(fi.absoluteFilePath()); - } - } - } - } -} - -void FilesystemWidget::toClipboard(int clipmode){ - TimerHandler h(mFileModel->refreshTimer()); - mClipboardMode = clipmode; - QClipboard *clip = qApp->clipboard(); - QModelIndexList selected = mFileView->selectionModel()->selectedRows(); - clip->clear(); - mModel->clearClipboardList(); - if(selected.isEmpty()){ - return; - } - QList<QUrl> files; - for(const QModelIndex &idx : selected){ - if(idx.data(SmDirModel::NameRole).toString() == ".."){ - continue; - } - files << QUrl::fromLocalFile(idx.data(SmDirModel::FullPathRole).toString()); - mModel->markForClipboard(mFileProxy->mapToSource(idx)); - } - QMimeData *mimeData = new QMimeData; - mimeData->setUrls(files); - clip->setMimeData(mimeData); -} - -void FilesystemWidget::fromClipboard(){ - QClipboard *clip = qApp->clipboard(); - const QMimeData *mimeData = clip->mimeData(); - if(!mimeData->hasUrls()){ - return; - } - QStringList files; - for(const QUrl &url : mimeData->urls()){ - files << url.toLocalFile(); - } - const QString destDir = selectedDir(); - QFileInfo destDirFi(destDir); - if(!destDirFi.isDir()){ - return; - } - if(mClipboardMode == Copy){ - mModel->clearClipboardList(); - copyFiles(files, destDir); - }else if(mClipboardMode == Cut){ - mModel->clearClipboardList(); - moveFiles(files, destDir); - } -} - -void FilesystemWidget::renameFile(){ - TimerHandler h(mFileModel->refreshTimer()); - QModelIndex curIdx = mFileView->currentIndex(); - if(curIdx.data().toString() == ".."){ - return; - } - bool ok = false; - QString fileName = curIdx.data(SmDirModel::NameRole).toString(); - QString l1 = QString(tr("Rename %1").arg(fileName)); - QString newName = QInputDialog::getText(this, tr("Rename file"), l1, QLineEdit::Normal, fileName, &ok); - if(ok){ - QFileInfo fi(curIdx.data(SmDirModel::FullPathRole).toString()); - QString nfn = QString("%1/%2").arg(fi.absolutePath()).arg(newName); - QFile f(fi.absoluteFilePath()); - f.rename(nfn); - } -} - -void FilesystemWidget::playSelectedWithDefault(){ - playSelected(QString()); -} - -void FilesystemWidget::playSelected(const QString &player){ - TimerHandler h(mFileModel->refreshTimer()); - QStringList files = selectedFiles(); - if(files.isEmpty()){ - statusbarMessage(tr("Nothing selected.")); - return; - } - QPair<QString, QStringList> data = programData("movieviewer", player); - if(data.first.isEmpty()){ - data = programData("pictureviewer", player); - if(data.first.isEmpty()){ - QString message = QString(tr("Cannot find program %1.")).arg(player); - QMessageBox::critical(this, tr("Error"), message); - return; - } - } - QString program = data.first; - QStringList programArgs(data.second); - programArgs << files; - QProcess::startDetached(program, programArgs); -} - -void FilesystemWidget::playSelectedRepeat(int times){ - TimerHandler h(mFileModel->refreshTimer()); - QStringList files = selectedFiles(); - if(files.isEmpty()){ - statusbarMessage(tr("Nothing selected.")); - return; - } - QPair<QString, QStringList> data = programData("movieviewer", QString()); - QString program = data.first; - QStringList programArgs(data.second); - if(times == -1){ - programArgs << "--loop" << files; - }else{ - for(int i = 0; i < times; ++i){ - programArgs << files; - } - } - QProcess::startDetached(program, programArgs); -} - -void FilesystemWidget::playSelectedInfinite(){ - playSelectedRepeat(-1); -} - -void FilesystemWidget::readSettings(){ - QSettings s; - QStringList expandedDirs = s.value("paths/expandeddirs").toStringList(); - if(expandedDirs.isEmpty()){ - expandedDirs << QDir::homePath(); - } - for(const QString &p : expandedDirs){ - QModelIndex idx = mModel->index(p); - if(idx.isValid()){ - QModelIndex pidx = mDirProxy->mapFromSource(idx); - if(pidx.isValid()){ - mDirView->setExpanded(pidx, true); - } - } - } - QString selectedDir = s.value("paths/selecteddir").toString(); - if(!selectedDir.isEmpty()){ - QModelIndex diridx = mModel->index(selectedDir); - if(diridx.isValid()){ - QModelIndex pidx = mDirProxy->mapFromSource(diridx); - mDirView->selectionModel()->setCurrentIndex(pidx, QItemSelectionModel::ClearAndSelect); - } - } - bool expensiveOps = s.value("ui/expensiveops", true).toBool(); - mFileModel->watcher()->setExpensiveOps(expensiveOps); - QPoint picViewerPos = s.value("windows/picviewer").toPoint(); - mIconDirSplitter->restoreState(s.value("ui/fsdirsplitter").toByteArray()); - mPicViewer->move(picViewerPos); - mFileView->readConfig(); -} - -void FilesystemWidget::writeSettings(){ - QSettings s; - s.setValue("paths/expandeddirs", mExpandedDirs); - QModelIndex currentDir = mDirView->selectionModel()->currentIndex(); - if(currentDir.isValid()){ - QModelIndex real = mDirProxy->mapToSource(currentDir); - QString dir = mModel->filePath(real); - s.setValue("paths/selecteddir", dir); - } - s.setValue("windows/picviewer", mPicViewer->pos()); - s.setValue("ui/fsdirsplitter", mIconDirSplitter->saveState()); - mFileView->writeConfig(); -} - -void FilesystemWidget::configChanged(){ - mModel->setIconProvider(mIconProvider); - mFileModel->readSettings(); - mFileModel->refresh(); -} - -void FilesystemWidget::dvdMount(){ - QSettings s; - QString mountDir = s.value("paths/dvdmount").toString(); - if(isMounted()){ - int retval = QProcess::execute("umount", QStringList() << mountDir); - if(retval){ - QString message = QString(tr("Could not unmount %1: %2")).arg(mountDir).arg(strerror(retval)); - QMessageBox::critical(this, tr("Error"), message); - return; - } - emit mounted(false); - }else{ - int retval = -1; - int ctr = 0; - while(retval){ - retval = QProcess::execute("mount", QStringList() << mountDir); - ++ctr; - if(ctr > 4){ - break; - } - } - QModelIndex mIdx = mDirProxy->mapFromSource(mModel->index(mountDir)); - mDirView->selectionModel()->setCurrentIndex(mIdx, QItemSelectionModel::ClearAndSelect); - if(!isMounted()){ - QString message = QString(tr("Could not mount %1: %2")).arg(mountDir).arg(strerror(retval)); - QMessageBox::critical(this, tr("Error"), message); - emit mounted(isMounted()); - return; - } - //ugly hack to update QFileSytemModel - QString tDirPath = mLastDir.isEmpty() ? QDir::homePath() : mLastDir; - QModelIndex tIdx = mDirProxy->mapFromSource(mModel->index(tDirPath)); - mDirView->selectionModel()->setCurrentIndex(tIdx, QItemSelectionModel::ClearAndSelect); - mDirView->selectionModel()->setCurrentIndex(mIdx, QItemSelectionModel::ClearAndSelect); - mDirView->selectionModel()->setCurrentIndex(tIdx, QItemSelectionModel::ClearAndSelect); - mDirView->selectionModel()->setCurrentIndex(mIdx, QItemSelectionModel::ClearAndSelect); - mDirView->expand(mIdx); - emit mounted(isMounted()); - } -} - -void FilesystemWidget::moveToArchive(){ - QStringList selected = selectedFiles(); - QFileInfoList files; - for(const QString &f : selected){ - QFileInfo fi(f); - if(fi.isDir()){ - QDirIterator di(f, QDir::Files, QDirIterator::Subdirectories); - while(di.hasNext()){ - di.next(); - files.append(di.fileInfo()); - } - }else if(fi.isFile()){ - files.append(fi); - } - } - QMap<QString, QString> res; - for(const QFileInfo &fi : files){ - if(!fi.exists()){ - res.insert(fi.fileName(), tr("File not found")); - continue; - } - QString md5 = Helper::md5Sum(fi.absoluteFilePath()); - if(!ArchiveFilesModel::hasFile(md5)){ - res.insert(fi.fileName(), tr("Not in archive")); - continue; - } - QString mvres = Helper::moveToArchive(fi.absoluteFilePath(), md5); - if(mvres.isEmpty()){ - res.insert(fi.fileName(), tr("Move failed")); - continue; - } - if(!ArchiveFilesModel::setDvdNo(md5, -1)){ - res.insert(fi.fileName(), tr("DvdNo. update failed")); - } - res.insert(fi.fileName(), tr("Success")); - } - QString msg("<html>"); - msg.append(tr("<p>Result:</p>")); - msg.append("<ul>"); - QMap<QString, QString>::const_iterator it = res.constBegin(); - while(it != res.constEnd()){ - QString m = QString(tr("<li>%1: %2</li>")).arg(it.key()).arg(it.value()); - msg.append(m); - ++it; } - msg.append("</ul>"); - msg.append("</html>"); - QMessageBox::information(this, tr("Move to archive"), msg, QMessageBox::Ok); -} - -void FilesystemWidget::selectAllPV(){ - QModelIndex idx = mDirView->currentIndex(); - if(idx.isValid()){ - QModelIndex real = mDirProxy->mapToSource(idx); - QString filePath = real.data(QFileSystemModel::FilePathRole).toString(); - mPicViewer->addFiles(filePath, true); - } -} - -void FilesystemWidget::setWindowTitle(){ - QModelIndex curIdx = mDirView->selectionModel()->currentIndex(); - QString dir = curIdx.data(QFileSystemModel::FilePathRole).toString(); - mWindowTitle = QString(tr("Filemanager - [%1]")).arg(dir); - emit windowTitle(mWindowTitle); -} - -void FilesystemWidget::preview(){ - QModelIndex curIdx = mFileView->selectionModel()->currentIndex(); - QString mimeType = curIdx.data(SmDirModel::TypeRole).toString(); - if(mimeType.startsWith("video")){ - qApp->setOverrideCursor(Qt::BusyCursor); - mPicViewer->setShowMappingItem(false); - QPixmap pm(Helper::preview(curIdx.data(SmDirModel::FullPathRole).toString())); - if(!pm.isNull()){ - mPicViewer->setPixmap(pm); - mPicViewer->show(); - } - qApp->restoreOverrideCursor(); - }else if(mimeType.startsWith("image")){ - mPicViewer->setShowMappingItem(false); - mPicViewer->setFile(curIdx.data(SmDirModel::FullPathRole).toString()); - mPicViewer->show(); - } -} - -void FilesystemWidget::unpack(){ - QModelIndexList selectedIdxs = mFileView->selectionModel()->selectedRows(); - mUnpackDlg->clearOutput(); - mUnpackDlg->setCloseEnabled(false); - mUnpackDlg->clearCommandQueue(); - mUnpackDlg->show(); - for(const QModelIndex &idx : selectedIdxs){ - QString mimeType = idx.data(SmDirModel::TypeRole).toString(); - if(mimeType == "application/zip" || mimeType == "application/x-rar"){ - QSettings s; - QString outputDir = s.value("paths/unpackpath").toString(); - QFileInfo fi(outputDir); - if(fi.isDir() && fi.isWritable()){ - QString outOption = QString("-o%1").arg(outputDir); - QStringList args = QStringList() << outOption << "-y" << "e" << idx.data(SmDirModel::FullPathRole).toString(); - mUnpackDlg->appendCommand(args); - }else{ - QMessageBox::critical(this, tr("Error"), tr("Unpack directory invalid.\nEither it doesn't exist or it's not writable!")); - return; - } - } - } - mUnpackDlg->doIt(); -} - -void FilesystemWidget::untar(){ - QModelIndexList selectedIdxs = mFileView->selectionModel()->selectedRows(); - for(const QModelIndex &idx : selectedIdxs){ - QFileInfo fi(idx.data(SmDirModel::FullPathRole).toString()); - QString cmdStr = QString("/usr/bin/tar -C %1 -xf %2").arg(fi.absolutePath()).arg(idx.data(SmDirModel::FullPathRole).toString()); - int retval = QProcess::execute(cmdStr); - if(retval == 0){ - QFile::remove(idx.data(SmDirModel::FullPathRole).toString()); - } - QString msg = QString(tr("Executed %1: %2")).arg(cmdStr).arg(QString::number(retval)); - emit statusbarMessage(msg); - } -} - -void FilesystemWidget::selectUnpackDir(){ - QSettings s; - QString unpackDir = s.value("paths/unpackpath").toString(); - QModelIndex unpackDirIdx = mModel->index(unpackDir); - if(unpackDirIdx.isValid()){ - mDirView->selectionModel()->setCurrentIndex(mDirProxy->mapFromSource(unpackDirIdx), QItemSelectionModel::ClearAndSelect); - } -} - -void FilesystemWidget::centerCurrent(){ - QModelIndex curIdx = mDirView->currentIndex(); - mDirView->scrollTo(curIdx, QAbstractItemView::PositionAtCenter); -} - -void FilesystemWidget::copyFiles(const QStringList &files, const QString &dest){ - for(const QString &file : files){ - QFileInfo fi(file); - if(fi.isDir()){ - copyRecursive(fi, dest); - }else if(fi.isFile()){ - const QString destFile = QString("%1/%2").arg(dest).arg(fi.fileName()); - QFile::copy(fi.absoluteFilePath(), destFile); - } - } -} - -void FilesystemWidget::moveFiles(const QStringList &files, const QString &dest){ - for(const QString &file : files){ - QFileInfo fi(file); - const QString destFile = QString("%1/%2").arg(dest).arg(fi.fileName()); - QFile::rename(file, destFile); - } -} - -QPair<QString, QStringList> FilesystemWidget::programData(const QString &prefix, const QString &preferred){ - QSettings s; - QString section = QString("programs_%1").arg(prefix); - QHash<QString, QVariant> data = s.value(QString("%1/data").arg(section)).toHash(); - if(data.isEmpty()){ - return QPair<QString, QStringList>(); - } - QHash<QString, QVariant> programData; - if(!preferred.isEmpty()){ - if(data.keys().contains(preferred)){ - programData = data.value(preferred).toHash(); - return qMakePair(programData.value("path").toString(), programData.value("args").toStringList()); - } - return QPair<QString, QStringList>(); - } - QString defaultProg = s.value(QString("%1/default").arg(section)).toString(); - if(defaultProg.isEmpty()){ - return QPair<QString, QStringList>(); - } - programData = data.value(defaultProg).toHash(); - return qMakePair(programData.value("path").toString(), programData.value("args").toStringList()); -} - -void FilesystemWidget::copyRecursive(const QFileInfo &start, const QString &destdir){ - if(!start.isDir()){ - return; - } - QDir source(start.absoluteFilePath()); - QDir dest = QDir(destdir); - if(!dest.exists(source.dirName())){ - dest.mkdir(source.dirName()); - } - QString d = QString("%1/%2").arg(destdir).arg(source.dirName()); - foreach(QFileInfo cur, source.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)){ - if(cur.isDir()){ - copyRecursive(cur, d); - }else{ - QString destPath = QString("%1/%2").arg(d).arg(cur.fileName()); - QFile::copy(cur.absoluteFilePath(), destPath); - } - } -} - -const QString FilesystemWidget::selectedDir(){ - const QModelIndexList selected = mDirView->selectionModel()->selectedRows(); - if(!selected.isEmpty()){ - return selected.at(0).data(QFileSystemModel::FilePathRole).toString(); - } - return QString(); -} - -void FilesystemWidget::keyPressEvent(QKeyEvent *e){ - if(e->key() == Qt::Key_Left && (e->modifiers() & Qt::ControlModifier)){ - goBack(); - return; - } - if(e->key() == Qt::Key_Up && (e->modifiers() & Qt::ControlModifier)){ - parentDir(); - return; - } - if(e->key() == Qt::Key_U && (e->modifiers() & Qt::ControlModifier)){ - unpack(); - return; - } - QWidget::keyPressEvent(e); -} - -void FilesystemWidget::dirExpanded(const QModelIndex &idx){ - QModelIndex real = mDirProxy->mapToSource(idx); - if(real.isValid()){ - mExpandedDirs << mModel->filePath(real); - } -} - -void FilesystemWidget::dirCollapsed(const QModelIndex &idx){ - QModelIndex real = mDirProxy->mapToSource(idx); - if(real.isValid()){ - QString path = mModel->filePath(real); - if(mExpandedDirs.contains(path)){ - mExpandedDirs.removeAll(path); - } - } -} - -void FilesystemWidget::fileEditorClosed(const QModelIndex &idx){ - QModelIndex real = mFileProxy->mapFromSource(idx); - if(real.isValid()){ - mFileView->update(real); - } -} - -void FilesystemWidget::resizeFileView(){ - for(int i = 1; i < 5; ++i){ - mFileView->resizeColumnToContents(i); - } - mFileView->resizeColumnToContents(0); -} - -QStringList FilesystemWidget::selectedFiles(){ - QStringList retval; - QModelIndexList selected = fileView()->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return QStringList(); - } - for(const QModelIndex &idx : selected){ - retval << idx.data(SmDirModel::FullPathRole).toString(); - } - return retval; -} - -//FileSystemModel - -FileSystemModel::FileSystemModel(QObject *parent) : QFileSystemModel(parent){} - -void FileSystemModel::markForClipboard(const QPersistentModelIndex &idx){ - if(idx.isValid()){ - if(!mClipEntries.contains(idx)){ - mClipEntries << idx; - } - } -} - -void FileSystemModel::clearClipboardList(){ - QList<QPersistentModelIndex> tmp(mClipEntries); - mClipEntries.clear(); - for(const QPersistentModelIndex &ent : tmp){ - emit dataChanged(ent, ent); - } -} - -void FileSystemModel::cleanup(){ - QStringList toRemove; - for(const QString &p : mSeen.keys()){ - QFileInfo fi(p); - if(!fi.exists()){ - mDeleteFromSeenQuery->bindValue(":path", p); - mDeleteFromSeenQuery->exec(); - toRemove << p; - } - } - for(const QString &r : toRemove){ - mSeen.remove(r); - } -} diff --git a/filesystemwidget.h b/filesystemwidget.h deleted file mode 100644 index 0b34874..0000000 --- a/filesystemwidget.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - 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. -*/ - -#ifndef FILESYSTEMWIDGET_H -#define FILESYSTEMWIDGET_H - -#include <QWidget> -#include <QFileSystemModel> -#include <QSqlDatabase> -#include <QDateTime> -#include <QMutex> -#include <QThread> - -class SmTreeView; -class FilesystemDirProxy; -class FileView; -class FilesystemFileProxy; -class QLineEdit; -class PictureViewer2; -class FileSystemModel; -class SheMovIconProvider; -class SmDirModel; -class QToolBar; -class QSplitter; -class UnpackDialog; -class Unpacker; - -class FilesystemWidget : public QWidget { - Q_OBJECT - public: - enum ClipboardMode { Copy, Cut, None }; - enum SelectedFiles { Current, Previous }; - FilesystemWidget(QWidget *parent = 0); - FileView *fileView() { return mFileView; } - FilesystemFileProxy *fileProxy() { return mFileProxy; } - FileSystemModel *dirModel() { return mModel; } - SmDirModel *fileModel() { return mFileModel; } - const QString windowTitle() const { return mWindowTitle; } - PictureViewer2 *pictureViewer() { return mPicViewer; } - QToolBar *toolBar() { return mToolBar; } - bool isMounted(); - const QString currentDir() const; - - signals: - void windowTitle(const QString &); - void statusbarMessage(const QString &); - void mounted(bool); - void upSelected(const QString &); - - public slots: - void directoryChanged(const QModelIndex &selected, const QModelIndex &); - void directoryEdited(); - void fileViewActivated(const QModelIndex &index); - void parentDir(); - void goBack(); - void deleteFiles(); - void toClipboard(int clipmode); - void fromClipboard(); - void renameFile(); - void playSelectedWithDefault(); - void playSelected(const QString &player); - void playSelectedRepeat(int times); - void playSelectedInfinite(); - void readSettings(); - void writeSettings(); - void configChanged(); - void dvdMount(); - void moveToArchive(); - void selectAllPV(); - void setWindowTitle(); - void preview(); - void unpack(); - void untar(); - void selectUnpackDir(); - void centerCurrent(); - void resizeFileView(); - - protected: - void keyPressEvent(QKeyEvent *e); - - private slots: - void dirExpanded(const QModelIndex &idx); - void dirCollapsed(const QModelIndex &idx); - void fileEditorClosed(const QModelIndex &idx); - - private: - void copyFiles(const QStringList &files, const QString &dest); - void moveFiles(const QStringList &files, const QString &dest); - void copyRecursive(const QFileInfo &start, const QString &destdir); - const QString selectedDir(); - QPair<QString, QStringList> programData(const QString &prefix, const QString &preferred); - QStringList selectedFiles(); - QStringList mExpandedDirs; - FileSystemModel *mModel; - SmDirModel *mFileModel; - SmTreeView *mDirView; - FileView *mFileView; - FilesystemDirProxy *mDirProxy; - FilesystemFileProxy *mFileProxy; - QToolBar *mToolBar; - QLineEdit *mDirEdit; - QString mWindowTitle; - QString mTemplate; - qint64 mSize; - PictureViewer2 *mPicViewer; - SheMovIconProvider *mIconProvider; - QString mLastDir; - QHash<int,QStringList> mLastFiles; - int mClipboardMode; - QSplitter *mIconDirSplitter; - UnpackDialog *mUnpackDlg; -}; - -class FileSystemModel : public QFileSystemModel { - Q_OBJECT - public: - FileSystemModel(QObject *parent = 0); - ~FileSystemModel() {} - - public slots: - void markForClipboard(const QPersistentModelIndex &idx); - void clearClipboardList(); - - private: - void cleanup(); - QHash<QString, QDateTime> mSeen; - QSqlDatabase mDb; - QSqlQuery *mDeleteFromSeenQuery; - QSqlQuery *mMarkAsSeenQuery; - QList<QPersistentModelIndex> mClipEntries; -}; - -#endif diff --git a/fileview.cpp b/fileview.cpp deleted file mode 100644 index 0d7d90c..0000000 --- a/fileview.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* - 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 <QContextMenuEvent> -#include <QMenu> -#include <QAction> -#include <QKeyEvent> -#include <QModelIndex> -#include <QRegExp> -#include <QFileSystemModel> -#include <QSortFilterProxyModel> -#include <QAction> -#include <QApplication> -#include <QEvent> -#include <QSettings> -#include <QModelIndex> -#include <QFileInfo> -#include <QVariant> -#include <QList> -#include <QDir> -#include <QSortFilterProxyModel> -#include <QInputDialog> -#include <QPalette> -#include <QTimer> -#include <QHeaderView> - -#include "fileview.h" -#include "hoverwindow.h" -#include "smglobals.h" -#include "filesystemfileproxy.h" -#include "filepropertiesdialog.h" -#include "smdirmodel.h" - -FileView::FileView(QWidget *parent) : SmTreeView("ui/fsheaderpos", parent), mDeleteA(0) { - setAttribute(Qt::WA_Hover); - setRootIsDecorated(false); - setEditTriggers(QAbstractItemView::NoEditTriggers); - mHoverWin = new HoverWindow(this); - QSize curSize = SmGlobals::instance()->cursorSize(); - mHoverWin->setHoverOffset(QPoint(curSize.width() + 30, 0)); -} - -void FileView::setModel(QAbstractItemModel *model){ - mProxy = qobject_cast<FilesystemFileProxy*>(model); - mModel = qobject_cast<SmDirModel*>(mProxy->sourceModel()); - SmTreeView::setModel(model); -} - -QStringList FileView::selectedItems(){ - QModelIndexList items = selectionModel()->selectedRows(SmDirModel::Name); - if(!items.isEmpty()){ - QStringList retval; - foreach(QModelIndex idx, items){ - retval << idx.data().toString(); - } - return retval; - } - return QStringList(); -} - -void FileView::markFiles(){ - bool ok; - QString title = QString(tr("%1 - %2")).arg(qApp->applicationName()).arg(tr("Mark files")); - QString glob = QInputDialog::getText(this, title, tr("Enter filename pattern"), QLineEdit::Normal, QString(), &ok); - if(!ok){ - return; - } - int rowCount = model()->rowCount(rootIndex()); - if(!rowCount || glob.isEmpty()){ - return; - } - QRegExp re(glob, Qt::CaseInsensitive, QRegExp::WildcardUnix); - for(int i = 0; i < rowCount; ++i){ - QModelIndex cur = mProxy->mapFromSource(mModel->index(i, 0, mModel->rootIndex())); - if(cur.data(SmDirModel::NameRole).toString() == ".."){ - continue; - } - if(re.indexIn(cur.data(SmDirModel::NameRole).toString()) != -1){ - selectionModel()->select(cur, QItemSelectionModel::Select | QItemSelectionModel::Rows); - } - } -} - -void FileView::unmarkFiles(){ - selectionModel()->clearSelection(); -} - -void FileView::createFolder(){ - bool ok; - QString folderName = QInputDialog::getText(this, tr("Create folder"), tr("Enter new folder name"), QLineEdit::Normal, QString(), &ok); - if(!ok){ - return; - } - if(!ok || folderName.isEmpty()){ - return; - } - mModel->dir().mkdir(folderName); -} - -void FileView::readConfig(){ - QSettings s; - mHoverPics = s.value("ui/hoverpics", true).toBool(); - mHoverWin->setWindowOpacity(s.value("ui/hoveropacity", 10).toFloat() / 10.0); - mCursorOffset = s.value("ui/cursoroffset").toInt(); - readHeaderConfig(); -} - -void FileView::writeConfig(){ - writeHeaderConfig(); -} - -void FileView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint){ - SmTreeView::closeEditor(editor, hint); - QModelIndex sourceIdx = mProxy->mapToSource(currentIndex()); - emit editorClosed(sourceIdx); - mModel->refreshTimer()->start(); -} - -void FileView::contextMenuEvent(QContextMenuEvent *e){ - mHoverWin->hide(); - QMenu contextMenu(this); - foreach(QAction *a, actions()){ - contextMenu.addAction(a); - } - contextMenu.exec(e->globalPos()); -} - -void FileView::keyPressEvent(QKeyEvent *e){ - if(!hasFocus()){ - SmTreeView::keyPressEvent(e); - return; - } - switch(e->key()){ - case Qt::Key_Backspace: - emit upDir(); - e->accept(); - break; - case Qt::Key_Enter: - case Qt::Key_Return: - emit enterPressed(currentIndex()); - e->accept(); - break; - case Qt::Key_Delete: - emit delFiles(); - e->accept(); - break; - default: - SmTreeView::keyPressEvent(e); - } -} - -void FileView::resizeEvent(QResizeEvent *e){ - if(e->size().width() != e->oldSize().width()){ - int width = e->size().width(); - int c1width = width / 2; // * 2; - setColumnWidth(0, c1width); - } -} - -bool FileView::event(QEvent *e){ - QHoverEvent *hEvent = static_cast<QHoverEvent*>(e); - if(!hEvent){ - return exitHover(); - } - if(e->type() == QEvent::HoverLeave){ - return exitHover(); - } - QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() + mCursorOffset); - QModelIndex curIdx = indexAt(hotSpot); - HoverFileType ft = None; - QFileInfo curIdxInfo(curIdx.data(SmDirModel::FullPathRole).toString()); - if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ - if(!curIdx.isValid() || (!curIdx.column() == 0)){ - return exitHover(); - } - if(curIdx.data().toString() == ".."){ - return exitHover(); - } - if(curIdxInfo.isFile()){ - QString mimeType = Helper::mimeType(curIdxInfo.absoluteFilePath()); - if(mimeType.startsWith("image")){ - if(!mHoverPics){ - return exitHover(); - } - ft = Image; - }else{ - return exitHover(); - } - }else{ - return exitHover(); - } - } - if(e->type() == QEvent::HoverEnter){ - mCurHover = curIdx; - doHover(curIdxInfo, ft); - return true; - }else if(e->type() == QEvent::HoverMove){ - if(mCurHover != curIdx){ - mCurHover = curIdx; - doHover(curIdxInfo, ft); - }else{ - mHoverWin->setPos(); - } - return true; - } - return SmTreeView::event(e); -} - -void FileView::selectedFilesChanged(){ - QModelIndexList selected = selectionModel()->selectedRows(); - emit numSelected(selected.size()); - qint64 selSize = 0; - qint64 dur = 0; - foreach(QModelIndex i, selected){ - selSize += i.data(SmDirModel::SizeRole).toLongLong(); - dur += i.data(SmDirModel::DurSizeRole).toFloat(); - } - emit selectedSize(selSize); - emit selectedDuration(dur, false); -} - -void FileView::properties(){ - QModelIndexList selected = selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QString fp = selected.at(0).data(SmDirModel::FullPathRole).toString(); - FilePropertiesDialog fpd(fp, this); - fpd.exec(); -} - -void FileView::selectItem(const QString &item){ - QModelIndex start = mProxy->index(0, 0); - QModelIndexList items = mProxy->match(start, Qt::DisplayRole, item, 1, Qt::MatchExactly | Qt::MatchWrap); - if(!items.isEmpty()){ - selectionModel()->select(items.at(0), QItemSelectionModel::Rows | QItemSelectionModel::Select); - scrollTo(items.at(0)); - } -} - -void FileView::saveSelection(){ - mSelectedFiles.clear(); - QModelIndexList selected = selectionModel()->selectedRows(SmDirModel::Name); - foreach(QModelIndex i, selected){ - mSelectedFiles << i.data().toString(); - } -} - -void FileView::restoreSelection(){ - foreach(QString s, mSelectedFiles){ - QModelIndex i = mModel->find(s, SmDirModel::Name); - if(i.isValid()){ - QModelIndex r = mProxy->mapFromSource(i); - selectionModel()->select(r, QItemSelectionModel::Rows | QItemSelectionModel::Select); - } - } -} - -bool FileView::exitHover(bool exitVal){ - mHoverWin->setVisible(false); - mCurHover = QModelIndex(); - return exitVal; -} - -void FileView::doHover(const QFileInfo &fi, int type){ - QPixmap pm; - if(type == Image){ - pm.load(fi.absoluteFilePath()); - mHoverWin->setPixmap(pm); - mHoverWin->setCaption(fi.fileName()); - mHoverWin->setPos(); - mHoverWin->setVisible(true); - } -} diff --git a/fileview.h b/fileview.h deleted file mode 100644 index 6d001aa..0000000 --- a/fileview.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - 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. -*/ - -#ifndef FILEVIEW_H -#define FILEVIEW_H - -#include "smtreeview.h" -#include "helper.h" - -class QContextMenuEvent; -class QKeyEvent; -class QResizeEvent; -class QModelIndex; -class QAction; -class HoverWindow; -class QEvent; -class QFileInfo; -class FilesystemFileProxy; -class SmDirModel; -class QActionGroup; - -class FileView : public SmTreeView { - Q_OBJECT - public: - FileView(QWidget *parent = 0); - ~FileView() {} - virtual void setModel(QAbstractItemModel *model); - QStringList selectedItems(); - - signals: - void upDir(); - void delFiles(); - void enterPressed(const QModelIndex &); - void statusbarMessage(const QString &); - void editorClosed(const QModelIndex &idx); - void numSelected(int); - void selectedSize(qint64); - void selectedDuration(qint64,bool); - - public slots: - void markFiles(); - void unmarkFiles(); - void createFolder(); - void readConfig(); - void writeConfig(); - void saveSelection(); - void restoreSelection(); - void selectedFilesChanged(); - void properties(); - void selectItem(const QString &item); - - protected slots: - virtual void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint); - - protected: - virtual void contextMenuEvent(QContextMenuEvent *e); - virtual void keyPressEvent(QKeyEvent *e); - virtual void resizeEvent(QResizeEvent *e); - virtual bool event(QEvent *event); - - private: - enum HoverFileType { Dir, Movie, Image, None }; - bool exitHover(bool exitVal = true); - void doHover(const QFileInfo &fi, int type); - QAction *mDeleteA; - HoverWindow *mHoverWin; - QModelIndex mCurHover; - bool mHoverPics; - qint16 mCursorOffset; - QList<QString> mSelectedFiles; - FilesystemFileProxy *mProxy; - SmDirModel *mModel; -}; - -#endif - @@ -19,9 +19,6 @@ #include <sys/vfs.h> #include "shemov.h" -#include "filesystemwidget.h" -#include "filesystemfileproxy.h" -#include "fileview.h" #include "configurationdialog.h" #include "statisticsdialog.h" #include "smglobals.h" @@ -32,15 +29,15 @@ #include "dbanalyzer.h" #include "newpicsdialog.h" #include "pictureswidget.h" -#include "smdirmodel.h" #include "archiveview.h" #include "archivecontroller.h" #include "archivebrowser.h" #include "searchdialog.h" #include "randomtab.h" #include "fswidget.h" +#include "helper.h" -SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { +SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) /*, mOpenWithGroupFS(0), mOpenWithGroupAV(0) */ { //application icon qApp->setWindowIcon(QIcon(":/shemov.png")); createPalette(); @@ -56,12 +53,7 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla //FileSystemWidget + TabWidget splash.showMessage(tr("Constructing Filemanager..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); - mFSWidget = new FilesystemWidget; - SmGlobals::instance()->registerWidget("FSWidget", mFSWidget); - setWindowTitle(mFSWidget->windowTitle()); mTab = new QTabWidget; - mTab->addTab(mFSWidget, tr("Filemanager")); - connect(this, &SheMov::configChanged, mFSWidget, &FilesystemWidget::configChanged); mFileWidget = new FSWidget; mTab->addTab(mFileWidget, tr("FS")); connect(mFileWidget, &FSWidget::message, this, &SheMov::statusbarMessage); @@ -107,14 +99,10 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla connect(mRandomTab, &RandomTab::configure, this, &SheMov::configure); mTab->addTab(mRandomTab, tr("Random")); - //newmoviewizard + dbanalyzer + newpicsdialog + searchdialog + //misc dialogs splash.showMessage(tr("Creating misc. Dialogs..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); - mNewMovieWizard = new NewMovieWizard(this); - mNewMovieWizard->setMinimumWidth(1024); ArchiveController *c = SmGlobals::instance()->archiveController(); - connect(mNewMovieWizard, &NewMovieWizard::accepted, c->archiveTreeModel(), &ArchiveModel::refresh); - mNewPicsDialog = new NewPicsDialog(this); mSearchDialog = new SearchDialog(this); connect(mSearchDialog, &SearchDialog::searchResultClicked, this, &SheMov::searchResult); @@ -136,22 +124,10 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla splash.showMessage(tr("Finishing..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); - connect(mFSWidget->fileView(), &FileView::selectedSize, this, &SheMov::setSize); - connect(mFSWidget->fileView(), &FileView::selectedDuration, this, &SheMov::setDuration); - connect(mFSWidget->fileView(), &FileView::numSelected, this, &SheMov::updateSelectedCount); - connect(mFSWidget, QOverload<const QString &>::of(&FilesystemWidget::windowTitle), this, &SheMov::windowTitle); - connect(mFSWidget->fileView(), &FileView::statusbarMessage, this, &SheMov::statusbarMessage); - connect(mFSWidget, &FilesystemWidget::statusbarMessage, this, &SheMov::statusbarMessage); connect(mTab, &QTabWidget::currentChanged, this, &SheMov::tabChanged); - connect(mFSWidget->dirModel(), &FileSystemModel::dataChanged, this, &SheMov::setFsFree); - connect(mFSWidget->dirModel(), &FileSystemModel::layoutChanged, this, &SheMov::setFsFree); - connect(mFSWidget->dirModel(), &FileSystemModel::rowsRemoved, this, &SheMov::setFsFree); - connect(mFSWidget->fileModel(), &SmDirModel::fsFreeChanged, this, &SheMov::setFsFree); - connect(this, &SheMov::configChanged, mFSWidget->fileView(), &FileView::readConfig); connect(this, &SheMov::configChanged, picViewer, &PictureViewer2::readSettings); connect(this, &SheMov::configChanged, c->archiveTreeModel(), &ArchiveModel::readConfig); connect(this, &SheMov::configChanged, mFileWidget, &FSWidget::readSettings); - connect(mFSWidget, &FilesystemWidget::mounted, this, &SheMov::checkMount); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); @@ -159,21 +135,14 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla show(); splash.finish(this); - mFSWidget->readSettings(); - mFSWidget->fileView()->setFocus(Qt::ActiveWindowFocusReason); mPicWidget->readSettings(); mArchive->readSettings(); mArchiveBrowser->readConfig(); readSettings(); - // craptastic... We can't center until it's painted, - // hence this indirection :( - mFSWidget->centerCurrent(); setWindowState(Qt::WindowMaximized); } void SheMov::closeEvent(QCloseEvent *event){ - mFSWidget->writeSettings(); - mFSWidget->pictureViewer()->close(); mPicWidget->picViewer2()->writeSettings(); mPicWidget->writeSettings(); mArchive->writeSettings(); @@ -196,35 +165,25 @@ void SheMov::statusbarMessage(const QString &message){ void SheMov::configure(){ ConfigurationDialog dlg(this); dlg.exec(); - createOpenWithMenuFS(); createPalette(); emit configChanged(); } void SheMov::tabChanged(int newTab){ - mEditFSMenuA->setVisible(newTab == FileManager); mEditPicMenuA->setVisible(newTab == Pictures); - mViewFSMenuA->setVisible(newTab == FileManager); mViewPicMenuA->setVisible(newTab == Pictures); mArchiveViewMenuA->setVisible(newTab == Movies); mArchiveMenuA->setVisible(newTab == Movies); - mCdupA->setEnabled(newTab == FileManager); - mBackDirA->setEnabled(newTab == FileManager); mPicActionGroup->setEnabled(newTab == Pictures); mPVSelectAllA->disconnect(); mPVShowNPDialogA->setEnabled(newTab == FileManager); mPVAddToNPA->setEnabled(newTab == FileManager); - mNewPicsA->setEnabled(newTab == FileManager); - mNewMovieWizardA->setEnabled(newTab == FileManager); mArchiveBrowserViewMenuA->setVisible(newTab == ArchiveBrowserTab); mRandomEditMenuA->setVisible(newTab == RandomDisp); statusbarMessage(QString()); ArchiveController *c = SmGlobals::instance()->archiveController(); switch(newTab){ case FileManager: - connect(mPVSelectAllA, &QAction::triggered, mFSWidget, &FilesystemWidget::selectAllPV); - mFSWidget->fileView()->selectedFilesChanged(); - mFSWidget->setWindowTitle(); break; case Movies: c->fileSelectionChanged(QItemSelection(), QItemSelection()); @@ -298,35 +257,6 @@ void SheMov::showStatistics(){ dlg.exec(); } -void SheMov::newMovieWizard(){ - mNewMovieWizard->restart(); - mNewMovieWizard->show(); -} - -void SheMov::newMovieWizardWithFiles(){ - QModelIndexList selected = mFSWidget->fileView()->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - mNewMovieWizard->restart(); - mNewMovieWizard->infoPage()->setCurrentDir(mFSWidget->currentDir()); - for(const QModelIndex &sel : selected){ - mNewMovieWizard->infoPage()->addFile(sel.data(SmDirModel::FullPathRole).toString()); - mNewMovieWizard->infoPage()->guessOld(sel.data(SmDirModel::FullPathRole).toString()); - } - QSettings s; - bool autoAddCovers = s.value("ui/autoaddcovers", false).toBool(); - QString coverPath = s.value("paths/coverpath").toString(); - if(autoAddCovers && !coverPath.isEmpty()){ - QDir coverDir(coverPath); - for(const QFileInfo &fi : coverDir.entryInfoList(QDir::Files)){ - mNewMovieWizard->infoPage()->addFile(fi.absoluteFilePath()); - } - } - mNewMovieWizard->infoPage()->selectFirst(); - mNewMovieWizard->show(); -} - void SheMov::setSize(qint64 size){ QLocale l; QString val; @@ -392,38 +322,8 @@ void SheMov::createStatusbar(){ } void SheMov::createActions(){ - //File menu - mPlaySelectedFSA = new QAction(tr("Play selected movies..."), this); - connect(mPlaySelectedFSA, &QAction::triggered, mFSWidget, &FilesystemWidget::playSelectedWithDefault); - mOpenTimesFSAG = new QActionGroup(this); - for(int i = 2; i < 6; ++i){ - QString actString = QString("Play %1 times...").arg(i); - QAction *playTimesA = new QAction(actString, this); - connect(playTimesA, &QAction::triggered, [=] { mFSWidget->playSelectedRepeat(i); }); - mOpenTimesFSAG->addAction(playTimesA); - } - mOpenTimesFSAG->addAction(createSeparator()); - QString infiniteTimes = QString(tr("Play %1 times")).arg(QChar(0x221E)); // infinite - mPlaySelectedInfTimesA = new QAction(infiniteTimes, this); - connect(mPlaySelectedInfTimesA, &QAction::triggered, mFSWidget, &FilesystemWidget::playSelectedInfinite); - mOpenTimesFSAG->addAction(mPlaySelectedInfTimesA); - mPlaySelectedFSTimesA = new QAction(tr("Play repeat..."), this); - mNewMovieWizardA = new QAction(tr("Archive movie..."), this); - connect(mNewMovieWizardA, &QAction::triggered, this, &SheMov::newMovieWizard); - mArchiveSelectedMovsA = new QAction(QIcon(":/butt_plug.png"), tr("Archive selected movies..."), this); - connect(mArchiveSelectedMovsA, &QAction::triggered, this, &SheMov::newMovieWizardWithFiles); - mArchiveSelectedPicsA = new QAction(QIcon(":/hourglass_figure.png"), tr("Archive selected pics..."), this); - connect(mArchiveSelectedPicsA, &QAction::triggered, this, &SheMov::newPicsDialogWithFiles); - mArchivePicsInDirA = new QAction(QIcon(":/higheels.png"), tr("Archive all pics..."), this); - connect(mArchivePicsInDirA, &QAction::triggered, this, &SheMov::newPicsDialogWithDir); mConsistencyA = new QAction(tr("Check consisteny..."), this); connect(mConsistencyA, &QAction::triggered, this, &SheMov::checkConsistency); - mNewPicsA = new QAction(tr("Archive pics...."), this); - connect(mNewPicsA, &QAction::triggered, this, &SheMov::newPicsDialog); - mUnpackA = new QAction(QIcon(":/dog_hood.png"), tr("Unpack..."), this); - connect(mUnpackA, &QAction::triggered, mFSWidget, &FilesystemWidget::unpack); - mUntarA = new QAction(QIcon(":/clean_tampon.png"), tr("Untar"), this); - connect(mUntarA, &QAction::triggered, mFSWidget, &FilesystemWidget::untar); mSearchDialogA = new QAction(tr("Search..."), this); mSearchDialogA->setShortcut(tr("CTRL+f")); connect(mSearchDialogA, &QAction::triggered, mSearchDialog, &SearchDialog::show); @@ -432,57 +332,8 @@ void SheMov::createActions(){ mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); connect(mQuitA, &QAction::triggered, qApp, &QApplication::closeAllWindows); - - //Edit menu (FS) - mCdupA = new QAction(QIcon(":/up_dick.png"), tr("Go up"), this); - connect(mCdupA, &QAction::triggered, mFSWidget, &FilesystemWidget::parentDir); - mBackDirA = new QAction(QIcon(":/back_dick.png"), tr("Go back"), this); - connect(mBackDirA, &QAction::triggered, mFSWidget, &FilesystemWidget::goBack); - mGotoArchiveA = new QAction(tr("Goto archive..."), this); - connect(mGotoArchiveA, &QAction::triggered, this, &SheMov::gotoArchive); - mMarkFilesA = new QAction(tr("Select files..."), this); - mMarkFilesA->setShortcut(tr("CTRL++")); - mMarkFilesA->setShortcut(QKeySequence(Qt::CTRL + Qt::KeypadModifier + Qt::Key_Plus)); - connect(mMarkFilesA, &QAction::triggered, mFSWidget->fileView(), &FileView::markFiles); - mUnmarkFilesA = new QAction(tr("Deselect all files"), this); - mUnmarkFilesA->setShortcut(tr("CTRL+-")); - mUnmarkFilesA->setShortcut(QKeySequence(Qt::CTRL + Qt::KeypadModifier + Qt::Key_Minus)); - connect(mUnmarkFilesA, &QAction::triggered, mFSWidget->fileView(), &FileView::unmarkFiles); - mCreateFolderA = new QAction(QIcon(":/folder.png"), tr("New folder..."), this); - mCreateFolderA->setShortcut(tr("CTRL+n")); - connect(mCreateFolderA, &QAction::triggered, mFSWidget->fileView(), &FileView::createFolder); - mDeleteFilesA = new QAction(QIcon(":/delete.png"), tr("Delete selected..."), this); - mDeleteFilesA->setShortcut(tr("CTRL+d")); - connect(mDeleteFilesA, &QAction::triggered, mFSWidget, &FilesystemWidget::deleteFiles); - mCopyA = new QAction(tr("Copy"), this); - mCopyA->setShortcut(tr("CTRL+c")); - connect(mCopyA, &QAction::triggered, [=] {mFSWidget->toClipboard(FilesystemWidget::Copy); }); - mCutA = new QAction(tr("Cut"), this); - mCutA->setShortcut(tr("CTRL+x")); - connect(mCutA, &QAction::triggered, [=] {mFSWidget->toClipboard(FilesystemWidget::Cut); }); - mPasteA = new QAction(tr("Paste"), this); - mPasteA->setShortcut(tr("Ctrl+v")); - connect(mPasteA, &QAction::triggered, mFSWidget, &FilesystemWidget::fromClipboard); - mRenameA = new QAction(QIcon(":/rename.png"), tr("Rename..."), this); - mRenameA->setShortcut(tr("CTRL+r")); - connect(mRenameA, &QAction::triggered, mFSWidget, &FilesystemWidget::renameFile); - mMountDvdA = new QAction(QIcon(":/diaper.png"), tr("(Un)mount DVD drive"), this); - mMountDvdA->setCheckable(true); - connect(mMountDvdA, &QAction::triggered, mFSWidget, &FilesystemWidget::dvdMount); mConfigA = new QAction(QIcon(":/chastity_belt.png"), tr("Configure..."), this); connect(mConfigA, &QAction::triggered, this, &SheMov::configure); - mMoveToArchiveA = new QAction(tr("Move to archive"), this); - connect(mMoveToArchiveA, &QAction::triggered, mFSWidget, &FilesystemWidget::moveToArchive); - - //View menu (FS) - mRefreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this); - connect(mRefreshA, &QAction::triggered, mFSWidget->fileModel(), &SmDirModel::refresh); - mFSViewPropertiesA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Properties..."), this); - connect(mFSViewPropertiesA, &QAction::triggered, mFSWidget->fileView(), &FileView::properties); - mFSPreviewA = new QAction(QIcon(":/male_chastity_belt.png"), tr("Preview..."), this); - connect(mFSPreviewA, &QAction::triggered, mFSWidget, &FilesystemWidget::preview); - mFSResizeA = new QAction(QIcon(":/analstretcher.png"), tr("Resize"), this); - connect(mFSResizeA, &QAction::triggered, mFSWidget, &FilesystemWidget::resizeFileView); //Help menu QString aboutLabel = QString(tr("About %1...")).arg(qApp->applicationName()); @@ -494,9 +345,6 @@ void SheMov::createActions(){ connect(mStatisticsA, &QAction::triggered, this, &SheMov::showStatistics); //headers - mFileSysHeaderGroup = new QActionGroup(this); - createHeaderMapper(qobject_cast<SmTreeModel*>(mFSWidget->fileModel()), mFSWidget->fileView(), mFileSysHeaderGroup); - mFSWidget->fileView()->setHeaderGroup(mFileSysHeaderGroup); mPicsTreeHeaderGroup = new QActionGroup(this); SmTreeModel *picFilesModel = static_cast<SmTreeModel*>(SmGlobals::instance()->model("PicFiles")); createHeaderMapper(picFilesModel, mPicWidget->picView(), mPicsTreeHeaderGroup); @@ -722,52 +570,13 @@ void SheMov::createActions(){ } void SheMov::createMenus(){ - //file menu - QMenu *fileMenu = new QMenu(tr("&File"), this); - fileMenu->addAction(mNewMovieWizardA); - fileMenu->addAction(mNewPicsA); - fileMenu->addAction(mSearchDialogA); - fileMenu->addSeparator(); - fileMenu->addAction(mConsistencyA); + //FIXME! + //fileMenu->addAction(mConsistencyA); QMenu *analyzeMenu = new QMenu(tr("Analyze"), this); analyzeMenu->addAction(mAnalyzeActorsA); analyzeMenu->addAction(mAnalyzeGenresA); analyzeMenu->addAction(mAnalyzeSeriesA); analyzeMenu->addAction(mAnalyzePartsA); - fileMenu->addMenu(analyzeMenu); - fileMenu->addSeparator(); - fileMenu->addAction(mQuitA); - menuBar()->addMenu(fileMenu); - - //filesystem edit menu - mEditFSMenu = new QMenu(tr("&Edit"), this); - mEditFSMenu->addAction(mCdupA); - mEditFSMenu->addAction(mBackDirA); - mEditFSMenu->addAction(mGotoArchiveA); - mEditFSMenu->addSeparator(); - mEditFSMenu->addAction(mMarkFilesA); - mEditFSMenu->addAction(mUnmarkFilesA); - mEditFSMenu->addSeparator(); - mEditFSMenu->addAction(mCreateFolderA); - mEditFSMenu->addAction(mDeleteFilesA); - mEditFSMenu->addSeparator(); - mEditFSMenu->addAction(mCopyA); - mEditFSMenu->addAction(mCutA); - mEditFSMenu->addAction(mPasteA); - mEditFSMenu->addAction(mRenameA); - mEditFSMenu->addSeparator(); - mEditFSMenu->addAction(mCopyA); - mEditFSMenu->addAction(mCutA); - mEditFSMenu->addAction(mPasteA); - mEditFSMenu->addSeparator(); - mEditFSMenu->addAction(mMountDvdA); - mEditFSMenu->addAction(mUnpackA); - mEditFSMenu->addAction(mUntarA); - mEditFSMenu->addSeparator(); - mEditFSMenu->addAction(mMoveToArchiveA); - mEditFSMenu->addSeparator(); - mEditFSMenu->addAction(mConfigA); - mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); //Pictures edit menu mEditPicMenu = new QMenu(tr("&Edit"), this); @@ -779,18 +588,6 @@ void SheMov::createMenus(){ mArchiveEditMenu = new QMenu(tr("&Edit"), this); mArchiveMenuA = menuBar()->addMenu(mArchiveEditMenu); - //FileSystem view menu - mFSViewMenu = new QMenu(tr("&View"), this); - mFSViewMenu->addSeparator(); - QMenu *fsHeaderMenu = new QMenu(tr("Show headers"), this); - fsHeaderMenu->addActions(mFileSysHeaderGroup->actions()); - mFSViewMenu->addMenu(fsHeaderMenu); - mFSViewMenu->addSeparator(); - mFSViewMenu->addAction(mFSResizeA); - mFSViewMenu->addSeparator(); - mFSViewMenu->addAction(mRefreshA); - mViewFSMenuA = menuBar()->addMenu(mFSViewMenu); - //Pictures view menu mPicViewMenu = new QMenu(tr("&View"), this); mPicViewMenu->addAction(mPVToggleA); @@ -836,57 +633,6 @@ void SheMov::createMenus(){ helpMenu->addAction(mStatisticsA); menuBar()->addMenu(helpMenu); - // FilesystemWidget context menu - mOpenWithMenuFS = new QMenu(tr("Open with"), this); - mFSWidget->fileView()->addAction(mPlaySelectedFSA); - createOpenWithMenuFS(); - mOpenWithMenuFSA = new QAction(tr("Open with"), this); - mOpenWithMenuFSA->setMenu(mOpenWithMenuFS); - mFSWidget->fileView()->addAction(mOpenWithMenuFSA); - - mPlaySelectedTimesMenuFS = new QMenu(tr("Play repeat..."), this); - mPlaySelectedTimesMenuFS->addActions(mOpenTimesFSAG->actions()); - mPlaySelectedTimesMenuFSA = new QAction(tr("Play repeat..."), this); - mPlaySelectedTimesMenuFSA->setMenu(mPlaySelectedTimesMenuFS); - mFSWidget->fileView()->addAction(mPlaySelectedTimesMenuFSA); - - mFSWidget->fileView()->addAction(createSeparator()); - - mFSWidget->fileView()->addAction(mCdupA); - mFSWidget->fileView()->addAction(mBackDirA); - mFSWidget->fileView()->addAction(mGotoArchiveA); - mFSWidget->fileView()->addAction(createSeparator()); - - mFSWidget->fileView()->addAction(mMarkFilesA); //Menu text: Select files... - mFSWidget->fileView()->addAction(mUnmarkFilesA); //Menu text: Deselect all files - mFSWidget->fileView()->addAction(createSeparator()); - - mFSWidget->fileView()->addAction(mCreateFolderA); - mFSWidget->fileView()->addAction(mDeleteFilesA); - mFSWidget->fileView()->addAction(mRenameA); - mFSWidget->fileView()->addAction(createSeparator()); - - mFSWidget->fileView()->addAction(mCopyA); - mFSWidget->fileView()->addAction(mCutA); - mFSWidget->fileView()->addAction(mPasteA); - mFSWidget->fileView()->addAction(createSeparator()); - - mFSWidget->fileView()->addAction(mMoveToArchiveA); - mFSWidget->fileView()->addAction(createSeparator()); - - mFSWidget->fileView()->addAction(mRefreshA); - mFSWidget->fileView()->addAction(createSeparator()); - - mFSWidget->fileView()->addAction(mArchiveSelectedPicsA); - mFSWidget->fileView()->addAction(mArchivePicsInDirA); - mFSWidget->fileView()->addAction(mArchiveSelectedMovsA); - mFSWidget->fileView()->addAction(createSeparator()); - mFSWidget->fileView()->addAction(mUnpackA); - mFSWidget->fileView()->addAction(mUntarA); - mFSWidget->fileView()->addAction(createSeparator()); - mFSWidget->fileView()->addAction(mFSPreviewA); - mFSWidget->fileView()->addAction(mFSViewPropertiesA); - // Movie archive ArchiveController *c = SmGlobals::instance()->archiveController(); c->addActionForTree(mArchiveViewRenameA); @@ -944,44 +690,7 @@ void SheMov::createMenus(){ mRandomEditMenuA = menuBar()->insertMenu(mArchiveMenuA, mRandomEditMenu); } -void SheMov::createOpenWithMenuFS(){ - if(mOpenWithGroupFS){ - for(QAction *a : mOpenWithGroupFS->actions()){ - mOpenWithMenuFS->removeAction(a); - } - mOpenWithGroupFS->deleteLater(); - } - mOpenWithGroupFS = new QActionGroup(this); - QSettings s; - QStringList moviePlayers = s.value("programs_movieviewer/data").toHash().keys(); - moviePlayers.sort(); - for(QString p : moviePlayers){ - QAction *a = new QAction(p, mOpenWithGroupFS); - connect(a, &QAction::triggered, [=] { mFSWidget->playSelected(p); }); - mOpenWithMenuFS->addAction(a); - } -} - void SheMov::createToolBar(){ - mFSWidget->toolBar()->addAction(mBackDirA); - mFSWidget->toolBar()->addAction(mCdupA); - mFSWidget->toolBar()->addSeparator(); - mFSWidget->toolBar()->addAction(mUnpackA); - mFSWidget->toolBar()->addSeparator(); - mFSWidget->toolBar()->addAction(mCreateFolderA); - mFSWidget->toolBar()->addAction(mRenameA); - mFSWidget->toolBar()->addAction(mDeleteFilesA); - mFSWidget->toolBar()->addAction(mRefreshA); - mFSWidget->toolBar()->addSeparator(); - mFSWidget->toolBar()->addAction(mArchiveSelectedMovsA); - mFSWidget->toolBar()->addAction(mArchiveSelectedPicsA); - mFSWidget->toolBar()->addSeparator(); - mFSWidget->toolBar()->addAction(mFSPreviewA); - mFSWidget->toolBar()->addAction(mFSViewPropertiesA); - mFSWidget->toolBar()->addAction(mFSResizeA); - mFSWidget->toolBar()->addSeparator(); - mFSWidget->toolBar()->addAction(mConfigA); - mArchive->toolBar()->addAction(mArchiveFilesQualityA); mArchive->toolBar()->addAction(mArchiveFilesDvdNoA); mArchive->toolBar()->addAction(mArchiveFilesTypeA); @@ -1015,15 +724,6 @@ void SheMov::readSettings(){ } tabChanged(currentTab); QString dvdMount = s.value("paths/dvdmount").toString(); - if(dvdMount.isEmpty()){ - mMountDvdA->setEnabled(false); - }else{ - if(mFSWidget->isMounted()){ - mMountDvdA->setChecked(true); - }else{ - mMountDvdA->setChecked(false); - } - } createPalette(); } @@ -1083,36 +783,6 @@ void SheMov::toggleHover(QObject *object){ } } -void SheMov::checkMount(bool mounted){ - mMountDvdA->setChecked(mounted); -} - -void SheMov::newPicsDialog(){ - mNewPicsDialog->exec(); -} - -void SheMov::newPicsDialogWithFiles(){ - QModelIndexList selected = mFSWidget->fileView()->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QStringList files; - for(const QModelIndex &idx : selected){ - files << idx.data(SmDirModel::FullPathRole).toString(); - } - mNewPicsDialog->clearFiles(); - mNewPicsDialog->addFiles(files); - mNewPicsDialog->exec(); -} - -void SheMov::newPicsDialogWithDir(){ - QString dir = mFSWidget->currentDir(); - mNewPicsDialog->clearFiles(); - mNewPicsDialog->setDir(dir); - SmGlobals::instance()->pictureViewer()->show(); - mNewPicsDialog->exec(); -} - void SheMov::searchResult(int seriesPartId){ mSearchDialog->hide(); mTab->setCurrentIndex(Movies); @@ -1120,21 +790,3 @@ void SheMov::searchResult(int seriesPartId){ c->archiveTree()->setFocus(); c->setSeriesPart(seriesPartId); } - -void SheMov::gotoArchive(){ - const QModelIndexList idxs = mFSWidget->fileView()->selectionModel()->selectedRows(SmDirModel::Md5sum); - if(idxs.isEmpty()){ - return; - } - QModelIndex first = idxs.first(); - if(first.data(SmDirModel::PresentRole).toInt() == SmDirModel::InNone){ - return; - } - QString md5Sum = first.data(SmDirModel::Md5sumRole).toString(); - ArchiveController *c = SmGlobals::instance()->archiveController(); - int seriesPartId = c->archiveTreeModel()->seriesPartIdFromMd5(md5Sum); - if(seriesPartId != -1){ - c->setSeriesPart(seriesPartId); - mTab->setCurrentIndex(Movies); - } -} @@ -12,7 +12,6 @@ #include <QVariant> class QTabWidget; -class FilesystemWidget; class QLabel; class QActionGroup; class NewMovieWizard; @@ -44,18 +43,11 @@ class SheMov : public QMainWindow { void setFsFree(); void aboutShemov(); void showStatistics(); - void newMovieWizard(); - void newMovieWizardWithFiles(); void setSize(qint64 size); void setDuration(qint64 dur, bool maybeMore); void checkConsistency(); void toggleHover(QObject *object); - void checkMount(bool mounted); - void newPicsDialog(); - void newPicsDialogWithFiles(); - void newPicsDialogWithDir(); void searchResult(int seriesPartId); - void gotoArchive(); void analyzeActors(); void analyzeGenres(); void analyzeSeries(); @@ -83,47 +75,13 @@ class SheMov : public QMainWindow { QLabel *mFsFree; //Actions - QAction *mQuitA; - QAction *mMarkFilesA; - QAction *mUnmarkFilesA; - QAction *mCreateFolderA; - QAction *mDeleteFilesA; - QAction *mRefreshA; - QAction *mCopyA; - QAction *mCutA; - QAction *mPasteA; - QAction *mRenameA; - QAction *mCdupA; - QAction *mBackDirA; - QAction *mGotoArchiveA; - QAction *mMountDvdA; + QAction *mQuitA; QAction *mConfigA; QAction *mAboutShemovA; QAction *mAboutQtA; QAction *mStatisticsA; - QAction *mPlaySelectedFSA; - QAction *mPlaySelectedFSTimesA; - QAction *mPlaySelectedInfTimesA; - QAction *mOpenWithMenuFSA; - QAction *mPlaySelectedTimesMenuFSA; - QAction *mArchiveSelectedMovsA; - QAction *mArchiveSelectedPicsA; - QAction *mArchivePicsInDirA; QAction *mConsistencyA; - QAction *mNewPicsA; - QAction *mNewMovieWizardA; - QAction *mMoveToArchiveA; - QAction *mFSViewPropertiesA; - QAction *mFSPreviewA; - QAction *mFSResizeA; - QAction *mUnpackA; - QAction *mUntarA; QAction *mSearchDialogA; - - //Filesystem View Actions - QActionGroup *mOpenWithGroupFS; - QActionGroup *mOpenWithGroupAV; - QActionGroup *mFileSysHeaderGroup; QActionGroup *mPicsTreeHeaderGroup; //PictureWidget Actions @@ -188,22 +146,15 @@ class SheMov : public QMainWindow { QAction *mAnalyzeSeriesA; QAction *mAnalyzePartsA; - QActionGroup *mOpenTimesFSAG; - - QMenu *mEditFSMenu; - QMenu *mEditAVMenu; QMenu *mEditPicMenu; QMenu *mArchiveEditMenu; - QMenu *mOpenWithMenuFS; QMenu *mPlaySelectedTimesMenuFS; - QMenu *mFSViewMenu; QMenu *mPicViewMenu; QMenu *mArchiveViewMenu; QMenu *mArchiveBrowserViewMenu; QMenu *mRandomEditMenu; QAction *mEditFSMenuA; QAction *mEditPicMenuA; - QAction *mViewFSMenuA; QAction *mViewPicMenuA; QAction *mArchiveViewMenuA; @@ -211,9 +162,6 @@ class SheMov : public QMainWindow { //widgets + dialogs QTabWidget *mTab; - FilesystemWidget *mFSWidget; - NewMovieWizard *mNewMovieWizard; - NewPicsDialog *mNewPicsDialog; SearchDialog *mSearchDialog; PicturesWidget *mPicWidget; ArchiveView *mArchive; @@ -7,11 +7,7 @@ CONFIG -= release QT += core gui widgets sql concurrent DEFINES += QT_DEPRECATED_WARNINGS SOURCES = main.cpp \ - filesystemdirproxy.cpp \ - filesystemwidget.cpp \ - fileview.cpp \ shemov.cpp \ - filesystemfileproxy.cpp \ helper.cpp \ shemoviconprovider.cpp \ configurationdialog.cpp \ @@ -35,8 +31,6 @@ SOURCES = main.cpp \ pictureswidget.cpp \ pictureviewer2.cpp \ picfilesmodel.cpp \ - smdirwatcher.cpp \ - smdirmodel.cpp \ smtreeview.cpp \ archivemodel.cpp \ archiveview.cpp \ @@ -53,11 +47,7 @@ SOURCES = main.cpp \ viewer.cpp \ fsview.cpp HEADERS = \ - filesystemdirproxy.h \ - filesystemwidget.h \ - fileview.h \ shemov.h \ - filesystemfileproxy.h \ helper.h \ shemoviconprovider.h \ configurationdialog.h \ @@ -81,8 +71,6 @@ HEADERS = \ pictureswidget.h \ pictureviewer2.h \ picfilesmodel.h \ - smdirwatcher.h \ - smdirmodel.h \ smtreeview.h \ archivemodel.h \ archiveview.h \ diff --git a/smdirmodel.cpp b/smdirmodel.cpp deleted file mode 100644 index b6bc853..0000000 --- a/smdirmodel.cpp +++ /dev/null @@ -1,231 +0,0 @@ -/* - 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 <QDateTime> -#include <QTimer> -#include <QSettings> - -#include "smdirmodel.h" -#include "smdirwatcher.h" -#include "smtreeitem.h" -#include "smglobals.h" -#include "helper.h" - -SmDirModel::SmDirModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mHeaders(headers), mExpensiveOps(true){ - mWatch = new SmDirWatcher(NumFields, this); - connect(mWatch, SIGNAL(needRefresh()), this, SLOT(refresh())); - mRunTimer = new QTimer(this); - mRunTimer->setInterval(2000); - connect(mRunTimer, SIGNAL(timeout()), mWatch, SLOT(start())); - mRunTimer->start(); - mRefreshTimer = new QTimer(this); - readSettings(); - - connect(mWatch, SIGNAL(population(SmTreeItem*)), this, SLOT(populate(SmTreeItem*))); - connect(mWatch, SIGNAL(newData(QList<QVariant>,int)), this, SLOT(dirEvent(QList<QVariant>,int))); -} - -SmDirModel::~SmDirModel(){ - if(mWatch->isRunning()){ - mWatch->stop(); - } - mWatch->deleteLater(); -} - -QVariant SmDirModel::data(const QModelIndex &index, int role) const{ - if(!index.isValid()){ - return QVariant(); - } - SmTreeItem *i = itemAt(index); - switch (role){ - case NameRole: - return i->data(Name); - case SizeRole: - return i->data(Size); - case TypeRole: - return i->data(Type); - case CreatedRole: - return i->data(Created); - case Md5sumRole: - return i->data(Md5sum); - case DurSizeRole: - return i->data(DurSize); - case BitrateRole: - return i->data(Bitrate); - case FullPathRole: - return i->data(FullPath); - case PresentRole: - return i->data(Present); - case Qt::DecorationRole: { - if(index.column() == 0){ - QFileInfo fi(i->data(FullPath).toString()); - if(fi.isDir()){ - return mIcons.value("folder"); - } - if(fi.isFile()){ - return mIcons.value("file"); - } - } - return QVariant(); - } - case Qt::ForegroundRole: - if(index.column() == 0){ - if((i->data(Present).toInt() == InFiles) || (i->data(Present).toInt() == InPictures)){ - return QVariant(QColor(Qt::darkGreen)); - } - else if(i->data(Present).toInt() == InOrigin){ - return QVariant(QColor(Qt::darkRed)); - }else{ - return SmTreeModel::data(index, role); - } - } - return SmTreeModel::data(index, role); - default: - return SmTreeModel::data(index, role); - } -} - -bool SmDirModel::setData(const QModelIndex &index, const QVariant &value, int role){ - if(!index.isValid()){ - return false; - } - if(role == Qt::EditRole && index.column() == Name){ - //this is a rename - QString newName = value.toString(); - if(newName.contains(QDir::separator())){ - return false; - } - SmTreeItem *i = itemAt(index); - QString old = i->data(FullPath).toString(); - QString dir = fileInfo(index).absolutePath(); - QString newPath = QString("%1/%2").arg(dir).arg(newName); - QFile::rename(old, newPath); - return true; - } - return SmTreeModel::setData(index, value, role); -} - -bool SmDirModel::isDir(const QModelIndex &idx) const { - if(!idx.isValid()){ - return false; - } - SmTreeItem *i = itemAt(idx); - QFileInfo fi(i->data(FullPath).toString()); - return fi.isDir(); -} - -QDir SmDirModel::dir() const{ - return QDir(mCurrentDir); -} - -QFileInfo SmDirModel::fileInfo(const QModelIndex &idx) const { - if(!idx.isValid()){ - return QFileInfo(); - } - SmTreeItem *i = itemAt(idx); - return QFileInfo(i->data(FullPath).toString()); -} - -void SmDirModel::setDir(const QString &dir){ - mCurrentDir = dir; - mWatch->setDir(mCurrentDir); -} - -void SmDirModel::dirEvent(const QList<QVariant> &data, int e){ - if(e == SmDirWatcher::Added){ - /* for some reason SmTreeModel::addRow() doesn't work, - * couldn't figure it out in 5 hours, so customize it - * and reset the model... gatherAsync is done by - * modelReset(); - */ - addFile(data); - emit fsFreeChanged(); - return; - } - QModelIndex idx = find(data.at(Name), Name, rootIndex()); - if(!idx.isValid()){ - return; - } - if(e == SmDirWatcher::Deleted){ - removeRow(idx.row()); - } - if(e == SmDirWatcher::CloseWrite){ - for(int i = 0; i < mHeaders.count(); ++i){ - QModelIndex c = index(idx.row(), i, QModelIndex()); - setData(c, data.at(i), Qt::EditRole); - } - } - emit fsFreeChanged(); -} - -void SmDirModel::readSettings(){ - mIcons.insert("folder", SmGlobals::instance()->iconFor("folder")); - mIcons.insert("file", SmGlobals::instance()->iconFor("file")); - QSettings s; - bool autorefresh = s.value("ui/autorefresh", false).toBool(); - if(autorefresh){ - mRefreshTimer->stop(); - mRefreshTimer->disconnect(); - int interval = s.value("ui/autorefreshvalue").toInt(); - interval *= 1000; - mRefreshTimer->setInterval(interval); - mRefreshTimer->start(); - connect(mRefreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); - } - bool expensive = s.value("ui/expensiveops", true).toBool(); - mWatch->setExpensiveOps(expensive); -} - -void SmDirModel::refresh(){ - setDir(mCurrentDir); - emit fsFreeChanged(); -} - -void SmDirModel::populate(SmTreeItem *root){ - setRoot(root); - emit needResize(); -} - -void SmDirModel::addFile(const QList<QVariant> &data){ - SmTreeItem *newItem = new SmTreeItem(data, root()); - int w = root()->childCount(); - int i = 0; - while(i < root()->childCount()){ - if(newItem->data(Name).toString().toLower() < root()->child(i)->data(Name).toString().toLower()){ - w = i; - break; - } - ++i; - } - beginResetModel(); - root()->insertChild(w, newItem); - endResetModel(); - return; -} - -TimerHandler::TimerHandler(QTimer *timer) : mTimer(timer) { - mTimer->stop(); -} - -TimerHandler::~TimerHandler(){ - QSettings s; - bool autoRefresh = s.value("ui/autorefresh", false).toBool(); - if(autoRefresh){ - mTimer->start(); - } -} - -WatcherHandler::WatcherHandler(SmDirWatcher *watcher) : mWatcher(watcher){ - mWatcher->quit(); - mWatcher->wait(); - mWatcher->blockSignals(true); -} - -WatcherHandler::~WatcherHandler(){ - mWatcher->blockSignals(false); - mWatcher->start(); -} diff --git a/smdirmodel.h b/smdirmodel.h deleted file mode 100644 index 9128797..0000000 --- a/smdirmodel.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - 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. -*/ - -#ifndef SMDIRMODEL_H -#define SMDIRMODEL_H - -#include <QDir> - -#include <smtreemodel.h> -#include <smdirwatcher.h> - -class SmDirWatcher; -class QTimer; -class SmTreeItem; -class QMutex; -class SmDataColletor; - -class SmDirModel : public SmTreeModel { - Q_OBJECT - public: - enum CustomRoles { NameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, TypeRole = Qt::UserRole + 3, CreatedRole = Qt::UserRole + 4, Md5sumRole = Qt::UserRole + 5, DurSizeRole = Qt::UserRole + 6, BitrateRole = Qt::UserRole + 7, FullPathRole = Qt::UserRole + 8, PresentRole = Qt::UserRole + 9 }; - enum Fields { Name = 0, Size = 1, Type = 2, Created = 3, Md5sum = 4, DurSize = 5, Bitrate = 6, FullPath = 7, Present = 8 }; - enum { NumFields = 9 }; - enum FileDate { Access, Modified, Status }; - enum Present { InFiles, InOrigin, InPictures, InNone }; - explicit SmDirModel(const QStringList &headers, QObject *parent = 0); - virtual ~SmDirModel(); - virtual QVariant data(const QModelIndex &index, int role) const; - virtual bool setData(const QModelIndex &index, const QVariant &value, int role); - bool isDir(const QModelIndex &idx) const; - QDir dir() const; - QFileInfo fileInfo(const QModelIndex &idx) const; - QTimer *refreshTimer() { return mRefreshTimer; } - SmDirWatcher *watcher() { return mWatch; } - - public slots: - void setDir(const QString &dir); - void dirEvent(const QList<QVariant> &data, int e); - void readSettings(); - void refresh(); - - private slots: - void populate(SmTreeItem *root); - void addFile(const QList<QVariant> &data); - - signals: - void needResize(); - void totalFiles(int numFiles); - void progress(); - void fsFreeChanged(); - - private: - SmDirWatcher *mWatch; - QStringList mHeaders; - QString mCurrentDir; - QTimer *mRunTimer; - QTimer *mRefreshTimer; - QMap<QString, QIcon> mIcons; - bool mExpensiveOps; -}; - -class TimerHandler { - public: - TimerHandler(QTimer *timer); - ~TimerHandler(); - - private: - QTimer *mTimer; -}; - -class WatcherHandler { - public: - WatcherHandler(SmDirWatcher *watcher); - ~WatcherHandler(); - - private: - SmDirWatcher *mWatcher; -}; - -#endif // SMDIRMODEL_H diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp deleted file mode 100644 index 46ec905..0000000 --- a/smdirwatcher.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - 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 <QDateTime> -#include <QDir> -#include <QImage> -#include <QProgressDialog> -#include <QApplication> - -#include <sys/inotify.h> -#include <unistd.h> -#include <poll.h> - -#include "smdirmodel.h" -#include "smdirwatcher.h" -#include "smtreeitem.h" -#include "helper.h" -#include "smglobals.h" - -SmDirWatcher::SmDirWatcher(int numFields, QObject *parent) : QThread(parent), mFd(0), mDescr(0), mNumFields(numFields), mExpensiveOps(true) { - mBufLen = 1024 * (sizeof(struct inotify_event) + 16); - mINdata = new char[mBufLen]; - mFd = inotify_init(); - mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "dirwatcherdb"); - mDb.open(); -} - -void SmDirWatcher::setDir(const QString &dir){ - if(mDescr){ - inotify_rm_watch(mFd, mDescr); //generates IN_IGNORE ??? - } - mCurrent = dir; - QDir d(mCurrent); - qApp->setOverrideCursor(Qt::WaitCursor); - SmTreeItem *rootItem = new SmTreeItem(mNumFields); - for(uint i = 0; i < d.count(); ++i){ - QFileInfo fi = d.entryInfoList().at(i); - if(fi.fileName() == "." || fi.fileName() == ".."){ - continue; - } - QList<QVariant> data = generalData(fi.absoluteFilePath()); - SmTreeItem *newItem = new SmTreeItem(data, rootItem); - rootItem->appendChild(newItem); - } - emit population(rootItem); - /* mask rationale: - * IN_DELETE_SELF cannot happen since we're only - * watching one directory at all time. - * We don't care about the other events - */ - mDescr = inotify_add_watch(mFd, qPrintable(dir), IN_CLOSE_WRITE | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO); - qApp->restoreOverrideCursor(); -} - -void SmDirWatcher::setExpensiveOps(bool expensiveOps){ - mExpensiveOps = expensiveOps; -} - -QList<QVariant> SmDirWatcher::generalData(const QString &path){ - QFileInfo fi(path); - QList<QVariant> data; - data << fi.fileName() << fi.size(); - QString mime = Helper::mimeType(fi.absoluteFilePath()); - data << mime; - data << fi.lastModified(); - QString md5; - if(mExpensiveOps){ - md5 = Helper::md5Sum(path); - data << md5; - if(mime.startsWith("video")){ - QVariantMap m = Helper::ffmpegData(fi.absoluteFilePath()); - data << m.value("duration") << m.value("bit_rate"); - }else if(mime.startsWith("image")){ - if(fi.size() > 1024*400){ //skip images bigger than 300 kb - data << "skipped" << QVariant(); - }else{ - QVariant picSize = Helper::picSize(fi.absoluteFilePath()); - data << picSize << QVariant(); - } - }else{ - data << QVariant() << QVariant(); - } - data << fi.absoluteFilePath(); - int present = presenceData(md5); - data << present; - }else{ - data << QVariant() << QVariant() << QVariant() << fi.absoluteFilePath() << SmDirModel::InNone; - } - return data; -} - -int SmDirWatcher::presenceData(QString &md5){ - int retval = SmDirModel::InNone; - QSqlQuery present1Q(mDb); - present1Q.prepare("SELECT COUNT(*) FROM files WHERE cmd5sum = :md5"); - present1Q.bindValue(":md5", md5); - if(!present1Q.exec()){ - mDb.close(); - mDb.open(); - return SmDirModel::InNone; - } - while(present1Q.next()){ - int c = present1Q.value(0).toInt(); - if(c > 0){ - retval = SmDirModel::InFiles; - } - } - QSqlQuery present2Q(mDb); - present2Q.prepare("SELECT COUNT(*) from files_origin WHERE cmd5sum = :md5"); - present2Q.bindValue(":md5", md5); - present2Q.exec(); - while(present2Q.next()){ - int c = present2Q.value(0).toInt(); - if(c > 0){ - retval = SmDirModel::InOrigin; - } - } - QSqlQuery present3Q(mDb); - present3Q.prepare("SELECT COUNT(*) FROM pics WHERE cmd5sum = :md5"); - present3Q.bindValue(":md5", md5); - present3Q.exec(); - while(present3Q.next()){ - int c = present3Q.value(0).toInt(); - if(c > 0){ - retval = SmDirModel::InPictures; - } - } - return retval; -} - -void SmDirWatcher::run(){ - struct pollfd pfd[1]; - pfd[0].fd = mFd; - pfd[0].events = POLLIN; - pfd[0].revents = 0; - int pr = poll(pfd, 1, 0); - if(pr <= 0){ - return; - } - int r = read(mFd, mINdata, mBufLen); - if(r <= 0){ - return; - } - int i = 0; - while(i < r){ - inotify_event *e = reinterpret_cast<inotify_event*>(&mINdata[i]); - if((!e->len) || (e->mask & IN_IGNORED)){ - i += sizeof(inotify_event) + e->len; - continue; - } - quint32 mask = e->mask; - QString name = QString("%1/%2").arg(mCurrent).arg(e->name); - QList<QVariant> d = generalData(name); - if(mask & IN_CREATE || mask & IN_MOVED_TO){ - emit newData(d, Added); - }else if(mask & IN_DELETE || mask & IN_MOVED_FROM){ - emit newData(d, Deleted); - }else if(mask & IN_CLOSE_WRITE){ - emit newData(d, CloseWrite); - } - i += sizeof(inotify_event) + e->len; - } -} - -void SmDirWatcher::stop(){ - quit(); - wait(); -} diff --git a/smdirwatcher.h b/smdirwatcher.h deleted file mode 100644 index bf89050..0000000 --- a/smdirwatcher.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - 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. -*/ - -#ifndef SMDIRWATCHER_H -#define SMDIRWATCHER_H - -#include <QThread> -#include <QVariant> -#include <QSqlDatabase> -#include <QSqlQuery> - -class SmTreeItem; - -class SmDirWatcher : public QThread { - Q_OBJECT - public: - enum DWEvent { None, Added, Deleted, Modified, Populate, CloseWrite }; - explicit SmDirWatcher(int numFields, QObject *parent = 0); - - signals: - void dwEvent(const QString& file, int event); - void setMd5Sum(QString path, QString md5); - void setFfmpeg(QString path, QVariantMap data); - void setPicSize(QString path, QVariant size); - void needRefresh(); - void population(SmTreeItem*); - void newData(const QList<QVariant>,int); - - public slots: - void run(); - void stop(); - void setDir(const QString &dir); - void setExpensiveOps(bool expensiveOps); - - private: - QList<QVariant> generalData(const QString &path); - int presenceData(QString &md5); - int mFd; - int mDescr; - QString mCurrent; - char *mINdata; - int mBufLen; - int mNumFields; - bool mExpensiveOps; - QSqlDatabase mDb; -}; - -#endif // SMDIRWATCHER_H |