source: confclerk_git/src/gui/conferenceeditor.cpp @ 2dffed3

qt5
Last change on this file since 2dffed3 was 2dffed3, checked in by Philipp Spitzer <philipp@…>, 10 years ago

On the way to fix #45.

  • Property mode set to 100644
File size: 6.4 KB
Line 
1/*
2 * Copyright (C) 2010 Ixonos Plc.
3 * Copyright (C) 2011-2012 Philipp Spitzer, gregor herrmann, Stefan Stahl
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
31ConferenceEditor::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
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().isEmpty() ? ", " + conf.venue() : ""));
93        conferenceWhen->setText(
94                conf.start().toString("yyyy-MM-dd")
95                + " - " +
96                conf.end().toString("yyyy-MM-dd"));
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(), 0); break;
107    case UrlInputDialog::HaveFile: emit haveConferenceFile(url_input.url(), 0); 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) return;
134    const Conference& selectedConf = Conference::getById(selected_id);
135
136    bool ok;
137    QString url = QInputDialog::getText(this, "URL Input", "Enter schedule URL", QLineEdit::Normal, selectedConf.url(), &ok);
138
139    if (ok) {
140        emit changeUrlRequested(selected_id, url);
141    }
142}
143
144void ConferenceEditor::refreshClicked()
145{
146    if (selected_id <= 0) return;
147    const Conference& selectedConf = Conference::getById(selected_id);
148    QString url = selectedConf.url();
149
150    if (url.isEmpty()) {
151        static const QString format("Schedule URL for %1 is not set. Enter the schedule URL:");
152        bool ok;
153        url = QInputDialog::getText(this, "URL Input", format.arg(selectedConf.title()), QLineEdit::Normal, QString(), &ok);
154        if (!ok) return;
155        // first save it, to remain if fetch fails
156        emit changeUrlRequested(selected_id, url);
157    }
158    // fetch
159    importStarted(); // just to show the progress bar
160    emit haveConferenceUrl(url, selected_id);
161}
162
163void ConferenceEditor::importStarted()
164{
165    addBtn->hide();
166    removeBtn->hide();
167    buttons->layout()->removeItem(buttonsSpacer);
168    progressBar->setValue(0);
169    progressBar->show();
170
171    QApplication::processEvents();
172}
173
174void ConferenceEditor::showParsingProgress(int progress)
175{
176    progressBar->setValue(progress);
177
178    QApplication::processEvents();
179}
180
181void ConferenceEditor::importFinished(const QString& title)
182{
183    addBtn->show();
184    // removeItem should be shown later, but it takes some time,
185    // and not looks good
186    // anyway it will be shown a bit later
187    removeBtn->show();
188    buttons->layout()->addItem(buttonsSpacer);
189    progressBar->hide();
190
191    QApplication::processEvents();
192
193    int num = model->rowCount();
194    for (int i = 0; i < num; i++) {
195        QModelIndex item = model->index(i, 0);
196        if (model->data(item) == title) {
197            emit wantCurrent(item, QItemSelectionModel::SelectCurrent);
198            return;
199        }
200    }
201    itemSelected(QModelIndex(), QModelIndex());
202}
203
Note: See TracBrowser for help on using the repository browser.