From 0ae861934997e809e45e143aa481c3b92eed6d92 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 23 May 2022 16:28:55 +0000 Subject: [PATCH] twview: improve screen width handling --- mmgen/tw/common.py | 40 ++++++++++++++++++++++++---------------- mmgen/tw/unspent.py | 12 +++++++++--- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/mmgen/tw/common.py b/mmgen/tw/common.py index d380510c..983e416c 100755 --- a/mmgen/tw/common.py +++ b/mmgen/tw/common.py @@ -20,7 +20,7 @@ tw: Tracking wallet dependency classes and helper functions """ -import time +import sys,time from ..globalvars import g from ..objmethods import Hilite,InitErrors,MMGenObject @@ -97,15 +97,23 @@ class TwCommon: def disp_prec(self): return self.proto.coin_amt.max_prec - def set_term_columns(self): - from ..term import get_terminal_size + def get_term_columns(self,min_cols): + from ..term import get_terminal_size,get_char_raw while True: - self.cols = g.columns or get_terminal_size().width - if self.cols >= g.min_screen_width: - break - line_input( - 'Screen too narrow to display the tracking wallet\n' - + f'Please resize your screen to at least {g.min_screen_width} characters and hit ENTER ' ) + cols = g.columns or get_terminal_size().width + if cols >= min_cols: + return cols + if sys.stdout.isatty(): + if g.columns: + die(1, + f'\n--columns or MMGEN_COLUMNS value ({g.columns}) is too small to display the {self.desc}.\n' + + f'Minimum value for this configuration: {min_cols}' ) + else: + get_char_raw( + f'\nScreen is too narrow to display the {self.desc}\n' + + f'Please resize your screen to at least {min_cols} characters and hit any key: ' ) + else: + return min_cols def sort_info(self,include_group=True): ret = ([],['Reverse'])[self.reverse] @@ -134,11 +142,9 @@ class TwCommon: data = self.data if self.has_age and self.age_fmt in self.age_fmts_date_dependent: await self.set_dates(self.rpc,data) - self.set_term_columns() - c = getattr(self,'display_constants',None) - if not c: - c = self.display_constants = self.get_display_constants() + if not getattr(self,'column_params',None): + self.set_column_params() if self.group and (self.sort_key in ('addr','txid','twmmid')): for a,b in [(data[i],data[i+1]) for i in range(len(data)-1)]: @@ -152,7 +158,7 @@ class TwCommon: b = self.proto.dcoin, c = self.total.hl() if hasattr(self,'total') else None ) + ('\nChain: '+green(self.proto.chain_name.upper()) if self.proto.chain_name != 'mainnet' else '') - + '\n' + '\n'.join(self.gen_display_output(c)) + + '\n' + '\n'.join(self.gen_display_output(self.column_params)) + '\n' ) @@ -210,13 +216,15 @@ class TwCommon: elif action == 'd_days': af = self.age_fmts_interactive self.age_fmt = af[(af.index(self.age_fmt) + 1) % len(af)] + if self.update_params_on_age_toggle: + self.set_column_params() elif action == 'd_mmid': self.show_mmid = not self.show_mmid elif action == 'd_group': if self.can_group: self.group = not self.group elif action == 'd_redraw': - pass + self.set_column_params() elif action == 'd_reverse': self.data.reverse() self.reverse = not self.reverse @@ -227,7 +235,7 @@ class TwCommon: await self.action(self).run(action) elif hasattr(self.item_action,action): await self.item_action(self).run(action) - self.display_constants = self.get_display_constants() + self.set_column_params() class action: diff --git a/mmgen/tw/unspent.py b/mmgen/tw/unspent.py index 2defef1f..9d3c06e9 100755 --- a/mmgen/tw/unspent.py +++ b/mmgen/tw/unspent.py @@ -53,6 +53,7 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): No spendable outputs found! Import addresses with balances into your watch-only wallet using 'mmgen-addrimport' and then re-run this program. """ + update_params_on_age_toggle = False class MMGenTwUnspentOutput(MMGenListItem): txid = ListItemAttr(CoinTxID) @@ -84,6 +85,7 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): self.minconf = minconf self.addrs = addrs self.rpc = await rpc_init(proto) + self.min_cols = g.min_screen_width from .ctl import TrackingWallet self.wallet = await TrackingWallet(proto,mode='w') @@ -109,11 +111,13 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): self.proto, **{ k:v for k,v in o.items() if k in self.MMGenTwUnspentOutput.valid_attrs } ) - def get_display_constants(self): + def set_column_params(self): data = self.data for i in data: i.skip = '' + self.cols = self.get_term_columns(g.min_screen_width) + # allow for 7-digit confirmation nums col1_w = max(3,len(str(len(data)))+1) # num + ')' mmid_w = max(len(('',i.twmmid)[i.twmmid.type=='mmgen']) for i in data) or 12 # DEADBEEF:S:1 @@ -127,8 +131,10 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): tx_w = min(self.txid_w,self.cols-addr_w-29-col1_w) # min=6 TODO txdots = ('','..')[tx_w < self.txid_w] - dc = namedtuple('display_constants',['col1_w','mmid_w','addr_w','btaddr_w','label_w','tx_w','txdots']) - return dc(col1_w,mmid_w,addr_w,btaddr_w,label_w,tx_w,txdots) + self.column_params = namedtuple( + 'column_params', + ['col1_w','mmid_w','addr_w','btaddr_w','label_w','tx_w','txdots'] + )(col1_w, mmid_w, addr_w, btaddr_w, label_w, tx_w, txdots) def gen_display_output(self,c): fs = self.display_fs_fs.format( cw=c.col1_w, tw=c.tx_w )