Fav table update
[toast/confclerk.git] / src / mvc / eventmodel.cpp
1 #include "eventmodel.h"
2 #include <conference.h>
3
4 EventModel::EventModel()
5 {
6     mEvents.clear();
7 }
8
9 void EventModel::createTimeGroups()
10 {
11     mGroups.clear();
12     mParents.clear();
13
14     if (mEvents.empty())
15     {
16         return;
17     }
18
19     const int timeSpan = 5400;
20
21     QTime startTime = mEvents.first().start().time();
22     mGroups << EventModel::Group(QString("%1 - %2").arg(startTime.toString("HH:mm"),
23         startTime.addSecs(timeSpan).toString("HH:mm")), 0);
24     QTime nextGroupTime = mEvents.first().start().time().addSecs(timeSpan);
25
26     for (int i=0; i<mEvents.count(); i++)
27     {
28         QTime eventTime = mEvents.at(i).start().time();
29
30         if (nextGroupTime < eventTime)
31         {
32             mGroups.last().mChildCount = i - mGroups.last().mFirstEventIndex;
33             mGroups << EventModel::Group(QString("%1 - %2").arg(nextGroupTime.toString("HH:mm"),
34                 nextGroupTime.addSecs(timeSpan).toString("HH:mm")), i);
35             nextGroupTime = nextGroupTime.addSecs(timeSpan);
36         }
37
38         // add parent-child relation
39         mParents[mEvents.at(i).id()] = mGroups.count() - 1;
40     }
41
42     mGroups.last().mChildCount = mEvents.count() - mGroups.last().mFirstEventIndex;
43 }
44
45 QVariant EventModel::data(const QModelIndex& index, int role) const
46 {
47     if (index.isValid() && role == Qt::DisplayRole)
48     {
49         if (index.internalId() == 0)
50         {
51             return mGroups.at(index.row()).mTitle;
52         }
53         else //event data
54         {
55             return static_cast<Event*>(index.internalPointer())->id();
56         }
57     }
58
59     return QVariant();
60 }
61
62 QModelIndex EventModel::index(int row, int column, const QModelIndex& parent) const
63 {
64     // TODO: add checks for out of range rows
65
66     if (!parent.isValid())
67     {
68         return createIndex(row, column, 0);
69     }
70     else if (parent.internalId() == 0)
71     {
72         const Group& group = mGroups.at(parent.row());
73         Event* event = const_cast<Event*>(&mEvents.at(row + group.mFirstEventIndex));
74         return createIndex(row, column, reinterpret_cast<void*>(event));
75     }
76     else
77     {
78         return QModelIndex();
79     }
80 }
81
82 QModelIndex EventModel::parent(const QModelIndex & index) const
83 {
84     if (index.isValid())
85     {
86         if (index.internalId() == 0)
87         {
88             return QModelIndex();
89         }
90
91         Event * event = static_cast<Event*>(index.internalPointer());
92
93         return createIndex(mParents[event->id()], 0, 0);
94     }
95
96     return QModelIndex();
97 }
98
99 int EventModel::columnCount(const QModelIndex & parent) const
100 {
101     Q_UNUSED(parent);
102     return 1;
103 }
104
105 int EventModel::rowCount (const QModelIndex & parent) const
106 {
107     if (!parent.isValid())
108     {
109         return mGroups.count();
110     }
111
112     if (parent.internalId() == 0)
113     {
114         return mGroups.at(parent.row()).mChildCount;
115     }
116
117     return 0;
118 }
119
120 void EventModel::loadEvents(const QDate &aDate, int aConferenceId)
121 {
122     for(int i=0; i<mGroups.count(); i++)
123     {
124         QModelIndex idx = index(i,0);
125         Group group = mGroups[i];
126         beginRemoveRows(idx,0,group.mChildCount-1);
127         bool ok = removeRows(0,group.mChildCount,idx);
128         endRemoveRows();
129         //qDebug() << "removing " << group.mChildCount << " events from group:" << i << idx.data() << ":" << ok;
130     }
131
132     mEvents.clear();
133
134     // check for existence of the conference in the DB
135     if(Conference::getAll().count())
136     {
137         qDebug() << "Loading Conference Data: [" << Conference::getById(aConferenceId).title() << "] " << aDate;
138         mEvents = Event::getByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId);
139     }
140     createTimeGroups();
141 }
142
143 void EventModel::loadFavEvents(const QDate &aDate, int aConferenceId)
144 {
145     for(int i=0; i<mGroups.count(); i++)
146     {
147         QModelIndex idx = index(i,0);
148         Group group = mGroups[i];
149         beginRemoveRows(idx,0,group.mChildCount-1);
150         bool ok = removeRows(0,group.mChildCount,idx);
151         endRemoveRows();
152         //qDebug() << "removing " << group.mChildCount << " events from group:" << i << idx.data() << ":" << ok;
153     }
154
155     mEvents.clear();
156
157     // check for existence of the conference in the DB
158     if(Conference::getAll().count())
159     {
160         qDebug() << "Loading FAV Conference Data: [" << Conference::getById(aConferenceId).title() << "] " << aDate;
161         mEvents = Event::getFavByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId);
162     }
163     createTimeGroups();
164 }
165
166 void EventModel::emitDataChangedSignal(const QModelIndex &aTopLeft, const QModelIndex &aBottomRight)
167 {
168     emit(dataChanged(aTopLeft,aBottomRight));
169 }
170