diff --git a/src/libcalamares/locale/TimeZone.cpp b/src/libcalamares/locale/TimeZone.cpp index 6eabef6e8..4c641cd17 100644 --- a/src/libcalamares/locale/TimeZone.cpp +++ b/src/libcalamares/locale/TimeZone.cpp @@ -337,14 +337,14 @@ ZonesModel::find( const QString& region, const QString& zone ) const } STATICTEST const TimeZoneData* -find( const ZoneVector& zones, std::function< double( const TimeZoneData* ) > distance ) +find( const ZoneVector& zones, const std::function< double( const TimeZoneData* ) >& distanceFunc ) { double smallestDistance = 1000000.0; const TimeZoneData* closest = nullptr; for ( const auto* zone : zones ) { - double thisDistance = distance( zone ); + double thisDistance = distanceFunc( zone ); if ( thisDistance < smallestDistance ) { closest = zone; @@ -354,6 +354,12 @@ find( const ZoneVector& zones, std::function< double( const TimeZoneData* ) > di return closest; } +const TimeZoneData* +ZonesModel::find( const std::function< double( const TimeZoneData* ) >& distanceFunc ) const +{ + return CalamaresUtils::Locale::find( m_private->m_zones, distanceFunc ); +} + const TimeZoneData* ZonesModel::find( double latitude, double longitude ) const { @@ -384,7 +390,7 @@ ZonesModel::find( double latitude, double longitude ) const return latitudeDifference + longitudeDifference; }; - return CalamaresUtils::Locale::find( m_private->m_zones, distance ); + return find( distance ); } QObject* diff --git a/src/libcalamares/locale/TimeZone.h b/src/libcalamares/locale/TimeZone.h index 1d4b4a8ff..cc0c35ea2 100644 --- a/src/libcalamares/locale/TimeZone.h +++ b/src/libcalamares/locale/TimeZone.h @@ -167,6 +167,17 @@ public: Iterator begin() const { return Iterator( m_private ); } + /** @brief Look up TZ data based on an arbitrary distance function + * + * This is a generic method that can define distance in whatever + * coordinate system is wanted; returns the zone with the smallest + * distance. The @p distanceFunc must return "the distance" for + * each zone. It would be polite to return something non-negative. + * + * Note: not a slot, because the parameter isn't moc-able. + */ + const TimeZoneData* find( const std::function< double( const TimeZoneData* ) >& distanceFunc ) const; + public Q_SLOTS: /** @brief Look up TZ data based on its name. * @@ -176,7 +187,10 @@ public Q_SLOTS: /** @brief Look up TZ data based on the location. * - * Returns the nearest zone to the given lat and lon. + * Returns the nearest zone to the given lat and lon. This is a + * convenience function for calling find(), below, with a standard + * distance function based on the distance between the given + * location (lat and lon) and each zone's given location. */ const TimeZoneData* find( double latitude, double longitude ) const;