mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09:52 +08:00
support custom base level for heading sequence by heading_sequence_base_level
This commit is contained in:
parent
ae706fb066
commit
f178b1c634
@ -51,6 +51,8 @@ VSettingsDialog::VSettingsDialog(QWidget *p_parent)
|
|||||||
m_tabs->setCurrentWidget(m_tabs->widget(idx));
|
m_tabs->setCurrentWidget(m_tabs->widget(idx));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
m_tabList->setCurrentRow(0);
|
||||||
|
|
||||||
loadConfiguration();
|
loadConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,19 +451,34 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent)
|
|||||||
// Heading sequence.
|
// Heading sequence.
|
||||||
m_headingSequence = new QCheckBox(tr("Heading sequence"));
|
m_headingSequence = new QCheckBox(tr("Heading sequence"));
|
||||||
m_headingSequence->setToolTip(tr("Enable auto sequence for all headings (in the form like 1.2.3.4.)"));
|
m_headingSequence->setToolTip(tr("Enable auto sequence for all headings (in the form like 1.2.3.4.)"));
|
||||||
|
m_headingSequenceCombo = new QComboBox();
|
||||||
|
m_headingSequenceCombo->setToolTip(tr("Base level to start heading sequence"));
|
||||||
|
m_headingSequenceCombo->addItem(tr("1"), 1);
|
||||||
|
m_headingSequenceCombo->addItem(tr("2"), 2);
|
||||||
|
m_headingSequenceCombo->addItem(tr("3"), 3);
|
||||||
|
m_headingSequenceCombo->addItem(tr("4"), 4);
|
||||||
|
m_headingSequenceCombo->addItem(tr("5"), 5);
|
||||||
|
m_headingSequenceCombo->addItem(tr("6"), 6);
|
||||||
|
m_headingSequenceCombo->setEnabled(false);
|
||||||
|
connect(m_headingSequence, &QCheckBox::stateChanged,
|
||||||
|
this, [this](int p_state){
|
||||||
|
this->m_headingSequenceCombo->setEnabled(p_state == Qt::Checked);
|
||||||
|
});
|
||||||
|
QHBoxLayout *headingSequenceLayout = new QHBoxLayout();
|
||||||
|
headingSequenceLayout->addWidget(m_headingSequence);
|
||||||
|
headingSequenceLayout->addWidget(m_headingSequenceCombo);
|
||||||
|
|
||||||
// Web Zoom Factor.
|
// Web Zoom Factor.
|
||||||
m_customWebZoom = new QCheckBox(tr("Custom Web zoom factor"), this);
|
m_customWebZoom = new QCheckBox(tr("Custom Web zoom factor"), this);
|
||||||
m_customWebZoom->setToolTip(tr("Set the zoom factor of the Web page when reading"));
|
m_customWebZoom->setToolTip(tr("Set the zoom factor of the Web page when reading"));
|
||||||
connect(m_customWebZoom, &QCheckBox::stateChanged,
|
|
||||||
this, [this](int p_state){
|
|
||||||
this->m_webZoomFactorSpin->setEnabled(p_state == Qt::Checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
m_webZoomFactorSpin = new QDoubleSpinBox(this);
|
m_webZoomFactorSpin = new QDoubleSpinBox(this);
|
||||||
m_webZoomFactorSpin->setMaximum(c_webZoomFactorMax);
|
m_webZoomFactorSpin->setMaximum(c_webZoomFactorMax);
|
||||||
m_webZoomFactorSpin->setMinimum(c_webZoomFactorMin);
|
m_webZoomFactorSpin->setMinimum(c_webZoomFactorMin);
|
||||||
m_webZoomFactorSpin->setSingleStep(0.25);
|
m_webZoomFactorSpin->setSingleStep(0.25);
|
||||||
|
connect(m_customWebZoom, &QCheckBox::stateChanged,
|
||||||
|
this, [this](int p_state){
|
||||||
|
this->m_webZoomFactorSpin->setEnabled(p_state == Qt::Checked);
|
||||||
|
});
|
||||||
QHBoxLayout *zoomFactorLayout = new QHBoxLayout();
|
QHBoxLayout *zoomFactorLayout = new QHBoxLayout();
|
||||||
zoomFactorLayout->addWidget(m_customWebZoom);
|
zoomFactorLayout->addWidget(m_customWebZoom);
|
||||||
zoomFactorLayout->addWidget(m_webZoomFactorSpin);
|
zoomFactorLayout->addWidget(m_webZoomFactorSpin);
|
||||||
@ -478,7 +495,7 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent)
|
|||||||
|
|
||||||
QFormLayout *mainLayout = new QFormLayout();
|
QFormLayout *mainLayout = new QFormLayout();
|
||||||
mainLayout->addRow(openModeLabel, m_openModeCombo);
|
mainLayout->addRow(openModeLabel, m_openModeCombo);
|
||||||
mainLayout->addRow(m_headingSequence);
|
mainLayout->addRow(headingSequenceLayout);
|
||||||
mainLayout->addRow(zoomFactorLayout);
|
mainLayout->addRow(zoomFactorLayout);
|
||||||
mainLayout->addRow(colorColumnLabel, m_colorColumnEdit);
|
mainLayout->addRow(colorColumnLabel, m_colorColumnEdit);
|
||||||
|
|
||||||
@ -553,13 +570,20 @@ bool VMarkdownTab::saveOpenMode()
|
|||||||
bool VMarkdownTab::loadHeadingSequence()
|
bool VMarkdownTab::loadHeadingSequence()
|
||||||
{
|
{
|
||||||
bool enabled = g_config->getEnableHeadingSequence();
|
bool enabled = g_config->getEnableHeadingSequence();
|
||||||
|
int level = g_config->getHeadingSequenceBaseLevel();
|
||||||
|
if (level < 1 || level > 6) {
|
||||||
|
level = 1;
|
||||||
|
}
|
||||||
|
|
||||||
m_headingSequence->setChecked(enabled);
|
m_headingSequence->setChecked(enabled);
|
||||||
|
m_headingSequenceCombo->setCurrentIndex(level - 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VMarkdownTab::saveHeadingSequence()
|
bool VMarkdownTab::saveHeadingSequence()
|
||||||
{
|
{
|
||||||
g_config->setEnableHeadingSequence(m_headingSequence->isChecked());
|
g_config->setEnableHeadingSequence(m_headingSequence->isChecked());
|
||||||
|
g_config->setHeadingSequenceBaseLevel(m_headingSequenceCombo->currentData().toInt());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +94,7 @@ public:
|
|||||||
|
|
||||||
// Whether enable heading sequence.
|
// Whether enable heading sequence.
|
||||||
QCheckBox *m_headingSequence;
|
QCheckBox *m_headingSequence;
|
||||||
|
QComboBox *m_headingSequenceCombo;
|
||||||
|
|
||||||
// Web zoom factor.
|
// Web zoom factor.
|
||||||
QCheckBox *m_customWebZoom;
|
QCheckBox *m_customWebZoom;
|
||||||
|
@ -122,6 +122,8 @@ public:
|
|||||||
|
|
||||||
const QMap<int, bool> &getPotentialPreviewBlocks() const;
|
const QMap<int, bool> &getPotentialPreviewBlocks() const;
|
||||||
|
|
||||||
|
const QVector<VElementRegion> &getHeaderRegions() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void highlightCompleted();
|
void highlightCompleted();
|
||||||
|
|
||||||
@ -239,4 +241,9 @@ inline const QMap<int, bool> &HGMarkdownHighlighter::getPotentialPreviewBlocks()
|
|||||||
return m_potentialPreviewBlocks;
|
return m_potentialPreviewBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const QVector<VElementRegion> &HGMarkdownHighlighter::getHeaderRegions() const
|
||||||
|
{
|
||||||
|
return m_headerRegions;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -86,6 +86,9 @@ note_open_mode=0
|
|||||||
; Whether auto generate heading sequence
|
; Whether auto generate heading sequence
|
||||||
enable_heading_sequence=false
|
enable_heading_sequence=false
|
||||||
|
|
||||||
|
; Heading sequence base level
|
||||||
|
heading_sequence_base_level=1
|
||||||
|
|
||||||
; Style the xth column in fenced code block
|
; Style the xth column in fenced code block
|
||||||
; 0 - no color column
|
; 0 - no color column
|
||||||
color_column=0
|
color_column=0
|
||||||
|
@ -178,6 +178,9 @@ void VConfigManager::initialize()
|
|||||||
m_enableHeadingSequence = getConfigFromSettings("global",
|
m_enableHeadingSequence = getConfigFromSettings("global",
|
||||||
"enable_heading_sequence").toBool();
|
"enable_heading_sequence").toBool();
|
||||||
|
|
||||||
|
m_headingSequenceBaseLevel = getConfigFromSettings("global",
|
||||||
|
"heading_sequence_base_level").toInt();
|
||||||
|
|
||||||
m_colorColumn = getConfigFromSettings("global", "color_column").toInt();
|
m_colorColumn = getConfigFromSettings("global", "color_column").toInt();
|
||||||
|
|
||||||
m_enableCodeBlockLineNumber = getConfigFromSettings("global",
|
m_enableCodeBlockLineNumber = getConfigFromSettings("global",
|
||||||
|
@ -235,6 +235,9 @@ public:
|
|||||||
bool getEnableHeadingSequence() const;
|
bool getEnableHeadingSequence() const;
|
||||||
void setEnableHeadingSequence(bool p_enabled);
|
void setEnableHeadingSequence(bool p_enabled);
|
||||||
|
|
||||||
|
int getHeadingSequenceBaseLevel() const;
|
||||||
|
void setHeadingSequenceBaseLevel(int p_level);
|
||||||
|
|
||||||
int getColorColumn() const;
|
int getColorColumn() const;
|
||||||
void setColorColumn(int p_column);
|
void setColorColumn(int p_column);
|
||||||
|
|
||||||
@ -486,6 +489,9 @@ private:
|
|||||||
// Whether auto genearte heading sequence.
|
// Whether auto genearte heading sequence.
|
||||||
bool m_enableHeadingSequence;
|
bool m_enableHeadingSequence;
|
||||||
|
|
||||||
|
// Heading sequence base level.
|
||||||
|
int m_headingSequenceBaseLevel;
|
||||||
|
|
||||||
// The column to style in code block.
|
// The column to style in code block.
|
||||||
int m_colorColumn;
|
int m_colorColumn;
|
||||||
|
|
||||||
@ -1252,6 +1258,23 @@ inline void VConfigManager::setEnableHeadingSequence(bool p_enabled)
|
|||||||
m_enableHeadingSequence);
|
m_enableHeadingSequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline int VConfigManager::getHeadingSequenceBaseLevel() const
|
||||||
|
{
|
||||||
|
return m_headingSequenceBaseLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void VConfigManager::setHeadingSequenceBaseLevel(int p_level)
|
||||||
|
{
|
||||||
|
if (m_headingSequenceBaseLevel == p_level) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_headingSequenceBaseLevel = p_level;
|
||||||
|
setConfigToSettings("global",
|
||||||
|
"heading_sequence_base_level",
|
||||||
|
m_headingSequenceBaseLevel);
|
||||||
|
}
|
||||||
|
|
||||||
inline int VConfigManager::getColorColumn() const
|
inline int VConfigManager::getColorColumn() const
|
||||||
{
|
{
|
||||||
return m_colorColumn;
|
return m_colorColumn;
|
||||||
|
@ -109,7 +109,7 @@ void VMdEdit::beginEdit()
|
|||||||
setReadOnly(false);
|
setReadOnly(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_mdHighlighter->updateHighlight();
|
updateOutline(m_mdHighlighter->getHeaderRegions());
|
||||||
}
|
}
|
||||||
|
|
||||||
void VMdEdit::endEdit()
|
void VMdEdit::endEdit()
|
||||||
@ -330,9 +330,14 @@ void VMdEdit::updateCurHeader()
|
|||||||
emit curHeaderChanged(VAnchor(m_file, "", m_headers[idx].lineNumber, m_headers[idx].index));
|
emit curHeaderChanged(VAnchor(m_file, "", m_headers[idx].lineNumber, m_headers[idx].index));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addHeaderSequence(QVector<int> &p_sequence, int p_level)
|
static void addHeaderSequence(QVector<int> &p_sequence, int p_level, int p_baseLevel)
|
||||||
{
|
{
|
||||||
Q_ASSERT(p_level >= 1 && p_level < p_sequence.size());
|
Q_ASSERT(p_level >= 1 && p_level < p_sequence.size());
|
||||||
|
if (p_level < p_baseLevel) {
|
||||||
|
p_sequence.fill(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
++p_sequence[p_level];
|
++p_sequence[p_level];
|
||||||
for (int i = p_level + 1; i < p_sequence.size(); ++i) {
|
for (int i = p_level + 1; i < p_sequence.size(); ++i) {
|
||||||
p_sequence[i] = 0;
|
p_sequence[i] = 0;
|
||||||
@ -382,7 +387,11 @@ static void insertSequenceToHeader(QTextBlock p_block,
|
|||||||
cursor.setPosition(p_block.position() + end, QTextCursor::KeepAnchor);
|
cursor.setPosition(p_block.position() + end, QTextCursor::KeepAnchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_seq.isEmpty()) {
|
||||||
|
cursor.removeSelectedText();
|
||||||
|
} else {
|
||||||
cursor.insertText(p_seq + ' ');
|
cursor.insertText(p_seq + ' ');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
|
void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
|
||||||
@ -434,6 +443,11 @@ void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
|
|||||||
m_headers.clear();
|
m_headers.clear();
|
||||||
|
|
||||||
bool autoSequence = g_config->getEnableHeadingSequence() && !isReadOnly();
|
bool autoSequence = g_config->getEnableHeadingSequence() && !isReadOnly();
|
||||||
|
int headingSequenceBaseLevel = g_config->getHeadingSequenceBaseLevel();
|
||||||
|
if (headingSequenceBaseLevel < 1 || headingSequenceBaseLevel > 6) {
|
||||||
|
headingSequenceBaseLevel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
QVector<int> seqs(7, 0);
|
QVector<int> seqs(7, 0);
|
||||||
QRegExp preReg(VUtils::c_headerPrefixRegExp);
|
QRegExp preReg(VUtils::c_headerPrefixRegExp);
|
||||||
int curLevel = baseLevel - 1;
|
int curLevel = baseLevel - 1;
|
||||||
@ -445,7 +459,7 @@ void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
|
|||||||
// Insert empty level which is an invalid header.
|
// Insert empty level which is an invalid header.
|
||||||
m_headers.append(VHeader(curLevel, c_emptyHeaderName, "", -1, m_headers.size()));
|
m_headers.append(VHeader(curLevel, c_emptyHeaderName, "", -1, m_headers.size()));
|
||||||
if (autoSequence) {
|
if (autoSequence) {
|
||||||
addHeaderSequence(seqs, curLevel);
|
addHeaderSequence(seqs, curLevel, headingSequenceBaseLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -453,7 +467,7 @@ void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
|
|||||||
m_headers.append(item);
|
m_headers.append(item);
|
||||||
curLevel = item.level;
|
curLevel = item.level;
|
||||||
if (autoSequence) {
|
if (autoSequence) {
|
||||||
addHeaderSequence(seqs, item.level);
|
addHeaderSequence(seqs, item.level, headingSequenceBaseLevel);
|
||||||
|
|
||||||
QString seqStr = headerSequenceStr(seqs);
|
QString seqStr = headerSequenceStr(seqs);
|
||||||
if (headerSequences[i] != seqStr) {
|
if (headerSequences[i] != seqStr) {
|
||||||
@ -768,5 +782,7 @@ void VMdEdit::finishOneAsyncJob(int p_idx)
|
|||||||
setModified(false);
|
setModified(false);
|
||||||
m_freshEdit = false;
|
m_freshEdit = false;
|
||||||
emit statusChanged();
|
emit statusChanged();
|
||||||
|
|
||||||
|
updateOutline(m_mdHighlighter->getHeaderRegions());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user