vnote/src/widgets/outlineprovider.cpp
Le Tan 6109737b9d Fixes
1. OutlineViewer: support section number;
2. Allow to close the file before opening with external program;
3. Skip end marker within a block marker;
2021-08-17 20:58:55 +08:00

104 lines
2.1 KiB
C++

#include "outlineprovider.h"
using namespace vnotex;
void Outline::clear()
{
m_headings.clear();
}
bool Outline::operator==(const Outline &p_a) const
{
return m_headings == p_a.m_headings;
}
bool Outline::isEmpty() const
{
return m_headings.isEmpty();
}
Outline::Heading::Heading(const QString &p_name, int p_level)
: m_name(p_name),
m_level(p_level)
{
}
bool Outline::Heading::operator==(const Outline::Heading &p_a) const
{
return m_level == p_a.m_level && m_name == p_a.m_name;
}
OutlineProvider::OutlineProvider(QObject *p_parent)
: QObject(p_parent)
{
}
OutlineProvider::~OutlineProvider()
{
}
void OutlineProvider::setOutline(const QSharedPointer<Outline> &p_outline)
{
m_outline = p_outline;
m_currentHeadingIndex = -1;
emit outlineChanged();
}
const QSharedPointer<Outline> &OutlineProvider::getOutline() const
{
return m_outline;
}
int OutlineProvider::getCurrentHeadingIndex() const
{
return m_currentHeadingIndex;
}
void OutlineProvider::setCurrentHeadingIndex(int p_idx)
{
if (m_currentHeadingIndex == p_idx) {
return;
}
m_currentHeadingIndex = p_idx;
emit currentHeadingChanged();
}
void OutlineProvider::increaseSectionNumber(SectionNumber &p_sectionNumber, int p_level, int p_baseLevel)
{
Q_ASSERT(p_level >= 1 && p_level < p_sectionNumber.size());
if (p_level < p_baseLevel) {
p_sectionNumber.fill(0);
return;
}
++p_sectionNumber[p_level];
for (int i = p_level + 1; i < p_sectionNumber.size(); ++i) {
p_sectionNumber[i] = 0;
}
}
QString OutlineProvider::joinSectionNumber(const SectionNumber &p_sectionNumber, bool p_endingDot)
{
QString res;
for (auto sec : p_sectionNumber) {
if (sec != 0) {
if (res.isEmpty()) {
res = QString::number(sec);
} else {
res += '.' + QString::number(sec);
}
} else if (res.isEmpty()) {
continue;
} else {
break;
}
}
if (p_endingDot && !res.isEmpty()) {
return res + '.';
} else {
return res;
}
}