daymodel.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include "daymodel.h"
  2. #include <QtCore/QDebug>
  3. QHash<int, QByteArray> DayModel::roleNames()
  4. {
  5. QHash<int, QByteArray> roles;
  6. roles[StartTimeRole] = "startTime";
  7. roles[ItemDataRole] = "itemData";
  8. roles[HourSpanRole] = "hourSpan";
  9. roles[SpannedRole] = "spanned";
  10. roles[HourIdRole] = "hourId";
  11. roles[SetStartTimeRole] = "setStartTime";
  12. roles[SetItemDataRole] = "setItemData";
  13. roles[SetHourSpanRole] = "setHourSpan";
  14. return roles;
  15. }
  16. DayModel::DayModel(const QString& name, QObject *parent) :
  17. QAbstractListModel(parent), m_dayName(name), m_items()
  18. {
  19. QString templateItem("Day %1 Item %2");
  20. for (int i = DAYS_FIRST_SLOT; i < SLOTS_IN_A_DAY; i++) {
  21. Timeslot* slot = new Timeslot(i-DAYS_FIRST_SLOT, QTime(i,0,0,0));
  22. connect(slot, SIGNAL(dataChanged()), this, SLOT(handleItemChange()));
  23. slot->setItemData(templateItem.arg(m_dayName).arg(i));
  24. m_items.append(slot);
  25. // qDebug() << "Created slot" << slot->toString();
  26. }
  27. setRoleNames(DayModel::roleNames());
  28. // // Sets the seed within the range 0-999
  29. // qsrand(QTime::currentTime().msec());
  30. // // Set 0 to 3 spans / day
  31. // for (int i = qrand() % 4; i > 0; i--) {
  32. // setHourSpan(qrand() % 24, (qrand() % 3) + 2);
  33. // }
  34. }
  35. DayModel::~DayModel()
  36. {
  37. //TODO cleanup
  38. }
  39. int DayModel::rowCount(const QModelIndex &parent) const
  40. {
  41. return m_items.count();
  42. }
  43. QVariant DayModel::data(const QModelIndex &index, int role) const
  44. {
  45. if (index.isValid()) {
  46. int row = index.row();
  47. if (row >= 0 && row < m_items.count()) {
  48. Timeslot* slot = m_items[row];
  49. if (role == StartTimeRole){
  50. return QVariant(slot->startTime());
  51. } else if (role == ItemDataRole) {
  52. return QVariant(slot->itemData());
  53. } else if (role == HourSpanRole) {
  54. return QVariant(slot->hourSpan());
  55. } else if (role == SpannedRole) {
  56. return QVariant(slot->spanned());
  57. } else if (role == HourIdRole) {
  58. return QVariant(slot->hourId());
  59. } else {
  60. return QVariant("ERR: Unknown role for daymodel: " + role);
  61. }
  62. } else {
  63. return QVariant("ERR: Invalid index");
  64. }
  65. } else {
  66. return QVariant("ERR: Invalid index");
  67. }
  68. return QVariant("ERR: other");
  69. }
  70. QVariant DayModel::headerData( int section, Qt::Orientation orientation, int role) const
  71. {
  72. return QVariant("HEADER");
  73. }
  74. Qt::ItemFlags DayModel::flags( const QModelIndex & index) const
  75. {
  76. if (!index.isValid())
  77. return 0;
  78. return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
  79. }
  80. // For editing
  81. bool DayModel::setData( const QModelIndex & index, const QVariant & value, int role)
  82. {
  83. // TODO IMPLEMENT THIS!
  84. qDebug() << "setData(), index" << index << "role" << role;
  85. if (index.isValid()) {
  86. int row = index.row();
  87. if (row >= 0 && row < m_items.count()) {
  88. Timeslot* slot = m_items[row];
  89. if (role == SetStartTimeRole){
  90. return slot->setStartTime(value.toTime());
  91. } else if (role == SetItemDataRole) {
  92. return slot->setItemData(value.toString());
  93. } else if (role == SetHourSpanRole) {
  94. return setHourSpan(row, value.toInt());
  95. } else {
  96. //return QVariant("ERR: Unknown role for daymodel");
  97. return false;
  98. }
  99. } else {
  100. //return QVariant("ERR: Invalid index");
  101. return false;
  102. }
  103. } else {
  104. //return QVariant("ERR: Invalid index");
  105. return false;
  106. }
  107. //return QVariant("ERR: other");
  108. return false;
  109. }
  110. void DayModel::handleItemChange()
  111. {
  112. Timeslot* item = static_cast<Timeslot*>(sender());
  113. QModelIndex modelIndex = indexFromItem(item);
  114. if(modelIndex.isValid()) {
  115. // qDebug() << "Now emitting dataChanged(index, index)!";
  116. emit dataChanged(modelIndex, modelIndex);
  117. }
  118. }
  119. QModelIndex DayModel::indexFromItem(const Timeslot* item) const
  120. {
  121. Q_ASSERT(item);
  122. for(int row=0; row<m_items.size(); ++row) {
  123. if(m_items.at(row) == item) return index(row);
  124. }
  125. return QModelIndex();
  126. }
  127. bool DayModel::setHourSpan(int index, int hourSpan)
  128. {
  129. bool retVal = false;
  130. if (index >= 0 && index < m_items.count()) {
  131. retVal = m_items[index]->setHourSpan(hourSpan);
  132. }
  133. for (int i = hourSpan-1; i > 0; i-- ) {
  134. //m_items.removeAt(index+i);
  135. m_items[index+i]->setSpanStatus(true, index);
  136. }
  137. return retVal;
  138. }
  139. void DayModel::setItemData(int index, QString itemData)
  140. {
  141. if (index >= 0 && index < m_items.count()) {
  142. m_items[index]->setItemData(itemData);
  143. }
  144. }
  145. void DayModel::mergeDown(int index)
  146. {
  147. if (index == m_items.count()-1) {
  148. qDebug() << "Cannot span downwards!";
  149. }
  150. else if (index >= 0 && index < m_items.count()-1) {
  151. // Check that we're not spanning on already spanned hours!
  152. int oldHourSpan = m_items[index]->hourSpan();
  153. if (m_items[index+oldHourSpan]->hourSpan() > 1) {
  154. qDebug() << "Cannot span on already spanned hours! Please split first!";
  155. } else {
  156. m_items[index]->setHourSpan(oldHourSpan+1);
  157. // Set the next item beneath the spanned item as newly spanned!
  158. m_items[index+oldHourSpan]->setSpanStatus(true, index);
  159. }
  160. } else {
  161. qDebug() << "Something went severely wrong!";
  162. }
  163. }
  164. void DayModel::mergeUp(int index)
  165. {
  166. qDebug() << "DayModel::mergeUp! Index:" << index;
  167. if (index == 0) {
  168. qDebug() << "Cannot span upwards!";
  169. } else if (index > 0 && index < m_items.count()) {
  170. // Get the previous item, as the hourSpan must be set to it.
  171. int parentIndex = m_items[index-1]->parentIndex();
  172. qDebug() << "parentIndex:" << parentIndex;
  173. if (parentIndex != -1) {
  174. qDebug() << "Cannot span on already spanned hours! Please split first!";
  175. } else {
  176. // The item hasn't been spanned before, the given index is valid.
  177. int oldHourSpan = m_items[index]->hourSpan();
  178. m_items[index-1]->setHourSpan(oldHourSpan+1);
  179. // Reset the span hour count for the current item and set it to
  180. // be spanned.
  181. m_items[index]->setHourSpan(1);
  182. m_items[index]->setSpanStatus(true, index);
  183. }
  184. } else {
  185. qDebug() << "Something went severely wrong!";
  186. }
  187. }
  188. void DayModel::split(int index)
  189. {
  190. if (index >= 0 && index < m_items.count()) {
  191. int hourSpan = m_items[index]->hourSpan();
  192. m_items[index]->setHourSpan(1);
  193. for (int i = index; i < index+hourSpan; i++ ) {
  194. m_items[i]->setSpanStatus(false, -1);
  195. }
  196. }
  197. }