KReport

KReportDesignerItemChart.cpp
1 /* This file is part of the KDE project
2  * Copyright (C) 2007-2008 by Adam Pigg ([email protected])
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17 #include "KReportDesignerItemChart.h"
18 
19 #include <KReportDesignerItemBase.h>
20 #include "KReportDesigner.h"
21 
22 #include <KProperty>
23 #include <KPropertySet>
24 
25 #include <QGraphicsScene>
26 #include <QGraphicsSceneMouseEvent>
27 #include <QDomDocument>
28 #include <QPainter>
29 
30 void KReportDesignerItemChart::init(QGraphicsScene* scene, KoReportDesigner *d)
31 {
32  setPos(0, 0);
33 
34  if (scene)
35  scene->addItem(this);
36 
37  connect(m_set, SIGNAL(propertyChanged(KPropertySet&,KProperty&)),
38  this, SLOT(slotPropertyChanged(KPropertySet&,KProperty&)));
39 
40  KoReportDesignerItemRectBase::init(&m_pos, &m_size, m_set, d);
41  setZValue(Z);
42 
43  connect(m_reportDesigner, SIGNAL(reportDataChanged()), this, SLOT(slotReportDataChanged()));
44 }
45 
46 KReportDesignerItemChart::KReportDesignerItemChart(KoReportDesigner * rd, QGraphicsScene* scene, const QPointF &pos)
47  : KoReportDesignerItemRectBase(rd)
48 {
49  Q_UNUSED(pos);
50  init(scene, rd);
51  setSceneRect(properRect(*rd, m_dpiX, m_dpiY));
52  m_name->setValue(m_reportDesigner->suggestEntityName(typeName()));
53 }
54 
55 KReportDesignerItemChart::KReportDesignerItemChart(QDomNode *element, KoReportDesigner * rd, QGraphicsScene* scene) :
56  KReportItemChart(element), KoReportDesignerItemRectBase(rd)
57 {
58  init(scene, rd);
59  populateData();
60  setSceneRect(m_pos.toScene(), m_size.toScene());
61 
62 }
63 
64 KReportDesignerItemChart::~KReportDesignerItemChart()
65 {
66 }
67 
68 void KReportDesignerItemChart::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget *widget)
69 {
70  Q_UNUSED(option);
71  Q_UNUSED(widget);
72 
73  // store any values we plan on changing so we can restore them
74  QFont f = painter->font();
75  QPen p = painter->pen();
76  QColor bg = Qt::white;
77 
78  painter->fillRect(QGraphicsRectItem::rect(), bg);
79 
80  if (m_chartWidget) {
81  m_chartWidget->setFixedSize(m_size.toScene().toSize());
82  painter->drawImage(rect().left(), rect().top(),
83  QPixmap::grabWidget(m_chartWidget).toImage(),
84  0, 0, rect().width(), rect().height());
85  }
86  bg.setAlpha(255);
87 
88  painter->setBackground(bg);
89  painter->setPen(Qt::black);
90  painter->drawText(rect(), 0, dataSourceAndObjectTypeName(itemDataSource(), "chart"));
91  painter->setPen(QPen(QColor(224, 224, 224)));
92  painter->drawRect(rect());
94 
95  drawHandles(painter);
96 
97  // restore an values before we started just in case
98  painter->setFont(f);
99  painter->setPen(p);
100 }
101 
102 KReportDesignerItemChart* KReportDesignerItemChart::clone()
103 {
104  QDomDocument d;
105  QDomElement e = d.createElement("clone");
106  QDomNode n;
107  buildXML(&d, &e);
108  n = e.firstChild();
109  return new KReportDesignerItemChart(n, designer(), 0);
110 }
111 
112 void KReportDesignerItemChart::buildXML(QDomDocument *doc, QDomElement *parent)
113 {
114  QDomElement entity = doc->createElement(QLatin1String("report:") + typeName());
115 
116  // properties
117  addPropertyAsAttribute(&entity, nameProperty());
118  addPropertyAsAttribute(&entity, dataSourceProperty());
119  addPropertyAsAttribute(&entity, m_chartType);
120  addPropertyAsAttribute(&entity, m_chartSubType);
121  addPropertyAsAttribute(&entity, m_threeD);
122  addPropertyAsAttribute(&entity, m_colorScheme);
123  addPropertyAsAttribute(&entity, m_aa);
124  addPropertyAsAttribute(&entity, m_xTitle);
125  addPropertyAsAttribute(&entity, m_yTitle);
126  addPropertyAsAttribute(&entity, m_backgroundColor);
127  addPropertyAsAttribute(&entity, m_displayLegend);
128  addPropertyAsAttribute(&entity, m_legendPosition);
129  addPropertyAsAttribute(&entity, m_legendOrientation);
130  addPropertyAsAttribute(&entity, m_linkChild);
131  addPropertyAsAttribute(&entity, m_linkMaster);
132  entity.setAttribute("report:z-index", zValue());
133 
134  // bounding rect
135  buildXMLRect(doc, &entity, &m_pos, &m_size);
136 
137  parent->appendChild(entity);
138 }
139 
140 void KReportDesignerItemChart::slotPropertyChanged(KPropertySet &s, KProperty &p)
141 {
142  if (p.name() == "name") {
143  //For some reason p.oldValue returns an empty string
144  if (!m_reportDesigner->isEntityNameUnique(p.value().toString(), this)) {
145  p.setValue(m_oldName);
146  } else {
147  m_oldName = p.value().toString();
148  }
149  } else if (p.name() == "three-dimensions") {
150  set3D(p.value().toBool());
151  } else if (p.name() == "antialiased") {
152  setAA(p.value().toBool());
153  } else if (p.name() == "color-scheme") {
154  setColorScheme(p.value().toString());
155  } else if (p.name() == "data-source") {
156  populateData();
157  } else if (p.name() == "title-x-axis" || p.name() == "title-y-axis") {
158  setAxis(m_xTitle->value().toString(), m_yTitle->value().toString());
159  } else if (p.name() == "background-color") {
160  setBackgroundColor(p.value().value<QColor>());
161  } else if (p.name() == "display-legend") {
162  if (m_chartWidget && p.value().toBool()) {
163  populateData();
164  }
165  } else if (p.name() == "legend-position") {
166  if (m_chartWidget) {
167  populateData();
168  }
169  } else if (p.name() == "legend-orientation") {
170  if (m_chartWidget) {
171  populateData();
172  }
173  } else if (p.name() == "chart-type") {
174  if (m_chartWidget) {
175  populateData();
176  //m_chartWidget->setType((KDChart::Widget::ChartType) m_chartType->value().toInt());
177  }
178  } else if (p.name() == "chart-sub-type") {
179  if (m_chartWidget) {
180  m_chartWidget->setSubType((KDChart::Widget::SubType) m_chartSubType->value().toInt());
181  }
182  }
183 
184  KoReportDesignerItemRectBase::propertyChanged(s, p);
185  if (m_reportDesigner) m_reportDesigner->setModified(true);
186 }
187 
188 void KReportDesignerItemChart::mousePressEvent(QGraphicsSceneMouseEvent * event)
189 {
190  if (m_reportDesigner->reportData()) {
191  QStringList ql = m_reportDesigner->reportData()->dataSources();
192  QStringList qn = m_reportDesigner->reportData()->dataSourceNames();
193  dataSourceProperty()->setListData(ql, qn);
194  }
195  KoReportDesignerItemRectBase::mousePressEvent(event);
196 }
197 
198 void KReportDesignerItemChart::slotReportDataChanged()
199 {
200  setConnection(m_reportDesigner->reportData());
201 }
QByteArray name() const
void setPen(const QColor &color)
void setBackgroundMode(Qt::BGMode mode)
QDomNode firstChild() const const
void addItem(QGraphicsItem *item)
void drawRect(const QRectF &rectangle)
QCA_EXPORT void init()
T value() const const
TransparentMode
QTextStream & left(QTextStream &stream)
void setBackground(const QBrush &brush)
QPixmap grabWidget(QObject *widget, const QRect &rectangle)
const QPen & pen() const const
QDomElement createElement(const QString &tagName)
void drawText(const QPointF &position, const QString &text)
void fillRect(const QRectF &rectangle, const QBrush &brush)
void drawImage(const QRectF &target, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags)
void setAttribute(const QString &name, const QString &value)
void setAlpha(int alpha)
bool toBool() const const
bool setValue(const QVariant &value, ValueOptions options=ValueOptions())
QDomNode appendChild(const QDomNode &newChild)
QRectF rect() const const
const QFont & font() const const
QVariant value() const
void setFont(const QFont &font)
QString toString() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Tue Feb 7 2023 04:17:37 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.