fb2tree.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "fb2tree.h"
  2. #include <QtDebug>
  3. #include <QTextDocument>
  4. #include <QTextDocumentFragment>
  5. #include <QTextFrame>
  6. Fb2TreeItem::Fb2TreeItem(QTextFrame *frame, Fb2TreeItem *parent)
  7. : QObject(parent)
  8. , m_frame(frame)
  9. , m_parent(parent)
  10. {
  11. QTextCursor cursor(m_frame);
  12. cursor.setPosition(m_frame->firstPosition(), QTextCursor::MoveAnchor);
  13. cursor.setPosition(m_frame->lastPosition(), QTextCursor::KeepAnchor);
  14. QTextDocumentFragment fragment(cursor);
  15. m_text = fragment.toPlainText().simplified().left(255);
  16. foreach (QTextFrame * frame, frame->childFrames()) {
  17. m_list << new Fb2TreeItem(frame, this);
  18. }
  19. }
  20. Fb2TreeItem::~Fb2TreeItem()
  21. {
  22. foreach (Fb2TreeItem * item, m_list) {
  23. delete item;
  24. }
  25. }
  26. Fb2TreeItem * Fb2TreeItem::item(const QModelIndex &index) const
  27. {
  28. int row = index.row();
  29. if (row < 0 || row >= m_list.size()) return NULL;
  30. return m_list[row];
  31. }
  32. Fb2TreeItem * Fb2TreeItem::item(int row) const
  33. {
  34. if (row < 0 || row >= m_list.size()) return NULL;
  35. return m_list[row];
  36. }
  37. QString Fb2TreeItem::text() const
  38. {
  39. return tr("<section>") + m_text;
  40. }
  41. //---------------------------------------------------------------------------
  42. // Fb2TreeModel
  43. //---------------------------------------------------------------------------
  44. Fb2TreeModel::Fb2TreeModel(QTextEdit &text, QObject *parent)
  45. : QAbstractItemModel(parent)
  46. , m_text(text)
  47. , m_root(NULL)
  48. {
  49. if (QTextDocument * doc = text.document()) {
  50. m_root = new Fb2TreeItem(doc->rootFrame());
  51. }
  52. }
  53. Fb2TreeModel::~Fb2TreeModel()
  54. {
  55. if (m_root) delete m_root;
  56. }
  57. Fb2TreeItem * Fb2TreeModel::item(const QModelIndex &index) const
  58. {
  59. if (index.isValid()) {
  60. return static_cast<Fb2TreeItem*>(index.internalPointer());
  61. } else {
  62. return m_root;
  63. }
  64. }
  65. int Fb2TreeModel::columnCount(const QModelIndex &parent) const
  66. {
  67. Q_UNUSED(parent);
  68. return 1;
  69. }
  70. QModelIndex Fb2TreeModel::index(int row, int column, const QModelIndex &parent) const
  71. {
  72. if (!m_root || row < 0 || column < 0) return QModelIndex();
  73. if (Fb2TreeItem *owner = item(parent)) {
  74. if (Fb2TreeItem *child = owner->item(row)) {
  75. return createIndex(row, column, (void*)child);
  76. }
  77. }
  78. return QModelIndex();
  79. }
  80. QModelIndex Fb2TreeModel::parent(const QModelIndex &child) const
  81. {
  82. if (Fb2TreeItem * node = static_cast<Fb2TreeItem*>(child.internalPointer())) {
  83. if (Fb2TreeItem * parent = node->parent()) {
  84. if (Fb2TreeItem * owner = parent->parent()) {
  85. return createIndex(owner->index(parent), 0, (void*)parent);
  86. }
  87. }
  88. }
  89. return QModelIndex();
  90. }
  91. int Fb2TreeModel::rowCount(const QModelIndex &parent) const
  92. {
  93. if (parent.column() > 0) return 0;
  94. Fb2TreeItem *owner = item(parent);
  95. return owner ? owner->count() : 0;
  96. }
  97. QVariant Fb2TreeModel::data(const QModelIndex &index, int role) const
  98. {
  99. if (role != Qt::DisplayRole) return QVariant();
  100. Fb2TreeItem * i = item(index);
  101. return i ? i->text() : QVariant();
  102. }
  103. void Fb2TreeModel::select(const QModelIndex &index)
  104. {
  105. Fb2TreeItem * i = item(index);
  106. if (!i) return;
  107. QTextFrame * f = i->frame();
  108. if (!f) return;
  109. QTextCursor cursor = m_text.textCursor();
  110. cursor.setPosition(f->firstPosition());
  111. m_text.moveCursor(QTextCursor::End);
  112. m_text.setTextCursor(cursor);
  113. }