@@ -23,6 +23,388 @@
23#include "LocalePlugin.h"
23#include "LocalePlugin.h"
24#include "timezonemodel.h"
24#include "timezonemodel.h"
26+static QByteArrayList olsenTimezones = {
29+ "Africa/Addis_Ababa",
37+ "Africa/Brazzaville",
43+ "Africa/Dar_es_Salaam",
50+ "Africa/Johannesburg",
71+ "Africa/Ouagadougou",
81+ "America/Argentina/Buenos_Aires",
82+ "America/Argentina/Catamarca",
83+ "America/Argentina/Cordoba",
84+ "America/Argentina/Jujuy",
85+ "America/Argentina/La_Rioja",
86+ "America/Argentina/Mendoza",
87+ "America/Argentina/Rio_Gallegos",
88+ "America/Argentina/San_Juan",
89+ "America/Argentina/San_Luis",
90+ "America/Argentina/Tucuman",
91+ "America/Argentina/Ushuaia",
99+ "America/Blanc-Sablon",
100+ "America/Boa_Vista",
103+ "America/Cambridge_Bay",
104+ "America/Campo_Grande",
110+ "America/Chihuahua",
111+ "America/Coral_Harbour",
112+ "America/Costa_Rica",
116+ "America/Dawson_Creek",
121+ "America/El_Salvador",
122+ "America/Fortaleza",
123+ "America/Glace_Bay",
124+ "America/Goose_Bay",
125+ "America/Grand_Turk",
127+ "America/Guadeloupe",
128+ "America/Guatemala",
129+ "America/Guayaquil",
133+ "America/Hermosillo",
134+ "America/Indiana/Indianapolis",
135+ "America/Indiana/Knox",
136+ "America/Indiana/Marengo",
137+ "America/Indiana/Petersburg",
138+ "America/Indiana/Vevay",
139+ "America/Indiana/Vincennes",
140+ "America/Indiana/Winamac",
145+ "America/Kentucky/Louisville",
146+ "America/Kentucky/Monticello",
149+ "America/Los_Angeles",
154+ "America/Martinique",
156+ "America/Menominee",
158+ "America/Mexico_City",
161+ "America/Monterrey",
162+ "America/Montevideo",
164+ "America/Montserrat",
169+ "America/North_Dakota/Center",
170+ "America/North_Dakota/Salem",
172+ "America/Pangnirtung",
173+ "America/Paramaribo",
175+ "America/Port-au-Prince",
176+ "America/Port_of_Spain",
177+ "America/Porto_Velho",
178+ "America/Puerto_Rico",
179+ "America/Rainy_River",
180+ "America/Rankin_Inlet",
184+ "America/Rio_Branco",
187+ "America/Santo_Domingo",
188+ "America/Sao_Paulo",
189+ "America/St_Barthelemy",
193+ "America/St_Thomas",
194+ "America/St_Vincent",
195+ "America/Tegucigalpa",
196+ "America/Thunder_Bay",
200+ "America/Vancouver",
201+ "America/Whitehorse",
203+ "America/Yellowknife",
204+ "Ameriica/Swift_Current",
205+ "Arctic/Longyearbyen",
244+ "Asia/Kuala_Lumpur",
279+ "Asia/Yekaterinburg",
284+ "Atlantic/Cape_Verde",
287+ "Atlantic/Reykjavik",
288+ "Atlantic/South_Georgia",
289+ "Atlantic/St_Helena",
291+ "Australia/Adelaide",
292+ "Australia/Brisbane",
293+ "Australia/Broken_Hill",
298+ "Australia/Lindeman",
299+ "Australia/Lord_Howe",
300+ "Australia/Melbourne",
308+ "Europe/Bratislava",
313+ "Europe/Copenhagen",
318+ "Europe/Isle_of_Man",
321+ "Europe/Kaliningrad",
326+ "Europe/Luxembourg",
329+ "Europe/Marienhamn",
340+ "Europe/San_Marino",
342+ "Europe/Simferopol",
356+ "Europe/Zaporozhye",
358+ "Indian/Antananarivo",
374+ "Pacific/Enderbury",
378+ "Pacific/Galapagos",
380+ "Pacific/Guadalcanal",
384+ "Pacific/Kiritimati",
386+ "Pacific/Kwajalein",
388+ "Pacific/Marquesas",
394+ "Pacific/Pago_Pago",
398+ "Pacific/Port_Moresby",
399+ "Pacific/Rarotonga",
403+ "Pacific/Tongatapu",
27TimeZoneLocationModel::TimeZoneLocationModel(QObject *parent):
409TimeZoneLocationModel::TimeZoneLocationModel(QObject *parent):
28 QAbstractListModel(parent),
410 QAbstractListModel(parent),
@@ -52,6 +434,9 @@ TimeZoneLocationModel::TimeZoneLocationModel(QObject *parent):
52 &QObject::deleteLater);
434 &QObject::deleteLater);
439+ m_olsenMap.load(":/olsen_map.png");
57void TimeZoneLocationModel::init()
442void TimeZoneLocationModel::init()
@@ -120,6 +505,41 @@ QHash<int, QByteArray> TimeZoneLocationModel::roleNames() const
120 return m_roleNames;
505 return m_roleNames;
508+QJsonArray TimeZoneLocationModel::timezoneAndOffsetAtMapPoint(int x, int y, const QSize &mapImageSize) const
510+ const QImage olsenMap = m_olsenMap.scaled(mapImageSize);
511+ qDebug() << "Clicked at" << x << y << "(" << olsenMap.width() << olsenMap.height() << ")";
512+ if (!olsenMap.valid(x,y)) {
513+ qWarning() << Q_FUNC_INFO << "Invalid pixel position:" << x << y;
514+ return QJsonArray();
517+ const QRgb rgb = olsenMap.pixel(x,y);
518+ const int red = qRed(rgb);
519+ const int green = qGreen(rgb);
520+ qDebug() << "Red:" << red << ", green:" << green;
521+ const int zoneIndex = ((red & 248) << 1) + ((green >> 4) & 15);
523+ qDebug() << "Zone index:" << zoneIndex;
524+ if (zoneIndex >= 0 && zoneIndex < olsenTimezones.count()) {
525+ const QByteArray tzId = olsenTimezones.at(zoneIndex);
526+ qDebug() << "!!! Got TZ ID" << tzId;
530+ result.append(qUtf8Printable(tzId));
531+ result.append(static_cast<double>(tz.standardTimeOffset(QDateTime::currentDateTime())) / 3600);
532+ qDebug() << "!!! timezone and offset" << result.at(0) << result.at(1);
535+ qWarning() << Q_FUNC_INFO << "Invalid timezone" << tzId;
536+ return QJsonArray();
539+ qWarning() << Q_FUNC_INFO << "Invalid timezone index" << zoneIndex;
540+ return QJsonArray();
123void TimeZonePopulateWorker::run()
543void TimeZonePopulateWorker::run()
125 buildCityMap();
545 buildCityMap();