mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
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:
parent
183b24915a
commit
2b299ff9b7
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
7
src/resources/icons/heading_sequence.svg
Normal file
7
src/resources/icons/heading_sequence.svg
Normal 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 |
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user