GUI: Detect when version is old

This commit is contained in:
Daniel Marjamäki 2022-10-09 18:51:01 +02:00
parent d1bfae989e
commit 94c3108494
8 changed files with 148 additions and 6 deletions

View File

@ -1,5 +1,5 @@
if (BUILD_GUI)
list(APPEND qt_components Core Gui Widgets PrintSupport LinguistTools Help)
list(APPEND qt_components Core Gui Widgets PrintSupport LinguistTools Help Network)
if (WITH_QCHART)
list(APPEND qt_components Charts)
endif()

View File

@ -28,6 +28,7 @@ if (QT_VERSION VERSION_LESS 5.15)
set(QT_HELP_LIB Qt5::Help)
set(QT_PRINTSUPPORT_LIB Qt5::PrintSupport)
set(QT_CHARTS_LIB Qt5::Charts)
set(QT_NETWORK_LIB Qt5::Network)
else()
# use "versionless" targets - no need for wrapper functions
@ -38,4 +39,5 @@ else()
set(QT_HELP_LIB Qt::Help)
set(QT_PRINTSUPPORT_LIB Qt::PrintSupport)
set(QT_CHARTS_LIB Qt::Charts)
endif()
set(QT_NETWORK_LIB Qt::Network)
endif()

View File

@ -47,7 +47,7 @@ CheckOptions:
if(tinyxml2_FOUND AND NOT USE_BUNDLED_TINYXML2)
target_link_libraries(cppcheck-gui ${tinyxml2_LIBRARIES})
endif()
target_link_libraries(cppcheck-gui ${QT_CORE_LIB} ${QT_GUI_LIB} ${QT_WIDGETS_LIB} ${QT_PRINTSUPPORT_LIB} ${QT_HELP_LIB})
target_link_libraries(cppcheck-gui ${QT_CORE_LIB} ${QT_GUI_LIB} ${QT_WIDGETS_LIB} ${QT_PRINTSUPPORT_LIB} ${QT_HELP_LIB} ${QT_NETWORK_LIB})
if(WITH_QCHART)
target_compile_definitions (cppcheck-gui PRIVATE HAVE_QCHART)
target_link_libraries(cppcheck-gui ${QT_CHARTS_LIB})

View File

@ -89,6 +89,7 @@
#define SETTINGS_SHOW_ERROR_ID "Show error Id"
#define SETTINGS_SHOW_STATISTICS "Show statistics"
#define SETTINGS_OPEN_PROJECT "Open Project"
#define SETTINGS_CHECK_VERSION "Check Version"
// The maximum value for the progress bar
#define PROGRESS_MAX 1024.0

View File

@ -10,6 +10,7 @@ INCLUDEPATH += . \
QT += widgets
QT += printsupport
QT += help
QT += network
# Build online help
onlinehelp.target = online-help.qhc

View File

@ -66,6 +66,8 @@
#include <QRegularExpression>
#include <QSettings>
#include <QTimer>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
static const QString OnlineHelpURL("https://cppcheck.sourceforge.io/manual.html");
static const QString compile_commands_json("compile_commands.json");
@ -246,6 +248,24 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) :
#endif
Platform &platform = mPlatforms.get((Settings::PlatformType)mSettings->value(SETTINGS_CHECKED_PLATFORM, defaultPlatform).toInt());
platform.mActMainWindow->setChecked(true);
mNetworkAccessManager = new QNetworkAccessManager(this);
connect(mNetworkAccessManager, &QNetworkAccessManager::finished,
this, &MainWindow::replyFinished);
mUI->mLabelInformation->setVisible(false);
mUI->mButtonHideInformation->setVisible(false);
connect(mUI->mButtonHideInformation, &QPushButton::clicked,
this, &MainWindow::hideInformation);
// Is there a new version?
if (isCppcheckPremium()) {
const QUrl url("https://files.cppchecksolutions.com/version.txt");
mNetworkAccessManager->get(QNetworkRequest(url));
} else {
const QUrl url("https://cppcheck.sourceforge.io/version.txt");
mNetworkAccessManager->get(QNetworkRequest(url));
}
}
MainWindow::~MainWindow()
@ -1880,6 +1900,63 @@ void MainWindow::suppressIds(QStringList ids)
mProjectFile->write();
}
static int getVersion(const QString& nameWithVersion) {
int ret = 0;
int v = 0;
int dot = 0;
for (const auto c: nameWithVersion) {
if (c == '\n' || c == '\r')
break;
else if (c == ' ')
dot = ret = v = 0;
else if (c == '.') {
++dot;
ret = ret * 1000 + v;
v = 0;
} else if (c >= '0' && c <= '9')
v = v * 10 + (c.toLatin1() - '0');
}
ret = ret * 1000 + v;
while (dot < 2) {
++dot;
ret *= 1000;
}
return ret;
}
void MainWindow::replyFinished(QNetworkReply *reply) {
reply->deleteLater();
if (reply->error()) {
// TODO?
qDebug() << "Response: ERROR";
return;
}
const QString str = reply->readAll();
qDebug() << "Response: " << str;
if (reply->url().fileName() == "version.txt") {
QString nameWithVersion = QString("Cppcheck %1").arg(CppCheck::version());
if (!mCppcheckCfgProductName.isEmpty())
nameWithVersion = mCppcheckCfgProductName;
const int appVersion = getVersion(nameWithVersion);
const int latestVersion = getVersion(str.trimmed());
if (appVersion < latestVersion) {
if (mSettings->value(SETTINGS_CHECK_VERSION, 0).toInt() != latestVersion) {
mUI->mButtonHideInformation->setVisible(true);
mUI->mLabelInformation->setVisible(true);
mUI->mLabelInformation->setText(tr("New version available: %1").arg(str.trimmed()));
}
}
}
}
void MainWindow::hideInformation() {
int version = getVersion(mUI->mLabelInformation->text());
mSettings->setValue(SETTINGS_CHECK_VERSION, version);
mUI->mLabelInformation->setVisible(false);
mUI->mButtonHideInformation->setVisible(false);
}
bool MainWindow::isCppcheckPremium() const {
return mCppcheckCfgProductName.startsWith("Cppcheck Premium ");
}

View File

@ -40,6 +40,8 @@ class QLineEdit;
class ImportProject;
class QCloseEvent;
class QObject;
class QNetworkAccessManager;
class QNetworkReply;
namespace Ui {
class MainWindow;
}
@ -228,6 +230,10 @@ protected slots:
/** Suppress error ids */
void suppressIds(QStringList ids);
private slots:
void replyFinished(QNetworkReply *reply);
void hideInformation();
private:
bool isCppcheckPremium() const;
@ -465,6 +471,8 @@ private:
QString mCppcheckCfgAbout;
QString mCppcheckCfgProductName;
QNetworkAccessManager *mNetworkAccessManager = nullptr;
};
/// @}
#endif // MAINWINDOW_H

View File

@ -50,9 +50,62 @@
<height>16777215</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="ResultsView" name="mResults" native="true"/>
<widget class="ResultsView" name="mResults" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QLabel" name="mLabelInformation">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="mButtonHideInformation">
<property name="text">
<string>Hide</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
@ -62,7 +115,7 @@
<x>0</x>
<y>0</y>
<width>640</width>
<height>28</height>
<height>30</height>
</rect>
</property>
<widget class="QMenu" name="mMenuFile">