summaryrefslogtreecommitdiffstats
path: root/src/charts/piechart
diff options
context:
space:
mode:
Diffstat (limited to 'src/charts/piechart')
-rw-r--r--src/charts/piechart/piechartitem.cpp5
-rw-r--r--src/charts/piechart/piesliceitem.cpp22
-rw-r--r--src/charts/piechart/piesliceitem_p.h8
-rw-r--r--src/charts/piechart/qpieseries.cpp60
-rw-r--r--src/charts/piechart/qpieseries.h3
-rw-r--r--src/charts/piechart/qpieseries_p.h3
-rw-r--r--src/charts/piechart/qpieslice.cpp30
-rw-r--r--src/charts/piechart/qpieslice.h3
8 files changed, 132 insertions, 2 deletions
diff --git a/src/charts/piechart/piechartitem.cpp b/src/charts/piechart/piechartitem.cpp
index b81058a0..4bc57f0a 100644
--- a/src/charts/piechart/piechartitem.cpp
+++ b/src/charts/piechart/piechartitem.cpp
@@ -53,6 +53,8 @@ PieChartItem::PieChartItem(QPieSeries *series, QGraphicsItem* item)
setZValue(ChartPresenter::PieSeriesZValue);
// Note: will not create slice items until we have a proper rectangle to draw on.
+
+ setFlag(QGraphicsItem::ItemIsSelectable);
}
PieChartItem::~PieChartItem()
@@ -153,6 +155,9 @@ void PieChartItem::handleSlicesAdded(QList<QPieSlice *> slices)
connect(sliceItem, SIGNAL(clicked(Qt::MouseButtons)), slice, SIGNAL(clicked()));
connect(sliceItem, SIGNAL(hovered(bool)), slice, SIGNAL(hovered(bool)));
+ connect(sliceItem, SIGNAL(pressed(Qt::MouseButtons)), slice, SIGNAL(pressed()));
+ connect(sliceItem, SIGNAL(released(Qt::MouseButtons)), slice, SIGNAL(released()));
+ connect(sliceItem, SIGNAL(doubleClicked(Qt::MouseButtons)), slice, SIGNAL(doubleClicked()));
PieSliceData sliceData = updateSliceGeometry(slice);
if (m_animation)
diff --git a/src/charts/piechart/piesliceitem.cpp b/src/charts/piechart/piesliceitem.cpp
index 09c8a578..b42fb078 100644
--- a/src/charts/piechart/piesliceitem.cpp
+++ b/src/charts/piechart/piesliceitem.cpp
@@ -41,11 +41,13 @@ QPointF offset(qreal angle, qreal length)
PieSliceItem::PieSliceItem(QGraphicsItem *parent)
: QGraphicsObject(parent),
- m_hovered(false)
+ m_hovered(false),
+ m_mousePressed(false)
{
setAcceptHoverEvents(true);
setAcceptedMouseButtons(Qt::MouseButtonMask);
setZValue(ChartPresenter::PieSeriesZValue);
+ setFlag(QGraphicsItem::ItemIsSelectable);
m_labelItem = new QGraphicsTextItem(this);
m_labelItem->document()->setDocumentMargin(1.0);
}
@@ -108,7 +110,23 @@ void PieSliceItem::hoverLeaveEvent(QGraphicsSceneHoverEvent * /*event*/)
void PieSliceItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
- emit clicked(event->buttons());
+ emit pressed(event->buttons());
+ m_lastMousePos = event->pos();
+ m_mousePressed = true;
+}
+
+void PieSliceItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ emit released(event->buttons());
+ if (m_lastMousePos == event->pos() && m_mousePressed)
+ emit clicked(event->buttons());
+}
+
+void PieSliceItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
+{
+ // For Pie slice a press signal needs to be explicitly fired for mouseDoubleClickEvent
+ emit pressed(event->buttons());
+ emit doubleClicked(event->buttons());
}
void PieSliceItem::setLayout(const PieSliceData &sliceData)
diff --git a/src/charts/piechart/piesliceitem_p.h b/src/charts/piechart/piesliceitem_p.h
index b062d333..02295a4b 100644
--- a/src/charts/piechart/piesliceitem_p.h
+++ b/src/charts/piechart/piesliceitem_p.h
@@ -61,6 +61,8 @@ public:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+ void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
void setLayout(const PieSliceData &sliceData);
static QPointF sliceCenter(QPointF point, qreal radius, QPieSlice *slice);
@@ -68,6 +70,9 @@ public:
Q_SIGNALS:
void clicked(Qt::MouseButtons buttons);
void hovered(bool state);
+ void pressed(Qt::MouseButtons buttons);
+ void released(Qt::MouseButtons buttons);
+ void doubleClicked(Qt::MouseButtons buttons);
private:
void updateGeometry();
@@ -83,6 +88,9 @@ private:
bool m_hovered;
QGraphicsTextItem *m_labelItem;
+ QPointF m_lastMousePos;
+ bool m_mousePressed;
+
friend class PieSliceAnimation;
};
diff --git a/src/charts/piechart/qpieseries.cpp b/src/charts/piechart/qpieseries.cpp
index d536fe7a..7339e6ad 100644
--- a/src/charts/piechart/qpieseries.cpp
+++ b/src/charts/piechart/qpieseries.cpp
@@ -316,6 +316,36 @@ QT_CHARTS_BEGIN_NAMESPACE
*/
/*!
+ \fn void QPieSeries::pressed(QPieSlice* slice)
+ This signal is emitted when a \a slice has been pressed.
+ \sa QPieSlice::pressed()
+*/
+/*!
+ \qmlsignal PieSeries::onPressed(PieSlice slice)
+ This signal is emitted when a \a slice has been pressed.
+*/
+
+/*!
+ \fn void QPieSeries::released(QPieSlice* slice)
+ This signal is emitted when a \a slice has been released.
+ \sa QPieSlice::released()
+*/
+/*!
+ \qmlsignal PieSeries::onReleased(PieSlice slice)
+ This signal is emitted when a \a slice has been released.
+*/
+
+/*!
+ \fn void QPieSeries::doubleClicked(QPieSlice* slice)
+ This signal is emitted when a \a slice has been doubleClicked.
+ \sa QPieSlice::doubleClicked()
+*/
+/*!
+ \qmlsignal PieSeries::onDoubleClicked(PieSlice slice)
+ This signal is emitted when a \a slice has been doubleClicked.
+*/
+
+/*!
\fn void QPieSeries::hovered(QPieSlice* slice, bool state)
This signal is emitted when user has hovered over or away from the \a slice.
\a state is true when user has hovered over the slice and false when hover has moved away from the slice.
@@ -424,6 +454,9 @@ bool QPieSeries::append(QList<QPieSlice *> slices)
connect(s, SIGNAL(valueChanged()), d, SLOT(sliceValueChanged()));
connect(s, SIGNAL(clicked()), d, SLOT(sliceClicked()));
connect(s, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
+ connect(s, SIGNAL(pressed()), d, SLOT(slicePressed()));
+ connect(s, SIGNAL(released()), d, SLOT(sliceReleased()));
+ connect(s, SIGNAL(doubleClicked()), d, SLOT(sliceDoubleClicked()));
}
emit added(slices);
@@ -490,6 +523,9 @@ bool QPieSeries::insert(int index, QPieSlice *slice)
connect(slice, SIGNAL(valueChanged()), d, SLOT(sliceValueChanged()));
connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked()));
connect(slice, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool)));
+ connect(slice, SIGNAL(pressed()), d, SLOT(slicePressed()));
+ connect(slice, SIGNAL(released()), d, SLOT(sliceReleased()));
+ connect(slice, SIGNAL(doubleClicked()), d, SLOT(sliceDoubleClicked()));
emit added(QList<QPieSlice *>() << slice);
emit countChanged();
@@ -854,6 +890,30 @@ void QPieSeriesPrivate::sliceHovered(bool state)
}
}
+void QPieSeriesPrivate::slicePressed()
+{
+ QPieSlice *slice = qobject_cast<QPieSlice *>(sender());
+ Q_ASSERT(m_slices.contains(slice));
+ Q_Q(QPieSeries);
+ emit q->pressed(slice);
+}
+
+void QPieSeriesPrivate::sliceReleased()
+{
+ QPieSlice *slice = qobject_cast<QPieSlice *>(sender());
+ Q_ASSERT(m_slices.contains(slice));
+ Q_Q(QPieSeries);
+ emit q->released(slice);
+}
+
+void QPieSeriesPrivate::sliceDoubleClicked()
+{
+ QPieSlice *slice = qobject_cast<QPieSlice *>(sender());
+ Q_ASSERT(m_slices.contains(slice));
+ Q_Q(QPieSeries);
+ emit q->doubleClicked(slice);
+}
+
void QPieSeriesPrivate::initializeDomain()
{
// does not apply to pie
diff --git a/src/charts/piechart/qpieseries.h b/src/charts/piechart/qpieseries.h
index b8fd20dc..c9deef63 100644
--- a/src/charts/piechart/qpieseries.h
+++ b/src/charts/piechart/qpieseries.h
@@ -89,6 +89,9 @@ Q_SIGNALS:
void removed(QList<QPieSlice *> slices);
void clicked(QPieSlice *slice);
void hovered(QPieSlice *slice, bool state);
+ void pressed(QPieSlice *slice);
+ void released(QPieSlice *slice);
+ void doubleClicked(QPieSlice *slice);
void countChanged();
void sumChanged();
diff --git a/src/charts/piechart/qpieseries_p.h b/src/charts/piechart/qpieseries_p.h
index bdc552dc..0ae80bce 100644
--- a/src/charts/piechart/qpieseries_p.h
+++ b/src/charts/piechart/qpieseries_p.h
@@ -72,6 +72,9 @@ public Q_SLOTS:
void sliceValueChanged();
void sliceClicked();
void sliceHovered(bool state);
+ void slicePressed();
+ void sliceReleased();
+ void sliceDoubleClicked();
private:
QList<QPieSlice *> m_slices;
diff --git a/src/charts/piechart/qpieslice.cpp b/src/charts/piechart/qpieslice.cpp
index 4a971e5b..e3f5b4ff 100644
--- a/src/charts/piechart/qpieslice.cpp
+++ b/src/charts/piechart/qpieslice.cpp
@@ -432,6 +432,36 @@ QT_CHARTS_BEGIN_NAMESPACE
*/
/*!
+ \fn void QPieSlice::pressed()
+ This signal is emitted when user has pressed the slice.
+ \sa QPieSeries::pressed()
+*/
+/*!
+ \qmlsignal PieSlice::onPressed()
+ This signal is emitted when user has pressed the slice.
+*/
+
+/*!
+ \fn void QPieSlice::released()
+ This signal is emitted when user has released the slice.
+ \sa QPieSeries::released()
+*/
+/*!
+ \qmlsignal PieSlice::onReleased()
+ This signal is emitted when user has released the slice.
+*/
+
+/*!
+ \fn void QPieSlice::doubleClicked()
+ This signal is emitted when user has doubleclicked the slice.
+ \sa QPieSeries::doubleClicked()
+*/
+/*!
+ \qmlsignal PieSlice::onDoubleClicked()
+ This signal is emitted when user has doubleclicked the slice.
+*/
+
+/*!
\fn void QPieSlice::hovered(bool state)
This signal is emitted when user has hovered over or away from the slice.
\a state is true when user has hovered over the slice and false when hover has moved away from the slice.
diff --git a/src/charts/piechart/qpieslice.h b/src/charts/piechart/qpieslice.h
index 6a5612b4..5e90f14b 100644
--- a/src/charts/piechart/qpieslice.h
+++ b/src/charts/piechart/qpieslice.h
@@ -121,6 +121,9 @@ public:
Q_SIGNALS:
void clicked();
void hovered(bool state);
+ void pressed();
+ void released();
+ void doubleClicked();
void labelChanged();
void valueChanged();
void labelVisibleChanged();