X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/fa4680cb38028aceb68d41e1937d27c71d1f121b..233a08164f79d9909693c5de438f856467ad5b76:/src/dolphinfileitemdelegate.cpp diff --git a/src/dolphinfileitemdelegate.cpp b/src/dolphinfileitemdelegate.cpp index 6478baf3b..7a6ef118e 100644 --- a/src/dolphinfileitemdelegate.cpp +++ b/src/dolphinfileitemdelegate.cpp @@ -21,15 +21,21 @@ #include #include +#include +#include #include #include #include +#include #include +#include DolphinFileItemDelegate::DolphinFileItemDelegate(QObject* parent) : KFileItemDelegate(parent), - m_hasMinimizedNameColumn(false) + m_hasMinimizedNameColumn(false), + m_cachedSize(), + m_cachedEmblems() { } @@ -43,43 +49,28 @@ void DolphinFileItemDelegate::paint(QPainter* painter, { const QAbstractProxyModel* proxyModel = static_cast(index.model()); const DolphinModel* dolphinModel = static_cast(proxyModel->sourceModel()); + const bool isNameColumn = (index.column() == KDirModel::Name); - if (m_hasMinimizedNameColumn && (index.column() == KDirModel::Name)) { + if (m_hasMinimizedNameColumn && isNameColumn) { QStyleOptionViewItemV4 opt(option); - - const QModelIndex dirIndex = proxyModel->mapToSource(index); - const KFileItem item = dolphinModel->itemForIndex(dirIndex); - if (!item.isNull()) { - // symbolic links are displayed in an italic font - if (item.isLink()) { - opt.font.setItalic(true); - } - - const int width = nameColumnWidth(item.text(), opt); - opt.rect.setWidth(width); - } + adjustOptionWidth(opt, proxyModel, dolphinModel, index); KFileItemDelegate::paint(painter, opt, index); } else { KFileItemDelegate::paint(painter, option, index); } - if (dolphinModel->hasRevisionData()) { + if (dolphinModel->hasVersionData() && isNameColumn) { // The currently shown items are under revision control. Show the current revision - // state above the decoration. + // state by adding an emblem. 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 DolphinModel::RevisionState state = static_cast(data.toInt()); + const KVersionControlPlugin::VersionState state = static_cast(data.toInt()); - if (state != DolphinModel::LocalRevision) { - // TODO: The following code is just a proof of concept. Icons will be used later... - QColor color(200, 0, 0, 32); - switch (state) { - case DolphinModel::LatestRevision: color = QColor(0, 180, 0, 32); break; - // ... - default: break; - } - painter->fillRect(option.rect, color); + 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); } } } @@ -96,3 +87,59 @@ int DolphinFileItemDelegate::nameColumnWidth(const QString& name, const QStyleOp return width; } +void DolphinFileItemDelegate::adjustOptionWidth(QStyleOptionViewItemV4& option, + const QAbstractProxyModel* proxyModel, + const DolphinModel* dolphinModel, + const QModelIndex& index) +{ + const QModelIndex dirIndex = proxyModel->mapToSource(index); + const KFileItem item = dolphinModel->itemForIndex(dirIndex); + if (!item.isNull()) { + // symbolic links are displayed in an italic font + if (item.isLink()) { + option.font.setItalic(true); + } + + const int width = nameColumnWidth(item.text(), option); + option.rect.setWidth(width); + } +} + +QPixmap DolphinFileItemDelegate::emblemForState(KVersionControlPlugin::VersionState state, const QSize& size) const +{ + // TODO: all icons that are use here will be replaced by revision control emblems provided by the + // Oxygen team before KDE 4.4 + Q_ASSERT(state <= KVersionControlPlugin::ConflictingVersion); + if ((m_cachedSize != size) || !m_cachedEmblems[state].isNull()) { + 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 = 0; i <= KVersionControlPlugin::ConflictingVersion; ++i) { + QString iconName; + switch (state) { + 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::ConflictingVersion: iconName = "vcs-conflicting"; break; + default: Q_ASSERT(false); break; + } + + m_cachedEmblems[i] = KIcon(iconName).pixmap(emblemSize); + } + } + return m_cachedEmblems[state]; +} +