Merge pull request #296 from CanonicalLtd/mwhudson/shift-tab-fixery
keyboard fixes: show dialog while applying, re-setup shift tab afterwards
This commit is contained in:
commit
e1bc2eb45d
|
@ -60,7 +60,11 @@ class KeyboardController(BaseController):
|
||||||
self.done(layout, variant)
|
self.done(layout, variant)
|
||||||
|
|
||||||
def done(self, layout, variant):
|
def done(self, layout, variant):
|
||||||
self.model.set_keyboard(layout, variant)
|
self.run_in_bg(
|
||||||
|
lambda: self.model.set_keyboard(layout, variant),
|
||||||
|
self._done)
|
||||||
|
|
||||||
|
def _done(self, fut):
|
||||||
self.signal.emit_signal('next-screen')
|
self.signal.emit_signal('next-screen')
|
||||||
|
|
||||||
def cancel(self):
|
def cancel(self):
|
||||||
|
|
|
@ -101,3 +101,6 @@ class KeyboardModel:
|
||||||
fp.write(self.config_content)
|
fp.write(self.config_content)
|
||||||
if self.root == '/':
|
if self.root == '/':
|
||||||
run_command(['setupcon', '--save', '--force'])
|
run_command(['setupcon', '--save', '--force'])
|
||||||
|
run_command(['/snap/bin/subiquity.subiquity-loadkeys'])
|
||||||
|
else:
|
||||||
|
run_command(['sleep', '1'])
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
# Copyright 2017 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/>.
|
||||||
|
|
||||||
|
from urwid import (
|
||||||
|
Text,
|
||||||
|
)
|
||||||
|
|
||||||
|
styles = {
|
||||||
|
'dots': {
|
||||||
|
'texts': [t.replace('*', '\N{bullet}') for t in ['|*----|', '|-*---|', '|--*--|', '|---*-|', '|----*|', '|---*-|', '|--*--|', '|-*---|']],
|
||||||
|
'rate': 0.2,
|
||||||
|
},
|
||||||
|
'spin': {
|
||||||
|
'texts': ['-', '\\', '|', '/'],
|
||||||
|
'rate': 0.1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
class Spinner(Text):
|
||||||
|
def __init__(self, loop, style='spin', align='center'):
|
||||||
|
self.loop = loop
|
||||||
|
self.spin_index = 0
|
||||||
|
self.spin_text = styles[style]['texts']
|
||||||
|
self.rate = styles[style]['rate']
|
||||||
|
super().__init__('', align=align)
|
||||||
|
self.handle = None
|
||||||
|
|
||||||
|
def _advance(self, sender=None, user_data=None):
|
||||||
|
self.spin_index = (self.spin_index + 1)%len(self.spin_text)
|
||||||
|
self.set_text(self.spin_text[self.spin_index])
|
||||||
|
self.handle = self.loop.set_alarm_in(self.rate, self._advance)
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
self.stop()
|
||||||
|
self._advance()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.set_text('')
|
||||||
|
if self.handle is not None:
|
||||||
|
self.loop.remove_alarm(self.handle)
|
||||||
|
self.handle = None
|
||||||
|
|
|
@ -25,6 +25,8 @@ from subiquitycore.ui.buttons import cancel_btn, ok_btn, other_btn
|
||||||
from subiquitycore.ui.container import Columns, ListBox, Pile
|
from subiquitycore.ui.container import Columns, ListBox, Pile
|
||||||
from subiquitycore.ui.utils import button_pile, Padding
|
from subiquitycore.ui.utils import button_pile, Padding
|
||||||
|
|
||||||
|
from subiquity.ui.spinner import Spinner
|
||||||
|
|
||||||
log = logging.getLogger("subiquity.views.installprogress")
|
log = logging.getLogger("subiquity.views.installprogress")
|
||||||
|
|
||||||
class MyLineBox(LineBox):
|
class MyLineBox(LineBox):
|
||||||
|
@ -34,29 +36,6 @@ class MyLineBox(LineBox):
|
||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
class Spinner(Text):
|
|
||||||
def __init__(self, loop):
|
|
||||||
self.loop = loop
|
|
||||||
self.spin_index = 0
|
|
||||||
self.spin_text = r'-\|/'
|
|
||||||
super().__init__('')
|
|
||||||
self.handle = None
|
|
||||||
|
|
||||||
def _advance(self, sender=None, user_data=None):
|
|
||||||
self.spin_index = (self.spin_index + 1)%len(self.spin_text)
|
|
||||||
self.set_text(self.spin_text[self.spin_index])
|
|
||||||
self.handle = self.loop.set_alarm_in(0.1, self._advance)
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
self.stop()
|
|
||||||
self._advance()
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
self.set_text('')
|
|
||||||
if self.handle is not None:
|
|
||||||
self.loop.remove_alarm(self.handle)
|
|
||||||
self.handle = None
|
|
||||||
|
|
||||||
|
|
||||||
class ProgressView(BaseView):
|
class ProgressView(BaseView):
|
||||||
def __init__(self, controller):
|
def __init__(self, controller):
|
||||||
|
|
|
@ -36,6 +36,7 @@ from subiquitycore.ui.selector import Option, Selector
|
||||||
from subiquitycore.ui.utils import button_pile, Color, Padding
|
from subiquitycore.ui.utils import button_pile, Color, Padding
|
||||||
from subiquitycore.view import BaseView
|
from subiquitycore.view import BaseView
|
||||||
|
|
||||||
|
from subiquity.ui.spinner import Spinner
|
||||||
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")
|
||||||
|
@ -249,6 +250,21 @@ class Detector:
|
||||||
self.overlay.start()
|
self.overlay.start()
|
||||||
self.keyboard_view.show_overlay(self.overlay)
|
self.keyboard_view.show_overlay(self.overlay)
|
||||||
|
|
||||||
|
class ApplyingConfig(WidgetWrap):
|
||||||
|
def __init__(self, loop):
|
||||||
|
spinner = Spinner(loop, style='dots')
|
||||||
|
spinner.start()
|
||||||
|
text = _("Applying config")
|
||||||
|
# | text |
|
||||||
|
# 12 34
|
||||||
|
self.width = len(text) + 4
|
||||||
|
super().__init__(
|
||||||
|
LineBox(
|
||||||
|
Pile([
|
||||||
|
('pack', Text(' ' + text)),
|
||||||
|
('pack', spinner),
|
||||||
|
])))
|
||||||
|
|
||||||
|
|
||||||
class ChoiceField(FormField):
|
class ChoiceField(FormField):
|
||||||
|
|
||||||
|
@ -333,6 +349,8 @@ class KeyboardView(BaseView):
|
||||||
variant = ''
|
variant = ''
|
||||||
if self.form.variant.widget.value is not None:
|
if self.form.variant.widget.value is not None:
|
||||||
variant = self.form.variant.widget.value
|
variant = self.form.variant.widget.value
|
||||||
|
ac = ApplyingConfig(self.controller.loop)
|
||||||
|
self.show_overlay(ac, width=ac.width, min_width=None)
|
||||||
self.controller.done(layout, variant)
|
self.controller.done(layout, variant)
|
||||||
|
|
||||||
def cancel(self, result=None):
|
def cancel(self, result=None):
|
||||||
|
|
|
@ -36,13 +36,18 @@ class BaseView(WidgetWrap):
|
||||||
valign='middle',
|
valign='middle',
|
||||||
height='pack'
|
height='pack'
|
||||||
)
|
)
|
||||||
|
PADDING = 3
|
||||||
|
# Don't expect callers to account for the padding if they pass a fixed width.
|
||||||
|
if 'width' in kw:
|
||||||
|
if isinstance(kw['width'], int):
|
||||||
|
kw['width'] += 2*PADDING
|
||||||
args.update(kw)
|
args.update(kw)
|
||||||
top = Pile([
|
top = Pile([
|
||||||
('pack', Text("")),
|
('pack', Text("")),
|
||||||
Columns([
|
Columns([
|
||||||
(3, Text("")),
|
(PADDING, Text("")),
|
||||||
overlay_widget,
|
overlay_widget,
|
||||||
(3, Text(""))
|
(PADDING, Text(""))
|
||||||
]),
|
]),
|
||||||
('pack', Text("")),
|
('pack', Text("")),
|
||||||
])
|
])
|
||||||
|
|
Loading…
Reference in New Issue