vnote/src/vtextblockdata.cpp
2018-08-24 20:14:38 +08:00

102 lines
2.4 KiB
C++

#include "vtextblockdata.h"
VTextBlockData::VTextBlockData()
: QTextBlockUserData(),
m_timeStamp(0),
m_codeBlockTimeStamp(0),
m_cacheValid(false),
m_codeBlockIndentation(-1)
{
}
VTextBlockData::~VTextBlockData()
{
for (auto it : m_previews) {
delete it;
}
m_previews.clear();
}
bool VTextBlockData::insertPreviewInfo(VPreviewInfo *p_info)
{
bool tsUpdated = false;
bool inserted = false;
for (auto it = m_previews.begin(); it != m_previews.end();) {
VPreviewInfo *ele = *it;
if (p_info->m_imageInfo < ele->m_imageInfo) {
// Insert p_info here.
m_previews.insert(it, p_info);
inserted = true;
break;
} else if (p_info->m_imageInfo == ele->m_imageInfo) {
// Update the timestamp.
delete ele;
*it = p_info;
inserted = true;
tsUpdated = true;
break;
} else if (p_info->m_imageInfo.intersect(ele->m_imageInfo)) {
// Two preview intersect.
delete ele;
it = m_previews.erase(it);
} else {
++it;
}
}
if (!inserted) {
// Append it.
m_previews.append(p_info);
}
Q_ASSERT(checkOrder());
return tsUpdated;
}
QString VTextBlockData::toString() const
{
QString ret;
for (int i = 0; i < m_previews.size(); ++i) {
ret += QString("preview %1: source %2 ts %3 image %4\n")
.arg(i)
.arg((int)m_previews[i]->m_source)
.arg(m_previews[i]->m_timeStamp)
.arg(m_previews[i]->m_imageInfo.toString());
}
return ret;
}
bool VTextBlockData::checkOrder() const
{
for (int i = 1; i < m_previews.size(); ++i) {
if (!(m_previews[i - 1]->m_imageInfo < m_previews[i]->m_imageInfo)) {
return false;
}
}
return true;
}
bool VTextBlockData::clearObsoletePreview(long long p_timeStamp, PreviewSource p_source)
{
bool deleted = false;
for (auto it = m_previews.begin(); it != m_previews.end();) {
VPreviewInfo *ele = *it;
if (ele->m_source == p_source
&& ele->m_timeStamp != p_timeStamp) {
// Remove it.
delete ele;
it = m_previews.erase(it);
deleted = true;
} else {
++it;
}
}
return deleted;
}