]> ToastFreeware Gitweb - toast/confclerk.git/blobdiff - src/gui/mainwindow.cpp
conference tab header is hidden if there isn't active conference
[toast/confclerk.git] / src / gui / mainwindow.cpp
index 101a4ca35ebd77936f881380823ed10c29053e68..b5882d64abe389d468d998a6be4227f5034c8a24 100644 (file)
 #include "mainwindow.h"
 
 #include <QTreeView>
-#include <QDirModel>
+#include <QFile>
 
 #include <sqlengine.h>
-#include <schedulexmlparser.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 <eventdialog.h>
 #include "daynavigatorwidget.h"
+#include "importschedulewidget.h"
 #include "mapwindow.h"
 
-MainWindow::MainWindow(QWidget *parent)
-    : QMainWindow(parent)
+#include <tabcontainer.h>
+
+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"));
-
-    connect(dayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateDayView(const QDate &)));
-    connect(activityDayNavigator, SIGNAL(dateChanged(const QDate &)), SLOT(updateActivitiesDayView(const QDate &)));
-
-    // DAY EVENTS View
-    dayTreeView->setHeaderHidden(true);
-    dayTreeView->setRootIsDecorated(false);
-    dayTreeView->setIndentation(0);
-    dayTreeView->setAnimated(true);
-    dayTreeView->setModel(new EventModel());
-    dayTreeView->setItemDelegate(new Delegate(dayTreeView));
-
-    // FAVOURITIES View
-    favTreeView->setHeaderHidden(true);
-    favTreeView->setRootIsDecorated(false);
-    favTreeView->setIndentation(0);
-    favTreeView->setAnimated(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));
-
-    // event double clicked
-    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 &)));
-    // 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
-    {
-        int confId = 1;
-        static_cast<EventModel*>(favTreeView->model())->loadFavEvents(Conference::getById(confId).start(),confId);
-        favTreeView->reset();
-    }
+    int confId = Conference::activeConference();
 
-    if(!Conference::getAll().count()) // no conference(s) in the DB
-    {
-        dayNavigator->hide(); // hide DayNavigatorWidget
-        activityDayNavigator->hide();
-    }
-    else
-    {
-        int confId = 1;
-        QDate aStartDate = Conference::getById(confId).start();
-        QDate aEndDate = Conference::getById(confId).end();
-        dayNavigator->setDates(aStartDate, aEndDate);
-        activityDayNavigator->setDates(aStartDate, aEndDate);
-    }
+    connect(importScheduleWidget, SIGNAL(scheduleImported(int)), SLOT(scheduleImported(int)));
 
-    connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateTab(int)));
+    // event details have changed
+    connect(dayTabContainer, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+    connect(favsTabContainer, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+    connect(tracksTabContainer, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+    connect(roomsTabContainer, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+    connect(nowTabContainer, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
+    connect(searchTabContainer, SIGNAL(eventHasChanged(int)), SLOT(eventHasChanged(int)));
 
-}
+    // event conference map button clicked
+    connect(showMapButton, SIGNAL(clicked()), SLOT(conferenceMapClicked()));
 
-MainWindow::~MainWindow()
-{
-    if(mSqlEngine)
+    connect(tabWidget, SIGNAL(infoIconClicked()), SLOT(aboutApp()));
+
+    if(Conference::getAll().count())
     {
-        delete mSqlEngine;
-        mSqlEngine = NULL;
+        initTabs();
+        fillAndShowConferenceHeader();
+        setWindowTitle(Conference::getById(confId).title());
     }
-    if(mXmlParser)
+    else
     {
-        delete mXmlParser;
-        mXmlParser = NULL;
+        conferenceHeader->hide();
     }
-}
 
-void MainWindow::importSchedule()
-{
-    QFile file("../schedule.en.xml");
-    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+    // open dialog for given Event ID
+    // this is used in case Alarm Dialog request application to start
+    if(aEventId)
     {
-        qDebug() << "can't open " << file.fileName();
-        return;
+        try
+        {
+            EventDialog dialog(aEventId,this);
+            dialog.exec();
+        }
+        catch(OrmNoObjectException&) {} // just start application
+        catch(...) {} // just start application
     }
+}
 
-    QByteArray data = file.readAll();
-    mXmlParser->parseData(data,mSqlEngine);
+void MainWindow::scheduleImported(int aConfId)
+{
+    Q_UNUSED(aConfId);
 
-    if(Conference::getAll().count())
+    QList<Conference> confs = Conference::getAll();
+    if(confs.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);
+        initTabs();
+        fillAndShowConferenceHeader();
+        setWindowTitle(Conference::getById(Conference::activeConference()).title());
     }
 }
 
-void MainWindow::showParsingProgress(int aStatus)
-{
-    QString msg = QString("Parsing completed: %1\%").arg(aStatus);
-    statusBar()->showMessage(msg,1000);
-}
-
 void MainWindow::aboutApp()
 {
     QDialog dialog(this);
@@ -150,68 +89,54 @@ void MainWindow::aboutApp()
     dialog.exec();
 }
 
-void MainWindow::updateDayView(const QDate aDate)
+void MainWindow::conferenceMapClicked()
 {
-    int confId = 1;
-    static_cast<EventModel*>(dayTreeView->model())->loadEvents(Conference::getById(confId).start(),confId);
-    dayTreeView->reset();
-    dayNavigator->show();
-}
+    QString mapPath = QString(":/maps/campus.png");
+    if(!QFile::exists(mapPath))
+        mapPath = QString(":/maps/rooms/not-available.png");
 
-void MainWindow::updateTab(const int n)
-{
-    int confId = 1;
-    if(n) //index 1 of tabWidget: favouriteTab
-    {
-        static_cast<EventModel*>(favTreeView->model())->loadFavEvents(Conference::getById(confId).start(),confId);
-        favTreeView->reset();
-    }
-    else //index 0 of tabWidget: dayViewTab
-    {
-        static_cast<EventModel*>(dayTreeView->model())->loadEvents(Conference::getById(confId).start(),confId);
-        dayTreeView->reset();
-    }
-    //TODO: update of activitiesTab needed?
-    dayNavigator->show();
-}
+    QString roomName;
 
+    QPixmap map(mapPath);
+    MapWindow window(map,roomName,this);
+    window.exec();
+}
 
-void MainWindow::updateActivitiesDayView(const QDate &aDate)
+void MainWindow::eventHasChanged(int aEventId)
 {
-    int confId = 1;
-    static_cast<EventModel*>(actTreeView->model())->loadEventsByActivities(aDate,confId);
-    actTreeView->reset();
-    activityDayNavigator->show();
+    dayTabContainer->updateTreeViewModel(aEventId);
+    favsTabContainer->updateTreeViewModel(aEventId);
+    tracksTabContainer->updateTreeViewModel(aEventId);
+    nowTabContainer->updateTreeViewModel(aEventId);
+    roomsTabContainer->updateTreeViewModel(aEventId);
+    searchTabContainer->updateTreeViewModel(aEventId);
 }
 
-void MainWindow::itemDoubleClicked(const QModelIndex &aIndex)
+void MainWindow::fillAndShowConferenceHeader()
 {
-    // have to handle only events, not time-groups
-    if(!aIndex.parent().isValid()) // time-group
-        return;
-
-    EventDialog dialog(aIndex,this);
-    dialog.exec();
+    int confId = Conference::activeConference();
+    conferenceTitle->setText(Conference::getById(confId).title());
+    conferenceSubtitle->setText(Conference::getById(confId).subtitle());
+    conferenceWhere->setText(Conference::getById(confId).city() + ", " + Conference::getById(confId).venue());
+    conferenceWhen->setText(
+            Conference::getById(confId).start().toString("dd-MM-yyyy")
+            + ", " +
+            Conference::getById(confId).end().toString("dd-MM-yyyy"));
+    conferenceHeader->show();
 }
 
-void MainWindow::displayMap(const QModelIndex &aIndex)
+void MainWindow::initTabs()
 {
-    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();
+    int confId = Conference::activeConference();
+    QDate startDate = Conference::getById(confId).start();
+    QDate endDate = Conference::getById(confId).end();
+
+    // 'dayNavigator' emits signal 'dateChanged' after setting valid START:END dates
+    dayTabContainer->setDates(startDate, endDate);
+    tracksTabContainer->setDates(startDate, endDate);
+    roomsTabContainer->setDates(startDate, endDate);
+    favsTabContainer->setDates(startDate, endDate);
+    searchTabContainer->setDates(startDate, endDate);
+    nowTabContainer->updateTreeView(QDate::currentDate());
 }