listmodel.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "listmodel.h"
  2. #include <QDebug>
  3. ListModel::ListModel(ListItem* prototype, QObject *parent) : QAbstractListModel(parent), m_prototype(prototype)
  4. {
  5. setRoleNames(m_prototype->roleNames());
  6. }
  7. int ListModel::rowCount(const QModelIndex &parent) const
  8. {
  9. Q_UNUSED(parent);
  10. return m_list.size();
  11. }
  12. QVariant ListModel::data(const QModelIndex &index, int role) const
  13. {
  14. if(index.row() < 0 || index.row() >= m_list.size())
  15. return QVariant();
  16. return m_list.at(index.row())->data(role);
  17. }
  18. ListModel::~ListModel() {
  19. delete m_prototype;
  20. clear();
  21. }
  22. void ListModel::appendRow(ListItem *item)
  23. {
  24. appendRows(QList<ListItem*>() << item);
  25. }
  26. void ListModel::appendRows(const QList<ListItem *> &items)
  27. {
  28. beginInsertRows(QModelIndex(), rowCount(), rowCount()+items.size()-1);
  29. foreach(ListItem *item, items) {
  30. connect(item, SIGNAL(dataChanged()), SLOT(handleItemChange()));
  31. m_list.append(item);
  32. }
  33. endInsertRows();
  34. }
  35. void ListModel::insertRow(int row, ListItem *item)
  36. {
  37. beginInsertRows(QModelIndex(), row, row);
  38. connect(item, SIGNAL(dataChanged()), SLOT(handleItemChange()));
  39. m_list.insert(row, item);
  40. endInsertRows();
  41. }
  42. void ListModel::handleItemChange()
  43. {
  44. ListItem* item = static_cast<ListItem*>(sender());
  45. QModelIndex index = indexFromItem(item);
  46. if(index.isValid())
  47. emit dataChanged(index, index);
  48. }
  49. ListItem * ListModel::find(const QString &id) const
  50. {
  51. foreach(ListItem* item, m_list) {
  52. if(item->id() == id) return item;
  53. }
  54. return 0;
  55. }
  56. ListItem * ListModel::find(const QString &id, int &row) const
  57. {
  58. row = 0;
  59. foreach(ListItem* item, m_list) {
  60. if(item->id() == id) { /*qDebug()<<item->id()<<" - "<<row;*/ return item;}
  61. row++;
  62. }
  63. row = -1;
  64. return 0;
  65. }
  66. QModelIndex ListModel::indexFromItem(const ListItem *item) const
  67. {
  68. Q_ASSERT(item);
  69. for(int row=0; row<m_list.size(); ++row) {
  70. if(m_list.at(row) == item) return index(row);
  71. }
  72. return QModelIndex();
  73. }
  74. void ListModel::clear()
  75. {
  76. qDeleteAll(m_list);
  77. m_list.clear();
  78. }
  79. bool ListModel::removeRow(int row, const QModelIndex &parent)
  80. {
  81. Q_UNUSED(parent);
  82. //qDebug() << "removeRow: m_list.size()="<<m_list.size();
  83. if(row < 0 || row >= m_list.size()) return false;
  84. beginRemoveRows(QModelIndex(), row, row);
  85. delete m_list.takeAt(row);
  86. endRemoveRows();
  87. return true;
  88. }
  89. bool ListModel::removeRows(int row, int count, const QModelIndex &parent)
  90. {
  91. Q_UNUSED(parent);
  92. //qDebug() << "removeRows: m_list.size()="<<m_list.size();
  93. if(row < 0 || (row+count) > m_list.size()) return false; /* !!! */
  94. beginRemoveRows(QModelIndex(), row, row+count-1);
  95. for(int i=0; i<count; ++i) {
  96. delete m_list.takeAt(row);
  97. }
  98. endRemoveRows();
  99. return true;
  100. }
  101. ListItem * ListModel::takeRow(int row)
  102. {
  103. beginRemoveRows(QModelIndex(), row, row);
  104. ListItem* item = m_list.takeAt(row);
  105. endRemoveRows();
  106. return item;
  107. }
  108. bool ListModel::takeRows(int row, int count, const QModelIndex &parent)
  109. {
  110. Q_UNUSED(parent);
  111. if(row < 0 || (row+count) > m_list.size()) return false; /* !!! */
  112. beginRemoveRows(QModelIndex(), row, row+count-1);
  113. for(int i=0; i<count; ++i) {
  114. m_list.takeAt(row);
  115. }
  116. endRemoveRows();
  117. return true;
  118. }
  119. ListItem* ListModel::value( int row )
  120. {
  121. ListItem* item = m_list.value(row);
  122. return item;
  123. }