move keyboard controller to new world

This commit is contained in:
Michael Hudson-Doyle 2020-10-12 10:58:03 +13:00
parent aac00dad6c
commit 45a85c554e
11 changed files with 101 additions and 48 deletions

View File

@ -2,10 +2,12 @@
subiquity/client/client.py subiquity/client/client.py
subiquity/client/controller.py subiquity/client/controller.py
subiquity/client/controllers/__init__.py subiquity/client/controllers/__init__.py
subiquity/client/controllers/keyboard.py
subiquity/client/controllers/progress.py subiquity/client/controllers/progress.py
subiquity/client/controllers/refresh.py subiquity/client/controllers/refresh.py
subiquity/client/controllers/welcome.py subiquity/client/controllers/welcome.py
subiquity/client/__init__.py subiquity/client/__init__.py
subiquity/client/keyboard.py
subiquity/client/keycodes.py subiquity/client/keycodes.py
subiquity/cmd/common.py subiquity/cmd/common.py
subiquity/cmd/__init__.py subiquity/cmd/__init__.py
@ -31,7 +33,6 @@ subiquity/controller.py
subiquity/controllers/filesystem.py subiquity/controllers/filesystem.py
subiquity/controllers/identity.py subiquity/controllers/identity.py
subiquity/controllers/__init__.py subiquity/controllers/__init__.py
subiquity/controllers/keyboard.py
subiquity/controllers/mirror.py subiquity/controllers/mirror.py
subiquity/controllers/network.py subiquity/controllers/network.py
subiquity/controllers/proxy.py subiquity/controllers/proxy.py
@ -97,7 +98,6 @@ subiquitycore/utils.py
subiquitycore/view.py subiquitycore/view.py
subiquity/__init__.py subiquity/__init__.py
subiquity/journald.py subiquity/journald.py
subiquity/keyboard.py
subiquity/lockfile.py subiquity/lockfile.py
subiquity/__main__.py subiquity/__main__.py
subiquity/models/filesystem.py subiquity/models/filesystem.py
@ -120,6 +120,7 @@ subiquity/server/controllers/cmdlist.py
subiquity/server/controllers/debconf.py subiquity/server/controllers/debconf.py
subiquity/server/controllers/__init__.py subiquity/server/controllers/__init__.py
subiquity/server/controllers/install.py subiquity/server/controllers/install.py
subiquity/server/controllers/keyboard.py
subiquity/server/controllers/locale.py subiquity/server/controllers/locale.py
subiquity/server/controllers/package.py subiquity/server/controllers/package.py
subiquity/server/controllers/refresh.py subiquity/server/controllers/refresh.py

View File

@ -92,6 +92,7 @@ class SubiquityClient(TuiApplication):
controllers = [ controllers = [
"Welcome", "Welcome",
"Refresh", "Refresh",
"Keyboard",
"Progress", "Progress",
] ]

View File

@ -13,11 +13,13 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from .keyboard import KeyboardController
from .progress import ProgressController from .progress import ProgressController
from .refresh import RefreshController from .refresh import RefreshController
from .welcome import WelcomeController from .welcome import WelcomeController
__all__ = [ __all__ = [
'KeyboardController',
'ProgressController', 'ProgressController',
'RefreshController', 'RefreshController',
'WelcomeController', 'WelcomeController',

View File

@ -13,57 +13,32 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging import logging
import attr from subiquity.client.controller import SubiquityTuiController
from subiquity.client.keyboard import KeyboardList
from subiquitycore.context import with_context from subiquity.common.types import KeyboardSetting
from subiquity.common.keyboard import (
from subiquity.common.keyboard import set_keyboard set_keyboard,
from subiquity.controller import SubiquityTuiController )
from subiquity.keyboard import KeyboardList
from subiquity.models.keyboard import KeyboardSetting
from subiquity.ui.views import KeyboardView from subiquity.ui.views import KeyboardView
log = logging.getLogger('subiquity.controllers.keyboard') log = logging.getLogger('subiquity.client.controllers.keyboard')
class KeyboardController(SubiquityTuiController): class KeyboardController(SubiquityTuiController):
autoinstall_key = model_name = "keyboard" endpoint_name = 'keyboard'
autoinstall_schema = {
'type': 'object',
'properties': {
'layout': {'type': 'string'},
'variant': {'type': 'string'},
'toggle': {'type': ['string', 'null']},
},
'required': ['layout'],
'additionalProperties': False,
}
signals = [ signals = [
('l10n:language-selected', 'language_selected'), ('l10n:language-selected', 'language_selected'),
] ]
def __init__(self, app): def __init__(self, app):
self.needs_set_keyboard = False
super().__init__(app) super().__init__(app)
self.keyboard_list = KeyboardList() 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): def language_selected(self, code):
log.debug("language_selected %s", code) log.debug("language_selected %s", code)
if not self.keyboard_list.has_language(code): if not self.keyboard_list.has_language(code):
@ -73,10 +48,12 @@ class KeyboardController(SubiquityTuiController):
log.debug("loading language %s", code) log.debug("loading language %s", code)
self.keyboard_list.load_language(code) self.keyboard_list.load_language(code)
def make_ui(self): async def make_ui(self):
if self.keyboard_list.current_lang is None: if self.keyboard_list.current_lang is None:
self.keyboard_list.load_language('C') 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): def run_answers(self):
if 'layout' in self.answers: if 'layout' in self.answers:
@ -93,12 +70,7 @@ class KeyboardController(SubiquityTuiController):
if apply: if apply:
self.app.aio_loop.create_task(self.set_keyboard(setting)) self.app.aio_loop.create_task(self.set_keyboard(setting))
else: else:
self.model.setting = setting self.app.next_screen(self.endpoint.POST(setting))
self.configured()
self.app.next_screen()
def cancel(self): def cancel(self):
self.app.prev_screen() self.app.prev_screen()
def make_autoinstall(self):
return attr.asdict(self.model.setting)

View File

@ -20,6 +20,7 @@ from subiquity.common.types import (
ApplicationState, ApplicationState,
ApplicationStatus, ApplicationStatus,
ErrorReportRef, ErrorReportRef,
KeyboardSetting,
InstallState, InstallState,
InstallStatus, InstallStatus,
RefreshStatus, RefreshStatus,
@ -30,6 +31,7 @@ from subiquity.common.types import (
class API: class API:
"""The API offered by the subiquity installer process.""" """The API offered by the subiquity installer process."""
locale = simple_endpoint(str) locale = simple_endpoint(str)
keyboard = simple_endpoint(KeyboardSetting)
class meta: class meta:
class status: class status:

View File

@ -16,7 +16,6 @@
from ..controller import RepeatedController from ..controller import RepeatedController
from .filesystem import FilesystemController from .filesystem import FilesystemController
from .identity import IdentityController from .identity import IdentityController
from .keyboard import KeyboardController
from .mirror import MirrorController from .mirror import MirrorController
from .network import NetworkController from .network import NetworkController
from .proxy import ProxyController from .proxy import ProxyController
@ -28,7 +27,6 @@ from .zdev import ZdevController
__all__ = [ __all__ = [
'FilesystemController', 'FilesystemController',
'IdentityController', 'IdentityController',
'KeyboardController',
'MirrorController', 'MirrorController',
'NetworkController', 'NetworkController',
'ProxyController', 'ProxyController',

View File

@ -16,6 +16,7 @@
from .cmdlist import EarlyController, LateController, ErrorController from .cmdlist import EarlyController, LateController, ErrorController
from .debconf import DebconfController from .debconf import DebconfController
from .install import InstallController from .install import InstallController
from .keyboard import KeyboardController
from .locale import LocaleController from .locale import LocaleController
from .package import PackageController from .package import PackageController
from .refresh import RefreshController from .refresh import RefreshController
@ -27,6 +28,7 @@ __all__ = [
'EarlyController', 'EarlyController',
'ErrorController', 'ErrorController',
'InstallController', 'InstallController',
'KeyboardController',
'LateController', 'LateController',
'LocaleController', 'LocaleController',
'PackageController', 'PackageController',

View File

@ -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 <http://www.gnu.org/licenses/>.
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()

View File

@ -120,6 +120,7 @@ class SubiquityServer(Application):
"Debconf", "Debconf",
"Locale", "Locale",
"Refresh", "Refresh",
"Keyboard",
"Install", "Install",
"Late", "Late",
] ]

View File

@ -44,8 +44,8 @@ from subiquitycore.ui.stretchy import (
from subiquitycore.ui.utils import button_pile, Color, Padding, screen from subiquitycore.ui.utils import button_pile, Color, Padding, screen
from subiquitycore.view import BaseView from subiquitycore.view import BaseView
from subiquity.client.keyboard import latinizable, for_ui
from subiquity.common.types import KeyboardSetting from subiquity.common.types import KeyboardSetting
from subiquity.keyboard import latinizable, for_ui
from subiquity.ui.views import pc105 from subiquity.ui.views import pc105
log = logging.getLogger("subiquity.ui.views.keyboard") log = logging.getLogger("subiquity.ui.views.keyboard")