- QGraphicsWidget::hoverLeaveEvent(event);
- if (m_hoveredRoleIndex != -1) {
- m_hoveredRoleIndex = -1;
- update();
- }
-}
-
-void KItemListHeader::hoverMoveEvent(QGraphicsSceneHoverEvent* event)
-{
- QGraphicsWidget::hoverMoveEvent(event);
-
- const QPointF& pos = event->pos();
- updateHoveredRoleIndex(pos);
- if (m_hoveredRoleIndex >= 0 && isAboveRoleGrip(pos, m_hoveredRoleIndex)) {
- setCursor(Qt::SplitHCursor);
- } else {
- unsetCursor();
- }
-}
-
-void KItemListHeader::slotSortRoleChanged(const QByteArray& current, const QByteArray& previous)
-{
- Q_UNUSED(current);
- Q_UNUSED(previous);
- update();
-}
-
-void KItemListHeader::slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous)
-{
- Q_UNUSED(current);
- Q_UNUSED(previous);
- update();
-}
-
-void KItemListHeader::paintRole(QPainter* painter,
- const QByteArray& role,
- const QRectF& rect,
- int orderIndex,
- QWidget* widget) const
-{
- // The following code is based on the code from QHeaderView::paintSection().
- // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
- QStyleOptionHeader option;
- option.section = orderIndex;
- option.state = QStyle::State_None | QStyle::State_Raised | QStyle::State_Horizontal;
- if (isEnabled()) {
- option.state |= QStyle::State_Enabled;
- }
- if (window() && window()->isActiveWindow()) {
- option.state |= QStyle::State_Active;
- }
- if (m_hoveredRoleIndex == orderIndex) {
- option.state |= QStyle::State_MouseOver;
- }
- if (m_pressedRoleIndex == orderIndex) {
- option.state |= QStyle::State_Sunken;
- }
- if (m_model->sortRole() == role) {
- option.sortIndicator = (m_model->sortOrder() == Qt::AscendingOrder) ?
- QStyleOptionHeader::SortDown : QStyleOptionHeader::SortUp;
- }
- option.rect = rect.toRect();
-
- if (m_visibleRoles.count() == 1) {
- option.position = QStyleOptionHeader::OnlyOneSection;
- } else if (orderIndex == 0) {
- option.position = QStyleOptionHeader::Beginning;
- } else if (orderIndex == m_visibleRoles.count() - 1) {
- option.position = QStyleOptionHeader::End;
- } else {
- option.position = QStyleOptionHeader::Middle;
- }
-
- option.orientation = Qt::Horizontal;
- option.selectedPosition = QStyleOptionHeader::NotAdjacent;
- option.text = m_model->roleDescription(role);
-
- style()->drawControl(QStyle::CE_Header, &option, painter, widget);
-}
-
-void KItemListHeader::updatePressedRoleIndex(const QPointF& pos)
-{
- const int pressedIndex = roleIndexAt(pos);
- if (m_pressedRoleIndex != pressedIndex) {
- m_pressedRoleIndex = pressedIndex;
- update();
- }
-}
-
-void KItemListHeader::updateHoveredRoleIndex(const QPointF& pos)
-{
- const int hoverIndex = roleIndexAt(pos);
- if (m_hoveredRoleIndex != hoverIndex) {
- m_hoveredRoleIndex = hoverIndex;
- update();
- }
-}
-
-int KItemListHeader::roleIndexAt(const QPointF& pos) const
-{
- int index = -1;
-
- qreal x = 0;
- foreach (const QByteArray& role, m_visibleRoles) {
- ++index;
- x += m_visibleRolesWidths.value(role);
- if (pos.x() <= x) {
- break;
- }
- }
-
- return index;
-}
-
-bool KItemListHeader::isAboveRoleGrip(const QPointF& pos, int roleIndex) const
-{
- qreal x = 0;
- for (int i = 0; i <= roleIndex; ++i) {
- const QByteArray role = m_visibleRoles[i];
- x += m_visibleRolesWidths.value(role);
- }
-
- const int grip = style()->pixelMetric(QStyle::PM_HeaderGripMargin);
- return pos.x() >= (x - grip) && pos.x() <= x;
-}
-
-QPixmap KItemListHeader::createRolePixmap(int roleIndex) const
-{
- const QByteArray role = m_visibleRoles[roleIndex];
- const qreal roleWidth = m_visibleRolesWidths.value(role);
- const QRect rect(0, 0, roleWidth, size().height());
-
- QImage image(rect.size(), QImage::Format_ARGB32_Premultiplied);
-
- QPainter painter(&image);
- paintRole(&painter, role, rect, roleIndex);
-
- // Apply a highlighting-color
- const QPalette::ColorGroup group = isActiveWindow() ? QPalette::Active : QPalette::Inactive;
- QColor highlightColor = palette().color(group, QPalette::Highlight);
- highlightColor.setAlpha(64);
- painter.fillRect(rect, highlightColor);
-
- // Make the image transparent
- painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
- painter.fillRect(0, 0, image.width(), image.height(), QColor(0, 0, 0, 192));
-
- return QPixmap::fromImage(image);
-}
-
-int KItemListHeader::targetOfMovingRole() const
-{
- const int movingWidth = m_movingRole.pixmap.width();
- const int movingLeft = m_movingRole.x;
- const int movingRight = movingLeft + movingWidth - 1;
-
- int targetIndex = 0;
- qreal targetLeft = 0;
- while (targetIndex < m_visibleRoles.count()) {
- const QByteArray role = m_visibleRoles[targetIndex];
- const qreal targetWidth = m_visibleRolesWidths.value(role);
- const qreal targetRight = targetLeft + targetWidth - 1;
-
- const bool isInTarget = (targetWidth >= movingWidth &&
- movingLeft >= targetLeft &&
- movingRight <= targetRight) ||
- (targetWidth < movingWidth &&
- movingLeft <= targetLeft &&
- movingRight >= targetRight);
-
- if (isInTarget) {
- return targetIndex;
- }
-
- targetLeft += targetWidth;
- ++targetIndex;
- }
-
- return m_movingRole.index;
-}
-
-qreal KItemListHeader::roleXPosition(const QByteArray& role) const
-{
- qreal x = 0;
- foreach (const QByteArray& visibleRole, m_visibleRoles) {
- if (visibleRole == role) {
- return x;
- }
-
- x += m_visibleRolesWidths.value(visibleRole);
- }