#include <sqlengine.h>
#include <schedulexmlparser.h>
+#include <activity.h>
#include <eventmodel.h>
#include <delegate.h>
#include "ui_about.h"
#include "eventdialog.h"
#include "daynavigatorwidget.h"
+#include "mapwindow.h"
-MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
+const int confId = 1;
+
+MainWindow::MainWindow(int aEventId, QWidget *aParent)
+ : QMainWindow(aParent)
{
setupUi(this);
connect(mXmlParser, SIGNAL(progressStatus(int)), this, SLOT(showParsingProgress(int)));
statusBar()->showMessage(tr("Ready"));
+ //update activity map
+ Activity::updateActivityMap();
+
connect(dayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateDayView(const QDate &)));
connect(activityDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateActivitiesDayView(const QDate &)));
- //connect(tabWidget, SIGNAL(currentChanged(int)), SLOT(updateView(int)));
+ connect(favouriteDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateFavouritesDayView(const QDate &)));
// DAY EVENTS View
dayTreeView->setHeaderHidden(true);
actTreeView->setModel(new EventModel());
actTreeView->setItemDelegate(new Delegate(actTreeView));
- connect(dayTreeView, SIGNAL(doubleClicked(const QModelIndex &)), SLOT(itemDoubleClicked(const QModelIndex &)));
- connect(favTreeView, SIGNAL(doubleClicked(const QModelIndex &)), SLOT(itemDoubleClicked(const QModelIndex &)));
- connect(actTreeView, SIGNAL(doubleClicked(const QModelIndex &)), SLOT(itemDoubleClicked(const QModelIndex &)));
+ // DAY EVENTS View
+ searchTreeView->setHeaderHidden(true);
+ searchTreeView->setRootIsDecorated(false);
+ searchTreeView->setIndentation(0);
+ searchTreeView->setAnimated(true);
+ searchTreeView->setModel(new EventModel());
+ searchTreeView->setItemDelegate(new Delegate(searchTreeView));
+ searchTreeView->setVisible(false);
+ searchDayNavigator->setVisible(false);
+ // event clicked
+ connect(dayTreeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
+ connect(favTreeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
+ connect(actTreeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
+ connect(searchTreeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
+ // request for map to be displayed
+ connect(dayTreeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
+ connect(favTreeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
+ connect(actTreeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
+ connect(searchTreeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
+ // event search button clicked
+ connect(searchButton, SIGNAL(clicked()), SLOT(searchClicked()));
// TESTING: load some 'fav' data
if(Conference::getAll().count()) // no conference(s) in the DB
{
- int confId = 1;
static_cast<EventModel*>(favTreeView->model())->loadFavEvents(Conference::getById(confId).start(),confId);
favTreeView->reset();
}
}
else
{
- int confId = 1;
QDate aStartDate = Conference::getById(confId).start();
QDate aEndDate = Conference::getById(confId).end();
dayNavigator->setDates(aStartDate, aEndDate);
activityDayNavigator->setDates(aStartDate, aEndDate);
+ favouriteDayNavigator->setDates(aStartDate, aEndDate);
+ }
+
+ connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateTab(int)));
+
+ // open dialog for given Event ID
+ // this is used in case Alarm Dialog request application to start
+ if(aEventId)
+ {
+ try
+ {
+ EventDialog dialog(aEventId,this);
+ dialog.exec();
+ }
+ catch(OrmNoObjectException*) {} // just start application
+ catch(...) {} // just start application
}
- connect(static_cast<EventModel*>(dayTreeView->model()), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), SLOT(updateFavView()));
- connect(static_cast<EventModel*>(favTreeView->model()), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), SLOT(updateFavView()));
-/* connect(static_cast<EventModel*>(favTreeView->model()), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), SLOT(updateFavViewComplete()));*/
}
MainWindow::~MainWindow()
void MainWindow::importSchedule()
{
- QFile file("../schedule.en.xml");
+ QFile file(":/schedule.en.xml");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
- QString currPath = QDir::currentPath();
- qDebug() << "current path: " << currPath;
qDebug() << "can't open " << file.fileName();
return;
}
if(Conference::getAll().count())
{
- int confId = 1;
// 'dayNavigator' emits signal 'dateChanged' after setting valid START:END dates
QDate aStartDate = Conference::getById(confId).start();
QDate aEndDate = Conference::getById(confId).end();
dayNavigator->setDates(aStartDate, aEndDate);
activityDayNavigator->setDates(aStartDate, aEndDate);
}
+ //update activity map
+ Activity::updateActivityMap();
}
void MainWindow::showParsingProgress(int aStatus)
void MainWindow::updateDayView(const QDate &aDate)
{
- int confId = 1;
static_cast<EventModel*>(dayTreeView->model())->loadEvents(aDate,confId);
dayTreeView->reset();
dayNavigator->show();
}
-void MainWindow::updateFavView()
+void MainWindow::updateTab(const int aIndex)
{
- int confId = 1;
- static_cast<EventModel*>(favTreeView->model())->loadFavEvents(Conference::getById(confId).start(),confId);
- favTreeView->reset(); //Necessary reset:
- // if favourite event unselected as favourite is the only one in its time, and reset is not produced, crashed
+ switch(aIndex)
+ {
+ case 0://index 0 of tabWidget: dayViewTab
+ {
+ static_cast<EventModel*>(dayTreeView->model())->loadEvents(Conference::getById(confId).start(),confId);
+ dayTreeView->reset();
+ dayNavigator->show();
+ }
+ break;
+ case 1: //index 1 of tabWidget: favouritesTab
+ {
+ static_cast<EventModel*>(favTreeView->model())->loadFavEvents(Conference::getById(confId).start(),confId);
+ favTreeView->reset();
+ favouriteDayNavigator->show();
+ }
+ break;
+ case 2: //index 2 of tabWidget: activitiesTab
+ {
+ static_cast<EventModel*>(actTreeView->model())->loadEventsByActivities(Conference::getById(confId).start(), confId);
+ actTreeView->reset();
+ activityDayNavigator->show();
+ }
+ break;
+ default:
+ {
- dayNavigator->show();
+ }
+ };
}
-/*
-void MainWindow::updateFavViewComplete()
-{
- int confId = 1;
- updateFavView();
- updateDayView(Conference::getById(confId).start());
-}
-*/
-
void MainWindow::updateActivitiesDayView(const QDate &aDate)
{
- int confId = 1;
- static_cast<EventModel*>(actTreeView->model())->loadEventsByActivities(aDate,confId);
+ static_cast<EventModel*>(actTreeView->model())->loadEventsByActivities(aDate, confId);
actTreeView->reset();
activityDayNavigator->show();
}
-void MainWindow::itemDoubleClicked(const QModelIndex &aIndex)
+void MainWindow::updateFavouritesDayView(const QDate &aDate)
+{
+ static_cast<EventModel*>(favTreeView->model())->loadFavEvents(aDate,confId);
+ favTreeView->reset();
+ favouriteDayNavigator->show();
+}
+
+void MainWindow::itemClicked(const QModelIndex &aIndex)
{
// have to handle only events, not time-groups
if(!aIndex.parent().isValid()) // time-group
return;
- EventDialog dialog(aIndex,this);
+ EventDialog dialog(static_cast<Event*>(aIndex.internalPointer())->id(),this);
dialog.exec();
}
+void MainWindow::displayMap(const QModelIndex &aIndex)
+{
+ Event *event = static_cast<Event*>(aIndex.internalPointer());
+
+ // room names are stored in lower-case format
+ // room names are stored without dots in the name, eg. "aw.1124.png" -> "aw1124.png"
+ QString mapPath = QString(":/maps/rooms/%1.png").arg(event->room().toLower().remove("."));
+ if(!QFile::exists(mapPath))
+ mapPath = QString(":/maps/rooms/not-available.png");
+
+ QString roomName;
+ if(mapPath.contains("not-available", Qt::CaseInsensitive))
+ roomName = QString("Map is not available: %1").arg(event->room());
+ else
+ roomName = event->room();
+
+ QPixmap map(mapPath);
+ MapWindow window(map,roomName,this);
+ window.exec();
+}
+
+void MainWindow::searchClicked()
+{
+ QList<QString> columns;
+
+ if( searchTitle->isChecked() )
+ columns.append( "title" );
+ if( searchAbstract->isChecked() )
+ columns.append( "abstract" );
+
+ if( mSqlEngine->searchEvent( confId, columns, searchEdit->text() ) > 0 ){
+ searchTreeView->setVisible(true);
+ searchDayNavigator->setVisible(true);
+ }
+}
+