Removed the ability to show "pictures" (maps) of rooms and maps of conferences.
[toast/confclerk.git] / src / gui / conferenceeditor.cpp
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 "conferenceeditor.h"
21
22 #include "conferencemodel.h"
23 #include "urlinputdialog.h"
24 #include "errormessage.h"
25
26 #include <QInputDialog>
27 #include <QItemSelectionModel>
28 #include <QFileDialog>
29 #include <QMessageBox>
30
31 ConferenceEditor::ConferenceEditor(ConferenceModel* model, QWidget* parent)
32 : QDialog(parent)
33 , model(model)
34 , selected_id(-1)
35 {
36     setupUi(this);
37     progressBar->hide();
38
39     confView->setModel(model);
40
41     QItemSelectionModel* confViewSelection = new QItemSelectionModel(model, this);
42     confView->setSelectionModel(confViewSelection);
43
44     connect(confViewSelection, SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
45                                 SLOT(itemSelected(const QModelIndex&, const QModelIndex&)));
46     connect(this, SIGNAL(wantCurrent(const QModelIndex&, QItemSelectionModel::SelectionFlags)),
47             confViewSelection, SLOT(setCurrentIndex(const QModelIndex&, QItemSelectionModel::SelectionFlags)));
48     connect(addBtn, SIGNAL(clicked()), SLOT(addClicked()));
49     connect(removeBtn, SIGNAL(clicked()), SLOT(removeClicked()));
50     connect(changeUrl, SIGNAL(clicked()), SLOT(changeUrlClicked()));
51     connect(refreshBtn, SIGNAL(clicked()), SLOT(refreshClicked()));
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
64 void 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
73 void 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
102 void 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
112 void 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
131 void 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
146 void 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
171 void 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
182 void ConferenceEditor::showParsingProgress(int progress)
183 {
184     progressBar->setValue(progress);
185
186     QApplication::processEvents();
187 }
188
189 void ConferenceEditor::importFinished(const QString& title)
190 {
191     addBtn->show();
192     // removeItem should be shown later, but it takes some time,
193     // and not looks good
194     // anyway it will be shown a bit later
195     removeBtn->show();
196     buttons->layout()->addItem(buttonsSpacer);
197     progressBar->hide();
198
199     QApplication::processEvents();
200
201     int num = model->rowCount();
202     for (int i = 0; i < num; i++) {
203         QModelIndex item = model->index(i, 0);
204         if (model->data(item) == title) {
205             emit wantCurrent(item, QItemSelectionModel::SelectCurrent);
206             return;
207         }
208     }
209     itemSelected(QModelIndex(), QModelIndex());
210 }
211