--- /dev/null
+#include "renamesettingsdialog.h"
+#include "ui_renamesettingsdialog.h"
+
+#include <LocalMyList/MyList>
+#include <LocalMyList/Database>
+#include <LocalMyList/RenameUtils>
+#include <QSqlQuery>
+#include <QSqlRecord>
+
+static const char *rulesStrAniAdd =
+ "AT := [%ATr%, %ATe%, %ATk%]\n"
+ "ET := [%ETe%, %ETr%, %ETk%]\n"
+ "GT := \"[\" [%GTs%, %GTl%] \"]\"\n"
+ "EpNoPad := $pad(%EpNo%, $max($len(%EpHiNo%), $len(%EpCount%)), \"0\")\n"
+ "SrcStyled := \"[\" %Source% \"]\"\n"
+ "isMovieType := {(%Type% = \"Movie\") ? \"True\" : \"False\"}\n"
+ "isDepr := {%Depr% ? \"[Depr]\" : \"\"}\n"
+ "isCen := {%Cen% ? \"[Cen]\" : \"\"}\n"
+ "VerStyled := %Ver% = \"1\" ? \"\" : \"v\" %Ver%\n"
+ "\n"
+ "FileName := %AT% \" \" %EpNoPad% %VerStyled% \" - \" %ET% \" \" %GT% %isDepr% %isCen% %SrcStyled%\n"
+ "PathName := \"E:\\Anime\\!Processed\\\" %AT%";
+
+static const char *rulesStrAniAddNoCompat =
+ "AT := [ATr, ATe, ATk]\n"
+ "ET := [ETe, ETr, ETk]\n"
+ "GT := \"[\" [GTs, GTl] \"]\"\n"
+ "EpNoPad := $pad(EpNo, $max($len(EpHiNo), $len(EpCount)), 0)\n"
+ "SrcStyled := \"[\" Source \"]\"\n"
+ "isMovieType := Type = \"Movie\" ? \"True\" : \"False\"\n"
+ "isDepr := Depr ? \"[Depr]\" : \"\"\n"
+ "isCen := Cen ? \"[Cen]\" : \"\"\n"
+ "VerStyled := Ver = 1 ? \"\" : \"v\" Ver\n"
+ "\n"
+ "FileName := AT \" \" EpNoPad VerStyled \" - \" ET \" \" GT isDepr isCen SrcStyled\n"
+ "PathName := \"E:\\Anime\\!Processed\\\" AT";
+
+static const char *rulesStrECMA =
+ "var AT = alt(ATr, ATe, ATk);\n"
+ "var ET = alt(ETe, ETr, ETk);\n"
+ "var GT = \"[\" + alt(GTs, GTl) + \"]\";\n"
+ "var EpNoPad = pad(EpNo, max(len(EpHiNo), len(EpCount)), \"0\");\n"
+ "var SrcStyled = \"[\" + Source + \"]\";\n"
+ "\n"
+ "var isMovieType = (Type == \"Movie\") ? \"True\" : \"False\";\n"
+ "var isDepr = parseInt(Depr) ? \"[Depr]\" : \"\";\n"
+ "var isCen = parseInt(Cen) ? \"[Cen]\" : \"\";\n"
+ "var VerStyled = Ver == \"1\" ? \"\" : \"v\" + Ver;\n"
+ "\n"
+ "var FileName = AT + \" \" + EpNoPad + VerStyled + \" - \" + ET + \" \" + GT + isDepr + isCen + SrcStyled;\n"
+ "var PathName = \"E:\\\\Anime\\\\!Processed\\\\\" + AT;";
+
+static const char *envStrAniAdd =
+ "ATr := \"Suzumiya Haruhi no Yuuutsu (2009)\"\n"
+ "ATe := \"The Melancholy of Haruhi Suzumiya (2009)\"\n"
+ "ATk := \"涼宮ハルヒの憂鬱 (2009)\"\n"
+ "ETr := \"Sasa no Ha Rhapsody\"\n"
+ "ETe := \"Bamboo Leaf Rhapsody\"\n"
+ "ETk := \"笹の葉ラプソディ\"\n"
+ "GTs := \"a.f.k.\"\n"
+ "GTl := \"a.f.k. (Long)\"\n"
+ "EpNo := \"1\"\n"
+ "EpHiNo := \"1\"\n"
+ "EpCount := \"1\"\n"
+ "Type := \"TV\"\n"
+ "Depr := \"0\"\n"
+ "Cen := \"0\"\n"
+ "Ver := \"1\"\n"
+ "Source := \"HDTV\"";
+
+static const char *envStrECMA =
+ "var ATr = \"Suzumiya Haruhi no Yuuutsu (2009)\";\n"
+ "var ATe = \"The Melancholy of Haruhi Suzumiya (2009)\";\n"
+ "var ATk = \"涼宮ハルヒの憂鬱 (2009)\";\n"
+ "var ETr = \"Sasa no Ha Rhapsody\";\n"
+ "var ETe = \"Bamboo Leaf Rhapsody\";\n"
+ "var ETk = \"笹の葉ラプソディ\";\n"
+ "var GTs = \"a.f.k.\";\n"
+ "var GTl = \"a.f.k. (Long)\";\n"
+ "var EpNo = 1;\n"
+ "var EpHiNo = 1;\n"
+ "var EpCount = 1;\n"
+ "var Type = \"TV\";\n"
+ "var Depr = 0;\n"
+ "var Cen = 0;\n"
+ "var Ver = 1;\n"
+ "var Source = \"HDTV\";";
+
+
+RenameSettingsDialog::RenameSettingsDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::RenameSettingsDialog)
+{
+ ui->setupUi(this);
+
+ environmentEngine = new RenameParser::RenameEngine;
+ rulesEngine = new RenameParser::RenameEngine;
+
+ ui->input->setPlainText(QString::fromUtf8(envStrAniAdd));
+ originalScript = LocalMyList::instance()->settings()->get("renameScript").toString();
+ ui->renameScript->setPlainText(originalScript);
+
+ QStringList parsers;
+ parsers << "AniAdd"
+ << "ECMAScript";
+
+ ui->scriptLanguage->addItems(parsers);
+ originalParserType = RenameParser::RenameEngine::ParserType(LocalMyList::instance()->settings()->get("renameLanguage").toInt());
+ setParserType(originalParserType);
+}
+
+RenameSettingsDialog::~RenameSettingsDialog()
+{
+ delete ui;
+}
+
+QString RenameSettingsDialog::renameEnv() const
+{
+ return ui->input->toPlainText();
+}
+
+void RenameSettingsDialog::setRenameEnv(const QString &renameEnv)
+{
+ ui->input->setPlainText(renameEnv);
+ originalEnv = renameEnv;
+}
+
+bool RenameSettingsDialog::filterResults() const
+{
+ return ui->filterResultsCheckbox->isChecked();
+}
+
+void RenameSettingsDialog::setFilterResults(bool filterResults)
+{
+ ui->filterResultsCheckbox->setChecked(filterResults);
+}
+
+RenameParser::RenameEngine::ParserType RenameSettingsDialog::parserType() const
+{
+ return RenameParser::RenameEngine::ParserType(ui->scriptLanguage->currentIndex());
+}
+
+void RenameSettingsDialog::setParserType(RenameParser::RenameEngine::ParserType parserType)
+{
+ ui->scriptLanguage->setCurrentIndex(parserType);
+ originalParserType = parserType;
+}
+
+void RenameSettingsDialog::setupEnvForFile(int fid)
+{
+ using namespace LocalMyList;
+
+ if (!fid)
+ return;
+
+ Database *db = MyList::instance()->database();
+
+ QSqlQuery q(db->connection());
+
+ q.prepare("SELECT fid, eid, aid, gid, anime_anidb_update, anime_entry_update, anime_my_update, anime_title_english, anime_title_romaji, anime_title_kanji, "
+ " description, year, start_date, end_date, anime_type, anime_rating, anime_votes, temp_rating, temp_votes, anime_my_vote, anime_my_vote_date, my_temp_vote, my_temp_vote_date, "
+ "episode_anidb_update, episode_entry_update, episode_my_update, epno, episode_title_english, episode_title_romaji, episode_title_kanji, episode_length, airdate, state, special, recap, "
+ " opening, ending, rating, votes, my_vote, my_vote_date, "
+ "anidb_update, entry_update, my_update, ed2k, size, length, extension, group_name, group_name_short, crc, release_date, version, censored, type, quality_id, quality, resolution, "
+ " video_codec, audio_codec, audio_language, subtitle_language, aspect_ratio, my_watched, my_state, my_file_state, my_storage, my_source, my_other, host_id, path, renamed "
+ "FROM rename_data "
+ "WHERE fid = :fid ");
+
+ q.bindValue(":id", fid);
+
+ if (!db->exec(q))
+ return;
+
+ if (!q.next())
+ return;
+
+ QSqlRecord record = q.record();
+
+ RenameParser::Environment env;
+
+ setupRenameEnv(record, env);
+
+ QString s;
+ for (RenameParser::Environment::const_iterator i = env.constBegin(); i != env.constEnd(); ++i)
+ {
+ s += i.key() + " := \"" + i.value() + "\"\n";
+ }
+ ui->input->setText(s);
+}
+
+void RenameSettingsDialog::saveSettings()
+{
+ using namespace LocalMyList;
+
+ RenameParser::RenameEngine::ParserType parserType = RenameParser::RenameEngine::ParserType(ui->scriptLanguage->currentIndex());
+ QString renameScript = ui->renameScript->toPlainText();
+
+ Settings *s = MyList::instance()->settings();
+
+ s->set("renameLanguage", QString::number(parserType));
+ s->set("renameScript", renameScript);
+ s->commit();
+}
+
+void RenameSettingsDialog::restoreOriginalSettings()
+{
+ setParserType(originalParserType);
+ ui->renameScript->setPlainText(originalScript);
+}
+
+
+void RenameSettingsDialog::on_input_textChanged()
+{
+ bool success = environmentEngine->parse(ui->input->toPlainText() + "\n");
+
+ if (!success)
+ {
+ ui->status->setText("Error in input field: " + environmentEngine->error());
+ updateResult(RenameParser::Environment());
+ return;
+ }
+ RenameParser::Environment newEnv;
+ environmentEngine->evaluate(newEnv);
+ env = newEnv;
+
+ rulesEngine->evaluate(newEnv);
+ updateResult(newEnv);
+}
+
+void RenameSettingsDialog::on_renameScript_textChanged()
+{
+ RenameParser::Environment newEnv = env;
+
+ bool success = rulesEngine->parse(ui->renameScript->toPlainText() + "\n");
+
+ if (!success)
+ {
+ ui->status->setText("Error: " + rulesEngine->error());
+ updateResult(RenameParser::Environment());
+ return;
+ }
+ rulesEngine->evaluate(newEnv);
+ updateResult(newEnv);
+ ui->status->setText("Success");
+}
+
+void RenameSettingsDialog::on_scriptLanguage_currentIndexChanged()
+{
+ rulesEngine->setCurrentParserType(RenameParser::RenameEngine::ParserType(ui->scriptLanguage->currentIndex()));
+ on_input_textChanged();
+}
+
+void RenameSettingsDialog::updateResult(const RenameParser::Environment &env)
+{
+ QString s;
+ if (ui->filterResultsCheckbox->isChecked())
+ {
+ s += "FileName := \"" + env["FileName"] + "\"\n";
+ s += "PathName := \"" + env["PathName"] + "\"";
+ }
+ else
+ {
+ for (RenameParser::Environment::const_iterator i = env.constBegin(); i != env.constEnd(); ++i)
+ {
+ s += i.key() + " := \"" + i.value() + "\"\n";
+ }
+ }
+ ui->result->setPlainText(s);
+}
+
+void RenameSettingsDialog::on_filterResultsCheckbox_toggled()
+{
+ on_renameScript_textChanged();
+}
+
+QString RenameSettingsDialog::renameString() const
+{
+ QString s = ui->renameScript->toPlainText();
+ if (!s.endsWith(QChar('\n')))
+ s += QChar('\n');
+ return s;
+}
+
+void RenameSettingsDialog::setRenameString(const QString &renameScript)
+{
+ ui->renameScript->setPlainText(renameScript);
+ originalScript = renameScript;
+}
+
+void RenameSettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
+{
+ switch (ui->buttonBox->standardButton(button))
+ {
+ case QDialogButtonBox::Reset:
+ restoreOriginalSettings();
+ break;
+ case QDialogButtonBox::RestoreDefaults:
+ {
+ ui->input->setPlainText(QString::fromUtf8(envStrAniAdd));
+ setParserType(RenameParser::RenameEngine::AniAdd);
+ ui->renameScript->setPlainText(QString::fromUtf8(rulesStrAniAddNoCompat));
+ }
+ break;
+ case QDialogButtonBox::Save:
+ saveSettings();
+ break;
+ case QDialogButtonBox::Cancel:
+ restoreOriginalSettings();
+ break;
+ default:
+ break;
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RenameSettingsDialog</class>
+ <widget class="QDialog" name="RenameSettingsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1029</width>
+ <height>678</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Rename Script</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Input</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QTextEdit" name="input">
+ <property name="font">
+ <font>
+ <family>DejaVu Sans Mono</family>
+ </font>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Result</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QTextEdit" name="result">
+ <property name="font">
+ <font>
+ <family>DejaVu Sans Mono</family>
+ </font>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="filterResultsCheckbox">
+ <property name="text">
+ <string>Only show FileName and PathName</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>Rename Script</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="scriptLanguageLabel">
+ <property name="text">
+ <string>Script Language:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="scriptLanguage"/>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTextEdit" name="renameScript">
+ <property name="font">
+ <font>
+ <family>DejaVu Sans Mono</family>
+ </font>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_4">
+ <property name="title">
+ <string>Status</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="status">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Reset|QDialogButtonBox::RestoreDefaults|QDialogButtonBox::Save</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>RenameSettingsDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>RenameSettingsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>