/*
* Copyright (C) 2010 Ixonos Plc.
* Copyright (C) 2011 Philipp Spitzer, gregor herrmann
*
* This file is part of ConfClerk.
*
* ConfClerk is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 2 of the License, or (at your option)
* any later version.
*
* ConfClerk is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* ConfClerk. If not, see .
*/
#include "conferenceeditor.h"
#include "conferencemodel.h"
#include "urlinputdialog.h"
#include "mapwindow.h"
#include "errormessage.h"
#include
#include
#include
#include
ConferenceEditor::ConferenceEditor(ConferenceModel* model, QWidget* parent)
: QDialog(parent)
, model(model)
, selected_id(-1)
{
setupUi(this);
progressBar->hide();
confView->setModel(model);
QItemSelectionModel* confViewSelection = new QItemSelectionModel(model, this);
confView->setSelectionModel(confViewSelection);
connect(confViewSelection, SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
SLOT(itemSelected(const QModelIndex&, const QModelIndex&)));
connect(this, SIGNAL(wantCurrent(const QModelIndex&, QItemSelectionModel::SelectionFlags)),
confViewSelection, SLOT(setCurrentIndex(const QModelIndex&, QItemSelectionModel::SelectionFlags)));
connect(addBtn, SIGNAL(clicked()), SLOT(addClicked()));
connect(removeBtn, SIGNAL(clicked()), SLOT(removeClicked()));
connect(changeUrl, SIGNAL(clicked()), SLOT(changeUrlClicked()));
connect(refreshBtn, SIGNAL(clicked()), SLOT(refreshClicked()));
connect(showMapButton, SIGNAL(clicked()), SLOT(conferenceMapClicked()));
connect(buttonBox, SIGNAL(rejected()), SLOT(close()));
// it's OK to emit selection signals here
// because they are not yet connected to anybody
int active_id = Conference::activeConference();
if (active_id > 0) {
emit wantCurrent(model->indexFromId(active_id), QItemSelectionModel::SelectCurrent);
} else {
itemSelected(QModelIndex(), QModelIndex());
}
}
void ConferenceEditor::conferenceRemoved()
{
if (model->rowCount() > 0) {
emit wantCurrent(model->index(0, 0), QItemSelectionModel::SelectCurrent);
} else {
itemSelected(QModelIndex(), QModelIndex());
}
}
void ConferenceEditor::itemSelected(const QModelIndex& current, const QModelIndex& previous)
{
// TODO: fill all required fields
Q_UNUSED(previous);
if (!current.isValid()) {
selected_id = -1;
emit noneConferenceSelected();
conferenceInfo->setCurrentIndex(1);
removeBtn->hide();
} else {
const Conference& conf = model->conferenceFromIndex(current);
selected_id = conf.id();
emit haveConferenceSelected(selected_id);
conferenceTitle->setText(conf.title());
conferenceSubtitle->setText(conf.subtitle());
conferenceWhere->setText(conf.city() + ", " + conf.venue());
conferenceWhen->setText(
conf.start().toString("dd-MM-yyyy")
+ ", " +
conf.end().toString("dd-MM-yyyy"));
QString map = conf.map();
if (map.isEmpty()) {
showMapButton->hide();
} else {
showMapButton->show();
}
conferenceInfo->setCurrentIndex(0);
removeBtn->show();
}
}
void ConferenceEditor::addClicked()
{
UrlInputDialog url_input(this);
switch (url_input.exec()) {
case UrlInputDialog::HaveUrl: emit haveConferenceUrl(url_input.url()); break;
case UrlInputDialog::HaveFile: emit haveConferenceFile(url_input.url()); break;
case UrlInputDialog::Cancel: return;
}
}
void ConferenceEditor::removeClicked()
{
if (selected_id < 0) {
// TODO: disable it when none is selected
return;
}
QMessageBox::StandardButton answer =
QMessageBox::question(0
, "Deletion confirmation"
, QString("Really delete the %1 conference").arg(Conference::getById(selected_id).title())
, QMessageBox::Yes | QMessageBox::No
, QMessageBox::No);
if (answer == QMessageBox::Yes) {
emit removeConferenceRequested(selected_id);
}
}
void ConferenceEditor::changeUrlClicked()
{
if (selected_id < 0) {
return;
}
const Conference& selected = Conference::getById(selected_id);
bool ok;
QString url = QInputDialog::getText(this, "URL Input", "Enter schedule URL", QLineEdit::Normal, selected.url(), &ok);
if (ok) {
emit changeUrlRequested(selected_id, url);
}
}
void ConferenceEditor::refreshClicked()
{
if (selected_id < 0) {
return;
}
const Conference& selected = Conference::getById(selected_id);
QString url = selected.url();
if (!url.isEmpty()) {
emit haveConferenceUrl(url);
} else {
static const QString format("Schedule URL for %1 is not set. Enter the schedule URL:");
bool ok;
QString url = QInputDialog::getText(this, "URL Input", format.arg(selected.title()), QLineEdit::Normal, QString(), &ok);
if (ok) {
// first save it, to remain if fetch fails
emit changeUrlRequested(selected_id, url);
// then fetch
emit haveConferenceUrl(url);
}
}
}
void ConferenceEditor::importStarted()
{
addBtn->hide();
removeBtn->hide();
buttons->layout()->removeItem(buttonsSpacer);
progressBar->setValue(0);
progressBar->show();
QApplication::processEvents();
}
void ConferenceEditor::showParsingProgress(int progress)
{
progressBar->setValue(progress);
QApplication::processEvents();
}
void ConferenceEditor::importFinished(const QString& title)
{
qDebug() << __PRETTY_FUNCTION__ << title;
addBtn->show();
// removeItem should be shown later, but it takes some time,
// and not looks good
// anyway it will be shown a bit later
removeBtn->show();
buttons->layout()->addItem(buttonsSpacer);
progressBar->hide();
QApplication::processEvents();
int num = model->rowCount();
for (int i = 0; i < num; i++) {
QModelIndex item = model->index(i, 0);
if (model->data(item) == title) {
emit wantCurrent(item, QItemSelectionModel::SelectCurrent);
return;
}
}
itemSelected(QModelIndex(), QModelIndex());
}
void ConferenceEditor::conferenceMapClicked()
{
Conference conf = Conference::getById(selected_id);
QString mapPath = conf.map();
if(mapPath.isEmpty() or !QFile::exists(mapPath)) {
error_message("Map is not available");
return;
}
QString roomName;
QPixmap map(mapPath);
MapWindow window(map,roomName,this);
window.exec();
}