change button_pile to use widget_width

This commit is contained in:
Michael Hudson-Doyle 2018-06-26 10:12:09 +12:00
parent 8854e7aaaa
commit 1ae09926ca
2 changed files with 13 additions and 13 deletions

View File

@ -18,11 +18,8 @@
from functools import partialmethod from functools import partialmethod
import logging import logging
from subiquitycore.ui.container import ListBox, Pile
from urwid import ( from urwid import (
AttrMap, AttrMap,
Button,
CompositeCanvas, CompositeCanvas,
Padding as _Padding, Padding as _Padding,
Text, Text,
@ -30,6 +27,9 @@ from urwid import (
WidgetDisable, WidgetDisable,
) )
from subiquitycore.ui.container import ListBox, Pile
from subiquitycore.ui.width import widget_width
log = logging.getLogger("subiquitycore.ui.utils") log = logging.getLogger("subiquitycore.ui.utils")
@ -207,16 +207,11 @@ def disabled(w):
def button_pile(buttons): def button_pile(buttons):
max_label = 10 width = 14
for button in buttons: for button in buttons:
button = button.base_widget width = max(widget_width(button), width)
if not isinstance(button, Button): return _Padding(
raise RuntimeError("button_pile takes a list of buttons, not %s", Pile(buttons), min_width=width, width=width, align='center')
button)
max_label = max(len(button.label), max_label)
width = max_label + 4
return _Padding(Pile(buttons), min_width=width,
width=width, align='center')
def screen(rows, buttons, focus_buttons=True, excerpt=None, narrow_rows=False): def screen(rows, buttons, focus_buttons=True, excerpt=None, narrow_rows=False):

View File

@ -21,6 +21,11 @@ size_neutral_decorations = (
urwid.WidgetDisable, urwid.WidgetDisable,
) )
size_neutral_widget_wraps = (
urwid.Button,
urwid.CheckBox,
)
def widget_width(w): def widget_width(w):
"""Return the natural width of the widget w.""" """Return the natural width of the widget w."""
@ -29,7 +34,7 @@ def widget_width(w):
return widget_width(w.original_widget) return widget_width(w.original_widget)
if hasattr(w, 'get_natural_width'): if hasattr(w, 'get_natural_width'):
return w.get_natural_width() return w.get_natural_width()
if isinstance(w, urwid.CheckBox): if isinstance(w, size_neutral_widget_wraps):
return widget_width(w._wrapped_widget) return widget_width(w._wrapped_widget)
elif isinstance(w, size_neutral_decorations): elif isinstance(w, size_neutral_decorations):
return widget_width(w.original_widget) return widget_width(w.original_widget)