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

View File

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