diff --git a/UpdateStatusWidget.cpp b/UpdateStatusWidget.cpp index 10c6b44..ba05fd0 100644 --- a/UpdateStatusWidget.cpp +++ b/UpdateStatusWidget.cpp @@ -52,10 +52,10 @@ void UpdateStatusWidget::setDefaultAction(QAction *action) void UpdateStatusWidget::showUpdateAvailable(const QString &version) { - m_versionLabel->setText(tr("new version: v%1").arg(version)); + m_versionLabel->setText(tr("New version: v%1").arg(version)); m_versionLabel->setVisible(true); m_updateButton->setVisible(true); - m_updateButton->setToolTip(tr("Update QodeAssist to version %1").arg(version)); + m_updateButton->setToolTip(tr("Check update information")); } void UpdateStatusWidget::hideUpdateInfo() diff --git a/qodeassist.cpp b/qodeassist.cpp index 2415071..e2d3538 100644 --- a/qodeassist.cpp +++ b/qodeassist.cpp @@ -179,9 +179,7 @@ private: void handleUpdateCheckResult(const PluginUpdater::UpdateInfo &info) { - if (!info.isUpdateAvailable - || QVersionNumber::fromString(info.currentIdeVersion) - > QVersionNumber::fromString(info.targetIdeVersion)) + if (!info.isUpdateAvailable) return; if (m_statusWidget) diff --git a/settings/PluginUpdater.cpp b/settings/PluginUpdater.cpp index 0c437cb..5873aad 100644 --- a/settings/PluginUpdater.cpp +++ b/settings/PluginUpdater.cpp @@ -25,7 +25,6 @@ #include #include #include -#include namespace QodeAssist { @@ -57,7 +56,7 @@ void PluginUpdater::handleUpdateResponse(QNetworkReply *reply) UpdateInfo info; if (reply->error() != QNetworkReply::NoError) { - emit downloadError(reply->errorString()); + emit updateCheckFinished(info); return; } @@ -68,45 +67,8 @@ void PluginUpdater::handleUpdateResponse(QNetworkReply *reply) if (info.version.startsWith('v')) info.version.remove(0, 1); - QString qtcVersionStr = Core::ICore::versionString().split(' ').last(); - QVersionNumber qtcVersion = QVersionNumber::fromString(qtcVersionStr); - info.currentIdeVersion = qtcVersionStr; - - auto assets = obj["assets"].toArray(); - for (const auto &asset : assets) { - QString name = asset.toObject()["name"].toString(); - - if (name.startsWith("QodeAssist-")) { - QString assetVersionStr = name.section('-', 1, 1); - QVersionNumber assetVersion = QVersionNumber::fromString(assetVersionStr); - info.targetIdeVersion = assetVersionStr; - - if (assetVersion != qtcVersion) { - continue; - } - -#if defined(Q_OS_WIN) - if (name.contains("Windows")) -#elif defined(Q_OS_MACOS) - if (name.contains("macOS")) -#else - if (name.contains("Linux") && !name.contains("experimental")) -#endif - { - info.downloadUrl = asset.toObject()["browser_download_url"].toString(); - info.fileName = name; - break; - } - } - } - - if (info.downloadUrl.isEmpty()) { - info.incompatibleIdeVersion = true; - emit updateCheckFinished(info); - return; - } - info.changeLog = obj["body"].toString(); + info.isUpdateAvailable = QVersionNumber::fromString(info.version) > QVersionNumber::fromString(currentVersion()); @@ -114,15 +76,6 @@ void PluginUpdater::handleUpdateResponse(QNetworkReply *reply) emit updateCheckFinished(info); } -void PluginUpdater::downloadUpdate(const QString &url) -{ - QNetworkRequest request(url); - QNetworkReply *reply = m_networkManager->get(request); - - connect(reply, &QNetworkReply::downloadProgress, this, &PluginUpdater::handleDownloadProgress); - connect(reply, &QNetworkReply::finished, this, &PluginUpdater::handleDownloadFinished); -} - QString PluginUpdater::currentVersion() const { const auto pluginSpecs = ExtensionSystem::PluginManager::plugins(); @@ -143,46 +96,4 @@ QString PluginUpdater::getUpdateUrl() const return "https://api.github.com/repos/Palm1r/qodeassist/releases/latest"; } -void PluginUpdater::handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) -{ - emit downloadProgress(bytesReceived, bytesTotal); -} - -void PluginUpdater::handleDownloadFinished() -{ - auto reply = qobject_cast(sender()); - QTC_ASSERT(reply, return); - - if (reply->error() != QNetworkReply::NoError) { - emit downloadError(reply->errorString()); - reply->deleteLater(); - return; - } - - QString downloadPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) - + QDir::separator() + "QodeAssist_v" + m_lastUpdateInfo.version; - QDir().mkpath(downloadPath); - - QString filePath = downloadPath + QDir::separator() + m_lastUpdateInfo.fileName; - - if (QFile::exists(filePath)) { - emit downloadError(tr("Update file already exists: %1").arg(filePath)); - reply->deleteLater(); - return; - } - - QFile file(filePath); - if (!file.open(QIODevice::WriteOnly)) { - emit downloadError(tr("Could not save the update file")); - reply->deleteLater(); - return; - } - - file.write(reply->readAll()); - file.close(); - - emit downloadFinished(filePath); - reply->deleteLater(); -} - } // namespace QodeAssist diff --git a/settings/PluginUpdater.hpp b/settings/PluginUpdater.hpp index 13dc83b..9e67d4a 100644 --- a/settings/PluginUpdater.hpp +++ b/settings/PluginUpdater.hpp @@ -20,7 +20,6 @@ #pragma once #include -#include #include #include #include @@ -35,38 +34,27 @@ public: struct UpdateInfo { QString version; - QString downloadUrl; QString changeLog; - QString fileName; - bool isUpdateAvailable; - bool incompatibleIdeVersion{false}; - QString targetIdeVersion; - QString currentIdeVersion; + bool isUpdateAvailable = false; }; explicit PluginUpdater(QObject *parent = nullptr); ~PluginUpdater() = default; void checkForUpdates(); - void downloadUpdate(const QString &url); QString currentVersion() const; bool isUpdateAvailable() const; signals: void updateCheckFinished(const UpdateInfo &info); - void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); - void downloadFinished(const QString &filePath); - void downloadError(const QString &error); private: void handleUpdateResponse(QNetworkReply *reply); - void handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); - void handleDownloadFinished(); QString getUpdateUrl() const; QNetworkAccessManager *m_networkManager; UpdateInfo m_lastUpdateInfo; - bool m_isCheckingUpdate{false}; + bool m_isCheckingUpdate = false; }; } // namespace QodeAssist diff --git a/settings/UpdateDialog.cpp b/settings/UpdateDialog.cpp index 21000cd..11296e5 100644 --- a/settings/UpdateDialog.cpp +++ b/settings/UpdateDialog.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include namespace QodeAssist { @@ -32,7 +34,7 @@ UpdateDialog::UpdateDialog(QWidget *parent) { setWindowTitle(tr("QodeAssist Update")); setMinimumWidth(400); - setMinimumHeight(500); + setMinimumHeight(300); m_layout = new QVBoxLayout(this); m_layout->setSpacing(12); @@ -61,34 +63,24 @@ UpdateDialog::UpdateDialog(QWidget *parent) m_layout->addWidget(m_titleLabel); m_versionLabel = new QLabel( - tr("Version %1 is now available - you have %2").arg(m_updater->currentVersion()), this); + tr("Version %1 is now available - you have %2").arg("", m_updater->currentVersion()), this); m_versionLabel->setAlignment(Qt::AlignCenter); m_layout->addWidget(m_versionLabel); - m_releaseLink = new QLabel(this); - m_releaseLink->setOpenExternalLinks(true); - m_releaseLink->setTextFormat(Qt::RichText); - m_releaseLink->setAlignment(Qt::AlignCenter); - m_layout->addWidget(m_releaseLink); + m_changelogLabel = new QLabel(tr("Release Notes:"), this); + m_layout->addWidget(m_changelogLabel); - if (!m_changelogLabel) { - m_changelogLabel = new QLabel(tr("Release Notes:"), this); - m_layout->addWidget(m_changelogLabel); - - m_changelogText = new QTextEdit(this); - m_changelogText->setReadOnly(true); - m_changelogText->setMinimumHeight(100); - m_layout->addWidget(m_changelogText); - } - - m_progress = new QProgressBar(this); - m_progress->setVisible(false); - m_layout->addWidget(m_progress); + m_changelogText = new QTextEdit(this); + m_changelogText->setReadOnly(true); + m_changelogText->setMinimumHeight(100); + m_layout->addWidget(m_changelogText); auto *buttonLayout = new QHBoxLayout; - m_downloadButton = new QPushButton(tr("Download"), this); - m_downloadButton->setEnabled(false); - buttonLayout->addWidget(m_downloadButton); + m_buttonOpenReleasePage = new QPushButton(tr("Open Release Page"), this); + buttonLayout->addWidget(m_buttonOpenReleasePage); + + m_buttonOpenPluginFolder = new QPushButton(tr("Open Plugin Folder"), this); + buttonLayout->addWidget(m_buttonOpenPluginFolder); m_closeButton = new QPushButton(tr("Close"), this); buttonLayout->addWidget(m_closeButton); @@ -96,11 +88,8 @@ UpdateDialog::UpdateDialog(QWidget *parent) m_layout->addLayout(buttonLayout); connect(m_updater, &PluginUpdater::updateCheckFinished, this, &UpdateDialog::handleUpdateInfo); - connect(m_updater, &PluginUpdater::downloadProgress, this, &UpdateDialog::updateProgress); - connect(m_updater, &PluginUpdater::downloadFinished, this, &UpdateDialog::handleDownloadFinished); - connect(m_updater, &PluginUpdater::downloadError, this, &UpdateDialog::handleDownloadError); - - connect(m_downloadButton, &QPushButton::clicked, this, &UpdateDialog::startDownload); + connect(m_buttonOpenReleasePage, &QPushButton::clicked, this, &UpdateDialog::openReleasePage); + connect(m_buttonOpenPluginFolder, &QPushButton::clicked, this, &UpdateDialog::openPluginFolder); connect(m_closeButton, &QPushButton::clicked, this, &QDialog::reject); m_updater->checkForUpdates(); @@ -115,22 +104,12 @@ void UpdateDialog::checkForUpdatesAndShow(QWidget *parent) void UpdateDialog::handleUpdateInfo(const PluginUpdater::UpdateInfo &info) { - m_releaseLink->setText( - tr("You can also download " - "from GitHub Releases")); - - if (info.incompatibleIdeVersion) { - m_titleLabel->setText(tr("Incompatible Qt Creator Version")); - m_versionLabel->setText(tr("This update requires Qt Creator %1, current is %2.\n" - "Please upgrade Qt Creator to use this version of QodeAssist.") - .arg(info.targetIdeVersion, info.currentIdeVersion)); - m_downloadButton->setEnabled(false); - return; - } + m_updateInfo = info; if (!info.isUpdateAvailable) { m_titleLabel->setText(tr("QodeAssist is up to date")); - m_downloadButton->setEnabled(false); + m_versionLabel->setText( + tr("You are using the latest version: %1").arg(m_updater->currentVersion())); return; } @@ -139,72 +118,31 @@ void UpdateDialog::handleUpdateInfo(const PluginUpdater::UpdateInfo &info) .arg(info.version, m_updater->currentVersion())); if (!info.changeLog.isEmpty()) { - if (!m_changelogLabel) { - m_changelogLabel = new QLabel(tr("Release Notes:"), this); - m_layout->insertWidget(2, m_changelogLabel); - - m_changelogText = new QTextEdit(this); - m_changelogText->setReadOnly(true); - m_changelogText->setMaximumHeight(200); - m_layout->insertWidget(3, m_changelogText); - } m_changelogText->setText(info.changeLog); + } else { + m_changelogText->setText( + tr("No release notes available. Check the release page for more information.")); } - - m_downloadButton->setEnabled(true); - m_updateInfo = info; } -void UpdateDialog::startDownload() +void UpdateDialog::openReleasePage() { - m_downloadButton->setEnabled(false); - m_progress->setVisible(true); - m_updater->downloadUpdate(m_updateInfo.downloadUrl); + QDesktopServices::openUrl(QUrl("https://github.com/Palm1r/QodeAssist/releases/latest")); + accept(); } -void UpdateDialog::updateProgress(qint64 received, qint64 total) +void UpdateDialog::openPluginFolder() { - m_progress->setMaximum(total); - m_progress->setValue(received); -} - -void UpdateDialog::handleDownloadFinished(const QString &path) -{ - m_progress->setVisible(false); - - QMessageBox msgBox(this); - msgBox.setWindowTitle(tr("Update Downloaded")); - msgBox.setText(tr("The update has been downloaded successfully.\n" - "Would you like to close Qt Creator now and open the plugin folder?")); - msgBox.setInformativeText(tr("To complete the update:\n\n" - "1. Close Qt Creator completely\n" - "2. Navigate to the plugin folder\n" - "3. Remove the old version of QodeAssist plugin\n" - "4. Install plugin as usual via About plugin menu")); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::Yes); - msgBox.setIcon(QMessageBox::Information); - - if (msgBox.exec() == QMessageBox::Yes) { - const auto pluginSpecs = ExtensionSystem::PluginManager::plugins(); - for (const ExtensionSystem::PluginSpec *spec : pluginSpecs) { - if (spec->name() == QLatin1String("QodeAssist")) { - const auto pluginPath = spec->filePath().path(); - QFileInfo fileInfo(pluginPath); - QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absolutePath())); - Core::ICore::exit(); - break; - } + const auto pluginSpecs = ExtensionSystem::PluginManager::plugins(); + for (const ExtensionSystem::PluginSpec *spec : pluginSpecs) { + if (spec->name() == QLatin1String("QodeAssist")) { + const auto pluginPath = spec->filePath().path(); + QFileInfo fileInfo(pluginPath); + QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absolutePath())); + break; } } accept(); } -void UpdateDialog::handleDownloadError(const QString &error) -{ - m_progress->setVisible(false); - m_downloadButton->setEnabled(true); - QMessageBox::critical(this, tr("Update Error"), tr("Failed to update: %1").arg(error)); -} - } // namespace QodeAssist diff --git a/settings/UpdateDialog.hpp b/settings/UpdateDialog.hpp index be7d44e..e7e0301 100644 --- a/settings/UpdateDialog.hpp +++ b/settings/UpdateDialog.hpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -42,21 +41,18 @@ public: private slots: void handleUpdateInfo(const PluginUpdater::UpdateInfo &info); - void startDownload(); - void updateProgress(qint64 received, qint64 total); - void handleDownloadFinished(const QString &path); - void handleDownloadError(const QString &error); + void openReleasePage(); + void openPluginFolder(); private: PluginUpdater *m_updater; QVBoxLayout *m_layout; QLabel *m_titleLabel; QLabel *m_versionLabel; - QLabel *m_releaseLink; - QLabel *m_changelogLabel{nullptr}; - QTextEdit *m_changelogText{nullptr}; - QProgressBar *m_progress; - QPushButton *m_downloadButton; + QLabel *m_changelogLabel; + QTextEdit *m_changelogText; + QPushButton *m_buttonOpenReleasePage; + QPushButton *m_buttonOpenPluginFolder; QPushButton *m_closeButton; PluginUpdater::UpdateInfo m_updateInfo; };