aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Ionascu <stanislav.ionascu@nokia.com>2010-10-08 09:09:34 +0300
committerSergiy Dubovik <sergiy.dubovik@nokia.com>2010-10-08 10:41:30 +0300
commitb9c060754b02379ef21828da98bfd06bbd266c08 (patch)
tree4f0bf0be560e517745a0496efd9e8b3a9054a106
parent17bcce867eeade0301de077a190213e1eaf13825 (diff)
Changes: Automate grabbing of Tap and Hold gestures by M*ListItems.
Fixes: NB#196165 - longTapped not emitted by MListItem RevBy: Sergiy Dubovik Details: By default MWidgets don't grab TapAndHold gesture. However M*ListItem(s) provide a signal for long tap. It can't work if widget doesn't call grabGesture(Qt::TapAndHold). Asking user to call it is awkward. M*ListItem is going to grab tap and hold gesture when someone subscribes to M*ListItem::longTap(QPointF) and will ungrab when all receivers will disconnect.
-rw-r--r--src/corelib/widgets/mlistitem.cpp27
-rw-r--r--src/corelib/widgets/mlistitem.h14
-rw-r--r--src/corelib/widgets/mlistitem_p.h2
-rw-r--r--src/views/mlistview.cpp2
-rw-r--r--src/views/mlistview_p.cpp24
-rw-r--r--src/views/mlistview_p.h3
6 files changed, 63 insertions, 9 deletions
diff --git a/src/corelib/widgets/mlistitem.cpp b/src/corelib/widgets/mlistitem.cpp
index ae6c8d57..a08168cb 100644
--- a/src/corelib/widgets/mlistitem.cpp
+++ b/src/corelib/widgets/mlistitem.cpp
@@ -33,6 +33,15 @@ MListItemPrivate::~MListItemPrivate()
{
}
+void MListItemPrivate::updateLongTapConnections()
+{
+ Q_Q(MListItem);
+ if (q->receivers(SIGNAL(longTapped(QPointF))) > 0)
+ q->grabGesture(Qt::TapAndHoldGesture);
+ else
+ q->ungrabGesture(Qt::TapAndHoldGesture);
+}
+
MListItem::MListItem(QGraphicsItem *parent)
: MWidgetController(new MListItemPrivate, new MListItemModel, parent)
{
@@ -51,3 +60,21 @@ void MListItem::longTap(const QPointF &pos)
{
emit longTapped(pos);
}
+
+void MListItem::connectNotify(const char *signal)
+{
+ Q_D(MListItem);
+
+ if (QLatin1String(signal) == SIGNAL(longTapped(QPointF))) {
+ d->updateLongTapConnections();
+ }
+}
+
+void MListItem::disconnectNotify(const char *signal)
+{
+ Q_D(MListItem);
+
+ if (QLatin1String(signal) == SIGNAL(longTapped(QPointF))) {
+ d->updateLongTapConnections();
+ }
+}
diff --git a/src/corelib/widgets/mlistitem.h b/src/corelib/widgets/mlistitem.h
index 46048f43..7c612936 100644
--- a/src/corelib/widgets/mlistitem.h
+++ b/src/corelib/widgets/mlistitem.h
@@ -72,12 +72,20 @@ Q_SIGNALS:
/*!
\brief The signal is emitted when the list cell has been tapped and holded.
-
- If the MListItem is used outside MList, the user needs to invoke
- item->grabGesture(Qt::TapAndHoldGesture) to start receiving longTapped() signal.
*/
void longTapped(const QPointF &pos);
+protected:
+ /*!
+ Handler of notifications of new receivers connected to MListItem signals.
+ */
+ virtual void connectNotify(const char *signal);
+
+ /*!
+ Handler of notifications of receivers disconnecting from MListItem signals.
+ */
+ virtual void disconnectNotify(const char *signal);
+
private:
Q_DECLARE_PRIVATE(MListItem)
diff --git a/src/corelib/widgets/mlistitem_p.h b/src/corelib/widgets/mlistitem_p.h
index 5f71dbc9..611debeb 100644
--- a/src/corelib/widgets/mlistitem_p.h
+++ b/src/corelib/widgets/mlistitem_p.h
@@ -30,6 +30,8 @@ public:
MListItemPrivate();
virtual ~MListItemPrivate();
+ void updateLongTapConnections();
+
private:
Q_DECLARE_PUBLIC(MListItem)
};
diff --git a/src/views/mlistview.cpp b/src/views/mlistview.cpp
index 70b77061..aca643bf 100644
--- a/src/views/mlistview.cpp
+++ b/src/views/mlistview.cpp
@@ -108,6 +108,8 @@ void MListView::updateData(const QList<const char *>& modifications)
longTap(model()->longTap());
} else if (member == MListModel::ListIndexDisplayMode) {
d_ptr->updateListIndexVisibility();
+ } else if (member == MListModel::LongTapEnabled) {
+ d_ptr->updateItemConnections();
}
}
}
diff --git a/src/views/mlistview_p.cpp b/src/views/mlistview_p.cpp
index 4da4c9f9..d4018a67 100644
--- a/src/views/mlistview_p.cpp
+++ b/src/views/mlistview_p.cpp
@@ -205,13 +205,8 @@ MWidget *MListViewPrivate::createCell(int row)
QObject::connect(cell, SIGNAL(clicked()), q_ptr, SLOT(itemClick()), Qt::UniqueConnection);
}
- if (cell->metaObject()->indexOfSignal("longTapped(QPointF)") != -1) {
- QObject::connect(cell, SIGNAL(longTapped(QPointF)), q_ptr, SLOT(_q_itemLongTapped(QPointF)), Qt::UniqueConnection);
- }
+ updateItemLongTapConnection(cell);
- if (controllerModel->longTapEnabled()) {
- cell->grabGesture(Qt::TapAndHoldGesture);
- }
return cell;
}
@@ -383,6 +378,23 @@ void MListViewPrivate::connectSignalsFromModelToListView()
}
}
+void MListViewPrivate::updateItemConnections()
+{
+ foreach (MWidget *cell, visibleItems) {
+ updateItemLongTapConnection(cell);
+ }
+}
+
+void MListViewPrivate::updateItemLongTapConnection(MWidget *cell)
+{
+ if (cell->metaObject()->indexOfSignal("longTapped(QPointF)") != -1) {
+ if (controllerModel->longTapEnabled())
+ QObject::connect(cell, SIGNAL(longTapped(QPointF)), q_ptr, SLOT(_q_itemLongTapped(QPointF)), Qt::UniqueConnection);
+ else
+ QObject::disconnect(cell, SIGNAL(longTapped(QPointF)), q_ptr, SLOT(_q_itemLongTapped(QPointF)));
+ }
+}
+
void MListViewPrivate::resetModel(MListModel *mListModel)
{
forceRepaint = true;
diff --git a/src/views/mlistview_p.h b/src/views/mlistview_p.h
index bef98acd..5d858eae 100644
--- a/src/views/mlistview_p.h
+++ b/src/views/mlistview_p.h
@@ -151,6 +151,9 @@ public:
virtual void disconnectSignalsFromModelToListView();
virtual void connectSignalsFromModelToListView();
+ virtual void updateItemConnections();
+ virtual void updateItemLongTapConnection(MWidget *cell);
+
public Q_SLOTS:
void movingDetectionTimerTimeout();
void viewportPositionChanged(const QPointF &pos);