Show progress and progress details in main window!
110
gui/win_main.ui
@ -15,6 +15,26 @@
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QProgressBar" name="progressBar">
|
||||
<property name="value">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_2">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::HLine</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
@ -24,6 +44,9 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<widget class="QTableView" name="jobsView">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
</property>
|
||||
@ -46,7 +69,36 @@
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QListView" name="logView"/>
|
||||
<widget class="QListView" name="logView">
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Lucida Console</family>
|
||||
</font>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="editDetails">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::HLine</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@ -81,6 +133,46 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="buttonStartJob">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>104</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Start Job</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../res/resources.qrc">
|
||||
<normaloff>:/buttons/play_big.png</normaloff>:/buttons/play_big.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="buttonAbortJob">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>104</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Abort Job</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../res/resources.qrc">
|
||||
<normaloff>:/buttons/cancel.png</normaloff>:/buttons/cancel.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
@ -100,7 +192,14 @@
|
||||
</property>
|
||||
<addaction name="actionExit"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu">
|
||||
<property name="title">
|
||||
<string>?</string>
|
||||
</property>
|
||||
<addaction name="actionAbout"/>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menu"/>
|
||||
</widget>
|
||||
<action name="actionExit">
|
||||
<property name="icon">
|
||||
@ -111,6 +210,15 @@
|
||||
<string>Exit</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAbout">
|
||||
<property name="icon">
|
||||
<iconset resource="../res/resources.qrc">
|
||||
<normaloff>:/buttons/information.png</normaloff>:/buttons/information.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>About</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../res/resources.qrc"/>
|
||||
|
BIN
res/buttons/accept.png
Normal file
After Width: | Height: | Size: 781 B |
BIN
res/buttons/add.png
Normal file
After Width: | Height: | Size: 733 B |
BIN
res/buttons/cancel.png
Normal file
After Width: | Height: | Size: 587 B |
BIN
res/buttons/clock_pause.png
Normal file
After Width: | Height: | Size: 927 B |
BIN
res/buttons/clock_stop.png
Normal file
After Width: | Height: | Size: 922 B |
BIN
res/buttons/door_in.png
Normal file
After Width: | Height: | Size: 693 B |
BIN
res/buttons/error.png
Normal file
After Width: | Height: | Size: 666 B |
BIN
res/buttons/exclamation.png
Normal file
After Width: | Height: | Size: 701 B |
BIN
res/buttons/find.png
Normal file
After Width: | Height: | Size: 659 B |
BIN
res/buttons/information.png
Normal file
After Width: | Height: | Size: 778 B |
BIN
res/buttons/lightning.png
Normal file
After Width: | Height: | Size: 634 B |
BIN
res/buttons/play.png
Normal file
After Width: | Height: | Size: 663 B |
BIN
res/buttons/play_big.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
@ -4,12 +4,16 @@
|
||||
<file>icons/movie.ico</file>
|
||||
<file>buttons/accept.png</file>
|
||||
<file>buttons/add.png</file>
|
||||
<file>buttons/cancel.png</file>
|
||||
<file>buttons/clock_pause.png</file>
|
||||
<file>buttons/clock_stop.png</file>
|
||||
<file>buttons/door_in.png</file>
|
||||
<file>buttons/error.png</file>
|
||||
<file>buttons/exclamation.png</file>
|
||||
<file>buttons/find.png</file>
|
||||
<file>buttons/information.png</file>
|
||||
<file>buttons/lightning.png</file>
|
||||
<file>buttons/play.png</file>
|
||||
<file>buttons/play_big.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -20,6 +20,7 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "model_jobList.h"
|
||||
#include "global.h"
|
||||
#include "thread_encode.h"
|
||||
|
||||
#include <QIcon>
|
||||
@ -30,6 +31,11 @@ JobListModel::JobListModel(void)
|
||||
|
||||
JobListModel::~JobListModel(void)
|
||||
{
|
||||
while(!m_jobs.isEmpty())
|
||||
{
|
||||
EncodeThread *thrd = m_threads.value(m_jobs.takeFirst(), NULL);
|
||||
X264_DELETE(thrd);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -38,7 +44,7 @@ JobListModel::~JobListModel(void)
|
||||
|
||||
int JobListModel::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
return 3;
|
||||
return 4;
|
||||
}
|
||||
|
||||
int JobListModel::rowCount(const QModelIndex &parent) const
|
||||
@ -61,6 +67,9 @@ QVariant JobListModel::headerData(int section, Qt::Orientation orientation, int
|
||||
case 2:
|
||||
return QVariant::fromValue<QString>(tr("Progress"));
|
||||
break;
|
||||
case 3:
|
||||
return QVariant::fromValue<QString>(tr("Progress Details"));
|
||||
break;
|
||||
default:
|
||||
return QVariant();
|
||||
break;
|
||||
@ -112,6 +121,9 @@ QVariant JobListModel::data(const QModelIndex &index, int role) const
|
||||
case EncodeThread::JobStatus_Failed:
|
||||
return QVariant::fromValue<QString>(tr("Failed!"));
|
||||
break;
|
||||
case EncodeThread::JobStatus_Aborting:
|
||||
return QVariant::fromValue<QString>(tr("Aborting..."));
|
||||
break;
|
||||
case EncodeThread::JobStatus_Aborted:
|
||||
return QVariant::fromValue<QString>(tr("Aborted!"));
|
||||
break;
|
||||
@ -123,6 +135,9 @@ QVariant JobListModel::data(const QModelIndex &index, int role) const
|
||||
case 2:
|
||||
return QString().sprintf("%d%%", m_progress.value(m_jobs.at(index.row())));
|
||||
break;
|
||||
case 3:
|
||||
return m_details.value(m_jobs.at(index.row()));
|
||||
break;
|
||||
default:
|
||||
return QVariant();
|
||||
break;
|
||||
@ -153,6 +168,9 @@ QVariant JobListModel::data(const QModelIndex &index, int role) const
|
||||
case EncodeThread::JobStatus_Failed:
|
||||
return QIcon(":/buttons/exclamation.png");
|
||||
break;
|
||||
case EncodeThread::JobStatus_Aborting:
|
||||
return QIcon(":/buttons/clock_stop.png");
|
||||
break;
|
||||
case EncodeThread::JobStatus_Aborted:
|
||||
return QIcon(":/buttons/error.png");
|
||||
break;
|
||||
@ -170,14 +188,14 @@ QVariant JobListModel::data(const QModelIndex &index, int role) const
|
||||
// Public interface
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool JobListModel::insertJob(EncodeThread *thread)
|
||||
QModelIndex JobListModel::insertJob(EncodeThread *thread)
|
||||
{
|
||||
QUuid id = thread->getId();
|
||||
LogFileModel *logFile = NULL;
|
||||
|
||||
if(m_jobs.contains(id))
|
||||
{
|
||||
return false;
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
beginInsertRows(QModelIndex(), m_jobs.count(), m_jobs.count());
|
||||
@ -186,13 +204,48 @@ bool JobListModel::insertJob(EncodeThread *thread)
|
||||
m_progress.insert(id, 0);
|
||||
m_threads.insert(id, thread);
|
||||
m_logFile.insert(id, (logFile = new LogFileModel));
|
||||
m_details.insert(id, tr("Not started yet."));
|
||||
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);
|
||||
connect(thread, SIGNAL(detailsChanged(QUuid, QString)), this, SLOT(updateDetails(QUuid, QString)), Qt::QueuedConnection);
|
||||
|
||||
return true;
|
||||
return createIndex(m_jobs.count() - 1, 0, NULL);
|
||||
}
|
||||
|
||||
bool JobListModel::startJob(const QModelIndex &index)
|
||||
{
|
||||
if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
|
||||
{
|
||||
QUuid id = m_jobs.at(index.row());
|
||||
if(m_status.value(id) == EncodeThread::JobStatus_Enqueued)
|
||||
{
|
||||
updateStatus(id, EncodeThread::JobStatus_Starting);
|
||||
updateDetails(id, tr("Starting up, please wait..."));
|
||||
m_threads.value(id)->start();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool JobListModel::abortJob(const QModelIndex &index)
|
||||
{
|
||||
if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
|
||||
{
|
||||
QUuid id = m_jobs.at(index.row());
|
||||
if(m_status.value(id) == EncodeThread::JobStatus_Indexing || m_status.value(id) == EncodeThread::JobStatus_Running)
|
||||
{
|
||||
updateStatus(id, EncodeThread::JobStatus_Aborting);
|
||||
m_threads.value(id)->abortJob();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
LogFileModel *JobListModel::getLogFile(const QModelIndex &index)
|
||||
@ -201,6 +254,38 @@ LogFileModel *JobListModel::getLogFile(const QModelIndex &index)
|
||||
{
|
||||
return m_logFile.value(m_jobs.at(index.row()));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EncodeThread::JobStatus JobListModel::getJobStatus(const QModelIndex &index)
|
||||
{
|
||||
if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
|
||||
{
|
||||
return m_status.value(m_jobs.at(index.row()));
|
||||
}
|
||||
|
||||
return static_cast<EncodeThread::JobStatus>(-1);
|
||||
}
|
||||
|
||||
unsigned int JobListModel::getJobProgress(const QModelIndex &index)
|
||||
{
|
||||
if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
|
||||
{
|
||||
return m_progress.value(m_jobs.at(index.row()));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
QModelIndex JobListModel::getJobIndexById(const QUuid &id)
|
||||
{
|
||||
if(m_jobs.contains(id))
|
||||
{
|
||||
return createIndex(m_jobs.indexOf(id), 0);
|
||||
}
|
||||
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -228,3 +313,14 @@ void JobListModel::updateProgress(const QUuid &jobId, unsigned int newProgress)
|
||||
emit dataChanged(createIndex(index, 2), createIndex(index, 2));
|
||||
}
|
||||
}
|
||||
|
||||
void JobListModel::updateDetails(const QUuid &jobId, const QString &details)
|
||||
{
|
||||
int index = -1;
|
||||
|
||||
if((index = m_jobs.indexOf(jobId)) >= 0)
|
||||
{
|
||||
m_details.insert(jobId, details);
|
||||
emit dataChanged(createIndex(index, 3), createIndex(index, 3));
|
||||
}
|
||||
}
|
||||
|
@ -44,8 +44,13 @@ public:
|
||||
virtual QModelIndex parent (const QModelIndex &index) const;
|
||||
virtual QVariant data(const QModelIndex &index, int role) const;
|
||||
|
||||
bool JobListModel::insertJob(EncodeThread *thread);
|
||||
QModelIndex insertJob(EncodeThread *thread);
|
||||
bool startJob(const QModelIndex &index);
|
||||
bool abortJob(const QModelIndex &index);
|
||||
LogFileModel *getLogFile(const QModelIndex &index);
|
||||
EncodeThread::JobStatus getJobStatus(const QModelIndex &index);
|
||||
unsigned int getJobProgress(const QModelIndex &index);
|
||||
QModelIndex getJobIndexById(const QUuid &id);
|
||||
|
||||
protected:
|
||||
QList<QUuid> m_jobs;
|
||||
@ -53,8 +58,10 @@ protected:
|
||||
QMap<QUuid, EncodeThread::JobStatus> m_status;
|
||||
QMap<QUuid, unsigned int> m_progress;
|
||||
QMap<QUuid, LogFileModel*> m_logFile;
|
||||
QMap<QUuid, QString> m_details;
|
||||
|
||||
public slots:
|
||||
void updateStatus(const QUuid &jobId, EncodeThread::JobStatus newStatus);
|
||||
void updateProgress(const QUuid &jobId, unsigned int newProgress);
|
||||
void updateDetails(const QUuid &jobId, const QString &details);
|
||||
};
|
||||
|
@ -26,6 +26,7 @@ EncodeThread::EncodeThread(void)
|
||||
:
|
||||
m_jobId(QUuid::createUuid())
|
||||
{
|
||||
m_abort = false;
|
||||
}
|
||||
|
||||
EncodeThread::~EncodeThread(void)
|
||||
@ -60,8 +61,20 @@ void EncodeThread::encode(void)
|
||||
{
|
||||
emit progressChanged(m_jobId, i);
|
||||
emit statusChanged(m_jobId, (i % 2) ? JobStatus_Indexing : JobStatus_Running);
|
||||
Sleep(200);
|
||||
emit messageLogged(m_jobId, QUuid::createUuid().toString());
|
||||
|
||||
for(int i = 0; i < 5; i++)
|
||||
{
|
||||
emit detailsChanged(m_jobId, QUuid::createUuid().toString());
|
||||
Sleep(200);
|
||||
}
|
||||
|
||||
if(m_abort)
|
||||
{
|
||||
Sleep(1500);
|
||||
emit statusChanged(m_jobId, JobStatus_Aborted);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Sleep(1500);
|
||||
|
@ -37,16 +37,19 @@ public:
|
||||
JobStatus_Running = 3,
|
||||
JobStatus_Completed = 4,
|
||||
JobStatus_Failed = 5,
|
||||
JobStatus_Aborted = 6
|
||||
JobStatus_Aborting = 6,
|
||||
JobStatus_Aborted = 7
|
||||
};
|
||||
|
||||
EncodeThread(void);
|
||||
~EncodeThread(void);
|
||||
|
||||
QUuid getId(void) { return this->m_jobId; };
|
||||
void abortJob(void) { m_abort = true; }
|
||||
|
||||
protected:
|
||||
const QUuid m_jobId;
|
||||
volatile bool m_abort;
|
||||
|
||||
virtual void run(void);
|
||||
void encode(void);
|
||||
@ -55,5 +58,6 @@ signals:
|
||||
void statusChanged(const QUuid &jobId, EncodeThread::JobStatus newStatus);
|
||||
void progressChanged(const QUuid &jobId, unsigned int newProgress);
|
||||
void messageLogged(const QUuid &jobId, const QString &text);
|
||||
void detailsChanged(const QUuid &jobId, const QString &details);
|
||||
};
|
||||
|
||||
|
130
src/win_main.cpp
@ -26,6 +26,8 @@
|
||||
|
||||
#include <QDate>
|
||||
#include <QTimer>
|
||||
#include <QCloseEvent>
|
||||
#include <QMessageBox>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Constructor & Destructor
|
||||
@ -49,9 +51,11 @@ MainWindow::MainWindow(void)
|
||||
|
||||
//Create model
|
||||
m_jobList = new JobListModel();
|
||||
connect(m_jobList, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(jobChangedData(QModelIndex, QModelIndex)));
|
||||
jobsView->setModel(m_jobList);
|
||||
|
||||
//Setup view
|
||||
jobsView->horizontalHeader()->setSectionHidden(3, true);
|
||||
jobsView->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
|
||||
jobsView->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
|
||||
jobsView->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);
|
||||
@ -62,10 +66,16 @@ MainWindow::MainWindow(void)
|
||||
|
||||
//Enable buttons
|
||||
connect(buttonAddJob, SIGNAL(clicked()), this, SLOT(addButtonPressed()));
|
||||
connect(buttonStartJob, SIGNAL(clicked()), this, SLOT(startButtonPressed()));
|
||||
connect(buttonAbortJob, SIGNAL(clicked()), this, SLOT(abortButtonPressed()));
|
||||
|
||||
//Enable menu
|
||||
connect(actionAbout, SIGNAL(triggered()), this, SLOT(showAbout()));
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow(void)
|
||||
{
|
||||
X264_DELETE(m_jobList);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -75,14 +85,126 @@ MainWindow::~MainWindow(void)
|
||||
void MainWindow::addButtonPressed(void)
|
||||
{
|
||||
EncodeThread *thrd = new EncodeThread();
|
||||
m_jobList->insertJob(thrd);
|
||||
|
||||
QTimer::singleShot(2500, thrd, SLOT(start()));
|
||||
QModelIndex newIndex = m_jobList->insertJob(thrd);
|
||||
jobsView->selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::ClearAndSelect);
|
||||
}
|
||||
|
||||
void MainWindow::startButtonPressed(void)
|
||||
{
|
||||
m_jobList->startJob(jobsView->currentIndex());
|
||||
}
|
||||
|
||||
void MainWindow::abortButtonPressed(void)
|
||||
{
|
||||
m_jobList->abortJob(jobsView->currentIndex());
|
||||
}
|
||||
void MainWindow::jobSelected(const QModelIndex & current, const QModelIndex & previous)
|
||||
{
|
||||
qDebug("Job selected: %d", current.row());
|
||||
|
||||
if(logView->model())
|
||||
{
|
||||
disconnect(logView->model(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(jobLogExtended(QModelIndex, int, int)));
|
||||
}
|
||||
|
||||
logView->setModel(m_jobList->getLogFile(current));
|
||||
logView->scrollToBottom();
|
||||
connect(logView->model(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(jobLogExtended(QModelIndex, int, int)));
|
||||
QTimer::singleShot(0, logView, SLOT(scrollToBottom()));
|
||||
|
||||
progressBar->setValue(m_jobList->getJobProgress(current));
|
||||
editDetails->setText(m_jobList->data(m_jobList->index(current.row(), 3, QModelIndex()), Qt::DisplayRole).toString());
|
||||
updateButtons(m_jobList->getJobStatus(current));
|
||||
}
|
||||
|
||||
void MainWindow::jobChangedData(const QModelIndex &topLeft, const QModelIndex &bottomRight)
|
||||
{
|
||||
int selected = jobsView->currentIndex().row();
|
||||
|
||||
if(topLeft.column() <= 1 && bottomRight.column() >= 1)
|
||||
{
|
||||
for(int i = topLeft.row(); i <= bottomRight.row(); i++)
|
||||
{
|
||||
if(i == selected)
|
||||
{
|
||||
qDebug("Current job changed status!");
|
||||
updateButtons(m_jobList->getJobStatus(m_jobList->index(i, 0, QModelIndex())));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(topLeft.column() <= 2 && bottomRight.column() >= 2)
|
||||
{
|
||||
for(int i = topLeft.row(); i <= bottomRight.row(); i++)
|
||||
{
|
||||
if(i == selected)
|
||||
{
|
||||
progressBar->setValue(m_jobList->getJobProgress(m_jobList->index(i, 0, QModelIndex())));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(topLeft.column() <= 3 && bottomRight.column() >= 3)
|
||||
{
|
||||
for(int i = topLeft.row(); i <= bottomRight.row(); i++)
|
||||
{
|
||||
if(i == selected)
|
||||
{
|
||||
editDetails->setText(m_jobList->data(m_jobList->index(i, 3, QModelIndex()), Qt::DisplayRole).toString());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::jobLogExtended(const QModelIndex & parent, int start, int end)
|
||||
{
|
||||
QTimer::singleShot(0, logView, SLOT(scrollToBottom()));
|
||||
}
|
||||
|
||||
void MainWindow::showAbout(void)
|
||||
{
|
||||
QString text;
|
||||
const char *url = "http://mulder.brhack.net/";
|
||||
|
||||
text += QString().sprintf("<nobr><tt>Simple x264 Launcher v%u.%02u − use 64−Bit x264 with 32−Bit Avisynth<br>", x264_version_major(), x264_version_minor());
|
||||
text += QString().sprintf("Copyright (c) 2004−%04d LoRd_MuldeR <mulder2@gmx.de>. Some rights reserved.<br>", qMax(x264_version_date().year(),QDate::currentDate().year()));
|
||||
text += QString().sprintf("Built on %s at %s with %s for Win−%s.<br><br>", x264_version_date().toString(Qt::ISODate).toLatin1().constData(), x264_version_time(), x264_version_compiler(), x264_version_arch());
|
||||
text += QString().sprintf("This program is free software: you can redistribute it and/or modify<br>");
|
||||
text += QString().sprintf("it under the terms of the GNU General Public License <http://www.gnu.org/>.<br>");
|
||||
text += QString().sprintf("Note that this program is distributed with ABSOLUTELY NO WARRANTY.<br><br>");
|
||||
text += QString().sprintf("Please check the web−site at <a href=\"%s\">%s</a> for updates !!!<br></tt></nobr>", url, url);
|
||||
|
||||
QMessageBox::information(this, tr("About..."), text);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Event functions
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void MainWindow::closeEvent(QCloseEvent *e)
|
||||
{
|
||||
const int rows = m_jobList->rowCount(QModelIndex());
|
||||
|
||||
for(int i = 0; i < rows; i++)
|
||||
{
|
||||
EncodeThread::JobStatus status = m_jobList->getJobStatus(m_jobList->index(i, 0, QModelIndex()));
|
||||
if(status != EncodeThread::JobStatus_Completed && status != EncodeThread::JobStatus_Aborted && status != EncodeThread::JobStatus_Failed)
|
||||
{
|
||||
e->ignore();
|
||||
MessageBeep(MB_ICONWARNING);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Private functions
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void MainWindow::updateButtons(EncodeThread::JobStatus status)
|
||||
{
|
||||
qDebug("MainWindow::updateButtons(void)");
|
||||
|
||||
buttonStartJob->setEnabled(status == EncodeThread::JobStatus_Enqueued);
|
||||
buttonAbortJob->setEnabled(status == EncodeThread::JobStatus_Indexing || status == EncodeThread::JobStatus_Running);
|
||||
}
|
||||
|
@ -22,6 +22,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "uic_win_main.h"
|
||||
#include "thread_encode.h"
|
||||
|
||||
class JobListModel;
|
||||
|
||||
@ -33,10 +34,20 @@ public:
|
||||
MainWindow();
|
||||
~MainWindow(void);
|
||||
|
||||
protected:
|
||||
virtual void closeEvent(QCloseEvent *e);
|
||||
|
||||
private:
|
||||
JobListModel *m_jobList;
|
||||
|
||||
void updateButtons(EncodeThread::JobStatus status);
|
||||
|
||||
private slots:
|
||||
void addButtonPressed(void);
|
||||
void startButtonPressed(void);
|
||||
void abortButtonPressed(void);
|
||||
void jobSelected(const QModelIndex & current, const QModelIndex & previous);
|
||||
void jobChangedData(const QModelIndex &top, const QModelIndex &bottom);
|
||||
void jobLogExtended(const QModelIndex & parent, int start, int end);
|
||||
void showAbout(void);
|
||||
};
|
||||
|
@ -94,29 +94,30 @@
|
||||
<CustomBuild Include="gui\win_main.ui">
|
||||
<FileType>Document</FileType>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\uic.exe" -o "$(SolutionDir)tmp\uic\uic_%(Filename).h" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">UIC "$(SolutionDir)tmp\UIC_%(Filename).h"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">UIC "$(SolutionDir)tmp\uic\uic_%(Filename).h"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\uic\uic_%(Filename).h;%(Outputs)</Outputs>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o "$(SolutionDir)tmp\uic\uic_%(Filename).h" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">UIC "$(SolutionDir)tmp\UIC_%(Filename).h"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">UIC "$(SolutionDir)tmp\uic\uic_%(Filename).h"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\uic\uic_%(Filename).h;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<None Include="ReadMe.txt" />
|
||||
<CustomBuild Include="res\resources.qrc">
|
||||
<FileType>Document</FileType>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\rcc.exe" -o "$(SolutionDir)tmp\qrc\qrc_%(Filename).cpp" -name "%(Filename)" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">RCC "$(SolutionDir)tmp\QRC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">RCC "$(SolutionDir)tmp\qrc\qrc_%(Filename).cpp"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\qrc\qrc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\rcc.exe" -o "$(SolutionDir)tmp\qrc\qrc_%(Filename).cpp" -name "%(Filename)" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">RCC "$(SolutionDir)tmp\QRC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">RCC "$(SolutionDir)tmp\qrc\qrc_%(Filename).cpp"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\qrc\qrc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
<SubType>Designer</SubType>
|
||||
</CustomBuild>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<CustomBuild Include="src\thread_encode.h">
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
@ -124,16 +125,16 @@
|
||||
<CustomBuild Include="src\model_jobList.h">
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="src\model_logFile.h">
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
@ -141,10 +142,10 @@
|
||||
<ClInclude Include="src\version.h" />
|
||||
<CustomBuild Include="src\win_main.h">
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" "%(FullPath)"</Command>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp"</Message>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
</ItemGroup>
|
||||
|