/* === This file is part of Calamares - === * * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ #ifndef LOCALE_TIMEZONE_H #define LOCALE_TIMEZONE_H #include "DllMacro.h" #include "utils/Logger.h" #include #include #include #include namespace CalamaresUtils { namespace Locale { /** @brief A pair of strings, one human-readable, one a key * * Given an identifier-like string (e.g. "New_York"), makes * a human-readable version of that and keeps a copy of the * identifier itself. * * This explicitly uses const char* instead of just being * QPair because there is API that needs * C-style strings. */ class CStringPair { public: /// @brief An empty pair CStringPair() {}; /// @brief Given an identifier, create the pair explicit CStringPair( const char* s1 ); CStringPair( CStringPair&& t ); CStringPair( const CStringPair& ); virtual ~CStringPair(); /// @brief Give the localized human-readable form virtual QString tr() const = 0; QString key() const { return m_key; } bool operator<( const CStringPair& other ) const { return m_key < other.m_key; } protected: char* m_human = nullptr; QString m_key; }; class CStringPairList : public QList< CStringPair* > { public: template < typename T > T* find( const QString& key ) const { for ( auto* p : *this ) { if ( p->key() == key ) { return dynamic_cast< T* >( p ); } } return nullptr; } }; /// @brief A pair of strings for timezone regions (e.g. "America") class TZRegion : public CStringPair { public: using CStringPair::CStringPair; virtual ~TZRegion(); QString tr() const override; /** @brief Create list from a zone.tab-like file * * Returns a list of all the regions; each region has a list * of zones within that region. Dyamically, the items in the * returned list are TZRegions; their zones dynamically are * TZZones even though all those lists have type CStringPairList. * * The list owns the regions, and the regions own their own list of zones. * When getting rid of the list, remember to qDeleteAll() on it. */ static CStringPairList fromFile( const char* fileName ); /// @brief Calls fromFile with the standard zone.tab name static CStringPairList fromZoneTab(); const CStringPairList& zones() const { return m_zones; } private: CStringPairList m_zones; }; /// @brief A pair of strings for specific timezone names (e.g. "New_York") class TZZone : public CStringPair { public: using CStringPair::CStringPair; 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 CStringListModel : public QAbstractListModel { public: /// @brief Create empty model CStringListModel(); /// @brief Create model from list (non-owning) CStringListModel( CStringPairList ); virtual ~CStringListModel() override; int rowCount( const QModelIndex& parent ) const override; QVariant data( const QModelIndex& index, int role ) const override; const CStringPair* item( int index ) const; private: CStringPairList m_list; }; } // namespace Locale } // namespace CalamaresUtils #endif // LOCALE_TIMEZONE_H