mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-29 14:54:00 -06:00
ui: rename Ui class to UrwidUserInterface
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
import typing as T
|
||||
|
||||
import urwid
|
||||
|
||||
from pqcli.ui.urwid.layout import NColumns, NPile
|
||||
|
||||
|
||||
class DataTable(NPile):
|
||||
def __init__(self, columns: T.Any) -> None:
|
||||
self.column_count = len(columns)
|
||||
self._columns = columns
|
||||
self._rows: T.List[T.List[urwid.Widget]] = []
|
||||
super().__init__([])
|
||||
|
||||
@property
|
||||
def row_count(self) -> int:
|
||||
return len(self._rows)
|
||||
|
||||
@property
|
||||
def data_rows(self) -> T.Iterable[T.List[urwid.Widget]]:
|
||||
# "rows" was already used by urwid
|
||||
return self._rows
|
||||
|
||||
def add_row(self, *widgets: T.List[urwid.Widget]) -> None:
|
||||
if len(widgets) != self.column_count:
|
||||
raise VauleError(f"Expected {self.column_count} widgets")
|
||||
|
||||
self.contents.append(
|
||||
(
|
||||
NColumns(
|
||||
list((*x, y) for x, y in zip(self._columns, widgets))
|
||||
),
|
||||
(urwid.PACK, 1),
|
||||
)
|
||||
)
|
||||
|
||||
self.resize_columns()
|
||||
self._rows.append(widgets)
|
||||
|
||||
def delete_row(self, idx: int) -> None:
|
||||
del self.contents[idx]
|
||||
del self._rows[idx]
|
||||
self.resize_columns()
|
||||
|
||||
def delete_rows(self, start_idx: int, end_idx: int) -> None:
|
||||
del self.contents[start_idx:end_idx]
|
||||
del self._rows[start_idx:end_idx]
|
||||
self.resize_columns()
|
||||
|
||||
def resize_columns(self) -> None:
|
||||
if not self._rows:
|
||||
return
|
||||
|
||||
for i, sizing in enumerate(self._columns):
|
||||
if isinstance(sizing, tuple) and sizing[0] == urwid.PACK:
|
||||
width = max(
|
||||
row_widgets[i].pack()[0] for row_widgets in self._rows
|
||||
)
|
||||
for item in self.contents:
|
||||
columns = item[0]
|
||||
columns.contents[i] = (
|
||||
columns.contents[i][0],
|
||||
(urwid.GIVEN, width, None),
|
||||
)
|
||||
Reference in New Issue
Block a user