dolphin/src/kitemviews/kitemlistgroupheader.cpp
2012-02-23 17:28:03 +01:00

234 lines
6.7 KiB
C++

/***************************************************************************
* Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
* *
* Based on the Itemviews NG project from Trolltech Labs: *
* http://qt.gitorious.org/qt-labs/itemviews-ng *
* *
* 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. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#include "kitemlistgroupheader.h"
#include "kitemlistview.h"
#include <QGraphicsSceneResizeEvent>
#include <QPainter>
#include <QStyleOptionGraphicsItem>
#include <KDebug>
KItemListGroupHeader::KItemListGroupHeader(QGraphicsWidget* parent) :
QGraphicsWidget(parent, 0),
m_dirtyCache(true),
m_role(),
m_data(),
m_styleOption(),
m_scrollOrientation(Qt::Vertical),
m_itemIndex(-1),
m_lineColor(),
m_roleColor(),
m_roleBounds()
{
}
KItemListGroupHeader::~KItemListGroupHeader()
{
}
void KItemListGroupHeader::setRole(const QByteArray& role)
{
if (m_role != role) {
const QByteArray previous = m_role;
m_role = role;
update();
roleChanged(role, previous);
}
}
QByteArray KItemListGroupHeader::role() const
{
return m_role;
}
void KItemListGroupHeader::setData(const QVariant& data)
{
if (m_data != data) {
const QVariant previous = m_data;
m_data = data;
update();
dataChanged(data, previous);
}
}
QVariant KItemListGroupHeader::data() const
{
return m_data;
}
void KItemListGroupHeader::setStyleOption(const KItemListStyleOption& option)
{
const KItemListStyleOption previous = m_styleOption;
m_styleOption = option;
m_dirtyCache = true;
styleOptionChanged(option, previous);
}
const KItemListStyleOption& KItemListGroupHeader::styleOption() const
{
return m_styleOption;
}
void KItemListGroupHeader::setScrollOrientation(Qt::Orientation orientation)
{
if (m_scrollOrientation != orientation) {
const Qt::Orientation previous = m_scrollOrientation;
m_scrollOrientation = orientation;
if (orientation == Qt::Vertical) {
m_dirtyCache = true;
}
scrollOrientationChanged(orientation, previous);
}
}
void KItemListGroupHeader::setItemIndex(int index)
{
if (m_itemIndex != index) {
const int previous = m_itemIndex;
m_itemIndex = index;
m_dirtyCache = true;
itemIndexChanged(m_itemIndex, previous);
}
}
int KItemListGroupHeader::itemIndex() const
{
return m_itemIndex;
}
Qt::Orientation KItemListGroupHeader::scrollOrientation() const
{
return m_scrollOrientation;
}
void KItemListGroupHeader::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
if (m_dirtyCache) {
updateCache();
}
if (m_itemIndex == 0) {
// No top- or left-line should be drawn for the first group-header
return;
}
painter->setPen(m_lineColor);
if (m_scrollOrientation == Qt::Horizontal) {
painter->drawLine(0, 0, 0, size().height() - 1);
} else {
painter->drawLine(0, 0, size().width() - 1, 0);
}
}
QRectF KItemListGroupHeader::roleBounds() const
{
return m_roleBounds;
}
QColor KItemListGroupHeader::roleColor() const
{
return m_roleColor;
}
void KItemListGroupHeader::roleChanged(const QByteArray& current, const QByteArray& previous)
{
Q_UNUSED(current);
Q_UNUSED(previous);
}
void KItemListGroupHeader::dataChanged(const QVariant& current, const QVariant& previous)
{
Q_UNUSED(current);
Q_UNUSED(previous);
}
void KItemListGroupHeader::styleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous)
{
Q_UNUSED(current);
Q_UNUSED(previous);
}
void KItemListGroupHeader::scrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
{
Q_UNUSED(current);
Q_UNUSED(previous);
}
void KItemListGroupHeader::itemIndexChanged(int current, int previous)
{
Q_UNUSED(current);
Q_UNUSED(previous);
}
void KItemListGroupHeader::resizeEvent(QGraphicsSceneResizeEvent* event)
{
QGraphicsWidget::resizeEvent(event);
if (event->oldSize().height() != event->newSize().height()) {
m_dirtyCache = true;
}
}
void KItemListGroupHeader::updateCache()
{
Q_ASSERT(m_dirtyCache);
// Calculate the role- and line-color. No alphablending is used for
// performance reasons.
const QColor c1 = m_styleOption.palette.text().color();
const QColor c2 = m_styleOption.palette.base().color();
m_lineColor = mixedColor(c1, c2, 10);
m_roleColor = mixedColor(c1, c2, 70);
const int padding = qMax(1, m_styleOption.padding);
const int horizontalMargin = qMax(2, m_styleOption.horizontalMargin);
const QFontMetrics fontMetrics(m_styleOption.font);
const qreal roleHeight = fontMetrics.height();
const int y = (m_scrollOrientation == Qt::Vertical) ? padding : horizontalMargin;
m_roleBounds = QRectF(horizontalMargin + padding,
y,
size().width() - 2 * padding - horizontalMargin,
roleHeight);
m_dirtyCache = false;
}
QColor KItemListGroupHeader::mixedColor(const QColor& c1, const QColor& c2, int c1Percent)
{
Q_ASSERT(c1Percent >= 0 && c1Percent <= 100);
const int c2Percent = 100 - c1Percent;
return QColor((c1.red() * c1Percent + c2.red() * c2Percent) / 100,
(c1.green() * c1Percent + c2.green() * c2Percent) / 100,
(c1.blue() * c1Percent + c2.blue() * c2Percent) / 100);
}
#include "kitemlistgroupheader.moc"