/* * Copyright (C) by Klaas Freitag * Copyright (C) by Olivier Goffart * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include "activityitemdelegate.h" #include "folderstatusmodel.h" #include "folderman.h" #include "accountstate.h" #include "utility.h" #include #include #include #include #include namespace OCC { int ActivityItemDelegate::_iconHeight = 0; int ActivityItemDelegate::_margin = 0; int ActivityItemDelegate::iconHeight() { if( _iconHeight == 0 ) { QStyleOptionViewItem option; QFont font = option.font; QFontMetrics fm(font); _iconHeight = qRound(fm.height() / 5.0 * 8.0); } return _iconHeight; } int ActivityItemDelegate::rowHeight() { if( _margin == 0 ) { QStyleOptionViewItem opt; QFont f = opt.font; QFontMetrics fm(f); _margin = fm.height()/4; } return iconHeight() + 2 * _margin; } QSize ActivityItemDelegate::sizeHint(const QStyleOptionViewItem & option , const QModelIndex & /* index */) const { QFont font = option.font; return QSize( 0, rowHeight() ); } void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyledItemDelegate::paint(painter,option,index); QFont font = option.font; QFontMetrics fm( font ); int margin = fm.height()/4; painter->save(); QIcon actionIcon = qvariant_cast(index.data(ActionIconRole)); QIcon userIcon = qvariant_cast(index.data(UserIconRole)); QString actionText = qvariant_cast(index.data(ActionTextRole)); QString pathText = qvariant_cast(index.data(PathRole)); QString remoteLink = qvariant_cast(index.data(LinkRole)); QString timeText = qvariant_cast(index.data(PointInTimeRole)); QString accountRole = qvariant_cast(index.data(AccountRole)); bool accountOnline = qvariant_cast (index.data(AccountConnectedRole)); QRect actionIconRect = option.rect; QRect userIconRect = option.rect; int iconHeight = qRound(fm.height() / 5.0 * 8.0); int iconWidth = iconHeight; actionIconRect.setLeft( option.rect.left() + margin ); actionIconRect.setWidth( iconWidth ); actionIconRect.setHeight( iconHeight ); actionIconRect.setTop( actionIconRect.top() + margin ); userIconRect.setLeft( actionIconRect.right() + margin ); userIconRect.setWidth( iconWidth ); userIconRect.setHeight( iconHeight ); userIconRect.setTop( actionIconRect.top() ); int textTopOffset = qRound( (iconHeight - fm.height())/ 2.0 ); // time rect QRect timeBox; int timeBoxWidth = fm.boundingRect(QLatin1String("4 hour(s) ago on longlongdomain.org")).width(); // FIXME. timeBox.setTop( actionIconRect.top()+textTopOffset); timeBox.setLeft( option.rect.right() - timeBoxWidth- margin ); timeBox.setWidth( timeBoxWidth); timeBox.setHeight( fm.height() ); QRect actionTextBox = timeBox; actionTextBox.setLeft( userIconRect.right()+margin ); actionTextBox.setRight( timeBox.left()-margin ); /* === start drawing === */ QPixmap pm = actionIcon.pixmap(iconWidth, iconHeight, QIcon::Normal); painter->drawPixmap(QPoint(actionIconRect.left(), actionIconRect.top()), pm); pm = userIcon.pixmap(iconWidth, iconHeight, QIcon::Normal); painter->drawPixmap(QPoint(userIconRect.left(), userIconRect.top()), pm); QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) cg = QPalette::Inactive; if (option.state & QStyle::State_Selected) { painter->setPen(option.palette.color(cg, QPalette::HighlightedText)); } else { painter->setPen(option.palette.color(cg, QPalette::Text)); } const QString elidedAction = fm.elidedText(actionText, Qt::ElideRight, actionTextBox.width()); painter->drawText(actionTextBox, elidedAction); int atPos = accountRole.indexOf(QLatin1Char('@')); if( atPos > -1 ) { accountRole.remove(0, atPos+1); } QString timeStr; if ( accountOnline ) { timeStr = tr("%1 on %2").arg(timeText).arg(accountRole); } else { timeStr = tr("%1 on %2 (disconnected)").arg(timeText).arg(accountRole); QPalette p = option.palette; painter->setPen(p.color(QPalette::Disabled, QPalette::Text)); } const QString elidedTime = fm.elidedText(timeStr, Qt::ElideRight, timeBox.width()); painter->drawText(timeBox, elidedTime); painter->restore(); } bool ActivityItemDelegate::editorEvent ( QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index ) { return QStyledItemDelegate::editorEvent(event, model, option, index); } } // namespace OCC