summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filesystemdirproxy.cpp27
-rw-r--r--filesystemdirproxy.h23
-rw-r--r--filesystemfileproxy.cpp89
-rw-r--r--filesystemfileproxy.h25
-rw-r--r--filesystemwidget.cpp807
-rw-r--r--filesystemwidget.h137
-rw-r--r--fileview.cpp278
-rw-r--r--fileview.h80
-rw-r--r--shemov.cpp358
-rw-r--r--shemov.h54
-rw-r--r--shemov.pro12
-rw-r--r--smdirmodel.cpp231
-rw-r--r--smdirmodel.h84
-rw-r--r--smdirwatcher.cpp172
-rw-r--r--smdirwatcher.h52
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
-
diff --git a/shemov.cpp b/shemov.cpp
index 50a0c17..4af3a72 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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);
- }
-}
diff --git a/shemov.h b/shemov.h
index 16413b2..3da68e1 100644
--- a/shemov.h
+++ b/shemov.h
@@ -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;
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 <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