refactor: cache whole Room object in Event
[toast/confclerk.git] / src / gui / tabcontainer.cpp
1 /*
2  * Copyright (C) 2010 Ixonos Plc.
3  *
4  * This file is part of fosdem-schedule.
5  *
6  * fosdem-schedule is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the Free
8  * Software Foundation, either version 2 of the License, or (at your option)
9  * any later version.
10  *
11  * fosdem-schedule is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * fosdem-schedule.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 #include "tabcontainer.h"
20
21 #include <QFile>
22 #include <QMessageBox>
23 #include <QTimer>
24
25 #include <treeview.h>
26 #include <delegate.h>
27
28 #include "eventdialog.h"
29 #include "mapwindow.h"
30 #include "room.h"
31 #include "errormessage.h"
32
33 #include "conflictsdialog.h"
34
35 TabContainer::TabContainer(QWidget *aParent)
36     : QWidget(aParent)
37 {
38     setupUi(this);
39
40     treeView->setHeaderHidden(true);
41     treeView->setRootIsDecorated(false);
42     treeView->setIndentation(0);
43     treeView->setAnimated(true);
44     treeView->setModel(new EventModel());
45     treeView->setItemDelegate(new Delegate(treeView));
46
47     connect(dayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateTreeView(const QDate &)));
48
49     connect(treeView, SIGNAL(eventHasChanged(int,bool)), SIGNAL(eventHasChanged(int,bool)));
50     connect(treeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
51     connect(treeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
52     connect(treeView, SIGNAL(requestForConflicts(const QModelIndex &)), SLOT(displayConflicts(const QModelIndex &)));
53
54     // day navigator is hidden by default
55     dayNavigator->hide();
56 }
57
58 void TabContainer::updateTreeView(const QDate &aDate)
59 {
60     int active_id = Conference::activeConference();
61     dayNavigator->show();
62     if (active_id > 0) {
63         loadEvents(aDate, active_id);
64     } else {
65         static_cast<EventModel*>(treeView->model())->clearModel();
66     }
67 }
68
69 void TabContainer::itemClicked(const QModelIndex &aIndex)
70 {
71     // have to handle only events, not time-groups
72     if(!aIndex.parent().isValid()) // time-group
73         return;
74
75     EventDialog dialog(static_cast<Event*>(aIndex.internalPointer())->id(),this);
76 #ifdef N810
77     dialog.setFixedWidth(static_cast<QWidget*>(parent())->width());
78 #endif
79     connect(&dialog, SIGNAL(eventHasChanged(int,bool)), this, SIGNAL(eventHasChanged(int,bool)));
80     dialog.exec();
81     disconnect(&dialog, SIGNAL(eventHasChanged(int,bool)), this, SIGNAL(eventHasChanged(int,bool)));
82 }
83
84 void TabContainer::displayMap(const QModelIndex &aIndex)
85 {
86     Event *event = static_cast<Event*>(aIndex.internalPointer());
87
88     QVariant mapPathV = event->room()->map();
89     QString mapPath;
90     if (!mapPathV.isValid()) {
91         error_message("No map for this room");
92         return;
93     } else {
94         mapPath = mapPathV.toString();
95         if (!QFile::exists(mapPath)) {
96             error_message("Map for this room not found: " + mapPath);
97             return;
98         }
99     }
100
101     QPixmap map(mapPath);
102     MapWindow window(map, event->room()->name(),this);
103     window.exec();
104 }
105
106 void TabContainer::displayConflicts(const QModelIndex &aIndex)
107 {
108     ConflictsDialog dialog(static_cast<Event*>(aIndex.internalPointer())->id(),this);
109 #ifdef N810
110     dialog.setFixedWidth(static_cast<QWidget*>(parent())->width());
111 #endif
112     connect(&dialog, SIGNAL(eventHasChanged(int,bool)), this, SIGNAL(eventHasChanged(int,bool)));
113     dialog.exec();
114     disconnect(&dialog, SIGNAL(eventHasChanged(int,bool)), this, SIGNAL(eventHasChanged(int,bool)));
115 }
116
117 void TabContainer::updateTreeViewModel(int aEventId, bool aReloadModel)
118 {
119     if(aReloadModel)
120     {
121         // requires special handling
122         // eg. in case of favourities - some favourities may have changed
123         // and so we need to reload them
124         int confId = Conference::activeConference();
125         QDate startDate = Conference::getById(confId).start();
126         QDate endDate = Conference::getById(confId).end();
127         dayNavigator->setDates(startDate, endDate);
128         updateTreeView( Conference::getById(confId).start() );
129     }
130     else
131     {
132         // just update event in the question
133         static_cast<EventModel*>(treeView->model())->updateModel(aEventId);
134     }
135 }
136
137 void TabContainer::setDates(const QDate &aStart, const QDate &aEnd)
138 {
139     dayNavigator->setDates(aStart, aEnd);
140 }
141
142 void TabContainer::clearModel()
143 {
144     static_cast<EventModel*>(treeView->model())->clearModel();
145 }
146