diff options
Diffstat (limited to 'Swift/QtUI/Roster/RosterModel.cpp')
-rw-r--r-- | Swift/QtUI/Roster/RosterModel.cpp | 184 |
1 files changed, 147 insertions, 37 deletions
diff --git a/Swift/QtUI/Roster/RosterModel.cpp b/Swift/QtUI/Roster/RosterModel.cpp index c4cf57e..408cc3e 100644 --- a/Swift/QtUI/Roster/RosterModel.cpp +++ b/Swift/QtUI/Roster/RosterModel.cpp @@ -6,74 +6,184 @@ #include "RosterModel.h" +#include <boost/bind.hpp> + +#include <QColor> +#include <QIcon> +#include <qdebug.h> + +#include "Swiften/Elements/StatusShow.h" +#include "Swiften/Roster/ContactRosterItem.h" +#include "Swiften/Roster/GroupRosterItem.h" + +#include "QtSwiftUtil.h" +#include "Swift/QtUI/Roster/QtTreeWidget.h" + namespace Swift { -RosterModel::RosterModel() { +RosterModel::RosterModel(QtTreeWidget* view) : view_(view) { + roster_ = NULL; } RosterModel::~RosterModel() { - delete tree_; } -void RosterModel::setRoot(QtTreeWidgetItem* root) { - tree_ = root; - connect(tree_, SIGNAL(changed(QtTreeWidgetItem*)), this, SLOT(handleItemChanged(QtTreeWidgetItem*))); +void RosterModel::setRoster(Roster* roster) { + roster_ = roster; + if (!roster_) return; + roster->onChildrenChanged.connect(boost::bind(&RosterModel::handleChildrenChanged, this, _1)); + roster->onDataChanged.connect(boost::bind(&RosterModel::handleDataChanged, this, _1)); + roster->onGroupAdded.connect(boost::bind(&RosterModel::handleGroupAdded, this, _1)); + emit layoutChanged(); } - -void RosterModel::handleItemChanged(QtTreeWidgetItem* item) { - if (!item->isShown()) { - return; - } +void RosterModel::handleGroupAdded(GroupRosterItem* group) { + view_->setExpanded(index(group), true); +} + +void RosterModel::handleChildrenChanged(GroupRosterItem* /*group*/) { + emit layoutChanged(); +} + +void RosterModel::handleDataChanged(RosterItem* item) { Q_ASSERT(item); QModelIndex modelIndex = index(item); - Q_ASSERT(modelIndex.isValid()); - emit itemExpanded(modelIndex, item->isExpanded()); - emit dataChanged(modelIndex, modelIndex); - emit dataChanged(parent(modelIndex), parent(modelIndex)); - emit layoutChanged(); + if (modelIndex.isValid()) { + //emit itemExpanded(modelIndex, item->isExpanded()); + emit dataChanged(modelIndex, modelIndex); + } } -int RosterModel::columnCount(const QModelIndex& parent) const { - Q_UNUSED(parent); +int RosterModel::columnCount(const QModelIndex& /*parent*/) const { return 1; } +RosterItem* RosterModel::getItem(const QModelIndex& index) const { + return index.isValid() ? static_cast<RosterItem*>(index.internalPointer()) : NULL; +} + QVariant RosterModel::data(const QModelIndex& index, int role) const { - QtTreeWidgetItem* item = index.isValid() ? static_cast<QtTreeWidgetItem*>(index.internalPointer()) : NULL; - return item ? item->data(role) : QVariant(); + RosterItem* item = getItem(index); + if (!item) return QVariant(); + + switch (role) { + case Qt::DisplayRole: return P2QSTRING(item->getDisplayName()); + case Qt::TextColorRole: return getTextColor(item); + case Qt::BackgroundColorRole: return getBackgroundColor(item); + case Qt::ToolTipRole: return getToolTip(item); + case StatusTextRole: return getStatusText(item); + case AvatarRole: return getAvatar(item); + case PresenceIconRole: return getPresenceIcon(item); + case ChildCountRole: return getChildCount(item); + default: return QVariant(); + } } -QModelIndex RosterModel::index(int row, int column, const QModelIndex& parent) const { - QtTreeWidgetItem* parentItem = parent.isValid() ? static_cast<QtTreeWidgetItem*>(parent.internalPointer()) : tree_; - Q_ASSERT(parentItem); - - return row < parentItem->rowCount() ? createIndex(row, column, parentItem->getItem(row)) : QModelIndex(); +int RosterModel::getChildCount(RosterItem* item) const { + GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item); + return group ? group->getDisplayedChildren().size() : 0; } -QModelIndex RosterModel::index(QtTreeWidgetItem* item) const { - return createIndex(item->row(), 0, item); +QColor RosterModel::intToColor(int color) const { + return QColor( + ((color & 0xFF0000)>>16), + ((color & 0xFF00)>>8), + (color & 0xFF)); } -QModelIndex RosterModel::parent(const QModelIndex& index) const { - if (!index.isValid()) { - return QModelIndex(); +QColor RosterModel::getTextColor(RosterItem* item) const { + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); + int color = 0; + if (contact) { + switch (contact->getStatusShow()) { + case StatusShow::Online: color = 0x000000; break; + case StatusShow::Away: color = 0x336699; break; + case StatusShow::XA: color = 0x336699; break; + case StatusShow::FFC: color = 0x000000; break; + case StatusShow::DND: color = 0x990000; break; + case StatusShow::None: color = 0x7F7F7F;break; + } } + return intToColor(color); +} + +QColor RosterModel::getBackgroundColor(RosterItem* item) const { + return dynamic_cast<ContactRosterItem*>(item) ? intToColor(0xFFFFFF) : intToColor(0x969696); +} + +QString RosterModel::getToolTip(RosterItem* item) const { + return dynamic_cast<ContactRosterItem*>(item) ? P2QSTRING(item->getDisplayName()) + "\n" + getStatusText(item) : P2QSTRING(item->getDisplayName()); +} + +QIcon RosterModel::getAvatar(RosterItem* item) const { + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); + if (!contact) return QIcon(); + String path = contact->getAvatarPath(); - QtTreeWidgetItem* item = static_cast<QtTreeWidgetItem*>(index.internalPointer()); - Q_ASSERT(item); + return path.isEmpty() ? QIcon() : QIcon(P2QSTRING(path)); +} - QtTreeWidgetItem* parentItem = item->getParentItem(); - /* parentItem_ == NULL can happen during destruction.*/ - return parentItem == tree_ || parentItem == NULL ? QModelIndex() : createIndex(parentItem->row(), 0, parentItem); +QString RosterModel::getStatusText(RosterItem* item) const { + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); + if (!contact) return ""; + return P2QSTRING(contact->getStatusText()); +} +QIcon RosterModel::getPresenceIcon(RosterItem* item) const { + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); + if (!contact) return QIcon(); + QString iconString; + switch (contact->getStatusShow()) { + case StatusShow::Online: iconString = "online";break; + case StatusShow::Away: iconString = "away";break; + case StatusShow::XA: iconString = "away";break; + case StatusShow::FFC: iconString = "online";break; + case StatusShow::DND: iconString = "dnd";break; + case StatusShow::None: iconString = "offline";break; + } + return QIcon(":/icons/" + iconString + ".png"); +} + + +QModelIndex RosterModel::index(int row, int column, const QModelIndex& parent) const { + GroupRosterItem* parentItem; + if (!parent.isValid()) { + //top level + parentItem = roster_->getRoot(); + } else { + parentItem = dynamic_cast<GroupRosterItem*>(getItem(parent)); + if (!parentItem) return QModelIndex(); + } + return (size_t)row < parentItem->getDisplayedChildren().size() ? createIndex(row, column, parentItem->getDisplayedChildren()[row]) : QModelIndex(); +} + +QModelIndex RosterModel::index(RosterItem* item) const { + GroupRosterItem* parent = item->getParent(); + for (size_t i = 0; i < parent->getDisplayedChildren().size(); i++) { + if (parent->getDisplayedChildren()[i] == item) { + return createIndex(i, 0, item); + } + } + return QModelIndex(); +} + +QModelIndex RosterModel::parent(const QModelIndex& child) const { + if (!child.isValid()) { + return QModelIndex(); + } + + GroupRosterItem* parent = getItem(child)->getParent(); + return (parent != roster_->getRoot()) ? index(parent) : QModelIndex(); } int RosterModel::rowCount(const QModelIndex& parent) const { - QtTreeWidgetItem* item = parent.isValid() ? static_cast<QtTreeWidgetItem*>(parent.internalPointer()) : tree_; + if (!roster_) return 0; + RosterItem* item = parent.isValid() ? static_cast<RosterItem*>(parent.internalPointer()) : roster_->getRoot(); Q_ASSERT(item); - - return item->rowCount(); + GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item); + int count = group ? group->getDisplayedChildren().size() : 0; + qDebug() << "rowCount = " << count << " where parent.isValid() == " << parent.isValid() << ", group == " << (group ? P2QSTRING(group->getDisplayName()) : "*contact*"); + return count; } } |