Add initial start view, buttons, and utilities
Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
This commit is contained in:
parent
9f78c2a775
commit
389fdf17cb
|
@ -0,0 +1,6 @@
|
||||||
|
#
|
||||||
|
# Makefile for subiquity
|
||||||
|
#
|
||||||
|
|
||||||
|
ui-view:
|
||||||
|
PYTHONPATH=$(shell pwd):$(PYTHONPATH) bin/subiquity
|
|
@ -0,0 +1,34 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# 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 urwid
|
||||||
|
from subiquity.palette import STYLES
|
||||||
|
from subiquity.views import StartView
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
screen = urwid.raw_display.Screen()
|
||||||
|
screen.set_terminal_properties(256)
|
||||||
|
screen.register_palette(STYLES)
|
||||||
|
|
||||||
|
def unhandled_input(key):
|
||||||
|
if key in ('Q', 'q', 'esc'):
|
||||||
|
raise urwid.ExitMainLoop()
|
||||||
|
urwid.MainLoop(StartView(), screen=screen,
|
||||||
|
unhandled_input=unhandled_input).run()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,18 @@
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
""" Subiquity """
|
||||||
|
|
||||||
|
__version__ = "0.0.1"
|
|
@ -1,4 +1,17 @@
|
||||||
# Copyright 2015 Canonical, Ltd.
|
# 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/>.
|
||||||
|
|
||||||
""" Model Classes
|
""" Model Classes
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,17 @@
|
||||||
# Copyright 2015 Canonical, Ltd.
|
# 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/>.
|
||||||
|
|
||||||
""" Identity Model
|
""" Identity Model
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,17 @@
|
||||||
# Copyright 2015 Canonical, Ltd.
|
# 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/>.
|
||||||
|
|
||||||
""" Welcome Model
|
""" Welcome Model
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
""" Palette Loader """
|
||||||
|
|
||||||
|
|
||||||
|
def apply_default_colors(cls):
|
||||||
|
color_map = {'orange': '#d51',
|
||||||
|
'light_orange': '#d81',
|
||||||
|
'white': 'white',
|
||||||
|
'black': 'black',
|
||||||
|
'light_aubergine': '#77216F',
|
||||||
|
'mid_aubergine': '#5E2750',
|
||||||
|
'dark_aubergine': '#2C001E',
|
||||||
|
'warm_grey': '#AEA79F',
|
||||||
|
'cool_grey': '#333',
|
||||||
|
'small_dot_grey': '#AEA79F',
|
||||||
|
'text_grey': '#333'}
|
||||||
|
for k, v in color_map.items():
|
||||||
|
setattr(cls, k, v)
|
||||||
|
return cls
|
||||||
|
|
||||||
|
|
||||||
|
@apply_default_colors
|
||||||
|
class Palette:
|
||||||
|
pass
|
||||||
|
|
||||||
|
STYLES = [('frame_header', Palette.white, Palette.black,
|
||||||
|
'default', Palette.white, Palette.orange),
|
||||||
|
('frame_footer', Palette.white, Palette.black),
|
||||||
|
('body', Palette.white, 'default', 'default',
|
||||||
|
Palette.white, Palette.orange),
|
||||||
|
('button_primary', Palette.white, 'default',
|
||||||
|
'default', Palette.white, Palette.cool_grey),
|
||||||
|
('button_primary focus', Palette.white,
|
||||||
|
'default', 'default', Palette.white,
|
||||||
|
Palette.light_orange),
|
||||||
|
('button_secondary', Palette.white, 'default',
|
||||||
|
'default', Palette.white, Palette.cool_grey),
|
||||||
|
('button_secondary focus', Palette.white,
|
||||||
|
'default', 'default', Palette.white, Palette.light_orange)]
|
|
@ -1,5 +1,16 @@
|
||||||
# Copyright 2015 Canonical, Ltd.
|
# 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/>.
|
||||||
|
|
||||||
""" Subiquity UI Components """
|
""" Subiquity UI Components """
|
||||||
|
|
||||||
__version__ = "0.0.1"
|
|
||||||
|
|
|
@ -1,6 +1,19 @@
|
||||||
# Copyright 2015 Canonical, Ltd.
|
# 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/>.
|
||||||
|
|
||||||
from urwid import WidgetWrap, AttrWrap, Pile, Text, Columns
|
from urwid import WidgetWrap, AttrWrap, Pile, Text
|
||||||
|
|
||||||
|
|
||||||
class Header(WidgetWrap):
|
class Header(WidgetWrap):
|
||||||
|
@ -11,11 +24,13 @@ class Header(WidgetWrap):
|
||||||
:param str title: Title of Header
|
:param str title: Title of Header
|
||||||
:returns: Header()
|
:returns: Header()
|
||||||
"""
|
"""
|
||||||
def __init__(self, title="Ubuntu Server Installer"):
|
|
||||||
title = title
|
title = "Ubuntu Server Installer"
|
||||||
title_widget = AttrWrap(Text(title), "frame_header")
|
|
||||||
|
def __init__(self):
|
||||||
|
title_widget = AttrWrap(Text(self.title), "frame_header")
|
||||||
pile = Pile([title_widget])
|
pile = Pile([title_widget])
|
||||||
super().__init__(Columns(pile))
|
super().__init__(pile)
|
||||||
|
|
||||||
|
|
||||||
class Footer(WidgetWrap):
|
class Footer(WidgetWrap):
|
||||||
|
@ -26,11 +41,14 @@ class Footer(WidgetWrap):
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
status = Pile([Text("")])
|
status = Pile([Text("")])
|
||||||
super().__init__(Columns(status))
|
super().__init__(status)
|
||||||
|
|
||||||
|
|
||||||
class Body(WidgetWrap):
|
class Body(WidgetWrap):
|
||||||
""" Body widget
|
""" Body widget
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(Text("Welcome to the Server Installation"))
|
self.text = [
|
||||||
|
Text("Welcome to the Ubuntu Server Installation", align="center")
|
||||||
|
]
|
||||||
|
super().__init__(Pile(self.text))
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
from urwid import Button
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
confirm_btn = partial(Button, label="Confirm", on_press=None)
|
||||||
|
cancel_btn = partial(Button, label="Cancel", on_press=None)
|
|
@ -1,13 +1,27 @@
|
||||||
# Copyright 2015 Canonical, Ltd.
|
# 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/>.
|
||||||
|
|
||||||
""" Base Frame Widget """
|
""" Base Frame Widget """
|
||||||
|
|
||||||
from urwid import Frame, WidgetWrap
|
from urwid import Frame, WidgetWrap
|
||||||
|
from subiquity.ui.anchors import Header, Footer, Body
|
||||||
|
|
||||||
|
|
||||||
class Base(WidgetWrap):
|
class BaseFrame(WidgetWrap):
|
||||||
def __init__(self, header, body, footer):
|
def __init__(self):
|
||||||
self.frame = Frame(body,
|
_frame = Frame(Body(),
|
||||||
header,
|
Header(),
|
||||||
footer)
|
Footer())
|
||||||
super().__init__(self.frame)
|
super().__init__(_frame)
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
""" UI utilities """
|
||||||
|
|
||||||
|
from urwid import Padding as _Padding
|
||||||
|
from functools import partialmethod
|
||||||
|
|
||||||
|
|
||||||
|
class Padding:
|
||||||
|
center = partialmethod(_Padding, align='center',
|
||||||
|
width=('relative', 50))
|
|
@ -0,0 +1,52 @@
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
from urwid import (WidgetWrap, ListBox, AttrWrap, Columns, Text,
|
||||||
|
# emitters
|
||||||
|
signals, emit_signal)
|
||||||
|
from subiquity.ui.anchors import Header, Footer, Body # NOQA
|
||||||
|
from subiquity.ui.buttons import confirm_btn, cancel_btn
|
||||||
|
from subiquity.ui.utils import Padding
|
||||||
|
|
||||||
|
|
||||||
|
class StartView(WidgetWrap):
|
||||||
|
__metaclass__ = signals.MetaSignals
|
||||||
|
signals = ['done']
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
Header.title = "SUbiquity - Ubiquity for Servers"
|
||||||
|
self.layout = [
|
||||||
|
Header(),
|
||||||
|
Text(""),
|
||||||
|
Text("Begin the installation", align='center'),
|
||||||
|
Padding.center(self._build_buttons()),
|
||||||
|
Footer()
|
||||||
|
]
|
||||||
|
super().__init__(ListBox(self.layout))
|
||||||
|
|
||||||
|
def _build_buttons(self):
|
||||||
|
self.buttons = [
|
||||||
|
AttrWrap(confirm_btn(on_press=self.confirm),
|
||||||
|
'button_primary', 'button_primary focus'),
|
||||||
|
AttrWrap(cancel_btn(on_press=self.cancel),
|
||||||
|
'button_secondary', 'button_secondary focus'),
|
||||||
|
]
|
||||||
|
return Columns(self.buttons)
|
||||||
|
|
||||||
|
def confirm(self, button):
|
||||||
|
emit_signal(self, 'done', True)
|
||||||
|
|
||||||
|
def cancel(self, button):
|
||||||
|
emit_signal(self, 'done', False)
|
Loading…
Reference in New Issue