33 #include <QSortFilterProxyModel>
36 #include <QFileDialog>
38 #include <QMouseEvent>
40 #include <QToolButton>
41 #include <QProgressDialog>
43 #include "ui_RoutingWidget.h"
48 class RoutingWidgetPrivate
51 Ui::RoutingWidget m_ui;
55 RoutingManager *
const m_routingManager;
57 RoutingLayer *
const m_routingLayer;
59 RoutingInputWidget *m_activeInput;
61 QVector<RoutingInputWidget*> m_inputWidgets;
63 RoutingInputWidget *m_inputRequest;
67 RouteRequest *
const m_routeRequest;
69 RouteSyncManager *m_routeSyncManager;
71 bool m_zoomRouteAfterDownload;
73 QTimer m_progressTimer;
75 QVector<QIcon> m_progressAnimation;
85 QToolButton *m_openRouteButton;
86 QToolButton *m_saveRouteButton;
87 QAction *m_cloudSyncSeparator;
88 QAction *m_uploadToCloudAction;
89 QAction *m_openCloudRoutesAction;
90 QToolButton *m_addViaButton;
91 QToolButton *m_reverseRouteButton;
92 QToolButton *m_clearRouteButton;
93 QToolButton *m_configureButton;
95 QProgressDialog* m_routeUploadDialog;
98 RoutingWidgetPrivate(RoutingWidget *parent,
MarbleWidget *marbleWidget );
104 void adjustInputWidgets();
106 void adjustSearchButton();
114 void setActiveInput( RoutingInputWidget* widget );
119 void createProgressAnimation();
120 RoutingWidget *m_parent;
123 RoutingWidgetPrivate::RoutingWidgetPrivate( RoutingWidget *parent,
MarbleWidget *marbleWidget ) :
124 m_widget( marbleWidget ),
125 m_routingManager( marbleWidget->model()->routingManager() ),
126 m_routingLayer( marbleWidget->routingLayer() ),
129 m_routingModel( m_routingManager->routingModel() ),
130 m_routeRequest( marbleWidget->model()->routingManager()->routeRequest() ),
131 m_routeSyncManager( 0 ),
132 m_zoomRouteAfterDownload( false ),
135 m_collapse_width( 0 ),
136 m_routeUploadDialog( 0 ),
139 createProgressAnimation();
140 m_progressTimer.setInterval( 100 );
146 void RoutingWidgetPrivate::adjustInputWidgets()
148 for (
int i = 0; i < m_inputWidgets.size(); ++i ) {
149 m_inputWidgets[i]->setIndex( i );
152 adjustSearchButton();
155 void RoutingWidgetPrivate::adjustSearchButton()
157 QString text = QObject::tr(
"Get Directions" );
158 QString tooltip = QObject::tr(
"Retrieve routing instructions for the selected destinations." );
161 for (
int i = 0; i < m_inputWidgets.size(); ++i ) {
162 if ( m_inputWidgets[i]->hasTargetPosition() ) {
167 if ( validInputs < 2 ) {
168 text = QObject::tr(
"Search" );
169 tooltip = QObject::tr(
"Find places matching the search term" );
172 m_ui.searchButton->setText( text );
173 m_ui.searchButton->setToolTip( tooltip );
176 void RoutingWidgetPrivate::setActiveInput( RoutingInputWidget *widget )
178 Q_ASSERT( widget &&
"Must not pass null" );
179 MarblePlacemarkModel *model = widget->searchResultModel();
181 m_activeInput = widget;
182 m_ui.directionsListView->setModel( model );
183 m_routingLayer->setPlacemarkModel( model );
184 m_routingLayer->synchronizeWith( m_ui.directionsListView->selectionModel() );
187 void RoutingWidgetPrivate::setupToolBar()
189 m_toolBar =
new QToolBar;
191 m_openRouteButton =
new QToolButton;
192 m_openRouteButton->setToolTip( QObject::tr(
"Open Route") );
193 m_openRouteButton->setIcon( QIcon(
":/icons/16x16/document-open.png") );
194 m_toolBar->addWidget(m_openRouteButton);
196 m_saveRouteButton =
new QToolButton;
197 m_saveRouteButton->setToolTip( QObject::tr(
"Save Route") );
198 m_saveRouteButton->setIcon( QIcon(
":/icons/16x16/document-save.png") );
199 m_toolBar->addWidget(m_saveRouteButton);
201 m_cloudSyncSeparator = m_toolBar->addSeparator();
202 m_uploadToCloudAction = m_toolBar->addAction( QObject::tr(
"Upload to Cloud") );
203 m_uploadToCloudAction->setToolTip( QObject::tr(
"Upload to Cloud") );
204 m_uploadToCloudAction->setIcon( QIcon(
":/icons/cloud-upload.png") );
206 m_openCloudRoutesAction = m_toolBar->addAction( QObject::tr(
"Manage Cloud Routes") );
207 m_openCloudRoutesAction->setToolTip( QObject::tr(
"Manage Cloud Routes") );
208 m_openCloudRoutesAction->setIcon( QIcon(
":/icons/cloud-download.png") );
210 m_toolBar->addSeparator();
211 m_addViaButton =
new QToolButton;
212 m_addViaButton->setToolTip( QObject::tr(
"Add Via") );
213 m_addViaButton->setIcon( QIcon(
":/marble/list-add.png") );
214 m_toolBar->addWidget(m_addViaButton);
216 m_reverseRouteButton =
new QToolButton;
217 m_reverseRouteButton->setToolTip( QObject::tr(
"Reverse Route") );
218 m_reverseRouteButton->setIcon( QIcon(
":/marble/reverse.png") );
219 m_toolBar->addWidget(m_reverseRouteButton);
221 m_clearRouteButton =
new QToolButton;
222 m_clearRouteButton->setToolTip( QObject::tr(
"Clear Route") );
223 m_clearRouteButton->setIcon( QIcon(
":/marble/edit-clear.png") );
224 m_toolBar->addWidget(m_clearRouteButton);
226 m_toolBar->addSeparator();
228 m_configureButton =
new QToolButton;
229 m_configureButton->setToolTip( QObject::tr(
"Settings") );
230 m_configureButton->setIcon( QIcon(
":/icons/16x16/configure.png") );
231 m_toolBar->addWidget(m_configureButton);
233 QObject::connect( m_openRouteButton, SIGNAL(clicked()),
234 m_parent, SLOT(openRoute()) );
235 QObject::connect( m_saveRouteButton, SIGNAL(clicked()),
236 m_parent, SLOT(saveRoute()) );
237 QObject::connect( m_uploadToCloudAction, SIGNAL(triggered()),
238 m_parent, SLOT(uploadToCloud()) );
239 QObject::connect( m_openCloudRoutesAction, SIGNAL(triggered()),
240 m_parent, SLOT(openCloudRoutesDialog()));
241 QObject::connect( m_addViaButton, SIGNAL(clicked()),
242 m_parent, SLOT(addInputWidget()) );
243 QObject::connect( m_reverseRouteButton, SIGNAL(clicked()),
244 m_routingManager, SLOT(reverseRoute()) );
245 QObject::connect( m_clearRouteButton, SIGNAL(clicked()),
246 m_routingManager, SLOT(clearRoute()) );
247 QObject::connect( m_configureButton, SIGNAL(clicked()),
248 m_parent, SLOT(configureProfile()) );
250 m_toolBar->setIconSize(QSize(16, 16));
251 m_ui.toolBarLayout->addWidget(m_toolBar, 0, Qt::AlignLeft);
254 void RoutingWidgetPrivate::createProgressAnimation()
257 qreal
const h = m_iconSize / 2.0;
258 qreal
const q = h / 2.0;
260 qreal
const r = d / 2.0;
263 QImage canvas( m_iconSize, m_iconSize, QImage::Format_ARGB32 );
265 painter.setRenderHint( QPainter::Antialiasing,
true );
266 painter.setPen( QColor ( Qt::gray ) );
267 painter.setBrush( QColor( Qt::white ) );
270 for(
double t = 0.0; t < 2 *
M_PI; t += M_PI / 8.0 ) {
271 canvas.fill( Qt::transparent );
272 QRectF firstCircle( h - r + q * cos( t ), h - r + q * sin( t ), d, d );
273 QRectF secondCircle( h - r + q * cos( t + M_PI ), h - r + q * sin( t + M_PI ), d, d );
274 painter.drawEllipse( firstCircle );
275 painter.drawEllipse( secondCircle );
276 m_progressAnimation.push_back( QIcon( QPixmap::fromImage( canvas ) ) );
281 QWidget( parent ), d( new RoutingWidgetPrivate( this, marbleWidget ) )
283 d->m_ui.setupUi(
this );
285 d->m_ui.routeComboBox->setVisible(
false );
286 d->m_ui.routeComboBox->setModel( d->m_routingManager->alternativeRoutesModel() );
287 layout()->setMargin( 0 );
289 d->m_ui.routingProfileComboBox->setModel( d->m_routingManager->profilesModel() );
291 connect( d->m_routingManager->profilesModel(), SIGNAL(rowsInserted(QModelIndex,
int,
int)),
292 this, SLOT(selectFirstProfile()) );
293 connect( d->m_routingManager->profilesModel(), SIGNAL(modelReset()),
294 this, SLOT(selectFirstProfile()) );
295 connect( d->m_routingLayer, SIGNAL(placemarkSelected(QModelIndex)),
296 this, SLOT(activatePlacemark(QModelIndex)) );
299 connect( d->m_routingManager, SIGNAL(routeRetrieved(
GeoDataDocument*)),
301 connect( d->m_routeRequest, SIGNAL(positionAdded(
int)),
302 this, SLOT(insertInputWidget(
int)) );
303 connect( d->m_routeRequest, SIGNAL(positionRemoved(
int)),
304 this, SLOT(removeInputWidget(
int)) );
305 connect( d->m_routeRequest, SIGNAL(routingProfileChanged()),
306 this, SLOT(updateActiveRoutingProfile()) );
307 connect( &d->m_progressTimer, SIGNAL(timeout()),
308 this, SLOT(updateProgress()) );
309 connect( d->m_ui.routeComboBox, SIGNAL(currentIndexChanged(
int)),
310 d->m_routingManager->alternativeRoutesModel(), SLOT(setCurrentRoute(
int)) );
311 connect( d->m_routingManager->alternativeRoutesModel(), SIGNAL(currentRouteChanged(
int)),
312 d->m_ui.routeComboBox, SLOT(setCurrentIndex(
int)) );
313 connect( d->m_ui.routingProfileComboBox, SIGNAL(currentIndexChanged(
int)),
314 this, SLOT(setRoutingProfile(
int)) );
315 connect( d->m_ui.routingProfileComboBox, SIGNAL(activated(
int)),
316 this, SLOT(retrieveRoute()) );
317 connect( d->m_routingManager->alternativeRoutesModel(), SIGNAL(rowsInserted(QModelIndex,
int,
int)),
318 this, SLOT(updateAlternativeRoutes()) );
320 d->m_ui.directionsListView->setModel( d->m_routingModel );
322 QItemSelectionModel *selectionModel = d->m_ui.directionsListView->selectionModel();
323 d->m_routingLayer->synchronizeWith( selectionModel );
324 connect( d->m_ui.directionsListView, SIGNAL(activated(QModelIndex)),
325 this, SLOT(activateItem(QModelIndex)) );
328 connect( d->m_ui.searchButton, SIGNAL(clicked()),
329 this, SLOT(retrieveRoute()) );
330 connect( d->m_ui.showInstructionsButton, SIGNAL(clicked(
bool)),
331 this, SLOT(showDirections()) );
333 for(
int i=0; i<d->m_routeRequest->size(); ++i ) {
334 insertInputWidget( i );
337 for (
int i=0; i<2 && d->m_inputWidgets.size()<2; ++i ) {
342 d->m_ui.resultLabel->setVisible(
false );
344 updateActiveRoutingProfile();
345 updateCloudSyncButtons();
348 d->m_ui.directionsListView->setVisible(
false );
349 d->m_openRouteButton->setVisible(
false );
350 d->m_saveRouteButton->setVisible(
false );
352 d->m_ui.directionsListView->setAttribute( Qt::WA_Maemo5StackedWindow );
353 d->m_ui.directionsListView->setWindowFlags( Qt::Window );
354 d->m_ui.directionsListView->setWindowTitle( tr(
"Directions - Marble" ) );
355 #endif // Q_WS_MAEMO_5
364 void RoutingWidget::retrieveRoute()
366 if ( d->m_inputWidgets.size() == 1 ) {
368 d->m_inputWidgets.first()->findPlacemarks();
372 int index = d->m_ui.routingProfileComboBox->currentIndex();
376 d->m_routeRequest->setRoutingProfile( d->m_routingManager->profilesModel()->profiles().at( index ) );
378 Q_ASSERT( d->m_routeRequest->size() == d->m_inputWidgets.size() );
379 for (
int i = 0; i < d->m_inputWidgets.size(); ++i ) {
380 RoutingInputWidget *widget = d->m_inputWidgets.at( i );
381 if ( !widget->hasTargetPosition() && widget->hasInput() ) {
382 widget->findPlacemarks();
387 d->m_activeInput = 0;
388 if ( d->m_routeRequest->size() > 1 ) {
389 d->m_zoomRouteAfterDownload =
true;
390 d->m_routingLayer->setPlacemarkModel( 0 );
391 d->m_routingManager->retrieveRoute();
392 d->m_ui.directionsListView->setModel( d->m_routingModel );
393 d->m_routingLayer->synchronizeWith( d->m_ui.directionsListView->selectionModel() );
397 void RoutingWidget::activateItem (
const QModelIndex &index )
401 if ( !data.isNull() ) {
402 GeoDataCoordinates position = qvariant_cast<GeoDataCoordinates>( data );
403 d->m_widget->centerOn( position,
true );
406 if ( d->m_activeInput && index.isValid() ) {
408 if ( !data.isNull() ) {
409 d->m_activeInput->setTargetPosition( data.value<GeoDataCoordinates>(), index.data().toString() );
414 void RoutingWidget::handleSearchResult( RoutingInputWidget *widget )
416 d->setActiveInput( widget );
417 MarblePlacemarkModel *model = widget->searchResultModel();
419 if ( model->rowCount() ) {
420 QString
const results = tr(
"placemarks found: %1" ).arg( model->rowCount() );
421 d->m_ui.resultLabel->setText( results );
422 d->m_ui.resultLabel->setVisible(
true );
424 activatePlacemark( model->index( 0, 0 ) );
426 QString
const results = tr(
"No placemark found" );
427 d->m_ui.resultLabel->setText(
"<font color=\"red\">" + results +
"</font>" );
428 d->m_ui.resultLabel->setVisible(
true );
431 GeoDataLineString placemarks;
432 for (
int i = 0; i < model->rowCount(); ++i ) {
434 if ( !data.isNull() ) {
435 placemarks << data.value<GeoDataCoordinates>();
439 if ( placemarks.size() > 1 ) {
444 d->m_ui.directionsListView->setVisible(
true );
449 void RoutingWidget::centerOnInputWidget( RoutingInputWidget *widget )
451 if ( widget->hasTargetPosition() ) {
452 d->m_widget->centerOn( widget->targetPosition() );
456 void RoutingWidget::activatePlacemark(
const QModelIndex &index )
458 if ( d->m_activeInput && index.isValid() ) {
460 if ( !data.isNull() ) {
461 d->m_activeInput->setTargetPosition( data.value<GeoDataCoordinates>() );
465 d->m_ui.directionsListView->setCurrentIndex( index );
473 void RoutingWidget::insertInputWidget(
int index )
475 if ( index >= 0 && index <= d->m_inputWidgets.size() ) {
478 d->m_inputWidgets.insert( index, input );
487 connect( input, SIGNAL(targetValidityChanged(
bool)),
488 this, SLOT(adjustSearchButton()) );
490 d->m_ui.routingLayout->insertWidget( index, input );
491 d->adjustInputWidgets();
495 void RoutingWidget::removeInputWidget( RoutingInputWidget *widget )
497 int index = d->m_inputWidgets.indexOf( widget );
499 if ( d->m_inputWidgets.size() < 3 ) {
502 d->m_routeRequest->remove( index );
504 d->m_routingManager->retrieveRoute();
508 void RoutingWidget::removeInputWidget(
int index )
510 if ( index >= 0 && index < d->m_inputWidgets.size() ) {
511 RoutingInputWidget *widget = d->m_inputWidgets.at( index );
512 d->m_inputWidgets.remove( index );
513 d->m_ui.routingLayout->removeWidget( widget );
514 widget->deleteLater();
515 if ( widget == d->m_activeInput ) {
516 d->m_activeInput = 0;
517 d->m_routingLayer->setPlacemarkModel( 0 );
518 d->m_ui.directionsListView->setModel( d->m_routingModel );
519 d->m_routingLayer->synchronizeWith( d->m_ui.directionsListView->selectionModel() );
521 d->adjustInputWidgets();
524 if ( d->m_inputWidgets.size() < 2 ) {
532 d->m_ui.routeComboBox->setVisible(
false );
533 d->m_ui.routeComboBox->clear();
537 d->m_progressTimer.start();
540 d->m_saveRouteButton->setEnabled( d->m_routingManager->routingModel()->rowCount() > 0 );
543 void RoutingWidget::requestMapPosition( RoutingInputWidget *widget,
bool enabled )
545 pointSelectionCanceled();
548 d->m_inputRequest = widget;
549 d->m_widget->installEventFilter(
this );
550 d->m_widget->setFocus( Qt::OtherFocusReason );
554 void RoutingWidget::retrieveSelectedPoint(
const GeoDataCoordinates &coordinates )
556 if ( d->m_inputRequest && d->m_inputWidgets.contains( d->m_inputRequest ) ) {
557 d->m_inputRequest->setTargetPosition( coordinates );
558 d->m_widget->update();
561 d->m_inputRequest = 0;
562 d->m_widget->removeEventFilter(
this );
565 void RoutingWidget::adjustSearchButton()
567 d->adjustSearchButton();
570 void RoutingWidget::pointSelectionCanceled()
572 if ( d->m_inputRequest && d->m_inputWidgets.contains( d->m_inputRequest ) ) {
573 d->m_inputRequest->abortMapInputRequest();
576 d->m_inputRequest = 0;
577 d->m_widget->removeEventFilter(
this );
580 void RoutingWidget::configureProfile()
582 int index = d->m_ui.routingProfileComboBox->currentIndex();
584 RoutingProfileSettingsDialog dialog( d->m_widget->model()->pluginManager(), d->m_routingManager->profilesModel(), this );
585 dialog.editProfile( d->m_ui.routingProfileComboBox->currentIndex() );
586 d->m_routeRequest->setRoutingProfile( d->m_routingManager->profilesModel()->profiles().at( index ) );
590 void RoutingWidget::updateProgress()
592 if ( !d->m_progressAnimation.isEmpty() ) {
593 d->m_currentFrame = ( d->m_currentFrame + 1 ) % d->m_progressAnimation.size();
594 QIcon frame = d->m_progressAnimation[d->m_currentFrame];
595 d->m_ui.searchButton->setIcon( frame );
596 d->m_ui.resultLabel->setVisible(
false );
600 void RoutingWidget::updateAlternativeRoutes()
602 if ( d->m_ui.routeComboBox->count() == 1) {
604 GeoDataLatLonBox
const bbox = d->m_routingManager->routingModel()->route().bounds();
605 if ( d->m_zoomRouteAfterDownload ) {
606 d->m_zoomRouteAfterDownload =
false;
607 d->m_widget->centerOn( bbox );
611 d->m_ui.routeComboBox->setVisible( d->m_ui.routeComboBox->count() > 0 );
612 if ( d->m_ui.routeComboBox->currentIndex() < 0 && d->m_ui.routeComboBox->count() > 0 ) {
613 d->m_ui.routeComboBox->setCurrentIndex( 0 );
616 d->m_progressTimer.stop();
617 d->m_ui.searchButton->setIcon( QIcon() );
619 QString
const results = tr(
"routes found: %1" ).arg( d->m_ui.routeComboBox->count() );
620 d->m_ui.resultLabel->setText( results );
621 d->m_ui.resultLabel->setVisible(
true );
622 d->m_saveRouteButton->setEnabled( d->m_routingManager->routingModel()->rowCount() > 0 );
627 d->m_ui.showInstructionsButton->setVisible( visible );
632 d->m_routeSyncManager = manager;
633 connect( d->m_routeSyncManager, SIGNAL(routeSyncEnabledChanged(
bool)),
634 this, SLOT(updateCloudSyncButtons()) );
635 updateCloudSyncButtons();
640 QString
const file = QFileDialog::getOpenFileName(
this, tr(
"Open Route" ),
641 d->m_routingManager->lastOpenPath(), tr(
"KML Files (*.kml)") );
642 if ( !file.isEmpty() ) {
643 d->m_routingManager->setLastOpenPath( QFileInfo( file ).absolutePath() );
644 d->m_zoomRouteAfterDownload =
true;
645 d->m_routingManager->loadRoute( file );
646 updateAlternativeRoutes();
650 void RoutingWidget::selectFirstProfile()
652 int count = d->m_routingManager->profilesModel()->rowCount();
653 if ( count && d->m_ui.routingProfileComboBox->currentIndex() < 0 ) {
654 d->m_ui.routingProfileComboBox->setCurrentIndex( 0 );
658 void RoutingWidget::setRoutingProfile(
int index )
660 if ( index >= 0 && index < d->m_routingManager->profilesModel()->rowCount() ) {
661 d->m_routeRequest->setRoutingProfile( d->m_routingManager->profilesModel()->profiles().at( index ) );
665 void RoutingWidget::showDirections()
667 d->m_ui.directionsListView->setVisible(
true );
672 QString fileName = QFileDialog::getSaveFileName(
this,
674 d->m_routingManager->lastSavePath(),
675 tr(
"KML files (*.kml)" ) );
677 if ( !fileName.isEmpty() ) {
679 if ( !fileName.endsWith(QLatin1String(
".kml" ), Qt::CaseInsensitive) ) {
680 fileName.append(
".kml" );
682 d->m_routingManager->setLastSavePath( QFileInfo( fileName ).absolutePath() );
683 d->m_routingManager->saveRoute( fileName );
689 Q_ASSERT( d->m_routeSyncManager );
691 if (!d->m_routeUploadDialog) {
692 d->m_routeUploadDialog =
new QProgressDialog( d->m_widget );
693 d->m_routeUploadDialog->setWindowTitle( tr(
"Uploading route..." ) );
694 d->m_routeUploadDialog->setMinimum( 0 );
695 d->m_routeUploadDialog->setMaximum( 100 );
696 d->m_routeUploadDialog->setAutoClose(
true );
697 d->m_routeUploadDialog->setAutoReset(
true );
698 connect( d->m_routeSyncManager, SIGNAL(routeUploadProgress(qint64,qint64)),
this, SLOT(updateUploadProgress(qint64,qint64)) );
701 d->m_routeUploadDialog->show();
702 d->m_routeSyncManager->uploadRoute();
707 Q_ASSERT( d->m_routeSyncManager );
708 d->m_routeSyncManager->prepareRouteList();
711 connect( d->m_routeSyncManager, SIGNAL(routeListDownloadProgress(qint64,qint64)), dialog, SLOT(updateListDownloadProgressbar(qint64,qint64)) );
712 connect( dialog, SIGNAL(downloadButtonClicked(QString)), d->m_routeSyncManager, SLOT(downloadRoute(QString)) );
713 connect( dialog, SIGNAL(openButtonClicked(QString)),
this, SLOT(openCloudRoute(QString)) );
714 connect( dialog, SIGNAL(deleteButtonClicked(QString)), d->m_routeSyncManager, SLOT(deleteRoute(QString)) );
715 connect( dialog, SIGNAL(removeFromCacheButtonClicked(QString)), d->m_routeSyncManager, SLOT(removeRouteFromCache(QString)) );
716 connect( dialog, SIGNAL(uploadToCloudButtonClicked(QString)), d->m_routeSyncManager, SLOT(uploadRoute(QString)) );
723 d->m_progressTimer.stop();
724 d->m_ui.searchButton->setIcon( QIcon() );
725 QString
const results = tr(
"No route found" );
726 d->m_ui.resultLabel->setText(
"<font color=\"red\">" + results +
"</font>" );
727 d->m_ui.resultLabel->setVisible(
true );
731 void RoutingWidget::updateActiveRoutingProfile()
733 RoutingProfile
const profile = d->m_routingManager->routeRequest()->routingProfile();
734 QList<RoutingProfile>
const profiles = d->m_routingManager->profilesModel()->profiles();
735 d->m_ui.routingProfileComboBox->setCurrentIndex( profiles.indexOf( profile ) );
738 void RoutingWidget::updateCloudSyncButtons()
740 bool const show = d->m_routeSyncManager && d->m_routeSyncManager->isRouteSyncEnabled();
741 d->m_cloudSyncSeparator->setVisible( show );
742 d->m_uploadToCloudAction->setVisible( show );
743 d->m_openCloudRoutesAction->setVisible( show );
746 void RoutingWidget::openCloudRoute(
const QString &identifier)
748 Q_ASSERT( d->m_routeSyncManager );
749 d->m_routeSyncManager->openRoute( identifier );
750 d->m_widget->centerOn( d->m_routingManager->routingModel()->route().bounds() );
753 void RoutingWidget::updateUploadProgress(qint64 sent, qint64 total)
755 Q_ASSERT( d->m_routeUploadDialog );
756 d->m_routeUploadDialog->setValue( 100.0 * sent / total );
761 if ( o != d->m_widget ) {
762 return QWidget::eventFilter( o, event );
765 Q_ASSERT( d->m_inputRequest != 0 );
766 Q_ASSERT( d->m_inputWidgets.contains( d->m_inputRequest ) );
768 if ( event->type() == QEvent::MouseButtonPress ) {
769 QMouseEvent *e =
static_cast<QMouseEvent*
>( event );
770 return e->button() == Qt::LeftButton;
773 if ( event->type() == QEvent::MouseButtonRelease ) {
774 QMouseEvent *e =
static_cast<QMouseEvent*
>( event );
775 qreal lon( 0.0 ), lat( 0.0 );
776 if ( e->button() == Qt::LeftButton && d->m_widget->geoCoordinates( e->pos().x(), e->pos().y(),
781 return QWidget::eventFilter( o, event );
785 if ( event->type() == QEvent::MouseMove ) {
786 d->m_widget->setCursor( Qt::CrossCursor );
790 if ( event->type() == QEvent::KeyPress ) {
791 QKeyEvent *e =
static_cast<QKeyEvent*
>( event );
792 if ( e->key() == Qt::Key_Escape ) {
793 pointSelectionCanceled();
797 return QWidget::eventFilter( o, event );
800 return QWidget::eventFilter( o, event );
805 QWidget::resizeEvent(e);
810 #include "RoutingWidget.moc"
A 3d point representation.
A container for Features, Styles and in the future Schemas.
This file contains the headers for MarbleModel.
static GeoDataLatLonBox fromLineString(const GeoDataLineString &lineString)
Create the smallest bounding box from a line string.
static MarbleGlobal * getInstance()
The GeoDataCoordinates coordinate.