KItemListHeaderWidget::KItemListHeaderWidget(QGraphicsWidget* parent) :
QGraphicsWidget(parent),
- m_automaticColumnResizing(false),
+ m_automaticColumnResizing(true),
m_model(0),
+ m_offset(0),
m_columns(),
- m_columnsWidths(),
+ m_columnWidths(),
+ m_preferredColumnWidths(),
m_hoveredRoleIndex(-1),
m_pressedRoleIndex(-1),
m_roleOperation(NoRoleOperation),
m_movingRole.index = -1;
setAcceptHoverEvents(true);
-
- QStyleOptionHeader option;
- const QSize headerSize = style()->sizeFromContents(QStyle::CT_HeaderSection, &option, QSize());
- resize(0, headerSize.height());
}
KItemListHeaderWidget::~KItemListHeaderWidget()
void KItemListHeaderWidget::setColumns(const QList<QByteArray>& roles)
{
+ foreach (const QByteArray& role, roles) {
+ if (!m_columnWidths.contains(role)) {
+ m_columnWidths.remove(role);
+ m_preferredColumnWidths.remove(role);
+ }
+ }
+
m_columns = roles;
update();
}
width = minWidth;
}
- if (m_columnsWidths.value(role) != width) {
- m_columnsWidths.insert(role, width);
+ if (m_columnWidths.value(role) != width) {
+ m_columnWidths.insert(role, width);
update();
}
}
qreal KItemListHeaderWidget::columnWidth(const QByteArray& role) const
{
- return m_columnsWidths.value(role);
+ return m_columnWidths.value(role);
+}
+
+void KItemListHeaderWidget::setPreferredColumnWidth(const QByteArray& role, qreal width)
+{
+ m_preferredColumnWidths.insert(role, width);
+}
+
+qreal KItemListHeaderWidget::preferredColumnWidth(const QByteArray& role) const
+{
+ return m_preferredColumnWidths.value(role);
+}
+
+void KItemListHeaderWidget::setOffset(qreal offset)
+{
+ if (m_offset != offset) {
+ m_offset = offset;
+ update();
+ }
+}
+
+qreal KItemListHeaderWidget::offset() const
+{
+ return m_offset;
}
qreal KItemListHeaderWidget::minimumColumnWidth() const
painter->setFont(font());
painter->setPen(palette().text().color());
- qreal x = 0;
+ qreal x = -m_offset;
int orderIndex = 0;
foreach (const QByteArray& role, m_columns) {
- const qreal roleWidth = m_columnsWidths.value(role);
+ const qreal roleWidth = m_columnWidths.value(role);
const QRectF rect(x, 0, roleWidth, size().height());
paintRole(painter, role, rect, orderIndex, widget);
x += roleWidth;
} else {
m_movingRole.pixmap = createRolePixmap(roleIndex);
- qreal roleX = 0;
+ qreal roleX = -m_offset;
for (int i = 0; i < roleIndex; ++i) {
const QByteArray role = m_columns[i];
- roleX += m_columnsWidths.value(role);
+ roleX += m_columnWidths.value(role);
}
m_movingRole.xDec = event->pos().x() - roleX;
case ResizeRoleOperation: {
const QByteArray pressedRole = m_columns[m_pressedRoleIndex];
- qreal previousWidth = m_columnsWidths.value(pressedRole);
+ qreal previousWidth = m_columnWidths.value(pressedRole);
qreal currentWidth = previousWidth;
currentWidth += event->pos().x() - event->lastPos().x();
currentWidth = qMax(minimumColumnWidth(), currentWidth);
- m_columnsWidths.insert(pressedRole, currentWidth);
+ m_columnWidths.insert(pressedRole, currentWidth);
update();
emit columnWidthChanged(pressedRole, currentWidth, previousWidth);
}
void KItemListHeaderWidget::paintRole(QPainter* painter,
- const QByteArray& role,
- const QRectF& rect,
- int orderIndex,
- QWidget* widget) const
+ 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).
{
int index = -1;
- qreal x = 0;
+ qreal x = -m_offset;
foreach (const QByteArray& role, m_columns) {
++index;
- x += m_columnsWidths.value(role);
+ x += m_columnWidths.value(role);
if (pos.x() <= x) {
break;
}
bool KItemListHeaderWidget::isAboveRoleGrip(const QPointF& pos, int roleIndex) const
{
- qreal x = 0;
+ qreal x = -m_offset;
for (int i = 0; i <= roleIndex; ++i) {
const QByteArray role = m_columns[i];
- x += m_columnsWidths.value(role);
+ x += m_columnWidths.value(role);
}
const int grip = style()->pixelMetric(QStyle::PM_HeaderGripMargin);
QPixmap KItemListHeaderWidget::createRolePixmap(int roleIndex) const
{
const QByteArray role = m_columns[roleIndex];
- const qreal roleWidth = m_columnsWidths.value(role);
+ const qreal roleWidth = m_columnWidths.value(role);
const QRect rect(0, 0, roleWidth, size().height());
QImage image(rect.size(), QImage::Format_ARGB32_Premultiplied);
const int movingRight = movingLeft + movingWidth - 1;
int targetIndex = 0;
- qreal targetLeft = 0;
+ qreal targetLeft = -m_offset;
while (targetIndex < m_columns.count()) {
const QByteArray role = m_columns[targetIndex];
- const qreal targetWidth = m_columnsWidths.value(role);
+ const qreal targetWidth = m_columnWidths.value(role);
const qreal targetRight = targetLeft + targetWidth - 1;
const bool isInTarget = (targetWidth >= movingWidth &&
qreal KItemListHeaderWidget::roleXPosition(const QByteArray& role) const
{
- qreal x = 0;
+ qreal x = -m_offset;
foreach (const QByteArray& visibleRole, m_columns) {
if (visibleRole == role) {
return x;
}
- x += m_columnsWidths.value(visibleRole);
+ x += m_columnWidths.value(visibleRole);
}
return -1;