]> Some of my projects - anidbudpclient.git/commitdiff
Introducing FileRenameDelegate
authorAPTX <marek321@gmail.com>
Sun, 26 Dec 2010 03:22:16 +0000 (04:22 +0100)
committerAPTX <marek321@gmail.com>
Sun, 26 Dec 2010 03:22:16 +0000 (04:22 +0100)
anidbudpclient.pro
anidbudpclient_global.h
file.cpp
file.h
filecommand.h
filerenamedelegate.cpp [new file with mode: 0644]
filerenamedelegate.h [new file with mode: 0644]
include/AniDBUdpClient/FileRenameDelegate [new file with mode: 0644]
renameparser/functions.h
renameparser/renameengine.cpp
renameparser/renameengine.h

index 3985504523e9da24709a0d71b8cf7ee5c60153f5..cb49877e92c1f70eef7aab12eea279312dfd86da 100644 (file)
@@ -32,7 +32,8 @@ SOURCES += client.cpp \
     hashproducer.cpp \\r
        hashconsumer.cpp \\r
     clientsentcommandsmodel.cpp \\r
-       clientqueuedcommandsmodel.cpp\r
+       clientqueuedcommandsmodel.cpp \\r
+    filerenamedelegate.cpp\r
 \r
 HEADERS += client.h \\r
     anidbudpclient_global.h \\r
@@ -51,7 +52,8 @@ HEADERS += client.h \
     hashconsumer.h \\r
        circularbuffer.h \\r
     clientsentcommandsmodel.h \\r
-       clientqueuedcommandsmodel.h\r
+       clientqueuedcommandsmodel.h \\r
+       filerenamedelegate.h\r
 \r
 CONV_HEADERS += include/AniDBUdpClient/Client \\r
     include/AniDBUdpClient/AbstractCommand \\r
@@ -64,7 +66,8 @@ CONV_HEADERS += include/AniDBUdpClient/Client \
        include/AniDBUdpClient/File \\r
        include/AniDBUdpClient/Hash \\r
        include/AniDBUdpClient/ClientSentCommandsModel \\r
-       include/AniDBUdpClient/ClientQueuedCommandsModel\r
+       include/AniDBUdpClient/ClientQueuedCommandsModel \\r
+       include/AniDBUdpClient/FileRenameDelegate\r
 \r
 # RenameParser Files\r
 \r
index 224d266f966e604ed0c60b945b1ca37beee1794e..1a1446e3627ad843f805105d59d81eb8b6b600e7 100644 (file)
@@ -315,7 +315,7 @@ namespace AniDBUdpClient
        Q_FLAGS(FileAnimeFlag::FileAnimeFlag);
        Q_DECLARE_FLAGS(FileAnimeFlags, FileAnimeFlag::FileAnimeFlag);
        Q_DECLARE_OPERATORS_FOR_FLAGS(FileAnimeFlags);
-       typedef FileAnimeFlag::FileAnimeFlag FileAMask;
+       typedef FileAnimeFlags FileAMask;
 
        namespace AnimeFlag {
                static const qint64 CategoryWeightList  = Q_INT64_C(0x0000000000000001);
index 9f810e10c9783d28485347a2258bf755fe5f3176..19dbc4e814e2420d22c2c9af36eb75202e84acec 100644 (file)
--- a/file.cpp
+++ b/file.cpp
@@ -3,6 +3,7 @@
 #include <QRegExp>
 #include "client.h"
 #include "hash.h"
+#include "filerenamedelegate.h"
 
 #include <QDebug>
 
@@ -91,6 +92,16 @@ File::ActionState File::markingState() const
        return m_markingState;
 }
 
+void File::setRenameDelegate(FileRenameDelegate *renameHelper)
+{
+       m_renameDelegate = renameHelper;
+}
+
+FileRenameDelegate *File::renameDelegate() const
+{
+       return m_renameDelegate;
+}
+
 
 void File::hash()
 {
@@ -169,14 +180,22 @@ qDebug() << "finishRenaming";
        if (name.isEmpty())
                name = fileReply->value(FileAnimeFlag::EnglishName).toString();
 
-       QString newFileName = tr("%1 - %2 - %3 - [%4](%5).%6")
+       QString newFileName, newFilePath;
+
+       if (m_renameDelegate)
+       {
+               m_renameDelegate->rename(fileReply, newFileName, newFilePath);
+       }
+       else
+       {
+               newFileName = tr("%1 - %2 - %3 - [%4](%5).%6")
                                           .arg(name)
                                           .arg(fileReply->value(FileAnimeFlag::EpNo).toString())
                                           .arg(fileReply->value(FileAnimeFlag::EpName).toString())
                                           .arg(fileReply->value(FileAnimeFlag::GroupShortName).toString())
                                           .arg(fileReply->value(FileFlag::Crc32).toString())
                                           .arg(fileReply->value(FileFlag::FileType).toString());
-
+       }
        newFileName.replace('"', "'");
        newFileName.replace(QRegExp("[\\/]"), "-");
        newFileName.replace(QRegExp("[\\/:*?\"<>|]"), "");
@@ -326,6 +345,14 @@ qDebug() << "startRenaming";
                                                  | FileAnimeFlag::EpNo
                                                  | FileAnimeFlag::EpName
                                                  | FileAnimeFlag::GroupShortName);
+
+
+       if (m_renameDelegate)
+       {
+               fileCommand.setAmask(m_renameDelegate->requiredAMask());
+               fileCommand.setFmask(m_renameDelegate->requiredFMask());
+       }
+
        fileReply = Client::instance()->send(fileCommand);
        connect(fileReply, SIGNAL(replyReady(bool)), this, SLOT(finishRenaming(bool)));
 
@@ -385,6 +412,8 @@ void File::init()
        m_hashingState = m_renamingState = m_addingState = m_markingState = NotStarted;
        notWorking = true;
 
+       m_renameDelegate = 0;
+
        connect(this, SIGNAL(statusUpdate(AniDBUdpClient::File::Action,AniDBUdpClient::File::ActionState)), this, SLOT(workOnFinished(AniDBUdpClient::File::Action,AniDBUdpClient::File::ActionState)));
 }
 
diff --git a/file.h b/file.h
index 6428c579e7e334b53ca141cc3598a00ee4d3037c..8422ffcfbad73341a655ff5f7e889b72c4655de4 100644 (file)
--- a/file.h
+++ b/file.h
@@ -16,6 +16,8 @@ class FileCommand;
 class MyListCommand;
 class HashResult;
 
+class FileRenameDelegate;
+
 class ANIDBUDPCLIENTSHARED_EXPORT File : public QObject
 {
        Q_OBJECT
@@ -70,6 +72,9 @@ public:
        ActionState addingState() const;
        ActionState markingState() const;
 
+       void setRenameDelegate(FileRenameDelegate *renameDelegate);
+       FileRenameDelegate *renameDelegate() const;
+
 public slots:
        void hash();
        bool rename();
@@ -121,6 +126,8 @@ private:
        MyListAddReply *addReply;
        MyListAddReply *markReply;
 
+       FileRenameDelegate *m_renameDelegate;
+
 };
 
 } // namespace AniDBUdpClient
index b3e80f47c0a13a464e7ce769e2ff450e98108f5d..aa0496d060c856ac4f6fe8c9f2050ccbf627661a 100644 (file)
@@ -90,6 +90,19 @@ class ANIDBUDPCLIENTSHARED_EXPORT FileReply : public AbstractReply
        Q_PROPERTY(int fid READ fid);
 
 public:
+
+       enum State
+       {
+               CrcOk           = 0x00000001,
+               CrcErr          = 0x00000002,
+               IsV2            = 0x00000004,
+               IsV3            = 0x00000008,
+               IsV4            = 0x00000010,
+               IsV5            = 0x00000020,
+               Uncensored      = 0x00000040,
+               Censored        = 0x00000080,
+       };
+
        int fid() const;
 
        QVariant value(FileFlags f) const;
diff --git a/filerenamedelegate.cpp b/filerenamedelegate.cpp
new file mode 100644 (file)
index 0000000..9a54f87
--- /dev/null
@@ -0,0 +1,175 @@
+#include "filerenamedelegate.h"
+
+#include "filecommand.h"
+
+namespace AniDBUdpClient {
+
+FileRenameDelegate::FileRenameDelegate(RenameParser::RenameEngine *renameEngine, QObject *parent) :
+       QObject(parent), m_renameEngine(0), fMask(FileFlags()), aMask(FileAnimeFlags())
+{
+       setRenameEngine(renameEngine);
+}
+
+FileRenameDelegate::~FileRenameDelegate()
+{
+       if (m_renameEngine)
+               delete m_renameEngine;
+}
+
+RenameParser::RenameEngine *FileRenameDelegate::renameEngine() const
+{
+       return m_renameEngine;
+}
+
+void FileRenameDelegate::setRenameEngine(RenameParser::RenameEngine *renameEngine)
+{
+       if (m_renameEngine)
+       {
+               m_renameEngine->disconnect(this);
+               m_renameEngine->deleteLater();
+       }
+
+       m_renameEngine = renameEngine;
+       if (!m_renameEngine)
+               return;
+
+       connect(m_renameEngine, SIGNAL(renameStringChanged()), this, SLOT(updateMasks()));
+}
+
+
+FileAMask FileRenameDelegate::requiredAMask() const
+{
+       return aMask;
+}
+
+FMask FileRenameDelegate::requiredFMask() const
+{
+       return fMask;
+}
+
+void FileRenameDelegate::rename(const AniDBUdpClient::FileReply *reply, QString &fileName, QString &filePath)
+{
+       if (!m_renameEngine || !reply)
+               return;
+
+       RenameParser::Environment env;
+
+       env["ATr"] = reply->value(FileAnimeFlag::RomajiName).toString();
+       env["ATe"] = reply->value(FileAnimeFlag::EnglishName).toString();
+       env["ATk"] = reply->value(FileAnimeFlag::KanjiName).toString();
+
+       env["ETr"] = reply->value(FileAnimeFlag::EpRomajiName).toString();
+       env["ETe"] = reply->value(FileAnimeFlag::EpName).toString();
+       env["ETk"] = reply->value(FileAnimeFlag::EpKanjiName).toString();
+
+       env["GTs"] = reply->value(FileAnimeFlag::GroupName).toString();
+       env["GTl"] = reply->value(FileAnimeFlag::GroupShortName).toString();
+
+       env["EpNo"] = reply->value( FileAnimeFlag::EpNo).toString();
+       env["EpHiNo"] = reply->value(FileAnimeFlag::AnimeTotalEpisodes).toString();
+       env["EpCount"] = reply->value(FileAnimeFlag::HighestEpisodeNumber).toString();
+
+       QString airDate = reply->value(FileFlag::AiredDate).toString();
+       if (!airDate.contains('-'))
+       {
+               env["AYearBegin"] = airDate;
+               env["AYearEnd"] = "";
+       }
+       else
+       {
+               QStringList years = airDate.split('-');
+               env["AYearBegin"] = years[0].trimmed();
+               env["AYearEnd"] = years[1].trimmed();
+       }
+
+
+       env["Type"] = reply->value(FileFlag::FileType).toString();
+       env["Depr"] = reply->value(FileFlag::IsDeprecated).toInt() ? "1" : "";
+
+       const int state = reply->value(FileFlag::State).toInt();
+
+       env["Cen"] = state & FileReply::Censored ? "1" : "0";
+
+       int version = 1;
+       if (state & FileReply::IsV2)
+               version = 2;
+       if (state & FileReply::IsV3)
+               version = 3;
+       if (state & FileReply::IsV4)
+               version = 4;
+       if (state & FileReply::IsV5)
+               version = 5;
+
+       env["Ver"] = QString::number(version);
+       env["Source"] = reply->value(FileFlag::Source).toString();
+       env["Quality"] = reply->value(FileFlag::Quality).toString();
+       env["FCrc"] = reply->value(FileFlag::Crc32).toString();
+       env["FVideoRes"] = reply->value(FileFlag::VideoResolution).toString();
+       env["FALng"] = reply->value(FileFlag::DubLanguage).toString();
+       env["FSLng"] = reply->value(FileFlag::SubLanguage).toString();
+
+       m_renameEngine->evaluate(env);
+
+       fileName = env.value("FileName", "");
+       filePath = env.value("FilePath", "");
+}
+
+void FileRenameDelegate::updateMasks()
+{
+       static bool init = true;
+       static QMap<QString, FMask> fMaskVars;
+       static QMap<QString, FileAMask> aMaskVars;
+
+       if (init)
+       {
+               fMaskVars["Type"] = FileFlag::FileType;
+               fMaskVars["Depr"] = FileFlag::IsDeprecated;
+               fMaskVars["Cen"] = FileFlag::State;
+               fMaskVars["Ver"] = FileFlag::State;
+               fMaskVars["Source"] = FileFlag::Source;
+               fMaskVars["Quality"] = FileFlag::Quality;
+               fMaskVars["AYearBegin"] = FileFlag::AiredDate;
+               fMaskVars["AYearEnd"] = FileFlag::AiredDate;
+               fMaskVars["FCrc"] = FileFlag::Crc32;
+               fMaskVars["FVideoRes"] = FileFlag::VideoResolution;
+               fMaskVars["FALng"] = FileFlag::DubLanguage;
+               fMaskVars["FSLng"] = FileFlag::SubLanguage;
+//             Not implemented in FileCommand.
+//             fMaskVars["Watched"] = FileFlag::;
+
+               aMaskVars["ATr"] = FileAnimeFlag::RomajiName;
+               aMaskVars["ATe"] = FileAnimeFlag::EnglishName;
+               aMaskVars["ATk"] = FileAnimeFlag::KanjiName;
+
+               aMaskVars["ETr"] = FileAnimeFlag::EpRomajiName;
+               aMaskVars["ETe"] = FileAnimeFlag::EpName;
+               aMaskVars["ETk"] = FileAnimeFlag::EpKanjiName;
+
+               aMaskVars["GTs"] = FileAnimeFlag::GroupName;
+               aMaskVars["GTl"] = FileAnimeFlag::GroupShortName;
+
+               aMaskVars["EpNo"] = FileAnimeFlag::EpNo;
+               aMaskVars["EpHiNo"] = FileAnimeFlag::AnimeTotalEpisodes;
+               aMaskVars["EpCount"] = FileAnimeFlag::HighestEpisodeNumber;
+
+               init = false;
+       }
+
+       if (!m_renameEngine)
+               return;
+
+       QStringList usedVars = m_renameEngine->usedVariables();
+
+       fMask = 0;
+       aMask = 0;
+
+       foreach (const QString &var, usedVars)
+       {
+               if (fMaskVars.contains(var))
+                       fMask |= fMaskVars[var];
+               if (aMaskVars.contains(var))
+                       aMask |= aMaskVars[var];
+       }
+}
+
+} // namespace AniDBUdpClient
diff --git a/filerenamedelegate.h b/filerenamedelegate.h
new file mode 100644 (file)
index 0000000..6728ad9
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef FILERENAMEDELEGATE_H
+#define FILERENAMEDELEGATE_H
+
+#include "anidbudpclient_global.h"
+#include "renameparser/renameengine.h"
+
+#include <QObject>
+#include <QStringList>
+
+namespace AniDBUdpClient {
+
+class FileReply;
+
+class ANIDBUDPCLIENTSHARED_EXPORT FileRenameDelegate : public QObject
+{
+    Q_OBJECT
+public:
+       explicit FileRenameDelegate(RenameParser::RenameEngine *renameEngine = 0, QObject *parent = 0);
+       ~FileRenameDelegate();
+
+       RenameParser::RenameEngine *renameEngine() const;
+       void setRenameEngine(RenameParser::RenameEngine *renameEngine);
+
+       FileAMask requiredAMask() const;
+       FMask requiredFMask() const;
+
+       void rename(const FileReply *reply, QString &fileName, QString &filePath);
+
+private slots:
+       void updateMasks();
+
+private:
+       RenameParser::RenameEngine *m_renameEngine;
+
+       FMask fMask;
+       FileAMask aMask;
+};
+
+} // namespace AniDBUdpClient
+
+#endif // FILERENAMEDELEGATE_H
diff --git a/include/AniDBUdpClient/FileRenameDelegate b/include/AniDBUdpClient/FileRenameDelegate
new file mode 100644 (file)
index 0000000..f12e405
--- /dev/null
@@ -0,0 +1 @@
+#include "../../filerenamedelegate.h"
\ No newline at end of file
index 664562af414d958c23a47418a76670a328aa3cf6..7addc02f090d63a83afa70c13a01c8ea3b7d3d43 100644 (file)
@@ -8,7 +8,10 @@ namespace RenameParser {
 
 namespace RenameFunctions
 {
-       QString _max(const QStringList &args);
+#ifdef max
+#undef max
+#endif
+       QString max(const QStringList &args);
        QString len(const QStringList &args);
        QString pad(const QStringList &args);
        QString repl(const QStringList &args);
index cbbe6ec5e91c4c42a97a0c476a18b8afab95ba36..af464383c2a470514444769c7ea788e6e451af5f 100644 (file)
@@ -26,6 +26,8 @@ RenameEngine::ParserType RenameEngine::currentParserType() const
 
 void RenameEngine::setCurrentParserType(ParserType parserType)
 {
+       if (m_parserType == parserType)
+               return;
        m_parserType = parserType;
        delete parser;
        parser = createParser(parserType);
@@ -42,7 +44,8 @@ bool RenameEngine::parse(const QString &string)
 #ifdef PARSER_DEBUG
 qDebug() << "-----------------------------------------------------------------";
 #endif
-return b;
+       emit renameStringChanged();
+       return b;
 }
 
 QString RenameEngine::evaluate(Environment &env)
@@ -65,6 +68,11 @@ int RenameEngine::column() const
        return parser->column();
 }
 
+QStringList RenameEngine::usedVariables() const
+{
+       return parser->usedVariables();
+}
+
 AbstractParser *RenameEngine::createParser(ParserType type) const
 {
        switch (type)
index 1356033ae1a5712b06830e3bd07da91a2c145150..34128ad05871f9bdb7e8e0104a41f150591f6ac5 100644 (file)
@@ -12,8 +12,10 @@ namespace RenameParser {
 
 typedef QString (*RenameFunction)(const QStringList &args);
 
-class ANIDBUDPCLIENTSHARED_EXPORT RenameEngine
+class ANIDBUDPCLIENTSHARED_EXPORT RenameEngine : public QObject
 {
+       Q_OBJECT
+
 public:
        enum ParserType {
                AniAdd,
@@ -36,6 +38,11 @@ public:
        int line() const;
        int column() const;
 
+       QStringList usedVariables() const;
+
+signals:
+       void renameStringChanged();
+
 private:
        AbstractParser *createParser(ParserType type) const;
 
@@ -58,4 +65,6 @@ private:
 
 } // namespace
 
+Q_DECLARE_METATYPE(RenameParser::RenameEngine::ParserType)
+
 #endif // RENAMEENGINE_H