messageviewer.cpp Example File
messageviewer/messageviewer.cpp
#include "messageviewer.h"
#include "messagedelegate.h"
#include "messagemodel.h"
#include <QContactModel>
#include <QContactListView>
#include <QKeyEvent>
#include <QLabel>
#include <QMailMessageId>
#include <QSoftMenuBar>
#include <QStandardItemModel>
#include <QtopiaServiceRequest>
#include <QVBoxLayout>
class ContactSelector : public QWidget
{
Q_OBJECT
public:
ContactSelector(QWidget* parent = 0)
: QWidget(parent), listView(new QContactListView)
{
QLabel* label = new QLabel;
label->setText(tr("Select a contact to view messages exchanged:"));
label->setWordWrap(true);
listView->setModel(&model);
listView->setFrameStyle(QFrame::NoFrame);
connect(listView, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex)));
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(label);
layout->addWidget(listView);
int horizontal = style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
int vertical = style()->pixelMetric(QStyle::PM_LayoutTopMargin);
label->setContentsMargins(horizontal, vertical, horizontal, 0);
layout->setContentsMargins(0, 0, 0, 0);
}
signals:
void contactSelected(const QContact& contact);
protected slots:
void activated(const QModelIndex& index) { emit contactSelected(model.contact(index)); }
private:
QContactModel model;
QContactListView* listView;
};
class MessageSelector : public QWidget
{
Q_OBJECT
public:
MessageSelector(QWidget* parent = 0)
: QWidget(parent), label(new QLabel), listView(new QListView)
{
label->setWordWrap(true);
listView->setModel(&model);
listView->setItemDelegate(&delegate);
listView->setSelectionMode(QAbstractItemView::SingleSelection);
listView->installEventFilter(this);
connect(listView, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex)));
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(label);
layout->addWidget(listView);
int horizontal = style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
int vertical = style()->pixelMetric(QStyle::PM_LayoutTopMargin);
label->setContentsMargins(horizontal, vertical, horizontal, 0);
layout->setContentsMargins(0, 0, 0, 0);
listView->setResizeMode(QListView::Adjust);
listView->setLayoutMode(QListView::Batched);
listView->setFrameStyle(QFrame::NoFrame);
}
signals:
void listPrepared();
void messageSelected(const QMailMessageId& id);
void done();
public slots:
void listMessages(const QContact& contact);
protected slots:
void activated(const QModelIndex& index) { emit messageSelected(model.messageId(index)); }
protected:
virtual bool eventFilter(QObject* obj, QEvent* event);
private:
MessageModel model;
MessageDelegate delegate;
QLabel* label;
QListView* listView;
};
void MessageSelector::listMessages(const QContact& contact)
{
model.setContact(contact);
if (model.isEmpty()) {
label->setText(tr("No messages exchanged with %1").arg(contact.label()));
} else {
listView->selectionModel()->select(model.index(0, 0), QItemSelectionModel::Select);
listView->scrollToTop();
label->setText(tr("Select a message to view the content:"));
}
emit listPrepared();
}
bool MessageSelector::eventFilter(QObject* obj, QEvent* event)
{
if ((obj == listView) && (event->type() == QEvent::KeyPress)) {
if (QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event)) {
if (keyEvent->key() == Qt::Key_Back) {
emit done();
return true;
}
}
}
return QWidget::eventFilter(obj, event);
}
MessageViewer::MessageViewer(QWidget *parent, Qt::WFlags f)
: QWidget(parent, f),
contactSelector(new ContactSelector),
messageSelector(new MessageSelector)
{
setupUi(this);
connect(contactSelector, SIGNAL(contactSelected(QContact)), messageSelector, SLOT(listMessages(QContact)));
connect(messageSelector, SIGNAL(listPrepared()), this, SLOT(showMessageList()));
connect(messageSelector, SIGNAL(messageSelected(QMailMessageId)), this, SLOT(viewMessage(QMailMessageId)));
connect(messageSelector, SIGNAL(done()), this, SLOT(showContactList()));
widgetStack->addWidget(contactSelector);
widgetStack->addWidget(messageSelector);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(widgetStack);
layout->setContentsMargins(0, 0, 0, 0);
(void)QSoftMenuBar::menuFor(this);
showContactList();
}
MessageViewer::~MessageViewer()
{
}
void MessageViewer::showMessageList()
{
widgetStack->setCurrentWidget(messageSelector);
}
void MessageViewer::viewMessage(const QMailMessageId& id)
{
QtopiaServiceRequest req( "Messages", "viewMessage(QMailMessageId)" );
req << id;
req.send();
}
void MessageViewer::showContactList()
{
widgetStack->setCurrentWidget(contactSelector);
}
#include "messageviewer.moc"