From: APTX Date: Wed, 1 Dec 2010 02:22:37 +0000 (+0100) Subject: Moar files! X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=bf1bf7ad0b6cc62e5f66e3b41254a4b8e5e8eaa0;p=AniAdd.git Moar files! --- 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 + } + }