1
0

fb2tree.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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(int index) const
  27. {
  28. if (index < 0 || index >= m_list.size()) return NULL;
  29. return m_list[index];
  30. }
  31. QString Fb2TreeItem::text() const
  32. {
  33. return tr("<section>") + m_text;
  34. }
  35. //---------------------------------------------------------------------------
  36. // Fb2TreeModel
  37. //---------------------------------------------------------------------------
  38. Fb2TreeModel::Fb2TreeModel(QTextEdit &text, QObject *parent)
  39. : QAbstractItemModel(parent)
  40. , m_text(text)
  41. , m_root(NULL)
  42. {
  43. if (QTextDocument * doc = text.document()) {
  44. m_root = new Fb2TreeItem(doc->rootFrame());
  45. }
  46. }
  47. Fb2TreeModel::~Fb2TreeModel()
  48. {
  49. if (m_root) delete m_root;
  50. }
  51. Fb2TreeItem * Fb2TreeModel::item(const QModelIndex &index) const
  52. {
  53. if (!m_root) return NULL;
  54. if (!index.isValid()) return m_root;
  55. Fb2TreeItem * parent = item(index.parent());
  56. return parent ? parent->item(index.row()) : NULL;
  57. }
  58. int Fb2TreeModel::columnCount(const QModelIndex &parent) const
  59. {
  60. Q_UNUSED(parent);
  61. return 1;
  62. }
  63. QModelIndex Fb2TreeModel::index(int row, int column, const QModelIndex &parent) const
  64. {
  65. if (!m_root) return QModelIndex();
  66. Fb2TreeItem * i = item(parent);
  67. return i ? createIndex(row, column, (void*)i) : QModelIndex();
  68. }
  69. QModelIndex Fb2TreeModel::parent(const QModelIndex &child) const
  70. {
  71. if (Fb2TreeItem * parent = static_cast<Fb2TreeItem*>(child.internalPointer())) {
  72. if (Fb2TreeItem * owner = parent->parent()) {
  73. return createIndex(owner->index(parent), 0, (void*)owner);
  74. }
  75. }
  76. return QModelIndex();
  77. }
  78. int Fb2TreeModel::rowCount(const QModelIndex &parent) const
  79. {
  80. Fb2TreeItem * i = item(parent);
  81. return i ? i->count() : 0;
  82. }
  83. QVariant Fb2TreeModel::data(const QModelIndex &index, int role) const
  84. {
  85. if (role != Qt::DisplayRole) return QVariant();
  86. Fb2TreeItem * i = item(index);
  87. return i ? i->text() : QVariant();
  88. }
  89. void Fb2TreeModel::select(const QModelIndex &index)
  90. {
  91. Fb2TreeItem * i = item(index);
  92. if (!i) return;
  93. QTextFrame * f = i->frame();
  94. if (!f) return;
  95. QTextCursor cursor = m_text.textCursor();
  96. cursor.setPosition(f->firstPosition());
  97. m_text.moveCursor(QTextCursor::End);
  98. m_text.setTextCursor(cursor);
  99. }