diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-07-21 18:55:37 +0200 |
---|---|---|
committer | Paolo Angelelli <paolo.angelelli@qt.io> | 2018-04-17 13:36:34 +0000 |
commit | 572957bb1326190672ea138ccf475c0cf1893192 (patch) | |
tree | 7679c6062673a25af15a7b2cead6325316e87676 /src/location/declarativemaps/qdeclarativegeomapitembase.cpp | |
parent | 9277ad55ad1a76492a3985460569d0a6fd15b08a (diff) | |
download | qtlocation-572957bb1326190672ea138ccf475c0cf1893192.tar.gz |
Fix MapItemView not setting context data upon item deletion
The current implementation does not properly re-set context data upon
model item deletion/change.
This patch uses a QQmlDelegateModel that does all the management internally.
To accommodate for items disappearing/reappearing all at once, potentially
introducing flickering, a fixed opacity transition 300msec long has been
introduced as exit transition.
In later Qt releases, new API can be added to let the user change it,
as well as also adding an enter transition and possibly more.
Task-number: QTBUG-62086
Task-number: QTBUG-65833
Change-Id: I59a8147a12f035d5c7f86c2546e9144b2e1a7b3c
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/location/declarativemaps/qdeclarativegeomapitembase.cpp')
-rw-r--r-- | src/location/declarativemaps/qdeclarativegeomapitembase.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/location/declarativemaps/qdeclarativegeomapitembase.cpp b/src/location/declarativemaps/qdeclarativegeomapitembase.cpp index 7b3950db..faa06fef 100644 --- a/src/location/declarativemaps/qdeclarativegeomapitembase.cpp +++ b/src/location/declarativemaps/qdeclarativegeomapitembase.cpp @@ -283,6 +283,44 @@ qreal QDeclarativeGeoMapItemBase::mapItemOpacity() const return opacity(); } +bool QDeclarativeGeoMapItemBase::prepareEnterTransition() +{ + if (m_transitionManager->m_transitionState == QDeclarativeGeoMapItemTransitionManager::EnterTransition + && m_transitionManager->isRunning()) + return false; + + if (m_transitionManager->m_transitionState != QDeclarativeGeoMapItemTransitionManager::EnterTransition) { + setVisible(true); + m_transitionManager->m_transitionState = QDeclarativeGeoMapItemTransitionManager::EnterTransition; + } + return true; +} + +bool QDeclarativeGeoMapItemBase::prepareExitTransition() +{ + if (m_transitionManager->m_transitionState == QDeclarativeGeoMapItemTransitionManager::ExitTransition + && m_transitionManager->isRunning()) + return false; + + if (m_transitionManager->m_transitionState != QDeclarativeGeoMapItemTransitionManager::ExitTransition) { + m_transitionManager->m_transitionState = QDeclarativeGeoMapItemTransitionManager::ExitTransition; + } + return true; +} + +void QDeclarativeGeoMapItemBase::finalizeEnterTransition() +{ + m_transitionManager->m_transitionState = QDeclarativeGeoMapItemTransitionManager::NoTransition; + emit enterTransitionFinished(); +} + +void QDeclarativeGeoMapItemBase::finalizeExitTransition() +{ + setVisible(false); + m_transitionManager->m_transitionState = QDeclarativeGeoMapItemTransitionManager::NoTransition; + emit exitTransitionFinished(); +} + bool QDeclarativeGeoMapItemBase::isPolishScheduled() const { return QQuickItemPrivate::get(this)->polishScheduled; @@ -294,4 +332,43 @@ void QDeclarativeGeoMapItemBase::polishAndUpdate() update(); } +QDeclarativeGeoMapItemTransitionManager::QDeclarativeGeoMapItemTransitionManager(QDeclarativeGeoMapItemBase *mapItem) + : QQuickTransitionManager(), m_mapItem(mapItem) +{ +} + +void QDeclarativeGeoMapItemTransitionManager::transitionEnter() +{ + if (m_transitionState == ExitTransition) + cancel(); + + if (!m_mapItem->prepareEnterTransition()) + return; + + if (m_view && m_view->m_enter) + transition(enterActions, m_view->m_enter, m_mapItem); + else + finished(); +} + +void QDeclarativeGeoMapItemTransitionManager::transitionExit() +{ + if (!m_mapItem->prepareExitTransition()) + return; + + if (m_view && m_view->m_exit) + transition(exitActions, m_view->m_exit, m_mapItem); + else + finished(); +} + +void QDeclarativeGeoMapItemTransitionManager::finished() +{ + if (m_transitionState == EnterTransition) + m_mapItem->finalizeEnterTransition(); + else if (m_transitionState == ExitTransition) + m_mapItem->finalizeExitTransition(); +} + + QT_END_NAMESPACE |