1 #include "tabcontainer.h"
8 #include <appsettings.h>
10 #include <conference.h>
13 #include <eventmodel.h>
16 #include "eventdialog.h"
17 #include "mapwindow.h"
19 TabContainer::TabContainer(QWidget *aParent)
21 , mType(EContainerTypeNone)
25 searchAgainButton->hide();
28 treeView->setHeaderHidden(true);
29 treeView->setRootIsDecorated(false);
30 treeView->setIndentation(0);
31 treeView->setAnimated(true);
32 treeView->setModel(new EventModel());
33 treeView->setItemDelegate(new Delegate(treeView));
35 connect(dayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateTreeView(const QDate &)));
37 connect(treeView, SIGNAL(eventHasChanged(int)), SIGNAL(eventHasChanged(int)));
38 connect(treeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
39 connect(treeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
40 connect(treeView, SIGNAL(requestForWarning(const QModelIndex &)), SLOT(displayWarning(const QModelIndex &)));
42 connect(searchButton, SIGNAL(clicked()), SLOT(searchClicked()));
43 connect(searchAgainButton, SIGNAL(clicked()), SLOT(searchAgainClicked()));
45 if(!Conference::getAll().count()) // no conference(s) in the DB
47 dayNavigator->hide(); // hide DayNavigatorWidget
51 QDate aStartDate = Conference::getById(AppSettings::confId()).start();
52 QDate aEndDate = Conference::getById(AppSettings::confId()).end();
53 dayNavigator->setDates(aStartDate, aEndDate);
57 void TabContainer::setType(TabContainer::Type aType)
61 if(aType == EContainerTypeNow)
63 QTimer *timer = new QTimer( this );
64 connect( timer, SIGNAL(timeout()), SLOT(timerUpdateTreeView()) );
65 timer->start( 30000); // 30 seconds timer
67 if(aType == EContainerTypeSearch)
73 void TabContainer::updateTreeView(const QDate &aDate)
77 case EContainerTypeDay:
79 static_cast<EventModel*>(treeView->model())->loadEvents(aDate,AppSettings::confId());
82 case EContainerTypeFavs:
84 static_cast<EventModel*>(treeView->model())->loadFavEvents(aDate,AppSettings::confId());
87 case EContainerTypeTracks:
89 static_cast<EventModel*>(treeView->model())->loadEventsByTrack(aDate, AppSettings::confId());
92 case EContainerTypeRooms:
94 static_cast<EventModel*>(treeView->model())->loadEventsByRoom(aDate, AppSettings::confId());
97 case EContainerTypeNow:
99 static_cast<EventModel*>(treeView->model())->loadNowEvents(AppSettings::confId());
100 treeView->setAllExpanded(true);
103 case EContainerTypeSearch:
106 int eventsCount = static_cast<EventModel*>(treeView->model())->loadSearchResultEvents(aDate,AppSettings::confId());
108 dayNavigator->getCurrentDate() != Conference::getById(AppSettings::confId()).start() ){
109 searchAgainButton->show();
110 dayNavigator->show();
116 searchAgainButton->hide();
117 dayNavigator->hide();
122 case EContainerTypeNone:
125 qDebug() << "Container type not specified";
129 dayNavigator->show();
132 void TabContainer::itemClicked(const QModelIndex &aIndex)
134 // have to handle only events, not time-groups
135 if(!aIndex.parent().isValid()) // time-group
138 EventDialog dialog(static_cast<Event*>(aIndex.internalPointer())->id(),this);
142 void TabContainer::displayMap(const QModelIndex &aIndex)
144 Event *event = static_cast<Event*>(aIndex.internalPointer());
146 // room names are stored in lower-case format
147 // room names are stored without dots in the name, eg. "aw.1124.png" -> "aw1124.png"
148 QString mapPath = QString(":/maps/rooms/%1.png").arg(event->room().toLower().remove("."));
149 if(!QFile::exists(mapPath))
150 mapPath = QString(":/maps/rooms/not-available.png");
153 if(mapPath.contains("not-available", Qt::CaseInsensitive))
154 roomName = QString("Map is not available: %1").arg(event->room());
156 roomName = event->room();
158 QPixmap map(mapPath);
159 MapWindow window(map,roomName,this);
163 void TabContainer::displayWarning(const QModelIndex &aIndex)
167 QMessageBox::warning(
169 tr("Time Conflict Warning"),
170 tr("This event happens at the same time than another one of your favourites.") );
173 void TabContainer::updateTreeViewModel(int aEventId)
177 case EContainerTypeFavs:
179 // requires special handling
180 // we need to reload favourites, because some favourite could be deleted
181 //static_cast<EventModel*>(favTreeView->model())->updateModel(aEventId);
182 QDate aStartDate = Conference::getById(AppSettings::confId()).start();
183 QDate aEndDate = Conference::getById(AppSettings::confId()).end();
184 dayNavigator->setDates(aStartDate, aEndDate);
185 updateTreeView( Conference::getById(AppSettings::confId()).start() );
188 case EContainerTypeDay:
189 case EContainerTypeNone:
192 static_cast<EventModel*>(treeView->model())->updateModel(aEventId);
197 void TabContainer::setDates(const QDate &aStart, const QDate &aEnd)
199 dayNavigator->setDates(aStart, aEnd);
202 void TabContainer::timerUpdateTreeView()
204 if(mType == EContainerTypeNow)
206 updateTreeView(QDate());
210 void TabContainer::searchClicked()
212 if(mType == EContainerTypeSearch)
214 QHash<QString,QString> columns;
216 if( searchTitle->isChecked() )
217 columns.insertMulti("EVENT", "title");
218 if( searchAbstract->isChecked() )
219 columns.insertMulti("EVENT", "abstract");
220 if( searchTag->isChecked() )
221 columns.insertMulti("EVENT", "tag");
222 if( searchSpeaker->isChecked() )
223 columns["PERSON"] = "name";
224 if( searchRoom->isChecked() )
225 columns["ROOM"] = "name";
227 QString keyword = searchEdit->text().replace( QString("%"), QString("\\%") );
228 qDebug() << "\nKeyword to search: " << keyword;
229 SqlEngine::searchEvent( AppSettings::confId(), columns, keyword );
231 QDate startDate = Conference::getById(AppSettings::confId()).start();
232 QDate endDate = Conference::getById(AppSettings::confId()).end();
233 dayNavigator->setDates(startDate, endDate);
234 updateTreeView( Conference::getById(AppSettings::confId()).start() );
238 void TabContainer::searchAgainClicked()
240 if(mType == EContainerTypeSearch)
243 searchAgainButton->hide();
244 dayNavigator->hide();