|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2014 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a dialog to select a time zone. |
|
8 """ |
|
9 |
|
10 from PyQt4.QtCore import pyqtSlot |
|
11 from PyQt4.QtGui import QDialog, QDialogButtonBox |
|
12 |
|
13 from .Ui_TimezoneSelectionDialog import Ui_TimezoneSelectionDialog |
|
14 |
|
15 |
|
16 class TimezoneSelectionDialog(QDialog, Ui_TimezoneSelectionDialog): |
|
17 """ |
|
18 Class implementing a dialog to select a time zone. |
|
19 """ |
|
20 Timezones = { |
|
21 'Africa': [ |
|
22 'Abidjan', |
|
23 'Accra', |
|
24 'Addis_Ababa', |
|
25 'Algiers', |
|
26 'Asmara', |
|
27 'Asmera', |
|
28 'Bamako', |
|
29 'Bangui', |
|
30 'Banjul', |
|
31 'Bissau', |
|
32 'Blantyre', |
|
33 'Brazzaville', |
|
34 'Bujumbura', |
|
35 'Cairo', |
|
36 'Casablanca', |
|
37 'Ceuta', |
|
38 'Conakry', |
|
39 'Dakar', |
|
40 'Dar_es_Salaam', |
|
41 'Djibouti', |
|
42 'Douala', |
|
43 'El_Aaiun', |
|
44 'Freetown', |
|
45 'Gaborone', |
|
46 'Harare', |
|
47 'Johannesburg', |
|
48 'Juba', |
|
49 'Kampala', |
|
50 'Khartoum', |
|
51 'Kigali', |
|
52 'Kinshasa', |
|
53 'Lagos', |
|
54 'Libreville', |
|
55 'Lome', |
|
56 'Luanda', |
|
57 'Lubumbashi', |
|
58 'Lusaka', |
|
59 'Malabo', |
|
60 'Maputo', |
|
61 'Maseru', |
|
62 'Mbabane', |
|
63 'Mogadishu', |
|
64 'Monrovia', |
|
65 'Nairobi', |
|
66 'Ndjamena', |
|
67 'Niamey', |
|
68 'Nouakchott', |
|
69 'Ouagadougou', |
|
70 'Porto-Novo', |
|
71 'Sao_Tome', |
|
72 'Timbuktu', |
|
73 'Tripoli', |
|
74 'Tunis', |
|
75 'Windhoek', |
|
76 ], |
|
77 'America': [ |
|
78 'Adak', |
|
79 'Anchorage', |
|
80 'Anguilla', |
|
81 'Antigua', |
|
82 'Araguaina', |
|
83 'Argentina/Buenos_Aires', |
|
84 'Argentina/Catamarca', |
|
85 'Argentina/ComodRivadavia', |
|
86 'Argentina/Cordoba', |
|
87 'Argentina/Jujuy', |
|
88 'Argentina/La_Rioja', |
|
89 'Argentina/Mendoza', |
|
90 'Argentina/Rio_Gallegos', |
|
91 'Argentina/Salta', |
|
92 'Argentina/San_Juan', |
|
93 'Argentina/San_Luis', |
|
94 'Argentina/Tucuman', |
|
95 'Argentina/Ushuaia', |
|
96 'Aruba', |
|
97 'Asuncion', |
|
98 'Atikokan', |
|
99 'Atka', |
|
100 'Bahia', |
|
101 'Bahia_Banderas', |
|
102 'Barbados', |
|
103 'Belem', |
|
104 'Belize', |
|
105 'Blanc-Sablon', |
|
106 'Boa_Vista', |
|
107 'Bogota', |
|
108 'Boise', |
|
109 'Buenos_Aires', |
|
110 'Cambridge_Bay', |
|
111 'Campo_Grande', |
|
112 'Cancun', |
|
113 'Caracas', |
|
114 'Catamarca', |
|
115 'Cayenne', |
|
116 'Cayman', |
|
117 'Chicago', |
|
118 'Chihuahua', |
|
119 'Coral_Harbour', |
|
120 'Cordoba', |
|
121 'Costa_Rica', |
|
122 'Creston', |
|
123 'Cuiaba', |
|
124 'Curacao', |
|
125 'Danmarkshavn', |
|
126 'Dawson', |
|
127 'Dawson_Creek', |
|
128 'Denver', |
|
129 'Detroit', |
|
130 'Dominica', |
|
131 'Edmonton', |
|
132 'Eirunepe', |
|
133 'El_Salvador', |
|
134 'Ensenada', |
|
135 'Fort_Wayne', |
|
136 'Fortaleza', |
|
137 'Glace_Bay', |
|
138 'Godthab', |
|
139 'Goose_Bay', |
|
140 'Grand_Turk', |
|
141 'Grenada', |
|
142 'Guadeloupe', |
|
143 'Guatemala', |
|
144 'Guayaquil', |
|
145 'Guyana', |
|
146 'Halifax', |
|
147 'Havana', |
|
148 'Hermosillo', |
|
149 'Indiana/Indianapolis', |
|
150 'Indiana/Knox', |
|
151 'Indiana/Marengo', |
|
152 'Indiana/Petersburg', |
|
153 'Indiana/Tell_City', |
|
154 'Indiana/Vevay', |
|
155 'Indiana/Vincennes', |
|
156 'Indiana/Winamac', |
|
157 'Indianapolis', |
|
158 'Inuvik', |
|
159 'Iqaluit', |
|
160 'Jamaica', |
|
161 'Jujuy', |
|
162 'Juneau', |
|
163 'Kentucky/Louisville', |
|
164 'Kentucky/Monticello', |
|
165 'Knox_IN', |
|
166 'Kralendijk', |
|
167 'La_Paz', |
|
168 'Lima', |
|
169 'Los_Angeles', |
|
170 'Louisville', |
|
171 'Lower_Princes', |
|
172 'Maceio', |
|
173 'Managua', |
|
174 'Manaus', |
|
175 'Marigot', |
|
176 'Martinique', |
|
177 'Matamoros', |
|
178 'Mazatlan', |
|
179 'Mendoza', |
|
180 'Menominee', |
|
181 'Merida', |
|
182 'Metlakatla', |
|
183 'Mexico_City', |
|
184 'Miquelon', |
|
185 'Moncton', |
|
186 'Monterrey', |
|
187 'Montevideo', |
|
188 'Montreal', |
|
189 'Montserrat', |
|
190 'Nassau', |
|
191 'New_York', |
|
192 'Nipigon', |
|
193 'Nome', |
|
194 'Noronha', |
|
195 'North_Dakota/Beulah', |
|
196 'North_Dakota/Center', |
|
197 'North_Dakota/New_Salem', |
|
198 'Ojinaga', |
|
199 'Panama', |
|
200 'Pangnirtung', |
|
201 'Paramaribo', |
|
202 'Phoenix', |
|
203 'Port-au-Prince', |
|
204 'Port_of_Spain', |
|
205 'Porto_Acre', |
|
206 'Porto_Velho', |
|
207 'Puerto_Rico', |
|
208 'Rainy_River', |
|
209 'Rankin_Inlet', |
|
210 'Recife', |
|
211 'Regina', |
|
212 'Resolute', |
|
213 'Rio_Branco', |
|
214 'Rosario', |
|
215 'Santa_Isabel', |
|
216 'Santarem', |
|
217 'Santiago', |
|
218 'Santo_Domingo', |
|
219 'Sao_Paulo', |
|
220 'Scoresbysund', |
|
221 'Shiprock', |
|
222 'Sitka', |
|
223 'St_Barthelemy', |
|
224 'St_Johns', |
|
225 'St_Kitts', |
|
226 'St_Lucia', |
|
227 'St_Thomas', |
|
228 'St_Vincent', |
|
229 'Swift_Current', |
|
230 'Tegucigalpa', |
|
231 'Thule', |
|
232 'Thunder_Bay', |
|
233 'Tijuana', |
|
234 'Toronto', |
|
235 'Tortola', |
|
236 'Vancouver', |
|
237 'Virgin', |
|
238 'Whitehorse', |
|
239 'Winnipeg', |
|
240 'Yakutat', |
|
241 'Yellowknife', |
|
242 ], |
|
243 'Antarctica':[ |
|
244 'Casey', |
|
245 'Davis', |
|
246 'DumontDUrville', |
|
247 'Macquarie', |
|
248 'Mawson', |
|
249 'McMurdo', |
|
250 'Palmer', |
|
251 'Rothera', |
|
252 'South_Pole', |
|
253 'Syowa', |
|
254 'Vostok', |
|
255 ], |
|
256 'Arctic':[ |
|
257 'Longyearbyen', |
|
258 ], |
|
259 'Asia': [ |
|
260 'Aden', |
|
261 'Almaty', |
|
262 'Amman', |
|
263 'Anadyr', |
|
264 'Aqtau', |
|
265 'Aqtobe', |
|
266 'Ashgabat', |
|
267 'Ashkhabad', |
|
268 'Baghdad', |
|
269 'Bahrain', |
|
270 'Baku', |
|
271 'Bangkok', |
|
272 'Beirut', |
|
273 'Bishkek', |
|
274 'Brunei', |
|
275 'Calcutta', |
|
276 'Choibalsan', |
|
277 'Chongqing', |
|
278 'Chungking', |
|
279 'Colombo', |
|
280 'Dacca', |
|
281 'Damascus', |
|
282 'Dhaka', |
|
283 'Dili', |
|
284 'Dubai', |
|
285 'Dushanbe', |
|
286 'Gaza', |
|
287 'Harbin', |
|
288 'Hebron', |
|
289 'Ho_Chi_Minh', |
|
290 'Hong_Kong', |
|
291 'Hovd', |
|
292 'Irkutsk', |
|
293 'Istanbul', |
|
294 'Jakarta', |
|
295 'Jayapura', |
|
296 'Jerusalem', |
|
297 'Kabul', |
|
298 'Kamchatka', |
|
299 'Karachi', |
|
300 'Kashgar', |
|
301 'Kathmandu', |
|
302 'Katmandu', |
|
303 'Khandyga', |
|
304 'Kolkata', |
|
305 'Krasnoyarsk', |
|
306 'Kuala_Lumpur', |
|
307 'Kuching', |
|
308 'Kuwait', |
|
309 'Macao', |
|
310 'Macau', |
|
311 'Magadan', |
|
312 'Makassar', |
|
313 'Manila', |
|
314 'Muscat', |
|
315 'Nicosia', |
|
316 'Novokuznetsk', |
|
317 'Novosibirsk', |
|
318 'Omsk', |
|
319 'Oral', |
|
320 'Phnom_Penh', |
|
321 'Pontianak', |
|
322 'Pyongyang', |
|
323 'Qatar', |
|
324 'Qyzylorda', |
|
325 'Rangoon', |
|
326 'Riyadh', |
|
327 'Saigon', |
|
328 'Sakhalin', |
|
329 'Samarkand', |
|
330 'Seoul', |
|
331 'Shanghai', |
|
332 'Singapore', |
|
333 'Taipei', |
|
334 'Tashkent', |
|
335 'Tbilisi', |
|
336 'Tehran', |
|
337 'Tel_Aviv', |
|
338 'Thimbu', |
|
339 'Thimphu', |
|
340 'Tokyo', |
|
341 'Ujung_Pandang', |
|
342 'Ulaanbaatar', |
|
343 'Ulan_Bator', |
|
344 'Urumqi', |
|
345 'Ust-Nera', |
|
346 'Vientiane', |
|
347 'Vladivostok', |
|
348 'Yakutsk', |
|
349 'Yekaterinburg', |
|
350 'Yerevan', |
|
351 ], |
|
352 'Atlantic': [ |
|
353 'Azores', |
|
354 'Bermuda', |
|
355 'Canary', |
|
356 'Cape_Verde', |
|
357 'Faeroe', |
|
358 'Faroe', |
|
359 'Jan_Mayen', |
|
360 'Madeira', |
|
361 'Reykjavik', |
|
362 'South_Georgia', |
|
363 'St_Helena', |
|
364 'Stanley', |
|
365 ], |
|
366 'Australia': [ |
|
367 'ACT', |
|
368 'Adelaide', |
|
369 'Brisbane', |
|
370 'Broken_Hill', |
|
371 'Canberra', |
|
372 'Currie', |
|
373 'Darwin', |
|
374 'Eucla', |
|
375 'Hobart', |
|
376 'LHI', |
|
377 'Lindeman', |
|
378 'Lord_Howe', |
|
379 'Melbourne', |
|
380 'NSW', |
|
381 'North', |
|
382 'Perth', |
|
383 'Queensland', |
|
384 'South', |
|
385 'Sydney', |
|
386 'Tasmania', |
|
387 'Victoria', |
|
388 'West', |
|
389 'Yancowinna', |
|
390 ], |
|
391 'Europe': [ |
|
392 'Amsterdam', |
|
393 'Andorra', |
|
394 'Athens', |
|
395 'Belfast', |
|
396 'Belgrade', |
|
397 'Berlin', |
|
398 'Bratislava', |
|
399 'Brussels', |
|
400 'Bucharest', |
|
401 'Budapest', |
|
402 'Busingen', |
|
403 'Chisinau', |
|
404 'Copenhagen', |
|
405 'Dublin', |
|
406 'Gibraltar', |
|
407 'Guernsey', |
|
408 'Helsinki', |
|
409 'Isle_of_Man', |
|
410 'Istanbul', |
|
411 'Jersey', |
|
412 'Kaliningrad', |
|
413 'Kiev', |
|
414 'Lisbon', |
|
415 'Ljubljana', |
|
416 'London', |
|
417 'Luxembourg', |
|
418 'Madrid', |
|
419 'Malta', |
|
420 'Mariehamn', |
|
421 'Minsk', |
|
422 'Monaco', |
|
423 'Moscow', |
|
424 'Nicosia', |
|
425 'Oslo', |
|
426 'Paris', |
|
427 'Podgorica', |
|
428 'Prague', |
|
429 'Riga', |
|
430 'Rome', |
|
431 'Samara', |
|
432 'San_Marino', |
|
433 'Sarajevo', |
|
434 'Simferopol', |
|
435 'Skopje', |
|
436 'Sofia', |
|
437 'Stockholm', |
|
438 'Tallinn', |
|
439 'Tirane', |
|
440 'Tiraspol', |
|
441 'Uzhgorod', |
|
442 'Vaduz', |
|
443 'Vatican', |
|
444 'Vienna', |
|
445 'Vilnius', |
|
446 'Volgograd', |
|
447 'Warsaw', |
|
448 'Zagreb', |
|
449 'Zaporozhye', |
|
450 'Zurich', |
|
451 ], |
|
452 'Indian': [ |
|
453 'Antananarivo', |
|
454 'Chagos', |
|
455 'Christmas', |
|
456 'Cocos', |
|
457 'Comoro', |
|
458 'Kerguelen', |
|
459 'Mahe', |
|
460 'Maldives', |
|
461 'Mauritius', |
|
462 'Mayotte', |
|
463 'Reunion', |
|
464 ], |
|
465 'Pacific': [ |
|
466 'Apia', |
|
467 'Auckland', |
|
468 'Chatham', |
|
469 'Chuuk', |
|
470 'Easter', |
|
471 'Efate', |
|
472 'Enderbury', |
|
473 'Fakaofo', |
|
474 'Fiji', |
|
475 'Funafuti', |
|
476 'Galapagos', |
|
477 'Gambier', |
|
478 'Guadalcanal', |
|
479 'Guam', |
|
480 'Honolulu', |
|
481 'Johnston', |
|
482 'Kiritimati', |
|
483 'Kosrae', |
|
484 'Kwajalein', |
|
485 'Majuro', |
|
486 'Marquesas', |
|
487 'Midway', |
|
488 'Nauru', |
|
489 'Niue', |
|
490 'Norfolk', |
|
491 'Noumea', |
|
492 'Pago_Pago', |
|
493 'Palau', |
|
494 'Pitcairn', |
|
495 'Pohnpei', |
|
496 'Ponape', |
|
497 'Port_Moresby', |
|
498 'Rarotonga', |
|
499 'Saipan', |
|
500 'Samoa', |
|
501 'Tahiti', |
|
502 'Tarawa', |
|
503 'Tongatapu', |
|
504 'Truk', |
|
505 'Wake', |
|
506 'Wallis', |
|
507 'Yap', |
|
508 ], |
|
509 } |
|
510 |
|
511 def __init__(self, parent=None): |
|
512 """ |
|
513 Constructor |
|
514 |
|
515 @param parent reference to the parent widget (QWidget) |
|
516 """ |
|
517 super().__init__(parent) |
|
518 self.setupUi(self) |
|
519 |
|
520 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) |
|
521 |
|
522 self.regionCombo.addItems([" "] + sorted(self.Timezones.keys())) |
|
523 |
|
524 def __updateOK(self): |
|
525 """ |
|
526 Private method to update the OK button. |
|
527 """ |
|
528 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( |
|
529 bool(self.regionCombo.currentText()) and |
|
530 len(self.cityList.selectedItems()) == 1 |
|
531 ) |
|
532 |
|
533 @pyqtSlot(str) |
|
534 def on_regionCombo_currentIndexChanged(self, region): |
|
535 """ |
|
536 Private slot handling the selection of a time zone region. |
|
537 |
|
538 @param region selected region (string) |
|
539 """ |
|
540 self.cityList.clear() |
|
541 if region in self.Timezones: |
|
542 self.cityList.addItems(sorted(self.Timezones[region])) |
|
543 |
|
544 self.__updateOK() |
|
545 |
|
546 @pyqtSlot() |
|
547 def on_cityList_itemSelectionChanged(self): |
|
548 """ |
|
549 Private slot handling a change of the city selection. |
|
550 """ |
|
551 self.__updateOK() |
|
552 |
|
553 def getData(self): |
|
554 """ |
|
555 Public method to retrieve the data. |
|
556 |
|
557 @return selected time zone (string) |
|
558 """ |
|
559 if (self.regionCombo.currentText() and |
|
560 len(self.cityList.selectedItems()) == 1): |
|
561 return "{0}/{1}".format( |
|
562 self.regionCombo.currentText(), |
|
563 self.cityList.selectedItems()[0].text() |
|
564 ) |
|
565 else: |
|
566 return "" |
|
567 |
|
568 @staticmethod |
|
569 def getTimezone(parent=None): |
|
570 """ |
|
571 Static method to select a time zone. |
|
572 |
|
573 @param parent reference to the parent widget (QWidget) |
|
574 @return tuple of selected time zone (string) and flag indicating |
|
575 the acceptance state (boolean) |
|
576 """ |
|
577 dlg = TimezoneSelectionDialog(parent) |
|
578 tz = "" |
|
579 if dlg.exec_() == QDialog.Accepted: |
|
580 tz = dlg.getData() |
|
581 return tz, bool(tz) |