]> ToastFreeware Gitweb - toast/confclerk.git/blobdiff - src/gui/mainwindow.cpp
Conference map
[toast/confclerk.git] / src / gui / mainwindow.cpp
index 241cf9f3e99b411b94a686bde00f97b885e57f7b..ec6fc0e88262013017e00ae5da5066049ffc1f10 100644 (file)
@@ -1,50 +1,58 @@
 #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);
@@ -62,47 +70,100 @@ MainWindow::MainWindow(QWidget *parent)
     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()
@@ -112,41 +173,29 @@ 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()
@@ -159,55 +208,45 @@ 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)
@@ -216,7 +255,7 @@ 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();
 }
 
@@ -240,3 +279,60 @@ void MainWindow::displayMap(const QModelIndex &aIndex)
     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();
+}
+