timezone-provider: Turn into preloadable

This commit is contained in:
Peter Eisenmann
2024-10-11 07:43:06 +03:00
parent 4253b5e2de
commit 49aff9f026
4 changed files with 33 additions and 21 deletions

View File

@@ -7,9 +7,10 @@ from .desktop_provider import desktop_provider
from .disk_provider import disk_provider
from .internet_provider import internet_provider
from .language_provider import language_provider
from .timezone_provider import timezone_provider
providers = [language_provider, internet_provider,
disk_provider, desktop_provider, choices_provider]
providers = [language_provider, internet_provider, disk_provider,
desktop_provider, timezone_provider, choices_provider]
class PreloadManager:

View File

@@ -1,8 +1,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later
from time import time
from gi.repository import GnomeDesktop, GObject, GWeather
from .config import config
from .preloadable import Preloadable
class Timezone(GObject.Object):
__gtype_name__ = __qualname__
@@ -40,18 +44,30 @@ def _recurse_location(location, timezone_map):
print(f'Developer hint: Unknown timezone {id} {child.get_name()}')
### public methods ###
class TimezoneProvider(Preloadable):
def __init__(self):
Preloadable.__init__(self, self._get_timezones)
def get_current_timezone():
timezone = GnomeDesktop.WallClock().get_timezone()
return timezone.get_identifier()
def _get_timezones(self):
current_timezone = GnomeDesktop.WallClock().get_timezone()
config.set('timezone', current_timezone.get_identifier())
timezone_map = dict()
for timezone in GWeather.Location().get_world().get_timezones():
id = timezone.get_identifier()
timezone_map[id] = Timezone(id)
for child in _get_location_children(GWeather.Location().get_world()):
if not child.has_timezone(): # skips UTC and Etc/GMT+12
_recurse_location(child, timezone_map)
self.timezones = sorted(timezone_map.values(), key=lambda t: t.name)
### public methods ###
def get_timezones(self):
self.assert_preloaded()
return self.timezones
def get_timezones():
timezones = {timezone.get_identifier(): Timezone(timezone.get_identifier())
for timezone in GWeather.Location().get_world().get_timezones()}
for child in _get_location_children(GWeather.Location().get_world()):
if not child.has_timezone(): # skips UTC and Etc/GMT+12
_recurse_location(child, timezones)
return sorted(timezones.values(), key=lambda t: t.name)
timezone_provider = TimezoneProvider()

View File

@@ -6,7 +6,7 @@ from gi.repository import Gtk
from .format_provider import get_formats
from .global_state import global_state
from .system_calls import set_system_formats, set_system_timezone
from .timezone_provider import get_timezones
from .timezone_provider import timezone_provider
from .widgets import ProgressRow
@@ -37,7 +37,7 @@ class FilterPage(Gtk.Box):
self.list_model.splice(0, 0, get_formats())
case FilterType.timezone:
self.filter = self._timezone_filter
self.list_model.splice(0, 0, get_timezones())
self.list_model.splice(0, 0, timezone_provider.get_timezones())
self.search_entry.connect("search-changed", self._filter)

View File

@@ -5,7 +5,6 @@ from gi.repository import Gtk
from .config import config
from .format_provider import initialize_formats
from .global_state import global_state
from .timezone_provider import get_current_timezone
@Gtk.Template(resource_path='/com/github/p3732/os-installer/ui/pages/locale.ui')
@@ -21,10 +20,6 @@ class LocalePage(Gtk.Box):
if not config.has('formats'):
initialize_formats()
if not config.has('timezone'):
timezone = get_current_timezone()
config.set('timezone', timezone)
config.subscribe('formats', self._update_formats)
config.subscribe('timezone', self._update_timezone)