1 #include "qmapboxgl_map_observer.hpp"
2 
3 #include "qmapboxgl_p.hpp"
4 
5 #include <mbgl/util/exception.hpp>
6 
7 #include <exception>
8 
QMapboxGLMapObserver(QMapboxGLPrivate * d)9 QMapboxGLMapObserver::QMapboxGLMapObserver(QMapboxGLPrivate *d)
10     : d_ptr(d)
11 {
12 }
13 
~QMapboxGLMapObserver()14 QMapboxGLMapObserver::~QMapboxGLMapObserver()
15 {
16 }
17 
onCameraWillChange(mbgl::MapObserver::CameraChangeMode mode)18 void QMapboxGLMapObserver::onCameraWillChange(mbgl::MapObserver::CameraChangeMode mode)
19 {
20     if (mode == mbgl::MapObserver::CameraChangeMode::Immediate) {
21         emit mapChanged(QMapboxGL::MapChangeRegionWillChange);
22     } else {
23         emit mapChanged(QMapboxGL::MapChangeRegionWillChangeAnimated);
24     }
25 }
26 
onCameraIsChanging()27 void QMapboxGLMapObserver::onCameraIsChanging()
28 {
29     emit mapChanged(QMapboxGL::MapChangeRegionIsChanging);
30 }
31 
onCameraDidChange(mbgl::MapObserver::CameraChangeMode mode)32 void QMapboxGLMapObserver::onCameraDidChange(mbgl::MapObserver::CameraChangeMode mode)
33 {
34     if (mode == mbgl::MapObserver::CameraChangeMode::Immediate) {
35         emit mapChanged(QMapboxGL::MapChangeRegionDidChange);
36     } else {
37         emit mapChanged(QMapboxGL::MapChangeRegionDidChangeAnimated);
38     }
39 }
40 
onWillStartLoadingMap()41 void QMapboxGLMapObserver::onWillStartLoadingMap()
42 {
43     emit mapChanged(QMapboxGL::MapChangeWillStartLoadingMap);
44 }
45 
onDidFinishLoadingMap()46 void QMapboxGLMapObserver::onDidFinishLoadingMap()
47 {
48     emit mapChanged(QMapboxGL::MapChangeDidFinishLoadingMap);
49 }
50 
onDidFailLoadingMap(std::exception_ptr exception)51 void QMapboxGLMapObserver::onDidFailLoadingMap(std::exception_ptr exception)
52 {
53     emit mapChanged(QMapboxGL::MapChangeDidFailLoadingMap);
54 
55     QMapboxGL::MapLoadingFailure type;
56     QString description;
57 
58     try {
59         std::rethrow_exception(exception);
60     } catch (const mbgl::util::StyleParseException& e) {
61         type = QMapboxGL::MapLoadingFailure::StyleParseFailure;
62         description = e.what();
63     } catch (const mbgl::util::StyleLoadException& e) {
64         type = QMapboxGL::MapLoadingFailure::StyleLoadFailure;
65         description = e.what();
66     } catch (const mbgl::util::NotFoundException& e) {
67         type = QMapboxGL::MapLoadingFailure::NotFoundFailure;
68         description = e.what();
69     } catch (const std::exception& e) {
70         type = QMapboxGL::MapLoadingFailure::UnknownFailure;
71         description = e.what();
72     }
73 
74     emit mapLoadingFailed(type, description);
75 }
76 
onWillStartRenderingFrame()77 void QMapboxGLMapObserver::onWillStartRenderingFrame()
78 {
79     emit mapChanged(QMapboxGL::MapChangeWillStartRenderingFrame);
80 }
81 
onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode)82 void QMapboxGLMapObserver::onDidFinishRenderingFrame(mbgl::MapObserver::RenderMode mode)
83 {
84     if (mode == mbgl::MapObserver::RenderMode::Partial) {
85         emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingFrame);
86     } else {
87         emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingFrameFullyRendered);
88     }
89 }
90 
onWillStartRenderingMap()91 void QMapboxGLMapObserver::onWillStartRenderingMap()
92 {
93     emit mapChanged(QMapboxGL::MapChangeWillStartRenderingMap);
94 }
95 
onDidFinishRenderingMap(mbgl::MapObserver::RenderMode mode)96 void QMapboxGLMapObserver::onDidFinishRenderingMap(mbgl::MapObserver::RenderMode mode)
97 {
98     if (mode == mbgl::MapObserver::RenderMode::Partial) {
99         emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingMap);
100     } else {
101         emit mapChanged(QMapboxGL::MapChangeDidFinishRenderingMapFullyRendered);
102     }
103 }
104 
onDidFinishLoadingStyle()105 void QMapboxGLMapObserver::onDidFinishLoadingStyle()
106 {
107     emit mapChanged(QMapboxGL::MapChangeDidFinishLoadingStyle);
108 }
109 
onSourceChanged(mbgl::style::Source &)110 void QMapboxGLMapObserver::onSourceChanged(mbgl::style::Source&)
111 {
112     std::string attribution;
113     for (const auto& source : d_ptr->mapObj->getStyle().getSources()) {
114         // Avoid duplicates by using the most complete attribution HTML snippet.
115         if (source->getAttribution() && (attribution.size() < source->getAttribution()->size()))
116             attribution = *source->getAttribution();
117     }
118     emit copyrightsChanged(QString::fromStdString(attribution));
119     emit mapChanged(QMapboxGL::MapChangeSourceDidChange);
120 }
121