From 0a509af45ecf48c8ebb70316b090ac1488fccf49 Mon Sep 17 00:00:00 2001 From: APTX Date: Tue, 19 Jun 2012 17:38:08 +0200 Subject: [PATCH] Add rename settings to management-gui --- management-gui/mainwindow.cpp | 28 ++- management-gui/mainwindow.h | 8 + management-gui/mainwindow.ui | 6 + management-gui/management-gui.pro | 17 +- management-gui/mylistview.cpp | 15 +- management-gui/mylistview.h | 4 + management-gui/renamesettingsdialog.cpp | 313 ++++++++++++++++++++++++ management-gui/renamesettingsdialog.h | 65 +++++ management-gui/renamesettingsdialog.ui | 182 ++++++++++++++ 9 files changed, 628 insertions(+), 10 deletions(-) create mode 100644 management-gui/renamesettingsdialog.cpp create mode 100644 management-gui/renamesettingsdialog.h create mode 100644 management-gui/renamesettingsdialog.ui diff --git a/management-gui/mainwindow.cpp b/management-gui/mainwindow.cpp index 4016db7..0d24621 100644 --- a/management-gui/mainwindow.cpp +++ b/management-gui/mainwindow.cpp @@ -6,11 +6,13 @@ #include #include #include +#include #include "mylist.h" #include "database.h" #include "mylistmodel.h" #include "unknownfilelookuptask.h" +#include "renamesettingsdialog.h" #include @@ -18,7 +20,7 @@ using namespace LocalMyList; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow) + ui(new Ui::MainWindow), renameSettingsDialog(0) { ui->setupUi(this); taskCountLabel = new QLabel(this); @@ -40,8 +42,15 @@ MainWindow::MainWindow(QWidget *parent) : MyList::instance()->database()->connect(); myListModel = new MyListModel(this); + myListFilterModel = new QSortFilterProxyModel(); + myListFilterModel->setSourceModel(myListModel); ui->myListView->setModel(myListModel); - ui->myListView->setColumnWidth(0, 450); + + ui->myListView->header()->setResizeMode(0, QHeaderView::Stretch); + ui->myListView->header()->setStretchLastSection(false); + ui->myListView->header()->resizeSection(4, 200); + + connect(ui->myListView, SIGNAL(renameTest(int)), this, SLOT(openRenameScriptEditor(int))); } MainWindow::~MainWindow() @@ -85,6 +94,16 @@ void MainWindow::allTasksFinished() ui->statusBar->showMessage(tr("All tasks finished.")); } +void MainWindow::openRenameScriptEditor(int fid) +{ + if (!renameSettingsDialog) + renameSettingsDialog = new RenameSettingsDialog(); + + renameSettingsDialog->setupEnvForFile(fid); + + renameSettingsDialog->show(); +} + void MainWindow::on_actionScanDirectory_triggered() { QString dir = QFileDialog::getExistingDirectory(this, tr("Scan Directory")); @@ -261,3 +280,8 @@ void MainWindow::on_refreshButton_clicked() { myListModel->reload(); } + +void MainWindow::on_actionRenameScript_triggered() +{ + openRenameScriptEditor(0); +} diff --git a/management-gui/mainwindow.h b/management-gui/mainwindow.h index 653e70a..602a827 100644 --- a/management-gui/mainwindow.h +++ b/management-gui/mainwindow.h @@ -12,6 +12,9 @@ namespace LocalMyList { class MyListModel; } class QLabel; +class QSortFilterProxyModel; + +class RenameSettingsDialog; class MainWindow : public QMainWindow { @@ -32,6 +35,8 @@ private slots: void taskCountChanged(); void allTasksFinished(); + void openRenameScriptEditor(int fid); + void on_actionDisconnect_triggered(); void on_actionScanDirectory_triggered(); void on_actionImportMyList_triggered(); @@ -51,14 +56,17 @@ private slots: void on_actionAddFiles_triggered(); void on_actionRemoveKnownUnknownFiles_triggered(); void on_refreshButton_clicked(); + void on_actionRenameScript_triggered(); private: Ui::MainWindow *ui; + RenameSettingsDialog *renameSettingsDialog; QLabel *databaseConnectionStatusIndicator; QLabel *taskCountLabel; LocalMyList::MyListModel *myListModel; + QSortFilterProxyModel *myListFilterModel; }; #endif // MAINWINDOW_H diff --git a/management-gui/mainwindow.ui b/management-gui/mainwindow.ui index 89742de..ee3e123 100644 --- a/management-gui/mainwindow.ui +++ b/management-gui/mainwindow.ui @@ -70,6 +70,7 @@ Settings + @@ -211,6 +212,11 @@ Remove Known Unknown Files + + + Rename Script... + + diff --git a/management-gui/management-gui.pro b/management-gui/management-gui.pro index a662923..9270456 100644 --- a/management-gui/management-gui.pro +++ b/management-gui/management-gui.pro @@ -1,4 +1,4 @@ -QT += core gui +QT += core gui include(../config.pri) @@ -10,16 +10,21 @@ TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ databaseconnectiondialog.cpp \ - mylistview.cpp + mylistview.cpp \ + renamesettingsdialog.cpp -HEADERS += mainwindow.h \ +HEADERS += mainwindow.h \ databaseconnectiondialog.h \ - mylistview.h + mylistview.h \ + renamesettingsdialog.h -FORMS += mainwindow.ui \ - databaseconnectiondialog.ui +FORMS += mainwindow.ui \ + databaseconnectiondialog.ui \ + renamesettingsdialog.ui include(../localmylist.pri) +LIBS += -lanidbudpclient + target.path = $${PREFIX}/bin INSTALLS += target diff --git a/management-gui/mylistview.cpp b/management-gui/mylistview.cpp index 368cb9f..5c647b6 100644 --- a/management-gui/mylistview.cpp +++ b/management-gui/mylistview.cpp @@ -3,12 +3,13 @@ #include "mylist.h" #include "mylistmodel.h" +#include #include #include #include MyListView::MyListView(QWidget *parent) : - QTreeView(parent) + QTreeView(parent) { setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showCustomContextMenu(QPoint))); @@ -21,6 +22,8 @@ MyListView::MyListView(QWidget *parent) : connect(markWatchedAction, SIGNAL(triggered()), this, SLOT(markWatched())); aniDBLinkAction = new QAction(tr("Open AniDB Page"), this); connect(aniDBLinkAction, SIGNAL(triggered()), this, SLOT(openAnidbPage())); + renameTestAction = new QAction(tr("Use For Rename Testing"), this); + connect(renameTestAction, SIGNAL(triggered()), this, SLOT(renameTest())); } LocalMyList::MyListModel *MyListView::myListModel() const @@ -57,7 +60,8 @@ void MyListView::showCustomContextMenu(const QPoint &pos) aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(id)); actions << aniDBLinkAction << openAction - << markWatchedAction; + << markWatchedAction + << renameTestAction; break; } @@ -102,3 +106,10 @@ void MyListView::openAnidbPage() break; } } + +void MyListView::renameTest() +{ + int id = myListModel()->id(customContextMenuIndex); + if (id) + emit renameTest(id); +} diff --git a/management-gui/mylistview.h b/management-gui/mylistview.h index 8f30ad0..dd85f92 100644 --- a/management-gui/mylistview.h +++ b/management-gui/mylistview.h @@ -16,6 +16,7 @@ public: signals: void openFileRequested(const QModelIndex &index); + void renameTest(int fid); private slots: LocalMyList::MyListModel *myListModel() const; @@ -23,6 +24,8 @@ private slots: void requestOpenFile(); void markWatched(); void openAnidbPage(); + void renameTest(); + private: QModelIndex customContextMenuIndex; @@ -31,6 +34,7 @@ private: QAction *openNextAction; QAction *markWatchedAction; QAction *aniDBLinkAction; + QAction *renameTestAction; }; #endif // MYLISTVIEW_H diff --git a/management-gui/renamesettingsdialog.cpp b/management-gui/renamesettingsdialog.cpp new file mode 100644 index 0000000..406fd82 --- /dev/null +++ b/management-gui/renamesettingsdialog.cpp @@ -0,0 +1,313 @@ +#include "renamesettingsdialog.h" +#include "ui_renamesettingsdialog.h" + +#include +#include +#include +#include +#include + +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; + } +} diff --git a/management-gui/renamesettingsdialog.h b/management-gui/renamesettingsdialog.h new file mode 100644 index 0000000..851386e --- /dev/null +++ b/management-gui/renamesettingsdialog.h @@ -0,0 +1,65 @@ +#ifndef RENAMESETTINGSDIALOG_H +#define RENAMESETTINGSDIALOG_H + +#include +#include + +namespace Ui { + class RenameSettingsDialog; +} + +class QAbstractButton; + +class RenameSettingsDialog : public QDialog +{ + Q_OBJECT + Q_PROPERTY(QString renameString READ renameString WRITE setRenameString) + +public: + explicit RenameSettingsDialog(QWidget *parent = 0); + ~RenameSettingsDialog(); + + QString renameString() const; + void setRenameString(const QString &renameString); + + QString renameEnv() const; + void setRenameEnv(const QString &renameEnv); + + bool filterResults() const; + void setFilterResults(bool filterResults); + + RenameParser::RenameEngine::ParserType parserType() const; + void setParserType(RenameParser::RenameEngine::ParserType parserType); + +public slots: + void setupEnvForFile(int fid); + void saveSettings(); + void restoreOriginalSettings(); + + void on_input_textChanged(); + void on_renameScript_textChanged(); + + void on_scriptLanguage_currentIndexChanged(); + +private slots: + void on_filterResultsCheckbox_toggled(); + + void on_buttonBox_clicked(QAbstractButton *button); + +private: + void updateResult(const RenameParser::Environment &env); + + Ui::RenameSettingsDialog *ui; + + + RenameParser::RenameEngine *environmentEngine; + RenameParser::RenameEngine *rulesEngine; + + RenameParser::Environment env; + + QString originalEnv; + RenameParser::RenameEngine::ParserType originalParserType; + QString originalScript; +}; + +#endif // RENAMESETTINGSDIALOG_H diff --git a/management-gui/renamesettingsdialog.ui b/management-gui/renamesettingsdialog.ui new file mode 100644 index 0000000..4107d85 --- /dev/null +++ b/management-gui/renamesettingsdialog.ui @@ -0,0 +1,182 @@ + + + RenameSettingsDialog + + + + 0 + 0 + 1029 + 678 + + + + Rename Script + + + + + + + + Input + + + + + + + DejaVu Sans Mono + + + + + + + + + + + Result + + + + + + + DejaVu Sans Mono + + + + true + + + + + + + Only show FileName and PathName + + + true + + + + + + + + + + + + Rename Script + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Script Language: + + + + + + + + + + + + + + + DejaVu Sans Mono + + + + + + + + + + + Status + + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Reset|QDialogButtonBox::RestoreDefaults|QDialogButtonBox::Save + + + + + + + + + buttonBox + accepted() + RenameSettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + RenameSettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + -- 2.52.0