DolphinFileItemDelegate::DolphinFileItemDelegate(QObject* parent) :
KFileItemDelegate(parent),
- m_hasMinimizedNameColumn(false)
+ m_hasMinimizedNameColumn(false),
+ m_cachedSize(),
+ m_cachedEmblems()
{
}
const DolphinModel* dolphinModel = static_cast<const DolphinModel*>(proxyModel->sourceModel());
const bool isNameColumn = (index.column() == KDirModel::Name);
+ QStyleOptionViewItemV4 opt(option);
if (m_hasMinimizedNameColumn && isNameColumn) {
- QStyleOptionViewItemV4 opt(option);
adjustOptionWidth(opt, proxyModel, dolphinModel, index);
- KFileItemDelegate::paint(painter, opt, index);
- } else {
- KFileItemDelegate::paint(painter, option, index);
}
- if (dolphinModel->hasRevisionData() && isNameColumn) {
+ if (dolphinModel->hasVersionData() && isNameColumn) {
// The currently shown items are under revision control. Show the current revision
- // state by adding an emblem.
+ // state by adding an emblem and changing the text tintColor.
const QModelIndex dirIndex = proxyModel->mapToSource(index);
- const QModelIndex revisionIndex = dolphinModel->index(dirIndex.row(), DolphinModel::Revision);
+ const QModelIndex revisionIndex = dolphinModel->index(dirIndex.row(), DolphinModel::Version, dirIndex.parent());
const QVariant data = dolphinModel->data(revisionIndex, Qt::DecorationRole);
- const RevisionControlPlugin::RevisionState state = static_cast<RevisionControlPlugin::RevisionState>(data.toInt());
-
- if (state != RevisionControlPlugin::LocalRevision) {
- // TODO: extend KFileItemDelegate to be able to get the icon boundaries
- const QRect iconRect(option.rect.x(), option.rect.y(),
- KIconLoader::SizeSmall, KIconLoader::SizeSmall);
- const QPixmap emblem = emblemForState(state, iconRect.size());
- painter->drawPixmap(iconRect.x(), iconRect.y(), emblem);
+ const KVersionControlPlugin::VersionState state = static_cast<KVersionControlPlugin::VersionState>(data.toInt());
+
+ adjustOptionTextColor(opt, state);
+
+ KFileItemDelegate::paint(painter, opt, index);
+
+ if (state != KVersionControlPlugin::UnversionedVersion) {
+ const QRect rect = iconRect(option, index);
+ const QPixmap emblem = emblemForState(state, rect.size());
+ painter->drawPixmap(rect.x(), rect.y() + rect.height() - emblem.height(), emblem);
}
+ } else {
+ KFileItemDelegate::paint(painter, opt, index);
}
}
}
}
-QPixmap DolphinFileItemDelegate::emblemForState(RevisionControlPlugin::RevisionState state, const QSize& size)
+void DolphinFileItemDelegate::adjustOptionTextColor(QStyleOptionViewItemV4& option,
+ KVersionControlPlugin::VersionState state)
{
- // TODO #1: all icons that are use here will be replaced by revision control emblems provided by the
- // Oxygen team before KDE 4.4
- // TODO #2: cache the icons
+ QColor tintColor;
+
+ // Using hardcoded colors is generally a bad idea. In this case the colors just act
+ // as tint colors and are mixed with the current set text color. The tint colors
+ // have been optimized for the base colors of the corresponding Oxygen emblems.
switch (state) {
- case RevisionControlPlugin::LatestRevision:
- return KIcon("dialog-ok-apply").pixmap(size);
- case RevisionControlPlugin::ConflictingRevision:
- return KIcon("application-exit").pixmap(size);
- case RevisionControlPlugin::UpdateRequiredRevision:
- return KIcon("rating").pixmap(size);
- case RevisionControlPlugin::EditingRevision:
- return KIcon("emblem-important").pixmap(size);
+ case KVersionControlPlugin::UpdateRequiredVersion: tintColor = Qt::yellow; break;
+ case KVersionControlPlugin::LocallyModifiedVersion: tintColor = Qt::green; break;
+ case KVersionControlPlugin::AddedVersion: tintColor = Qt::darkGreen; break;
+ case KVersionControlPlugin::RemovedVersion: tintColor = Qt::darkRed; break;
+ case KVersionControlPlugin::ConflictingVersion: tintColor = Qt::red; break;
+ case KVersionControlPlugin::UnversionedVersion:
+ case KVersionControlPlugin::NormalVersion:
default:
- break;
+ // use the default text color
+ return;
+ }
+
+ QPalette palette = option.palette;
+ const QColor textColor = palette.color(QPalette::Text);
+ tintColor = QColor((tintColor.red() + textColor.red()) / 2,
+ (tintColor.green() + textColor.green()) / 2,
+ (tintColor.blue() + textColor.blue()) / 2,
+ (tintColor.alpha() + textColor.alpha()) / 2);
+ palette.setColor(QPalette::Text, tintColor);
+ option.palette = palette;
+}
+
+QPixmap DolphinFileItemDelegate::emblemForState(KVersionControlPlugin::VersionState state, const QSize& size) const
+{
+ Q_ASSERT(state <= KVersionControlPlugin::ConflictingVersion);
+ if (m_cachedSize != size) {
+ m_cachedSize = size;
+
+ const int iconHeight = size.height();
+ int emblemHeight = KIconLoader::SizeSmall;
+ if (iconHeight >= KIconLoader::SizeEnormous) {
+ emblemHeight = KIconLoader::SizeMedium;
+ } else if (iconHeight >= KIconLoader::SizeLarge) {
+ emblemHeight = KIconLoader::SizeSmallMedium;
+ } else if (iconHeight >= KIconLoader::SizeMedium) {
+ emblemHeight = KIconLoader::SizeSmall;
+ } else {
+ emblemHeight = KIconLoader::SizeSmall / 2;
+ }
+
+ const QSize emblemSize(emblemHeight, emblemHeight);
+ for (int i = KVersionControlPlugin::NormalVersion; i <= KVersionControlPlugin::ConflictingVersion; ++i) {
+ QString iconName;
+ switch (i) {
+ case KVersionControlPlugin::NormalVersion: iconName = "vcs-normal"; break;
+ case KVersionControlPlugin::UpdateRequiredVersion: iconName = "vcs-update-required"; break;
+ case KVersionControlPlugin::LocallyModifiedVersion: iconName = "vcs-locally-modified"; break;
+ case KVersionControlPlugin::AddedVersion: iconName = "vcs-added"; break;
+ case KVersionControlPlugin::RemovedVersion: iconName = "vcs-removed"; break;
+ case KVersionControlPlugin::ConflictingVersion: iconName = "vcs-conflicting"; break;
+ case KVersionControlPlugin::UnversionedVersion:
+ default: Q_ASSERT(false); break;
+ }
+
+ m_cachedEmblems[i] = KIcon(iconName).pixmap(emblemSize);
+ }
}
- return QPixmap();
+ return m_cachedEmblems[state];
}