@@ -67,6 +67,16 QAreaLegendMarkerPrivate::~QAreaLegendMarkerPrivate() | |||||
67 | QObject::disconnect(m_series, SIGNAL(nameChanged()), this, SLOT(updated())); |
|
67 | QObject::disconnect(m_series, SIGNAL(nameChanged()), this, SLOT(updated())); | |
68 | } |
|
68 | } | |
69 |
|
69 | |||
|
70 | QAreaSeries* QAreaLegendMarkerPrivate::series() | |||
|
71 | { | |||
|
72 | return m_series; | |||
|
73 | } | |||
|
74 | ||||
|
75 | QObject* QAreaLegendMarkerPrivate::relatedObject() | |||
|
76 | { | |||
|
77 | return m_series; | |||
|
78 | } | |||
|
79 | ||||
70 | void QAreaLegendMarkerPrivate::updated() |
|
80 | void QAreaLegendMarkerPrivate::updated() | |
71 | { |
|
81 | { | |
72 | m_item->setBrush(m_series->brush()); |
|
82 | m_item->setBrush(m_series->brush()); |
@@ -48,6 +48,10 public: | |||||
48 | explicit QAreaLegendMarkerPrivate(QAreaLegendMarker *q, QAreaSeries *series, QLegend *legend); |
|
48 | explicit QAreaLegendMarkerPrivate(QAreaLegendMarker *q, QAreaSeries *series, QLegend *legend); | |
49 | virtual ~QAreaLegendMarkerPrivate(); |
|
49 | virtual ~QAreaLegendMarkerPrivate(); | |
50 |
|
50 | |||
|
51 | // internal | |||
|
52 | virtual QAreaSeries* series(); | |||
|
53 | virtual QObject* relatedObject(); | |||
|
54 | ||||
51 | public Q_SLOTS: |
|
55 | public Q_SLOTS: | |
52 | virtual void updated(); |
|
56 | virtual void updated(); | |
53 |
|
57 |
@@ -76,6 +76,16 QBarLegendMarkerPrivate::~QBarLegendMarkerPrivate() | |||||
76 | QObject::disconnect(m_barset, SIGNAL(penChanged()), this, SLOT(updated())); |
|
76 | QObject::disconnect(m_barset, SIGNAL(penChanged()), this, SLOT(updated())); | |
77 | } |
|
77 | } | |
78 |
|
78 | |||
|
79 | QAbstractBarSeries* QBarLegendMarkerPrivate::series() | |||
|
80 | { | |||
|
81 | return m_series; | |||
|
82 | } | |||
|
83 | ||||
|
84 | QObject* QBarLegendMarkerPrivate::relatedObject() | |||
|
85 | { | |||
|
86 | return m_barset; | |||
|
87 | } | |||
|
88 | ||||
79 | void QBarLegendMarkerPrivate::updated() |
|
89 | void QBarLegendMarkerPrivate::updated() | |
80 | { |
|
90 | { | |
81 | m_item->setPen(m_barset->pen()); |
|
91 | m_item->setPen(m_barset->pen()); |
@@ -49,6 +49,9 public: | |||||
49 | explicit QBarLegendMarkerPrivate(QBarLegendMarker *q, QAbstractBarSeries *series, QBarSet *barset, QLegend *legend); |
|
49 | explicit QBarLegendMarkerPrivate(QBarLegendMarker *q, QAbstractBarSeries *series, QBarSet *barset, QLegend *legend); | |
50 | virtual ~QBarLegendMarkerPrivate(); |
|
50 | virtual ~QBarLegendMarkerPrivate(); | |
51 |
|
51 | |||
|
52 | virtual QAbstractBarSeries* series(); | |||
|
53 | virtual QObject* relatedObject(); | |||
|
54 | ||||
52 | public Q_SLOTS: |
|
55 | public Q_SLOTS: | |
53 | virtual void updated(); |
|
56 | virtual void updated(); | |
54 |
|
57 |
@@ -43,7 +43,7 | |||||
43 | #include <QTimer> |
|
43 | #include <QTimer> | |
44 | #include <QGraphicsSceneEvent> |
|
44 | #include <QGraphicsSceneEvent> | |
45 |
|
45 | |||
46 |
#include |
|
46 | #include "qlegendmarker.h" | |
47 | #include "qlegendmarker_p.h" |
|
47 | #include "qlegendmarker_p.h" | |
48 | #include "legendmarkeritem_p.h" |
|
48 | #include "legendmarkeritem_p.h" | |
49 |
|
49 | |||
@@ -483,13 +483,8 void QLegendPrivate::appendSeries(QAbstractSeries* series) | |||||
483 | } |
|
483 | } | |
484 |
|
484 | |||
485 | QList<QLegendMarker*> newMarkers = series->d_ptr->createLegendMarkers(q_ptr); |
|
485 | QList<QLegendMarker*> newMarkers = series->d_ptr->createLegendMarkers(q_ptr); | |
486 | foreach (QLegendMarker* marker, newMarkers) { |
|
486 | decorateMarkers(newMarkers); | |
487 | marker->setFont(m_font); |
|
487 | addMarkers(newMarkers); | |
488 | marker->setLabelBrush(m_labelBrush); |
|
|||
489 | marker->setVisible(series->isVisible()); |
|
|||
490 | m_items->addToGroup(marker->d_ptr.data()->item()); |
|
|||
491 | m_legendMarkers << marker; |
|
|||
492 | } |
|
|||
493 |
|
488 | |||
494 | // TODO: This is the part I don't like. There should be better solution. |
|
489 | // TODO: This is the part I don't like. There should be better solution. | |
495 | // On the other hand. It is only one switch case for appending and another for removing series |
|
490 | // On the other hand. It is only one switch case for appending and another for removing series | |
@@ -534,14 +529,14 void QLegendPrivate::removeSeries(QAbstractSeries* series) | |||||
534 | m_series.removeOne(series); |
|
529 | m_series.removeOne(series); | |
535 | } |
|
530 | } | |
536 |
|
531 | |||
537 | foreach (QLegendMarker *marker, m_legendMarkers) { |
|
532 | // Find out, which markers to remove | |
538 | if (marker->series() == series) { |
|
533 | QList<QLegendMarker *> removed; | |
539 | marker->d_ptr.data()->item()->setVisible(false); |
|
534 | foreach (QLegendMarker *m, m_legendMarkers) { | |
540 | m_items->removeFromGroup(marker->d_ptr.data()->item()); |
|
535 | if (m->series() == series) { | |
541 |
|
|
536 | removed << m; | |
542 | m_legendMarkers.removeAll(marker); |
|
|||
543 | } |
|
537 | } | |
544 | } |
|
538 | } | |
|
539 | removeMarkers(removed); | |||
545 |
|
540 | |||
546 | switch (series->type()) |
|
541 | switch (series->type()) | |
547 | { |
|
542 | { | |
@@ -571,9 +566,7 void QLegendPrivate::removeSeries(QAbstractSeries* series) | |||||
571 | } |
|
566 | } | |
572 | } |
|
567 | } | |
573 |
|
568 | |||
574 |
|
||||
575 | QObject::disconnect(series, SIGNAL(visibleChanged()), this, SLOT(handleSeriesVisibleChanged())); |
|
569 | QObject::disconnect(series, SIGNAL(visibleChanged()), this, SLOT(handleSeriesVisibleChanged())); | |
576 | // QObject::disconnect(series->d_ptr.data(), SIGNAL(legendPropertiesUpdated(QAbstractSeries*)), this, SLOT(handleLegendPropertiesUpdated(QAbstractSeries*))); |
|
|||
577 |
|
570 | |||
578 | m_layout->invalidate(); |
|
571 | m_layout->invalidate(); | |
579 | // q_ptr->layout()->activate(); |
|
572 | // q_ptr->layout()->activate(); | |
@@ -608,18 +601,70 void QLegendPrivate::handleSeriesVisibleChanged() | |||||
608 |
|
601 | |||
609 | void QLegendPrivate::handleCountChanged() |
|
602 | void QLegendPrivate::handleCountChanged() | |
610 | { |
|
603 | { | |
611 | // TODO: With new markers, the series should notify markers directly. |
|
604 | // Here we handle the changes in marker count. | |
612 | // TODO: Better way to handle updates. Remove/Add series again seems like overkill. |
|
605 | // Can happen for example when pieslice(s) have been added to or removed from pieseries. | |
613 |
|
606 | |||
614 | QAbstractSeries *series = qobject_cast<QAbstractSeries *> (sender()); |
|
607 | QAbstractSeries *series = qobject_cast<QAbstractSeries *> (sender()); | |
615 | qDebug() << "QLegendPrivate::handleSeriesUpdated" << series; |
|
608 | qDebug() << "QLegendPrivate::handleSeriesUpdated" << series; | |
616 |
|
609 | |||
617 | // Handle new or removed markers |
|
610 | QList<QLegendMarker *> createdMarkers = series->d_ptr->createLegendMarkers(q_ptr); | |
618 | // Handle changes of marker pen/brush/label. every property that legend is interested |
|
611 | ||
619 | handleSeriesRemoved(series); |
|
612 | // Find out removed markers and created markers | |
620 | handleSeriesAdded(series); |
|
613 | QList<QLegendMarker *> removedMarkers; | |
|
614 | foreach (QLegendMarker *oldMarker, m_legendMarkers) { | |||
|
615 | // we have marker, which is related to sender. | |||
|
616 | if (oldMarker->series() == series) { | |||
|
617 | bool found = false; | |||
|
618 | foreach(QLegendMarker *newMarker, createdMarkers) { | |||
|
619 | // New marker considered existing if: | |||
|
620 | // - d_ptr->relatedObject() is same for both markers. | |||
|
621 | if (newMarker->d_ptr->relatedObject() == oldMarker->d_ptr->relatedObject()) { | |||
|
622 | // Delete the new marker, since we already have existing marker, that might be connected on user side. | |||
|
623 | found = true; | |||
|
624 | createdMarkers.removeOne(newMarker); | |||
|
625 | delete newMarker; | |||
|
626 | } | |||
|
627 | } | |||
|
628 | if (!found) { | |||
|
629 | // No related object found for marker, add to removedMarkers list | |||
|
630 | removedMarkers << oldMarker; | |||
|
631 | } | |||
|
632 | } | |||
|
633 | } | |||
|
634 | ||||
|
635 | removeMarkers(removedMarkers); | |||
|
636 | addMarkers(createdMarkers); | |||
|
637 | ||||
|
638 | q_ptr->layout()->invalidate(); | |||
|
639 | } | |||
|
640 | ||||
|
641 | void QLegendPrivate::addMarkers(QList<QLegendMarker *> markers) | |||
|
642 | { | |||
|
643 | foreach (QLegendMarker* marker, markers) { | |||
|
644 | m_items->addToGroup(marker->d_ptr.data()->item()); | |||
|
645 | m_legendMarkers << marker; | |||
|
646 | } | |||
|
647 | } | |||
|
648 | ||||
|
649 | void QLegendPrivate::removeMarkers(QList<QLegendMarker *> markers) | |||
|
650 | { | |||
|
651 | foreach (QLegendMarker *marker, markers) { | |||
|
652 | marker->d_ptr->item()->setVisible(false); | |||
|
653 | m_items->removeFromGroup(marker->d_ptr->item()); | |||
|
654 | delete marker; | |||
|
655 | m_legendMarkers.removeOne(marker); | |||
|
656 | } | |||
|
657 | } | |||
|
658 | ||||
|
659 | void QLegendPrivate::decorateMarkers(QList<QLegendMarker *> markers) | |||
|
660 | { | |||
|
661 | foreach (QLegendMarker* marker, markers) { | |||
|
662 | marker->setFont(m_font); | |||
|
663 | marker->setLabelBrush(m_labelBrush); | |||
|
664 | } | |||
621 | } |
|
665 | } | |
622 |
|
666 | |||
|
667 | ||||
623 | #include "moc_qlegend.cpp" |
|
668 | #include "moc_qlegend.cpp" | |
624 | #include "moc_qlegend_p.cpp" |
|
669 | #include "moc_qlegend_p.cpp" | |
625 |
|
670 |
@@ -66,6 +66,12 public Q_SLOTS: | |||||
66 | void handleCountChanged(); |
|
66 | void handleCountChanged(); | |
67 |
|
67 | |||
68 | private: |
|
68 | private: | |
|
69 | // Internal helpers | |||
|
70 | void addMarkers(QList<QLegendMarker *> markers); | |||
|
71 | void removeMarkers(QList<QLegendMarker *> markers); | |||
|
72 | void decorateMarkers(QList<QLegendMarker *> markers); | |||
|
73 | ||||
|
74 | private: | |||
69 | QLegend *q_ptr; |
|
75 | QLegend *q_ptr; | |
70 | ChartPresenter *m_presenter; |
|
76 | ChartPresenter *m_presenter; | |
71 | LegendLayout *m_layout; |
|
77 | LegendLayout *m_layout; |
@@ -25,6 +25,7 | |||||
25 | #include <QDebug> |
|
25 | #include <QDebug> | |
26 | #include <QFontMetrics> |
|
26 | #include <QFontMetrics> | |
27 | #include <QGraphicsSceneEvent> |
|
27 | #include <QGraphicsSceneEvent> | |
|
28 | #include <QAbstractSeries> | |||
28 |
|
29 | |||
29 | QTCOMMERCIALCHART_BEGIN_NAMESPACE |
|
30 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
30 |
|
31 | |||
@@ -32,6 +33,7 QLegendMarker::QLegendMarker(QLegendMarkerPrivate &d, QObject *parent) : | |||||
32 | QObject(parent), |
|
33 | QObject(parent), | |
33 | d_ptr(&d) |
|
34 | d_ptr(&d) | |
34 | { |
|
35 | { | |
|
36 | d_ptr->m_item->setVisible(d_ptr->series()->isVisible()); | |||
35 | } |
|
37 | } | |
36 |
|
38 | |||
37 | QLegendMarker::~QLegendMarker() |
|
39 | QLegendMarker::~QLegendMarker() | |
@@ -104,6 +106,7 QLegendMarkerPrivate::QLegendMarkerPrivate(QLegendMarker *q, QLegend *legend) : | |||||
104 | m_legend(legend) |
|
106 | m_legend(legend) | |
105 | { |
|
107 | { | |
106 | m_item = new LegendMarkerItem(this); |
|
108 | m_item = new LegendMarkerItem(this); | |
|
109 | // m_item->setVisible(q->series()->isVisible()); | |||
107 | } |
|
110 | } | |
108 |
|
111 | |||
109 | QLegendMarkerPrivate::~QLegendMarkerPrivate() |
|
112 | QLegendMarkerPrivate::~QLegendMarkerPrivate() |
@@ -74,14 +74,13 public: | |||||
74 |
|
74 | |||
75 | virtual QAbstractSeries* series() = 0; |
|
75 | virtual QAbstractSeries* series() = 0; | |
76 |
|
76 | |||
77 | protected: |
|
|||
78 | explicit QLegendMarker(QLegendMarkerPrivate &d, QObject *parent = 0); |
|
|||
79 |
|
||||
80 | Q_SIGNALS: |
|
77 | Q_SIGNALS: | |
81 | void clicked(); |
|
78 | void clicked(); | |
82 | void hovered(bool status); |
|
79 | void hovered(bool status); | |
83 |
|
80 | |||
84 | protected: |
|
81 | protected: | |
|
82 | explicit QLegendMarker(QLegendMarkerPrivate &d, QObject *parent = 0); | |||
|
83 | ||||
85 | QScopedPointer<QLegendMarkerPrivate> d_ptr; |
|
84 | QScopedPointer<QLegendMarkerPrivate> d_ptr; | |
86 | Q_DISABLE_COPY(QLegendMarker) |
|
85 | Q_DISABLE_COPY(QLegendMarker) | |
87 | friend class QLegendPrivate; |
|
86 | friend class QLegendPrivate; |
@@ -66,6 +66,10 public: | |||||
66 | // Item gets the event, logic for event is here |
|
66 | // Item gets the event, logic for event is here | |
67 | void handleMousePressEvent(QGraphicsSceneEvent *event); |
|
67 | void handleMousePressEvent(QGraphicsSceneEvent *event); | |
68 |
|
68 | |||
|
69 | // internal | |||
|
70 | virtual QAbstractSeries* series() = 0; | |||
|
71 | virtual QObject* relatedObject() = 0; | |||
|
72 | ||||
69 | public Q_SLOTS: |
|
73 | public Q_SLOTS: | |
70 | virtual void updated() {}; |
|
74 | virtual void updated() {}; | |
71 |
|
75 |
@@ -76,6 +76,16 QPieLegendMarkerPrivate::~QPieLegendMarkerPrivate() | |||||
76 | QObject::disconnect(m_slice, SIGNAL(penChanged()), this, SLOT(updated())); |
|
76 | QObject::disconnect(m_slice, SIGNAL(penChanged()), this, SLOT(updated())); | |
77 | } |
|
77 | } | |
78 |
|
78 | |||
|
79 | QPieSeries* QPieLegendMarkerPrivate::series() | |||
|
80 | { | |||
|
81 | return m_series; | |||
|
82 | } | |||
|
83 | ||||
|
84 | QObject* QPieLegendMarkerPrivate::relatedObject() | |||
|
85 | { | |||
|
86 | return m_slice; | |||
|
87 | } | |||
|
88 | ||||
79 | void QPieLegendMarkerPrivate::updated() |
|
89 | void QPieLegendMarkerPrivate::updated() | |
80 | { |
|
90 | { | |
81 | m_item->setPen(m_slice->pen()); |
|
91 | m_item->setPen(m_slice->pen()); |
@@ -49,6 +49,10 public: | |||||
49 | explicit QPieLegendMarkerPrivate(QPieLegendMarker *q, QPieSeries *series, QPieSlice *slice, QLegend *legend); |
|
49 | explicit QPieLegendMarkerPrivate(QPieLegendMarker *q, QPieSeries *series, QPieSlice *slice, QLegend *legend); | |
50 | virtual ~QPieLegendMarkerPrivate(); |
|
50 | virtual ~QPieLegendMarkerPrivate(); | |
51 |
|
51 | |||
|
52 | // internal | |||
|
53 | virtual QPieSeries* series(); | |||
|
54 | virtual QObject* relatedObject(); | |||
|
55 | ||||
52 | public Q_SLOTS: |
|
56 | public Q_SLOTS: | |
53 | virtual void updated(); |
|
57 | virtual void updated(); | |
54 |
|
58 |
@@ -67,6 +67,16 QXYLegendMarkerPrivate::~QXYLegendMarkerPrivate() | |||||
67 | QObject::disconnect(m_series, SIGNAL(nameChanged()), this, SLOT(updated())); |
|
67 | QObject::disconnect(m_series, SIGNAL(nameChanged()), this, SLOT(updated())); | |
68 | } |
|
68 | } | |
69 |
|
69 | |||
|
70 | QAbstractSeries* QXYLegendMarkerPrivate::series() | |||
|
71 | { | |||
|
72 | return m_series; | |||
|
73 | } | |||
|
74 | ||||
|
75 | QObject* QXYLegendMarkerPrivate::relatedObject() | |||
|
76 | { | |||
|
77 | return m_series; | |||
|
78 | } | |||
|
79 | ||||
70 | void QXYLegendMarkerPrivate::updated() |
|
80 | void QXYLegendMarkerPrivate::updated() | |
71 | { |
|
81 | { | |
72 | m_item->setLabel(m_series->name()); |
|
82 | m_item->setLabel(m_series->name()); |
@@ -48,6 +48,10 public: | |||||
48 | explicit QXYLegendMarkerPrivate(QXYLegendMarker *q, QXYSeries *series, QLegend *legend); |
|
48 | explicit QXYLegendMarkerPrivate(QXYLegendMarker *q, QXYSeries *series, QLegend *legend); | |
49 | virtual ~QXYLegendMarkerPrivate(); |
|
49 | virtual ~QXYLegendMarkerPrivate(); | |
50 |
|
50 | |||
|
51 | // internal | |||
|
52 | virtual QAbstractSeries* series(); | |||
|
53 | virtual QObject* relatedObject(); | |||
|
54 | ||||
51 | public Q_SLOTS: |
|
55 | public Q_SLOTS: | |
52 | virtual void updated(); |
|
56 | virtual void updated(); | |
53 |
|
57 |
General Comments 0
You need to be logged in to leave comments.
Login now