diff options
author | Arno <am@disconnect.de> | 2013-04-11 07:19:51 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-04-11 07:19:51 +0200 |
commit | a39b9bb410593edf105be3ce808b6bfd94f95cde (patch) | |
tree | 4566c8f01b3071d9758a376307ee290b681f8965 | |
parent | d71c97f56f4eb35a8918b9741fe6bfd6417a3b5c (diff) | |
download | SheMov-a39b9bb410593edf105be3ce808b6bfd94f95cde.tar.gz SheMov-a39b9bb410593edf105be3ce808b6bfd94f95cde.tar.bz2 SheMov-a39b9bb410593edf105be3ce808b6bfd94f95cde.zip |
Fix frame cacheDir
Get rid of the cache file. Instead, generate the cache on startup. The
cache was never written since it was turned into a thread. Because of
that I wrote a cleanup function, but surprisingly it didn't have much
impact on the startup time, so I dropped the cache file.
Also, fix destructor of SmGlobals. Call deleteLater on all Q_OBJECTS,
and of course, some header cleanup.
-rw-r--r-- | framecache.cpp | 56 | ||||
-rw-r--r-- | framecache.h | 8 | ||||
-rw-r--r-- | shemov.cpp | 42 | ||||
-rw-r--r-- | shemov.h | 8 | ||||
-rw-r--r-- | smglobals.cpp | 4 |
5 files changed, 46 insertions, 72 deletions
diff --git a/framecache.cpp b/framecache.cpp index ef5329a..e6fceaa 100644 --- a/framecache.cpp +++ b/framecache.cpp @@ -26,9 +26,7 @@ FrameCache::FrameCache(QObject *parent) : QObject(parent){ mGenerator = new FrameCacheGenerator(this); mGenerator->init(mSemFree, mSemUsed, mCacheMx, mDataQueue, mFrameCache); mGenerator->readConfig(); - mGenerator->readCache(); - mCacheFile = mGenerator->cacheFile(); - mMagic = mGenerator->magic(); + rebuild(); mGenerator->start(); QSettings s; mWhen = s.value("ui/grabframe", "00:00:00").toString(); @@ -36,14 +34,6 @@ FrameCache::FrameCache(QObject *parent) : QObject(parent){ FrameCache::~FrameCache(){ mGenerator->exit(); - QFile outfile(mCacheFile); - outfile.open(QIODevice::WriteOnly | QIODevice::Truncate); - QDataStream ds(&outfile); - ds << (qint32)mMagic; - for(QHash<QPair<QString, QString>, QString>::const_iterator it = mFrameCache->constBegin(); it != mFrameCache->constEnd(); ++it){ - ds << it.key().first << it.key().second << it.value(); - } - outfile.close(); } const QPixmap FrameCache::entry(const QString &sourcePath, const QString &when){ @@ -80,7 +70,27 @@ const QString FrameCache::entryPath(const QString &sourcePath, const QString &wh return mFrameCache->value(data); } -FrameCacheGenerator::FrameCacheGenerator(QObject *parent) : QThread(parent), mMagic(0xDEADBEEF), mCacheSubDir(".frameCache"), mCacheFileName("cache") {} +void FrameCache::rebuild(){ + QMutexLocker l(mCacheMx); + QDir cdir(mGenerator->cacheDir()); + QFileInfoList files = cdir.entryInfoList(QDir::Files); + mFrameCache->clear(); + foreach(QFileInfo fi, files){ + QString base = fi.fileName(); + base.chop(fi.suffix().size() + 1); // basename doesn't work, b/c we have filenames w spaces + base.chop(7); //remove temp. extension + QString when = base.right(8); + base.chop(9); //remove when + _, leaving the orig. filename + QPair<QString, QString> key = qMakePair<QString, QString>(base, when); + if(mFrameCache->contains(key)){ + QFile::remove(fi.absoluteFilePath()); + }else{ + mFrameCache->insert(key, fi.absoluteFilePath()); + } + } +} + +FrameCacheGenerator::FrameCacheGenerator(QObject *parent) : QThread(parent), mCacheSubDir(".frameCache"), mCacheFileName("cache") {} void FrameCacheGenerator::init(QSemaphore *set, QSemaphore *get, QMutex *cachemx, QQueue<QPair<QString, QString> > *data, QHash<QPair<QString, QString>, QString> *cache){ mSemFree = set; @@ -106,28 +116,6 @@ void FrameCacheGenerator::readConfig(){ mFfMpegPath = s.value("paths/ffmpeg").toString(); } -void FrameCacheGenerator::readCache(){ - QFile cache(mCacheFile); - cache.open(QIODevice::ReadOnly); - QDataStream ds(&cache); - qint32 magic; - ds >> magic; - if(magic != mMagic){ - return; - } - while(!ds.atEnd()){ - QString source, pos, cacheFile; - ds >> source >> pos >> cacheFile; - QFileInfo fi(cacheFile); - if(fi.size() == 0){ - QFile::remove(fi.absoluteFilePath()); - continue; - } - QPair<QString, QString> pair(source, pos); - mFrameCache->insert(pair, cacheFile); - } -} - void FrameCacheGenerator::run(){ forever{ mSemUsed->acquire(); diff --git a/framecache.h b/framecache.h index 509fea6..867eda7 100644 --- a/framecache.h +++ b/framecache.h @@ -27,6 +27,9 @@ class FrameCache : public QObject { const QPixmap entry(const QString &sourcePath, const QString &when = QString()); const QString entryPath(const QString &sourcePath, const QString &when); + public slots: + void rebuild(); + private: QHash<QPair<QString, QString>, QString> *mFrameCache; QQueue<QPair<QString, QString> > *mDataQueue; @@ -45,9 +48,8 @@ class FrameCacheGenerator : public QThread { explicit FrameCacheGenerator(QObject *parent = 0); void init(QSemaphore *set, QSemaphore *get, QMutex *cachemx, QQueue<QPair<QString, QString> > *data, QHash<QPair<QString, QString>, QString> *cache); const QString cacheFile() const { return mCacheFile; } - qint32 magic() const { return mMagic; }; + const QString cacheDir() const { return mCacheDir; } void readConfig(); - void readCache(); public slots: void run(); @@ -61,9 +63,7 @@ class FrameCacheGenerator : public QThread { QHash<QPair<QString, QString>, QString> *mFrameCache; QString mCacheDir; QString mCacheFile; - //QString mWhen; QString mFfMpegPath; - const qint32 mMagic; const QString mCacheSubDir; const QString mCacheFileName; @@ -6,42 +6,24 @@ */ #include <QtWidgets/QApplication> -#include <QtWidgets/QTabWidget> #include <QtWidgets/QVBoxLayout> -#include <QtWidgets/QAction> #include <QtWidgets/QMenuBar> -#include <QtWidgets/QMenu> #include <QtWidgets/QStatusBar> #include <QtWidgets/QLabel> -#include <QItemSelection> #include <QSignalMapper> #include <QSettings> #include <QtWidgets/QMessageBox> -#include <QSqlDatabase> -#include <QImage> -#include <QPainter> -#include <QFont> -#include <QFontMetrics> -#include <QLocale> #include <QCloseEvent> -#include <QtWidgets/QActionGroup> -#include <QtWidgets/QFileSystemModel> #include <QtWidgets/QToolBar> -#include <QIcon> -#include <QtWidgets/QHeaderView> -#include <QDir> -#include <QFileInfo> #include <QtWidgets/QSplashScreen> #include <sys/vfs.h> #include "shemov.h" #include "filesystemwidget.h" -#include "filestreewidget.h" #include "fileview.h" #include "configurationdialog.h" #include "statisticsdialog.h" -#include "filesystemfileproxy.h" #include "archivetreeview.h" #include "smglobals.h" #include "seriestreewidget.h" @@ -53,13 +35,10 @@ #include "mappingtableeditor.h" #include "mappingtablemodel.h" #include "dbanalyzer.h" -#include "mappingtreewidget.h" #include "newpicsdialog.h" #include "pictureswidget.h" -#include "pictureviewer2.h" -#include "helper.h" #include "smdirmodel.h" -#include "smtreeview.h" +#include "framecache.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { //application icon @@ -164,9 +143,9 @@ void SheMov::closeEvent(QCloseEvent *event){ mATree->filesWidget()->filesTree()->writeSettings(); mPicWidget->picViewer2()->writeSettings(); mPicWidget->writeSettings(); - FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - filesModel->writeCache(); writeSettings(); + SmGlobals *globals = SmGlobals::instance(); + delete globals; event->accept(); } @@ -407,13 +386,17 @@ void SheMov::createActions(){ //connnect mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); + mRebuildFrameCacheA = new QAction(tr("Rebuild frame cache") ,this); + + // general actions + connect(mQuitA, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); + connect(mRebuildFrameCacheA, SIGNAL(triggered()), this, SLOT(rebuildFrameCache())); //Edit menu (FS) mCdupA = new QAction(QIcon(":/up_dick.png"), tr("Go up"), this); connect(mCdupA, SIGNAL(triggered()), mFSWidget, SLOT(parentDir())); mBackDirA = new QAction(QIcon(":/back_dick.png"), tr("Go back"), this); connect(mBackDirA, SIGNAL(triggered()), mFSWidget, SLOT(goBack())); - connect(mQuitA, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); mMarkFilesA = new QAction(tr("Select files..."), this); mMarkFilesA->setShortcut(tr("CTRL++")); connect(mMarkFilesA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(markFiles())); @@ -766,7 +749,7 @@ void SheMov::createMenus(){ fileMenu->addSeparator(); fileMenu->addAction(mConsistencyA); fileMenu->addAction(mAnalyzerA); - //fileMenu->addAction(mMappingEditorA); + fileMenu->addAction(mRebuildFrameCacheA); fileMenu->addSeparator(); fileMenu->addAction(mQuitA); menuBar()->addMenu(fileMenu); @@ -1119,6 +1102,13 @@ void SheMov::createPalette(){ } } +void SheMov::rebuildFrameCache(){ + int retval = QMessageBox::question(this, tr("Question"), tr("Rebuild frame cache from directory?"), QMessageBox::Yes | QMessageBox::No); + if(retval == QMessageBox::Yes){ + SmGlobals::instance()->frameCache()->rebuild(); + } +} + void SheMov::checkConsistency(){ ConsistencyCheck c; c.exec(); @@ -9,22 +9,16 @@ #define SHEMOV_H #include <QtWidgets/QMainWindow> -#include <QList> -#include <QThread> #include <QVariant> class QTabWidget; class FilesystemWidget; -class QAction; class QLabel; -class QItemSelection; class QSignalMapper; -class QMenu; class QActionGroup; class ArchiveTreeView; class NewMovieWizard; class DbAnalyzerDialog; -class MappingTreeWidget; class PicturesWidget; class SmTreeModel; class NewPicsDialog; @@ -60,6 +54,7 @@ class SheMov : public QMainWindow { void editMappings(QString table); void newPicsDialog(); void newPicsDialogWithFiles(); + void rebuildFrameCache(); signals: void configChanged(); @@ -113,6 +108,7 @@ class SheMov : public QMainWindow { QAction *mAnalyzerA; QAction *mNewPicsA; QAction *mHoverDirectoriesA; + QAction *mRebuildFrameCacheA; //TreeView Actions //Series Actions diff --git a/smglobals.cpp b/smglobals.cpp index 9f52854..6652d0e 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -35,9 +35,9 @@ SmGlobals *SmGlobals::mInstance = 0; SmGlobals::~SmGlobals(){ foreach(QAbstractItemModel *model, mModels.values()){ - delete model; + model->deleteLater(); } - delete mFrameCache; + mFrameCache->deleteLater(); } SmGlobals *SmGlobals::instance(){ |