#include "mainwindow.h"
+#include <appsettings.h>
#include <QTreeView>
#include <QDirModel>
#include <sqlengine.h>
-#include <schedulexmlparser.h>
-#include <activity.h>
+#include <track.h>
#include <eventmodel.h>
#include <delegate.h>
#include <conference.h>
#include <QDialog>
+#include <QMessageBox>
#include "ui_about.h"
#include "eventdialog.h"
#include "daynavigatorwidget.h"
+#include "importscheduledialog.h"
#include "mapwindow.h"
-const int confId = 1;
-
-MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
+MainWindow::MainWindow(int aEventId, QWidget *aParent)
+ : QMainWindow(aParent)
{
setupUi(this);
- // connect Menu actions
- connect(actionImportSchedule, SIGNAL(triggered()), SLOT(importSchedule()));
- connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
- connect(actionAboutApplication, SIGNAL(triggered()), SLOT(aboutApp()));
-
// create "SQLITE" DB instance/connection
// opens DB connection (needed for EventModel)
mSqlEngine = new SqlEngine(this);
mSqlEngine->initialize();
- mXmlParser = new ScheduleXmlParser(this);
- connect(mXmlParser, SIGNAL(progressStatus(int)), this, SLOT(showParsingProgress(int)));
- statusBar()->showMessage(tr("Ready"));
+ // Sanity check for existence of any Conference in the DB
+ // it AppSettings::confId() is 0, but there are any Conference(s) in the DB
+ // set the confId in the AppSettings for the ID of the first conference in the DB
+ QList<Conference> confs = Conference::getAll();
+ if(!confs.count()) // no conference(s) in the DB
+ {
+ AppSettings::setConfId(0); // no conference in the DB
+ }
+ else
+ {
+ if(AppSettings::confId() == 0)
+ AppSettings::setConfId(confs[0].id());
+ }
- //update activity map
- Activity::updateActivityMap();
+ // connect Menu actions
+ connect(actionImportSchedule, SIGNAL(triggered()), SLOT(importSchedule()));
+ connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+ connect(actionAboutApplication, SIGNAL(triggered()), SLOT(aboutApp()));
connect(dayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateDayView(const QDate &)));
- connect(activityDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateActivitiesDayView(const QDate &)));
- connect(favouriteDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateFavouritesDayView(const QDate &)));
+ connect(trackDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateTracksView(const QDate &)));
+ connect(favouriteDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateFavouritesView(const QDate &)));
+ connect(searchDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateSearchView(const QDate &)));
// DAY EVENTS View
dayTreeView->setHeaderHidden(true);
favTreeView->setModel(new EventModel());
favTreeView->setItemDelegate(new Delegate(favTreeView));
- //ACTIVITIES View
- actTreeView->setHeaderHidden(true);
- actTreeView->setRootIsDecorated(false);
- actTreeView->setIndentation(0);
- actTreeView->setAnimated(true);
- actTreeView->setModel(new EventModel());
- actTreeView->setItemDelegate(new Delegate(actTreeView));
+ // TRACKS View
+ trackTreeView->setHeaderHidden(true);
+ trackTreeView->setRootIsDecorated(false);
+ trackTreeView->setIndentation(0);
+ trackTreeView->setAnimated(true);
+ trackTreeView->setModel(new EventModel());
+ trackTreeView->setItemDelegate(new Delegate(trackTreeView));
+
+ // SEARCH EVENTS View
+ searchTreeView->setHeaderHidden(true);
+ searchTreeView->setRootIsDecorated(false);
+ searchTreeView->setIndentation(0);
+ searchTreeView->setAnimated(true);
+ searchTreeView->setModel(new EventModel());
+ searchTreeView->setItemDelegate(new Delegate(searchTreeView));
+
+ // NOW View
+ nowTreeView->setHeaderHidden(true);
+ nowTreeView->setRootIsDecorated(false);
+ nowTreeView->setIndentation(0);
+ nowTreeView->setAnimated(true);
+ nowTreeView->setModel(new EventModel());
+ nowTreeView->setItemDelegate(new Delegate(nowTreeView));
+
+ // event details have changed
+ connect(dayTreeView, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+ connect(favTreeView, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+ connect(trackTreeView, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+ connect(searchTreeView, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+ connect(nowTreeView, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
// 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(trackTreeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
+ connect(searchTreeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &)));
+ connect(nowTreeView, 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 &)));
-
-
- // TESTING: load some 'fav' data
- if(Conference::getAll().count()) // no conference(s) in the DB
- {
- static_cast<EventModel*>(favTreeView->model())->loadFavEvents(Conference::getById(confId).start(),confId);
- favTreeView->reset();
- }
+ connect(trackTreeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
+ connect(searchTreeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
+ connect(nowTreeView, SIGNAL(requestForMap(const QModelIndex &)), SLOT(displayMap(const QModelIndex &)));
+ // request for warning to be displayed
+ connect(dayTreeView, SIGNAL(requestForWarning(const QModelIndex &)), SLOT(displayWarning(const QModelIndex &)));
+ connect(favTreeView, SIGNAL(requestForWarning(const QModelIndex &)), SLOT(displayWarning(const QModelIndex &)));
+ connect(trackTreeView, SIGNAL(requestForWarning(const QModelIndex &)), SLOT(displayWarning(const QModelIndex &)));
+ connect(searchTreeView, SIGNAL(requestForWarning(const QModelIndex &)), SLOT(displayWarning(const QModelIndex &)));
+ connect(nowTreeView, SIGNAL(requestForWarning(const QModelIndex &)), SLOT(displayWarning(const QModelIndex &)));
+ // event search button clicked
+ connect(searchButton, SIGNAL(clicked()), SLOT(searchClicked()));
+ // event conference map button clicked
+ connect(showMapButton, SIGNAL(clicked()), SLOT(conferenceMapClicked()));
+ //
+ connect(tabWidget, SIGNAL(currentChanged(int)), SLOT(tabHasChanged(int)));
if(!Conference::getAll().count()) // no conference(s) in the DB
{
dayNavigator->hide(); // hide DayNavigatorWidget
- activityDayNavigator->hide();
+ trackDayNavigator->hide();
}
else
{
- QDate aStartDate = Conference::getById(confId).start();
- QDate aEndDate = Conference::getById(confId).end();
+ QDate aStartDate = Conference::getById(AppSettings::confId()).start();
+ QDate aEndDate = Conference::getById(AppSettings::confId()).end();
dayNavigator->setDates(aStartDate, aEndDate);
- activityDayNavigator->setDates(aStartDate, aEndDate);
+ trackDayNavigator->setDates(aStartDate, aEndDate);
favouriteDayNavigator->setDates(aStartDate, aEndDate);
+ searchDayNavigator->setDates(aStartDate, aEndDate);
+ //
+ conferenceTitle->setText(Conference::getById(AppSettings::confId()).title());
+ conferenceSubtitle->setText(Conference::getById(AppSettings::confId()).subtitle());
+ conferenceWhere->setText(Conference::getById(AppSettings::confId()).city() + ", " + Conference::getById(AppSettings::confId()).venue());
+ conferenceWhen->setText(
+ Conference::getById(AppSettings::confId()).start().toString("dd-MM-yyyy")
+ + ", " +
+ Conference::getById(AppSettings::confId()).end().toString("dd-MM-yyyy"));
}
- connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateTab(int)));
+ searchTreeView->hide();
+ searchDayNavigator->hide();
+ // 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
+ }
}
MainWindow::~MainWindow()
delete mSqlEngine;
mSqlEngine = NULL;
}
- if(mXmlParser)
- {
- delete mXmlParser;
- mXmlParser = NULL;
- }
}
void MainWindow::importSchedule()
{
- QFile file(":/schedule.en.xml");
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+ ImportScheduleDialog dialog(mSqlEngine,this);
+ dialog.exec();
+
+ QList<Conference> confs = Conference::getAll();
+ if(!confs.count()) // no conference(s) in the DB
{
- qDebug() << "can't open " << file.fileName();
- return;
+ AppSettings::setConfId(0); // no conference in the DB
}
-
- QByteArray data = file.readAll();
- mXmlParser->parseData(data,mSqlEngine);
-
- if(Conference::getAll().count())
+ else
{
+ if(AppSettings::confId() == 0)
+ AppSettings::setConfId(confs[0].id());
+
// 'dayNavigator' emits signal 'dateChanged' after setting valid START:END dates
- QDate aStartDate = Conference::getById(confId).start();
- QDate aEndDate = Conference::getById(confId).end();
+ QDate aStartDate = Conference::getById(AppSettings::confId()).start();
+ QDate aEndDate = Conference::getById(AppSettings::confId()).end();
dayNavigator->setDates(aStartDate, aEndDate);
- activityDayNavigator->setDates(aStartDate, aEndDate);
+ trackDayNavigator->setDates(aStartDate, aEndDate);
}
- //update activity map
- Activity::updateActivityMap();
-}
-
-void MainWindow::showParsingProgress(int aStatus)
-{
- QString msg = QString("Parsing completed: %1\%").arg(aStatus);
- statusBar()->showMessage(msg,1000);
}
void MainWindow::aboutApp()
void MainWindow::updateDayView(const QDate &aDate)
{
- static_cast<EventModel*>(dayTreeView->model())->loadEvents(aDate,confId);
+ static_cast<EventModel*>(dayTreeView->model())->loadEvents(aDate,AppSettings::confId());
dayTreeView->reset();
dayNavigator->show();
}
-void MainWindow::updateTab(const int aIndex)
+void MainWindow::updateTracksView(const QDate &aDate)
{
- 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:
- {
+ static_cast<EventModel*>(trackTreeView->model())->loadEventsByTrack(aDate, AppSettings::confId());
+ trackTreeView->reset();
+ trackDayNavigator->show();
+}
- }
- };
+void MainWindow::updateFavouritesView(const QDate &aDate)
+{
+ static_cast<EventModel*>(favTreeView->model())->loadFavEvents(aDate,AppSettings::confId());
+ favTreeView->reset();
+ favouriteDayNavigator->show();
}
-void MainWindow::updateActivitiesDayView(const QDate &aDate)
+void MainWindow::updateSearchView(const QDate &aDate)
{
- static_cast<EventModel*>(actTreeView->model())->loadEventsByActivities(aDate, confId);
- actTreeView->reset();
- activityDayNavigator->show();
+ searchTreeView->reset();
+ int eventsCount = static_cast<EventModel*>(searchTreeView->model())->loadSearchResultEvents(aDate,AppSettings::confId());
+ if( eventsCount ){
+ searchDayNavigator->show();
+ searchTreeView->show();
+ }
+ else{
+ searchTreeView->hide();
+ searchDayNavigator->hide();
+ }
}
-void MainWindow::updateFavouritesDayView(const QDate &aDate)
+void MainWindow::updateNowView()
{
- static_cast<EventModel*>(favTreeView->model())->loadFavEvents(aDate,confId);
- favTreeView->reset();
- favouriteDayNavigator->show();
+ EventModel *model = static_cast<EventModel*>(nowTreeView->model());
+ model->loadNowEvents(AppSettings::confId());
+ nowTreeView->reset();
+ nowTreeView->setAllExpanded(true);
}
void MainWindow::itemClicked(const QModelIndex &aIndex)
if(!aIndex.parent().isValid()) // time-group
return;
- EventDialog dialog(aIndex,this);
+ EventDialog dialog(static_cast<Event*>(aIndex.internalPointer())->id(),this);
dialog.exec();
}
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" );
+
+ mSqlEngine->searchEvent( AppSettings::confId(), columns, searchEdit->text() );
+ updateSearchView( Conference::getById(AppSettings::confId()).start() );
+}
+
+void MainWindow::conferenceMapClicked()
+{
+
+ QString mapPath = QString(":/maps/campus.png");
+ if(!QFile::exists(mapPath))
+ mapPath = QString(":/maps/rooms/not-available.png");
+
+ QString roomName;
+
+ QPixmap map(mapPath);
+ MapWindow window(map,roomName,this);
+ window.exec();
+}
+
+void MainWindow::displayWarning(const QModelIndex &aIndex)
+{
+ Q_UNUSED(aIndex);
+
+ QMessageBox::warning(
+ this,
+ tr("Time Conflict Warning"),
+ tr("This event happens at the same time than another one of your favourites.") );
+}
+
+void MainWindow::eventHasChanged(int aEventId)
+{
+ static_cast<EventModel*>(dayTreeView->model())->updateModel(aEventId);
+ static_cast<EventModel*>(favTreeView->model())->updateModel(aEventId);
+ static_cast<EventModel*>(trackTreeView->model())->updateModel(aEventId);
+ static_cast<EventModel*>(searchTreeView->model())->updateModel(aEventId);
+ static_cast<EventModel*>(nowTreeView->model())->updateModel(aEventId);
+}
+
+void MainWindow::tabHasChanged(int aIndex)
+{
+ Q_UNUSED(aIndex);
+
+ // TODO: only if it changed to favourities tab
+ updateFavouritesView(favouriteDayNavigator->getCurrentDate());
+ // TODO: only if it changed to now tab
+ //updateNowView();
+}
+