source: src/gui/mainwindow.cpp @ 1160cde

qt5
Last change on this file since 1160cde was 1160cde, checked in by Philipp Spitzer <philipp@…>, 11 years ago

Tuned the about dialog.

  • Property mode set to 100644
File size: 10.0 KB
Line 
1/*
2 * Copyright (C) 2010 Ixonos Plc.
3 * Copyright (C) 2011 Philipp Spitzer, gregor herrmann
4 *
5 * This file is part of ConfClerk.
6 *
7 * ConfClerk is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * ConfClerk is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * ConfClerk.  If not, see <http://www.gnu.org/licenses/>.
19 */
20#include "mainwindow.h"
21
22#include <QTreeView>
23#include <QFile>
24#include <QNetworkProxy>
25#include <QNetworkAccessManager>
26#include <QNetworkReply>
27
28#include <sqlengine.h>
29
30#include <track.h>
31#include <eventmodel.h>
32#include <delegate.h>
33
34#include <conference.h>
35
36#include <QDialog>
37#include <QMessageBox>
38
39#include "ui_about.h"
40#include <eventdialog.h>
41#include "daynavigatorwidget.h"
42#include "settingsdialog.h"
43#include "conferenceeditor.h"
44#include "schedulexmlparser.h"
45#include "errormessage.h"
46
47#include <tabcontainer.h>
48#include <appsettings.h>
49
50const QString PROXY_USERNAME;
51const QString PROXY_PASSWD;
52
53MainWindow::MainWindow(int aEventId, QWidget *aParent)
54    : QMainWindow(aParent)
55    , conferenceModel(new ConferenceModel(this))
56    , mXmlParser(new ScheduleXmlParser(this))
57    , mNetworkAccessManager(new QNetworkAccessManager(this))
58{
59    setupUi(this);
60
61    saved_title = windowTitle();
62
63#ifdef N810
64    tabWidget->setTabText(1,"Favs");
65    //tabWidget->setTabText(2,"Day");
66#endif
67
68    // first time run aplication: -> let's have it direct connection in this case
69    if(!AppSettings::contains("proxyIsDirectConnection"))
70        AppSettings::setDirectConnection(true);
71
72    /*
73    if(AppSettings::isDirectConnection())
74    {
75        qDebug() << "Setting-up proxy: " << AppSettings::proxyAddress() << ":" << AppSettings::proxyPort();
76    }
77    */
78    QNetworkProxy proxy(
79            AppSettings::isDirectConnection() ? QNetworkProxy::NoProxy : QNetworkProxy::HttpProxy,
80            AppSettings::proxyAddress(),
81            AppSettings::proxyPort(),
82            PROXY_USERNAME,
83            PROXY_PASSWD);
84    QNetworkProxy::setApplicationProxy(proxy);
85
86    // event details have changed
87    connect(dayTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
88    connect(favsTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
89    connect(tracksTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
90    connect(roomsTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
91    connect(nowTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
92    connect(searchTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
93
94    connect(aboutAction, SIGNAL(triggered()), SLOT(aboutApp()));
95    connect(settingsAction, SIGNAL(triggered()), SLOT(setup()));
96    connect(conferencesAction, SIGNAL(triggered()), SLOT(showConferences()));
97
98    useConference(Conference::activeConference());
99    // optimization, see useConference() code
100    try {
101        initTabs();
102    } catch (const OrmException& e) {
103        qDebug() << "OrmException:" << e.text();
104        clearTabs();
105    }
106
107    // TODO: open conferences at startup?
108    #if 0
109    if(!confCount)
110        tabWidget->setCurrentIndex(6); // 6 - conference tab
111    }
112    #endif
113
114    // open dialog for given Event ID
115    // this is used in case Alarm Dialog request application to start
116    if(aEventId)
117    {
118        try
119        {
120            EventDialog dialog(aEventId,this);
121            dialog.exec();
122        }
123        catch(OrmNoObjectException&) {} // just start application
124        catch(...) {} // just start application
125    }
126
127    connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), SLOT(networkQueryFinished(QNetworkReply*)));
128
129    connect(mXmlParser, SIGNAL(parsingScheduleBegin()), conferenceModel, SLOT(newConferenceBegin()));
130    connect(mXmlParser, SIGNAL(parsingScheduleEnd(const QString&)), conferenceModel, SLOT(newConferenceEnd(const QString&)));
131}
132
133void MainWindow::aboutApp()
134{
135    QDialog dialog(this);
136    Ui::AboutDialog ui;
137    ui.setupUi(&dialog);
138    ui.labDescription->setText(ui.labDescription->text().arg(qApp->applicationVersion()));
139#ifdef N810
140    dialog.setFixedWidth(width());
141#endif
142    dialog.exec();
143}
144
145void MainWindow::eventHasChanged(int aEventId, bool aReloadModel)
146{
147    dayTabContainer->updateTreeViewModel(aEventId);
148    favsTabContainer->updateTreeViewModel(aEventId,aReloadModel);
149    tracksTabContainer->updateTreeViewModel(aEventId);
150    nowTabContainer->updateTreeViewModel(aEventId);
151    roomsTabContainer->updateTreeViewModel(aEventId);
152    searchTabContainer->updateTreeViewModel(aEventId);
153}
154
155void MainWindow::useConference(int id)
156{
157    try {
158        Conference::getById(Conference::activeConference()).update("active",0);
159        Conference new_active = Conference::getById(id);
160        new_active.update("active",1);
161
162        // looks like it does not work at n900
163        setWindowTitle(new_active.title());
164
165        // optimization.
166        // dont run initTabs() here
167        // it takes much CPU, making travelling between conferences in ConferenceEditor longer
168        // and is not seen in maemo WM anyway
169        // instead run it explicitly
170        // 1. at startup
171        // 2. when ConferenceEditor finished
172        // dont forget to protect the calls by try-catch!
173
174        // just in case, clear conference selection instead
175        clearTabs();
176
177        // end of optimization
178        // initTabs();
179    } catch (OrmException& e) {
180        // cannon set an active conference
181        unsetConference();
182        return;
183    }
184
185}
186
187void MainWindow::initTabs()
188{
189    int confId = Conference::activeConference();
190    Conference active = Conference::getById(confId);
191    QDate startDate = active.start();
192    QDate endDate = active.end();
193
194    // 'dayNavigator' emits signal 'dateChanged' after setting valid START:END dates
195    dayTabContainer->setDates(startDate, endDate);
196    tracksTabContainer->setDates(startDate, endDate);
197    roomsTabContainer->setDates(startDate, endDate);
198    favsTabContainer->setDates(startDate, endDate);
199    searchTabContainer->setDates(startDate, endDate);
200    searchTabContainer->searchAgainClicked();
201    nowTabContainer->updateTreeView(QDate::currentDate());
202}
203
204void MainWindow::clearTabs()
205{
206    dayTabContainer->clearModel();
207    tracksTabContainer->clearModel();
208    roomsTabContainer->clearModel();
209    favsTabContainer->clearModel();
210    searchTabContainer->clearModel();
211    searchTabContainer->searchAgainClicked();
212    nowTabContainer->clearModel();
213}
214
215void MainWindow::unsetConference()
216{
217    clearTabs();
218    setWindowTitle(saved_title);
219}
220
221void MainWindow::setup()
222{
223    SettingsDialog dialog;
224    dialog.exec();
225
226    QNetworkProxy proxy(
227            AppSettings::isDirectConnection() ? QNetworkProxy::NoProxy : QNetworkProxy::HttpProxy,
228            AppSettings::proxyAddress(),
229            AppSettings::proxyPort(),
230            PROXY_USERNAME,
231            PROXY_PASSWD);
232    QNetworkProxy::setApplicationProxy(proxy);
233}
234
235/** Create and run ConferenceEditor dialog, making required connections for it.
236
237This method manages, which classes actually perform changes in conference list.
238
239There are several classes that modify the conferences:
240this:
241 deletion and URL update.
242this, mXmlParser and mNetworkAccessManager:
243 addition and refresh.
244*/
245void MainWindow::showConferences()
246{
247    ConferenceEditor dialog(conferenceModel, this);
248
249    connect(&dialog, SIGNAL(haveConferenceUrl(const QString&)), SLOT(importFromNetwork(const QString&)));
250    connect(&dialog, SIGNAL(haveConferenceFile(const QString&)), SLOT(importFromFile(const QString&)));
251    connect(&dialog, SIGNAL(removeConferenceRequested(int)), SLOT(removeConference(int)));
252    connect(&dialog, SIGNAL(changeUrlRequested(int, const QString&)),
253                    SLOT(changeConferenceUrl(int, const QString&)));
254
255    connect(&dialog, SIGNAL(haveConferenceSelected(int)), SLOT(useConference(int)));
256    connect(&dialog, SIGNAL(noneConferenceSelected()), SLOT(unsetConference()));
257
258    connect(mXmlParser, SIGNAL(parsingScheduleBegin()), &dialog, SLOT(importStarted()));
259    connect(mXmlParser, SIGNAL(progressStatus(int)), &dialog, SLOT(showParsingProgress(int)));
260    connect(mXmlParser, SIGNAL(parsingScheduleEnd(const QString&)), &dialog, SLOT(importFinished(const QString&)));
261
262    connect(this, SIGNAL(conferenceRemoved()), &dialog, SLOT(conferenceRemoved()));
263
264    dialog.exec();
265
266    // optimization, see useConference() code
267    try {
268        initTabs();
269    } catch (OrmException) {
270        clearTabs();
271    }
272}
273
274void MainWindow::networkQueryFinished(QNetworkReply *aReply)
275{
276    if ( aReply->error() != QNetworkReply::NoError )
277    {
278        error_message(QString("Error occured during download: ") + aReply->errorString());
279    }
280    else
281    {
282        importData(aReply->readAll(), aReply->url().toEncoded());
283    }
284}
285
286void MainWindow::importData(const QByteArray &aData, const QString& url)
287{
288    mXmlParser->parseData(aData, url);
289}
290
291void MainWindow::importFromNetwork(const QString& url)
292{
293    QNetworkRequest request;
294    request.setUrl(QUrl(url));
295
296    mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy());
297    mNetworkAccessManager->get(request);
298}
299
300void MainWindow::importFromFile(const QString& filename)
301{
302    QFile file(filename);
303    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {   
304        static const QString format("Cannot read \"%1\": error %2");
305        error_message(format.arg(filename, QString::number(file.error())));
306    }
307
308    importData(file.readAll(), "");
309}
310
311void MainWindow::removeConference(int id)
312{
313    Conference::deleteConference(id);
314    conferenceModel->conferenceRemoved();
315
316    emit conferenceRemoved();
317}
318
319void MainWindow::changeConferenceUrl(int id, const QString& url)
320{
321    Conference::getById(id).setUrl(url);
322}
323
Note: See TracBrowser for help on using the repository browser.