support custom base level for heading sequence by heading_sequence_base_level

This commit is contained in:
Le Tan 2017-09-14 20:23:11 +08:00
parent ae706fb066
commit f178b1c634
7 changed files with 88 additions and 11 deletions

View File

@ -51,6 +51,8 @@ VSettingsDialog::VSettingsDialog(QWidget *p_parent)
m_tabs->setCurrentWidget(m_tabs->widget(idx));
});
m_tabList->setCurrentRow(0);
loadConfiguration();
}
@ -449,19 +451,34 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent)
// 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_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.
m_customWebZoom = new QCheckBox(tr("Custom Web zoom factor"), this);
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->setMaximum(c_webZoomFactorMax);
m_webZoomFactorSpin->setMinimum(c_webZoomFactorMin);
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();
zoomFactorLayout->addWidget(m_customWebZoom);
zoomFactorLayout->addWidget(m_webZoomFactorSpin);
@ -478,7 +495,7 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent)
QFormLayout *mainLayout = new QFormLayout();
mainLayout->addRow(openModeLabel, m_openModeCombo);
mainLayout->addRow(m_headingSequence);
mainLayout->addRow(headingSequenceLayout);
mainLayout->addRow(zoomFactorLayout);
mainLayout->addRow(colorColumnLabel, m_colorColumnEdit);
@ -553,13 +570,20 @@ bool VMarkdownTab::saveOpenMode()
bool VMarkdownTab::loadHeadingSequence()
{
bool enabled = g_config->getEnableHeadingSequence();
int level = g_config->getHeadingSequenceBaseLevel();
if (level < 1 || level > 6) {
level = 1;
}
m_headingSequence->setChecked(enabled);
m_headingSequenceCombo->setCurrentIndex(level - 1);
return true;
}
bool VMarkdownTab::saveHeadingSequence()
{
g_config->setEnableHeadingSequence(m_headingSequence->isChecked());
g_config->setHeadingSequenceBaseLevel(m_headingSequenceCombo->currentData().toInt());
return true;
}

View File

@ -94,6 +94,7 @@ public:
// Whether enable heading sequence.
QCheckBox *m_headingSequence;
QComboBox *m_headingSequenceCombo;
// Web zoom factor.
QCheckBox *m_customWebZoom;

View File

@ -122,6 +122,8 @@ public:
const QMap<int, bool> &getPotentialPreviewBlocks() const;
const QVector<VElementRegion> &getHeaderRegions() const;
signals:
void highlightCompleted();
@ -239,4 +241,9 @@ inline const QMap<int, bool> &HGMarkdownHighlighter::getPotentialPreviewBlocks()
return m_potentialPreviewBlocks;
}
inline const QVector<VElementRegion> &HGMarkdownHighlighter::getHeaderRegions() const
{
return m_headerRegions;
}
#endif

View File

@ -86,6 +86,9 @@ note_open_mode=0
; Whether auto generate heading sequence
enable_heading_sequence=false
; Heading sequence base level
heading_sequence_base_level=1
; Style the xth column in fenced code block
; 0 - no color column
color_column=0

View File

@ -178,6 +178,9 @@ void VConfigManager::initialize()
m_enableHeadingSequence = getConfigFromSettings("global",
"enable_heading_sequence").toBool();
m_headingSequenceBaseLevel = getConfigFromSettings("global",
"heading_sequence_base_level").toInt();
m_colorColumn = getConfigFromSettings("global", "color_column").toInt();
m_enableCodeBlockLineNumber = getConfigFromSettings("global",

View File

@ -235,6 +235,9 @@ public:
bool getEnableHeadingSequence() const;
void setEnableHeadingSequence(bool p_enabled);
int getHeadingSequenceBaseLevel() const;
void setHeadingSequenceBaseLevel(int p_level);
int getColorColumn() const;
void setColorColumn(int p_column);
@ -486,6 +489,9 @@ private:
// Whether auto genearte heading sequence.
bool m_enableHeadingSequence;
// Heading sequence base level.
int m_headingSequenceBaseLevel;
// The column to style in code block.
int m_colorColumn;
@ -1252,6 +1258,23 @@ inline void VConfigManager::setEnableHeadingSequence(bool p_enabled)
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
{
return m_colorColumn;

View File

@ -109,7 +109,7 @@ void VMdEdit::beginEdit()
setReadOnly(false);
}
m_mdHighlighter->updateHighlight();
updateOutline(m_mdHighlighter->getHeaderRegions());
}
void VMdEdit::endEdit()
@ -330,9 +330,14 @@ void VMdEdit::updateCurHeader()
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());
if (p_level < p_baseLevel) {
p_sequence.fill(0);
return;
}
++p_sequence[p_level];
for (int i = p_level + 1; i < p_sequence.size(); ++i) {
p_sequence[i] = 0;
@ -382,7 +387,11 @@ static void insertSequenceToHeader(QTextBlock p_block,
cursor.setPosition(p_block.position() + end, QTextCursor::KeepAnchor);
}
cursor.insertText(p_seq + ' ');
if (p_seq.isEmpty()) {
cursor.removeSelectedText();
} else {
cursor.insertText(p_seq + ' ');
}
}
void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
@ -434,6 +443,11 @@ void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
m_headers.clear();
bool autoSequence = g_config->getEnableHeadingSequence() && !isReadOnly();
int headingSequenceBaseLevel = g_config->getHeadingSequenceBaseLevel();
if (headingSequenceBaseLevel < 1 || headingSequenceBaseLevel > 6) {
headingSequenceBaseLevel = 1;
}
QVector<int> seqs(7, 0);
QRegExp preReg(VUtils::c_headerPrefixRegExp);
int curLevel = baseLevel - 1;
@ -445,7 +459,7 @@ void VMdEdit::updateOutline(const QVector<VElementRegion> &p_headerRegions)
// Insert empty level which is an invalid header.
m_headers.append(VHeader(curLevel, c_emptyHeaderName, "", -1, m_headers.size()));
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);
curLevel = item.level;
if (autoSequence) {
addHeaderSequence(seqs, item.level);
addHeaderSequence(seqs, item.level, headingSequenceBaseLevel);
QString seqStr = headerSequenceStr(seqs);
if (headerSequences[i] != seqStr) {
@ -768,5 +782,7 @@ void VMdEdit::finishOneAsyncJob(int p_idx)
setModified(false);
m_freshEdit = false;
emit statusChanged();
updateOutline(m_mdHighlighter->getHeaderRegions());
}
}