#include <QtWidgets>
#include <qorganizer.h>
#include <qorganizerabstractrequest.h>
#include "monthpage.h"
#include "calendardemo.h"
QTORGANIZER_USE_NAMESPACE
Q_DECLARE_METATYPE(QOrganizerItem)
MonthPage::MonthPage(QWidget *parent)
:QWidget(parent),
m_manager(0),
m_calendarWidget(0),
m_dateLabel(0),
m_itemList(0),
m_ignoreShowDayPageOnceFlag(false)
{
QFormLayout *mainlayout = new QFormLayout(this);
m_managerComboBox = new QComboBox(this);
foreach (const QString& manager, QOrganizerManager::availableManagers()) {
if (manager != "invalid" && manager != "skeleton")
m_managerComboBox->addItem(manager);
}
mainlayout->addRow("Backend:", m_managerComboBox);
connect(m_managerComboBox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(backendChanged(const QString &)));
m_dateLabel = new QLabel(this);
m_dateLabel->setAlignment(Qt::AlignCenter);
mainlayout->addRow(m_dateLabel);
m_calendarWidget = new QCalendarWidget(this);
m_calendarWidget->setGridVisible(true);
m_calendarWidget->setHorizontalHeaderFormat(QCalendarWidget::SingleLetterDayNames);
m_calendarWidget->setNavigationBarVisible(false);
mainlayout->addRow(m_calendarWidget);
connect(m_calendarWidget, SIGNAL(selectionChanged()), this, SLOT(refreshDayItems()));
connect(m_calendarWidget, SIGNAL(currentPageChanged(int, int)), this, SLOT(currentMonthChanged()));
connect(m_calendarWidget, SIGNAL(activated(QDate)), this, SLOT(dayDoubleClicked(QDate)));
m_itemList = new QListWidget(this);
m_itemList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_itemList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_itemList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_itemList->setFocusPolicy(Qt::NoFocus);
mainlayout->addRow(m_itemList);
connect(m_itemList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*)));
setLayout(mainlayout);
}
void MonthPage::init()
{
backendChanged(m_managerComboBox->currentText());
currentMonthChanged();
}
MonthPage::~MonthPage()
{
}
void MonthPage::backendChanged(const QString &managerName)
{
if (m_manager && m_manager->managerName() == managerName)
return;
QMap<QString, QString> parameters;
QOrganizerManager* newManager = new QOrganizerManager(managerName, parameters, this);
if (!newManager || newManager->error()) {
QMessageBox::information(this, tr("Failed!"), QString("Failed to create manager"));
delete newManager;
m_managerComboBox->setCurrentIndex(m_managerComboBox->findText(m_manager->managerName()));
} else {
delete m_manager;
m_manager = newManager;
emit managerChanged(m_manager);
refresh();
}
}
void MonthPage::editItem()
{
QListWidgetItem *listItem = m_itemList->currentItem();
if (!listItem)
return;
QOrganizerItem organizerItem = listItem->data(ORGANIZER_ITEM_ROLE).value<QOrganizerItem>();
if (!organizerItem.isEmpty())
emit showEditPage(organizerItem);
}
void MonthPage::removeItem()
{
QListWidgetItem *listItem = m_itemList->currentItem();
if (!listItem)
return;
QOrganizerItem organizerItem = listItem->data(ORGANIZER_ITEM_ROLE).value<QOrganizerItem>();
if (organizerItem.isEmpty())
return;
m_manager->removeItem(organizerItem.id());
refresh();
}
void MonthPage::refresh()
{
QDate start(m_calendarWidget->yearShown(), m_calendarWidget->monthShown(), 1);
QDate end = start.addDays(start.daysInMonth());
QDateTime startDateTime(start, QTime(0, 0, 0, 0));
QDateTime endDateTime(end, QTime(23, 59, 59, 0));
for (int i=0; i<start.daysInMonth(); i++) {
QTextCharFormat cf = m_calendarWidget->dateTextFormat(start.addDays(i));
cf.setFontItalic(false);
cf.setFontUnderline(false);
cf.clearBackground();
m_calendarWidget->setDateTextFormat(start.addDays(i), cf);
}
QTextCharFormat cf = m_calendarWidget->dateTextFormat(QDate::currentDate());
cf.setFontUnderline(true);
m_calendarWidget->setDateTextFormat(QDate::currentDate(), cf);
QList<QOrganizerItem> items = m_manager->items(startDateTime, endDateTime);
QList<QDate> dates;
foreach (const QOrganizerItem &item, items)
{
QDate startDate;
QDate endDate;
QOrganizerEventTime eventTime = item.detail(QOrganizerItemDetail::TypeEventTime);
if (!eventTime.isEmpty()) {
startDate = eventTime.startDateTime().date();
endDate = eventTime.endDateTime().date();
} else {
QOrganizerTodoTime todoTime = item.detail(QOrganizerItemDetail::TypeTodoTime);
if (!todoTime.isEmpty()) {
startDate = todoTime.startDateTime().date();
endDate = todoTime.dueDateTime().date();
} else {
QOrganizerJournalTime journalTime = item.detail(QOrganizerItemDetail::TypeJournalTime);
if (!journalTime.isEmpty())
startDate = endDate = journalTime.entryDateTime().date();
}
}
if (!startDate.isNull()) {
while (startDate <= endDate) {
dates << startDate;
startDate = startDate.addDays(1);
}
}
}
QBrush brush;
brush.setColor(Qt::green);
foreach (QDate date, dates) {
if (date == QDate())
continue;
QTextCharFormat cf = m_calendarWidget->dateTextFormat(date);
cf.setFontItalic(true);
cf.setBackground(brush);
m_calendarWidget->setDateTextFormat(date, cf);
}
refreshDayItems();
}
void MonthPage::refreshDayItems()
{
QDate selectedDate = m_calendarWidget->selectedDate();
emit currentDayChanged(selectedDate);
QDateTime startOfDay(selectedDate, QTime(0, 0, 0));
QDateTime endOfDay(selectedDate, QTime(23, 59, 59));
m_itemList->clear();
QList<QOrganizerItem> items = m_manager->items(startOfDay, endOfDay);
foreach (const QOrganizerItem &item, items)
{
QOrganizerEventTime eventTime = item.detail(QOrganizerItemDetail::TypeEventTime);
if (!eventTime.isEmpty()) {
QString time = eventTime.startDateTime().time().toString("hh:mm");
QListWidgetItem* listItem = new QListWidgetItem();
listItem->setText(QString("Event:%1-%2").arg(time).arg(item.displayLabel()));
QVariant data = QVariant::fromValue<QOrganizerItem>(item);
listItem->setData(ORGANIZER_ITEM_ROLE, data);
m_itemList->addItem(listItem);
}
QOrganizerTodoTime todoTime = item.detail(QOrganizerItemDetail::TypeTodoTime);
if (!todoTime.isEmpty()) {
QString time = todoTime.startDateTime().time().toString("hh:mm");
QListWidgetItem* listItem = new QListWidgetItem();
listItem->setText(QString("Todo:%1-%2").arg(time).arg(item.displayLabel()));
QVariant data = QVariant::fromValue<QOrganizerItem>(item);
listItem->setData(ORGANIZER_ITEM_ROLE, data);
m_itemList->addItem(listItem);
}
QOrganizerJournalTime journalTime = item.detail(QOrganizerItemDetail::TypeJournalTime);
if (!journalTime.isEmpty()) {
QString time = journalTime.entryDateTime().time().toString("hh:mm");
QListWidgetItem* listItem = new QListWidgetItem();
listItem->setText(QString("Journal:%1-%2").arg(time).arg(item.displayLabel()));
QVariant data = QVariant::fromValue<QOrganizerItem>(item);
listItem->setData(ORGANIZER_ITEM_ROLE, data);
m_itemList->addItem(listItem);
}
}
if (m_itemList->count() == 0)
m_itemList->addItem("(no entries)");
}
void MonthPage::currentMonthChanged()
{
int month = m_calendarWidget->monthShown();
int year = m_calendarWidget->yearShown();
m_dateLabel->setText(QString("%1 %2").arg(QDate::longMonthName(month)).arg(year));
refresh();
m_ignoreShowDayPageOnceFlag = true;
}
void MonthPage::dayDoubleClicked(QDate date)
{
if (!m_ignoreShowDayPageOnceFlag)
emit showDayPage(date);
else
m_ignoreShowDayPageOnceFlag = false;
}
void MonthPage::openDay()
{
emit showDayPage(m_calendarWidget->selectedDate());
}
void MonthPage::itemDoubleClicked(QListWidgetItem *listItem)
{
if (!listItem)
return;
QOrganizerItem organizerItem = listItem->data(ORGANIZER_ITEM_ROLE).value<QOrganizerItem>();
if (!organizerItem.isEmpty())
emit showEditPage(organizerItem);
}
void MonthPage::showEvent(QShowEvent *event)
{
window()->setWindowTitle("Calendar Demo");
QWidget::showEvent(event);
}