@@ -94,12 +94,27 @@ QgsQuickFeatureLayerPair QgsQuickUtils::featureFactory( const QgsFeature &featur
94
94
return QgsQuickFeatureLayerPair ( feature, layer );
95
95
}
96
96
97
- QUrl QgsQuickUtils::getThemeIcon ( const QString &name )
97
+ const QUrl QgsQuickUtils::getThemeIcon ( const QString &name ) const
98
+ {
98
99
QString path = QStringLiteral ( " qrc:/%1.svg" ).arg ( name );
99
100
QgsDebugMsg ( QStringLiteral ( " Using icon %1 from %2" ).arg ( name, path ) );
100
101
return QUrl ( path );
101
102
}
102
103
104
+ QgsUnitTypes::SystemOfMeasurement QgsQuickUtils::systemOfMeasurementFactory ( const QString &type )
105
+ {
106
+ if ( type == QStringLiteral ( " Metric" ) )
107
+ return QgsUnitTypes::MetricSystem;
108
+
109
+ if ( type == QStringLiteral ( " Imperial" ) )
110
+ return QgsUnitTypes::ImperialSystem;
111
+
112
+ if ( type == QStringLiteral ( " USCS" ) )
113
+ return QgsUnitTypes::USCSSystem;
114
+
115
+ return QgsUnitTypes::UnknownSystem;
116
+ }
117
+
103
118
QString QgsQuickUtils::formatPoint (
104
119
const QgsPoint &point,
105
120
QgsCoordinateFormatter::Format format,
@@ -109,30 +124,151 @@ QString QgsQuickUtils::formatPoint(
109
124
return QgsCoordinateFormatter::format ( point, format, decimals, flags );
110
125
}
111
126
112
- QString QgsQuickUtils::formatDistance ( double distance, QgsUnitTypes::DistanceUnit units, int decimals )
127
+ QString QgsQuickUtils::formatDistance ( double distance,
128
+ QgsUnitTypes::DistanceUnit units,
129
+ int decimals,
130
+ QgsUnitTypes::SystemOfMeasurement destSystem )
113
131
{
114
- double dist = distance * QgsUnitTypes::fromUnitToUnitFactor ( units, QgsUnitTypes::DistanceMeters );
132
+ double destDistance;
133
+ QgsUnitTypes::DistanceUnit destUnits;
134
+
135
+ humanReadableDistance ( distance, units, destSystem, destDistance, destUnits );
136
+
137
+ return QStringLiteral ( " %1 %2" )
138
+ .arg ( QString::number ( destDistance, ' f' , decimals ) )
139
+ .arg ( QgsUnitTypes::toAbbreviatedString ( destUnits ) );
140
+ }
141
+
142
+
143
+ void QgsQuickUtils::humanReadableDistance ( double srcDistance, QgsUnitTypes::DistanceUnit srcUnits,
144
+ QgsUnitTypes::SystemOfMeasurement destSystem,
145
+ double &destDistance, QgsUnitTypes::DistanceUnit &destUnits )
146
+ {
147
+ if ( ( destSystem == QgsUnitTypes::MetricSystem ) || ( destSystem == QgsUnitTypes::UnknownSystem ) )
148
+ {
149
+ return formatToMetricDistance ( srcDistance, srcUnits, destDistance, destUnits );
150
+ }
151
+ else if ( destSystem == QgsUnitTypes::ImperialSystem )
152
+ {
153
+ return formatToImperialDistance ( srcDistance, srcUnits, destDistance, destUnits );
154
+ }
155
+ else if ( destSystem == QgsUnitTypes::USCSSystem )
156
+ {
157
+ return formatToUSCSDistance ( srcDistance, srcUnits, destDistance, destUnits );
158
+ }
159
+ else
160
+ {
161
+ Q_ASSERT ( false ); // should never happen
162
+ }
163
+ }
115
164
165
+ void QgsQuickUtils::formatToMetricDistance ( double srcDistance,
166
+ QgsUnitTypes::DistanceUnit srcUnits,
167
+ double &destDistance,
168
+ QgsUnitTypes::DistanceUnit &destUnits )
169
+ {
170
+ double dist = srcDistance * QgsUnitTypes::fromUnitToUnitFactor ( srcUnits, QgsUnitTypes::DistanceMillimeters );
116
171
if ( dist < 0 )
117
172
{
118
- return QStringLiteral ( " 0 %1" ).arg ( QgsUnitTypes::toAbbreviatedString ( QgsUnitTypes::DistanceMeters ) );
173
+ destDistance = 0 ;
174
+ destUnits = QgsUnitTypes::DistanceMillimeters;
175
+ return ;
119
176
}
120
177
121
- if ( dist > 1000 )
178
+ double mmToKm = QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::DistanceKilometers, QgsUnitTypes::DistanceMillimeters );
179
+ if ( dist > mmToKm )
122
180
{
123
- return QStringLiteral ( " %1 %2" ).arg ( QString::number ( dist / 1000.0 , ' f' , decimals ) ).arg ( QgsUnitTypes::toAbbreviatedString ( QgsUnitTypes::DistanceKilometers ) );
181
+ destDistance = dist / mmToKm;
182
+ destUnits = QgsUnitTypes::DistanceKilometers;
183
+ return ;
124
184
}
125
- else
185
+
186
+ double mmToM = QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::DistanceMeters, QgsUnitTypes::DistanceMillimeters );
187
+ if ( dist > mmToM )
188
+ {
189
+ destDistance = dist / mmToM;
190
+ destUnits = QgsUnitTypes::DistanceMeters;
191
+ return ;
192
+ }
193
+
194
+ double mmToCm = QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::DistanceCentimeters, QgsUnitTypes::DistanceMillimeters );
195
+ if ( dist > mmToCm )
196
+ {
197
+ destDistance = dist / mmToCm;
198
+ destUnits = QgsUnitTypes::DistanceCentimeters;
199
+ return ;
200
+ }
201
+
202
+ destDistance = dist;
203
+ destUnits = QgsUnitTypes::DistanceMillimeters;
204
+ }
205
+
206
+ void QgsQuickUtils::formatToImperialDistance ( double srcDistance,
207
+ QgsUnitTypes::DistanceUnit srcUnits,
208
+ double &destDistance,
209
+ QgsUnitTypes::DistanceUnit &destUnits )
210
+ {
211
+ double dist = srcDistance * QgsUnitTypes::fromUnitToUnitFactor ( srcUnits, QgsUnitTypes::DistanceFeet );
212
+ if ( dist < 0 )
213
+ {
214
+ destDistance = 0 ;
215
+ destUnits = QgsUnitTypes::DistanceFeet;
216
+ return ;
217
+ }
218
+
219
+ double feetToMile = QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::DistanceMiles, QgsUnitTypes::DistanceFeet );
220
+ if ( dist > feetToMile )
221
+ {
222
+ destDistance = dist / feetToMile;
223
+ destUnits = QgsUnitTypes::DistanceMiles;
224
+ return ;
225
+ }
226
+
227
+ double feetToYard = QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::DistanceYards, QgsUnitTypes::DistanceFeet );
228
+ if ( dist > feetToYard )
126
229
{
127
- if ( dist > 1 )
128
- {
129
- return QStringLiteral ( " %1 %2" ).arg ( QString::number ( dist, ' f' , decimals ) ).arg ( QgsUnitTypes::toAbbreviatedString ( QgsUnitTypes::DistanceMeters ) );
130
- }
131
- else
132
- {
133
- return QStringLiteral ( " %1 %2" ).arg ( QString::number ( dist * 1000 , ' f' , decimals ) ).arg ( QgsUnitTypes::toAbbreviatedString ( QgsUnitTypes::DistanceMillimeters ) );
134
- }
230
+ destDistance = dist / feetToYard;
231
+ destUnits = QgsUnitTypes::DistanceYards;
232
+ return ;
135
233
}
234
+
235
+ destDistance = dist;
236
+ destUnits = QgsUnitTypes::DistanceFeet;
237
+ return ;
238
+ }
239
+
240
+ void QgsQuickUtils::formatToUSCSDistance ( double srcDistance,
241
+ QgsUnitTypes::DistanceUnit srcUnits,
242
+ double &destDistance,
243
+ QgsUnitTypes::DistanceUnit &destUnits )
244
+ {
245
+ double dist = srcDistance * QgsUnitTypes::fromUnitToUnitFactor ( srcUnits, QgsUnitTypes::DistanceFeet );
246
+ if ( dist < 0 )
247
+ {
248
+ destDistance = 0 ;
249
+ destUnits = QgsUnitTypes::DistanceFeet;
250
+ return ;
251
+ }
252
+
253
+ double feetToMile = QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::DistanceNauticalMiles, QgsUnitTypes::DistanceFeet );
254
+ if ( dist > feetToMile )
255
+ {
256
+ destDistance = dist / feetToMile;
257
+ destUnits = QgsUnitTypes::DistanceNauticalMiles;
258
+ return ;
259
+ }
260
+
261
+ double feetToYard = QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::DistanceYards, QgsUnitTypes::DistanceFeet );
262
+ if ( dist > feetToYard )
263
+ {
264
+ destDistance = dist / feetToYard;
265
+ destUnits = QgsUnitTypes::DistanceYards;
266
+ return ;
267
+ }
268
+
269
+ destDistance = dist;
270
+ destUnits = QgsUnitTypes::DistanceFeet;
271
+ return ;
136
272
}
137
273
138
274
QString QgsQuickUtils::dumpScreenInfo () const
0 commit comments