diff --git a/po/POTFILES.in b/po/POTFILES.in index 1a15bd69..3352ae07 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -2,10 +2,12 @@ subiquity/client/client.py subiquity/client/controller.py subiquity/client/controllers/__init__.py +subiquity/client/controllers/keyboard.py subiquity/client/controllers/progress.py subiquity/client/controllers/refresh.py subiquity/client/controllers/welcome.py subiquity/client/__init__.py +subiquity/client/keyboard.py subiquity/client/keycodes.py subiquity/cmd/common.py subiquity/cmd/__init__.py @@ -31,7 +33,6 @@ subiquity/controller.py subiquity/controllers/filesystem.py subiquity/controllers/identity.py subiquity/controllers/__init__.py -subiquity/controllers/keyboard.py subiquity/controllers/mirror.py subiquity/controllers/network.py subiquity/controllers/proxy.py @@ -97,7 +98,6 @@ subiquitycore/utils.py subiquitycore/view.py subiquity/__init__.py subiquity/journald.py -subiquity/keyboard.py subiquity/lockfile.py subiquity/__main__.py subiquity/models/filesystem.py @@ -120,6 +120,7 @@ subiquity/server/controllers/cmdlist.py subiquity/server/controllers/debconf.py subiquity/server/controllers/__init__.py subiquity/server/controllers/install.py +subiquity/server/controllers/keyboard.py subiquity/server/controllers/locale.py subiquity/server/controllers/package.py subiquity/server/controllers/refresh.py diff --git a/subiquity/client/client.py b/subiquity/client/client.py index 8291c352..21554fc4 100644 --- a/subiquity/client/client.py +++ b/subiquity/client/client.py @@ -92,6 +92,7 @@ class SubiquityClient(TuiApplication): controllers = [ "Welcome", "Refresh", + "Keyboard", "Progress", ] diff --git a/subiquity/client/controllers/__init__.py b/subiquity/client/controllers/__init__.py index 4aa0d493..313baf40 100644 --- a/subiquity/client/controllers/__init__.py +++ b/subiquity/client/controllers/__init__.py @@ -13,11 +13,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from .keyboard import KeyboardController from .progress import ProgressController from .refresh import RefreshController from .welcome import WelcomeController __all__ = [ + 'KeyboardController', 'ProgressController', 'RefreshController', 'WelcomeController', diff --git a/subiquity/controllers/keyboard.py b/subiquity/client/controllers/keyboard.py similarity index 59% rename from subiquity/controllers/keyboard.py rename to subiquity/client/controllers/keyboard.py index 17e6ec6d..53d8e5d8 100644 --- a/subiquity/controllers/keyboard.py +++ b/subiquity/client/controllers/keyboard.py @@ -13,57 +13,32 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . + import logging -import attr - -from subiquitycore.context import with_context - -from subiquity.common.keyboard import set_keyboard -from subiquity.controller import SubiquityTuiController -from subiquity.keyboard import KeyboardList -from subiquity.models.keyboard import KeyboardSetting +from subiquity.client.controller import SubiquityTuiController +from subiquity.client.keyboard import KeyboardList +from subiquity.common.types import KeyboardSetting +from subiquity.common.keyboard import ( + set_keyboard, + ) from subiquity.ui.views import KeyboardView -log = logging.getLogger('subiquity.controllers.keyboard') +log = logging.getLogger('subiquity.client.controllers.keyboard') class KeyboardController(SubiquityTuiController): - autoinstall_key = model_name = "keyboard" - autoinstall_schema = { - 'type': 'object', - 'properties': { - 'layout': {'type': 'string'}, - 'variant': {'type': 'string'}, - 'toggle': {'type': ['string', 'null']}, - }, - 'required': ['layout'], - 'additionalProperties': False, - } + endpoint_name = 'keyboard' + signals = [ ('l10n:language-selected', 'language_selected'), ] def __init__(self, app): - self.needs_set_keyboard = False super().__init__(app) self.keyboard_list = KeyboardList() - def load_autoinstall_data(self, data): - if data is None: - return - setting = KeyboardSetting(**data) - if self.model.setting != setting: - self.needs_set_keyboard = True - self.model.setting = setting - - @with_context() - async def apply_autoinstall_config(self, context): - if self.needs_set_keyboard: - await set_keyboard( - self.app.root, self.model.setting, self.opts.dry_run) - def language_selected(self, code): log.debug("language_selected %s", code) if not self.keyboard_list.has_language(code): @@ -73,10 +48,12 @@ class KeyboardController(SubiquityTuiController): log.debug("loading language %s", code) self.keyboard_list.load_language(code) - def make_ui(self): + async def make_ui(self): if self.keyboard_list.current_lang is None: self.keyboard_list.load_language('C') - return KeyboardView(self, self.model.setting) + initial_setting = await self.endpoint.GET() + view = KeyboardView(self, initial_setting) + return view def run_answers(self): if 'layout' in self.answers: @@ -93,12 +70,7 @@ class KeyboardController(SubiquityTuiController): if apply: self.app.aio_loop.create_task(self.set_keyboard(setting)) else: - self.model.setting = setting - self.configured() - self.app.next_screen() + self.app.next_screen(self.endpoint.POST(setting)) def cancel(self): self.app.prev_screen() - - def make_autoinstall(self): - return attr.asdict(self.model.setting) diff --git a/subiquity/keyboard.py b/subiquity/client/keyboard.py similarity index 100% rename from subiquity/keyboard.py rename to subiquity/client/keyboard.py diff --git a/subiquity/common/apidef.py b/subiquity/common/apidef.py index b871ca88..f209ec4f 100644 --- a/subiquity/common/apidef.py +++ b/subiquity/common/apidef.py @@ -20,6 +20,7 @@ from subiquity.common.types import ( ApplicationState, ApplicationStatus, ErrorReportRef, + KeyboardSetting, InstallState, InstallStatus, RefreshStatus, @@ -30,6 +31,7 @@ from subiquity.common.types import ( class API: """The API offered by the subiquity installer process.""" locale = simple_endpoint(str) + keyboard = simple_endpoint(KeyboardSetting) class meta: class status: diff --git a/subiquity/controllers/__init__.py b/subiquity/controllers/__init__.py index 0f295ff2..de9e3df0 100644 --- a/subiquity/controllers/__init__.py +++ b/subiquity/controllers/__init__.py @@ -16,7 +16,6 @@ from ..controller import RepeatedController from .filesystem import FilesystemController from .identity import IdentityController -from .keyboard import KeyboardController from .mirror import MirrorController from .network import NetworkController from .proxy import ProxyController @@ -28,7 +27,6 @@ from .zdev import ZdevController __all__ = [ 'FilesystemController', 'IdentityController', - 'KeyboardController', 'MirrorController', 'NetworkController', 'ProxyController', diff --git a/subiquity/server/controllers/__init__.py b/subiquity/server/controllers/__init__.py index 6da15bc7..47fbb36c 100644 --- a/subiquity/server/controllers/__init__.py +++ b/subiquity/server/controllers/__init__.py @@ -16,6 +16,7 @@ from .cmdlist import EarlyController, LateController, ErrorController from .debconf import DebconfController from .install import InstallController +from .keyboard import KeyboardController from .locale import LocaleController from .package import PackageController from .refresh import RefreshController @@ -27,6 +28,7 @@ __all__ = [ 'EarlyController', 'ErrorController', 'InstallController', + 'KeyboardController', 'LateController', 'LocaleController', 'PackageController', diff --git a/subiquity/server/controllers/keyboard.py b/subiquity/server/controllers/keyboard.py new file mode 100644 index 00000000..8a9ed316 --- /dev/null +++ b/subiquity/server/controllers/keyboard.py @@ -0,0 +1,74 @@ +# Copyright 2015 Canonical, Ltd. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import logging + +import attr + +from subiquitycore.context import with_context + +from subiquity.common.apidef import API +from subiquity.common.types import KeyboardSetting +from subiquity.common.keyboard import ( + set_keyboard, + ) +from subiquity.server.controller import SubiquityController + +log = logging.getLogger('subiquity.server.controllers.keyboard') + + +class KeyboardController(SubiquityController): + + endpoint = API.keyboard + + autoinstall_key = model_name = "keyboard" + autoinstall_schema = { + 'type': 'object', + 'properties': { + 'layout': {'type': 'string'}, + 'variant': {'type': 'string'}, + 'toggle': {'type': ['string', 'null']}, + }, + 'required': ['layout'], + 'additionalProperties': False, + } + + def __init__(self, app): + self.needs_set_keyboard = False + super().__init__(app) + + def load_autoinstall_data(self, data): + if data is None: + return + setting = KeyboardSetting(**data) + if self.model.setting != setting: + self.needs_set_keyboard = True + self.model.setting = setting + + @with_context() + async def apply_autoinstall_config(self, context): + if self.needs_set_keyboard: + await set_keyboard( + self.app.root, self.model.setting, self.opts.dry_run) + + def make_autoinstall(self): + return attr.asdict(self.model.setting) + + async def GET(self) -> KeyboardSetting: + return self.model.setting + + async def POST(self, data: KeyboardSetting): + self.model.setting = data + self.configured() diff --git a/subiquity/server/server.py b/subiquity/server/server.py index 196b7284..e8241a27 100644 --- a/subiquity/server/server.py +++ b/subiquity/server/server.py @@ -120,6 +120,7 @@ class SubiquityServer(Application): "Debconf", "Locale", "Refresh", + "Keyboard", "Install", "Late", ] diff --git a/subiquity/ui/views/keyboard.py b/subiquity/ui/views/keyboard.py index 1514ee28..90bdf983 100644 --- a/subiquity/ui/views/keyboard.py +++ b/subiquity/ui/views/keyboard.py @@ -44,8 +44,8 @@ from subiquitycore.ui.stretchy import ( from subiquitycore.ui.utils import button_pile, Color, Padding, screen from subiquitycore.view import BaseView +from subiquity.client.keyboard import latinizable, for_ui from subiquity.common.types import KeyboardSetting -from subiquity.keyboard import latinizable, for_ui from subiquity.ui.views import pc105 log = logging.getLogger("subiquity.ui.views.keyboard")