From bac6fe431150bb5706fe0fb349e753b8fe08c12e Mon Sep 17 00:00:00 2001 From: Arno Date: Tue, 3 Apr 2018 07:52:56 +0200 Subject: Good riddance Filesystem Widget! Get rid of FilesystemWidget and helper classes. The SmDirWatcher was useful, once, I guess, nice to implement it by foot, but with the current workflow it isn't needed any more. --- filesystemdirproxy.cpp | 27 -- filesystemdirproxy.h | 23 -- filesystemfileproxy.cpp | 89 ------ filesystemfileproxy.h | 25 -- filesystemwidget.cpp | 807 ------------------------------------------------ filesystemwidget.h | 137 -------- fileview.cpp | 278 ----------------- fileview.h | 80 ----- shemov.cpp | 358 +-------------------- shemov.h | 54 +--- shemov.pro | 12 - smdirmodel.cpp | 231 -------------- smdirmodel.h | 84 ----- smdirwatcher.cpp | 172 ----------- smdirwatcher.h | 52 ---- 15 files changed, 6 insertions(+), 2423 deletions(-) delete mode 100644 filesystemdirproxy.cpp delete mode 100644 filesystemdirproxy.h delete mode 100644 filesystemfileproxy.cpp delete mode 100644 filesystemfileproxy.h delete mode 100644 filesystemwidget.cpp delete mode 100644 filesystemwidget.h delete mode 100644 fileview.cpp delete mode 100644 fileview.h delete mode 100644 smdirmodel.cpp delete mode 100644 smdirmodel.h delete mode 100644 smdirwatcher.cpp delete mode 100644 smdirwatcher.h 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 -#include - -#include "filesystemdirproxy.h" - -FilesystemDirProxy::FilesystemDirProxy(QObject *parent) : QSortFilterProxyModel(parent) {} - -bool FilesystemDirProxy::filterAcceptsRow(int sourcerow, const QModelIndex &sourceparent) const { - QFileSystemModel *m = static_cast(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 - -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 - -#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(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(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(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 - -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 -#include -#include -#include -#include -#include -#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 "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 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 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 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 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 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(""); - msg.append(tr("

Result:

")); - msg.append("
    "); - QMap::const_iterator it = res.constBegin(); - while(it != res.constEnd()){ - QString m = QString(tr("
  • %1: %2
  • ")).arg(it.key()).arg(it.value()); - msg.append(m); - ++it; } - msg.append("
"); - msg.append(""); - 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 FilesystemWidget::programData(const QString &prefix, const QString &preferred){ - QSettings s; - QString section = QString("programs_%1").arg(prefix); - QHash data = s.value(QString("%1/data").arg(section)).toHash(); - if(data.isEmpty()){ - return QPair(); - } - QHash 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 defaultProg = s.value(QString("%1/default").arg(section)).toString(); - if(defaultProg.isEmpty()){ - return QPair(); - } - 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 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 -#include -#include -#include -#include -#include - -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 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 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 mSeen; - QSqlDatabase mDb; - QSqlQuery *mDeleteFromSeenQuery; - QSqlQuery *mMarkAsSeenQuery; - QList 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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(model); - mModel = qobject_cast(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(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 mSelectedFiles; - FilesystemFileProxy *mProxy; - SmDirModel *mModel; -}; - -#endif - diff --git a/shemov.cpp b/shemov.cpp index 50a0c17..4af3a72 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -19,9 +19,6 @@ #include #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::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(mFSWidget->fileModel()), mFSWidget->fileView(), mFileSysHeaderGroup); - mFSWidget->fileView()->setHeaderGroup(mFileSysHeaderGroup); mPicsTreeHeaderGroup = new QActionGroup(this); SmTreeModel *picFilesModel = static_cast(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); - } -} diff --git a/shemov.h b/shemov.h index 16413b2..3da68e1 100644 --- a/shemov.h +++ b/shemov.h @@ -12,7 +12,6 @@ #include 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; diff --git a/shemov.pro b/shemov.pro index 8414179..bce7b12 100644 --- a/shemov.pro +++ b/shemov.pro @@ -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 -#include -#include - -#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,int)), this, SLOT(dirEvent(QList,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 &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 &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 - -#include -#include - -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 &data, int e); - void readSettings(); - void refresh(); - - private slots: - void populate(SmTreeItem *root); - void addFile(const QList &data); - - signals: - void needResize(); - void totalFiles(int numFiles); - void progress(); - void fsFreeChanged(); - - private: - SmDirWatcher *mWatch; - QStringList mHeaders; - QString mCurrentDir; - QTimer *mRunTimer; - QTimer *mRefreshTimer; - QMap 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 -#include -#include -#include -#include - -#include -#include -#include - -#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 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 SmDirWatcher::generalData(const QString &path){ - QFileInfo fi(path); - QList 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(&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 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 -#include -#include -#include - -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,int); - - public slots: - void run(); - void stop(); - void setDir(const QString &dir); - void setExpensiveOps(bool expensiveOps); - - private: - QList 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 -- cgit v1.2.3-70-g09d2