diff --git a/README.md b/README.md index 05b87eae..65b67471 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Get binary builds for Windows and Linux from the [download page](https://zealdoc ## How to use -After installing Zeal, you need to download docsets. Go to *File->Options->Docsets*, select the ones you want, and click the *Download* button. +After installing Zeal, you need to download docsets. Go to *Tools->Docsets*, select the ones you want, and click the *Download* button. ## How to compile diff --git a/qmake/common.pri b/qmake/common.pri index 4e26c76b..60c5e73b 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -30,7 +30,7 @@ RCC_DIR = $$BUILD_ROOT/.rcc UI_DIR = $$BUILD_ROOT/.ui # Application version -VERSION = 0.3.0 +VERSION = 0.3.1 DEFINES += ZEAL_VERSION=\\\"$${VERSION}\\\" # Browser engine @@ -63,3 +63,10 @@ CONFIG(zeal_portable) { unix:!macx { isEmpty(PREFIX): PREFIX = /usr } + +unix:!macx:packagesExist(appindicator-0.1) { + CONFIG += link_pkgconfig + PKGCONFIG += appindicator-0.1 gtk+-2.0 + DEFINES += USE_APPINDICATOR + message("AppIndicator support: Yes.") +} diff --git a/src/libs/core/application.cpp b/src/libs/core/application.cpp index c2f500c5..d39d9033 100644 --- a/src/libs/core/application.cpp +++ b/src/libs/core/application.cpp @@ -23,6 +23,7 @@ #include "application.h" #include "extractor.h" +#include "networkaccessmanager.h" #include "settings.h" #include @@ -35,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -59,7 +59,7 @@ Application::Application(QObject *parent) : m_instance = this; m_settings = new Settings(this); - m_networkManager = new QNetworkAccessManager(this); + m_networkManager = new NetworkAccessManager(this); // Extractor setup m_extractorThread = new QThread(this); diff --git a/src/libs/core/networkaccessmanager.cpp b/src/libs/core/networkaccessmanager.cpp new file mode 100644 index 00000000..df1bd0a2 --- /dev/null +++ b/src/libs/core/networkaccessmanager.cpp @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Oleg Shparber +** Contact: https://go.zealdocs.org/l/contact +** +** This file is part of Zeal. +** +** Zeal 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 3 of the License, or +** (at your option) any later version. +** +** Zeal 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 Zeal. If not, see . +** +****************************************************************************/ + +#include "networkaccessmanager.h" + +#include + +using namespace Zeal::Core; + +NetworkAccessManager::NetworkAccessManager(QObject *parent) + : QNetworkAccessManager(parent) +{ +} + +QNetworkReply *NetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, + const QNetworkRequest &request, + QIODevice *outgoingData) +{ + // Detect URLs without schema, and prevent them from being requested on a local filesytem. + const QUrl url = request.url(); + if (url.scheme() == QLatin1String("file") && !url.host().isEmpty()) + return QNetworkAccessManager::createRequest(GetOperation, QNetworkRequest(), outgoingData); + + return QNetworkAccessManager::createRequest(op, request, outgoingData); +} diff --git a/src/libs/core/networkaccessmanager.h b/src/libs/core/networkaccessmanager.h new file mode 100644 index 00000000..ec11ad6c --- /dev/null +++ b/src/libs/core/networkaccessmanager.h @@ -0,0 +1,45 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Oleg Shparber +** Contact: https://go.zealdocs.org/l/contact +** +** This file is part of Zeal. +** +** Zeal 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 3 of the License, or +** (at your option) any later version. +** +** Zeal 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 Zeal. If not, see . +** +****************************************************************************/ + +#ifndef ZEAL_CORE_NETWORKACCESSMANAGER_H +#define ZEAL_CORE_NETWORKACCESSMANAGER_H + +#include + +namespace Zeal { +namespace Core { + +class NetworkAccessManager : public QNetworkAccessManager +{ + Q_OBJECT +public: + NetworkAccessManager(QObject *parent = nullptr); + +protected: + QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, + QIODevice *outgoingData = nullptr) override; +}; + +} // namespace Core +} // namespace Zeal + +#endif // ZEAL_CORE_NETWORKACCESSMANAGER_H diff --git a/src/libs/ui/docsetsdialog.cpp b/src/libs/ui/docsetsdialog.cpp index bd869e15..a0a8a0e6 100644 --- a/src/libs/ui/docsetsdialog.cpp +++ b/src/libs/ui/docsetsdialog.cpp @@ -98,7 +98,7 @@ DocsetsDialog::DocsetsDialog(Core::Application *app, QWidget *parent) : [this, selectionModel]() { ui->removeDocsetsButton->setEnabled(selectionModel->hasSelection()); - for (const QModelIndex &index : selectionModel->selectedIndexes()) { + for (const QModelIndex &index : selectionModel->selectedRows()) { if (index.data(ListModel::UpdateAvailableRole).toBool()) { ui->updateSelectedDocsetsButton->setEnabled(true); return; @@ -135,7 +135,7 @@ DocsetsDialog::DocsetsDialog(Core::Application *app, QWidget *parent) : selectionModel = ui->availableDocsetList->selectionModel(); connect(selectionModel, &QItemSelectionModel::selectionChanged, [this, selectionModel]() { - for (const QModelIndex &index : selectionModel->selectedIndexes()) { + for (const QModelIndex &index : selectionModel->selectedRows()) { if (!index.data(ProgressItemDelegate::ShowProgressRole).toBool()) { ui->downloadDocsetsButton->setEnabled(true); return; @@ -217,7 +217,7 @@ void DocsetsDialog::addDashFeed() void DocsetsDialog::updateSelectedDocsets() { - for (const QModelIndex &index : ui->installedDocsetList->selectionModel()->selectedIndexes()) { + for (const QModelIndex &index : ui->installedDocsetList->selectionModel()->selectedRows()) { if (!index.data(Registry::ListModel::UpdateAvailableRole).toBool()) continue; @@ -245,7 +245,7 @@ void DocsetsDialog::removeSelectedDocsets() int ret; - const QModelIndexList selectedIndexes = selectonModel->selectedIndexes(); + const QModelIndexList selectedIndexes = selectonModel->selectedRows(); if (selectedIndexes.size() == 1) { const QString docsetTitle = selectedIndexes.first().data().toString(); ret = QMessageBox::question(this, QStringLiteral("Zeal"), @@ -286,7 +286,7 @@ void DocsetsDialog::updateDocsetFilter(const QString &filterString) void DocsetsDialog::downloadSelectedDocsets() { QItemSelectionModel *selectionModel = ui->availableDocsetList->selectionModel(); - for (const QModelIndex &index : selectionModel->selectedIndexes()) { + for (const QModelIndex &index : selectionModel->selectedRows()) { selectionModel->select(index, QItemSelectionModel::Deselect); // Do nothing if a download is already in progress. @@ -693,18 +693,21 @@ void DocsetsDialog::removeDocset(const QString &name) const QString tmpPath = docsetPath + QLatin1String(".deleteme.") + QString::number(QDateTime::currentMSecsSinceEpoch()); - // Rename first to allow simultaneous installation. - // TODO: Check for error - QDir().rename(docsetPath, tmpPath); - + // Remove from registry first to avoid renaming files in use on Windows. m_docsetRegistry->remove(name); - QFuture future = QtConcurrent::run([tmpPath] { - return QDir(tmpPath).removeRecursively(); - }); + // Rename first to allow simultaneous installation. + if (!QDir().rename(docsetPath, tmpPath)) { + const QString error = tr("Cannot delete docset %1! Please try closing other " + "applications first, as they may be accessing the docset " + "files.").arg(title); + QMessageBox::warning(this, QStringLiteral("Zeal"), error); + m_docsetsBeingDeleted.removeOne(name); + m_docsetRegistry->addDocset(docsetPath); + return; + } QFutureWatcher *watcher = new QFutureWatcher(); - watcher->setFuture(future); connect(watcher, &QFutureWatcher::finished, [=] { if (!watcher->result()) { QMessageBox::warning(this, QStringLiteral("Zeal"), @@ -719,6 +722,10 @@ void DocsetsDialog::removeDocset(const QString &name) m_docsetsBeingDeleted.removeOne(name); }); + + watcher->setFuture(QtConcurrent::run([tmpPath] { + return QDir(tmpPath).removeRecursively(); + })); } void DocsetsDialog::updateCombinedProgress() @@ -749,7 +756,7 @@ void DocsetsDialog::resetProgress() ui->addFeedButton->setEnabled(true); QItemSelectionModel *selectionModel = ui->installedDocsetList->selectionModel(); bool hasSelectedUpdates = false; - for (const QModelIndex &index : selectionModel->selectedIndexes()) { + for (const QModelIndex &index : selectionModel->selectedRows()) { if (index.data(Registry::ListModel::UpdateAvailableRole).toBool()) { hasSelectedUpdates = true; break; diff --git a/src/libs/ui/forms/docsetsdialog.ui b/src/libs/ui/forms/docsetsdialog.ui index c3ba0bbe..cd32e279 100644 --- a/src/libs/ui/forms/docsetsdialog.ui +++ b/src/libs/ui/forms/docsetsdialog.ui @@ -32,6 +32,9 @@ QAbstractItemView::ExtendedSelection + + QAbstractItemView::SelectRows + 16 @@ -116,6 +119,9 @@ QAbstractItemView::ExtendedSelection + + QAbstractItemView::SelectRows + 16 diff --git a/src/libs/ui/ui.pri b/src/libs/ui/ui.pri index e3933b07..ca5169df 100644 --- a/src/libs/ui/ui.pri +++ b/src/libs/ui/ui.pri @@ -2,13 +2,6 @@ ZEAL_LIB_NAME = Ui QT += widgets -unix:!macx:packagesExist(appindicator-0.1) { - CONFIG += link_pkgconfig - PKGCONFIG += appindicator-0.1 gtk+-2.0 - DEFINES += USE_APPINDICATOR - message("AppIndicator support: Yes.") -} - # QxtGlobalShortcut dependencies unix:!macx { QT += x11extras