X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e1173edc1d5871b68ac579a96425dd3e4a4ecf24..76a46fd9094b17eb99e8a42cca8562fdc0b3814c:/src/kitemviews/kitemlistwidget.cpp diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 61e06078b..42bf9ebdc 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -1,8 +1,7 @@ /*************************************************************************** * Copyright (C) 2011 by Peter Penz * * * - * Based on the Itemviews NG project from Trolltech Labs: * - * http://qt.gitorious.org/qt-labs/itemviews-ng * + * Based on the Itemviews NG project from Trolltech Labs * * * * 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 * @@ -22,33 +21,41 @@ #include "kitemlistwidget.h" -#include "kitemlistselectiontoggle_p.h" #include "kitemlistview.h" -#include "kitemmodelbase.h" - -#include +#include "private/kitemlistselectiontoggle.h" #include #include #include #include -KItemListWidget::KItemListWidget(QGraphicsItem* parent) : - QGraphicsWidget(parent, 0), +KItemListWidgetInformant::KItemListWidgetInformant() +{ +} + +KItemListWidgetInformant::~KItemListWidgetInformant() +{ +} + +KItemListWidget::KItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) : + QGraphicsWidget(parent), + m_informant(informant), m_index(-1), m_selected(false), m_current(false), m_hovered(false), - m_alternatingBackgroundColors(false), + m_alternateBackground(false), m_enabledSelectionToggle(false), m_data(), m_visibleRoles(), - m_visibleRolesSizes(), + m_columnWidths(), m_styleOption(), + m_siblingsInfo(), m_hoverOpacity(0), - m_hoverCache(0), - m_hoverAnimation(0), - m_selectionToggle(0) + m_hoverCache(nullptr), + m_hoverAnimation(nullptr), + m_selectionToggle(nullptr), + m_editedRole() { } @@ -61,7 +68,7 @@ void KItemListWidget::setIndex(int index) { if (m_index != index) { delete m_selectionToggle; - m_selectionToggle = 0; + m_selectionToggle = nullptr; if (m_hoverAnimation) { m_hoverAnimation->stop(); @@ -91,6 +98,7 @@ void KItemListWidget::setData(const QHash& data, } dataChanged(m_data, roles); } + update(); } QHash KItemListWidget::data() const @@ -100,17 +108,15 @@ QHash KItemListWidget::data() const void KItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { - Q_UNUSED(option); + Q_UNUSED(option) - painter->setRenderHint(QPainter::Antialiasing); - - if (m_alternatingBackgroundColors && (m_index & 0x1)) { + if (m_alternateBackground) { const QColor backgroundColor = m_styleOption.palette.color(QPalette::AlternateBase); const QRectF backgroundRect(0, 0, size().width(), size().height()); painter->fillRect(backgroundRect, backgroundColor); } - if (m_selected) { + if (m_selected && m_editedRole.isEmpty()) { const QStyle::State activeState(isActiveWindow() ? QStyle::State_Active : 0); drawItemStyleOption(painter, widget, activeState | QStyle::State_Enabled | @@ -118,21 +124,11 @@ void KItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* o QStyle::State_Item); } - if (isCurrent()) { + if (m_current && m_editedRole.isEmpty()) { QStyleOptionFocusRect focusRectOption; - focusRectOption.initFrom(widget); - - const QRect iconBounds = iconRect().toRect(); - const QRect textBounds = textRect().toRect(); - if (iconBounds.bottom() > textBounds.top()) { - focusRectOption.rect = textBounds; - } else { - // See KItemListWidget::drawItemStyleOption(): The selection rectangle - // gets decreased. - focusRectOption.rect = textBounds.adjusted(1, 1, -1, -1); - } - - focusRectOption.state = QStyle::State_Enabled | QStyle::State_Item; + initStyleOption(&focusRectOption); + focusRectOption.rect = textFocusRect().toRect(); + focusRectOption.state = QStyle::State_Enabled | QStyle::State_Item | QStyle::State_KeyboardFocusChange; if (m_selected) { focusRectOption.state |= QStyle::State_Selected; } @@ -166,7 +162,9 @@ void KItemListWidget::setVisibleRoles(const QList& roles) { const QList previousRoles = m_visibleRoles; m_visibleRoles = roles; + visibleRolesChanged(roles, previousRoles); + update(); } QList KItemListWidget::visibleRoles() const @@ -174,25 +172,33 @@ QList KItemListWidget::visibleRoles() const return m_visibleRoles; } -void KItemListWidget::setVisibleRolesSizes(const QHash rolesSizes) + +void KItemListWidget::setColumnWidth(const QByteArray& role, qreal width) { - const QHash previousRolesSizes = m_visibleRolesSizes; - m_visibleRolesSizes = rolesSizes; - visibleRolesSizesChanged(rolesSizes, previousRolesSizes); + const qreal previousWidth = m_columnWidths.value(role); + if (previousWidth != width) { + m_columnWidths.insert(role, width); + columnWidthChanged(role, width, previousWidth); + update(); + } } -QHash KItemListWidget::visibleRolesSizes() const +qreal KItemListWidget::columnWidth(const QByteArray& role) const { - return m_visibleRolesSizes; + return m_columnWidths.value(role); } void KItemListWidget::setStyleOption(const KItemListStyleOption& option) { + if (m_styleOption == option) { + return; + } + const KItemListStyleOption previous = m_styleOption; clearHoverCache(); m_styleOption = option; - styleOptionChanged(option, previous); + update(); } const KItemListStyleOption& KItemListWidget::styleOption() const @@ -207,7 +213,6 @@ void KItemListWidget::setSelected(bool selected) if (m_selectionToggle) { m_selectionToggle->setChecked(selected); } - selectedChanged(selected); update(); } @@ -222,7 +227,6 @@ void KItemListWidget::setCurrent(bool current) { if (m_current != current) { m_current = current; - currentChanged(current); update(); } @@ -243,8 +247,9 @@ void KItemListWidget::setHovered(bool hovered) if (!m_hoverAnimation) { m_hoverAnimation = new QPropertyAnimation(this, "hoverOpacity", this); - m_hoverAnimation->setDuration(200); - connect(m_hoverAnimation, SIGNAL(finished()), this, SLOT(slotHoverAnimationFinished())); + const int duration = style()->styleHint(QStyle::SH_Widget_Animate) ? 200 : 1; + m_hoverAnimation->setDuration(duration); + connect(m_hoverAnimation, &QPropertyAnimation::finished, this, &KItemListWidget::slotHoverAnimationFinished); } m_hoverAnimation->stop(); @@ -263,7 +268,6 @@ void KItemListWidget::setHovered(bool hovered) m_hoverAnimation->start(); hoveredChanged(hovered); - update(); } @@ -272,18 +276,25 @@ bool KItemListWidget::isHovered() const return m_hovered; } -void KItemListWidget::setAlternatingBackgroundColors(bool enable) +void KItemListWidget::setHoverPosition(const QPointF& pos) +{ + if (m_selectionToggle) { + m_selectionToggle->setHovered(selectionToggleRect().contains(pos)); + } +} + +void KItemListWidget::setAlternateBackground(bool enable) { - if (m_alternatingBackgroundColors != enable) { - m_alternatingBackgroundColors = enable; - alternatingBackgroundColorsChanged(enable); + if (m_alternateBackground != enable) { + m_alternateBackground = enable; + alternateBackgroundChanged(enable); update(); } } -bool KItemListWidget::alternatingBackgroundColors() const +bool KItemListWidget::alternateBackground() const { - return m_alternatingBackgroundColors; + return m_alternateBackground; } void KItemListWidget::setEnabledSelectionToggle(bool enable) @@ -299,6 +310,33 @@ bool KItemListWidget::enabledSelectionToggle() const return m_enabledSelectionToggle; } +void KItemListWidget::setSiblingsInformation(const QBitArray& siblings) +{ + const QBitArray previous = m_siblingsInfo; + m_siblingsInfo = siblings; + siblingsInformationChanged(m_siblingsInfo, previous); + update(); +} + +QBitArray KItemListWidget::siblingsInformation() const +{ + return m_siblingsInfo; +} + +void KItemListWidget::setEditedRole(const QByteArray& role) +{ + if (m_editedRole != role) { + const QByteArray previous = m_editedRole; + m_editedRole = role; + editedRoleChanged(role, previous); + } +} + +QByteArray KItemListWidget::editedRole() const +{ + return m_editedRole; +} + bool KItemListWidget::contains(const QPointF& point) const { if (!QGraphicsWidget::contains(point)) { @@ -311,6 +349,11 @@ bool KItemListWidget::contains(const QPointF& point) const selectionToggleRect().contains(point); } +QRectF KItemListWidget::textFocusRect() const +{ + return textRect(); +} + QRectF KItemListWidget::selectionToggleRect() const { return QRectF(); @@ -321,62 +364,103 @@ QRectF KItemListWidget::expansionToggleRect() const return QRectF(); } +QPixmap KItemListWidget::createDragPixmap(const QStyleOptionGraphicsItem* option, + QWidget* widget) +{ + QPixmap pixmap(size().toSize() * widget->devicePixelRatio()); + pixmap.setDevicePixelRatio(widget->devicePixelRatio()); + pixmap.fill(Qt::transparent); + + QPainter painter(&pixmap); + + const bool oldAlternateBackground = m_alternateBackground; + const bool wasSelected = m_selected; + const bool wasHovered = m_hovered; + + setAlternateBackground(false); + setHovered(false); + + paint(&painter, option, widget); + + setAlternateBackground(oldAlternateBackground); + setSelected(wasSelected); + setHovered(wasHovered); + + return pixmap; +} + void KItemListWidget::dataChanged(const QHash& current, const QSet& roles) { - Q_UNUSED(current); - Q_UNUSED(roles); - update(); + Q_UNUSED(current) + Q_UNUSED(roles) } void KItemListWidget::visibleRolesChanged(const QList& current, const QList& previous) { - Q_UNUSED(current); - Q_UNUSED(previous); - update(); + Q_UNUSED(current) + Q_UNUSED(previous) } -void KItemListWidget::visibleRolesSizesChanged(const QHash& current, - const QHash& previous) +void KItemListWidget::columnWidthChanged(const QByteArray& role, + qreal current, + qreal previous) { - Q_UNUSED(current); - Q_UNUSED(previous); - update(); + Q_UNUSED(role) + Q_UNUSED(current) + Q_UNUSED(previous) } void KItemListWidget::styleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) { - Q_UNUSED(current); - Q_UNUSED(previous); - update(); + Q_UNUSED(current) + Q_UNUSED(previous) } void KItemListWidget::currentChanged(bool current) { - Q_UNUSED(current); + Q_UNUSED(current) } void KItemListWidget::selectedChanged(bool selected) { - Q_UNUSED(selected); + Q_UNUSED(selected) } void KItemListWidget::hoveredChanged(bool hovered) { - Q_UNUSED(hovered); + Q_UNUSED(hovered) +} + +void KItemListWidget::alternateBackgroundChanged(bool enabled) +{ + Q_UNUSED(enabled) +} + +void KItemListWidget::siblingsInformationChanged(const QBitArray& current, const QBitArray& previous) +{ + Q_UNUSED(current) + Q_UNUSED(previous) } -void KItemListWidget::alternatingBackgroundColorsChanged(bool enabled) +void KItemListWidget::editedRoleChanged(const QByteArray& current, const QByteArray& previous) { - Q_UNUSED(enabled); + Q_UNUSED(current) + Q_UNUSED(previous) } void KItemListWidget::resizeEvent(QGraphicsSceneResizeEvent* event) { QGraphicsWidget::resizeEvent(event); clearHoverCache(); + + if (m_selectionToggle) { + const QRectF& toggleRect = selectionToggleRect(); + m_selectionToggle->setPos(toggleRect.topLeft()); + m_selectionToggle->resize(toggleRect.size()); + } } qreal KItemListWidget::hoverOpacity() const @@ -386,9 +470,9 @@ qreal KItemListWidget::hoverOpacity() const void KItemListWidget::slotHoverAnimationFinished() { - if (!m_hovered) { - delete m_selectionToggle; - m_selectionToggle = 0; + if (!m_hovered && m_selectionToggle) { + m_selectionToggle->deleteLater(); + m_selectionToggle = nullptr; } } @@ -416,7 +500,7 @@ void KItemListWidget::setHoverOpacity(qreal opacity) if (m_hoverOpacity <= 0.0) { delete m_hoverCache; - m_hoverCache = 0; + m_hoverCache = nullptr; } update(); @@ -425,30 +509,17 @@ void KItemListWidget::setHoverOpacity(qreal opacity) void KItemListWidget::clearHoverCache() { delete m_hoverCache; - m_hoverCache = 0; + m_hoverCache = nullptr; } void KItemListWidget::drawItemStyleOption(QPainter* painter, QWidget* widget, QStyle::State styleState) { - const QRect iconBounds = iconRect().toRect(); - const QRect textBounds = textRect().toRect(); - - QStyleOptionViewItemV4 viewItemOption; - viewItemOption.initFrom(widget); + QStyleOptionViewItem viewItemOption; + initStyleOption(&viewItemOption); viewItemOption.state = styleState; - viewItemOption.viewItemPosition = QStyleOptionViewItemV4::OnlyOne; + viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; - - if (iconBounds.bottom() > textBounds.top()) { - viewItemOption.rect = iconBounds | textBounds; - widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &viewItemOption, painter, widget); - } else { - viewItemOption.rect = iconBounds; - widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &viewItemOption, painter, widget); - - viewItemOption.rect = textBounds.adjusted(1, 1, -1, -1); - widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &viewItemOption, painter, widget); - } + viewItemOption.rect = selectionRect().toRect(); + style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &viewItemOption, painter, widget); } -#include "kitemlistwidget.moc"