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

This commit is contained in:
Le Tan 2022-03-08 20:12:33 +08:00
parent 52d389a5e7
commit 8be34ade30
10 changed files with 111 additions and 105 deletions

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

View File

@ -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);

View File

@ -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();

View File

@ -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));

View File

@ -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);

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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,