#include "DocumentBuffer.h" #include #include #include void DocumentBuffer::insertCharacterAt(QChar character, int row, int col) { // Make sure lists are allocated properly for (int i = m_document.size(); i <= row; ++i) m_document.append(QList >()); for (int i = m_document[row].size(); i <= col; ++i) m_document[row].append(QLinkedList()); // We clear the list if we're writing on top of a newline, since newlines are not ink if (!m_document[row][col].isEmpty() && m_document[row][col].last() == QLatin1Char('\n')) m_document[row][col].clear(); m_document[row][col].append(character); } QPair DocumentBuffer::setText(const QString &string, int width) { int row = 0; int col = 0; foreach (const QChar &character, string) { if (character == QLatin1Char('\n')) { col = 0; ++row; } else { insertCharacterAt(character, row, col++); if (col == width) { col = 0; ++row; } } } return qMakePair(row, col); } QChar DocumentBuffer::topCharacterAt(int row, int col) const { return m_document[row][col].last(); } QString DocumentBuffer::topLineAt(int row) const { const QList > &line = m_document.at(row); const int size = line.size(); QString str(size, Qt::Uninitialized); for (int i = 0; i < size; ++i) str[i] = line[i].last(); return str; } QString DocumentBuffer::topDocument() const { QString str; for (int i = 0; i < m_document.size(); ++i) str += topLineAt(i); return str; } const QLinkedList& DocumentBuffer::charactersAt(int row, int col) const { return m_document[row][col]; } const QList >& DocumentBuffer::lineAt(int row) const { return m_document[row]; } const QList > >& DocumentBuffer::document() const { return m_document; } int DocumentBuffer::lineSize(int row) const { const int size = m_document.value(row).size(); const QLinkedList &list = m_document.value(row).value(size - 1); if (!list.isEmpty() && list.last() == QLatin1Char('\n')) return size - 1; return size; } int DocumentBuffer::linesCount() const { return m_document.size(); } QVariant DocumentBuffer::toVariant() const { QByteArray out; QDataStream stream(&out, QIODevice::ReadWrite); stream << m_document.size(); foreach (const QList > &line, m_document) { stream << line.size(); foreach (const QLinkedList &letters, line) { stream << letters.size(); foreach (const QChar &letter, letters) stream << letter; } } return QVariant(out); } DocumentBuffer* DocumentBuffer::fromVariant(const QVariant &variant) { DocumentBuffer *document = new DocumentBuffer; QDataStream stream(variant.toByteArray()); int linesCount; stream >> linesCount; for (int i = 0; i < linesCount; ++i) { QList > line; int colsCount; stream >> colsCount; for (int j = 0; j < colsCount; ++j) { QLinkedList letters; int lettersCount; stream >> lettersCount; for (int k = 0; k < lettersCount; ++k) { QChar letter; stream >> letter; letters.append(letter); } line.append(letters); } document->m_document.append(line); } return document; }