1
0

fb2tree.cpp 3.0 KB

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