refine heading sequence

1. add toolbar button to enable/disable heading sequence of current
note temporary;
2. Support independent configuration for external files;
3. Change enable_heading_sequence configuration to heading_sequence_type;
This commit is contained in:
Le Tan 2017-10-13 07:10:27 +08:00
parent 183b24915a
commit 2b299ff9b7
14 changed files with 211 additions and 77 deletions

View File

@ -603,28 +603,34 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent)
m_openModeCombo->addItem(tr("Read Mode"), (int)OpenFileMode::Read); m_openModeCombo->addItem(tr("Read Mode"), (int)OpenFileMode::Read);
m_openModeCombo->addItem(tr("Edit Mode"), (int)OpenFileMode::Edit); m_openModeCombo->addItem(tr("Edit Mode"), (int)OpenFileMode::Edit);
QLabel *openModeLabel = new QLabel(tr("Note open mode:"));
openModeLabel->setToolTip(m_openModeCombo->toolTip());
// Heading sequence. // Heading sequence.
m_headingSequence = new QCheckBox(tr("Heading sequence")); m_headingSequenceTypeCombo = new QComboBox();
m_headingSequence->setToolTip(tr("Enable auto sequence for all headings (in the form like 1.2.3.4.)")); m_headingSequenceTypeCombo->setToolTip(tr("Enable auto sequence for all headings (in the form like 1.2.3.4.)"));
m_headingSequenceCombo = new QComboBox(); m_headingSequenceTypeCombo->addItem(tr("Disabled"), (int)HeadingSequenceType::Disabled);
m_headingSequenceCombo->setToolTip(tr("Base level to start heading sequence")); m_headingSequenceTypeCombo->addItem(tr("Enabled"), (int)HeadingSequenceType::Enabled);
m_headingSequenceCombo->addItem(tr("1"), 1); m_headingSequenceTypeCombo->addItem(tr("Enabled for notes only"), (int)HeadingSequenceType::EnabledNoteOnly);
m_headingSequenceCombo->addItem(tr("2"), 2);
m_headingSequenceCombo->addItem(tr("3"), 3); m_headingSequenceLevelCombo = new QComboBox();
m_headingSequenceCombo->addItem(tr("4"), 4); m_headingSequenceLevelCombo->setToolTip(tr("Base level to start heading sequence"));
m_headingSequenceCombo->addItem(tr("5"), 5); m_headingSequenceLevelCombo->addItem(tr("1"), 1);
m_headingSequenceCombo->addItem(tr("6"), 6); m_headingSequenceLevelCombo->addItem(tr("2"), 2);
m_headingSequenceCombo->setEnabled(false); m_headingSequenceLevelCombo->addItem(tr("3"), 3);
connect(m_headingSequence, &QCheckBox::stateChanged, m_headingSequenceLevelCombo->addItem(tr("4"), 4);
this, [this](int p_state){ m_headingSequenceLevelCombo->addItem(tr("5"), 5);
this->m_headingSequenceCombo->setEnabled(p_state == Qt::Checked); m_headingSequenceLevelCombo->addItem(tr("6"), 6);
m_headingSequenceLevelCombo->setEnabled(false);
connect(m_headingSequenceTypeCombo, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated),
this, [this](int p_index){
if (p_index > -1) {
HeadingSequenceType type = (HeadingSequenceType)m_headingSequenceTypeCombo->itemData(p_index).toInt();
m_headingSequenceLevelCombo->setEnabled(type != HeadingSequenceType::Disabled);
}
}); });
QHBoxLayout *headingSequenceLayout = new QHBoxLayout(); QHBoxLayout *headingSequenceLayout = new QHBoxLayout();
headingSequenceLayout->addWidget(m_headingSequence); headingSequenceLayout->addWidget(m_headingSequenceTypeCombo);
headingSequenceLayout->addWidget(m_headingSequenceCombo); headingSequenceLayout->addWidget(m_headingSequenceLevelCombo);
// 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);
@ -652,8 +658,8 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent)
colorColumnLabel->setToolTip(m_colorColumnEdit->toolTip()); colorColumnLabel->setToolTip(m_colorColumnEdit->toolTip());
QFormLayout *mainLayout = new QFormLayout(); QFormLayout *mainLayout = new QFormLayout();
mainLayout->addRow(openModeLabel, m_openModeCombo); mainLayout->addRow(tr("Note open mode:"), m_openModeCombo);
mainLayout->addRow(headingSequenceLayout); mainLayout->addRow(tr("Heading sequence:"), headingSequenceLayout);
mainLayout->addRow(zoomFactorLayout); mainLayout->addRow(zoomFactorLayout);
mainLayout->addRow(colorColumnLabel, m_colorColumnEdit); mainLayout->addRow(colorColumnLabel, m_colorColumnEdit);
@ -727,21 +733,28 @@ bool VMarkdownTab::saveOpenMode()
bool VMarkdownTab::loadHeadingSequence() bool VMarkdownTab::loadHeadingSequence()
{ {
bool enabled = g_config->getEnableHeadingSequence(); HeadingSequenceType type = g_config->getHeadingSequenceType();
int level = g_config->getHeadingSequenceBaseLevel(); int level = g_config->getHeadingSequenceBaseLevel();
if (level < 1 || level > 6) { if (level < 1 || level > 6) {
level = 1; level = 1;
} }
m_headingSequence->setChecked(enabled); int idx = m_headingSequenceTypeCombo->findData((int)type);
m_headingSequenceCombo->setCurrentIndex(level - 1); Q_ASSERT(idx > -1);
m_headingSequenceTypeCombo->setCurrentIndex(idx);
m_headingSequenceLevelCombo->setCurrentIndex(level - 1);
m_headingSequenceLevelCombo->setEnabled(type != HeadingSequenceType::Disabled);
return true; return true;
} }
bool VMarkdownTab::saveHeadingSequence() bool VMarkdownTab::saveHeadingSequence()
{ {
g_config->setEnableHeadingSequence(m_headingSequence->isChecked()); QVariant typeData = m_headingSequenceTypeCombo->currentData();
g_config->setHeadingSequenceBaseLevel(m_headingSequenceCombo->currentData().toInt()); Q_ASSERT(typeData.isValid());
g_config->setHeadingSequenceType((HeadingSequenceType)typeData.toInt());
g_config->setHeadingSequenceBaseLevel(m_headingSequenceLevelCombo->currentData().toInt());
return true; return true;
} }

View File

@ -117,8 +117,8 @@ public:
QComboBox *m_openModeCombo; QComboBox *m_openModeCombo;
// Whether enable heading sequence. // Whether enable heading sequence.
QCheckBox *m_headingSequence; QComboBox *m_headingSequenceTypeCombo;
QComboBox *m_headingSequenceCombo; QComboBox *m_headingSequenceLevelCombo;
// Web zoom factor. // Web zoom factor.
QCheckBox *m_customWebZoom; QCheckBox *m_customWebZoom;

View File

@ -0,0 +1,7 @@
<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
<g>
<title>Layer 2</title>
<text stroke="#000000" transform="matrix(11.892995768998892,0,0,12.532065948318316,-399.2455647895517,-874.5950374851516) " xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="24" id="svg_1" y="98.48198" x="55.1146" stroke-width="0" fill="#000000">1.2.</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 502 B

View File

@ -97,7 +97,8 @@ insert_title_from_note_name=true
note_open_mode=0 note_open_mode=0
; Whether auto generate heading sequence ; Whether auto generate heading sequence
enable_heading_sequence=false ; 0 - Disabled, 1 - Enabled, 2 - Enabled only for notes
heading_sequence_type=0
; Heading sequence base level ; Heading sequence base level
heading_sequence_base_level=1 heading_sequence_base_level=1

View File

@ -191,8 +191,14 @@ void VConfigManager::initialize()
m_noteOpenMode = OpenFileMode::Read; m_noteOpenMode = OpenFileMode::Read;
} }
m_enableHeadingSequence = getConfigFromSettings("global", int tmpHeadingSequenceType = getConfigFromSettings("global",
"enable_heading_sequence").toBool(); "heading_sequence_type").toInt();
if (tmpHeadingSequenceType < (int)HeadingSequenceType::Invalid
&& tmpHeadingSequenceType >= (int)HeadingSequenceType::Disabled) {
m_headingSequenceType = (HeadingSequenceType)tmpHeadingSequenceType;
} else {
m_headingSequenceType = HeadingSequenceType::Disabled;
}
m_headingSequenceBaseLevel = getConfigFromSettings("global", m_headingSequenceBaseLevel = getConfigFromSettings("global",
"heading_sequence_base_level").toInt(); "heading_sequence_base_level").toInt();

View File

@ -43,6 +43,18 @@ struct MarkdownitOption
bool m_linkify; bool m_linkify;
}; };
// Type of heading sequence.
enum class HeadingSequenceType
{
Disabled = 0,
Enabled,
// Enabled only for internal notes.
EnabledNoteOnly,
Invalid
};
class VConfigManager : public QObject class VConfigManager : public QObject
{ {
public: public:
@ -262,8 +274,8 @@ public:
OpenFileMode getNoteOpenMode() const; OpenFileMode getNoteOpenMode() const;
void setNoteOpenMode(OpenFileMode p_mode); void setNoteOpenMode(OpenFileMode p_mode);
bool getEnableHeadingSequence() const; HeadingSequenceType getHeadingSequenceType() const;
void setEnableHeadingSequence(bool p_enabled); void setHeadingSequenceType(HeadingSequenceType p_type);
int getHeadingSequenceBaseLevel() const; int getHeadingSequenceBaseLevel() const;
void setHeadingSequenceBaseLevel(int p_level); void setHeadingSequenceBaseLevel(int p_level);
@ -599,7 +611,7 @@ private:
OpenFileMode m_noteOpenMode; OpenFileMode m_noteOpenMode;
// Whether auto genearte heading sequence. // Whether auto genearte heading sequence.
bool m_enableHeadingSequence; HeadingSequenceType m_headingSequenceType;
// Heading sequence base level. // Heading sequence base level.
int m_headingSequenceBaseLevel; int m_headingSequenceBaseLevel;
@ -1471,20 +1483,21 @@ inline void VConfigManager::setNoteOpenMode(OpenFileMode p_mode)
m_noteOpenMode == OpenFileMode::Read ? 0 : 1); m_noteOpenMode == OpenFileMode::Read ? 0 : 1);
} }
inline bool VConfigManager::getEnableHeadingSequence() const inline HeadingSequenceType VConfigManager::getHeadingSequenceType() const
{ {
return m_enableHeadingSequence; return m_headingSequenceType;
} }
inline void VConfigManager::setEnableHeadingSequence(bool p_enabled) inline void VConfigManager::setHeadingSequenceType(HeadingSequenceType p_type)
{ {
if (m_enableHeadingSequence == p_enabled) { if (m_headingSequenceType == p_type) {
return; return;
} }
m_enableHeadingSequence = p_enabled; m_headingSequenceType = p_type;
setConfigToSettings("global", "enable_heading_sequence", setConfigToSettings("global",
m_enableHeadingSequence); "heading_sequence_type",
(int)m_headingSequenceType);
} }
inline int VConfigManager::getHeadingSequenceBaseLevel() const inline int VConfigManager::getHeadingSequenceBaseLevel() const

View File

@ -13,10 +13,12 @@
extern VConfigManager *g_config; extern VConfigManager *g_config;
extern VNote *g_vnote; extern VNote *g_vnote;
void VEditConfig::init(const QFontMetrics &p_metric) void VEditConfig::init(const QFontMetrics &p_metric,
bool p_enableHeadingSequence)
{ {
update(p_metric); update(p_metric);
// Init configs that do not support update later.
m_enableVimMode = g_config->getEnableVimMode(); m_enableVimMode = g_config->getEnableVimMode();
if (g_config->getLineDistanceHeight() <= 0) { if (g_config->getLineDistanceHeight() <= 0) {
@ -26,6 +28,8 @@ void VEditConfig::init(const QFontMetrics &p_metric)
} }
m_highlightWholeBlock = m_enableVimMode; m_highlightWholeBlock = m_enableVimMode;
m_enableHeadingSequence = p_enableHeadingSequence;
} }
void VEditConfig::update(const QFontMetrics &p_metric) void VEditConfig::update(const QFontMetrics &p_metric)
@ -84,7 +88,7 @@ VEdit::VEdit(VFile *p_file, QWidget *p_parent)
updateFontAndPalette(); updateFontAndPalette();
m_config.init(QFontMetrics(font())); m_config.init(QFontMetrics(font()), false);
updateConfig(); updateConfig();
connect(this, &VEdit::cursorPositionChanged, connect(this, &VEdit::cursorPositionChanged,

View File

@ -37,10 +37,12 @@ public:
m_tabSpaces("\t"), m_tabSpaces("\t"),
m_enableVimMode(false), m_enableVimMode(false),
m_highlightWholeBlock(false), m_highlightWholeBlock(false),
m_lineDistanceHeight(0) m_lineDistanceHeight(0),
m_enableHeadingSequence(false)
{} {}
void init(const QFontMetrics &p_metric); void init(const QFontMetrics &p_metric,
bool p_enableHeadingSequence);
// Only update those configs which could be updated online. // Only update those configs which could be updated online.
void update(const QFontMetrics &p_metric); void update(const QFontMetrics &p_metric);
@ -63,6 +65,9 @@ public:
// Line distance height in pixels. // Line distance height in pixels.
int m_lineDistanceHeight; int m_lineDistanceHeight;
// Whether enable auto heading sequence.
bool m_enableHeadingSequence;
}; };
class LineNumberArea; class LineNumberArea;

View File

@ -331,6 +331,7 @@ void VMainWindow::initViewToolBar(QSize p_iconSize)
viewToolBar->addAction(expandViewAct); viewToolBar->addAction(expandViewAct);
} }
// Enable/disable all actions of @p_widget.
static void setActionsEnabled(QWidget *p_widget, bool p_enabled) static void setActionsEnabled(QWidget *p_widget, bool p_enabled)
{ {
Q_ASSERT(p_widget); Q_ASSERT(p_widget);
@ -351,6 +352,22 @@ void VMainWindow::initEditToolBar(QSize p_iconSize)
m_editToolBar->addSeparator(); m_editToolBar->addSeparator();
m_headingSequenceAct = new QAction(QIcon(":/resources/icons/heading_sequence.svg"),
tr("Heading Sequence"),
this);
m_headingSequenceAct->setStatusTip(tr("Enable heading sequence in current note in edit mode"));
m_headingSequenceAct->setCheckable(true);
connect(m_headingSequenceAct, &QAction::triggered,
this, [this](bool p_checked){
if (isHeadingSequenceApplicable()) {
VMdTab *tab = dynamic_cast<VMdTab *>(m_curTab.data());
Q_ASSERT(tab);
tab->enableHeadingSequence(p_checked);
}
});
m_editToolBar->addAction(m_headingSequenceAct);
QAction *boldAct = new QAction(QIcon(":/resources/icons/bold.svg"), QAction *boldAct = new QAction(QIcon(":/resources/icons/bold.svg"),
tr("Bold (Ctrl+B)"), this); tr("Bold (Ctrl+B)"), this);
boldAct->setStatusTip(tr("Insert bold text or change selected text to bold")); boldAct->setStatusTip(tr("Insert bold text or change selected text to bold"));
@ -1694,61 +1711,66 @@ void VMainWindow::setCodeBlockStyle(QAction *p_action)
} }
} }
void VMainWindow::updateActionStateFromTabStatusChange(const VFile *p_file, void VMainWindow::updateActionsStateFromTab(const VEditTab *p_tab)
bool p_editMode)
{ {
bool systemFile = p_file const VFile *file = p_tab ? p_tab->getFile() : NULL;
&& p_file->getType() == FileType::Orphan bool editMode = p_tab ? p_tab->isEditMode() : false;
&& dynamic_cast<const VOrphanFile *>(p_file)->isSystemFile(); bool systemFile = file
&& file->getType() == FileType::Orphan
&& dynamic_cast<const VOrphanFile *>(file)->isSystemFile();
m_printAct->setEnabled(p_file && p_file->getDocType() == DocType::Markdown); m_printAct->setEnabled(file && file->getDocType() == DocType::Markdown);
m_exportAsPDFAct->setEnabled(p_file && p_file->getDocType() == DocType::Markdown); m_exportAsPDFAct->setEnabled(file && file->getDocType() == DocType::Markdown);
discardExitAct->setVisible(p_file && p_editMode); discardExitAct->setVisible(file && editMode);
saveExitAct->setVisible(p_file && p_editMode); saveExitAct->setVisible(file && editMode);
editNoteAct->setEnabled(p_file && p_file->isModifiable() && !p_editMode); editNoteAct->setEnabled(file && file->isModifiable() && !editMode);
editNoteAct->setVisible(!saveExitAct->isVisible()); editNoteAct->setVisible(!saveExitAct->isVisible());
saveNoteAct->setEnabled(p_file && p_editMode); saveNoteAct->setEnabled(file && editMode);
deleteNoteAct->setEnabled(p_file && p_file->getType() == FileType::Note); deleteNoteAct->setEnabled(file && file->getType() == FileType::Note);
noteInfoAct->setEnabled(p_file && !systemFile); noteInfoAct->setEnabled(file && !systemFile);
m_attachmentBtn->setEnabled(p_file && p_file->getType() == FileType::Note); m_attachmentBtn->setEnabled(file && file->getType() == FileType::Note);
m_insertImageAct->setEnabled(p_file && p_editMode); m_insertImageAct->setEnabled(file && editMode);
setActionsEnabled(m_editToolBar, p_file && p_editMode); setActionsEnabled(m_editToolBar, file && editMode);
// Handle heading sequence act independently.
m_headingSequenceAct->setEnabled(isHeadingSequenceApplicable());
const VMdTab *mdTab = dynamic_cast<const VMdTab *>(p_tab);
m_headingSequenceAct->setChecked(mdTab && mdTab->isHeadingSequenceEnabled());
// Find/Replace // Find/Replace
m_findReplaceAct->setEnabled(p_file); m_findReplaceAct->setEnabled(file);
m_findNextAct->setEnabled(p_file); m_findNextAct->setEnabled(file);
m_findPreviousAct->setEnabled(p_file); m_findPreviousAct->setEnabled(file);
m_replaceAct->setEnabled(p_file && p_editMode); m_replaceAct->setEnabled(file && editMode);
m_replaceFindAct->setEnabled(p_file && p_editMode); m_replaceFindAct->setEnabled(file && editMode);
m_replaceAllAct->setEnabled(p_file && p_editMode); m_replaceAllAct->setEnabled(file && editMode);
if (!p_file) { if (!file) {
m_findReplaceDialog->closeDialog(); m_findReplaceDialog->closeDialog();
} }
} }
void VMainWindow::handleAreaTabStatusUpdated(const VEditTabInfo &p_info) void VMainWindow::handleAreaTabStatusUpdated(const VEditTabInfo &p_info)
{ {
bool editMode = false;
m_curTab = p_info.m_editTab; m_curTab = p_info.m_editTab;
if (m_curTab) { if (m_curTab) {
m_curFile = m_curTab->getFile(); m_curFile = m_curTab->getFile();
editMode = m_curTab->isEditMode();
} else { } else {
m_curFile = NULL; m_curFile = NULL;
} }
updateActionStateFromTabStatusChange(m_curFile, editMode); updateActionsStateFromTab(m_curTab);
m_attachmentList->setFile(dynamic_cast<VNoteFile *>(m_curFile.data())); m_attachmentList->setFile(dynamic_cast<VNoteFile *>(m_curFile.data()));
QString title; QString title;
if (m_curFile) { if (m_curFile) {
m_findReplaceDialog->updateState(m_curFile->getDocType(), editMode); m_findReplaceDialog->updateState(m_curFile->getDocType(),
m_curTab->isEditMode());
if (m_curFile->getType() == FileType::Note) { if (m_curFile->getType() == FileType::Note) {
const VNoteFile *tmpFile = dynamic_cast<const VNoteFile *>((VFile *)m_curFile); const VNoteFile *tmpFile = dynamic_cast<const VNoteFile *>((VFile *)m_curFile);
@ -2465,3 +2487,19 @@ void VMainWindow::openStartupPages()
break; break;
} }
} }
bool VMainWindow::isHeadingSequenceApplicable() const
{
if (!m_curTab) {
return false;
}
Q_ASSERT(m_curFile);
if (!m_curFile->isModifiable()
|| m_curFile->getDocType() != DocType::Markdown) {
return false;
}
return true;
}

View File

@ -202,8 +202,10 @@ private:
void initEditorStyleMenu(QMenu *p_emnu); void initEditorStyleMenu(QMenu *p_emnu);
void updateWindowTitle(const QString &str); void updateWindowTitle(const QString &str);
void updateActionStateFromTabStatusChange(const VFile *p_file,
bool p_editMode); // Update state of actions according to @p_tab.
void updateActionsStateFromTab(const VEditTab *p_tab);
void saveStateAndGeometry(); void saveStateAndGeometry();
void restoreStateAndGeometry(); void restoreStateAndGeometry();
void repositionAvatar(); void repositionAvatar();
@ -231,6 +233,10 @@ private:
// Will not change m_panelViewState. // Will not change m_panelViewState.
void changePanelView(PanelViewState p_state); void changePanelView(PanelViewState p_state);
// Whether heading sequence is applicable to current tab.
// Only available for writable Markdown file.
bool isHeadingSequenceApplicable() const;
VNote *vnote; VNote *vnote;
QPointer<VFile> m_curFile; QPointer<VFile> m_curFile;
QPointer<VEditTab> m_curTab; QPointer<VEditTab> m_curTab;
@ -285,6 +291,9 @@ private:
QAction *m_autoIndentAct; QAction *m_autoIndentAct;
// Enable heading sequence for current note.
QAction *m_headingSequenceAct;
// Act group for render styles. // Act group for render styles.
QActionGroup *m_renderStyleActs; QActionGroup *m_renderStyleActs;

View File

@ -464,7 +464,7 @@ void VMdEdit::updateHeaders(const QVector<VElementRegion> &p_headerRegions)
m_headers.clear(); m_headers.clear();
bool autoSequence = g_config->getEnableHeadingSequence() && !isReadOnly(); bool autoSequence = m_config.m_enableHeadingSequence && !isReadOnly();
int headingSequenceBaseLevel = g_config->getHeadingSequenceBaseLevel(); int headingSequenceBaseLevel = g_config->getHeadingSequenceBaseLevel();
if (headingSequenceBaseLevel < 1 || headingSequenceBaseLevel > 6) { if (headingSequenceBaseLevel < 1 || headingSequenceBaseLevel > 6) {
headingSequenceBaseLevel = 1; headingSequenceBaseLevel = 1;

View File

@ -22,13 +22,25 @@ extern VConfigManager *g_config;
VMdTab::VMdTab(VFile *p_file, VEditArea *p_editArea, VMdTab::VMdTab(VFile *p_file, VEditArea *p_editArea,
OpenFileMode p_mode, QWidget *p_parent) OpenFileMode p_mode, QWidget *p_parent)
: VEditTab(p_file, p_editArea, p_parent), m_editor(NULL), m_webViewer(NULL), : VEditTab(p_file, p_editArea, p_parent),
m_document(NULL), m_mdConType(g_config->getMdConverterType()) m_editor(NULL),
m_webViewer(NULL),
m_document(NULL),
m_mdConType(g_config->getMdConverterType()),
m_enableHeadingSequence(false)
{ {
V_ASSERT(m_file->getDocType() == DocType::Markdown); V_ASSERT(m_file->getDocType() == DocType::Markdown);
m_file->open(); m_file->open();
HeadingSequenceType headingSequenceType = g_config->getHeadingSequenceType();
if (headingSequenceType == HeadingSequenceType::Enabled) {
m_enableHeadingSequence = true;
} else if (headingSequenceType == HeadingSequenceType::EnabledNoteOnly
&& m_file->getType() == FileType::Note) {
m_enableHeadingSequence = true;
}
setupUI(); setupUI();
if (p_mode == OpenFileMode::Edit) { if (p_mode == OpenFileMode::Edit) {
@ -344,6 +356,7 @@ void VMdTab::setupMarkdownEditor()
{ {
Q_ASSERT(m_file->isModifiable() && !m_editor); Q_ASSERT(m_file->isModifiable() && !m_editor);
qDebug() << "create Markdown editor"; qDebug() << "create Markdown editor";
m_editor = new VMdEdit(m_file, m_document, m_mdConType, this); m_editor = new VMdEdit(m_file, m_document, m_mdConType, this);
connect(dynamic_cast<VMdEdit *>(m_editor), &VMdEdit::headersChanged, connect(dynamic_cast<VMdEdit *>(m_editor), &VMdEdit::headersChanged,
this, &VMdTab::updateOutlineFromHeaders); this, &VMdTab::updateOutlineFromHeaders);
@ -372,6 +385,7 @@ void VMdTab::setupMarkdownEditor()
connect(m_editor, SIGNAL(ready(void)), connect(m_editor, SIGNAL(ready(void)),
this, SLOT(restoreFromTabInfo(void))); this, SLOT(restoreFromTabInfo(void)));
enableHeadingSequence(m_enableHeadingSequence);
m_editor->reloadFile(); m_editor->reloadFile();
m_stacks->addWidget(m_editor); m_stacks->addWidget(m_editor);
} }
@ -654,3 +668,18 @@ void VMdTab::restoreFromTabInfo()
// Clear it anyway. // Clear it anyway.
m_infoToRestore.clear(); m_infoToRestore.clear();
} }
void VMdTab::enableHeadingSequence(bool p_enabled)
{
m_enableHeadingSequence = p_enabled;
if (m_editor) {
VEditConfig &config = m_editor->getConfig();
config.m_enableHeadingSequence = m_enableHeadingSequence;
}
}
bool VMdTab::isHeadingSequenceEnabled() const
{
return m_enableHeadingSequence;
}

View File

@ -65,6 +65,11 @@ public:
// Create a filled VEditTabInfo. // Create a filled VEditTabInfo.
VEditTabInfo fetchTabInfo() const Q_DECL_OVERRIDE; VEditTabInfo fetchTabInfo() const Q_DECL_OVERRIDE;
// Enable or disable heading sequence.
void enableHeadingSequence(bool p_enabled);
bool isHeadingSequenceEnabled() const;
public slots: public slots:
// Enter edit mode. // Enter edit mode.
void editFile() Q_DECL_OVERRIDE; void editFile() Q_DECL_OVERRIDE;
@ -149,6 +154,9 @@ private:
VDocument *m_document; VDocument *m_document;
MarkdownConverterType m_mdConType; MarkdownConverterType m_mdConType;
// Whether heading sequence is enabled.
bool m_enableHeadingSequence;
QStackedLayout *m_stacks; QStackedLayout *m_stacks;
}; };

View File

@ -131,5 +131,6 @@
<file>resources/icons/sort.svg</file> <file>resources/icons/sort.svg</file>
<file>resources/icons/create_subdir.svg</file> <file>resources/icons/create_subdir.svg</file>
<file>resources/icons/compact_mode.svg</file> <file>resources/icons/compact_mode.svg</file>
<file>resources/icons/heading_sequence.svg</file>
</qresource> </qresource>
</RCC> </RCC>