1 /*
2 * Copyright (C) 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved.
3 *
4 * This file is part of the KD Chart library.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20 #include <KChartDiagramObserver.h>
21
22 #include <KChartAbstractDiagram.h>
23 #include <KChartAttributesModel.h>
24 #include "KChartMath_p.h"
25
26 #include <QDebug>
27
28 using namespace KChart;
29
DiagramObserver(AbstractDiagram * diagram,QObject * parent)30 DiagramObserver::DiagramObserver( AbstractDiagram * diagram, QObject* parent )
31 : QObject( parent ), m_diagram( diagram )
32 {
33 if ( m_diagram ) {
34 connect( m_diagram, SIGNAL(destroyed(QObject*)), SLOT(slotDestroyed(QObject*)));
35 connect( m_diagram, SIGNAL(aboutToBeDestroyed()), SLOT(slotAboutToBeDestroyed()));
36 connect( m_diagram, SIGNAL(modelsChanged()), SLOT(slotModelsChanged()));
37 }
38 init();
39 }
40
~DiagramObserver()41 DiagramObserver::~DiagramObserver()
42 {
43 }
44
diagram() const45 const AbstractDiagram* DiagramObserver::diagram() const
46 {
47 return m_diagram;
48 }
49
diagram()50 AbstractDiagram* DiagramObserver::diagram()
51 {
52 return m_diagram;
53 }
54
55
init()56 void DiagramObserver::init()
57 {
58 if ( !m_diagram )
59 return;
60
61 if ( m_model )
62 disconnect(m_model);
63
64 if ( m_attributesmodel )
65 disconnect(m_attributesmodel);
66
67 const bool con = connect( m_diagram, SIGNAL(viewportCoordinateSystemChanged()), this, SLOT(slotDataChanged()) );
68 Q_ASSERT( con );
69 Q_UNUSED( con )
70 connect( m_diagram, SIGNAL(dataHidden()), SLOT(slotDataHidden()) );
71
72 if ( m_diagram->model() ) {
73 connect( m_diagram->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
74 SLOT(slotDataChanged(QModelIndex,QModelIndex)));
75 connect( m_diagram->model(), SIGNAL(rowsInserted(QModelIndex,int,int)),
76 SLOT(slotDataChanged()));
77 connect( m_diagram->model(), SIGNAL(columnsInserted(QModelIndex,int,int)),
78 SLOT(slotDataChanged()));
79 connect( m_diagram->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)),
80 SLOT(slotDataChanged()));
81 connect( m_diagram->model(), SIGNAL(columnsRemoved(QModelIndex,int,int)),
82 SLOT(slotDataChanged()));
83 connect( m_diagram->model(), SIGNAL(modelReset()),
84 SLOT(slotDataChanged()));
85 connect( m_diagram->model(), SIGNAL(headerDataChanged(Qt::Orientation,int,int)),
86 SLOT(slotHeaderDataChanged(Qt::Orientation,int,int)));
87 }
88
89 if ( m_diagram->attributesModel() )
90 connect( m_diagram->attributesModel(), SIGNAL(attributesChanged(QModelIndex,QModelIndex)),
91 SLOT(slotAttributesChanged(QModelIndex,QModelIndex)));
92 m_model = m_diagram->model();
93 m_attributesmodel = m_diagram->attributesModel();
94 }
95
96
slotDestroyed(QObject *)97 void DiagramObserver::slotDestroyed(QObject*)
98 {
99 //qDebug() << this << "emits signal\n"
100 // " Q_EMIT diagramDestroyed(" << m_diagram << ")";
101 AbstractDiagram* diag = m_diagram;
102 disconnect( m_diagram, nullptr, this, nullptr);
103 m_diagram = nullptr;
104 Q_EMIT diagramDestroyed( diag );
105 }
106
slotAboutToBeDestroyed()107 void DiagramObserver::slotAboutToBeDestroyed()
108 {
109 Q_EMIT diagramAboutToBeDestroyed( m_diagram );
110 }
111
slotModelsChanged()112 void DiagramObserver::slotModelsChanged()
113 {
114 init();
115 slotDataChanged();
116 slotAttributesChanged();
117 }
118
slotHeaderDataChanged(Qt::Orientation,int,int)119 void DiagramObserver::slotHeaderDataChanged(Qt::Orientation,int,int)
120 {
121 //qDebug() << "DiagramObserver::slotHeaderDataChanged()";
122 Q_EMIT diagramDataChanged( m_diagram );
123 }
124
slotDataChanged(QModelIndex,QModelIndex)125 void DiagramObserver::slotDataChanged(QModelIndex,QModelIndex)
126 {
127 slotDataChanged();
128 }
129
slotDataChanged()130 void DiagramObserver::slotDataChanged()
131 {
132 //qDebug() << "DiagramObserver::slotDataChanged()";
133 Q_EMIT diagramDataChanged( m_diagram );
134 }
135
slotDataHidden()136 void DiagramObserver::slotDataHidden()
137 {
138 //qDebug() << "DiagramObserver::slotDataHidden()";
139 Q_EMIT diagramDataHidden( m_diagram );
140 }
141
slotAttributesChanged(QModelIndex,QModelIndex)142 void DiagramObserver::slotAttributesChanged(QModelIndex,QModelIndex)
143 {
144 slotAttributesChanged();
145 }
146
slotAttributesChanged()147 void DiagramObserver::slotAttributesChanged()
148 {
149 //qDebug() << "DiagramObserver::slotAttributesChanged()";
150 Q_EMIT diagramAttributesChanged( m_diagram );
151 }
152
153