diff --git a/qrenderdoc/Code/Resources.h b/qrenderdoc/Code/Resources.h index 7f43df255..ebf18cd13 100644 --- a/qrenderdoc/Code/Resources.h +++ b/qrenderdoc/Code/Resources.h @@ -76,6 +76,7 @@ RESOURCE_DEF(time, "time.png") \ RESOURCE_DEF(timeline_marker, "timeline_marker.png") \ RESOURCE_DEF(upfolder, "upfolder.png") \ + RESOURCE_DEF(update, "update.png") \ RESOURCE_DEF(wand, "wand.png") \ RESOURCE_DEF(wireframe_mesh, "wireframe_mesh.png") \ RESOURCE_DEF(wrench, "wrench.png") \ diff --git a/qrenderdoc/Resources/resources.qrc b/qrenderdoc/Resources/resources.qrc index 222300347..9abe31949 100644 --- a/qrenderdoc/Resources/resources.qrc +++ b/qrenderdoc/Resources/resources.qrc @@ -109,6 +109,8 @@ time@2x.png timeline_marker.png timeline_marker@2x.png + update.png + update@2x.png upfolder.png upfolder@2x.png wand.png diff --git a/qrenderdoc/Resources/update.png b/qrenderdoc/Resources/update.png new file mode 100644 index 000000000..b7639f155 Binary files /dev/null and b/qrenderdoc/Resources/update.png differ diff --git a/qrenderdoc/Resources/update@2x.png b/qrenderdoc/Resources/update@2x.png new file mode 100644 index 000000000..c1ab75d3b Binary files /dev/null and b/qrenderdoc/Resources/update@2x.png differ diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index d6203240a..005c79423 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -51,6 +51,9 @@ #include "ui_MainWindow.h" #include "version.h" +#undef RENDERDOC_OFFICIAL_BUILD +#define RENDERDOC_OFFICIAL_BUILD 1 + #define JSON_ID "rdocLayoutData" #define JSON_VER 1 @@ -183,23 +186,35 @@ MainWindow::MainWindow(ICaptureContext &ctx) : QMainWindow(NULL), ui(new Ui::Mai m_NetManager = new QNetworkAccessManager(this); + updateAction = new QAction(this); + updateAction->setText(tr("Update Available!")); + updateAction->setIcon(Icons::update()); + + QObject::connect(updateAction, &QAction::triggered, this, &MainWindow::updateAvailable_triggered); + #if !defined(Q_OS_WIN32) // update checks only happen on windows { QList actions = ui->menu_Help->actions(); - int idx = actions.indexOf(ui->action_Update_Available); + int idx = actions.indexOf(ui->action_Check_for_Updates); idx++; if(idx < actions.count() && actions[idx]->isSeparator()) delete actions[idx]; - delete ui->action_Update_Available; - ui->action_Update_Available = NULL; - delete ui->action_Check_for_Updates; ui->action_Check_for_Updates = NULL; + + delete updateAction; + updateAction = NULL; } #endif + if(updateAction) + { + ui->menuBar->addAction(updateAction); + updateAction->setVisible(false); + } + PopulateRecentCaptureFiles(); PopulateRecentCaptureSettings(); PopulateReportedBugs(); @@ -1027,7 +1042,7 @@ void MainWindow::PopulateReportedBugs() void MainWindow::CheckUpdates(bool forceCheck, UpdateResultMethod callback) { - if(!ui->action_Update_Available) + if(!updateAction) return; bool mismatch = HandleMismatchedVersions(); @@ -1036,33 +1051,46 @@ void MainWindow::CheckUpdates(bool forceCheck, UpdateResultMethod callback) if(!forceCheck && !m_Ctx.Config().CheckUpdate_AllowChecks) { - ui->action_Update_Available->setText(tr("Update checks disabled")); - ui->action_Update_Available->setEnabled(false); + updateAction->setVisible(false); if(callback) callback(UpdateResult::Disabled); return; } #if RENDERDOC_OFFICIAL_BUILD + QDateTime today = QDateTime::currentDateTime(); + + // check by default every 2 days + QDateTime compare = today.addDays(-2); + + // if there's already an update available, go down to checking every week. + if(m_Ctx.Config().CheckUpdate_UpdateAvailable) + compare = today.addDays(-7); + + bool checkDue = compare.secsTo(m_Ctx.Config().CheckUpdate_LastUpdate) < 0; + if(m_Ctx.Config().CheckUpdate_UpdateAvailable) { - if(m_Ctx.Config().CheckUpdate_UpdateResponse.isEmpty()) + // Mark an update available + SetUpdateAvailable(); + + // If we don't have a proper update response, or we're overdue for a check, then do it again. + // The reason for this is twofold: first, if someone has been delaying their updates for a long + // time then there might be a newer update available that we should refresh to, so we should + // find out and refresh the update status. The other reason is that when we get a positive + // response from the server we force-display the popup which means the user will get reminded + // every week or so that an update is pending. + if(m_Ctx.Config().CheckUpdate_UpdateResponse.isEmpty() || checkDue) { forceCheck = true; } - else if(!forceCheck) - { - SetUpdateAvailable(); + + // If we're not forcing a recheck, we're done. + if(!forceCheck) return; - } } - QDateTime today = QDateTime::currentDateTime(); - QDateTime compare = today.addDays(-2); - - qint64 diff = compare.secsTo(m_Ctx.Config().CheckUpdate_LastUpdate); - - if(!forceCheck && diff > 0) + if(!forceCheck && checkDue) { if(callback) callback(UpdateResult::Toosoon); @@ -1132,22 +1160,14 @@ void MainWindow::CheckUpdates(bool forceCheck, UpdateResultMethod callback) void MainWindow::SetUpdateAvailable() { - if(!ui->action_Update_Available) - return; - - ui->menu_Help->setIcon(Icons::hourglass()); - ui->action_Update_Available->setEnabled(true); - ui->action_Update_Available->setText(tr("An update is available")); + if(updateAction) + updateAction->setVisible(true); } void MainWindow::SetNoUpdate() { - if(!ui->action_Update_Available) - return; - - ui->menu_Help->setIcon(QIcon()); - ui->action_Update_Available->setEnabled(false); - ui->action_Update_Available->setText(tr("No update available")); + if(updateAction) + updateAction->setVisible(false); } void MainWindow::UpdatePopup() @@ -2215,7 +2235,7 @@ void MainWindow::on_action_Check_for_Updates_triggered() }); } -void MainWindow::on_action_Update_Available_triggered() +void MainWindow::updateAvailable_triggered() { bool mismatch = HandleMismatchedVersions(); if(mismatch) diff --git a/qrenderdoc/Windows/MainWindow.h b/qrenderdoc/Windows/MainWindow.h index a25d34b7f..5c4048e67 100644 --- a/qrenderdoc/Windows/MainWindow.h +++ b/qrenderdoc/Windows/MainWindow.h @@ -139,11 +139,11 @@ private slots: void on_action_Resource_Inspector_triggered(); void on_action_Send_Error_Report_triggered(); void on_action_Check_for_Updates_triggered(); - void on_action_Update_Available_triggered(); // manual slots void saveLayout_triggered(); void loadLayout_triggered(); + void updateAvailable_triggered(); void messageCheck(); void remoteProbe(); void statusDoubleClicked(QMouseEvent *event); @@ -189,6 +189,8 @@ private: QMenu *contextChooserMenu; QToolButton *contextChooser; + QAction *updateAction = NULL; + QTimer m_MessageTick; QSemaphore m_RemoteProbeSemaphore; LambdaThread *m_RemoteProbe; diff --git a/qrenderdoc/Windows/MainWindow.ui b/qrenderdoc/Windows/MainWindow.ui index ada8d5a89..702fc350f 100644 --- a/qrenderdoc/Windows/MainWindow.ui +++ b/qrenderdoc/Windows/MainWindow.ui @@ -14,7 +14,7 @@ QRenderDoc - + :/logo.svg:/logo.svg @@ -155,7 +155,6 @@ - @@ -254,11 +253,6 @@ T&imeline - - - Layout 1 - - &Default Layout @@ -289,11 +283,6 @@ Layout &4 - - - Layout &5 - - Layout &5 @@ -364,18 +353,6 @@ Send &Error Report - - - false - - - - :/hourglass.png:/hourglass.png - - - No update available - - Source on GitHub @@ -465,8 +442,6 @@
3rdparty/toolwindowmanager/ToolWindowManager.h
- - - + diff --git a/qrenderdoc/qrenderdoc_local.vcxproj b/qrenderdoc/qrenderdoc_local.vcxproj index 7eb64bd6e..d5d3ab6e0 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj +++ b/qrenderdoc/qrenderdoc_local.vcxproj @@ -1813,6 +1813,8 @@ IF %ERRORLEVEL% NEQ 0 (echo ==================================================== + + diff --git a/qrenderdoc/qrenderdoc_local.vcxproj.filters b/qrenderdoc/qrenderdoc_local.vcxproj.filters index eadccba05..6c414817e 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj.filters +++ b/qrenderdoc/qrenderdoc_local.vcxproj.filters @@ -1753,6 +1753,12 @@ Resources\Files + + Resources\Files + + + Resources\Files +