diff --git a/src/legend/legendlayout.cpp b/src/legend/legendlayout.cpp index 53c9654..e8ce113 100644 --- a/src/legend/legendlayout.cpp +++ b/src/legend/legendlayout.cpp @@ -20,7 +20,7 @@ #include "legendlayout_p.h" #include "chartpresenter_p.h" -#include "legendmarker_p.h" +//#include "legendmarker_p.h" #include "qlegend_p.h" #include "chartlayout_p.h" @@ -118,7 +118,6 @@ void LegendLayout::setAttachedGeometry(const QRectF &rect) QSizeF size(0, 0); -// if( m_legend->d_ptr->markers().isEmpty()) return; if (m_legend->d_ptr->legendMarkers().isEmpty()) { return; } @@ -135,24 +134,9 @@ void LegendLayout::setAttachedGeometry(const QRectF &rect) case Qt::AlignTop: case Qt::AlignBottom: { 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); - } - } - */ -// New markers -->> foreach (QLegendMarker* marker, m_legend->d_ptr->legendMarkers()) { LegendMarkerItem* item = marker->d_ptr->item(); if (item->isVisible()) { -// LegendMarkerItem* item = marker->d_ptr.data()->item(); item->setGeometry(geometry); item->setPos(point.x(),geometry.height()/2 - item->boundingRect().height()/2); const QRectF& rect = item->boundingRect(); @@ -162,7 +146,6 @@ void LegendLayout::setAttachedGeometry(const QRectF &rect) point.setX(point.x() + w); } } -// <<-- New markers if (m_width < geometry.width()) m_legend->d_ptr->items()->setPos(geometry.width() / 2 - m_width / 2, geometry.top()); else @@ -173,24 +156,9 @@ void LegendLayout::setAttachedGeometry(const QRectF &rect) 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); - const QRectF& rect = marker->boundingRect(); - qreal h = rect.height(); - size = size.expandedTo(rect.size()); - m_height+=h; - point.setY(point.y() + h); - } - } -*/ -// New markers -->> foreach (QLegendMarker* marker, m_legend->d_ptr->legendMarkers()) { LegendMarkerItem* item = marker->d_ptr->item(); if (item->isVisible()) { -// LegendMarkerItem* item = marker->d_ptr->item(); item->setGeometry(geometry); item->setPos(point); const QRectF& rect = item->boundingRect(); @@ -200,7 +168,6 @@ void LegendLayout::setAttachedGeometry(const QRectF &rect) point.setY(point.y() + h); } } -// <<--- New markers if (m_height < geometry.height()) m_legend->d_ptr->items()->setPos(geometry.left(), geometry.height() / 2 - m_height / 2); @@ -236,7 +203,6 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) QSizeF size(0, 0); -// QList markers = m_legend->d_ptr->markers(); QList markers = m_legend->d_ptr->legendMarkers(); if (markers.isEmpty()) @@ -248,31 +214,8 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) 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; - } - } - } - */ -// QLegendMarker *marker = markers.at(i); LegendMarkerItem *item = markers.at(i)->d_ptr->item(); if (item->isVisible()) { -// LegendMarkerItem *item = marker->d_ptr->item(); item->setGeometry(geometry); item->setPos(point.x(),point.y()); const QRectF& boundingRect = item->boundingRect(); @@ -304,28 +247,6 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) 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; - } - } - } - */ -// QLegendMarker *marker = markers.at(i); LegendMarkerItem *item = markers.at(i)->d_ptr->item(); if (item->isVisible()) { item->setGeometry(geometry); @@ -346,12 +267,12 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) } } } - m_legend->d_ptr->items()->setPos(geometry.topLeft()); + 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; + m_minOffsetX = -left; + m_minOffsetY = -m_height + geometry.height() - top; + m_maxOffsetX = m_width - geometry.width() - right; + m_maxOffsetY = -bottom; } break; case Qt::AlignLeft: { @@ -360,32 +281,8 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) 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; - } - } - } - */ -// QLegendMarker *marker = markers.at(i); LegendMarkerItem *item = markers.at(i)->d_ptr->item(); if (item->isVisible()) { -// LegendMarkerItem *item = marker->d_ptr->item(); item->setGeometry(geometry); const QRectF& boundingRect = item->boundingRect(); qreal w = boundingRect.width(); @@ -405,13 +302,13 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) } } } - m_width += maxWidth; - m_legend->d_ptr->items()->setPos(geometry.topLeft()); + 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; + m_minOffsetX = -left; + m_minOffsetY = -top; + m_maxOffsetX = m_width - geometry.width() - right; + m_maxOffsetY = m_height - geometry.height() - bottom; } break; case Qt::AlignRight: { @@ -420,32 +317,8 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) 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; - } - } - } - */ -// QLegendMarker *marker = markers.at(i); LegendMarkerItem *item = markers.at(i)->d_ptr->item(); if (item->isVisible()) { -// LegendMarkerItem *item = marker->d_ptr->item(); item->setGeometry(geometry); const QRectF& boundingRect = item->boundingRect(); qreal w = boundingRect.width(); @@ -465,13 +338,13 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) } } } - m_width += maxWidth; - m_legend->d_ptr->items()->setPos(geometry.topLeft()); + 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; + m_minOffsetX = - m_width + geometry.width() - left; + m_minOffsetY = -top; + m_maxOffsetX = - right; + m_maxOffsetY = m_height - geometry.height() - bottom; } break; default: @@ -482,40 +355,6 @@ void LegendLayout::setDettachedGeometry(const QRectF &rect) QSizeF LegendLayout::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const { -/* - QSizeF size(0, 0); - qreal left, top, right, bottom; - getContentsMargins(&left, &top, &right, &bottom); - - if (constraint.isValid()) { - foreach (LegendMarker *marker, m_legend->d_ptr->markers()) - size = size.expandedTo(marker->effectiveSizeHint(which)); - size = size.boundedTo(constraint); - } else if (constraint.width() >= 0) { - qreal width = 0; - qreal height = 0; - foreach (LegendMarker *marker, m_legend->d_ptr->markers()) { - width += marker->effectiveSizeHint(which).width(); - height = qMax(height, marker->effectiveSizeHint(which).height()); - } - - size = QSizeF(qMin(constraint.width(), width), height); - } else if (constraint.height() >= 0) { - qreal width = 0; - qreal height = 0; - foreach (LegendMarker *marker, m_legend->d_ptr->markers()) { - width = qMax(width, marker->effectiveSizeHint(which).width()); - height += height, marker->effectiveSizeHint(which).height(); - } - size = QSizeF(width, qMin(constraint.height(), height)); - } else { - foreach (LegendMarker *marker, m_legend->d_ptr->markers()) - size = size.expandedTo(marker->effectiveSizeHint(which)); - } - size += QSize(left + right, top + bottom); - return size; -*/ -// New markers -->> QSizeF size(0, 0); qreal left, top, right, bottom; getContentsMargins(&left, &top, &right, &bottom); @@ -556,7 +395,6 @@ QSizeF LegendLayout::sizeHint(Qt::SizeHint which, const QSizeF &constraint) cons } size += QSize(left + right, top + bottom); return size; -// <<-- New markers } QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/legend/qlegend.cpp b/src/legend/qlegend.cpp index d0801ea..8b5104e 100644 --- a/src/legend/qlegend.cpp +++ b/src/legend/qlegend.cpp @@ -176,7 +176,7 @@ QLegend::QLegend(QChart *chart): QGraphicsWidget(chart), { setZValue(ChartPresenter::LegendZValue); setFlags(QGraphicsItem::ItemClipsChildrenToShape); - QObject::connect(chart->d_ptr->m_dataset, SIGNAL(seriesAdded(QAbstractSeries*,Domain*)), d_ptr.data(), SLOT(handleSeriesAdded(QAbstractSeries*,Domain*))); + QObject::connect(chart->d_ptr->m_dataset, SIGNAL(seriesAdded(QAbstractSeries*,Domain*)), d_ptr.data(), SLOT(handleSeriesAdded(QAbstractSeries*/*,Domain**/))); QObject::connect(chart->d_ptr->m_dataset, SIGNAL(seriesRemoved(QAbstractSeries*)), d_ptr.data(), SLOT(handleSeriesRemoved(QAbstractSeries*))); // QObject::connect(chart->d_ptr->m_dataset,SIGNAL(seriesUpdated(QAbstractSeries*)),d_ptr.data(),SLOT(handleSeriesUpdated(QAbstractSeries*))); setLayout(d_ptr->m_layout); @@ -476,9 +476,10 @@ int QLegendPrivate::roundness(qreal size) void QLegendPrivate::appendSeries(QAbstractSeries* series) { + // Only allow one instance of series if (!m_series.contains(series)) { m_series.append(series); - handleSeriesAdded(series,0); + handleSeriesAdded(series/*,0*/); } } @@ -490,13 +491,12 @@ void QLegendPrivate::removeSeries(QAbstractSeries* series) } } -void QLegendPrivate::handleSeriesAdded(QAbstractSeries *series, Domain *domain) +void QLegendPrivate::handleSeriesAdded(QAbstractSeries *series/*, Domain *domain*/) { - Q_UNUSED(domain) +// Q_UNUSED(domain) - qDebug() << "QLegendPrivate::handleSeriesAdded"; + qDebug() << "QLegendPrivate::handleSeriesAdded" << series; -// New markers ---> QList newMarkers = series->d_ptr->createLegendMarkers(q_ptr); foreach (QLegendMarker* marker, newMarkers) { marker->setFont(m_font); @@ -507,22 +507,7 @@ void QLegendPrivate::handleSeriesAdded(QAbstractSeries *series, Domain *domain) } QObject::connect(series, SIGNAL(visibleChanged()), this, SLOT(handleSeriesVisibleChanged())); -// <--- New markers - -/* - QList markers = series->d_ptr->createLegendMarker(q_ptr); - - foreach (LegendMarker *marker, markers) { - marker->setFont(m_font); - marker->setLabelBrush(m_labelBrush); - marker->setVisible(series->isVisible()); - m_items->addToGroup(marker); - m_markers << marker; - } -*/ - - QObject::connect(series, SIGNAL(visibleChanged()), this, SLOT(handleSeriesVisibleChanged())); - QObject::connect(series->d_ptr.data(), SIGNAL(countChanged()), this, SLOT(handleCountChanged())); +// QObject::connect(series->d_ptr.data(), SIGNAL(legendPropertiesUpdated(QAbstractSeries*)), this, SLOT(handleLegendPropertiesUpdated(QAbstractSeries*))); m_items->setVisible(false); m_layout->invalidate(); @@ -530,7 +515,8 @@ void QLegendPrivate::handleSeriesAdded(QAbstractSeries *series, Domain *domain) void QLegendPrivate::handleSeriesRemoved(QAbstractSeries *series) { -// New markers ---> + qDebug() << "QLegendPrivate::handleSeriesRemoved" << series; + foreach (QLegendMarker *marker, m_legendMarkers) { if (marker->series() == series) { marker->d_ptr.data()->item()->setVisible(false); @@ -541,18 +527,8 @@ void QLegendPrivate::handleSeriesRemoved(QAbstractSeries *series) } QObject::disconnect(series, SIGNAL(visibleChanged()), this, SLOT(handleSeriesVisibleChanged())); -// <--- New markers +// QObject::disconnect(series->d_ptr.data(), SIGNAL(legendPropertiesUpdated(QAbstractSeries*)), this, SLOT(handleLegendPropertiesUpdated(QAbstractSeries*))); -/* - foreach (LegendMarker *marker, m_markers) { - if (marker->series() == series) { - delete marker; - m_markers.removeAll(marker); - } - } -*/ - QObject::disconnect(series, SIGNAL(visibleChanged()), this, SLOT(handleSeriesVisibleChanged())); - QObject::disconnect(series->d_ptr.data(), SIGNAL(countChanged()), this, SLOT(handleCountChanged())); m_layout->invalidate(); } @@ -561,33 +537,25 @@ void QLegendPrivate::handleSeriesVisibleChanged() QAbstractSeries *series = qobject_cast (sender()); Q_ASSERT(series); -// New markers ---> foreach (QLegendMarker* marker, m_legendMarkers) { if (marker->series() == series) { marker->setVisible(series->isVisible()); } } - -// <--- New markers -/* - foreach (LegendMarker* marker, m_markers) { - if (marker->series() == series) { - marker->setVisible(series->isVisible()); - } -*/ m_layout->invalidate(); } void QLegendPrivate::handleCountChanged() { - // With new markers, the series shoud notify markers directly? - qDebug() << "handleLegendPropertiesUpdated"; + // TODO: With new markers, the series should notify markers directly. + // TODO: This is not a good way to handle updates. + qDebug() << "handleLegendPropertiesUpdated" << series; // Handle new or removed markers // Handle changes of marker pen/brush/label. every property that legend is interested handleSeriesRemoved(series); - Domain domain; - handleSeriesAdded(series, &domain); +// Domain domain; + handleSeriesAdded(series/*, &domain*/); } #include "moc_qlegend.cpp" diff --git a/src/legend/qlegend_p.h b/src/legend/qlegend_p.h index bb2d4e1..8131326 100644 --- a/src/legend/qlegend_p.h +++ b/src/legend/qlegend_p.h @@ -62,7 +62,7 @@ public: void removeSeries(QAbstractSeries* series); public Q_SLOTS: - void handleSeriesAdded(QAbstractSeries *series, Domain *domain); + void handleSeriesAdded(QAbstractSeries *series/*, Domain *domain*/); void handleSeriesRemoved(QAbstractSeries *series); void handleSeriesVisibleChanged(); void handleCountChanged(); diff --git a/src/legend/qlegendmarker.cpp b/src/legend/qlegendmarker.cpp index acab44c..5570745 100644 --- a/src/legend/qlegendmarker.cpp +++ b/src/legend/qlegendmarker.cpp @@ -21,6 +21,7 @@ #include "qlegendmarker.h" #include "qlegendmarker_p.h" #include "legendmarkeritem_p.h" +#include "qlegend.h" #include #include #include @@ -104,8 +105,9 @@ void QLegendMarker::setVisible(bool visible) } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -QLegendMarkerPrivate::QLegendMarkerPrivate(QLegendMarker *q) : - q_ptr(q) +QLegendMarkerPrivate::QLegendMarkerPrivate(QLegendMarker *q, QLegend *legend) : + q_ptr(q), + m_legend(legend) { // qDebug() << "QLegendMarkerPrivate created"; m_item = new LegendMarkerItem(this); @@ -113,7 +115,6 @@ QLegendMarkerPrivate::QLegendMarkerPrivate(QLegendMarker *q) : QLegendMarkerPrivate::~QLegendMarkerPrivate() { -// delete m_item; } void QLegendMarkerPrivate::handleMousePressEvent(QGraphicsSceneEvent *event) diff --git a/src/legend/qlegendmarker.h b/src/legend/qlegendmarker.h index aa2463a..0d5f340 100644 --- a/src/legend/qlegendmarker.h +++ b/src/legend/qlegendmarker.h @@ -31,6 +31,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class QLegendMarkerPrivate; class QAbstractSeries; +class QLegend; // TODO: should this be QAbstractLegendMarker? class QTCOMMERCIALCHART_EXPORT QLegendMarker : public QObject diff --git a/src/legend/qlegendmarker_p.h b/src/legend/qlegendmarker_p.h index f5f2ab0..8b8bd79 100644 --- a/src/legend/qlegendmarker_p.h +++ b/src/legend/qlegendmarker_p.h @@ -58,9 +58,10 @@ class QLegendMarkerPrivate : public QObject Q_OBJECT public: // explicit QLegendMarkerPrivate(QAbstractSeries *series, QLegendMarker *q); - explicit QLegendMarkerPrivate(QLegendMarker *q); + explicit QLegendMarkerPrivate(QLegendMarker *q, QLegend *legend); virtual ~QLegendMarkerPrivate(); + // TODO: remove temporary setters/getters and use the m_item directly from public class via d_ptr void setPen(const QPen &pen); QPen pen() const; @@ -90,14 +91,13 @@ public Q_SLOTS: protected: LegendMarkerItem *m_item; + QLegend* m_legend; private: QLegendMarker *q_ptr; -/* - QLegend* m_legend; -*/ // New legend marker properties +// Moved to item. /* QString m_label; QBrush m_labelBrush; diff --git a/src/legend/qpielegendmarker.cpp b/src/legend/qpielegendmarker.cpp index b8cddd9..6666a00 100644 --- a/src/legend/qpielegendmarker.cpp +++ b/src/legend/qpielegendmarker.cpp @@ -25,8 +25,8 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -QPieLegendMarker::QPieLegendMarker(QPieSeries* series, QPieSlice* slice, QObject *parent) : - QLegendMarker(*new QPieLegendMarkerPrivate(series,slice,this), parent) +QPieLegendMarker::QPieLegendMarker(QPieSeries* series, QPieSlice* slice, QLegend *legend, QObject *parent) : + QLegendMarker(*new QPieLegendMarkerPrivate(this,series,slice,legend), parent) { } @@ -57,10 +57,11 @@ QPieSlice* QPieLegendMarker::peerObject() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -QPieLegendMarkerPrivate::QPieLegendMarkerPrivate(QPieSeries *series, QPieSlice *slice, QPieLegendMarker *q) : - QLegendMarkerPrivate(q), +QPieLegendMarkerPrivate::QPieLegendMarkerPrivate(QPieLegendMarker *q, QPieSeries *series, QPieSlice *slice, QLegend *legend) : + QLegendMarkerPrivate(q,legend), m_series(series), m_slice(slice) +// m_legend(legend) { // qDebug() << "QPieLegendMarkerPrivate created"; QObject::connect(m_slice, SIGNAL(labelChanged()), this, SLOT(updated())); diff --git a/src/legend/qpielegendmarker.h b/src/legend/qpielegendmarker.h index 38f3ebc..df37331 100644 --- a/src/legend/qpielegendmarker.h +++ b/src/legend/qpielegendmarker.h @@ -33,7 +33,7 @@ class QTCOMMERCIALCHART_EXPORT QPieLegendMarker : public QLegendMarker Q_OBJECT public: - explicit QPieLegendMarker(QPieSeries* series, QPieSlice* slice, QObject *parent = 0); + explicit QPieLegendMarker(QPieSeries* series, QPieSlice* slice, QLegend *legend, QObject *parent = 0); virtual ~QPieLegendMarker(); virtual QAbstractSeries* series(); diff --git a/src/legend/qpielegendmarker_p.h b/src/legend/qpielegendmarker_p.h index 8226f99..327b836 100644 --- a/src/legend/qpielegendmarker_p.h +++ b/src/legend/qpielegendmarker_p.h @@ -47,7 +47,7 @@ class QPieLegendMarkerPrivate : public QLegendMarkerPrivate Q_OBJECT public: // explicit QPieLegendMarkerPrivate(QAbstractSeries *series, QPieLegendMarker *q); - explicit QPieLegendMarkerPrivate(QPieSeries *series, QPieSlice *slice, QPieLegendMarker *q); + explicit QPieLegendMarkerPrivate(QPieLegendMarker *q, QPieSeries *series, QPieSlice *slice, QLegend *legend); virtual ~QPieLegendMarkerPrivate(); public Q_SLOTS: