subiquity/subiquitycore/palette.py

139 lines
4.5 KiB
Python

# Copyright 2020 Canonical, Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
COLORS = [
# black
("bg", (0x11, 0x11, 0x11)),
# dark red
("danger", (0xFF, 0x00, 0x00)),
# dark green
("good", (0x0E, 0x84, 0x20)),
# brown
("orange", (0xE9, 0x54, 0x20)),
# dark blue
("neutral", (0x00, 0x7A, 0xA6)),
# dark magenta
("brand", (0x33, 0x33, 0x33)),
# dark cyan
("gray", (0x80, 0x80, 0x80)),
# light gray
("fg", (0xFF, 0xFF, 0xFF)),
]
PALETTE_COLOR = [
("frame_header_fringe", "orange", "bg"),
("frame_header", "fg", "orange"),
("body", "fg", "bg"),
("done_button", "fg", "bg"),
("danger_button", "fg", "bg"),
("other_button", "fg", "bg"),
("done_button focus", "fg", "good"),
("danger_button focus", "fg", "danger"),
("other_button focus", "fg", "gray"),
("menu_button", "fg", "bg"),
("menu_button focus", "fg", "gray"),
("frame_button", "fg", "orange"),
("frame_button focus", "orange", "fg"),
("info_primary", "fg", "bg"),
("info_minor", "gray", "bg"),
("info_minor header", "gray", "orange"),
("info_error", "danger", "bg"),
("string_input", "bg", "fg"),
("string_input focus", "fg", "gray"),
("progress_incomplete", "fg", "gray"),
("progress_complete", "fg", "neutral"),
("scrollbar", "brand", "bg"),
("scrollbar focus", "gray", "bg"),
("verified", "good", "bg"),
("verified focus", "good", "gray"),
("verified invisible", "bg", "bg"),
("verified inv focus", "gray", "gray"),
("starred", "orange", "bg"),
("starred focus", "orange", "gray"),
("user_code", "fg", "good"),
]
PALETTE_MONO = [
("frame_header_fringe", "white", "black"),
("frame_header", "black", "white"),
("body", "white", "black"),
("done_button", "white", "black"),
("danger_button", "white", "black"),
("other_button", "white", "black"),
("done_button focus", "black", "white"),
("danger_button focus", "black", "white"),
("other_button focus", "black", "white"),
("menu_button", "white", "black"),
("menu_button focus", "black", "white"),
("frame_button", "black", "white"),
("frame_button focus", "white", "black"),
("info_primary", "white", "black"),
("info_minor", "white", "black"),
("info_minor header", "black", "white"),
("info_error", "white", "black"),
("string_input", "white", "black"),
("string_input focus", "black", "white"),
("progress_incomplete", "white", "black"),
("progress_complete", "black", "white"),
("scrollbar_fg", "white", "black"),
("scrollbar_bg", "white", "black"),
("verified", "white", "black"),
("verified focus", "black", "white"),
("verified invisible", "white", "black"),
("verified inv focus", "black", "white"),
("starred", "white", "black"),
("starred focus", "black", "white"),
("user_code", "white", "black"),
]
urwid_8_names = (
"black",
"dark red",
"dark green",
"brown",
"dark blue",
"dark magenta",
"dark cyan",
"light gray",
)
def _urwidize_palette(colors, styles):
"""Return a palette to be passed to MainLoop.
colors is a list of exactly 8 tuples (name, (r, g, b))
styles is a list of tuples (stylename, fg_color, bg_color) where
fg_color and bg_color are defined in 'colors'
"""
# The part that makes this "fun" is that urwid insists on referring
# to the basic colors by their "standard" names but we overwrite
# these colors to mean different things. So we convert styles into
# an urwid palette by mapping the names in colors to the standard
# name.
if len(colors) != 8:
raise Exception("make_palette must be passed a list of exactly 8 colors")
urwid_name = dict(zip([c[0] for c in colors], urwid_8_names))
urwid_palette = []
for name, fg, bg in styles:
urwid_fg, urwid_bg = urwid_name[fg], urwid_name[bg]
urwid_palette.append((name, urwid_fg, urwid_bg))
return urwid_palette
PALETTE_COLOR = _urwidize_palette(COLORS, PALETTE_COLOR)