From 21f33dedea6dc79c0331c4011752a16197dcc0cf 2012-08-24 12:33:57 From: Michal Klocek Date: 2012-08-24 12:33:57 Subject: [PATCH] Bugfixes for layout * fix division by zero when delta less then 1 in barcategory axis * fix one frame flash with wrong layout of legend during show event * fix wrong margin size when legend in bottom aligment * adds initlization flag so size hints are always corect * fixes wrong minHeight calcualtion in barcateogry axisY --- diff --git a/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp b/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp index e6289e8..e10367f 100644 --- a/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp +++ b/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp @@ -50,6 +50,8 @@ QVector ChartCategoriesAxisX::calculateLayout() const const qreal delta = m_rect.width()/(count); qreal offset =-m_min-0.5; + if(delta<1) return points; + if(offset<=0) { offset = int(offset * m_rect.width()/(m_max - m_min))%int(delta) + delta; } diff --git a/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp b/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp index 2f907a7..45cc954 100644 --- a/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp +++ b/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp @@ -22,6 +22,7 @@ #include "chartpresenter_p.h" #include "qbarcategoryaxis_p.h" #include +#include static int label_padding = 5; @@ -48,6 +49,8 @@ QVector ChartCategoriesAxisY::calculateLayout() const const qreal delta = m_rect.height()/(count); qreal offset = - m_min - 0.5; + if(delta<1) return points; + if(offset<=0) { offset = int(offset * m_rect.height()/(m_max - m_min))%int(delta) + delta; } @@ -132,8 +135,8 @@ void ChartCategoriesAxisY::updateGeometry() height=labelItem->pos().y(); } - m_minWidth+=rect.width(); - m_minHeight=qMax(rect.height()+label_padding,m_minHeight); + m_minWidth=qMax(rect.width()+label_padding,m_minWidth); + m_minHeight+=rect.height(); if ((i+1)%2 && i>1) { QGraphicsRectItem *rectItem = static_cast(shades.at(i/2-1)); diff --git a/src/axis/categoryaxis/chartcategoryaxisx.cpp b/src/axis/categoryaxis/chartcategoryaxisx.cpp index fbcd79f..8127dc5 100644 --- a/src/axis/categoryaxis/chartcategoryaxisx.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisx.cpp @@ -110,7 +110,7 @@ void ChartCategoryAxisX::updateGeometry() } m_minWidth += rect.width(); - m_minHeight = qMax(rect.height(), m_minHeight); + m_minHeight = qMax(rect.height()+ label_padding, m_minHeight); if ((i + 1) % 2 && i > 1) { QGraphicsRectItem *rectItem = static_cast(shades.at(i / 2 - 1)); diff --git a/src/axis/categoryaxis/chartcategoryaxisy.cpp b/src/axis/categoryaxis/chartcategoryaxisy.cpp index b7e41a9..c3ca934 100644 --- a/src/axis/categoryaxis/chartcategoryaxisy.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisy.cpp @@ -26,7 +26,6 @@ #include #include - static int label_padding = 5; QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -69,7 +68,9 @@ void ChartCategoryAxisY::updateGeometry() m_minWidth = 0; m_minHeight = 0; - if(layout.isEmpty()) return; + if(layout.isEmpty()) { + return; + } QCategoryAxis *intervalAxis = qobject_cast(m_chartAxis); diff --git a/src/axis/chartaxis.cpp b/src/axis/chartaxis.cpp index fe4a4df..50137b9 100644 --- a/src/axis/chartaxis.cpp +++ b/src/axis/chartaxis.cpp @@ -52,6 +52,7 @@ ChartAxis::ChartAxis(QAbstractAxis *axis,ChartPresenter *presenter) : ChartEleme QGraphicsSimpleTextItem item; m_font = item.font(); + } ChartAxis::~ChartAxis() diff --git a/src/chartlayout.cpp b/src/chartlayout.cpp index 46e1ced..047f78c 100644 --- a/src/chartlayout.cpp +++ b/src/chartlayout.cpp @@ -20,8 +20,8 @@ #include "chartlayout_p.h" #include "chartpresenter_p.h" +#include "qlegend_p.h" #include "chartaxis_p.h" -#include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -30,7 +30,8 @@ m_presenter(presenter), m_marginBig(60), m_marginSmall(20), m_marginTiny(10), -m_chartMargins(QPointF(m_marginBig,m_marginBig),QPointF(m_marginBig,m_marginBig)) +m_chartMargins(QPointF(m_marginBig,m_marginBig),QPointF(m_marginBig,m_marginBig)), +m_intialized(false) { } @@ -47,6 +48,11 @@ void ChartLayout::setGeometry(const QRectF& rect) QGraphicsLayout::setGeometry(rect); + if(!m_intialized){ + m_presenter->setGeometry(rect); + m_intialized=true; + } + // check title size QSize titleSize = QSize(0,0); @@ -69,12 +75,14 @@ void ChartLayout::setGeometry(const QRectF& rect) QLegend* legend = m_presenter->legend(); + Q_ASSERT(legend); + qreal titlePadding = m_chartMargins.top()/2; QRectF chartMargins = m_chartMargins; // recalculate legend position - if (legend != 0 && legend->isVisible() && legend->isAttachedToChart()) { + if ((legend->isAttachedToChart() && legend->isVisible())) { // Reserve some space for legend switch (legend->alignment()) { @@ -89,7 +97,7 @@ void ChartLayout::setGeometry(const QRectF& rect) } case Qt::AlignBottom: { QSizeF legendSize = legend->effectiveSizeHint(Qt::PreferredSize,QSizeF(rect.width(),-1)); - int bottomMargin = m_marginTiny + m_marginSmall + legendSize.height() + m_marginTiny + axisHeight; + int bottomMargin = m_marginTiny + legendSize.height() + m_marginTiny + axisHeight; chartMargins = QRect(QPoint(m_chartMargins.left(),m_chartMargins.top()),QPoint(m_chartMargins.right(),bottomMargin)); m_legendMargins = QRect(QPoint(chartMargins.left(),rect.height()-bottomMargin + m_marginTiny + axisHeight),QPoint(chartMargins.right(),m_marginTiny + m_marginSmall)); titlePadding = chartMargins.top()/2; @@ -97,7 +105,8 @@ void ChartLayout::setGeometry(const QRectF& rect) } case Qt::AlignLeft: { QSizeF legendSize = legend->effectiveSizeHint(Qt::PreferredSize,QSizeF(-1,rect.height())); - int leftPadding = m_marginTiny + m_marginSmall + legendSize.width() + m_marginTiny + axisWidth; + int leftPadding = m_marginTiny + legendSize.width() + m_marginTiny + axisWidth; + chartMargins = QRect(QPoint(leftPadding,m_chartMargins.top()),QPoint(m_chartMargins.right(),m_chartMargins.bottom())); m_legendMargins = QRect(QPoint(m_marginTiny + m_marginSmall,chartMargins.top()),QPoint(rect.width()-leftPadding + m_marginTiny + axisWidth,chartMargins.bottom())); titlePadding = chartMargins.top()/2; @@ -105,7 +114,7 @@ void ChartLayout::setGeometry(const QRectF& rect) } case Qt::AlignRight: { QSizeF legendSize = legend->effectiveSizeHint(Qt::PreferredSize,QSizeF(-1,rect.height())); - int rightPadding = m_marginTiny + m_marginSmall + legendSize.width() + m_marginTiny; + int rightPadding = m_marginTiny + legendSize.width() + m_marginTiny; chartMargins = QRect(QPoint(m_chartMargins.left(),m_chartMargins.top()),QPoint(rightPadding,m_chartMargins.bottom())); m_legendMargins = QRect(QPoint(rect.width()- rightPadding+ m_marginTiny ,chartMargins.top()),QPoint(m_marginTiny + m_marginSmall,chartMargins.bottom())); titlePadding = chartMargins.top()/2; @@ -137,7 +146,6 @@ void ChartLayout::setGeometry(const QRectF& rect) }else if(chartRect.size().isEmpty()){ m_presenter->setGeometry(QRect(rect.width()/2,rect.height()/2,1,1)); } - } diff --git a/src/chartlayout_p.h b/src/chartlayout_p.h index f9aa3ad..de9cd04 100644 --- a/src/chartlayout_p.h +++ b/src/chartlayout_p.h @@ -50,10 +50,9 @@ private: int m_marginBig; int m_marginSmall; int m_marginTiny; - QRectF m_chartMargins; QRectF m_legendMargins; - + bool m_intialized; }; diff --git a/src/legend/legendlayout.cpp b/src/legend/legendlayout.cpp index cc32a03..3a181f7 100644 --- a/src/legend/legendlayout.cpp +++ b/src/legend/legendlayout.cpp @@ -22,7 +22,6 @@ #include "chartpresenter_p.h" #include "legendmarker_p.h" #include "qlegend_p.h" -#include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -86,15 +85,17 @@ QPointF LegendLayout::offset() const void LegendLayout::setGeometry(const QRectF& rect) { - - QGraphicsLayout::setGeometry(rect); + m_legend->d_ptr->items()->setVisible(m_legend->isVisible()); if(m_legend->isAttachedToChart()) { + setAttachedGeometry(rect); } else { setDettachedGeometry(rect); } + + QGraphicsLayout::setGeometry(rect); } void LegendLayout::setAttachedGeometry(const QRectF& rect) diff --git a/src/legend/qlegend.cpp b/src/legend/qlegend.cpp index 310c540..570c360 100644 --- a/src/legend/qlegend.cpp +++ b/src/legend/qlegend.cpp @@ -403,8 +403,8 @@ bool QLegend::isBackgroundVisible() const */ void QLegend::hideEvent(QHideEvent *event) { - QGraphicsWidget::hideEvent(event); - d_ptr->m_presenter->layout()->invalidate(); + d_ptr->m_presenter->layout()->invalidate(); + QGraphicsWidget::hideEvent(event); } /*! @@ -412,8 +412,8 @@ void QLegend::hideEvent(QHideEvent *event) */ void QLegend::showEvent(QShowEvent *event) { - QGraphicsWidget::showEvent(event); - d_ptr->m_presenter->layout()->invalidate(); + d_ptr->m_presenter->layout()->invalidate(); + QGraphicsWidget::showEvent(event); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/legend/qlegend.h b/src/legend/qlegend.h index 10bdb5b..cace27e 100644 --- a/src/legend/qlegend.h +++ b/src/legend/qlegend.h @@ -86,7 +86,6 @@ public: void setBackgroundVisible(bool visible = true); bool isBackgroundVisible() const; - protected: void hideEvent(QHideEvent *event); void showEvent(QShowEvent *event);