From bf1bf7ad0b6cc62e5f66e3b41254a4b8e5e8eaa0 Mon Sep 17 00:00:00 2001 From: APTX Date: Wed, 1 Dec 2010 03:22:37 +0100 Subject: [PATCH] Moar files! --- AniAdd.pro | 15 ++- aniadd.cpp | 119 +++++++++++++++++++++ aniadd.h | 56 ++++++++++ filemodel.cpp | 207 ++++++++++++++++++++++++++++++++++++ filemodel.h | 57 ++++++++++ main.cpp | 12 +-- mainwindow.cpp | 53 +++++++++ mainwindow.h | 41 +++++++ mainwindow.ui | 121 +++++++++++++++++++++ qml/AniAdd/FileDelegate.qml | 31 ++++++ qml/AniAdd/main.qml | 88 ++++++++++++--- 11 files changed, 778 insertions(+), 22 deletions(-) create mode 100644 aniadd.cpp create mode 100644 aniadd.h create mode 100644 filemodel.cpp create mode 100644 filemodel.h create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui create mode 100644 qml/AniAdd/FileDelegate.qml diff --git a/AniAdd.pro b/AniAdd.pro index 65bb3af..53d4d09 100644 --- a/AniAdd.pro +++ b/AniAdd.pro @@ -32,8 +32,21 @@ symbian:TARGET.UID3 = 0xE49443EE # MOBILITY += # The .cpp file which was generated for your project. Feel free to hack it. -SOURCES += main.cpp +SOURCES += main.cpp \ + mainwindow.cpp \ + filemodel.cpp \ + aniadd.cpp # Please do not modify the following two lines. Required for deployment. include(qmlapplicationviewer/qmlapplicationviewer.pri) qtcAddDeployment() + +HEADERS += \ + mainwindow.h \ + filemodel.h \ + aniadd.h + +FORMS += \ + mainwindow.ui + +include(../../anidbudpclient/anidbudpclient.pri) diff --git a/aniadd.cpp b/aniadd.cpp new file mode 100644 index 0000000..caaa8bd --- /dev/null +++ b/aniadd.cpp @@ -0,0 +1,119 @@ +#include "aniadd.h" +#include "filemodel.h" + +#include +#include +#include + +#include "mainwindow.h" + +AniAdd::AniAdd(int &argc, char **argv) : + QApplication(argc, argv), gui(0) +{ + m_instance = this; + + model = new FileModel(this); + + loadSettings(); + + createGui(); +} + +AniAdd::~AniAdd() +{ + if (gui) + gui->hide(); + + saveSettings(); +// AniDBUdpClient::Client::destroy(); + + if (gui) + { + delete gui; + gui = 0; + } +} + +QString AniAdd::lastDirectory() const +{ + return m_lastDirectory; +} + +void AniAdd::setLastDirectory(const QString &lastDirectory) +{ + m_lastDirectory = lastDirectory; +} + +FileModel *AniAdd::fileModel() const +{ + return model; +} + +void AniAdd::addFiles() +{ + QStringList files = QFileDialog::getOpenFileNames(0, tr("Add Files.."), m_lastDirectory, QString(), 0, 0);//*/ QFileDialog::DontUseNativeDialog); + QFileInfoList list; + foreach (const QString &file, files) + { + list << file; + } + + if (list.isEmpty()) + return; + + m_lastDirectory = list.at(0).absoluteFilePath(); + + model->addFiles(list); +} +/* +void AniAdd::on_actionAddDirectories_triggered() +{ + QString dir = QFileDialog::getExistingDirectory(this, tr("Add Files.."), "."); + + model->addDirectory(dir); + ui->tableView->resizeColumnsToContents(); +} +*/ +void AniAdd::start() +{ + model->start(); +} + +void AniAdd::removeSelected() +{ +// model->removeItems(ui->tableView->selectionModel()->selectedIndexes()); +} + +void AniAdd::saveSettings() +{ + QSettings settings; + + settings.beginGroup("settings"); + settings.setValue("lastDirectory", m_lastDirectory); + settings.endGroup(); + +} + +void AniAdd::loadSettings() +{ + QSettings settings; + settings.beginGroup("settings"); + QString moviesDirectory = QDesktopServices::storageLocation(QDesktopServices::MoviesLocation); + if (!QDir(moviesDirectory).exists()) + moviesDirectory = "."; + m_lastDirectory = settings.value("lastDirectory", moviesDirectory).toString(); + settings.endGroup(); +} + +void AniAdd::createGui() +{ + gui = new MainWindow(); + gui->show(); +} + +AniAdd *AniAdd::m_instance = 0; + +AniAdd *AniAdd::instance() +{ + return m_instance; +} diff --git a/aniadd.h b/aniadd.h new file mode 100644 index 0000000..31e509d --- /dev/null +++ b/aniadd.h @@ -0,0 +1,56 @@ +#ifndef RENAMETOOL_H +#define RENAMETOOL_H + +#include + +class FileModel; +class MainWindow; + +class AniAdd : public QApplication +{ + Q_OBJECT + Q_PROPERTY(QString lastDirectory READ lastDirectory WRITE setLastDirectory); + Q_PROPERTY(FileModel *fileModel READ fileModel); + +public: + explicit AniAdd(int &argc, char **argv); + ~AniAdd(); + + QString lastDirectory() const; + void setLastDirectory(const QString &lastDirectory); + + FileModel *fileModel() const; + +signals: + +public slots: + void addFiles(); + void removeSelected(); + + void start(); + + //void on_actionAddDirectories_triggered(); + +private: + void saveSettings(); + void loadSettings(); + + void createGui(); + + QString m_lastDirectory; + + FileModel *model; + + MainWindow *gui; + + static AniAdd *m_instance; +public: + static AniAdd *instance(); +}; + +#ifdef qApp +# undef qApp +#endif +#define qApp AniAdd::instance() + +#endif // RENAMETOOL_H diff --git a/filemodel.cpp b/filemodel.cpp new file mode 100644 index 0000000..6716922 --- /dev/null +++ b/filemodel.cpp @@ -0,0 +1,207 @@ +#include "filemodel.h" + +FileModel::FileModel(QObject *parent) : QAbstractTableModel(parent) +{ + QHash roles; + roles[FileName] = "fileName"; + roles[HashingState] = "hashingState"; + roles[RenamingState] = "renamingState"; + roles[AddingState] = "addingState"; + roles[MarkingState] = "markingState"; + setRoleNames(roles); +} + +void FileModel::addFile(const QFileInfo &file) +{ + addFiles(QFileInfoList() << file); +} + +void FileModel::addFiles(const QFileInfoList &files) +{ + foreach (const QFileInfo &file, files) + { + AniDBUdpClient::File *f = new AniDBUdpClient::File(file); + + connect(f, SIGNAL(statusUpdate(AniDBUdpClient::File::Action,AniDBUdpClient::File::ActionState)), this, SLOT(updateState())); + + this->files << f; + } + reset(); +} + +void FileModel::addDirectory(const QDir &directory) +{ + addDirectories(QList() << directory); +} + +void FileModel::addDirectories(const QList &directories) +{ + foreach (const QDir &directory, directories) + { + addFiles(directory.entryInfoList(QDir::Files | QDir::NoDotAndDotDot)); + } +} + +void FileModel::removeItems(const QModelIndexList &items) +{ + QModelIndexList sorted = items; + qSort(sorted); + + for (QModelIndexList::const_iterator i = sorted.constEnd()-1; i != sorted.constBegin(); --i) + { + files.removeAt(i->row()); + } + files.removeAt(sorted[0].row()); + reset(); +} + +void FileModel::start() +{ + foreach (AniDBUdpClient::File *file, files) + { + file->rename(); + file->addToMyList(); + } +} + +int FileModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return files.count(); +} + +int FileModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return 5; +} + +QVariant FileModel::data(const QModelIndex &index, int role) const +{ + AniDBUdpClient::File *f = files[index.row()]; + + switch (index.column()) + { + case 0: + switch (role) + { + case Qt::DisplayRole: + case FileName: + return f->file().fileName(); + break; + case HashingState: + return f->hashingState(); + break; + case RenamingState: + return f->renamingState(); + break; + case AddingState: + return f->addingState(); + break; + case MarkingState: + return f->markingState(); + break; + default: + return QVariant(); + break; + } + break; + case 1: + return getDescForActionState(f->hashingState(), role); + break; + case 2: + return getDescForActionState(f->renamingState(), role); + break; + case 3: + return getDescForActionState(f->addingState(), role); + break; + case 4: + return getDescForActionState(f->markingState(), role); + break; + default: + break; + } + return QVariant(); +} + +QVariant FileModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + + if (orientation == Qt::Vertical) + return section + 1; + + switch (section) + { + case 0: + return tr("File Name"); + case 1: + return tr("Hashing"); + case 2: + return tr("Renaming"); + case 3: + return tr("Adding"); + case 4: + return tr("Marking"); + default: + break; + } + return QVariant(); +} + +void FileModel::updateState() +{ + using AniDBUdpClient::File; + + File *file = qobject_cast(sender()); + if (!file) + return; + + int i = files.indexOf(file); + + if (i == -1) + return; + + emit dataChanged(index(i, 0), index(i, columnCount())); + +} + +QVariant FileModel::getDescForActionState(AniDBUdpClient::File::ActionState actionState, int role) const +{ + using AniDBUdpClient::File; + + if (role == Qt::DisplayRole) + { + switch (actionState) + { + case File::NotStarted: + return tr("Not started/queued"); + case File::InProgress: + return tr("In Progress"); + case File::Success: + return tr("Finished"); + case File::Failure: + return tr("Failed"); + default: + return tr("Unknown"); + } + } + else if (role == Qt::BackgroundColorRole) + { + switch (actionState) + { + case File::NotStarted: + return QVariant(); + case File::InProgress: + return Qt::yellow; + case File::Success: + return Qt::green; + case File::Failure: + return Qt::red; + default: + return QVariant(); + } + } + return QVariant(); +} diff --git a/filemodel.h b/filemodel.h new file mode 100644 index 0000000..cb76ffb --- /dev/null +++ b/filemodel.h @@ -0,0 +1,57 @@ +#ifndef FILEMODEL_H +#define FILEMODEL_H + +#include +#include +#include + +#include + +class FileModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + enum Roles + { + FileName = Qt::UserRole + 1, + HashingState, + RenamingState, + AddingState, + MarkingState + }; + + FileModel(QObject *parent = 0); + +public slots: + void addFile(const QFileInfo &file); + void addFiles(const QFileInfoList &files); + + void addDirectory(const QDir &directory); + void addDirectories(const QList &directories); + + void removeItems(const QModelIndexList &items); + + void start(); + +protected: + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; +/* + bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); + bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); +*/ +private slots: + void updateState(); + +private: + QVariant getDescForActionState(AniDBUdpClient::File::ActionState actionState, int role) const; + QList files; + QMap progressDetails; +}; + +#endif // FILEMODEL_H diff --git a/main.cpp b/main.cpp index 046fc94..3847f2f 100644 --- a/main.cpp +++ b/main.cpp @@ -1,14 +1,8 @@ -#include -#include "qmlapplicationviewer.h" +#include "aniadd.h" int main(int argc, char *argv[]) { - QApplication app(argc, argv); + AniAdd app(argc, argv); - QmlApplicationViewer viewer; - viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); - viewer.setMainQmlFile(QLatin1String("qml/AniAdd/main.qml")); - viewer.showExpanded(); - - return app.exec(); + return app.exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..328914f --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,53 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +#include + +#include "aniadd.h" +#include "filemodel.h" + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + + QDeclarativeContext *ctxt = ui->declarativeView->rootContext(); + + ctxt->setContextProperty("renameTool", qApp); +// ctxt->setContextProperty("fileModel", qApp->fileModel()); + + //ui->declarativeView->setSource(QUrl("qrc:/qml/main.qml")); + ui->declarativeView->setSource(QUrl("qml/AniAdd/main.qml")); + ui->declarativeView->setResizeMode(QDeclarativeView::SizeRootObjectToView); + + + connect(ui->actionQuit, SIGNAL(triggered()), qApp, SLOT(quit())); + +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::on_actionAddFiles_triggered() +{ + qApp->addFiles(); +} + +void MainWindow::on_actionAddDirectories_triggered() +{ + // +} + +void MainWindow::on_actionStart_triggered() +{ + qApp->fileModel()->start(); +} + +void MainWindow::on_actionRemoveSelectedFiles_triggered() +{ + //model->removeItems(ui->tableView->selectionModel()->selectedIndexes()); +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..818a6ee --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,41 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +namespace Ui { + class MainWindow; +} + +class FileModel; +class AniAdd; + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +private slots: + void on_actionAddFiles_triggered(); + void on_actionAddDirectories_triggered(); + + void on_actionStart_triggered(); + + void on_actionRemoveSelectedFiles_triggered(); + +private: + void saveSettings(); + void loadSettings(); + + QString lastDirectory; + + FileModel *model; + AniAdd *aniAdd; + + Ui::MainWindow *ui; +}; + +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..28a48b3 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,121 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + 0 + + + 0 + + + + + + + + + + 0 + 0 + 800 + 21 + + + + + &File + + + + + + + + + &Help + + + + + + &Actions + + + + + + + + + + + + + Add &Files... + + + Ctrl+O + + + + + Add &Directories... + + + Ctrl+Shift+O + + + + + &Quit + + + Ctrl+Q + + + + + About AniAdd + + + + + Start + + + Ctrl+S + + + + + Remove Selected Files + + + Del + + + + + + QDeclarativeView + QGraphicsView +
QtDeclarative/QDeclarativeView
+
+
+ + +
diff --git a/qml/AniAdd/FileDelegate.qml b/qml/AniAdd/FileDelegate.qml new file mode 100644 index 0000000..27cf382 --- /dev/null +++ b/qml/AniAdd/FileDelegate.qml @@ -0,0 +1,31 @@ +import Qt 4.7 + +Rectangle { + radius: 20 + + border.width: 0 + border.color: "#000000" + opacity: 0.74 + gradient: Gradient { + GradientStop { + position: 0 + color: "#ffffff" + } + GradientStop { + position: 0.85 + color: "#ababab" + } + GradientStop { + position: 1 + color: "#ffffff" + } + } + + Column { + anchors.fill: parent + Text { + text: "Test" + fileName + } + } + +} diff --git a/qml/AniAdd/main.qml b/qml/AniAdd/main.qml index 4ef3a88..fd1d249 100644 --- a/qml/AniAdd/main.qml +++ b/qml/AniAdd/main.qml @@ -1,16 +1,80 @@ import Qt 4.7 Rectangle { - width: 360 - height: 360 - Text { - text: "Hello World" - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - Qt.quit(); - } - } + id: main + + width: 600; height: 400 + color: "#b7e0ff" + + SystemPalette { id: activePalette } + + ListModel { + id: testModel + + ListElement + { + fileName: "Kaichou wa Maid-sama! - 18 - Even the Maid`s a Footman - [FFFpeeps](40cef62d).mkv" + + hashProgress: 20 + hashingState: 1 + renamingState: 1 + addingState: 2 + } + + ListElement + { + fileName: "K-On!! - 07 - Tea Party! - [CoalGuys](f58a5866).mkv" + + hashProgress: 0 + hashingState: 0 + renamingState: 0 + addingState: 0 + } + + ListElement + { + fileName: "Mayoi Neko Overrun! - 11 - The Stray Cats Fell Apart - [Ryuumaru](62a47da4).mkv" + + hashProgress: 100 + hashingState: 1 + renamingState: 1 + addingState: 1 + } + } + + Image { + id: bgCharImage + source: "images/bgchar.png" + + property variant maxHeight: 1024 + + function calcX() + { + var x = parent.width - bgCharImage.width; + var offset = -200; + return x < offset ? offset : x + } + + function calcY() + { + var y = parent.height - bgCharImage.height; + var offset = -200; + return y < offset ? offset : y + } + + sourceSize.width: maxHeight * 0.625521268 + sourceSize.height: maxHeight + + + x: calcX() + y: calcY() + } + + ListView { + id: listView + anchors.fill: parent + model: testModel + delegate: FileDelegate + } + } -- 2.52.0