GeoDataFeature* TourWidgetPrivate::getPlaylistFeature() const { GeoDataObject *rootObject = rootIndexObject(); if ( rootObject && rootObject->nodeType() == GeoDataTypes::GeoDataPlaylistType ) { GeoDataPlaylist *playlist = static_cast<GeoDataPlaylist*>( rootObject ); GeoDataObject *object = playlist->parent(); if ( object && object->nodeType() == GeoDataTypes::GeoDataTourType ) { return static_cast<GeoDataFeature*>( object ); } } return 0; }
void TourWidgetPrivate::addTourPrimitive( GeoDataTourPrimitive *primitive ) { GeoDataObject *rootObject = rootIndexObject(); if ( rootObject->nodeType() == GeoDataTypes::GeoDataPlaylistType ) { GeoDataPlaylist *playlist = static_cast<GeoDataPlaylist*>( rootObject ); QModelIndex currentIndex = m_tourUi.m_listView->currentIndex(); QModelIndex playlistIndex = m_widget->model()->treeModel()->index( playlist ); int row = currentIndex.isValid() ? currentIndex.row()+1 : playlist->size(); m_widget->model()->treeModel()->addTourPrimitive( playlistIndex, primitive, row ); m_isChanged = true; m_tourUi.m_actionSaveTour->setEnabled( true ); } }
void TourWidgetPrivate::moveDown() { GeoDataObject *rootObject = rootIndexObject(); if ( rootObject && rootObject->nodeType() == GeoDataTypes::GeoDataPlaylistType ) { GeoDataPlaylist *playlist = static_cast<GeoDataPlaylist*>( rootObject ); QModelIndex playlistIndex = m_widget->model()->treeModel()->index( playlist ); QModelIndexList selected = m_tourUi.m_listView->selectionModel()->selectedIndexes(); qSort( selected.begin(), selected.end(), qGreater<QModelIndex>() ); QModelIndexList::iterator end = selected.end(); QModelIndexList::iterator iter = selected.begin(); for( ; iter != end; ++iter ) { int const index = iter->row(); Q_ASSERT( index < playlist->size()-1 ); m_widget->model()->treeModel()->swapTourPrimitives( playlistIndex, index, index+1 ); } m_isChanged = true; m_tourUi.m_actionSaveTour->setEnabled( true ); updateButtonsStates(); } }
void TourWidgetPrivate::updateButtonsStates() { QModelIndexList selectedIndexes = m_tourUi.m_listView->selectionModel()->selectedIndexes(); if ( selectedIndexes.isEmpty() ) { m_tourUi.m_actionDelete->setEnabled( false ); m_tourUi.m_actionMoveDown->setEnabled( false ); m_tourUi.m_actionMoveUp->setEnabled( false ); } else { m_tourUi.m_actionDelete->setEnabled( true ); qSort( selectedIndexes.begin(), selectedIndexes.end(), qLess<QModelIndex>() ); QModelIndexList::iterator end = selectedIndexes.end()-1; QModelIndexList::iterator start = selectedIndexes.begin(); m_tourUi.m_actionMoveUp->setEnabled( ( start->row() != 0 ) ); // if we can move up enable action else disable. GeoDataObject *rootObject = rootIndexObject(); if ( rootObject && rootObject->nodeType() == GeoDataTypes::GeoDataPlaylistType ) { GeoDataPlaylist *playlist = static_cast<GeoDataPlaylist*>( rootObject ); m_tourUi.m_actionMoveDown->setEnabled( ( end->row() != playlist->size()-1 ) ); // if we can move down enable action else disable. } } }
void TourWidgetPrivate::updateRootIndex() { GeoDataTour *tour = findTour( m_document ); if ( tour ){ GeoDataPlaylist *playlist = tour->playlist(); if ( playlist ) { m_tourUi.m_listView->setModel( m_widget->model()->treeModel() ); m_tourUi.m_listView->setRootIndex( m_widget->model()->treeModel()->index( playlist ) ); QObject::connect( m_tourUi.m_listView->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ), q, SLOT( updateButtonsStates() ) ); } m_playback.setMarbleWidget( m_widget ); m_playback.setTour( tour ); m_tourUi.m_slider->setMaximum( m_playback.duration() * 100 ); QTime nullTime( 0, 0, 0 ); QTime time = nullTime.addSecs( m_playback.duration() ); m_tourUi.m_totalTime->setText( QString("%L1:%L2").arg( time.minute(), 2, 10, QChar('0') ).arg( time.second(), 2, 10, QChar('0') ) ); QObject::connect( &m_playback, SIGNAL( progressChanged( double ) ), q, SLOT( handlePlaybackProgress( double ) ) ); q->stopPlaying(); m_tourUi.m_toolBarPlayback->setEnabled( true ); bool isPlaybackEmpty = m_playback.mainTrackSize() != 0; m_tourUi.actionPlay->setEnabled( isPlaybackEmpty ); m_tourUi.m_slider->setEnabled( isPlaybackEmpty ); m_tourUi.m_actionRecord->setEnabled( isPlaybackEmpty ); m_tourUi.actionStop->setEnabled( false ); if( m_playback.mainTrackSize() > 0 ) { if( dynamic_cast<PlaybackFlyToItem*>( m_playback.mainTrackItemAt( 0 ) ) ) { QModelIndex playlistIndex = m_widget->model()->treeModel()->index( playlist ); for( int i = 0; i < playlist->size(); ++i ) { if( playlist->primitive( i )->nodeType() == GeoDataTypes::GeoDataFlyToType ) { m_delegate->setFirstFlyTo( m_widget->model()->treeModel()->index( i, 0, playlistIndex ) ); break; } } } else { m_delegate->setFirstFlyTo( QPersistentModelIndex() ); } } } }
void TestTour::simpleParseTest() { QString const centerContent ( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<kml xmlns=\"http://www.opengis.net/kml/2.2\"" " xmlns:gx=\"http://www.google.com/kml/ext/2.2\">" "<Folder>" " <gx:Tour>" " <name>My Tour</name>" " <description>This is my tour.</description>" " </gx:Tour>" " <gx:Tour id=\"tourId\">" " <gx:Playlist>" " <gx:TourControl id=\"space\">" " <gx:playMode>pause</gx:playMode>" " </gx:TourControl>" " </gx:Playlist>" " </gx:Tour>" " <gx:Tour id=\"animUpd\">" " <name>TourAnim</name>" " <description>Tour with AnimatedUpdate</description>" " <gx:Playlist>" " <gx:AnimatedUpdate>" " <gx:duration>5.0</gx:duration>" " <Update>" " <targetHref>Whatever.jpg</targetHref>" " </Update>" " </gx:AnimatedUpdate>" " </gx:Playlist>" " </gx:Tour>" "</Folder>" "</kml>" ); GeoDataDocument* dataDocument = parseKml( centerContent ); QCOMPARE( dataDocument->folderList().size(), 1 ); GeoDataFolder *folder = dataDocument->folderList().at( 0 ); GeoDataTour *tour_1 = dynamic_cast<GeoDataTour*>(folder->child(0)); GeoDataTour *tour_2 = dynamic_cast<GeoDataTour*>(folder->child(1)); GeoDataTour *tour_3 = dynamic_cast<GeoDataTour*>(folder->child(2)); QVERIFY(tour_1 != 0); QVERIFY(tour_2 != 0); QVERIFY(tour_3 != 0); QCOMPARE(tour_1->id(), QString("")); QCOMPARE(tour_1->name(), QString("My Tour")); QCOMPARE(tour_1->description(), QString("This is my tour.")); QCOMPARE(tour_2->id(), QString("tourId")); QCOMPARE(tour_2->name(), QString()); QCOMPARE(tour_2->description(), QString()); QCOMPARE(tour_3->id(), QString("animUpd")); QCOMPARE(tour_3->name(), QString("TourAnim")); QCOMPARE(tour_3->description(), QString("Tour with AnimatedUpdate")); GeoDataPlaylist *playlist = tour_2->playlist(); QVERIFY(playlist != 0); GeoDataTourControl *control = dynamic_cast<GeoDataTourControl*>( playlist->primitive(0)); QVERIFY(control != 0); QCOMPARE(control->id(), QString("space")); QCOMPARE(control->playMode(), GeoDataTourControl::Pause); GeoDataPlaylist *playlist2 = tour_3->playlist(); QVERIFY(playlist2 != 0); GeoDataAnimatedUpdate *update = dynamic_cast<GeoDataAnimatedUpdate*>(playlist2->primitive(0)); QVERIFY(update != 0); QCOMPARE(update->duration(),5.0); QCOMPARE(update->update()->targetHref(),QString("Whatever.jpg")); delete dataDocument; }