From f15b7b41a0fd2cade6cd0bb3771c2c0da14db3c8 Mon Sep 17 00:00:00 2001 From: Mohammed Sameer Date: Tue, 20 Aug 2013 00:37:26 +0300 Subject: [PATCH] Don't reuse file names Always keep track of the last used counter and don't just pick the next available file name. --- qml/MainPage.qml | 1 + src/filenaming.cpp | 66 +++++++++++++++++++++++++++++++++------------- src/filenaming.h | 10 +++++-- src/settings.cpp | 16 +++++++++++ src/settings.h | 6 +++++ 5 files changed, 79 insertions(+), 20 deletions(-) diff --git a/qml/MainPage.qml b/qml/MainPage.qml index 784f864..37f80c5 100644 --- a/qml/MainPage.qml +++ b/qml/MainPage.qml @@ -216,6 +216,7 @@ CameraPage { imagePath: platformSettings.imagePath videoPath: platformSettings.videoPath temporaryVideoPath: platformSettings.temporaryVideoPath + settings: settings } MountProtector { diff --git a/src/filenaming.cpp b/src/filenaming.cpp index ab950ac..a001647 100644 --- a/src/filenaming.cpp +++ b/src/filenaming.cpp @@ -27,12 +27,14 @@ #elif defined(QT5) #include #endif +#include "settings.h" #define PATH QString("%1%2MyDocs%2DCIM%2").arg(QDir::homePath()).arg(QDir::separator()) #define TEMP_PATH QString("%1%2MyDocs%2.cameraplus%2").arg(QDir::homePath()).arg(QDir::separator()) FileNaming::FileNaming(QObject *parent) : - QObject(parent), m_index(-1) { + QObject(parent), + m_settings(0) { } @@ -71,44 +73,60 @@ QString FileNaming::videoFileName() { } QString FileNaming::fileName(const QString& path, const QString& suffix) { - QString date = QDate::currentDate().toString("yyyyMMdd"); - QDir dir(path); + if (!m_settings) { + qmlInfo(this) << "settings has not been set"; + return QString(); + } if (suffix.isEmpty()) { + qmlInfo(this) << "called with empty suffix"; return QString(); } if (path.isEmpty()) { + qmlInfo(this) << "called with empty path"; return QString(); } - if (date != m_date) { - m_index = -1; - m_date = date; + QString date = QDate::currentDate().toString("yyyyMMdd"); + QDir dir(path); + + // index is the last used index + int index = 0; + + if (m_settings->fileNamingStamp() != date) { + m_settings->setFileNamingStamp(date); + } + else { + index = m_settings->fileNamingCounter(); } - if (m_index == -1) { + if (index == 0) { QStringList filters(QString("*%1_*").arg(date)); QStringList entries = dir.entryList(filters, QDir::Files, QDir::Name); - if (entries.isEmpty()) { - m_index = 0; - } - else { + if (!entries.isEmpty()) { QString name = QFile(entries.last()).fileName(); - m_index = name.section('_', 1, 1).section('.', 0, 0).toInt(); + index = name.section('_', 1, 1).section('.', 0, 0).toInt(); } } - ++m_index; + while (index < INT_MAX) { + ++index; - QString name = QString("%1%2_%3.%4").arg(path).arg(date).arg(QString().sprintf("%03i", m_index)). - arg(suffix); + QString name = QString("%1%2_%3.%4") + .arg(path).arg(date).arg(QString().sprintf("%03i", index)).arg(suffix); + + if (!QFile(name).exists()) { + m_settings->setFileNamingCounter(index); + + return name; + } - if (QFile(name).exists()) { - return QString(); } - return name; + qmlInfo(this) << "Failed to guess a file name"; + + return QString(); } QString FileNaming::canonicalPath(const QString& path) { @@ -176,3 +194,15 @@ void FileNaming::setTemporaryVideoPath(const QString& path) { emit temporaryVideoPathChanged(); } } + +Settings *FileNaming::settings() const { + return m_settings; +} + +void FileNaming::setSettings(Settings *settings) { + if (m_settings != settings) { + m_settings = settings; + + emit settingsChanged(); + } +} diff --git a/src/filenaming.h b/src/filenaming.h index d5f7129..58ab354 100644 --- a/src/filenaming.h +++ b/src/filenaming.h @@ -25,6 +25,8 @@ #include +class Settings; + class FileNaming : public QObject { Q_OBJECT @@ -33,6 +35,7 @@ class FileNaming : public QObject { Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath NOTIFY imagePathChanged); Q_PROPERTY(QString videoPath READ videoPath WRITE setVideoPath NOTIFY videoPathChanged); Q_PROPERTY(QString temporaryVideoPath READ temporaryVideoPath WRITE setTemporaryVideoPath NOTIFY temporaryVideoPathChanged); + Q_PROPERTY(Settings *settings READ settings WRITE setSettings NOTIFY settingsChanged); public: FileNaming(QObject *parent = 0); @@ -57,12 +60,16 @@ public: QString temporaryVideoPath() const; void setTemporaryVideoPath(const QString& path); + Settings *settings() const; + void setSettings(Settings *settings); + signals: void imageSuffixChanged(); void videoSuffixChanged(); void imagePathChanged(); void videoPathChanged(); void temporaryVideoPathChanged(); + void settingsChanged(); private: QString fileName(const QString& path, const QString& suffix); @@ -75,8 +82,7 @@ private: QString m_videoPath; QString m_temporaryVideoPath; - QString m_date; - int m_index; + Settings *m_settings; }; #endif /* FILE_NAMING_H */ diff --git a/src/settings.cpp b/src/settings.cpp index 9bed54b..05ae2bc 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -408,3 +408,19 @@ void Settings::setVideoTorchOn(bool on) { emit videoTorchOnChanged(); } } + +QString Settings::fileNamingStamp() const { + return m_settings->value("fileNaming/stamp").toString(); +} + +void Settings::setFileNamingStamp(const QString& stamp) { + m_settings->setValue("fileNaming/stamp", stamp); +} + +int Settings::fileNamingCounter() const { + return m_settings->value("fileNaming/counter").toInt(); +} + +void Settings::setFileNamingCounter(int counter) { + m_settings->setValue("fileNaming/counter", counter); +} diff --git a/src/settings.h b/src/settings.h index e5a8500..6b16cdc 100644 --- a/src/settings.h +++ b/src/settings.h @@ -148,6 +148,12 @@ public: int device() const; void setDevice(int device); + QString fileNamingStamp() const; + void setFileNamingStamp(const QString& stamp); + + int fileNamingCounter() const; + void setFileNamingCounter(int counter); + signals: void modeChanged(); void creatorNameChanged(); -- 2.25.1