add line ending settings for configs

This commit is contained in:
Le Tan 2022-01-26 19:14:33 +08:00
parent 969db5c3db
commit 993d522e15
12 changed files with 146 additions and 45 deletions

View File

@ -17,6 +17,7 @@ SOURCES += \
$$PWD/editorconfig.cpp \
$$PWD/externalfile.cpp \
$$PWD/file.cpp \
$$PWD/global.cpp \
$$PWD/historyitem.cpp \
$$PWD/historymgr.cpp \
$$PWD/htmltemplatehelper.cpp \

View File

@ -67,6 +67,12 @@ void CoreConfig::init(const QJsonObject &p_app,
}
m_perNotebookHistoryEnabled = READBOOL(QStringLiteral("per_notebook_history"));
{
auto lineEnding = READSTR(QStringLiteral("line_ending"));
m_lineEnding = stringToLineEndingPolicy(lineEnding);
}
}
QJsonObject CoreConfig::toJson() const
@ -82,6 +88,7 @@ QJsonObject CoreConfig::toJson() const
obj[QStringLiteral("check_for_updates_on_start")] = m_checkForUpdatesOnStartEnabled;
obj[QStringLiteral("history_max_count")] = m_historyMaxCount;
obj[QStringLiteral("per_notebook_history")] = m_perNotebookHistoryEnabled;
obj[QStringLiteral("line_ending")] = lineEndingPolicyToString(m_lineEnding);
return obj;
}
@ -224,3 +231,13 @@ const QString &CoreConfig::getShortcutLeaderKey() const
{
return m_shortcutLeaderKey;
}
LineEndingPolicy CoreConfig::getLineEndingPolicy() const
{
return m_lineEnding;
}
void CoreConfig::setLineEndingPolicy(LineEndingPolicy p_ending)
{
updateConfig(m_lineEnding, p_ending, this);
}

View File

@ -7,6 +7,8 @@
#include <QString>
#include <QStringList>
#include "global.h"
namespace vnotex
{
class CoreConfig : public IConfig
@ -110,6 +112,9 @@ namespace vnotex
const QString &getShortcutLeaderKey() const;
LineEndingPolicy getLineEndingPolicy() const;
void setLineEndingPolicy(LineEndingPolicy p_ending);
private:
friend class MainConfig;
@ -150,6 +155,8 @@ namespace vnotex
// Whether store history in each notebook.
bool m_perNotebookHistoryEnabled = false;
LineEndingPolicy m_lineEnding = LineEndingPolicy::LF;
static QStringList s_availableLocales;
};
} // ns vnotex

View File

@ -221,44 +221,6 @@ EditorConfig::AutoSavePolicy EditorConfig::stringToAutoSavePolicy(const QString
}
}
QString EditorConfig::lineEndingPolicyToString(LineEndingPolicy p_ending) const
{
switch (p_ending) {
case LineEndingPolicy::Platform:
return QStringLiteral("platform");
case LineEndingPolicy::File:
return QStringLiteral("file");
case LineEndingPolicy::LF:
return QStringLiteral("lf");
case LineEndingPolicy::CRLF:
return QStringLiteral("crlf");
case LineEndingPolicy::CR:
return QStringLiteral("cr");
}
return QStringLiteral("platform");
}
LineEndingPolicy EditorConfig::stringToLineEndingPolicy(const QString &p_str) const
{
auto ending = p_str.toLower();
if (ending == QStringLiteral("file")) {
return LineEndingPolicy::File;
} else if (ending == QStringLiteral("lf")) {
return LineEndingPolicy::LF;
} else if (ending == QStringLiteral("crlf")) {
return LineEndingPolicy::CRLF;
} else if (ending == QStringLiteral("cr")) {
return LineEndingPolicy::CR;
} else {
return LineEndingPolicy::Platform;
}
}
EditorConfig::AutoSavePolicy EditorConfig::getAutoSavePolicy() const
{
return m_autoSavePolicy;

View File

@ -149,9 +149,6 @@ namespace vnotex
QString autoSavePolicyToString(AutoSavePolicy p_policy) const;
AutoSavePolicy stringToAutoSavePolicy(const QString &p_str) const;
QString lineEndingPolicyToString(LineEndingPolicy p_ending) const;
LineEndingPolicy stringToLineEndingPolicy(const QString &p_str) const;
void loadImageHost(const QJsonObject &p_app, const QJsonObject &p_user);
QJsonObject saveImageHost() const;

3
src/core/global.cpp Normal file
View File

@ -0,0 +1,3 @@
#include "global.h"
using namespace vnotex;

View File

@ -140,6 +140,44 @@ namespace vnotex
CR
};
inline QString lineEndingPolicyToString(LineEndingPolicy p_ending)
{
switch (p_ending) {
case LineEndingPolicy::Platform:
return QStringLiteral("platform");
case LineEndingPolicy::File:
return QStringLiteral("file");
case LineEndingPolicy::LF:
return QStringLiteral("lf");
case LineEndingPolicy::CRLF:
return QStringLiteral("crlf");
case LineEndingPolicy::CR:
return QStringLiteral("cr");
}
return QStringLiteral("platform");
}
inline LineEndingPolicy stringToLineEndingPolicy(const QString &p_str)
{
auto ending = p_str.toLower();
if (ending == QStringLiteral("file")) {
return LineEndingPolicy::File;
} else if (ending == QStringLiteral("lf")) {
return LineEndingPolicy::LF;
} else if (ending == QStringLiteral("crlf")) {
return LineEndingPolicy::CRLF;
} else if (ending == QStringLiteral("cr")) {
return LineEndingPolicy::CR;
} else {
return LineEndingPolicy::Platform;
}
}
enum Role
{
// Qt::UserRole = 0x0100

View File

@ -6,9 +6,13 @@
#include <QJsonObject>
#include <QJsonDocument>
#include <vtextedit/textutils.h>
#include <utils/pathutils.h>
#include "exception.h"
#include <utils/fileutils.h>
#include "exception.h"
#include "coreconfig.h"
#include "configmgr.h"
using namespace vnotex;
@ -66,7 +70,40 @@ void LocalNotebookBackend::writeFile(const QString &p_filePath, const QString &p
void LocalNotebookBackend::writeFile(const QString &p_filePath, const QJsonObject &p_jobj)
{
writeFile(p_filePath, QJsonDocument(p_jobj).toJson());
const auto &coreConfig = ConfigMgr::getInst().getCoreConfig();
auto data = QJsonDocument(p_jobj).toJson();
vte::LineEnding before = vte::LineEnding::LF;
QString text;
switch (coreConfig.getLineEndingPolicy()) {
case LineEndingPolicy::Platform:
#if defined(Q_OS_WIN)
text = QString::fromUtf8(data);
vte::TextUtils::transformLineEnding(text, before, vte::LineEnding::CRLF);
#endif
break;
case LineEndingPolicy::File:
// Not supported.
Q_FALLTHROUGH();
case LineEndingPolicy::LF:
break;
case LineEndingPolicy::CRLF:
text = QString::fromUtf8(data);
vte::TextUtils::transformLineEnding(text, before, vte::LineEnding::CRLF);
break;
case LineEndingPolicy::CR:
text = QString::fromUtf8(data);
vte::TextUtils::transformLineEnding(text, before, vte::LineEnding::CR);
break;
}
if (!text.isEmpty()) {
writeFile(p_filePath, text);
} else {
writeFile(p_filePath, data);
}
}
QString LocalNotebookBackend::readTextFile(const QString &p_filePath)

View File

@ -77,7 +77,9 @@
"check_for_updates_on_start" : true,
"//comment" : "Max count of the history items for each notebook and session config",
"history_max_count" : 100,
"per_notebook_history" : false
"per_notebook_history" : false,
"//comment" : "Line ending policy for config files, platform/lf/crlf/cr",
"line_ending" : "lf"
},
"editor" : {
"core": {

View File

@ -2,6 +2,7 @@
#include <QCheckBox>
#include <QFormLayout>
#include <QComboBox>
#include <widgets/widgetsfactory.h>
#include <core/coreconfig.h>
@ -30,6 +31,22 @@ void NoteManagementPage::setupUI()
connect(m_perNotebookHistoryCheckBox, &QCheckBox::stateChanged,
this, &NoteManagementPage::pageIsChanged);
}
{
m_lineEndingComboBox = WidgetsFactory::createComboBox(this);
m_lineEndingComboBox->setToolTip(tr("Line ending used to write configuration files"));
m_lineEndingComboBox->addItem(tr("Follow Platform"), (int)LineEndingPolicy::Platform);
m_lineEndingComboBox->addItem(tr("LF (Linux/macOS)"), (int)LineEndingPolicy::LF);
m_lineEndingComboBox->addItem(tr("CR LF (Windows)"), (int)LineEndingPolicy::CRLF);
m_lineEndingComboBox->addItem(tr("CR"), (int)LineEndingPolicy::CR);
const QString label(tr("Line ending:"));
mainLayout->addRow(label, m_lineEndingComboBox);
addSearchItem(label, m_lineEndingComboBox->toolTip(), m_lineEndingComboBox);
connect(m_lineEndingComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &NoteManagementPage::pageIsChanged);
}
}
void NoteManagementPage::loadInternal()
@ -37,6 +54,14 @@ void NoteManagementPage::loadInternal()
const auto &coreConfig = ConfigMgr::getInst().getCoreConfig();
m_perNotebookHistoryCheckBox->setChecked(coreConfig.isPerNotebookHistoryEnabled());
{
int idx = m_lineEndingComboBox->findData(static_cast<int>(coreConfig.getLineEndingPolicy()));
if (idx == -1) {
idx = 0;
}
m_lineEndingComboBox->setCurrentIndex(idx);
}
}
bool NoteManagementPage::saveInternal()
@ -45,6 +70,11 @@ bool NoteManagementPage::saveInternal()
coreConfig.setPerNotebookHistoryEnabled(m_perNotebookHistoryCheckBox->isChecked());
{
auto ending = m_lineEndingComboBox->currentData().toInt();
coreConfig.setLineEndingPolicy(static_cast<LineEndingPolicy>(ending));
}
return true;
}

View File

@ -4,6 +4,7 @@
#include "settingspage.h"
class QCheckBox;
class QComboBox;
namespace vnotex
{
@ -24,6 +25,8 @@ namespace vnotex
void setupUI();
QCheckBox *m_perNotebookHistoryCheckBox = nullptr;
QComboBox *m_lineEndingComboBox = nullptr;
};
}

View File

@ -2302,7 +2302,11 @@ void NotebookNodeExplorer::updateSlaveExplorer()
return;
}
masterNode = getCurrentMasterNode();
auto data = getItemNodeData(item);
if (data.isNode()) {
masterNode = data.getNode();
Q_ASSERT(masterNode->isContainer());
}
} else {
// Root node.
masterNode = m_notebook ? m_notebook->getRootNode().data() : nullptr;