From 8d9fb210c6d2e3f221e5ad9c920ed90fc7c9ae5c Mon Sep 17 00:00:00 2001 From: lordmulder Date: Sat, 14 Dec 2013 22:30:19 +0100 Subject: [PATCH] Implemented update reminder to main window. Also added option to disable update reminder to preferences dialog. --- etc/setup/license.rtf | Bin 1624 -> 1776 bytes gui/win_preferences.ui | 806 ++++++++++++++++----------------- gui/win_updater.ui | 86 +++- res/buttons/shield_blue.png | Bin 0 -> 3460 bytes res/images/update_wizard.png | Bin 17539 -> 27519 bytes res/resources.qrc | 1 + src/model_preferences.cpp | 3 + src/model_preferences.h | 3 + src/model_recently.cpp | 26 +- src/model_recently.h | 8 +- src/version.h | 4 +- src/win_main.cpp | 63 ++- src/win_preferences.cpp | 64 +-- src/win_preferences.h | 2 +- src/win_updater.cpp | 21 +- src/win_updater.h | 6 + x264_launcher_MSVC2013.vcxproj | 4 +- 17 files changed, 619 insertions(+), 478 deletions(-) create mode 100644 res/buttons/shield_blue.png diff --git a/etc/setup/license.rtf b/etc/setup/license.rtf index fba20ebd495ea1b3c8fc5b57672b4bbd4c7cea75..f391f9b9dd658d5800f0064c3618e3a2c59c1a51 100644 GIT binary patch delta 580 zcmYjO!EVz)5G8h;Lm>x5POXrJ2sl)3Vka#T>dB>4i68|fuBwQ=tnGDdvDuB*>qb4G zo{BhdDB54>2NeE;1Gjz#pTIgch0Dy&&U^FbX>K3&X?wPk$ai@0xhv$jS{UM*EbCms2gi*69ojae@JtrSvDXD~damp4xP4~;a5D8O|93Vb#P}+W dLP_-(sQZmhyE>1H;;gq@;p4mGerj&q`vcGzwL|~_ delta 386 zcmeysdxK|!d8k52Vn%*$qIGR`OqyX#S`m<)rx22vn_8^kms+k61mc4wjo^|94aPBP zx%nxnMR_r41x1C13eNd?#rZjj#S=X`CNE?XV@ZlhGnn|q1IQLN$WHTnQxJoJ{m6j-kdxm)UhlVIP`b8>) zI|c_DIy!m!c!oqO 0 0 - 379 - 432 + 372 + 387 @@ -21,428 +21,428 @@ - - - - 0 - 0 - - + Preferences - + - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 8 - - - + + + + + + + + + + + + + + Automatically launch next job when a running job completes + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - false - - - If the specified number of jobs (or even more) is already running, the next one will NOT be launched yet. - - - Maximum number of running jobs: - - + + + + + + false + + + + + + + + + + false + + + If the specified number of jobs (or even more) is already running, the next one will NOT be launched yet. + + + Maximum number of running jobs: + + + + + + + false + + + + 80 + 0 + + + + If the specified number of jobs (or even more) is already running, the next one will NOT be launched yet. + + + 1 + + + 16 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - Automatically launch next job when a running job completes - - + + + + + + + + + + + + + Use 10-Bit version of x264 → implies 'High 10' H.264 Profile + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - - - - - - - - Qt::Horizontal - - - - 0 - 20 - - - - - - - - false - - - - 80 - 0 - - - - If the specified number of jobs (or even more) is already running, the next one will NOT be launched yet. - - - 1 - - - 16 - - - - - - - If this option is un-checked (default), then 32-Bit Avisynth will be used - even when using 64-Bit x264. + + + + + + If this option is un-checked (default), then 32-Bit Avisynth will be used - even when using 64-Bit x264. Please be aware that this option does NOT have any effect on 32-Bit systems. - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 8 - - - - - - - - - - - - - - - Shutdown computer as soon as the last job has completed - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 12 - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 12 - - - - - - - - If this option is un-checked (default), then 32-Bit Avisynth will be used - even when using 64-Bit x264. + + + + + + + + + + If this option is un-checked (default), then 32-Bit Avisynth will be used - even when using 64-Bit x264. Please be aware that this option does NOT have any effect on 32-Bit systems. - - - Use 64-Bit Avisynth/Avs2YUV, if running on a 64-Bit machine - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 8 - - - - - - - - - - - - - - - Use 10-Bit version of x264 → implies 'High 10' H.264 Profile - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 8 - - - - - - - - - - - - - - - Automatically save output to log file when a job has finished - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 8 - - - - - - - - Save output to the same folder where the source is located - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 8 - - - - - - - - - - - - - - - false - - - true - - - - Above Normal - + + + Use 64-Bit Avisynth/Avs2YUV, if running on a 64-Bit machine + + - - Normal - + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + - - Below Normal - + + + Automatically save output to log file when a job has finished + + - - Idle - + + + Qt::Horizontal + + + + 40 + 20 + + + - + - - - - Qt::Horizontal - - - - 40 - 20 - - - + + + + + + + + + + + + + Save output to the same folder where the source is located + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - Priority for encoder processes: - - + + + + + + + + + + + + + Shutdown computer as soon as the last job has completed + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - - - + + + + + + false + + + + + + + + + + Priority for encoder processes: + + + + + + + false + + + true + + + + Above Normal + + + + + Normal + + + + + Below Normal + + + + + Idle + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - Enable sound effects when a job has completed or failed - - + + + + + + + + + + + + + Enable sound effects when a job has completed or failed + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - Qt::Vertical + + + + 6 - - QSizePolicy::Fixed - - - - 20 - 8 - - - + + + + + + + + + + + Never show warning about missing Avisynth or VapourSynth + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - Never show warning about missing Avisynth or VapourSynth - - - - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 8 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 12 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 8 - 20 - - - + + + + + + + + + + + + + Never show auto-update notifications on application startup + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + @@ -505,10 +505,6 @@ Please be aware that this option does NOT have any effect on 32-Bit systems. closeButton resetButton - checkRunNextJob - spinBoxJobCount - checkUse64BitAvs2YUV - checkShutdownComputer diff --git a/gui/win_updater.ui b/gui/win_updater.ui index eb6fe61..accbc50 100644 --- a/gui/win_updater.ui +++ b/gui/win_updater.ui @@ -10,7 +10,7 @@ 0 0 428 - 257 + 247 @@ -94,6 +94,9 @@ + + 0 + @@ -152,6 +155,9 @@ + + 0 + @@ -218,7 +224,7 @@ 20 - 8 + 12 @@ -289,7 +295,7 @@ 20 - 8 + 12 @@ -360,7 +366,7 @@ 20 - 6 + 8 @@ -373,7 +379,7 @@ 20 - 40 + 0 @@ -403,6 +409,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 3 + 20 + + + + @@ -413,6 +435,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 3 + 20 + + + + @@ -438,6 +476,35 @@ + + + + + 75 + true + + + + (Build number: installed vs. latest) + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + @@ -493,7 +560,7 @@ PointingHandCursor - http://www.example.com/update_info.html + http://www.example.com/update_info.html Qt::LinksAccessibleByMouse @@ -501,17 +568,14 @@ - + Qt::Vertical - - QSizePolicy::Expanding - 20 - 40 + 0 diff --git a/res/buttons/shield_blue.png b/res/buttons/shield_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2ded609b8b2107b33031808929c10ed02e078097 GIT binary patch literal 3460 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 e)c=32U;hJX>;p>P0&Y+M0000buttons/restart.png buttons/setup.png buttons/shield_admin.png + buttons/shield_blue.png buttons/shield_error.png buttons/shield_exclamation.png buttons/shield_green.png diff --git a/src/model_preferences.cpp b/src/model_preferences.cpp index 152eeef..b324a4d 100644 --- a/src/model_preferences.cpp +++ b/src/model_preferences.cpp @@ -49,6 +49,7 @@ void PreferencesModel::initPreferences(PreferencesModel *preferences) preferences->m_processPriority = -1; preferences->m_enableSounds = false; preferences->m_disableWarnings = false; + preferences->m_noUpdateReminder = false; } void PreferencesModel::loadPreferences(PreferencesModel *preferences) @@ -69,6 +70,7 @@ void PreferencesModel::loadPreferences(PreferencesModel *preferences) preferences->m_processPriority = settings.value("process_priority", QVariant(defaults.m_processPriority)).toInt(); preferences->m_enableSounds = settings.value("enable_sounds", QVariant(defaults.m_enableSounds)).toBool(); preferences->m_disableWarnings = settings.value("disable_warnings", QVariant(defaults.m_disableWarnings)).toBool(); + preferences->m_noUpdateReminder = settings.value("disable_update_reminder", QVariant(defaults.m_disableWarnings)).toBool(); } void PreferencesModel::savePreferences(PreferencesModel *preferences) @@ -87,5 +89,6 @@ void PreferencesModel::savePreferences(PreferencesModel *preferences) settings.setValue("process_priority", preferences->m_processPriority); settings.setValue("enable_sounds", preferences->m_enableSounds); settings.setValue("disable_warnings", preferences->m_disableWarnings); + settings.setValue("disable_update_reminder", preferences->m_noUpdateReminder); settings.sync(); } diff --git a/src/model_preferences.h b/src/model_preferences.h index 9702ae5..9be246d 100644 --- a/src/model_preferences.h +++ b/src/model_preferences.h @@ -37,6 +37,7 @@ public: int processPriority(void) { return m_processPriority; } bool enableSounds(void) { return m_enableSounds; } bool disableWarnings(void) { return m_disableWarnings; } + bool noUpdateReminder(void) { return m_noUpdateReminder; } //Setter void setAutoRunNextJob(const bool autoRunNextJob) { m_autoRunNextJob = autoRunNextJob; } @@ -49,6 +50,7 @@ public: void setProcessPriority(const int processPriority) { m_processPriority = processPriority; } void setEnableSounds(const bool enableSounds) { m_enableSounds = enableSounds; } void setDisableWarnings(const bool disableWarnings) { m_disableWarnings = disableWarnings; } + void setNoUpdateReminder(const bool noUpdateReminder) { m_noUpdateReminder = noUpdateReminder; } //Static static void initPreferences(PreferencesModel *preferences); @@ -66,4 +68,5 @@ protected: int m_processPriority; bool m_enableSounds; bool m_disableWarnings; + bool m_noUpdateReminder; }; diff --git a/src/model_recently.cpp b/src/model_recently.cpp index e42468f..0bee02b 100644 --- a/src/model_recently.cpp +++ b/src/model_recently.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #define ARRAY_SIZE(ARRAY) (sizeof((ARRAY))/sizeof((ARRAY[0]))) #define VALID_DIR(PATH) ((!(PATH).isEmpty()) && QFileInfo(PATH).exists() && QFileInfo(PATH).isDir()) @@ -33,27 +34,43 @@ static const char *KEY_FILTER_IDX = "path/filterIndex"; static const char *KEY_SOURCE_DIR = "path/directory_openFrom"; static const char *KEY_OUTPUT_DIR = "path/directory_saveTo"; +static const char *KEY_UPDATE_CHK = "auto_update/last_successfull_check"; + +static void READ_INT(QSettings &settings, const QString &key, int default, int *value) +{ + bool ok = false; + const int temp = settings.value(key, default).toInt(&ok); + *value = (ok) ? temp : default; +} RecentlyUsed::RecentlyUsed(void) { initRecentlyUsed(this); } +RecentlyUsed::~RecentlyUsed(void) +{ + /*nothing to do*/ +} + void RecentlyUsed::initRecentlyUsed(RecentlyUsed *recentlyUsed) { recentlyUsed->m_sourceDirectory = QDir::fromNativeSeparators(QDesktopServices::storageLocation(QDesktopServices::MoviesLocation)); recentlyUsed->m_outputDirectory = QDir::fromNativeSeparators(QDesktopServices::storageLocation(QDesktopServices::MoviesLocation)); recentlyUsed->m_filterIndex = 0; + recentlyUsed->m_lastUpdateCheck = QDate(1969, 8, 15).toJulianDay(); } void RecentlyUsed::loadRecentlyUsed(RecentlyUsed *recentlyUsed) { RecentlyUsed defaults; - QSettings settings(QString("%1/last.ini").arg(x264_data_path()), QSettings::IniFormat); + int temp = 0; + recentlyUsed->m_sourceDirectory = settings.value(KEY_SOURCE_DIR, defaults.m_sourceDirectory).toString(); recentlyUsed->m_outputDirectory = settings.value(KEY_OUTPUT_DIR, defaults.m_outputDirectory).toString(); - recentlyUsed->m_filterIndex = settings.value(KEY_FILTER_IDX, defaults.m_filterIndex).toInt(); + READ_INT(settings, KEY_FILTER_IDX, defaults.m_filterIndex, &recentlyUsed->m_filterIndex); + READ_INT(settings, KEY_UPDATE_CHK, defaults.m_lastUpdateCheck, &recentlyUsed->m_lastUpdateCheck); if(!VALID_DIR(recentlyUsed->m_sourceDirectory)) recentlyUsed->m_sourceDirectory = defaults.m_sourceDirectory; if(!VALID_DIR(recentlyUsed->m_outputDirectory)) recentlyUsed->m_outputDirectory = defaults.m_outputDirectory; @@ -68,6 +85,11 @@ void RecentlyUsed::saveRecentlyUsed(RecentlyUsed *recentlyUsed) settings.setValue(KEY_SOURCE_DIR, recentlyUsed->m_sourceDirectory); settings.setValue(KEY_OUTPUT_DIR, recentlyUsed->m_outputDirectory); settings.setValue(KEY_FILTER_IDX, recentlyUsed->m_filterIndex); + settings.setValue(KEY_UPDATE_CHK, recentlyUsed->m_lastUpdateCheck); settings.sync(); } + else + { + qWarning("Settings are not writable!"); + } } diff --git a/src/model_recently.h b/src/model_recently.h index 18b8be2..d367bc5 100644 --- a/src/model_recently.h +++ b/src/model_recently.h @@ -39,6 +39,7 @@ class RecentlyUsed { public: RecentlyUsed(void); + ~RecentlyUsed(void); static void initRecentlyUsed(RecentlyUsed *recentlyUsed); static void loadRecentlyUsed(RecentlyUsed *recentlyUsed); @@ -47,15 +48,18 @@ public: //Getter QString sourceDirectory(void) { return m_sourceDirectory; } QString outputDirectory(void) { return m_outputDirectory; } - int filterIndex(void) { return m_filterIndex; } + int filterIndex(void) { return m_filterIndex; } + int lastUpdateCheck(void) { return m_lastUpdateCheck; } //Setter void setSourceDirectory(const QString &sourceDirectory) { m_sourceDirectory = sourceDirectory; } void setOutputDirectory(const QString &outputDirectory) { m_outputDirectory = outputDirectory; } - void setFilterIndex(const int filterIndex) { m_filterIndex = filterIndex; } + void setFilterIndex(const int filterIndex) { m_filterIndex = filterIndex; } + void setLastUpdateCheck(const int updateCheck) { m_lastUpdateCheck = updateCheck; } protected: QString m_sourceDirectory; QString m_outputDirectory; int m_filterIndex; + int m_lastUpdateCheck; }; diff --git a/src/version.h b/src/version.h index 7e9d442..88f9d32 100644 --- a/src/version.h +++ b/src/version.h @@ -25,8 +25,8 @@ #define VER_X264_MAJOR 2 #define VER_X264_MINOR 2 -#define VER_X264_PATCH 7 -#define VER_X264_BUILD 704 +#define VER_X264_PATCH 8 +#define VER_X264_BUILD 720 #define VER_X264_MINIMUM_REV 2363 #define VER_X264_CURRENT_API 140 diff --git a/src/win_main.cpp b/src/win_main.cpp index 60dfd8d..a4ad732 100644 --- a/src/win_main.cpp +++ b/src/win_main.cpp @@ -56,7 +56,7 @@ #include const char *home_url = "http://muldersoft.com/"; -const char *update_url = "http://code.google.com/p/mulder/downloads/list"; +const char *update_url = "https://github.com/lordmulder/Simple-x264-Launcher/releases/latest"; const char *tpl_last = ""; #define SET_FONT_BOLD(WIDGET,BOLD) do { QFont _font = WIDGET->font(); _font.setBold(BOLD); WIDGET->setFont(_font); } while(0) @@ -868,21 +868,44 @@ void MainWindow::init(void) qDebug(" "); } + //Update initialized flag (must do this before update check!) + m_initialized = true; + + //Enable drag&drop support for this window, required for Qt v4.8.4+ + setAcceptDrops(true); + //Check for expiration - if(x264_version_date().addMonths(6) < QDate::currentDate()) + if(x264_version_date().addMonths(6) < x264_current_date_safe()) { + QString text; + text += QString("%1

").arg(tr("Your version of Simple x264 Launcher is more than 6 months old!").replace("-", "−")); + text += QString("%1
%2

").arg(tr("You can download the most recent version from the official web-site now:").replace("-", "−"), QString::fromLatin1(update_url)); + text += QString("
%1
").arg(tr("Alternatively, click 'Check for Updates' to run the auto-update utility.").replace("-", "−")); QMessageBox msgBox(this); msgBox.setIconPixmap(QIcon(":/images/update.png").pixmap(56,56)); msgBox.setWindowTitle(tr("Update Notification")); msgBox.setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint); - msgBox.setText(tr("Your version of 'Simple x264 Launcher' is more than 6 months old!

Please download the most recent version from the official web-site at:
%1
").replace("-", "−").arg(update_url)); - QPushButton *btn1 = msgBox.addButton(tr("Discard"), QMessageBox::NoRole); - QPushButton *btn2 = msgBox.addButton(tr("Discard"), QMessageBox::AcceptRole); - btn1->setEnabled(false); - btn2->setVisible(false); - QTimer::singleShot(5000, btn1, SLOT(hide())); - QTimer::singleShot(5000, btn2, SLOT(show())); - msgBox.exec(); + msgBox.setText(text); + QPushButton *btn1 = msgBox.addButton(tr("Check for Updates"), QMessageBox::AcceptRole); + QPushButton *btn2 = msgBox.addButton(tr("Discard"), QMessageBox::NoRole); + QPushButton *btn3 = msgBox.addButton(btn2->text(), QMessageBox::RejectRole); + btn2->setEnabled(false); + btn3->setVisible(false); + QTimer::singleShot(7500, btn2, SLOT(hide())); + QTimer::singleShot(7500, btn3, SLOT(show())); + if(msgBox.exec() == 0) + { + QTimer::singleShot(0, this, SLOT(checkUpdates())); + return; + } + } + else if((!m_preferences->noUpdateReminder()) && (m_recentlyUsed->lastUpdateCheck() + 14 < x264_current_date_safe().toJulianDay())) + { + if(QMessageBox::warning(this, tr("Update Notification"), QString("%1").arg(tr("Your last update check was more than 14 days ago. Check for updates now?")), tr("Check for Updates"), tr("Discard")) == 0) + { + QTimer::singleShot(0, this, SLOT(checkUpdates())); + return; + } } //Add files from command-line @@ -905,15 +928,6 @@ void MainWindow::init(void) { createJobMultiple(files); } - - //Enable drag&drop support for this window, required for Qt v4.8.4+ - setAcceptDrops(true); - - //Update initialized flag - m_initialized = true; - - //FIXME - QTimer::singleShot(333, this, SLOT(checkUpdates())); } /* @@ -980,10 +994,15 @@ void MainWindow::checkUpdates(void) UpdaterDialog *updater = new UpdaterDialog(this, QString("%1/toolset").arg(m_appDir)); const int ret = updater->exec(); - if(ret == 42) + if(updater->getSuccess()) { - X264_DELETE(updater); - qWarning("Exitting to install update..."); + m_recentlyUsed->setLastUpdateCheck(x264_current_date_safe().toJulianDay()); + RecentlyUsed::saveRecentlyUsed(m_recentlyUsed); + } + + if(ret == UpdaterDialog::READY_TO_INSTALL_UPDATE) + { + qWarning("Exitting program to install update..."); close(); QApplication::quit(); } diff --git a/src/win_preferences.cpp b/src/win_preferences.cpp index 20d024e..a000eba 100644 --- a/src/win_preferences.cpp +++ b/src/win_preferences.cpp @@ -30,7 +30,7 @@ #include #include -static inline void UPDATE_CHECKBOX(QCheckBox *const chkbox, const bool value, const bool block) +static inline void UPDATE_CHECKBOX(QCheckBox *const chkbox, const bool value, const bool block = false) { if(block) { chkbox->blockSignals(true); } if(chkbox->isChecked() != value) chkbox->click(); @@ -76,6 +76,10 @@ PreferencesDialog::PreferencesDialog(QWidget *parent, PreferencesModel *preferen ui->labelSaveToSourceFolder->installEventFilter(this); ui->labelEnableSounds->installEventFilter(this); ui->labelDisableWarnings->installEventFilter(this); + ui->labelNoUpdateReminder->installEventFilter(this); + + ui->checkBoxDummy1->installEventFilter(this); + ui->checkBoxDummy2->installEventFilter(this); connect(ui->resetButton, SIGNAL(clicked()), this, SLOT(resetButtonPressed())); connect(ui->checkUse10BitEncoding, SIGNAL(toggled(bool)), this, SLOT(use10BitEncodingToggled(bool))); @@ -93,12 +97,13 @@ void PreferencesDialog::showEvent(QShowEvent *event) { if(event) QDialog::showEvent(event); - UPDATE_CHECKBOX(ui->checkRunNextJob, m_preferences->autoRunNextJob(), false); - UPDATE_CHECKBOX(ui->checkShutdownComputer, m_preferences->shutdownComputer(), false); - UPDATE_CHECKBOX(ui->checkUse64BitAvs2YUV, m_preferences->useAvisyth64Bit(), false); - UPDATE_CHECKBOX(ui->checkSaveLogFiles, m_preferences->saveLogFiles(), false); - UPDATE_CHECKBOX(ui->checkSaveToSourceFolder, m_preferences->saveToSourcePath(), false); - UPDATE_CHECKBOX(ui->checkEnableSounds, m_preferences->enableSounds(), false); + UPDATE_CHECKBOX(ui->checkRunNextJob, m_preferences->autoRunNextJob()); + UPDATE_CHECKBOX(ui->checkShutdownComputer, m_preferences->shutdownComputer()); + UPDATE_CHECKBOX(ui->checkUse64BitAvs2YUV, m_preferences->useAvisyth64Bit()); + UPDATE_CHECKBOX(ui->checkSaveLogFiles, m_preferences->saveLogFiles()); + UPDATE_CHECKBOX(ui->checkSaveToSourceFolder, m_preferences->saveToSourcePath()); + UPDATE_CHECKBOX(ui->checkEnableSounds, m_preferences->enableSounds()); + UPDATE_CHECKBOX(ui->checkNoUpdateReminder, m_preferences->noUpdateReminder()); UPDATE_CHECKBOX(ui->checkDisableWarnings, m_preferences->disableWarnings(), true); UPDATE_CHECKBOX(ui->checkUse10BitEncoding, m_preferences->use10BitEncoding(), true); @@ -112,14 +117,23 @@ void PreferencesDialog::showEvent(QShowEvent *event) bool PreferencesDialog::eventFilter(QObject *o, QEvent *e) { - emulateMouseEvent(o, e, ui->labelRunNextJob, ui->checkRunNextJob); - emulateMouseEvent(o, e, ui->labelShutdownComputer, ui->checkShutdownComputer); - emulateMouseEvent(o, e, ui->labelUse10BitEncoding, ui->checkUse10BitEncoding); - emulateMouseEvent(o, e, ui->labelUse64BitAvs2YUV, ui->checkUse64BitAvs2YUV); - emulateMouseEvent(o, e, ui->labelSaveLogFiles, ui->checkSaveLogFiles); - emulateMouseEvent(o, e, ui->labelSaveToSourceFolder, ui->checkSaveToSourceFolder); - emulateMouseEvent(o, e, ui->labelEnableSounds, ui->checkEnableSounds); - emulateMouseEvent(o, e, ui->labelDisableWarnings, ui->checkDisableWarnings); + if(e->type() == QEvent::Paint) + { + if(o == ui->checkBoxDummy1) return true; + if(o == ui->checkBoxDummy2) return true; + } + else if((e->type() == QEvent::MouseButtonPress) || (e->type() == QEvent::MouseButtonRelease)) + { + emulateMouseEvent(o, e, ui->labelRunNextJob, ui->checkRunNextJob); + emulateMouseEvent(o, e, ui->labelShutdownComputer, ui->checkShutdownComputer); + emulateMouseEvent(o, e, ui->labelUse10BitEncoding, ui->checkUse10BitEncoding); + emulateMouseEvent(o, e, ui->labelUse64BitAvs2YUV, ui->checkUse64BitAvs2YUV); + emulateMouseEvent(o, e, ui->labelSaveLogFiles, ui->checkSaveLogFiles); + emulateMouseEvent(o, e, ui->labelSaveToSourceFolder, ui->checkSaveToSourceFolder); + emulateMouseEvent(o, e, ui->labelEnableSounds, ui->checkEnableSounds); + emulateMouseEvent(o, e, ui->labelDisableWarnings, ui->checkDisableWarnings); + emulateMouseEvent(o, e, ui->labelNoUpdateReminder, ui->checkNoUpdateReminder); + } return false; } @@ -127,18 +141,15 @@ void PreferencesDialog::emulateMouseEvent(QObject *object, QEvent *event, QWidge { if(object == source) { - if((event->type() == QEvent::MouseButtonPress) || (event->type() == QEvent::MouseButtonRelease)) + if(QMouseEvent *mouseEvent = dynamic_cast(event)) { - if(QMouseEvent *mouseEvent = dynamic_cast(event)) - { - qApp->postEvent(target, new QMouseEvent - ( - event->type(), - qApp->widgetAt(mouseEvent->globalPos()) == source ? QPoint(1, 1) : QPoint(INT_MAX, INT_MAX), - Qt::LeftButton, - 0, 0 - )); - } + qApp->postEvent(target, new QMouseEvent + ( + event->type(), + (qApp->widgetAt(mouseEvent->globalPos()) == source) ? QPoint(1, 1) : QPoint(INT_MAX, INT_MAX), + Qt::LeftButton, + 0, 0 + )); } } } @@ -155,6 +166,7 @@ void PreferencesDialog::done(int n) m_preferences->setProcessPriority(ui->comboBoxPriority->itemData(ui->comboBoxPriority->currentIndex()).toInt()); m_preferences->setEnableSounds(ui->checkEnableSounds->isChecked()); m_preferences->setDisableWarnings(ui->checkDisableWarnings->isChecked()); + m_preferences->setNoUpdateReminder(ui->checkNoUpdateReminder->isChecked()); PreferencesModel::savePreferences(m_preferences); QDialog::done(n); diff --git a/src/win_preferences.h b/src/win_preferences.h index 17dcd68..692dd7b 100644 --- a/src/win_preferences.h +++ b/src/win_preferences.h @@ -45,7 +45,7 @@ protected: virtual void showEvent(QShowEvent *event); virtual bool eventFilter(QObject *o, QEvent *e); - void emulateMouseEvent(QObject *object, QEvent *event, QWidget *source, QWidget *target); + inline static void emulateMouseEvent(QObject *object, QEvent *event, QWidget *source, QWidget *target); private: Ui::PreferencesDialog *const ui; diff --git a/src/win_updater.cpp b/src/win_updater.cpp index e9f1c32..caca516 100644 --- a/src/win_updater.cpp +++ b/src/win_updater.cpp @@ -47,6 +47,7 @@ ui->labelLoadingLeft->setVisible((FLAG)); \ ui->labelLoadingCenter->setVisible((FLAG)); \ ui->labelLoadingRight->setVisible((FLAG)); \ + ui->labelBuildNo->setVisible(!(FLAG)); \ ui->labelInfo->setVisible(!(FLAG)); \ ui->labelUrl->setVisible(!(FLAG)); \ if((FLAG)) m_animator->start(); else m_animator->stop(); \ @@ -66,6 +67,7 @@ UpdaterDialog::UpdaterDialog(QWidget *parent, const QString &binDir) m_status(UpdateCheckThread::UpdateStatus_NotStartedYet), m_thread(NULL), m_updaterProcess(NULL), + m_success(false), m_firstShow(true) { //Init the dialog, from the .ui file @@ -96,6 +98,7 @@ UpdaterDialog::UpdaterDialog(QWidget *parent, const QString &binDir) //Hide labels ui->labelInfo->hide(); ui->labelUrl->hide(); + ui->labelBuildNo->hide(); } UpdaterDialog::~UpdaterDialog(void) @@ -146,7 +149,7 @@ void UpdaterDialog::showEvent(QShowEvent *event) if(m_firstShow) { m_firstShow = false; - QTimer::singleShot(0, this, SLOT(initUpdate())); + QTimer::singleShot(16, this, SLOT(initUpdate())); } } @@ -204,7 +207,7 @@ void UpdaterDialog::initUpdate(void) } //Begin updater run - QTimer::singleShot(125, this, SLOT(checkForUpdates())); + QTimer::singleShot(16, this, SLOT(checkForUpdates())); } void UpdaterDialog::checkForUpdates(void) @@ -216,6 +219,7 @@ void UpdaterDialog::checkForUpdates(void) //Clear texts ui->retranslateUi(this); + ui->labelBuildNo->setText(tr("Installed build is #%1 | Latest build is #%2").arg(QString::number(x264_version_build()), tr("N/A"))); //Init buttons ui->buttonCancel->setEnabled(false); @@ -240,7 +244,7 @@ void UpdaterDialog::checkForUpdates(void) m_logFile.clear(); //Start the updater thread - QTimer::singleShot(125, m_thread, SLOT(start())); + QTimer::singleShot(250, m_thread, SLOT(start())); } void UpdaterDialog::threadStatusChanged(int status) @@ -290,6 +294,12 @@ void UpdaterDialog::threadStatusChanged(int status) } void UpdaterDialog::threadFinished(void) +{ + m_success = m_thread->getSuccess(); + QTimer::singleShot((m_success ? 1000 : 0), this, SLOT(updateFinished())); +} + +void UpdaterDialog::updateFinished(void) { //Restore cursor QApplication::restoreOverrideCursor(); @@ -309,7 +319,7 @@ void UpdaterDialog::threadFinished(void) UPDATE_TEXT(3, tr("Your version is up-to-date.")); break; case UpdateCheckThread::UpdateStatus_CompletedNewVersionOlder: - UPDATE_ICON(3, "shield_error"); + UPDATE_ICON(3, "shield_blue"); UPDATE_TEXT(3, tr("You are using a pre-release version!")); break; default: @@ -324,6 +334,7 @@ void UpdaterDialog::threadFinished(void) case UpdateCheckThread::UpdateStatus_CompletedNoUpdates: case UpdateCheckThread::UpdateStatus_CompletedNewVersionOlder: SHOW_ANIMATION(false); + ui->labelBuildNo->setText(tr("Installed build is #%1 | Latest build is #%2").arg(QString::number(x264_version_build()), QString::number(m_thread->getUpdateInfo()->m_buildNo))); ui->labelUrl->setText(QString("%1").arg(m_thread->getUpdateInfo()->m_downloadSite)); break; case UpdateCheckThread::UpdateStatus_ErrorNoConnection: @@ -411,7 +422,7 @@ void UpdaterDialog::installUpdate(void) if(process.exitCode() == 0) { - done(42); + done(READY_TO_INSTALL_UPDATE); } } diff --git a/src/win_updater.h b/src/win_updater.h index fb516a9..ef9c600 100644 --- a/src/win_updater.h +++ b/src/win_updater.h @@ -39,6 +39,10 @@ public: UpdaterDialog(QWidget *parent, const QString &binDir); ~UpdaterDialog(void); + static const int READY_TO_INSTALL_UPDATE = 42; + + inline bool getSuccess(void) { return m_success; } + protected: virtual bool event(QEvent *e); virtual void showEvent(QShowEvent *event); @@ -51,6 +55,7 @@ private slots: void threadStatusChanged(int status); void threadMessageLogged(const QString &message); void threadFinished(void); + void updateFinished(void); void openUrl(const QString &url); void installUpdate(void); @@ -61,6 +66,7 @@ private: bool checkFileHash(const QString &filePath, const char *expectedHash); bool m_firstShow; + bool m_success; const QString m_binDir; QMovie *m_animator; UpdateCheckThread *m_thread; diff --git a/x264_launcher_MSVC2013.vcxproj b/x264_launcher_MSVC2013.vcxproj index 1bc44fe..1145087 100644 --- a/x264_launcher_MSVC2013.vcxproj +++ b/x264_launcher_MSVC2013.vcxproj @@ -97,7 +97,7 @@ copy /Y "$(SolutionDir)etc\vld\bin\Win32\*.manifest" "$(TargetDir)" Copy Toolset - "$(SolutionDir)etc\auto_inc.exe" VER_X264_BUILD "$(SolutionDir)src\version.h" 5 + "$(SolutionDir)etc\auto_inc.exe" VER_X264_BUILD "$(SolutionDir)src\version.h" 30 Update Build Number @@ -135,7 +135,7 @@ copy /Y "$(SolutionDir)etc\vld\bin\Win32\*.manifest" "$(TargetDir)" x264_entry_point - "$(SolutionDir)etc\auto_inc.exe" VER_X264_BUILD "$(SolutionDir)src\version.h" 5 + "$(SolutionDir)etc\auto_inc.exe" VER_X264_BUILD "$(SolutionDir)src\version.h" 30 Update Build Number