source: src/gui/conferenceeditor.cpp @ 3cdaf7d

qt5
Last change on this file since 3cdaf7d was 3cdaf7d, checked in by kirilma <kirilma@…>, 12 years ago

UI tune: use buttonBox instead of single buttons to comply with platform conventions

maemo5 does not print "Cancel" buttons, and names "OK" differently
just use buttonBox, and it will behave properly at each platform

  • Property mode set to 100644
File size: 6.8 KB
Line 
1/*
2 * Copyright (C) 2010 Ixonos Plc.
3 *
4 * This file is part of fosdem-schedule.
5 *
6 * fosdem-schedule is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation, either version 2 of the License, or (at your option)
9 * any later version.
10 *
11 * fosdem-schedule is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * fosdem-schedule.  If not, see <http://www.gnu.org/licenses/>.
18 */
19#include "conferenceeditor.h"
20
21#include "conferencemodel.h"
22#include "urlinputdialog.h"
23#include "mapwindow.h"
24
25#include <QInputDialog>
26#include <QItemSelectionModel>
27#include <QFileDialog>
28#include <QMessageBox>
29
30ConferenceEditor::ConferenceEditor(ConferenceModel* model, QWidget* parent)
31: QDialog(parent)
32, model(model)
33, selected_id(-1)
34{
35    setupUi(this);
36    progressBar->hide();
37
38    confView->setModel(model);
39
40    QItemSelectionModel* confViewSelection = new QItemSelectionModel(model, this);
41    confView->setSelectionModel(confViewSelection);
42
43    connect(confViewSelection, SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
44                                SLOT(itemSelected(const QModelIndex&, const QModelIndex&)));
45    connect(this, SIGNAL(wantCurrent(const QModelIndex&, QItemSelectionModel::SelectionFlags)),
46            confViewSelection, SLOT(setCurrentIndex(const QModelIndex&, QItemSelectionModel::SelectionFlags)));
47    connect(addBtn, SIGNAL(clicked()), SLOT(addClicked()));
48    connect(removeBtn, SIGNAL(clicked()), SLOT(removeClicked()));
49    connect(changeUrl, SIGNAL(clicked()), SLOT(changeUrlClicked()));
50    connect(refreshBtn, SIGNAL(clicked()), SLOT(refreshClicked()));
51    connect(showMapButton, SIGNAL(clicked()), SLOT(conferenceMapClicked()));
52    connect(buttonBox, SIGNAL(rejected()), SLOT(close()));
53
54    // it's OK to emit selection signals here
55    // because they are not yet connected to anybody
56    int active_id = Conference::activeConference();
57    if (active_id > 0) {
58        emit wantCurrent(model->indexFromId(active_id), QItemSelectionModel::SelectCurrent);
59    } else {
60        itemSelected(QModelIndex(), QModelIndex());
61    }
62}
63
64void ConferenceEditor::conferenceRemoved()
65{
66    if (model->rowCount() > 0) {
67        emit wantCurrent(model->index(0, 0), QItemSelectionModel::SelectCurrent);
68    } else {
69        itemSelected(QModelIndex(), QModelIndex());
70    }
71}
72
73void ConferenceEditor::itemSelected(const QModelIndex& current, const QModelIndex& previous)
74{
75    // TODO: fill all required fields
76    Q_UNUSED(previous);
77    if (!current.isValid()) {
78        selected_id = -1;
79
80        emit noneConferenceSelected();
81
82        conferenceInfo->setCurrentIndex(1);
83        removeBtn->hide();
84    } else {
85        const Conference& conf = model->conferenceFromIndex(current);
86        selected_id = conf.id();
87
88        emit haveConferenceSelected(selected_id);
89
90        conferenceTitle->setText(conf.title());
91        conferenceSubtitle->setText(conf.subtitle());
92        conferenceWhere->setText(conf.city() + ", " + conf.venue());
93        conferenceWhen->setText(
94                conf.start().toString("dd-MM-yyyy")
95                + ", " +
96                conf.end().toString("dd-MM-yyyy"));
97        conferenceInfo->setCurrentIndex(0);
98        removeBtn->show();
99    }
100}
101
102void ConferenceEditor::addClicked()
103{
104    UrlInputDialog url_input(this);
105    switch (url_input.exec()) {
106    case UrlInputDialog::HaveUrl: emit haveConferenceUrl(url_input.url()); break;
107    case UrlInputDialog::HaveFile: emit haveConferenceFile(url_input.url()); break;
108    case UrlInputDialog::Cancel: return;
109    }
110}
111
112void ConferenceEditor::removeClicked()
113{
114    if (selected_id < 0) {
115        // TODO: disable it when none is selected
116        return;
117    }
118
119    QMessageBox::StandardButton answer =
120        QMessageBox::question(0
121            , "Deletion confirmation"
122            , QString("Really delete the %1 conference").arg(Conference::getById(selected_id).title())
123            , QMessageBox::Yes | QMessageBox::No
124            , QMessageBox::No);
125
126    if (answer == QMessageBox::Yes) {
127        emit removeConferenceRequested(selected_id);
128    }
129}
130
131void ConferenceEditor::changeUrlClicked()
132{
133    if (selected_id < 0) {
134        return;
135    }
136    const Conference& selected = Conference::getById(selected_id);
137
138    bool ok;
139    QString url = QInputDialog::getText(this, "URL Input", "Enter schedule URL", QLineEdit::Normal, selected.url(), &ok);
140
141    if (ok) {
142        emit changeUrlRequested(selected_id, url);
143    }
144}
145
146void ConferenceEditor::refreshClicked()
147{
148    if (selected_id < 0) {
149        return;
150    }
151    const Conference& selected = Conference::getById(selected_id);
152
153    QString url = selected.url();
154
155    if (!url.isEmpty()) {
156        emit haveConferenceUrl(url);
157    } else {
158        static const QString format("Schedule URL for %1 is not set. Enter the schedule URL:");
159        bool ok;
160        QString url = QInputDialog::getText(this, "URL Input", format.arg(selected.title()), QLineEdit::Normal, QString(), &ok);
161
162        if (ok) {
163            // first save it, to remain if fetch fails
164            emit changeUrlRequested(selected_id, url);
165            // then fetch
166            emit haveConferenceUrl(url);
167        }
168    }
169}
170
171void ConferenceEditor::importStarted()
172{
173    addBtn->hide();
174    removeBtn->hide();
175    buttons->layout()->removeItem(buttonsSpacer);
176    progressBar->setValue(0);
177    progressBar->show();
178
179    QApplication::processEvents();
180}
181
182void ConferenceEditor::showParsingProgress(int progress)
183{
184    progressBar->setValue(progress);
185
186    QApplication::processEvents();
187}
188
189void ConferenceEditor::importFinished(const QString& title)
190{
191    qDebug() << __PRETTY_FUNCTION__ << title;
192    addBtn->show();
193    // removeItem should be shown later, but it takes some time,
194    // and not looks good
195    // anyway it will be shown a bit later
196    removeBtn->show();
197    buttons->layout()->addItem(buttonsSpacer);
198    progressBar->hide();
199
200    QApplication::processEvents();
201
202    int num = model->rowCount();
203    for (int i = 0; i < num; i++) {
204        QModelIndex item = model->index(i, 0);
205        if (model->data(item) == title) {
206            emit wantCurrent(item, QItemSelectionModel::SelectCurrent);
207            return;
208        }
209    }
210    itemSelected(QModelIndex(), QModelIndex());
211}
212
213void ConferenceEditor::conferenceMapClicked()
214{
215    QString mapPath = QString(":/maps/campus.png");
216    if(!QFile::exists(mapPath))
217        mapPath = QString(":/maps/rooms/not-available.png");
218
219    QString roomName;
220
221    QPixmap map(mapPath);
222    MapWindow window(map,roomName,this);
223    window.exec();
224}
Note: See TracBrowser for help on using the repository browser.