#include "eventeditpage.h"
#include <QtWidgets>
#include <qorganizer.h>
QTORGANIZER_USE_NAMESPACE
EventEditPage::EventEditPage(QWidget *parent)
:QWidget(parent),
m_manager(0),
m_alarmComboBox(0),
m_typeComboBox(0),
m_subjectEdit(0),
m_countSpinBox(0),
m_repeatUntilDate(0)
{
m_saveItemRequest = new QOrganizerItemSaveRequest(this);
QLabel *subjectLabel = new QLabel("Subject:", this);
m_subjectEdit = new QLineEdit(this);
QLabel *startTimeLabel = new QLabel("Start time:", this);
m_startTimeEdit = new QDateTimeEdit(this);
m_startTimeEdit->setDisplayFormat(QString("yyyy-MM-dd hh:mm:ss AP"));
QLabel *endTimeLabel = new QLabel("End time:", this);
m_endTimeEdit = new QDateTimeEdit(this);
m_endTimeEdit->setDisplayFormat(QString("yyyy-MM-dd hh:mm:ss AP"));
QLabel *repeatLabel = new QLabel("Repeat:", this);
QLabel *alarmLabel = new QLabel("Alarm:", this);
QLabel *calendarLabel = new QLabel("Calendar:", this);
m_alarmComboBox = new QComboBox(this);
m_typeComboBox = new QComboBox(this);
m_typeComboBox->addItem("None");
m_typeComboBox->addItem("Daily");
m_typeComboBox->addItem("Weekly");
m_typeComboBox->addItem("Monthly");
m_typeComboBox->addItem("Yearly");
connect(m_typeComboBox, SIGNAL(currentIndexChanged(const QString&)), this,
SLOT(frequencyChanged(const QString&)));
QStringList alarmList;
alarmList << "None"
<< "0 minutes before"
<< "5 minutes before"
<< "15 minutes before"
<< "30 minutes before"
<< "1 hour before";
m_alarmComboBox->addItems(alarmList);
connect(m_alarmComboBox, SIGNAL(currentIndexChanged(const QString)), this,
SLOT(alarmIndexChanged(const QString)));
m_endConditionComboBox = new QComboBox(this);
m_endConditionComboBox->addItem("Forever");
m_endConditionComboBox->addItem("Until a date");
m_endConditionComboBox->addItem("For a number of occurrences");
m_endConditionComboBox->setVisible(false);
connect(m_endConditionComboBox, SIGNAL(currentIndexChanged(const QString&)),
this, SLOT(endConditionChanged(const QString&)));
m_countSpinBox = new QSpinBox(this);
m_countSpinBox->setRange(1, 100);
m_countSpinBox->setSingleStep(1);
m_countSpinBox->setVisible(false);
connect(m_countSpinBox, SIGNAL(valueChanged(int)), this, SLOT(countChanged(int)));
m_repeatUntilDate = new QDateEdit(this);
m_repeatUntilDate->setVisible(false);
connect(m_repeatUntilDate, SIGNAL(dateChanged(QDate)), this, SLOT(untilChanged(QDate)));
m_calendarComboBox = new QComboBox(this);
QHBoxLayout* hbLayout = new QHBoxLayout();
QPushButton *okButton = new QPushButton("Save", this);
connect(okButton,SIGNAL(clicked()),this,SLOT(saveClicked()));
hbLayout->addWidget(okButton);
QPushButton *cancelButton = new QPushButton("Cancel", this);
connect(cancelButton,SIGNAL(clicked()),this,SLOT(cancelClicked()));
hbLayout->addWidget(cancelButton);
QOrganizerManager defaultManager;
QList<QOrganizerItemDetail::DetailType> supportedDetails = defaultManager.supportedItemDetails(QOrganizerItemType::TypeEvent);
QVBoxLayout *scrollAreaLayout = new QVBoxLayout();
scrollAreaLayout->addWidget(subjectLabel);
scrollAreaLayout->addWidget(m_subjectEdit);
scrollAreaLayout->addWidget(startTimeLabel);
scrollAreaLayout->addWidget(m_startTimeEdit);
scrollAreaLayout->addWidget(endTimeLabel);
scrollAreaLayout->addWidget(m_endTimeEdit);
if (supportedDetails.contains(QOrganizerItemDetail::TypeVisualReminder)) {
scrollAreaLayout->addWidget(alarmLabel);
scrollAreaLayout->addWidget(m_alarmComboBox);
}
scrollAreaLayout->addWidget(repeatLabel);
scrollAreaLayout->addWidget(m_typeComboBox);
scrollAreaLayout->addWidget(m_endConditionComboBox);
scrollAreaLayout->addWidget(m_countSpinBox);
scrollAreaLayout->addWidget(m_repeatUntilDate);
scrollAreaLayout->addWidget(calendarLabel);
scrollAreaLayout->addWidget(m_calendarComboBox);
scrollAreaLayout->addStretch();
scrollAreaLayout->addLayout(hbLayout);
QScrollArea *scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true);
QWidget *formContainer = new QWidget(scrollArea);
formContainer->setLayout(scrollAreaLayout);
scrollArea->setWidget(formContainer);
QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->addWidget(scrollArea);
setLayout(mainLayout);
QAction* cancelSoftKey = new QAction("Cancel", this);
cancelSoftKey->setSoftKeyRole(QAction::NegativeSoftKey);
addAction(cancelSoftKey);
connect(cancelSoftKey, SIGNAL(triggered(bool)), this, SLOT(cancelClicked()));
QAction* saveSoftKey = new QAction("Save",this);
saveSoftKey->setSoftKeyRole(QAction::PositiveSoftKey);
addAction(saveSoftKey);
connect(saveSoftKey, SIGNAL(triggered(bool)), this, SLOT(saveClicked()));
m_listOfEvents.clear();
}
EventEditPage::~EventEditPage()
{
}
void EventEditPage::eventChanged(QOrganizerManager *manager, const QOrganizerEvent &event)
{
m_manager = manager;
m_organizerEvent = event;
m_subjectEdit->setText(event.displayLabel());
m_startTimeEdit->setDateTime(event.startDateTime());
m_endTimeEdit->setDateTime(event.endDateTime());
QSet<QOrganizerRecurrenceRule> rrules(m_organizerEvent.recurrenceRules());
if (rrules.count() != 0) {
QOrganizerRecurrenceRule rrule(rrules.values().at(0));
QOrganizerRecurrenceRule::Frequency freq(rrule.frequency());
switch (freq) {
case QOrganizerRecurrenceRule::Daily:
m_typeComboBox->setCurrentIndex(1);
break;
case QOrganizerRecurrenceRule::Weekly:
m_typeComboBox->setCurrentIndex(2);
break;
case QOrganizerRecurrenceRule::Monthly:
m_typeComboBox->setCurrentIndex(3);
break;
case QOrganizerRecurrenceRule::Yearly:
m_typeComboBox->setCurrentIndex(4);
break;
case QOrganizerRecurrenceRule::Invalid:
m_typeComboBox->setCurrentIndex(0);
return;
}
if (rrule.limitType() == QOrganizerRecurrenceRule::DateLimit) {
m_endConditionComboBox->setCurrentIndex(1);
m_repeatUntilDate->setDate(rrule.limitDate());
} else if (rrule.limitType() == QOrganizerRecurrenceRule::CountLimit) {
m_endConditionComboBox->setCurrentIndex(2);
m_countSpinBox->setValue(rrule.limitCount());
}
} else {
m_typeComboBox->setCurrentIndex(0);
}
m_calendarComboBox->clear();
QOrganizerItemReminder reminder = event.detail(QOrganizerItemDetail::TypeReminder);
if (!reminder.isEmpty()) {
if (reminder.secondsBeforeStart() == 0)
m_alarmComboBox->setCurrentIndex(1);
else if (reminder.secondsBeforeStart() < 300)
m_alarmComboBox->setCurrentIndex(2);
else if (reminder.secondsBeforeStart() < 900)
m_alarmComboBox->setCurrentIndex(3);
else if (reminder.secondsBeforeStart() < 1800)
m_alarmComboBox->setCurrentIndex(4);
else
m_alarmComboBox->setCurrentIndex(5);
} else {
m_alarmComboBox->setCurrentIndex(0);
}
m_collections = m_manager->collections();
int index = 0;
int eventCalendarIndex = -1;
foreach(QOrganizerCollection collection, m_collections) {
QString visibleName = collection.metaData(QOrganizerCollection::KeyName).toString();
if (visibleName.isEmpty())
visibleName = "Calendar " + QString::number(index);
m_calendarComboBox->addItem(visibleName);
if (collection.id() == event.collectionId())
eventCalendarIndex = index;
++index;
}
if (eventCalendarIndex > -1) {
m_calendarComboBox->setCurrentIndex(eventCalendarIndex);
m_calendarComboBox->setEnabled(false);
}
else {
m_calendarComboBox->setEnabled(true);
}
}
void EventEditPage::cancelClicked()
{
emit showDayPage();
}
void EventEditPage::saveClicked()
{
QDateTime start(m_startTimeEdit->dateTime());
QDateTime end(m_endTimeEdit->dateTime());
if (start > end) {
QMessageBox::warning(this, "Failed!", "Start date is not before end date");
return;
}
m_organizerEvent.setDisplayLabel(m_subjectEdit->text());
m_organizerEvent.setStartDateTime(start);
m_organizerEvent.setEndDateTime(end);
m_listOfEvents.append(m_organizerEvent);
if (m_calendarComboBox->currentIndex() > 0) {
m_organizerEvent.setCollectionId(m_collections[m_calendarComboBox->currentIndex()].id());
}
m_manager->saveItem(&m_organizerEvent);
if (m_manager->error())
QMessageBox::warning(this, "Failed!", QString("Failed to save event!\n(error code %1)").arg(m_manager->error()));
else
emit showDayPage();
}
void EventEditPage::frequencyChanged(const QString& frequency)
{
QOrganizerRecurrenceRule rrule;
if (frequency != "None") {
m_endConditionComboBox->setVisible(true);
if (frequency == "Daily") {
rrule.setFrequency(QOrganizerRecurrenceRule::Daily);
} else if (frequency == "Weekly") {
rrule.setFrequency(QOrganizerRecurrenceRule::Weekly);
} else if (frequency == "Monthly") {
rrule.setFrequency(QOrganizerRecurrenceRule::Monthly);
} else if (frequency == "Yearly") {
rrule.setFrequency(QOrganizerRecurrenceRule::Yearly);
}
m_organizerEvent.setRecurrenceRule(rrule);
} else {
m_endConditionComboBox->setCurrentIndex(0);
m_endConditionComboBox->setVisible(false);
}
}
void EventEditPage::alarmIndexChanged(const QString time)
{
bool noVisualReminders = !m_manager->supportedItemDetails(QOrganizerItemType::TypeEvent).contains(QOrganizerItemDetail::TypeVisualReminder);
QScopedPointer<QOrganizerItemReminder> reminder;
if (noVisualReminders) {
reminder.reset(new QOrganizerItemReminder());
} else {
reminder.reset(new QOrganizerItemVisualReminder());
static_cast<QOrganizerItemVisualReminder *>(reminder.data())->setMessage(m_subjectEdit->text());
}
if (time == "None") {
QOrganizerItemVisualReminder fetchedReminder = m_organizerEvent.detail(QOrganizerItemDetail::TypeVisualReminder);
m_organizerEvent.removeDetail(&fetchedReminder);
return;
} else if (time == "0 minutes before") {
reminder->setSecondsBeforeStart(0);
} else if (time == "5 minutes before") {
reminder->setSecondsBeforeStart(5*60);
} else if (time == "15 minutes before") {
reminder->setSecondsBeforeStart(15*60);
} else if (time == "30 minutes before") {
reminder->setSecondsBeforeStart(30*60);
} else if (time == "1 hour before") {
reminder->setSecondsBeforeStart(60*60);
}
m_organizerEvent.saveDetail(reminder.data());
}
void EventEditPage::showEvent(QShowEvent *event)
{
window()->setWindowTitle("Edit event");
QWidget::showEvent(event);
}
void EventEditPage::countChanged(int i)
{
QOrganizerRecurrenceRule rrule;
rrule.setFrequency(m_organizerEvent.recurrenceRules().values().at(0).frequency());
rrule.setLimit(i);
m_organizerEvent.setRecurrenceRule(rrule);
}
void EventEditPage::untilChanged(QDate date)
{
QOrganizerRecurrenceRule rrule;
rrule.setFrequency(m_organizerEvent.recurrenceRules().values().at(0).frequency());
rrule.setLimit(date);
m_organizerEvent.setRecurrenceRule(rrule);
}
void EventEditPage::endConditionChanged(const QString& endCondition) {
if (endCondition == "Forever") {
m_countSpinBox->setVisible(false);
m_repeatUntilDate->setVisible(false);
} else if (endCondition == "Until a date") {
setRepeatUntilField();
} else if (endCondition == "For a number of occurrences") {
setCountField();
}
}
void EventEditPage::setCountField()
{
m_countSpinBox->setVisible(true);
m_repeatUntilDate->setVisible(false);
m_countSpinBox->setValue(5);
countChanged(5);
}
void EventEditPage::setRepeatUntilField()
{
m_countSpinBox->setVisible(false);
m_repeatUntilDate->setVisible(true);
m_repeatUntilDate->setDate(m_endTimeEdit->date());
untilChanged(m_endTimeEdit->date());
}