diff options
author | Stanislav Ionascu <stanislav.ionascu@nokia.com> | 2010-10-08 09:09:34 +0300 |
---|---|---|
committer | Sergiy Dubovik <sergiy.dubovik@nokia.com> | 2010-10-08 10:41:30 +0300 |
commit | b9c060754b02379ef21828da98bfd06bbd266c08 (patch) | |
tree | 4f0bf0be560e517745a0496efd9e8b3a9054a106 | |
parent | 17bcce867eeade0301de077a190213e1eaf13825 (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.cpp | 27 | ||||
-rw-r--r-- | src/corelib/widgets/mlistitem.h | 14 | ||||
-rw-r--r-- | src/corelib/widgets/mlistitem_p.h | 2 | ||||
-rw-r--r-- | src/views/mlistview.cpp | 2 | ||||
-rw-r--r-- | src/views/mlistview_p.cpp | 24 | ||||
-rw-r--r-- | src/views/mlistview_p.h | 3 |
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); |