[libcalamares] Extend TZ with location and country

This commit is contained in:
Adriaan de Groot 2019-12-10 15:36:53 +02:00
parent f4509f3380
commit 1a8439069e
2 changed files with 77 additions and 0 deletions

View File

@ -18,6 +18,8 @@
#include "TimeZone.h" #include "TimeZone.h"
#include "utils/Logger.h"
#include <QFile> #include <QFile>
#include <QStringList> #include <QStringList>
#include <QTextStream> #include <QTextStream>
@ -26,6 +28,35 @@
static const char TZ_DATA_FILE[] = "/usr/share/zoneinfo/zone.tab"; static const char TZ_DATA_FILE[] = "/usr/share/zoneinfo/zone.tab";
static double
getRightGeoLocation( QString str )
{
double sign = 1, num = 0.00;
// Determine sign
if ( str.startsWith( '-' ) )
{
sign = -1;
str.remove( 0, 1 );
}
else if ( str.startsWith( '+' ) )
{
str.remove( 0, 1 );
}
if ( str.length() == 4 || str.length() == 6 )
{
num = str.mid( 0, 2 ).toDouble() + str.mid( 2, 2 ).toDouble() / 60.0;
}
else if ( str.length() == 5 || str.length() == 7 )
{
num = str.mid( 0, 3 ).toDouble() + str.mid( 3, 2 ).toDouble() / 60.0;
}
return sign * num;
}
namespace CalamaresUtils namespace CalamaresUtils
{ {
namespace Locale namespace Locale
@ -151,12 +182,34 @@ TZRegion::fromFile( const char* fileName )
regions.append( region ); regions.append( region );
model.append( new TZRegion( region.toUtf8().data() ) ); model.append( new TZRegion( region.toUtf8().data() ) );
} }
QString countryCode = list.at( 0 ).trimmed();
if ( countryCode.size() != 2 )
{
continue;
}
timezoneParts.removeFirst();
TZZone z( timezoneParts.join( '/' ).toUtf8().constData(), countryCode, list.at( 1 ) );
cDebug() << "Region" << region << z;
} }
std::sort( model.begin(), model.end(), []( const TZRegion* l, const TZRegion* r ) { return *l < *r; } ); std::sort( model.begin(), model.end(), []( const TZRegion* l, const TZRegion* r ) { return *l < *r; } );
return model; return model;
} }
TZZone::TZZone( const char* zoneName, const QString& country, QString position )
: CStringPair( zoneName )
, m_country( country )
{
int cooSplitPos = position.indexOf( QRegExp( "[-+]" ), 1 );
if ( cooSplitPos > 0 )
{
m_latitude = getRightGeoLocation( position.mid( 0, cooSplitPos ) );
m_longitude = getRightGeoLocation( position.mid( cooSplitPos + 1 ) );
}
}
QString QString
TZZone::tr() const TZZone::tr() const
{ {
@ -164,6 +217,13 @@ TZZone::tr() const
return QObject::tr( m_human, "tz_names" ); return QObject::tr( m_human, "tz_names" );
} }
void
TZZone::print( QDebug& log ) const
{
log << key() << '(' << m_country << ' ' << m_latitude << ',' << m_longitude << ')';
}
TZRegionModel::TZRegionModel( TZRegionList l ) TZRegionModel::TZRegionModel( TZRegionList l )
: m_regions( l ) : m_regions( l )
{ {

View File

@ -21,6 +21,8 @@
#include "DllMacro.h" #include "DllMacro.h"
#include "utils/Logger.h"
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QObject> #include <QObject>
#include <QString> #include <QString>
@ -100,8 +102,23 @@ class TZZone : public CStringPair
public: public:
using CStringPair::CStringPair; using CStringPair::CStringPair;
QString tr() const override; QString tr() const override;
TZZone( const char* zoneName, const QString& country, QString position );
void print( QDebug& ) const;
protected:
QString m_country;
double m_latitude = 0.0, m_longitude = 0.0;
}; };
inline QDebug&
operator<<( QDebug& log, const TZZone& z )
{
z.print( log );
return log;
}
class DLLEXPORT TZRegionModel : public QAbstractListModel class DLLEXPORT TZRegionModel : public QAbstractListModel
{ {
public: public: