6 #include "PlaybackAnimatedUpdateItem.h"
8 #include "GeoDataAnimatedUpdate.h"
9 #include "GeoDataDocument.h"
10 #include "GeoDataPlacemark.h"
11 #include "GeoDataCreate.h"
12 #include "GeoDataUpdate.h"
13 #include "GeoDataDelete.h"
14 #include "GeoDataChange.h"
15 #include "GeoDataFolder.h"
16 #include "GeoDataGroundOverlay.h"
17 #include "GeoDataPhotoOverlay.h"
18 #include "GeoDataScreenOverlay.h"
24 PlaybackAnimatedUpdateItem::PlaybackAnimatedUpdateItem( GeoDataAnimatedUpdate* animatedUpdate )
26 m_animatedUpdate = animatedUpdate;
27 m_rootDocument = rootDocument( m_animatedUpdate );
31 const GeoDataAnimatedUpdate* PlaybackAnimatedUpdateItem::animatedUpdate()
const
33 return m_animatedUpdate;
36 double PlaybackAnimatedUpdateItem::duration()
const
38 return m_animatedUpdate->duration();
41 void PlaybackAnimatedUpdateItem::play()
48 if ( !m_rootDocument || !m_animatedUpdate->update() ) {
53 if ( m_animatedUpdate->update()->change() ) {
55 for(
int i = 0; i < placemarkList.
size(); i++ ){
56 GeoDataPlacemark* placemark = placemarkList.
at( i );
57 QString targetId = placemark->targetId();
61 if( placemark->isBalloonVisible() ){
62 GeoDataFeature* feature = findFeature( m_rootDocument, targetId );
63 if (
auto placemark = geodata_cast<GeoDataPlacemark>(feature)) {
64 emit balloonShown(placemark);
73 if( m_animatedUpdate->update()->create() ){
74 for(
int index = 0; index < m_animatedUpdate->update()->
create()->size(); ++index ) {
75 GeoDataFeature* child = m_animatedUpdate->update()->create()->child( index );
77 (geodata_cast<GeoDataDocument>(child)||
78 geodata_cast<GeoDataFolder>(child))) {
79 GeoDataContainer *addContainer =
static_cast<GeoDataContainer*
>( child );
80 QString targetId = addContainer->targetId();
81 GeoDataFeature* feature = findFeature( m_rootDocument, targetId );
83 (geodata_cast<GeoDataDocument>(feature) ||
84 geodata_cast<GeoDataFolder>(feature))) {
85 GeoDataContainer* container =
static_cast<GeoDataContainer*
>( feature );
86 for(
int i = 0; i < addContainer->size(); ++i ) {
87 emit added( container, addContainer->child( i ), -1 );
88 if (
auto placemark = geodata_cast<GeoDataPlacemark>(addContainer->child(i)))
90 if( placemark->isBalloonVisible() ) {
91 emit balloonShown( placemark );
102 if( m_animatedUpdate->update()->getDelete() ){
103 for(
int index = 0; index < m_animatedUpdate->update()->getDelete()->size(); ++index ) {
104 GeoDataFeature* child = m_animatedUpdate->update()->getDelete()->child( index );
105 QString targetId = child->targetId();
109 GeoDataFeature* feature = findFeature( m_rootDocument, targetId );
110 if (feature && canDelete(*feature)) {
111 m_deletedObjects.append( feature );
112 emit removed( feature );
113 if (
auto placemark = geodata_cast<GeoDataPlacemark>(feature))
115 if( placemark->isBalloonVisible() ) {
116 emit balloonHidden();
124 GeoDataFeature* PlaybackAnimatedUpdateItem::findFeature(GeoDataFeature* feature,
const QString&
id )
const
126 if ( feature && feature->id() ==
id ){
130 GeoDataContainer *container =
dynamic_cast<GeoDataContainer*
>( feature );
134 for( ; iter !=
end; ++iter ){
135 GeoDataFeature *foundFeature = findFeature( *iter,
id );
144 GeoDataDocument *PlaybackAnimatedUpdateItem::rootDocument( GeoDataObject*
object )
const
146 if( !
object || !object->parent() ){
147 GeoDataDocument* document =
dynamic_cast<GeoDataDocument*
>( object );
150 return rootDocument( object->parent() );
160 void PlaybackAnimatedUpdateItem::seek(
double position )
162 Q_UNUSED( position );
173 if ( m_animatedUpdate->update()->change() ) {
175 for(
int i = 0; i < placemarkList.
size(); i++ ){
176 GeoDataPlacemark* placemark = placemarkList.
at( i );
177 QString targetId = placemark->targetId();
181 GeoDataFeature* feature = findFeature( m_rootDocument, targetId );
182 if( placemark->isBalloonVisible() ){
183 if (geodata_cast<GeoDataPlacemark>(feature)) {
184 emit balloonHidden();
187 emit balloonShown(
static_cast<GeoDataPlacemark*
>( feature ) );
192 if( m_animatedUpdate->update()->create() ){
193 for(
int index = 0; index < m_animatedUpdate->update()->
create()->size(); ++index ) {
194 GeoDataFeature* feature = m_animatedUpdate->update()->create()->child( index );
196 (geodata_cast<GeoDataDocument>(feature) ||
197 geodata_cast<GeoDataFolder>(feature))) {
198 GeoDataContainer* container =
static_cast<GeoDataContainer*
>( feature );
199 for(
int i = 0; i < container->size(); ++i ) {
201 emit removed( container->child( i ) );
202 if (
auto placemark = geodata_cast<GeoDataPlacemark>(container->child(i)))
204 if( placemark->isBalloonVisible() ) {
205 emit balloonHidden();
213 for( GeoDataFeature* feature: m_deletedObjects ) {
214 if( feature->targetId().isEmpty() ) {
217 GeoDataFeature* target = findFeature( m_rootDocument, feature->targetId() );
220 Q_ASSERT(
dynamic_cast<GeoDataContainer*
>( target ) );
221 emit added(
static_cast<GeoDataContainer*
>( target ), feature, -1 );
222 if (
auto placemark = geodata_cast<GeoDataPlacemark>(feature))
224 if( placemark->isBalloonVisible() ) {
225 emit balloonShown( placemark );
230 m_deletedObjects.clear();
233 bool PlaybackAnimatedUpdateItem::isApplied()
const
238 bool PlaybackAnimatedUpdateItem::canDelete(
const GeoDataFeature &feature)
240 return geodata_cast<GeoDataDocument>(&feature) ||
241 geodata_cast<GeoDataFolder>(&feature) ||
242 geodata_cast<GeoDataGroundOverlay>(&feature) ||
243 geodata_cast<GeoDataPlacemark>(&feature) ||
244 geodata_cast<GeoDataScreenOverlay>(&feature) ||
245 geodata_cast<GeoDataPhotoOverlay>(&feature);
250 #include "moc_PlaybackAnimatedUpdateItem.cpp"