Handle the case when we have different paths for videos and images
authorMohammed Sameer <msameer@foolab.org>
Mon, 26 Aug 2013 22:29:21 +0000 (01:29 +0300)
committerMohammed Sameer <msameer@foolab.org>
Mon, 26 Aug 2013 22:29:21 +0000 (01:29 +0300)
src/fileindex.cpp [new file with mode: 0644]
src/fileindex.h [new file with mode: 0644]
src/filenaming.cpp
src/filenaming.h
src/settings.cpp
src/settings.h
src/src.pro

diff --git a/src/fileindex.cpp b/src/fileindex.cpp
new file mode 100644 (file)
index 0000000..aa13af9
--- /dev/null
@@ -0,0 +1,105 @@
+/*!
+ * This file is part of CameraPlus.
+ *
+ * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "fileindex.h"
+#include "settings.h"
+
+FileIndex::FileIndex(Settings *settings) :
+  m_settings(settings) {
+
+}
+
+FileIndex::~FileIndex() {
+
+}
+
+SingleFileIndex::SingleFileIndex(Settings *settings) :
+  FileIndex(settings) {
+
+}
+
+QString SingleFileIndex::stamp(const Type& type) {
+  Q_UNUSED(type);
+
+  return m_settings->fileNamingStamp("stamp");
+}
+
+void SingleFileIndex::setStamp(const Type& type, const QString& stamp) {
+  Q_UNUSED(type);
+
+  m_settings->setFileNamingStamp("stamp", stamp);
+}
+
+int SingleFileIndex::counter(const Type& type) {
+  Q_UNUSED(type);
+
+  return m_settings->fileNamingCounter("counter");
+}
+
+void SingleFileIndex::setCounter(const Type& type, int counter) {
+  Q_UNUSED(type);
+
+  m_settings->setFileNamingCounter("counter", counter);
+}
+
+MultiFileIndex::MultiFileIndex(Settings *settings) :
+  FileIndex(settings) {
+
+}
+
+QString MultiFileIndex::stamp(const Type& type) {
+  switch (type) {
+  case Image:
+    return m_settings->fileNamingStamp("imageStamp");
+  case Video:
+    return m_settings->fileNamingStamp("videoStamp");
+  }
+}
+
+void MultiFileIndex::setStamp(const Type& type, const QString& stamp) {
+  switch (type) {
+  case Image:
+    m_settings->setFileNamingStamp("imageStamp", stamp);
+    break;
+  case Video:
+    m_settings->setFileNamingStamp("videoStamp", stamp);
+    break;
+  }
+}
+
+int MultiFileIndex::counter(const Type& type) {
+  switch (type) {
+  case Image:
+    return m_settings->fileNamingCounter("imageCounter");
+  case Video:
+    return m_settings->fileNamingCounter("videoCounter");
+  }
+}
+
+void MultiFileIndex::setCounter(const Type& type, int counter) {
+  switch (type) {
+  case Image:
+    m_settings->setFileNamingCounter("imageCounter", counter);
+    break;
+  case Video:
+    m_settings->setFileNamingCounter("videoCounter", counter);
+    break;
+  }
+}
diff --git a/src/fileindex.h b/src/fileindex.h
new file mode 100644 (file)
index 0000000..d0036fa
--- /dev/null
@@ -0,0 +1,72 @@
+// -*- c++ -*-
+
+/*!
+ * This file is part of CameraPlus.
+ *
+ * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef FILE_INDEX_H
+#define FILE_INDEX_H
+
+#include <QString>
+
+class Settings;
+
+class FileIndex {
+public:
+  FileIndex(Settings *settings);
+  virtual ~FileIndex();
+
+  typedef enum {
+    Image,
+    Video,
+  } Type;
+
+  virtual QString stamp(const Type& type) = 0;
+  virtual void setStamp(const Type& type, const QString& stamp) = 0;
+
+  virtual int counter(const Type& type) = 0;
+  virtual void setCounter(const Type& type, int counter) = 0;
+
+protected:
+  Settings *m_settings;
+};
+
+class SingleFileIndex : public FileIndex {
+public:
+  SingleFileIndex(Settings *settings);
+
+  QString stamp(const Type& type);
+  void setStamp(const Type& type, const QString& stamp);
+
+  int counter(const Type& type);
+  void setCounter(const Type& type, int counter);
+};
+
+class MultiFileIndex : public FileIndex {
+public:
+  MultiFileIndex(Settings *settings);
+
+  QString stamp(const Type& type);
+  void setStamp(const Type& type, const QString& stamp);
+
+  int counter(const Type& type);
+  void setCounter(const Type& type, int counter);
+};
+
+#endif /* FILE_INDEX_H */
index 10f1c3a..25a1c85 100644 (file)
 #elif defined(QT5)
 #include <QQmlInfo>
 #endif
-#include "settings.h"
 
 FileNaming::FileNaming(QObject *parent) :
   QObject(parent),
-  m_settings(0) {
+  m_settings(0),
+  m_index(0) {
 
 }
 
 FileNaming::~FileNaming() {
-
+  delete m_index; m_index = 0;
 }
 
 QString FileNaming::imageSuffix() const {
@@ -63,14 +63,16 @@ void FileNaming::setVideoSuffix(const QString& suffix) {
 }
 
 QString FileNaming::imageFileName() {
-  return fileName(m_imagePath, m_imageSuffix);
+  return fileName(m_imagePath, m_imageSuffix, Image);
 }
 
 QString FileNaming::videoFileName() {
-  return fileName(m_videoPath, m_videoSuffix);
+  return fileName(m_videoPath, m_videoSuffix, Video);
 }
 
-QString FileNaming::fileName(const QString& path, const QString& suffix) {
+QString FileNaming::fileName(const QString& path, const QString& suffix, const Type& type) {
+  FileIndex::Type indexType = (FileIndex::Type) type;
+
   if (!m_settings) {
     qmlInfo(this) << "settings has not been set";
     return QString();
@@ -92,11 +94,11 @@ QString FileNaming::fileName(const QString& path, const QString& suffix) {
   // index is the last used index
   int index = 0;
 
-  if (m_settings->fileNamingStamp() != date) {
-    m_settings->setFileNamingStamp(date);
+  if (m_index->stamp(indexType) != date) {
+    m_index->setStamp(indexType, date);
   }
   else {
-    index = m_settings->fileNamingCounter();
+    index = m_index->counter(indexType);
   }
 
   if (index == 0) {
@@ -115,8 +117,7 @@ QString FileNaming::fileName(const QString& path, const QString& suffix) {
       .arg(path).arg(date).arg(QString().sprintf("%03i", index)).arg(suffix);
 
     if (!QFile(name).exists()) {
-      m_settings->setFileNamingCounter(index);
-
+      m_index->setCounter(indexType, index);
       return name;
     }
 
@@ -204,3 +205,16 @@ void FileNaming::setSettings(Settings *settings) {
     emit settingsChanged();
   }
 }
+
+void FileNaming::classBegin() {
+  // Nothing
+}
+
+void FileNaming::componentComplete() {
+  if (QDir(m_imagePath).canonicalPath() == QDir(m_videoPath).canonicalPath()) {
+    m_index = new SingleFileIndex(m_settings);
+  }
+  else {
+    m_index = new MultiFileIndex(m_settings);
+  }
+}
index 58ab354..80a272d 100644 (file)
 #define FILE_NAMING_H
 
 #include <QObject>
+#if defined(QT4)
+#include <QDeclarativeParserStatus>
+#elif defined(QT5)
+#include <QQmlParserStatus>
+#endif
+#include "fileindex.h"
 
 class Settings;
 
-class FileNaming : public QObject {
+#if defined(QT4)
+class FileNaming : public QObject, public QDeclarativeParserStatus {
+#elif defined(QT5)
+class FileNaming : public QObject, public QQmlParserStatus {
+#endif
+
   Q_OBJECT
 
   Q_PROPERTY(QString imageSuffix READ imageSuffix WRITE setImageSuffix NOTIFY imageSuffixChanged);
@@ -63,6 +74,9 @@ public:
   Settings *settings() const;
   void setSettings(Settings *settings);
 
+  virtual void classBegin();
+  virtual void componentComplete();
+
 signals:
   void imageSuffixChanged();
   void videoSuffixChanged();
@@ -72,7 +86,12 @@ signals:
   void settingsChanged();
 
 private:
-  QString fileName(const QString& path, const QString& suffix);
+  typedef enum {
+    Image = FileIndex::Image,
+    Video = FileIndex::Video,
+  } Type;
+
+  QString fileName(const QString& path, const QString& suffix, const Type& type);
   QString canonicalPath(const QString& path);
   QString temporaryPath();
 
@@ -83,6 +102,7 @@ private:
   QString m_temporaryVideoPath;
 
   Settings *m_settings;
+  FileIndex *m_index;
 };
 
 #endif /* FILE_NAMING_H */
index dff01d0..b287731 100644 (file)
@@ -422,18 +422,22 @@ void Settings::setVideoTorchOn(bool on) {
   }
 }
 
-QString Settings::fileNamingStamp() const {
-  return m_settings->value("fileNaming/stamp").toString();
+QString Settings::fileNamingStamp(const QString& id) const {
+  QString key = QString("fileNaming/%1").arg(id);
+  return m_settings->value(key).toString();
 }
 
-void Settings::setFileNamingStamp(const QString& stamp) {
-  m_settings->setValue("fileNaming/stamp", stamp);
+void Settings::setFileNamingStamp(const QString& id, const QString& stamp) {
+  QString key = QString("fileNaming/%1").arg(id);
+  m_settings->setValue(key, stamp);
 }
 
-int Settings::fileNamingCounter() const {
-  return m_settings->value("fileNaming/counter").toInt();
+int Settings::fileNamingCounter(const QString& id) const {
+  QString key = QString("fileNaming/%1").arg(id);
+  return m_settings->value(key).toInt();
 }
 
-void Settings::setFileNamingCounter(int counter) {
-  m_settings->setValue("fileNaming/counter", counter);
+void Settings::setFileNamingCounter(const QString& id, int counter) {
+  QString key = QString("fileNaming/%1").arg(id);
+  m_settings->setValue(key, counter);
 }
index b6ccaac..b08a057 100644 (file)
@@ -152,11 +152,11 @@ public:
   int device() const;
   void setDevice(int device);
 
-  QString fileNamingStamp() const;
-  void setFileNamingStamp(const QString& stamp);
+  QString fileNamingStamp(const QString& id) const;
+  void setFileNamingStamp(const QString& id, const QString& stamp);
 
-  int fileNamingCounter() const;
-  void setFileNamingCounter(int counter);
+  int fileNamingCounter(const QString& id) const;
+  void setFileNamingCounter(const QString& id, int counter);
 
 signals:
   void modeChanged();
index 9238f70..029c465 100644 (file)
@@ -22,13 +22,13 @@ SOURCES += main.cpp \
            trackerstore.cpp focusrectangle.cpp sharehelper.cpp \
            deletehelper.cpp galleryhelper.cpp postcapturemodel.cpp \
            gridlines.cpp platformsettings.cpp dbusservice.cpp \
-           mountprotector.cpp devicesettings.cpp
+           mountprotector.cpp devicesettings.cpp fileindex.cpp
 
 HEADERS += settings.h filenaming.h cameraresources.h \
            trackerstore.h focusrectangle.h sharehelper.h \
            deletehelper.h galleryhelper.h postcapturemodel.h \
            gridlines.h platformsettings.h dbusservice.h \
-           mountprotector.h devicesettings.h
+           mountprotector.h devicesettings.h fileindex.h
 
 RESOURCES += ../qml/qml.qrc