diff options
Diffstat (limited to 'examples/qtmail/libs/qmfutil/folderview.cpp')
| -rw-r--r-- | examples/qtmail/libs/qmfutil/folderview.cpp | 401 |
1 files changed, 0 insertions, 401 deletions
diff --git a/examples/qtmail/libs/qmfutil/folderview.cpp b/examples/qtmail/libs/qmfutil/folderview.cpp deleted file mode 100644 index da4400e0..00000000 --- a/examples/qtmail/libs/qmfutil/folderview.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Messaging Framework. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "folderview.h" -#include <QKeyEvent> -#include <qmailmessagekey.h> -#include <qdatastream.h> - -FolderView::FolderView(QWidget *parent) - : QTreeView(parent), - lastItem(0), - oldModel(0) -{ - connect(this, SIGNAL(activated(QModelIndex)), this, SLOT(itemActivated(QModelIndex))); - connect(this, SIGNAL(expanded(QModelIndex)), this, SLOT(itemExpanded(QModelIndex))); - connect(this, SIGNAL(collapsed(QModelIndex)), this, SLOT(itemCollapsed(QModelIndex))); -} - -FolderView::~FolderView() -{ -} - -QMailMessageSet *FolderView::currentItem() const -{ - if (FolderModel *folderModel = model()) - return folderModel->itemFromIndex(currentIndex()); - - return 0; -} - -bool FolderView::setCurrentItem(QMailMessageSet *item) -{ - if (FolderModel *folderModel = model()) { - QModelIndex index(folderModel->indexFromItem(item)); - if (index.isValid()) { - setCurrentIndex(index); - return true; - } - } - - return false; -} - -QMailAccountId FolderView::currentAccountId() const -{ - if (FolderModel *folderModel = model()) - return folderModel->accountIdFromIndex(currentIndex()); - - return QMailAccountId(); -} - -bool FolderView::setCurrentAccountId(const QMailAccountId& id) -{ - if (FolderModel *folderModel = model()) { - QModelIndex index(folderModel->indexFromAccountId(id)); - if (index.isValid()) { - setCurrentIndex(index); - return true; - } - } - - return false; -} - -QMailFolderId FolderView::currentFolderId() const -{ - if (FolderModel *folderModel = model()) - return folderModel->folderIdFromIndex(currentIndex()); - - return QMailFolderId(); -} - -bool FolderView::setCurrentFolderId(const QMailFolderId& id) -{ - if (FolderModel *folderModel = model()) { - QModelIndex index(folderModel->indexFromFolderId(id)); - if (index.isValid()) { - setCurrentIndex(index); - return true; - } - } - - return false; -} - -bool FolderView::ignoreMailStoreUpdates() const -{ - if (FolderModel *folderModel = model()) - return folderModel->ignoreMailStoreUpdates(); - - return false; -} - -void FolderView::setIgnoreMailStoreUpdates(bool ignore) -{ - if (FolderModel *folderModel = model()) - folderModel->setIgnoreMailStoreUpdates(ignore); -} - -void FolderView::itemActivated(const QModelIndex &index) -{ - if (FolderModel *folderModel = model()) - if (QMailMessageSet *item = folderModel->itemFromIndex(index)) - emit activated(item); -} - -void FolderView::itemSelected(const QModelIndex &index) -{ - if (FolderModel *folderModel = model()) - if (QMailMessageSet *item = folderModel->itemFromIndex(index)) - emit selected(item); -} - -static QByteArray arrayFromKey(const QMailMessageKey &key) -{ - QByteArray array; - QDataStream stream(&array, QIODevice::WriteOnly); - key.serialize<QDataStream>(stream); - return array; -} - -void FolderView::itemExpanded(const QModelIndex &index) -{ - if (FolderModel *folderModel = model()) { - - QMailFolderId folderId = folderModel->folderIdFromIndex(index); - if (folderId.isValid()) { - expandedFolders.insert(folderId); - return; - } - - QMailAccountId accountId = folderModel->accountIdFromIndex(index); - if (accountId.isValid()) { - expandedAccounts.insert(accountId); - return; - } - - QMailMessageSet *item = folderModel->itemFromIndex(index); - if (item) { - QMailMessageKey key = item->messageKey(); - expandedKeys.insert(arrayFromKey(key)); - return; - } - } -} - -void FolderView::itemCollapsed(const QModelIndex &index) -{ - if (FolderModel *folderModel = model()) { - - QMailFolderId folderId = folderModel->folderIdFromIndex(index); - if (folderId.isValid()) { - expandedFolders.remove(folderId); - return; - } - - QMailAccountId accountId = folderModel->accountIdFromIndex(index); - if (accountId.isValid()) { - expandedAccounts.remove(accountId); - return; - } - - QMailMessageSet *item = folderModel->itemFromIndex(index); - if (item) { - QMailMessageKey key = item->messageKey(); - expandedKeys.remove(arrayFromKey(key)); - return; - } - } -} - -void FolderView::currentChanged(const QModelIndex ¤tIndex, const QModelIndex &previousIndex) -{ - itemSelected(currentIndex); - - Q_UNUSED(previousIndex) -} - -void FolderView::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) -{ - if(topLeft == currentIndex() || bottomRight == currentIndex()) - emit selectionUpdated(); - QTreeView::dataChanged(topLeft,bottomRight); -} - -namespace { - -template<typename IdType> -QModelIndex itemIndex(const IdType &id, FolderModel *folderModel); - -template<> -QModelIndex itemIndex<QMailAccountId>(const QMailAccountId &id, FolderModel *folderModel) -{ - return folderModel->indexFromAccountId(id); -} - -template<> -QModelIndex itemIndex<QMailFolderId>(const QMailFolderId &id, FolderModel *folderModel) -{ - return folderModel->indexFromFolderId(id); -} - -template<> -QModelIndex itemIndex<QByteArray>(const QByteArray &key, FolderModel *folderModel) -{ - for (int i = 0; i < folderModel->count(); ++i) { - if (arrayFromKey(folderModel->at(i)->messageKey()) == key) { - return folderModel->indexFromItem(folderModel->at(i)); - } - } - return QModelIndex(); -} -} - -template<typename SetType> -bool FolderView::expandSet(SetType &ids, FolderModel *model) -{ - int originalCount = ids.count(); - int count = originalCount; - int oldCount = count + 1; - - while (count && (count < oldCount)) { - oldCount = count; - - typename SetType::iterator it = ids.begin(); - while (it != ids.end()) { - QModelIndex index(itemIndex(*it, model)); - if (index.isValid()) { - if (!isExpanded(index)) - expand(index); - - if (isExpanded(index)) { - // We no longer need to expand this folder - it = ids.erase(it); - --count; - } - else - { - ++it; - } - } else { - ++it; - } - } - } - - return (count != originalCount); -} - -template<typename SetType> -void FolderView::removeNonexistent(SetType &ids, FolderModel *model) -{ - typename SetType::iterator it = ids.begin(); - while (it != ids.end()) { - QModelIndex index(itemIndex(*it, model)); - if (!index.isValid()) { - it = ids.erase(it); - } else { - ++it; - } - } -} - -bool FolderView::expandKeys(QSet<QByteArray> &keys, FolderModel *model) -{ - return expandSet(keys, model); -} - -bool FolderView::expandFolders(QSet<QMailFolderId> &folderIds, FolderModel *model) -{ - return expandSet(folderIds, model); -} - -bool FolderView::expandAccounts(QSet<QMailAccountId> &accountIds, FolderModel *model) -{ - return expandSet(accountIds, model); -} - -void FolderView::modelReset() -{ - if (FolderModel *folderModel = model()) { - // Remove any items that are no longer in the model - removeNonexistent(expandedKeys, folderModel); - removeNonexistent(expandedAccounts, folderModel); - removeNonexistent(expandedFolders, folderModel); - - // Ensure all the expanded items are re-expanded - QSet<QByteArray> keys(expandedKeys); - QSet<QMailAccountId> accountIds(expandedAccounts); - QSet<QMailFolderId> folderIds(expandedFolders); - - bool itemsExpanded(false); - do { - itemsExpanded = false; - - // We need to repeat this process, because many items cannot be expanded until - // their parent item is expanded... - itemsExpanded |= expandKeys(keys, folderModel); - itemsExpanded |= expandAccounts(accountIds, folderModel); - itemsExpanded |= expandFolders(folderIds, folderModel); - } while (itemsExpanded); - - // Any remainining IDs must not be accessible in the model any longer - foreach (const QByteArray &key, keys) - expandedKeys.remove(key); - - foreach (const QMailAccountId &accountId, accountIds) - expandedAccounts.remove(accountId); - - foreach (const QMailFolderId &folderId, folderIds) - expandedFolders.remove(folderId); - } -} - -void FolderView::keyPressEvent(QKeyEvent *e) -{ - switch (e->key()) - { - case Qt::Key_Select: - case Qt::Key_Space: - case Qt::Key_Return: - case Qt::Key_Enter: - - e->accept(); - itemActivated(currentIndex()); - break; - - case Qt::Key_Back: - e->accept(); - emit backPressed(); - break; - - default: - QTreeView::keyPressEvent(e); - } -} - -void FolderView::showEvent(QShowEvent *e) -{ - setIgnoreMailStoreUpdates(false); - QTreeView::showEvent(e); - if (lastItem) { - setCurrentItem(lastItem); - } - lastItem = 0; -} - -void FolderView::hideEvent(QHideEvent *e) -{ - lastItem = currentItem(); - setIgnoreMailStoreUpdates(true); - QTreeView::hideEvent(e); -} - -void FolderView::setModel(QAbstractItemModel *model) -{ - if (oldModel) { - disconnect(oldModel, SIGNAL(reset()), this, SLOT(modelReset())); - } - QTreeView::setModel(model); - oldModel = model; - connect(model, SIGNAL(modelReset()), this, SLOT(modelReset())); -} |
