From c04f89af81a0f2e2f6f63cafabd00abd4bb3674f 2012-03-27 13:51:26 From: Michal Klocek Date: 2012-03-27 13:51:26 Subject: [PATCH] Polishing qchart class --- diff --git a/src/chartpresenter.cpp b/src/chartpresenter.cpp index d68269e..be48b8e 100644 --- a/src/chartpresenter.cpp +++ b/src/chartpresenter.cpp @@ -33,7 +33,9 @@ ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(char m_chartTheme(0), m_rect(QRectF(QPoint(0,0),m_chart->size())), m_options(QChart::NoAnimation), - m_themeForce(false) + m_themeForce(false), + m_padding(50), + m_backgroundPadding(10) { createConnections(); setTheme(QChart::ChartThemeDefault,false); @@ -53,16 +55,10 @@ void ChartPresenter::createConnections() QObject::connect(m_dataset,SIGNAL(axisRemoved(QChartAxis*)),this,SLOT(handleAxisRemoved(QChartAxis*))); } - -QRectF ChartPresenter::geometry() const -{ - return m_rect; -} - void ChartPresenter::handleGeometryChanged() { QRectF rect(QPoint(0,0),m_chart->size()); - rect.adjust(m_chart->padding(),m_chart->padding(), -m_chart->padding(), -m_chart->padding()); + rect.adjust(m_padding,m_padding,-m_padding,-m_padding); //rewrite zoom stack /* @@ -328,7 +324,7 @@ void ChartPresenter::zoomIn() void ChartPresenter::zoomIn(const QRectF& rect) { QRectF r = rect.normalized(); - r.translate(-m_chart->padding(), -m_chart->padding()); + r.translate(-m_padding, -m_padding); if(m_animator) { QPointF point(r.center().x()/geometry().width(),r.center().y()/geometry().height()); @@ -349,7 +345,7 @@ void ChartPresenter::zoomOut() QSizeF size = geometry().size(); QRectF rect = geometry(); - rect.translate(-m_chart->padding(), -m_chart->padding()); + rect.translate(-m_padding, -m_padding); m_dataset->zoomOutDomain(rect.adjusted(size.width()/4,size.height()/4,-size.width()/4,-size.height()/4),size); //m_dataset->zoomOutDomain(m_zoomStack[m_zoomIndex-1],geometry().size()); diff --git a/src/chartpresenter_p.h b/src/chartpresenter_p.h index ed78c12..fcb4000 100644 --- a/src/chartpresenter_p.h +++ b/src/chartpresenter_p.h @@ -35,14 +35,13 @@ public: ChartPresenter(QChart* chart,ChartDataSet *dataset); virtual ~ChartPresenter(); - void setMargin(int margin); - int margin() const; - - QRectF geometry() const; - - ChartAnimator* animator() const {return m_animator;} - ChartTheme *chartTheme() { return m_chartTheme; } - ChartDataSet *dataSet() { return m_dataset; } + int padding() const { return m_padding; } + int backgroundPadding() const { return m_backgroundPadding; } + QRectF geometry() const { return m_rect; } + ChartAnimator* animator() const { return m_animator; } + ChartTheme *chartTheme() const { return m_chartTheme; } + ChartDataSet *dataSet() const { return m_dataset; } + QGraphicsItem* rootItem() const { return m_chart; } void setTheme(QChart::ChartTheme theme,bool force = true); QChart::ChartTheme theme(); @@ -50,8 +49,6 @@ public: void setAnimationOptions(QChart::AnimationOptions options); QChart::AnimationOptions animationOptions() const; - QGraphicsItem* rootItem() const {return m_chart;}; - void zoomIn(); void zoomIn(const QRectF& rect); void zoomOut(); @@ -81,6 +78,8 @@ private: QRectF m_rect; QChart::AnimationOptions m_options; bool m_themeForce; + int m_padding; + int m_backgroundPadding; }; diff --git a/src/qchart.cpp b/src/qchart.cpp index 68f3cf5..ccbe14e 100644 --- a/src/qchart.cpp +++ b/src/qchart.cpp @@ -49,7 +49,6 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags), d_ptr(new QChartPrivate(this)) { - d_ptr->m_legend = new QLegend(this); d_ptr->m_dataset = new ChartDataSet(this); d_ptr->m_presenter = new ChartPresenter(this,d_ptr->m_dataset); @@ -111,7 +110,7 @@ void QChart::setBackgroundBrush(const QBrush& brush) QBrush QChart::backgroundBrush() const { - if(!d_ptr->m_backgroundItem) return QBrush(); + if (!d_ptr->m_backgroundItem) return QBrush(); return (d_ptr->m_backgroundItem)->brush(); } @@ -127,7 +126,7 @@ void QChart::setBackgroundPen(const QPen& pen) QPen QChart::backgroundPen() const { - if(!d_ptr->m_backgroundItem) return QPen(); + if (!d_ptr->m_backgroundItem) return QPen(); return d_ptr->m_backgroundItem->pen(); } @@ -146,7 +145,7 @@ void QChart::setTitle(const QString& title) */ QString QChart::title() const { - if(d_ptr->m_titleItem) + if (d_ptr->m_titleItem) return d_ptr->m_titleItem->text(); else return QString(); @@ -177,7 +176,7 @@ void QChart::setTitleBrush(const QBrush &brush) */ QBrush QChart::titleBrush() const { - if(!d_ptr->m_titleItem) return QBrush(); + if (!d_ptr->m_titleItem) return QBrush(); return d_ptr->m_titleItem->brush(); } @@ -212,7 +211,7 @@ void QChart::zoomIn() */ void QChart::zoomIn(const QRectF& rect) { - if(!rect.isValid()) return; + if (!rect.isValid()) return; d_ptr->m_presenter->zoomIn(rect); } @@ -325,35 +324,6 @@ void QChart::scrollDown() d_ptr->m_presenter->scroll(0,-d_ptr->m_presenter->geometry().width()/(axisY()->ticksCount()-1)); } -void QChart::setPadding(int padding) -{ - if(d_ptr->m_padding==padding) { - d_ptr->m_padding = padding; - d_ptr->m_presenter->handleGeometryChanged(); - d_ptr->updateLayout(); - } -} - -int QChart::padding() const -{ - return d_ptr->m_padding; -} - -void QChart::setBackgroundPadding(int padding) -{ - if(d_ptr->m_backgroundPadding!=padding) { - d_ptr->m_backgroundPadding = padding; - d_ptr->updateLayout(); - } -} - -void QChart::setBackgroundDiameter(int diameter) -{ - d_ptr->createChartBackgroundItem(); - d_ptr->m_backgroundItem->setDimeter(diameter); - d_ptr->m_backgroundItem->update(); -} - void QChart::setBackgroundVisible(bool visible) { d_ptr->createChartBackgroundItem(); @@ -362,7 +332,7 @@ void QChart::setBackgroundVisible(bool visible) bool QChart::isBackgroundVisible() const { - if(!d_ptr->m_backgroundItem) return false; + if (!d_ptr->m_backgroundItem) return false; return d_ptr->m_backgroundItem->isVisible(); } @@ -374,9 +344,7 @@ m_backgroundItem(0), m_titleItem(0), m_legend(0), m_dataset(0), -m_presenter(0), -m_padding(50), -m_backgroundPadding(10) +m_presenter(0) { } @@ -388,7 +356,7 @@ QChartPrivate::~QChartPrivate() void QChartPrivate::createChartBackgroundItem() { - if(!m_backgroundItem) { + if (!m_backgroundItem) { m_backgroundItem = new ChartBackground(q_ptr); m_backgroundItem->setPen(Qt::NoPen); m_backgroundItem->setZValue(ChartPresenter::BackgroundZValue); @@ -397,7 +365,7 @@ void QChartPrivate::createChartBackgroundItem() void QChartPrivate::createChartTitleItem() { - if(!m_titleItem) { + if (!m_titleItem) { m_titleItem = new QGraphicsSimpleTextItem(q_ptr); m_titleItem->setZValue(ChartPresenter::BackgroundZValue); } @@ -405,26 +373,27 @@ void QChartPrivate::createChartTitleItem() void QChartPrivate::updateLegendLayout() { - QRectF plotRect = m_rect.adjusted(m_padding,m_padding, -m_padding, -m_padding); + int padding = m_presenter->padding(); + QRectF plotRect = m_rect.adjusted(padding,padding,-padding,-padding); QRectF legendRect; switch (m_legend->preferredLayout()) { case QLegend::PreferredLayoutTop: { // legendRect = plotRect.adjusted(m_padding,0,-m_padding,-m_padding - plotRect.height()); - legendRect = plotRect.adjusted(0,0,0,-m_padding - plotRect.height()); + legendRect = plotRect.adjusted(0,0,0,-padding - plotRect.height()); break; } case QLegend::PreferredLayoutBottom: { - legendRect = plotRect.adjusted(m_padding,m_padding + plotRect.height(),-m_padding,0); + legendRect = plotRect.adjusted(padding,padding + plotRect.height(),-padding,0); break; } case QLegend::PreferredLayoutLeft: { - legendRect = plotRect.adjusted(0,m_padding,-m_padding - plotRect.width(),-m_padding); + legendRect = plotRect.adjusted(0,padding,-padding - plotRect.width(),-padding); break; } case QLegend::PreferredLayoutRight: { - legendRect = plotRect.adjusted(m_padding + plotRect.width(),m_padding,0,-m_padding); + legendRect = plotRect.adjusted(padding + plotRect.width(),padding,0,-padding); break; } default: { @@ -439,19 +408,22 @@ void QChartPrivate::updateLegendLayout() void QChartPrivate::updateLayout() { - if(!m_rect.isValid()) return; + if (!m_rect.isValid()) return; + + int padding = m_presenter->padding(); + int backgroundPadding = m_presenter->backgroundPadding(); - QRectF rect = m_rect.adjusted(m_padding,m_padding, -m_padding, -m_padding); + QRectF rect = m_rect.adjusted(padding,padding,-padding,-padding); // recalculate title position if (m_titleItem) { QPointF center = m_rect.center() -m_titleItem->boundingRect().center(); - m_titleItem->setPos(center.x(),m_rect.top()/2 + m_padding/2); + m_titleItem->setPos(center.x(),m_rect.top()/2 + padding/2); } //recalculate background gradient if (m_backgroundItem) { - m_backgroundItem->setRect(m_rect.adjusted(m_backgroundPadding,m_backgroundPadding, -m_backgroundPadding, -m_backgroundPadding)); + m_backgroundItem->setRect(m_rect.adjusted(backgroundPadding,backgroundPadding, -backgroundPadding, -backgroundPadding)); } // recalculate legend position diff --git a/src/qchart.h b/src/qchart.h index 2b85115..6207046 100644 --- a/src/qchart.h +++ b/src/qchart.h @@ -1,3 +1,23 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + #ifndef QCHART_H #define QCHART_H @@ -8,7 +28,6 @@ class QGraphicsSceneResizeEvent; QTCOMMERCIALCHART_BEGIN_NAMESPACE -class Axis; class QSeries; class QChartAxis; class QLegend; @@ -30,13 +49,14 @@ public: ChartThemeCount }; - enum AnimationOption { + enum AnimationOption { NoAnimation = 0x0, GridAxisAnimations = 0x1, SeriesAnimations =0x2, AllAnimations = 0x3 - }; - Q_DECLARE_FLAGS(AnimationOptions, AnimationOption) + }; + + Q_DECLARE_FLAGS(AnimationOptions, AnimationOption) public: QChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); @@ -81,20 +101,12 @@ public: QLegend* takeLegend(); void giveLegend(QLegend* legend); - int padding() const; - protected: void resizeEvent(QGraphicsSceneResizeEvent *event); protected: QScopedPointer d_ptr; - -private: - void setPadding(int padding); - void setBackgroundPadding(int padding); - void setBackgroundDiameter(int diameter); - -private: + friend class QChartView; Q_DISABLE_COPY(QChart); }; diff --git a/src/qchart_p.h b/src/qchart_p.h index 34ba1e2..ea802e4 100644 --- a/src/qchart_p.h +++ b/src/qchart_p.h @@ -30,8 +30,6 @@ public: QLegend* m_legend; ChartDataSet *m_dataset; ChartPresenter *m_presenter; - int m_padding; - int m_backgroundPadding; Q_DECLARE_PUBLIC(QChart); }; diff --git a/src/qchartview.cpp b/src/qchartview.cpp index 639128e..479b306 100644 --- a/src/qchartview.cpp +++ b/src/qchartview.cpp @@ -1,11 +1,11 @@ #include "qchartview.h" #include "qchart.h" +#include "qchart_p.h" #include "qchartaxis.h" #include #include #include #include -#include /*! \enum QChartView::RubberBandPolicy @@ -232,7 +232,7 @@ void QChartView::mousePressEvent(QMouseEvent *event) { if(m_rubberBand && m_rubberBand->isEnabled() && event->button() == Qt::LeftButton) { - int padding = m_chart->padding(); + int padding = m_chart->d_ptr->m_presenter->padding(); QRect rect(padding, padding, width() - 2 * padding, height() - 2 * padding); if (rect.contains(event->pos())) { @@ -254,7 +254,7 @@ void QChartView::mousePressEvent(QMouseEvent *event) void QChartView::mouseMoveEvent(QMouseEvent *event) { if(m_rubberBand && m_rubberBand->isVisible()) { - int padding = m_chart->padding(); + int padding = m_chart->d_ptr->m_presenter->padding(); QRect rect(padding, padding, width() - 2 * padding, height() - 2 * padding); int width = event->pos().x() - m_rubberBandOrigin.x(); int height = event->pos().y() - m_rubberBandOrigin.y();