From 90d96168d6231759ac1cd5bfb20066fc9d331ac7 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Wed, 9 Nov 2022 13:05:08 +0000 Subject: [PATCH] mmgen.tw.common: new compute_column_widths() method - automagically compute variable column widths for tabular display using the given input parameters - 'nice' (low-priority) columns supported --- mmgen/tw/common.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/mmgen/tw/common.py b/mmgen/tw/common.py index 017c5acb..b8758d3c 100755 --- a/mmgen/tw/common.py +++ b/mmgen/tw/common.py @@ -21,6 +21,7 @@ tw: Tracking wallet dependency classes and helper functions """ import sys,time,asyncio +from collections import namedtuple from ..globalvars import g from ..objmethods import Hilite,InitErrors,MMGenObject @@ -176,6 +177,66 @@ class TwCommon: assert type(reverse) == bool self.data.sort(key=self.sort_funcs[key],reverse=reverse or self.reverse) + def compute_column_widths(self,widths,maxws,minws,maxws_nice={},wide=False): + + def do_ret(freews): + widths.update({k:minws[k] + freews.get(k,0) for k in minws}) + return namedtuple('column_widths',widths.keys())(*widths.values()) + + def do_ret_max(): + widths.update({k:max(minws[k],maxws[k]) for k in minws}) + return namedtuple('column_widths',widths.keys())(*widths.values()) + + def get_freews(cols,varws,varw,minw): + freew = cols - minw + if freew and varw: + x = freew / varw + freews = {k:int(varws[k] * x) for k in varws} + remainder = freew - sum(freews.values()) + for k in varws: + if not remainder: + break + if freews[k] < varws[k]: + freews[k] += 1 + remainder -= 1 + return freews + else: + return {k:0 for k in varws} + + if wide: + return do_ret_max() + + varws = {k:maxws[k] - minws[k] for k in maxws if maxws[k] > minws[k]} + minw = sum(widths.values()) + sum(minws.values()) + varw = sum(varws.values()) + + term_cols = self.get_term_columns(minw) + self.cols = min(term_cols,minw + varw) + + if self.cols == minw + varw: + return do_ret_max() + + if maxws_nice: + # compute high-priority widths: + varws_hp = {k: maxws_nice[k] - minws[k] if k in maxws_nice else varws[k] for k in varws} + varw_hp = sum(varws_hp.values()) + widths_hp = get_freews( + min(term_cols,minw + varw_hp), + varws_hp, + varw_hp, + minw ) + # compute low-priority (nice) widths: + varws_lp = {k: varws[k] - varws_hp[k] for k in maxws_nice if k in varws} + widths_lp = get_freews( + self.cols, + varws_lp, + sum(varws_lp.values()), + minw + sum(widths_hp.values()) ) + # sum the two for each field: + return do_ret({k:widths_hp[k] + widths_lp.get(k,0) for k in varws}) + else: + return do_ret(get_freews(self.cols,varws,varw,minw)) + async def format_squeezed(self,color=True,cached=False): if not cached: