From 8be34ade30d541082b23ef1567965b7d0937f350 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Tue, 8 Mar 2022 20:12:33 +0800 Subject: [PATCH] KateVi: skip Ctrl+X as well as Ctrl+C --- libs/vtextedit | 2 +- src/imagehost/giteeimagehost.cpp | 32 +------------ src/imagehost/giteeimagehost.h | 16 ++----- src/imagehost/githubimagehost.cpp | 39 +--------------- src/imagehost/githubimagehost.h | 18 ++----- src/imagehost/imagehost.pri | 6 ++- src/imagehost/repoimagehost.cpp | 62 +++++++++++++++++++++++++ src/imagehost/repoimagehost.h | 31 +++++++++++++ src/search/filesearchengine.cpp | 6 +-- src/widgets/dialogs/settings/vipage.cpp | 4 +- 10 files changed, 111 insertions(+), 105 deletions(-) create mode 100644 src/imagehost/repoimagehost.cpp create mode 100644 src/imagehost/repoimagehost.h diff --git a/libs/vtextedit b/libs/vtextedit index f38624d8..b3af9164 160000 --- a/libs/vtextedit +++ b/libs/vtextedit @@ -1 +1 @@ -Subproject commit f38624d8b342da710dca7b5e6efb229a99032420 +Subproject commit b3af91647d64f91eb031b4c0a3ce5d1e656fae08 diff --git a/src/imagehost/giteeimagehost.cpp b/src/imagehost/giteeimagehost.cpp index 500288e6..70eaf5f8 100644 --- a/src/imagehost/giteeimagehost.cpp +++ b/src/imagehost/giteeimagehost.cpp @@ -6,14 +6,13 @@ #include #include -#include "githubimagehost.h" using namespace vnotex; const QString GiteeImageHost::c_apiUrl = "https://gitee.com/api/v5"; GiteeImageHost::GiteeImageHost(QObject *p_parent) - : ImageHost(p_parent) + : RepoImageHost(p_parent) { } @@ -44,23 +43,6 @@ void GiteeImageHost::setConfig(const QJsonObject &p_jobj) m_imageUrlPrefix = QString("https://gitee.com/%1/%2/raw/").arg(m_userName, m_repoName); } -bool GiteeImageHost::testConfig(const QJsonObject &p_jobj, QString &p_msg) -{ - p_msg.clear(); - - QString token, userName, repoName; - parseConfig(p_jobj, token, userName, repoName); - - if (token.isEmpty() || userName.isEmpty() || repoName.isEmpty()) { - p_msg = tr("PersonalAccessToken/UserName/RepositoryName should not be empty."); - return false; - } - - auto reply = getRepoInfo(token, userName, repoName); - p_msg = QString::fromUtf8(reply.m_data); - return reply.m_error == QNetworkReply::NoError; -} - vte::NetworkAccess::RawHeaderPairs GiteeImageHost::prepareCommonHeaders() { vte::NetworkAccess::RawHeaderPairs rawHeader; @@ -86,16 +68,6 @@ vte::NetworkReply GiteeImageHost::getRepoInfo(const QString &p_token, const QStr return reply; } -void GiteeImageHost::parseConfig(const QJsonObject &p_jobj, - QString &p_token, - QString &p_userName, - QString &p_repoName) -{ - p_token = p_jobj[QStringLiteral("personal_access_token")].toString(); - p_userName = p_jobj[QStringLiteral("user_name")].toString(); - p_repoName = p_jobj[QStringLiteral("repository_name")].toString(); -} - static bool isEmptyResponse(const QByteArray &p_data) { return p_data == QByteArray("[]"); @@ -168,7 +140,7 @@ bool GiteeImageHost::remove(const QString &p_url, QString &p_msg) return false; } - const auto resourcePath = GitHubImageHost::fetchResourcePath(m_imageUrlPrefix, p_url); + const auto resourcePath = fetchResourcePath(m_imageUrlPrefix, p_url); auto rawHeader = prepareCommonHeaders(); const auto urlStr = QString("%1/repos/%2/%3/contents/%4").arg(c_apiUrl, m_userName, m_repoName, resourcePath); diff --git a/src/imagehost/giteeimagehost.h b/src/imagehost/giteeimagehost.h index 47ee86a1..335d7cd2 100644 --- a/src/imagehost/giteeimagehost.h +++ b/src/imagehost/giteeimagehost.h @@ -1,13 +1,11 @@ #ifndef GITEEIMAGEHOST_H #define GITEEIMAGEHOST_H -#include "imagehost.h" - -#include +#include "repoimagehost.h" namespace vnotex { - class GiteeImageHost : public ImageHost + class GiteeImageHost : public RepoImageHost { Q_OBJECT public: @@ -21,8 +19,6 @@ namespace vnotex void setConfig(const QJsonObject &p_jobj) Q_DECL_OVERRIDE; - bool testConfig(const QJsonObject &p_jobj, QString &p_msg) Q_DECL_OVERRIDE; - QString create(const QByteArray &p_data, const QString &p_path, QString &p_msg) Q_DECL_OVERRIDE; bool remove(const QString &p_url, QString &p_msg) Q_DECL_OVERRIDE; @@ -30,13 +26,7 @@ namespace vnotex bool ownsUrl(const QString &p_url) const Q_DECL_OVERRIDE; private: - // Used to test. - vte::NetworkReply getRepoInfo(const QString &p_token, const QString &p_userName, const QString &p_repoName) const; - - static void parseConfig(const QJsonObject &p_jobj, - QString &p_token, - QString &p_userName, - QString &p_repoName); + vte::NetworkReply getRepoInfo(const QString &p_token, const QString &p_userName, const QString &p_repoName) const Q_DECL_OVERRIDE; static vte::NetworkAccess::RawHeaderPairs prepareCommonHeaders(); diff --git a/src/imagehost/githubimagehost.cpp b/src/imagehost/githubimagehost.cpp index cac8fc6b..b4bdf875 100644 --- a/src/imagehost/githubimagehost.cpp +++ b/src/imagehost/githubimagehost.cpp @@ -7,14 +7,13 @@ #include #include -#include using namespace vnotex; const QString GitHubImageHost::c_apiUrl = "https://api.github.com"; GitHubImageHost::GitHubImageHost(QObject *p_parent) - : ImageHost(p_parent) + : RepoImageHost(p_parent) { } @@ -45,23 +44,6 @@ void GitHubImageHost::setConfig(const QJsonObject &p_jobj) m_imageUrlPrefix = QString("https://raw.githubusercontent.com/%1/%2/").arg(m_userName, m_repoName); } -bool GitHubImageHost::testConfig(const QJsonObject &p_jobj, QString &p_msg) -{ - p_msg.clear(); - - QString token, userName, repoName; - parseConfig(p_jobj, token, userName, repoName); - - if (token.isEmpty() || userName.isEmpty() || repoName.isEmpty()) { - p_msg = tr("PersonalAccessToken/UserName/RepositoryName should not be empty."); - return false; - } - - auto reply = getRepoInfo(token, userName, repoName); - p_msg = QString::fromUtf8(reply.m_data); - return reply.m_error == QNetworkReply::NoError; -} - QPair GitHubImageHost::authorizationHeader(const QString &p_token) { auto token = "token " + p_token; @@ -89,16 +71,6 @@ vte::NetworkReply GitHubImageHost::getRepoInfo(const QString &p_token, const QSt return reply; } -void GitHubImageHost::parseConfig(const QJsonObject &p_jobj, - QString &p_token, - QString &p_userName, - QString &p_repoName) -{ - p_token = p_jobj[QStringLiteral("personal_access_token")].toString(); - p_userName = p_jobj[QStringLiteral("user_name")].toString(); - p_repoName = p_jobj[QStringLiteral("repository_name")].toString(); -} - QString GitHubImageHost::create(const QByteArray &p_data, const QString &p_path, QString &p_msg) { QString destUrl; @@ -153,15 +125,6 @@ bool GitHubImageHost::ownsUrl(const QString &p_url) const return p_url.startsWith(m_imageUrlPrefix); } -QString GitHubImageHost::fetchResourcePath(const QString &p_prefix, const QString &p_url) -{ - auto resourcePath = p_url.mid(p_prefix.size()); - // Skip the branch name. - resourcePath = resourcePath.mid(resourcePath.indexOf(QLatin1Char('/')) + 1); - resourcePath = WebUtils::purifyUrl(resourcePath); - return resourcePath; -} - bool GitHubImageHost::remove(const QString &p_url, QString &p_msg) { Q_ASSERT(ownsUrl(p_url)); diff --git a/src/imagehost/githubimagehost.h b/src/imagehost/githubimagehost.h index fb273cae..96755f2c 100644 --- a/src/imagehost/githubimagehost.h +++ b/src/imagehost/githubimagehost.h @@ -1,13 +1,11 @@ #ifndef GITHUBIMAGEHOST_H #define GITHUBIMAGEHOST_H -#include "imagehost.h" - -#include +#include "repoimagehost.h" namespace vnotex { - class GitHubImageHost : public ImageHost + class GitHubImageHost : public RepoImageHost { Q_OBJECT public: @@ -21,16 +19,12 @@ namespace vnotex void setConfig(const QJsonObject &p_jobj) Q_DECL_OVERRIDE; - bool testConfig(const QJsonObject &p_jobj, QString &p_msg) Q_DECL_OVERRIDE; - QString create(const QByteArray &p_data, const QString &p_path, QString &p_msg) Q_DECL_OVERRIDE; bool remove(const QString &p_url, QString &p_msg) Q_DECL_OVERRIDE; bool ownsUrl(const QString &p_url) const Q_DECL_OVERRIDE; - static QString fetchResourcePath(const QString &p_prefix, const QString &p_url); - protected: QString m_personalAccessToken; @@ -41,13 +35,7 @@ namespace vnotex QString m_imageUrlPrefix; private: - // Used to test. - vte::NetworkReply getRepoInfo(const QString &p_token, const QString &p_userName, const QString &p_repoName) const; - - static void parseConfig(const QJsonObject &p_jobj, - QString &p_token, - QString &p_userName, - QString &p_repoName); + vte::NetworkReply getRepoInfo(const QString &p_token, const QString &p_userName, const QString &p_repoName) const Q_DECL_OVERRIDE; static QPair authorizationHeader(const QString &p_token); diff --git a/src/imagehost/imagehost.pri b/src/imagehost/imagehost.pri index 3b479345..c6e8d80a 100644 --- a/src/imagehost/imagehost.pri +++ b/src/imagehost/imagehost.pri @@ -5,12 +5,14 @@ HEADERS += \ $$PWD/githubimagehost.h \ $$PWD/imagehost.h \ $$PWD/imagehostmgr.h \ - $$PWD/imagehostutils.h + $$PWD/imagehostutils.h \ + $$PWD/repoimagehost.h SOURCES += \ $$PWD/giteeimagehost.cpp \ $$PWD/githubimagehost.cpp \ $$PWD/imagehost.cpp \ $$PWD/imagehostmgr.cpp \ - $$PWD/imagehostutils.cpp + $$PWD/imagehostutils.cpp \ + $$PWD/repoimagehost.cpp diff --git a/src/imagehost/repoimagehost.cpp b/src/imagehost/repoimagehost.cpp new file mode 100644 index 00000000..5daf08c3 --- /dev/null +++ b/src/imagehost/repoimagehost.cpp @@ -0,0 +1,62 @@ +#include "repoimagehost.h" + +#include +#include + +using namespace vnotex; + +RepoImageHost::RepoImageHost(QObject *p_parent) + : ImageHost(p_parent) +{ +} + +bool RepoImageHost::testConfig(const QJsonObject &p_jobj, QString &p_msg) +{ + p_msg.clear(); + + QString token, userName, repoName; + parseConfig(p_jobj, token, userName, repoName); + + if (token.isEmpty() || userName.isEmpty() || repoName.isEmpty()) { + p_msg = tr("PersonalAccessToken/UserName/RepositoryName should not be empty."); + return false; + } + + auto reply = getRepoInfo(token, userName, repoName); + p_msg = QString::fromUtf8(reply.m_data); + + if (reply.m_error != QNetworkReply::NoError) { + return false; + } + + auto replyObj = Utils::fromJsonString(reply.m_data); + if (replyObj.isEmpty()) { + return false; + } + + if (replyObj[QStringLiteral("private")].toBool()) { + p_msg = tr("Private repository is not supported."); + return false; + } + + return true; +} + +void RepoImageHost::parseConfig(const QJsonObject &p_jobj, + QString &p_token, + QString &p_userName, + QString &p_repoName) +{ + p_token = p_jobj[QStringLiteral("personal_access_token")].toString(); + p_userName = p_jobj[QStringLiteral("user_name")].toString(); + p_repoName = p_jobj[QStringLiteral("repository_name")].toString(); +} + +QString RepoImageHost::fetchResourcePath(const QString &p_prefix, const QString &p_url) +{ + auto resourcePath = p_url.mid(p_prefix.size()); + // Skip the branch name. + resourcePath = resourcePath.mid(resourcePath.indexOf(QLatin1Char('/')) + 1); + resourcePath = WebUtils::purifyUrl(resourcePath); + return resourcePath; +} diff --git a/src/imagehost/repoimagehost.h b/src/imagehost/repoimagehost.h new file mode 100644 index 00000000..91b56c7e --- /dev/null +++ b/src/imagehost/repoimagehost.h @@ -0,0 +1,31 @@ +#ifndef REPOIMAGEHOST_H +#define REPOIMAGEHOST_H + +#include "imagehost.h" + +#include + +namespace vnotex +{ + class RepoImageHost : public ImageHost + { + Q_OBJECT + public: + explicit RepoImageHost(QObject *p_parent); + + bool testConfig(const QJsonObject &p_jobj, QString &p_msg) Q_DECL_OVERRIDE; + + protected: + virtual void parseConfig(const QJsonObject &p_jobj, + QString &p_token, + QString &p_userName, + QString &p_repoName); + + // Used to test. + virtual vte::NetworkReply getRepoInfo(const QString &p_token, const QString &p_userName, const QString &p_repoName) const = 0; + + static QString fetchResourcePath(const QString &p_prefix, const QString &p_url); + }; +} + +#endif // REPOIMAGEHOST_H diff --git a/src/search/filesearchengine.cpp b/src/search/filesearchengine.cpp index 8c58b73c..f8230a4f 100644 --- a/src/search/filesearchengine.cpp +++ b/src/search/filesearchengine.cpp @@ -1,10 +1,10 @@ #include "filesearchengine.h" #include -#include #include #include "searchresultitem.h" +#include using namespace vnotex; @@ -26,7 +26,6 @@ void FileSearchEngineWorker::run() { const int c_batchSize = 100; - QMimeDatabase mimeDatabase; m_state = SearchState::Busy; m_results.clear(); @@ -37,8 +36,7 @@ void FileSearchEngineWorker::run() break; } - const QMimeType mimeType = mimeDatabase.mimeTypeForFile(item.m_filePath); - if (mimeType.isValid() && !mimeType.inherits(QStringLiteral("text/plain"))) { + if (!FileUtils::isText(item.m_filePath)) { appendError(tr("Skip binary file (%1)").arg(item.m_filePath)); continue; } diff --git a/src/widgets/dialogs/settings/vipage.cpp b/src/widgets/dialogs/settings/vipage.cpp index aec61ecb..22c619b3 100644 --- a/src/widgets/dialogs/settings/vipage.cpp +++ b/src/widgets/dialogs/settings/vipage.cpp @@ -25,9 +25,9 @@ void ViPage::setupUI() auto mainLayout = WidgetsFactory::createFormLayout(this); { - const QString label(tr("Control-C to copy")); + const QString label(tr("Ctrl+C/X to copy/cut")); m_controlCToCopyCheckBox = WidgetsFactory::createCheckBox(label, this); - m_controlCToCopyCheckBox->setToolTip(tr("Use Control-C to copy text")); + m_controlCToCopyCheckBox->setToolTip(tr("Use Ctrl+C/X to copy/cut text")); mainLayout->addRow(m_controlCToCopyCheckBox); addSearchItem(label, m_controlCToCopyCheckBox->toolTip(), m_controlCToCopyCheckBox); connect(m_controlCToCopyCheckBox, &QCheckBox::stateChanged,