diff --git a/res/resources.qrc b/res/resources.qrc index fb0898d..f2b9e50 100644 --- a/res/resources.qrc +++ b/res/resources.qrc @@ -2,7 +2,14 @@ icons/movie.ico + buttons/accept.png buttons/add.png + buttons/clock_pause.png buttons/door_in.png + buttons/error.png + buttons/exclamation.png + buttons/find.png + buttons/lightning.png + buttons/play.png diff --git a/src/model_jobList.cpp b/src/model_jobList.cpp index 5f456db..e1c9224 100644 --- a/src/model_jobList.cpp +++ b/src/model_jobList.cpp @@ -22,6 +22,8 @@ #include "model_jobList.h" #include "thread_encode.h" +#include + JobListModel::JobListModel(void) { } @@ -92,6 +94,9 @@ QVariant JobListModel::data(const QModelIndex &index, int role) const case 1: switch(m_status.value(m_jobs.at(index.row()))) { + case EncodeThread::JobStatus_Enqueued: + return QVariant::fromValue(tr("Enqueued.")); + break; case EncodeThread::JobStatus_Starting: return QVariant::fromValue(tr("Starting...")); break; @@ -124,6 +129,39 @@ QVariant JobListModel::data(const QModelIndex &index, int role) const } } } + else if(role == Qt::DecorationRole) + { + if(index.row() >= 0 && index.row() < m_jobs.count() && index.column() == 0) + { + switch(m_status.value(m_jobs.at(index.row()))) + { + case EncodeThread::JobStatus_Enqueued: + return QIcon(":/buttons/clock_pause.png"); + break; + case EncodeThread::JobStatus_Starting: + return QIcon(":/buttons/lightning.png"); + break; + case EncodeThread::JobStatus_Indexing: + return QIcon(":/buttons/find.png"); + break; + case EncodeThread::JobStatus_Running: + return QIcon(":/buttons/play.png"); + break; + case EncodeThread::JobStatus_Completed: + return QIcon(":/buttons/accept.png"); + break; + case EncodeThread::JobStatus_Failed: + return QIcon(":/buttons/exclamation.png"); + break; + case EncodeThread::JobStatus_Aborted: + return QIcon(":/buttons/error.png"); + break; + default: + return QVariant(); + break; + } + } + } return QVariant(); } @@ -135,25 +173,36 @@ QVariant JobListModel::data(const QModelIndex &index, int role) const bool JobListModel::insertJob(EncodeThread *thread) { QUuid id = thread->getId(); + LogFileModel *logFile = NULL; if(m_jobs.contains(id)) { return false; } - + beginInsertRows(QModelIndex(), m_jobs.count(), m_jobs.count()); m_jobs.append(id); - m_status.insert(id, EncodeThread::JobStatus_Starting); + m_status.insert(id, EncodeThread::JobStatus_Enqueued); m_progress.insert(id, 0); m_threads.insert(id, thread); + m_logFile.insert(id, (logFile = new LogFileModel)); endInsertRows(); connect(thread, SIGNAL(statusChanged(QUuid, EncodeThread::JobStatus)), this, SLOT(updateStatus(QUuid, EncodeThread::JobStatus)), Qt::QueuedConnection); connect(thread, SIGNAL(progressChanged(QUuid, unsigned int)), this, SLOT(updateProgress(QUuid, unsigned int)), Qt::QueuedConnection); - + connect(thread, SIGNAL(messageLogged(QUuid, QString)), logFile, SLOT(addLogMessage(QUuid, QString)), Qt::QueuedConnection); + return true; } +LogFileModel *JobListModel::getLogFile(const QModelIndex &index) +{ + if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count()) + { + return m_logFile.value(m_jobs.at(index.row())); + } +} + /////////////////////////////////////////////////////////////////////////////// // Slots /////////////////////////////////////////////////////////////////////////////// @@ -165,7 +214,7 @@ void JobListModel::updateStatus(const QUuid &jobId, EncodeThread::JobStatus newS if((index = m_jobs.indexOf(jobId)) >= 0) { m_status.insert(jobId, newStatus); - emit dataChanged(createIndex(index, 1), createIndex(index, 1)); + emit dataChanged(createIndex(index, 0), createIndex(index, 1)); } } @@ -179,7 +228,3 @@ void JobListModel::updateProgress(const QUuid &jobId, unsigned int newProgress) emit dataChanged(createIndex(index, 2), createIndex(index, 2)); } } - -void JobListModel::addLogMessage(const QUuid &jobId, const QString &text) -{ -} diff --git a/src/model_jobList.h b/src/model_jobList.h index c4fbc27..bd41835 100644 --- a/src/model_jobList.h +++ b/src/model_jobList.h @@ -22,6 +22,7 @@ #pragma once #include "thread_encode.h" +#include "model_logFile.h" #include "QAbstractItemModel" #include @@ -44,15 +45,16 @@ public: virtual QVariant data(const QModelIndex &index, int role) const; bool JobListModel::insertJob(EncodeThread *thread); + LogFileModel *getLogFile(const QModelIndex &index); protected: QList m_jobs; QMap m_threads; QMap m_status; QMap m_progress; + QMap m_logFile; public slots: void updateStatus(const QUuid &jobId, EncodeThread::JobStatus newStatus); void updateProgress(const QUuid &jobId, unsigned int newProgress); - void addLogMessage(const QUuid &jobId, const QString &text); }; diff --git a/src/model_logFile.cpp b/src/model_logFile.cpp new file mode 100644 index 0000000..4d96bb3 --- /dev/null +++ b/src/model_logFile.cpp @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////// +// Simple x264 Launcher +// Copyright (C) 2004-2012 LoRd_MuldeR +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// http://www.gnu.org/licenses/gpl-2.0.txt +/////////////////////////////////////////////////////////////////////////////// + +#include "model_logFile.h" +#include "thread_encode.h" + +#include + +LogFileModel::LogFileModel(void) +{ +} + +LogFileModel::~LogFileModel(void) +{ +} + +/////////////////////////////////////////////////////////////////////////////// +// Model interface +/////////////////////////////////////////////////////////////////////////////// + +int LogFileModel::columnCount(const QModelIndex &parent) const +{ + return 1; +} + +int LogFileModel::rowCount(const QModelIndex &parent) const +{ + return m_lines.count(); +} + +QVariant LogFileModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + return QVariant(); +} + +QModelIndex LogFileModel::index(int row, int column, const QModelIndex &parent) const +{ + return createIndex(row, column, NULL); +} + +QModelIndex LogFileModel::parent(const QModelIndex &index) const +{ + return QModelIndex(); +} + +QVariant LogFileModel::data(const QModelIndex &index, int role) const +{ + if(role == Qt::DisplayRole) + { + if(index.row() >= 0 && index.row() < m_lines.count() && index.column() == 0) + { + return m_lines.at(index.row()); + } + } + + return QVariant(); +} + +/////////////////////////////////////////////////////////////////////////////// +// Slots +/////////////////////////////////////////////////////////////////////////////// + +void LogFileModel::addLogMessage(const QUuid &jobId, const QString &text) +{ + beginInsertRows(QModelIndex(), m_lines.count(), m_lines.count()); + m_lines.append(text); + endInsertRows(); +} diff --git a/src/model_logFile.h b/src/model_logFile.h new file mode 100644 index 0000000..3c3af17 --- /dev/null +++ b/src/model_logFile.h @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Simple x264 Launcher +// Copyright (C) 2004-2012 LoRd_MuldeR +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// http://www.gnu.org/licenses/gpl-2.0.txt +/////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "thread_encode.h" + +#include "QAbstractItemModel" +#include +#include +#include + +class LogFileModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + LogFileModel(void); + ~LogFileModel(void); + + virtual int columnCount(const QModelIndex &parent) const; + virtual int rowCount(const QModelIndex &parent) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; + virtual QModelIndex index(int row, int column, const QModelIndex &parent) const; + virtual QModelIndex parent (const QModelIndex &index) const; + virtual QVariant data(const QModelIndex &index, int role) const; + +protected: + QStringList m_lines; + +public slots: + void addLogMessage(const QUuid &jobId, const QString &text); +}; diff --git a/src/thread_encode.cpp b/src/thread_encode.cpp index a0be231..ea2801e 100644 --- a/src/thread_encode.cpp +++ b/src/thread_encode.cpp @@ -20,6 +20,7 @@ /////////////////////////////////////////////////////////////////////////////// #include "thread_encode.h" +#include "global.h" EncodeThread::EncodeThread(void) : @@ -37,4 +38,33 @@ EncodeThread::~EncodeThread(void) void EncodeThread::run(void) { + try + { + encode(); + } + catch(char *msg) + { + emit messageLogged(m_jobId, QString("EXCEPTION ERROR: ").append(QString::fromLatin1(msg))); + } + catch(...) + { + emit messageLogged(m_jobId, QString("EXCEPTION ERROR !!!")); + } +} + +void EncodeThread::encode(void) +{ + Sleep(1500); + + for(int i = 0; i <= 100; i++) + { + emit progressChanged(m_jobId, i); + emit statusChanged(m_jobId, (i % 2) ? JobStatus_Indexing : JobStatus_Running); + Sleep(200); + emit messageLogged(m_jobId, QUuid::createUuid().toString()); + } + + Sleep(1500); + + emit statusChanged(m_jobId, JobStatus_Completed); } diff --git a/src/thread_encode.h b/src/thread_encode.h index 4932312..ce3a35a 100644 --- a/src/thread_encode.h +++ b/src/thread_encode.h @@ -31,12 +31,13 @@ class EncodeThread : public QThread public: enum JobStatus { - JobStatus_Starting = 0, - JobStatus_Indexing = 1, - JobStatus_Running = 2, - JobStatus_Completed = 3, - JobStatus_Failed = 4, - JobStatus_Aborted = 5 + JobStatus_Enqueued = 0, + JobStatus_Starting = 1, + JobStatus_Indexing = 2, + JobStatus_Running = 3, + JobStatus_Completed = 4, + JobStatus_Failed = 5, + JobStatus_Aborted = 6 }; EncodeThread(void); @@ -48,6 +49,7 @@ protected: const QUuid m_jobId; virtual void run(void); + void encode(void); signals: void statusChanged(const QUuid &jobId, EncodeThread::JobStatus newStatus); diff --git a/src/win_main.cpp b/src/win_main.cpp index f9c3520..fba097d 100644 --- a/src/win_main.cpp +++ b/src/win_main.cpp @@ -25,6 +25,7 @@ #include "model_jobList.h" #include +#include /////////////////////////////////////////////////////////////////////////////// // Constructor & Destructor @@ -57,6 +58,7 @@ MainWindow::MainWindow(void) jobsView->horizontalHeader()->resizeSection(1, 150); jobsView->horizontalHeader()->resizeSection(2, 90); jobsView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); + connect(jobsView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(jobSelected(QModelIndex, QModelIndex))); //Enable buttons connect(buttonAddJob, SIGNAL(clicked()), this, SLOT(addButtonPressed())); @@ -72,8 +74,15 @@ MainWindow::~MainWindow(void) void MainWindow::addButtonPressed(void) { - qWarning("Yeah!"); - EncodeThread *thrd = new EncodeThread(); m_jobList->insertJob(thrd); + + QTimer::singleShot(2500, thrd, SLOT(start())); +} + +void MainWindow::jobSelected(const QModelIndex & current, const QModelIndex & previous) +{ + qDebug("Job selected: %d", current.row()); + logView->setModel(m_jobList->getLogFile(current)); + logView->scrollToBottom(); } diff --git a/src/win_main.h b/src/win_main.h index 3d4b9b8..715b9d9 100644 --- a/src/win_main.h +++ b/src/win_main.h @@ -38,4 +38,5 @@ private: private slots: void addButtonPressed(void); + void jobSelected(const QModelIndex & current, const QModelIndex & previous); }; diff --git a/x264_launcher.vcxproj b/x264_launcher.vcxproj index 5a37b87..32086ed 100644 --- a/x264_launcher.vcxproj +++ b/x264_launcher.vcxproj @@ -129,6 +129,14 @@ $(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs) $(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs) + + "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)" + "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)" + MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp" + MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp" + $(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs) + $(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs) + @@ -142,11 +150,13 @@ + + diff --git a/x264_launcher.vcxproj.filters b/x264_launcher.vcxproj.filters index 110f120..6ae9124 100644 --- a/x264_launcher.vcxproj.filters +++ b/x264_launcher.vcxproj.filters @@ -62,6 +62,12 @@ Generated Files + + Source Files + + + Generated Files + @@ -79,5 +85,8 @@ Header Files + + Header Files + \ No newline at end of file