##// END OF EJS Templates
Adds chart parser to cherviewer options
Adds chart parser to cherviewer options

File last commit:

r2131:730996457e67
r2135:c8d5b77f686a
Show More
legendlayout.cpp
384 lines | 12.3 KiB | text/x-c | CppLexer
Michal Klocek
Adds missing license headers
r1535 /****************************************************************************
**
** Copyright (C) 2012 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
Michal Klocek
Refactors layout managment...
r1534 #include "legendlayout_p.h"
#include "chartpresenter_p.h"
#include "legendmarker_p.h"
#include "qlegend_p.h"
Michal Klocek
Refactors layout:...
r2105 #include "chartlayout_p.h"
Michal Klocek
Adds missing license headers
r1535
Michal Klocek
Refactors layout managment...
r1534 QTCOMMERCIALCHART_BEGIN_NAMESPACE
Jani Honkonen
more coding style fixes for src-folder...
r2104 LegendLayout::LegendLayout(QLegend *legend)
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 : m_legend(legend)
Michal Klocek
Refactors layout managment...
r1534 {
}
LegendLayout::~LegendLayout()
{
}
void LegendLayout::setOffset(qreal x, qreal y)
{
bool scrollHorizontal = true;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 switch (m_legend->alignment()) {
case Qt::AlignTop:
case Qt::AlignBottom:
scrollHorizontal = true;
break;
case Qt::AlignLeft:
case Qt::AlignRight:
scrollHorizontal = false;
break;
Michal Klocek
Refactors layout managment...
r1534 }
// If detached, the scrolling direction is vertical instead of horizontal and vice versa.
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (!m_legend->isAttachedToChart())
Michal Klocek
Refactors layout managment...
r1534 scrollHorizontal = !scrollHorizontal;
QRectF boundingRect = geometry();
Michal Klocek
Refactors layout...
r1965 qreal left, top, right, bottom;
getContentsMargins(&left, &top, &right, &bottom);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 boundingRect.adjust(left, top, -right, -bottom);
Michal Klocek
Refactors layout managment...
r1534
// Limit offset between m_minOffset and m_maxOffset
if (scrollHorizontal) {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (m_width <= boundingRect.width())
return;
Michal Klocek
Refactors layout managment...
r1534
if (x != m_offsetX) {
m_offsetX = qBound(m_minOffsetX, x, m_maxOffsetX);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_legend->d_ptr->items()->setPos(-m_offsetX, boundingRect.top());
Michal Klocek
Refactors layout managment...
r1534 }
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 } else {
if (m_height <= boundingRect.height())
return;
Michal Klocek
Refactors layout managment...
r1534
if (y != m_offsetY) {
m_offsetY = qBound(m_minOffsetY, y, m_maxOffsetY);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_legend->d_ptr->items()->setPos(boundingRect.left(), -m_offsetY);
Michal Klocek
Refactors layout managment...
r1534 }
}
}
QPointF LegendLayout::offset() const
{
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 return QPointF(m_offsetX, m_offsetY);
Michal Klocek
Refactors layout managment...
r1534 }
Michal Klocek
Fix title font resize does not invalidate layout
r2088 void LegendLayout::invalidate()
{
QGraphicsLayout::invalidate();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (m_legend->isAttachedToChart())
Michal Klocek
Fix title font resize does not invalidate layout
r2088 m_legend->d_ptr->m_presenter->layout()->invalidate();
}
Jani Honkonen
more coding style fixes for src-folder...
r2104 void LegendLayout::setGeometry(const QRectF &rect)
Michal Klocek
Refactors layout managment...
r1534 {
Michal Klocek
Bugfixes for layout...
r1837 m_legend->d_ptr->items()->setVisible(m_legend->isVisible());
Michal Klocek
Refactors layout managment...
r1534
Michal Klocek
fixes legend not vibile after showEvent
r2082 QGraphicsLayout::setGeometry(rect);
Michal Klocek
Bugfixes for layout...
r1837
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (m_legend->isAttachedToChart())
Michal Klocek
Refactors layout managment...
r1534 setAttachedGeometry(rect);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 else
Michal Klocek
Refactors layout managment...
r1534 setDettachedGeometry(rect);
}
Jani Honkonen
more coding style fixes for src-folder...
r2104 void LegendLayout::setAttachedGeometry(const QRectF &rect)
Michal Klocek
Refactors layout managment...
r1534 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (!rect.isValid())
return;
Michal Klocek
Refactors layout managment...
r1534
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_offsetX = 0;
m_offsetY = 0;
Michal Klocek
Refactors layout managment...
r1534
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QSizeF size(0, 0);
Michal Klocek
Refactors layout managment...
r1534
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (m_legend->d_ptr->markers().isEmpty())
return;
m_width = 0;
m_height = 0;
Michal Klocek
Refactors layout managment...
r1534
Michal Klocek
Refactors layout...
r1965 qreal left, top, right, bottom;
getContentsMargins(&left, &top, &right, &bottom);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QRectF geometry = rect.adjusted(left, top, -right, -bottom);
Michal Klocek
Refactors layout managment...
r1534
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 switch (m_legend->alignment()) {
case Qt::AlignTop:
case Qt::AlignBottom: {
Jani Honkonen
src folder: another massive victory for coding style police
r2131 QPointF point(0, 0);
foreach (LegendMarker *marker, m_legend->d_ptr->markers()) {
if (marker->isVisible()) {
marker->setGeometry(geometry);
marker->setPos(point.x(), geometry.height() / 2 - marker->boundingRect().height() / 2);
const QRectF &rect = marker->boundingRect();
size = size.expandedTo(rect.size());
qreal w = rect.width();
m_width += w;
point.setX(point.x() + w);
Michal Klocek
Refactors layout managment...
r1534 }
}
Jani Honkonen
src folder: another massive victory for coding style police
r2131 if (m_width < geometry.width())
m_legend->d_ptr->items()->setPos(geometry.width() / 2 - m_width / 2, geometry.top());
else
m_legend->d_ptr->items()->setPos(geometry.topLeft());
m_height = size.height();
}
break;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case Qt::AlignLeft:
case Qt::AlignRight: {
QPointF point(0, 0);
foreach (LegendMarker *marker, m_legend->d_ptr->markers()) {
if (marker->isVisible()) {
marker->setGeometry(geometry);
marker->setPos(point);
Jani Honkonen
more coding style fixes for src-folder...
r2104 const QRectF &rect = marker->boundingRect();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 qreal h = rect.height();
size = size.expandedTo(rect.size());
m_height += h;
point.setY(point.y() + h);
Michal Klocek
Refactors layout managment...
r1534 }
}
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097
if (m_height < geometry.height())
m_legend->d_ptr->items()->setPos(geometry.left(), geometry.height() / 2 - m_height / 2);
else
m_legend->d_ptr->items()->setPos(geometry.topLeft());
m_width = size.width();
Michal Klocek
Refactors layout managment...
r1534 break;
Jani Honkonen
src folder: another massive victory for coding style police
r2131 }
Michal Klocek
Refactors layout managment...
r1534 }
Michal Klocek
Refactors layout...
r1965 m_minOffsetX = -left;
m_minOffsetY = - top;
m_maxOffsetX = m_width - geometry.width() - right;
m_maxOffsetY = m_height - geometry.height() - bottom;
Michal Klocek
Refactors layout managment...
r1534 }
Jani Honkonen
more coding style fixes for src-folder...
r2104 void LegendLayout::setDettachedGeometry(const QRectF &rect)
Michal Klocek
Refactors layout managment...
r1534 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (!rect.isValid())
return;
Michal Klocek
Fixes blinking and minimal false size for legend
r1538
Michal Klocek
Refactors layout managment...
r1534 // Detached layout is different.
// In detached mode legend may have multiple rows and columns, so layout calculations
// differ a log from attached mode.
// Also the scrolling logic is bit different.
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_offsetX = 0;
m_offsetY = 0;
Michal Klocek
Refactors layout managment...
r1534
Michal Klocek
Refactors layout...
r1965 qreal left, top, right, bottom;
getContentsMargins(&left, &top, &right, &bottom);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QRectF geometry = rect.adjusted(left, top, -right, -bottom);
Michal Klocek
Refactors layout...
r1965
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QSizeF size(0, 0);
Michal Klocek
Refactors layout managment...
r1534
Michal Klocek
Fixes detach legend layout logic
r1536 QList<LegendMarker *> markers = m_legend->d_ptr->markers();
Michal Klocek
Refactors layout managment...
r1534
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (markers.isEmpty())
return;
Michal Klocek
Refactors layout managment...
r1534
switch (m_legend->alignment()) {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case Qt::AlignTop: {
Jani Honkonen
src folder: another massive victory for coding style police
r2131 QPointF point(0, 0);
m_width = 0;
m_height = 0;
for (int i = 0; i < markers.count(); i++) {
LegendMarker *marker = markers.at(i);
if (marker->isVisible()) {
marker->setGeometry(geometry);
marker->setPos(point.x(), point.y());
const QRectF &boundingRect = marker->boundingRect();
qreal w = boundingRect.width();
qreal h = boundingRect.height();
m_width = qMax(m_width, w);
m_height = qMax(m_height, h);
point.setX(point.x() + w);
if (point.x() + w > geometry.left() + geometry.width() - right) {
// Next item would go off rect.
point.setX(0);
point.setY(point.y() + h);
if (i + 1 < markers.count()) {
m_height += h;
Michal Klocek
Refactors layout managment...
r1534 }
}
}
}
Jani Honkonen
src folder: another massive victory for coding style police
r2131 m_legend->d_ptr->items()->setPos(geometry.topLeft());
m_minOffsetX = -left;
m_minOffsetY = -top;
m_maxOffsetX = m_width - geometry.width() - right;
m_maxOffsetY = m_height - geometry.height() - bottom;
}
break;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case Qt::AlignBottom: {
Jani Honkonen
src folder: another massive victory for coding style police
r2131 QPointF point(0, geometry.height());
m_width = 0;
m_height = 0;
for (int i = 0; i < markers.count(); i++) {
LegendMarker *marker = markers.at(i);
if (marker->isVisible()) {
marker->setGeometry(geometry);
const QRectF &boundingRect = marker->boundingRect();
qreal w = boundingRect.width();
qreal h = boundingRect.height();
m_width = qMax(m_width, w);
m_height = qMax(m_height, h);
marker->setPos(point.x(), point.y() - h);
point.setX(point.x() + w);
if (point.x() + w > geometry.left() + geometry.width() - right) {
// Next item would go off rect.
point.setX(0);
point.setY(point.y() - h);
if (i + 1 < markers.count()) {
m_height += h;
Michal Klocek
Refactors layout managment...
r1534 }
}
}
}
Jani Honkonen
src folder: another massive victory for coding style police
r2131 m_legend->d_ptr->items()->setPos(geometry.topLeft());
m_minOffsetX = -left;
m_minOffsetY = -m_height + geometry.height() - top;
m_maxOffsetX = m_width - geometry.width() - right;
m_maxOffsetY = -bottom;
}
break;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case Qt::AlignLeft: {
Jani Honkonen
src folder: another massive victory for coding style police
r2131 QPointF point(0, 0);
m_width = 0;
m_height = 0;
qreal maxWidth = 0;
for (int i = 0; i < markers.count(); i++) {
LegendMarker *marker = markers.at(i);
if (marker->isVisible()) {
marker->setGeometry(geometry);
const QRectF &boundingRect = marker->boundingRect();
qreal w = boundingRect.width();
qreal h = boundingRect.height();
m_height = qMax(m_height, h);
maxWidth = qMax(maxWidth, w);
marker->setPos(point.x(), point.y());
point.setY(point.y() + h);
if (point.y() + h > geometry.bottom() - bottom) {
// Next item would go off rect.
point.setX(point.x() + maxWidth);
point.setY(0);
if (i + 1 < markers.count()) {
m_width += maxWidth;
maxWidth = 0;
Michal Klocek
Refactors layout managment...
r1534 }
}
}
}
Jani Honkonen
src folder: another massive victory for coding style police
r2131 m_width += maxWidth;
m_legend->d_ptr->items()->setPos(geometry.topLeft());
m_minOffsetX = -left;
m_minOffsetY = -top;
m_maxOffsetX = m_width - geometry.width() - right;
m_maxOffsetY = m_height - geometry.height() - bottom;
}
break;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case Qt::AlignRight: {
Jani Honkonen
src folder: another massive victory for coding style police
r2131 QPointF point(geometry.width(), 0);
m_width = 0;
m_height = 0;
qreal maxWidth = 0;
for (int i = 0; i < markers.count(); i++) {
LegendMarker *marker = markers.at(i);
if (marker->isVisible()) {
marker->setGeometry(geometry);
const QRectF &boundingRect = marker->boundingRect();
qreal w = boundingRect.width();
qreal h = boundingRect.height();
m_height = qMax(m_height, h);
maxWidth = qMax(maxWidth, w);
marker->setPos(point.x() - w, point.y());
point.setY(point.y() + h);
if (point.y() + h > geometry.bottom() - bottom) {
// Next item would go off rect.
point.setX(point.x() - maxWidth);
point.setY(0);
if (i + 1 < markers.count()) {
m_width += maxWidth;
maxWidth = 0;
Michal Klocek
Refactors layout managment...
r1534 }
}
}
}
Jani Honkonen
src folder: another massive victory for coding style police
r2131 m_width += maxWidth;
m_legend->d_ptr->items()->setPos(geometry.topLeft());
m_minOffsetX = - m_width + geometry.width() - left;
m_minOffsetY = -top;
m_maxOffsetX = - right;
m_maxOffsetY = m_height - geometry.height() - bottom;
}
break;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 default:
Michal Klocek
Refactors layout managment...
r1534 break;
}
}
Jani Honkonen
more coding style fixes for src-folder...
r2104 QSizeF LegendLayout::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
Michal Klocek
Refactors layout managment...
r1534 {
QSizeF size(0, 0);
qreal left, top, right, bottom;
getContentsMargins(&left, &top, &right, &bottom);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (constraint.isValid()) {
foreach (LegendMarker *marker, m_legend->d_ptr->markers())
Michal Klocek
Refactors layout managment...
r1534 size = size.expandedTo(marker->effectiveSizeHint(which));
size = size.boundedTo(constraint);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 } else if (constraint.width() >= 0) {
Michal Klocek
Refactors layout managment...
r1534 qreal width = 0;
qreal height = 0;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 foreach (LegendMarker *marker, m_legend->d_ptr->markers()) {
width += marker->effectiveSizeHint(which).width();
height = qMax(height, marker->effectiveSizeHint(which).height());
Michal Klocek
Refactors layout managment...
r1534 }
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 size = QSizeF(qMin(constraint.width(), width), height);
} else if (constraint.height() >= 0) {
Michal Klocek
Refactors layout managment...
r1534 qreal width = 0;
qreal height = 0;
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 foreach (LegendMarker *marker, m_legend->d_ptr->markers()) {
width = qMax(width, marker->effectiveSizeHint(which).width());
height += height, marker->effectiveSizeHint(which).height();
Michal Klocek
Refactors layout managment...
r1534 }
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 size = QSizeF(width, qMin(constraint.height(), height));
} else {
foreach (LegendMarker *marker, m_legend->d_ptr->markers())
Michal Klocek
Refactors layout managment...
r1534 size = size.expandedTo(marker->effectiveSizeHint(which));
}
size += QSize(left + right, top + bottom);
return size;
}
QTCOMMERCIALCHART_END_NAMESPACE