From f80533f99acd56da3ff297f2297a7343d6c9553f Mon Sep 17 00:00:00 2001 From: lordmulder Date: Sun, 20 Apr 2014 17:38:55 +0200 Subject: [PATCH] Make it possible to move jobs up/down the in the queue. Hold CTRL while pressing up/down cursor keys as a shortcut. --- gui/win_main.ui | 27 ++++++ res/resources.qrc | 2 + src/encoder_abstract.cpp | 5 +- src/encoder_x265.cpp | 2 +- src/input_filter.cpp | 100 ++++++++++++++++++++++ src/input_filter.h | 53 ++++++++++++ src/model_jobList.cpp | 47 ++++++++-- src/model_jobList.h | 8 ++ src/version.h | 2 +- src/win_main.cpp | 114 +++++++++++++++++-------- src/win_main.h | 8 +- x264_launcher_MSVC2013.vcxproj | 10 +++ x264_launcher_MSVC2013.vcxproj.filters | 9 ++ 13 files changed, 342 insertions(+), 45 deletions(-) create mode 100644 src/input_filter.cpp create mode 100644 src/input_filter.h diff --git a/gui/win_main.ui b/gui/win_main.ui index e26ab73..0e1c449 100644 --- a/gui/win_main.ui +++ b/gui/win_main.ui @@ -403,6 +403,9 @@ + + + @@ -741,6 +744,30 @@ Codecs.com Mirror + + + false + + + + :/buttons/arrow_up.png:/buttons/arrow_up.png + + + Move Up + + + + + false + + + + :/buttons/arrow_down.png:/buttons/arrow_down.png + + + Move Down + + buttonAddJob diff --git a/res/resources.qrc b/res/resources.qrc index 04ec74c..e5be481 100644 --- a/res/resources.qrc +++ b/res/resources.qrc @@ -4,6 +4,8 @@ icons/movie.ico buttons/accept.png buttons/add.png + buttons/arrow_down.png + buttons/arrow_up.png buttons/bomb.png buttons/book_open.png buttons/cancel.png diff --git a/src/encoder_abstract.cpp b/src/encoder_abstract.cpp index 3da8b56..d0144ad 100644 --- a/src/encoder_abstract.cpp +++ b/src/encoder_abstract.cpp @@ -184,7 +184,7 @@ bool AbstractEncoder::runEncodingPass(AbstractSource* pipedSource, const QString processEncode.waitForFinished(5000); if(processEncode.state() != QProcess::NotRunning) { - qWarning("x264 process still running, going to kill it!"); + qWarning("Encoder process still running, going to kill it!"); processEncode.kill(); processEncode.waitForFinished(-1); } @@ -217,7 +217,8 @@ bool AbstractEncoder::runEncodingPass(AbstractSource* pipedSource, const QString const int exitCode = processEncode.exitCode(); if((exitCode < 0) || (exitCode >= 32)) { - log(tr("\nFATAL ERROR: The encoder process has crashed, your encode probably is *incomplete* !!!")); + log(tr("\nFATAL ERROR: The encoder process has *crashed* -> your encode probably is *incomplete* !!!")); + log(tr("Note that this indicates a bug in the current encoder, *not* in Simple x264/x265 Launcher.")); } log(tr("\nPROCESS EXITED WITH ERROR CODE: %1").arg(QString::number(exitCode))); } diff --git a/src/encoder_x265.cpp b/src/encoder_x265.cpp index d89fe4f..3113193 100644 --- a/src/encoder_x265.cpp +++ b/src/encoder_x265.cpp @@ -33,7 +33,7 @@ //x265 version info static const unsigned int VERSION_X265_MINIMUM_VER = 9; -static const unsigned int VERSION_X265_MINIMUM_REV = 53; +static const unsigned int VERSION_X265_MINIMUM_REV = 68; // ------------------------------------------------------------ // Helper Macros diff --git a/src/input_filter.cpp b/src/input_filter.cpp new file mode 100644 index 0000000..45d4733 --- /dev/null +++ b/src/input_filter.cpp @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////////// +// Simple x264 Launcher +// Copyright (C) 2004-2014 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 "input_filter.h" + +#include "global.h" + +#include +#include +#include +#include + +InputEventFilter::InputEventFilter(QWidget *target) +: + m_target(target), + m_keyMapping(new QHash()), + m_mouseMapping(new QHash()) +{ + m_target->installEventFilter(this); +} + +InputEventFilter::~InputEventFilter(void) +{ + m_target->removeEventFilter(this); + X264_DELETE(m_keyMapping); + X264_DELETE(m_mouseMapping); +} + +void InputEventFilter::addKeyFilter(const int &keyCode, const int &tag) +{ + m_keyMapping->insert(keyCode, tag); +} + +void InputEventFilter::addMouseFilter(const int &mouseCode, const int &tag) +{ + m_mouseMapping->insert(mouseCode, tag); +} + +bool InputEventFilter::eventFilter(QObject *obj, QEvent *event) +{ + if(obj == m_target) + { + if(event->type() == QEvent::KeyPress) + { + QKeyEvent *keyEvent = dynamic_cast(event); + if(keyEvent) + { + return eventFilter(keyEvent); + } + } + else if(event->type() == QEvent::MouseButtonPress) + { + QMouseEvent *mouseEvent = dynamic_cast(event); + if(mouseEvent) + { + return eventFilter(mouseEvent); + } + } + } + return false; +} + +bool InputEventFilter::eventFilter(QKeyEvent *keyEvent) +{ + const int keyCode = keyEvent->key() | keyEvent->modifiers(); + if(m_keyMapping->contains(keyCode)) + { + emit keyPressed(m_keyMapping->value(keyCode)); + return true; + } + return false; +} + +bool InputEventFilter::eventFilter(QMouseEvent *mouseEvent) +{ + if(m_mouseMapping->contains(mouseEvent->button())) + { + emit mouseClicked(m_mouseMapping->value(mouseEvent->button())); + return true; + } + return false; +} diff --git a/src/input_filter.h b/src/input_filter.h new file mode 100644 index 0000000..e216753 --- /dev/null +++ b/src/input_filter.h @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////////// +// Simple x264 Launcher +// Copyright (C) 2004-2014 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 + +template class QHash; +class QKeyEvent; +class QMouseEvent; + +class InputEventFilter : public QObject +{ + Q_OBJECT + +public: + InputEventFilter(QWidget *target); + ~InputEventFilter(void); + + void addKeyFilter(const int &keyCode, const int &tag); + void addMouseFilter(const int &keyCode, const int &tag); + +signals: + void keyPressed(const int &tag); + void mouseClicked(const int &tag); + +protected: + bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QKeyEvent *keyEvent); + bool eventFilter(QMouseEvent *mouseEvent); + + QWidget *const m_target; + QHash *m_keyMapping; + QHash *m_mouseMapping; +}; diff --git a/src/model_jobList.cpp b/src/model_jobList.cpp index f265f70..57131a0 100644 --- a/src/model_jobList.cpp +++ b/src/model_jobList.cpp @@ -37,6 +37,8 @@ static const char *KEY_ENC_OPTIONS = "enc_options"; static const char *JOB_TEMPLATE = "job_%08x"; +#define VALID_INDEX(INDEX) ((INDEX).isValid() && ((INDEX).row() >= 0) && ((INDEX).row() < m_jobs.count())) + JobListModel::JobListModel(PreferencesModel *preferences) { m_preferences = preferences; @@ -311,7 +313,7 @@ QModelIndex JobListModel::insertJob(EncodeThread *thread) bool JobListModel::startJob(const QModelIndex &index) { - if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count()) + if(VALID_INDEX(index)) { QUuid id = m_jobs.at(index.row()); if(m_status.value(id) == JobStatus_Enqueued) @@ -328,7 +330,7 @@ bool JobListModel::startJob(const QModelIndex &index) bool JobListModel::pauseJob(const QModelIndex &index) { - if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count()) + if(VALID_INDEX(index)) { QUuid id = m_jobs.at(index.row()); JobStatus status = m_status.value(id); @@ -346,7 +348,7 @@ bool JobListModel::pauseJob(const QModelIndex &index) bool JobListModel::resumeJob(const QModelIndex &index) { - if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count()) + if(VALID_INDEX(index)) { QUuid id = m_jobs.at(index.row()); JobStatus status = m_status.value(id); @@ -363,7 +365,7 @@ bool JobListModel::resumeJob(const QModelIndex &index) bool JobListModel::abortJob(const QModelIndex &index) { - if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count()) + if(VALID_INDEX(index)) { QUuid id = m_jobs.at(index.row()); if(m_status.value(id) == JobStatus_Indexing || m_status.value(id) == JobStatus_Running || @@ -380,7 +382,7 @@ bool JobListModel::abortJob(const QModelIndex &index) bool JobListModel::deleteJob(const QModelIndex &index) { - if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count()) + if(VALID_INDEX(index)) { QUuid id = m_jobs.at(index.row()); if(m_status.value(id) == JobStatus_Completed || m_status.value(id) == JobStatus_Failed || @@ -412,6 +414,29 @@ bool JobListModel::deleteJob(const QModelIndex &index) return false; } +bool JobListModel::moveJob(const QModelIndex &index, const int &direction) +{ + if(VALID_INDEX(index)) + { + if((direction == MOVE_UP) && (index.row() > 0)) + { + beginMoveRows(QModelIndex(), index.row(), index.row(), QModelIndex(), index.row() - 1); + m_jobs.swap(index.row(), index.row() - 1); + endMoveRows(); + return true; + } + if((direction == MOVE_DOWN) && (index.row() < m_jobs.size() - 1)) + { + beginMoveRows(QModelIndex(), index.row(), index.row(), QModelIndex(), index.row() + 2); + m_jobs.swap(index.row(), index.row() + 1); + endMoveRows(); + return true; + } + } + + return false; +} + LogFileModel *JobListModel::getLogFile(const QModelIndex &index) { if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count()) @@ -591,8 +616,16 @@ size_t JobListModel::loadQueuedJobs(const SysinfoModel *sysinfo) return 0; } - size_t jobsCreated = 0; + const QStringList groups = settings.childGroups(); + for(size_t i = 0; i < jobCounter; i++) + { + if(!groups.contains(QString().sprintf(JOB_TEMPLATE, i))) + { + return 0; + } + } + size_t jobsCreated = 0; for(size_t i = 0; i < jobCounter; i++) { settings.beginGroup(QString().sprintf(JOB_TEMPLATE, i)); @@ -628,4 +661,6 @@ void JobListModel::clearQueuedJobs(void) const QString appDir = x264_data_path(); QSettings settings(QString("%1/queue.ini").arg(appDir), QSettings::IniFormat); settings.clear(); + settings.setValue(KEY_ENTRY_COUNT, 0); + settings.sync(); } diff --git a/src/model_jobList.h b/src/model_jobList.h index 648b9f3..fd8d446 100644 --- a/src/model_jobList.h +++ b/src/model_jobList.h @@ -52,6 +52,7 @@ public: bool resumeJob(const QModelIndex &index); bool abortJob(const QModelIndex &index); bool deleteJob(const QModelIndex &index); + bool moveJob(const QModelIndex &index, const int &direction); LogFileModel *getLogFile(const QModelIndex &index); const QString &getJobSourceFile(const QModelIndex &index); const QString &getJobOutputFile(const QModelIndex &index); @@ -64,6 +65,13 @@ public: size_t loadQueuedJobs(const SysinfoModel *sysinfo); void clearQueuedJobs(void); + typedef enum + { + MOVE_UP = +1, + MOVE_DOWN = -1 + } + move_t; + protected: QList m_jobs; QMap m_name; diff --git a/src/version.h b/src/version.h index d06b6ec..410c1c2 100644 --- a/src/version.h +++ b/src/version.h @@ -26,7 +26,7 @@ #define VER_X264_MAJOR 2 #define VER_X264_MINOR 3 #define VER_X264_PATCH 7 -#define VER_X264_BUILD 838 +#define VER_X264_BUILD 843 #define VER_X264_PORTABLE_EDITION (0) diff --git a/src/win_main.cpp b/src/win_main.cpp index ac25891..02c7874 100644 --- a/src/win_main.cpp +++ b/src/win_main.cpp @@ -35,6 +35,7 @@ #include "thread_vapoursynth.h" #include "thread_encode.h" #include "taskbar7.h" +#include "input_filter.h" #include "win_addJob.h" #include "win_about.h" #include "win_preferences.h" @@ -71,7 +72,6 @@ const char *tpl_last = ""; #define NEXT(X) ((*reinterpret_cast(&(X)))++) #define SETUP_WEBLINK(OBJ, URL) do { (OBJ)->setData(QVariant(QUrl(URL))); connect((OBJ), SIGNAL(triggered()), this, SLOT(showWebLink())); } while(0) - /////////////////////////////////////////////////////////////////////////////// // Constructor & Destructor /////////////////////////////////////////////////////////////////////////////// @@ -125,7 +125,6 @@ MainWindow::MainWindow(const x264_cpu_t *const cpuFeatures, IPC *ipc) //Update title ui->labelBuildDate->setText(tr("Built on %1 at %2").arg(x264_version_date().toString(Qt::ISODate), QString::fromLatin1(x264_version_time()))); - ui->labelBuildDate->installEventFilter(this); if(X264_DEBUG) { @@ -152,6 +151,18 @@ MainWindow::MainWindow(const x264_cpu_t *const cpuFeatures, IPC *ipc) ui->jobsView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); connect(ui->jobsView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(jobSelected(QModelIndex, QModelIndex))); + //Setup key listener + m_inputFilter_jobList = new InputEventFilter(ui->jobsView); + m_inputFilter_jobList->addKeyFilter(Qt::ControlModifier | Qt::Key_Up, 1); + m_inputFilter_jobList->addKeyFilter(Qt::ControlModifier | Qt::Key_Down, 2); + connect(m_inputFilter_jobList, SIGNAL(keyPressed(int)), this, SLOT(jobListKeyPressed(int))); + + //Setup mouse listener + m_inputFilter_version = new InputEventFilter(ui->labelBuildDate); + m_inputFilter_version->addMouseFilter(Qt::LeftButton, 0); + m_inputFilter_version->addMouseFilter(Qt::RightButton, 0); + connect(m_inputFilter_version, SIGNAL(mouseClicked(int)), this, SLOT(versionLabelMouseClicked(int))); + //Create context menu QAction *actionClipboard = new QAction(QIcon(":/buttons/page_paste.png"), tr("Copy to Clipboard"), ui->logView); actionClipboard->setEnabled(false); @@ -160,13 +171,15 @@ MainWindow::MainWindow(const x264_cpu_t *const cpuFeatures, IPC *ipc) ui->jobsView->addActions(ui->menuJob->actions()); //Enable buttons - connect(ui->buttonAddJob, SIGNAL(clicked()), this, SLOT(addButtonPressed())); - connect(ui->buttonStartJob, SIGNAL(clicked()), this, SLOT(startButtonPressed())); - connect(ui->buttonAbortJob, SIGNAL(clicked()), this, SLOT(abortButtonPressed())); - connect(ui->buttonPauseJob, SIGNAL(toggled(bool)), this, SLOT(pauseButtonPressed(bool))); - connect(ui->actionJob_Delete, SIGNAL(triggered()), this, SLOT(deleteButtonPressed())); - connect(ui->actionJob_Restart, SIGNAL(triggered()), this, SLOT(restartButtonPressed())); - connect(ui->actionJob_Browse, SIGNAL(triggered()), this, SLOT(browseButtonPressed())); + connect(ui->buttonAddJob, SIGNAL(clicked()), this, SLOT(addButtonPressed() )); + connect(ui->buttonStartJob, SIGNAL(clicked()), this, SLOT(startButtonPressed() )); + connect(ui->buttonAbortJob, SIGNAL(clicked()), this, SLOT(abortButtonPressed() )); + connect(ui->buttonPauseJob, SIGNAL(toggled(bool)), this, SLOT(pauseButtonPressed(bool))); + connect(ui->actionJob_Delete, SIGNAL(triggered()), this, SLOT(deleteButtonPressed() )); + connect(ui->actionJob_Restart, SIGNAL(triggered()), this, SLOT(restartButtonPressed() )); + connect(ui->actionJob_Browse, SIGNAL(triggered()), this, SLOT(browseButtonPressed() )); + connect(ui->actionJob_MoveUp, SIGNAL(triggered()), this, SLOT(moveButtonPressed() )); + connect(ui->actionJob_MoveDown, SIGNAL(triggered()), this, SLOT(moveButtonPressed() )); //Enable menu connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openActionTriggered())); @@ -222,6 +235,8 @@ MainWindow::~MainWindow(void) X264_DELETE(m_options); X264_DELETE(m_pendingFiles); X264_DELETE(m_label); + X264_DELETE(m_inputFilter_jobList); + X264_DELETE(m_inputFilter_version); while(!m_toolsList.isEmpty()) { @@ -354,6 +369,37 @@ void MainWindow::browseButtonPressed(void) m_status = STATUS_IDLE; } +/* + * The "browse" button was clicked + */ +void MainWindow::moveButtonPressed(void) +{ + ENSURE_APP_IS_IDLE(); + + if(sender() == ui->actionJob_MoveUp) + { + qDebug("Move job %d (direction: UP)", ui->jobsView->currentIndex().row()); + if(!m_jobList->moveJob(ui->jobsView->currentIndex(), JobListModel::MOVE_UP)) + { + x264_beep(x264_beep_error); + } + ui->jobsView->scrollTo(ui->jobsView->currentIndex(), QAbstractItemView::PositionAtCenter); + } + else if(sender() == ui->actionJob_MoveDown) + { + qDebug("Move job %d (direction: DOWN)", ui->jobsView->currentIndex().row()); + if(!m_jobList->moveJob(ui->jobsView->currentIndex(), JobListModel::MOVE_DOWN)) + { + x264_beep(x264_beep_error); + } + ui->jobsView->scrollTo(ui->jobsView->currentIndex(), QAbstractItemView::PositionAtCenter); + } + else + { + qWarning("[moveButtonPressed] Error: Unknown sender!"); + } +} + /* * The "pause" button was clicked */ @@ -996,6 +1042,7 @@ void MainWindow::init(void) if(m_jobList->loadQueuedJobs(m_sysinfo) > 0) { m_label->setVisible(m_jobList->rowCount(QModelIndex()) == 0); + m_jobList->clearQueuedJobs(); } } @@ -1152,6 +1199,27 @@ void MainWindow::checkUpdates(void) } } +void MainWindow::versionLabelMouseClicked(const int &tag) +{ + if(tag == 0) + { + QTimer::singleShot(0, this, SLOT(showAbout())); + } +} + +void MainWindow::jobListKeyPressed(const int &tag) +{ + switch(tag) + { + case 1: + ui->actionJob_MoveUp->trigger(); + break; + case 2: + ui->actionJob_MoveDown->trigger(); + break; + } +} + /////////////////////////////////////////////////////////////////////////////// // Event functions /////////////////////////////////////////////////////////////////////////////// @@ -1174,8 +1242,6 @@ void MainWindow::showEvent(QShowEvent *e) */ void MainWindow::closeEvent(QCloseEvent *e) { - bool bJobsHaveBeenSaved = false; - if((m_status != STATUS_IDLE) && (m_status != STATUS_EXITTING)) { e->ignore(); @@ -1202,10 +1268,7 @@ void MainWindow::closeEvent(QCloseEvent *e) int ret = QMessageBox::question(this, tr("Jobs Are Pending"), tr("You still have pending jobs. How do you want to proceed?"), tr("Save Pending Jobs"), tr("Discard")); if(ret == 0) { - if(m_jobList->saveQueuedJobs() > 0) - { - bJobsHaveBeenSaved = true; - } + m_jobList->saveQueuedJobs(); } else { @@ -1219,12 +1282,6 @@ void MainWindow::closeEvent(QCloseEvent *e) } } - //Clear "old" pending jobs for next startup (only if we have not saved "new" jobs already!) - if(!bJobsHaveBeenSaved) - { - m_jobList->clearQueuedJobs(); - } - //Delete remaining jobs while(m_jobList->rowCount(QModelIndex()) > 0) { @@ -1255,19 +1312,6 @@ void MainWindow::resizeEvent(QResizeEvent *e) updateLabelPos(); } -/* - * Event filter - */ -bool MainWindow::eventFilter(QObject *o, QEvent *e) -{ - if((o == ui->labelBuildDate) && (e->type() == QEvent::MouseButtonPress)) - { - QTimer::singleShot(0, this, SLOT(showAbout())); - return true; - } - return false; -} - /* * Win32 message filter */ @@ -1493,6 +1537,8 @@ void MainWindow::updateButtons(JobStatus status) ui->actionJob_Delete->setEnabled(status == JobStatus_Completed || status == JobStatus_Aborted || status == JobStatus_Failed || status == JobStatus_Enqueued); ui->actionJob_Restart->setEnabled(status == JobStatus_Completed || status == JobStatus_Aborted || status == JobStatus_Failed || status == JobStatus_Enqueued); ui->actionJob_Browse->setEnabled(status == JobStatus_Completed); + ui->actionJob_MoveUp->setEnabled(status != JobStatus_Undefined); + ui->actionJob_MoveDown->setEnabled(status != JobStatus_Undefined); ui->actionJob_Start->setEnabled(ui->buttonStartJob->isEnabled()); ui->actionJob_Abort->setEnabled(ui->buttonAbortJob->isEnabled()); diff --git a/src/win_main.h b/src/win_main.h index 8a4f9b6..2ea8fff 100644 --- a/src/win_main.h +++ b/src/win_main.h @@ -32,6 +32,7 @@ class QFile; class QLibrary; class PreferencesModel; class RecentlyUsed; +class InputEventFilter; class QModelIndex; class QLabel; enum JobStatus; @@ -53,7 +54,6 @@ protected: virtual void closeEvent(QCloseEvent *e); virtual void showEvent(QShowEvent *e); virtual void resizeEvent(QResizeEvent *e); - virtual bool eventFilter(QObject *o, QEvent *e); virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dropEvent(QDropEvent *event); virtual bool winEvent(MSG *message, long *result); @@ -76,6 +76,9 @@ private: QLabel *m_label; IPC *const m_ipc; + InputEventFilter *m_inputFilter_jobList; + InputEventFilter *m_inputFilter_version; + JobListModel *m_jobList; OptionsModel *m_options; QStringList *m_pendingFiles; @@ -110,7 +113,9 @@ private slots: void jobSelected(const QModelIndex ¤t, const QModelIndex &previous); void jobChangedData(const QModelIndex &top, const QModelIndex &bottom); void jobLogExtended(const QModelIndex & parent, int start, int end); + void jobListKeyPressed(const int &tag); void launchNextJob(); + void moveButtonPressed(void); void pauseButtonPressed(bool checked); void restartButtonPressed(void); void saveLogFile(const QModelIndex &index); @@ -120,4 +125,5 @@ private slots: void shutdownComputer(void); void startButtonPressed(void); void updateLabelPos(void); + void versionLabelMouseClicked(const int &tag); }; diff --git a/x264_launcher_MSVC2013.vcxproj b/x264_launcher_MSVC2013.vcxproj index 3976c95..3b89649 100644 --- a/x264_launcher_MSVC2013.vcxproj +++ b/x264_launcher_MSVC2013.vcxproj @@ -343,6 +343,14 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats" $(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\moc_%(Filename).cpp" + MOC "$(SolutionDir)tmp\moc\moc_%(Filename).cpp" + $(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs) + $(SolutionDir)tmp\moc\moc_%(Filename).cpp;%(Outputs) + @@ -408,6 +416,7 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats" + @@ -432,6 +441,7 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats" + diff --git a/x264_launcher_MSVC2013.vcxproj.filters b/x264_launcher_MSVC2013.vcxproj.filters index 32f450b..7934e3e 100644 --- a/x264_launcher_MSVC2013.vcxproj.filters +++ b/x264_launcher_MSVC2013.vcxproj.filters @@ -108,6 +108,9 @@ Header Files + + Header Files + @@ -263,6 +266,12 @@ Source Files + + Source Files + + + Generated Files +