Przeglądaj źródła

KateVi: skip Ctrl+X as well as Ctrl+C

Le Tan 3 lat temu
rodzic
commit
8be34ade30

+ 1 - 1
libs/vtextedit

@@ -1 +1 @@
-Subproject commit f38624d8b342da710dca7b5e6efb229a99032420
+Subproject commit b3af91647d64f91eb031b4c0a3ce5d1e656fae08

+ 2 - 30
src/imagehost/giteeimagehost.cpp

@@ -6,14 +6,13 @@
 
 #include <utils/utils.h>
 #include <utils/pathutils.h>
-#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);

+ 3 - 13
src/imagehost/giteeimagehost.h

@@ -1,13 +1,11 @@
 #ifndef GITEEIMAGEHOST_H
 #define GITEEIMAGEHOST_H
 
-#include "imagehost.h"
-
-#include <vtextedit/networkutils.h>
+#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();
 

+ 1 - 38
src/imagehost/githubimagehost.cpp

@@ -7,14 +7,13 @@
 #include <QJsonDocument>
 
 #include <utils/utils.h>
-#include <utils/webutils.h>
 
 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<QByteArray, QByteArray> 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));

+ 3 - 15
src/imagehost/githubimagehost.h

@@ -1,13 +1,11 @@
 #ifndef GITHUBIMAGEHOST_H
 #define GITHUBIMAGEHOST_H
 
-#include "imagehost.h"
-
-#include <vtextedit/networkutils.h>
+#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<QByteArray, QByteArray> authorizationHeader(const QString &p_token);
 

+ 4 - 2
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
 

+ 62 - 0
src/imagehost/repoimagehost.cpp

@@ -0,0 +1,62 @@
+#include "repoimagehost.h"
+
+#include <utils/webutils.h>
+#include <utils/utils.h>
+
+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;
+}

+ 31 - 0
src/imagehost/repoimagehost.h

@@ -0,0 +1,31 @@
+#ifndef REPOIMAGEHOST_H
+#define REPOIMAGEHOST_H
+
+#include "imagehost.h"
+
+#include <vtextedit/networkutils.h>
+
+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

+ 2 - 4
src/search/filesearchengine.cpp

@@ -1,10 +1,10 @@
 #include "filesearchengine.h"
 
 #include <QFile>
-#include <QMimeDatabase>
 #include <QDebug>
 
 #include "searchresultitem.h"
+#include <utils/fileutils.h>
 
 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;
         }

+ 2 - 2
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,