Browse Source

twview: improve screen width handling

The MMGen Project 2 years ago
parent
commit
0ae8619349
2 changed files with 33 additions and 19 deletions
  1. 24 16
      mmgen/tw/common.py
  2. 9 3
      mmgen/tw/unspent.py

+ 24 - 16
mmgen/tw/common.py

@@ -20,7 +20,7 @@
 tw: Tracking wallet dependency classes and helper functions
 tw: Tracking wallet dependency classes and helper functions
 """
 """
 
 
-import time
+import sys,time
 
 
 from ..globalvars import g
 from ..globalvars import g
 from ..objmethods import Hilite,InitErrors,MMGenObject
 from ..objmethods import Hilite,InitErrors,MMGenObject
@@ -97,15 +97,23 @@ class TwCommon:
 	def disp_prec(self):
 	def disp_prec(self):
 		return self.proto.coin_amt.max_prec
 		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:
 		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):
 	def sort_info(self,include_group=True):
 		ret = ([],['Reverse'])[self.reverse]
 		ret = ([],['Reverse'])[self.reverse]
@@ -134,11 +142,9 @@ class TwCommon:
 		data = self.data
 		data = self.data
 		if self.has_age and self.age_fmt in self.age_fmts_date_dependent:
 		if self.has_age and self.age_fmt in self.age_fmts_date_dependent:
 			await self.set_dates(self.rpc,data)
 			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')):
 		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)]:
 			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,
 				b = self.proto.dcoin,
 				c = self.total.hl() if hasattr(self,'total') else None )
 				c = self.total.hl() if hasattr(self,'total') else None )
 			+ ('\nChain: '+green(self.proto.chain_name.upper()) if self.proto.chain_name != 'mainnet' else '')
 			+ ('\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'
 			+ '\n'
 		)
 		)
 
 
@@ -210,13 +216,15 @@ class TwCommon:
 			elif action == 'd_days':
 			elif action == 'd_days':
 				af = self.age_fmts_interactive
 				af = self.age_fmts_interactive
 				self.age_fmt = af[(af.index(self.age_fmt) + 1) % len(af)]
 				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':
 			elif action == 'd_mmid':
 				self.show_mmid = not self.show_mmid
 				self.show_mmid = not self.show_mmid
 			elif action == 'd_group':
 			elif action == 'd_group':
 				if self.can_group:
 				if self.can_group:
 					self.group = not self.group
 					self.group = not self.group
 			elif action == 'd_redraw':
 			elif action == 'd_redraw':
-				pass
+				self.set_column_params()
 			elif action == 'd_reverse':
 			elif action == 'd_reverse':
 				self.data.reverse()
 				self.data.reverse()
 				self.reverse = not self.reverse
 				self.reverse = not self.reverse
@@ -227,7 +235,7 @@ class TwCommon:
 				await self.action(self).run(action)
 				await self.action(self).run(action)
 			elif hasattr(self.item_action,action):
 			elif hasattr(self.item_action,action):
 				await self.item_action(self).run(action)
 				await self.item_action(self).run(action)
-				self.display_constants = self.get_display_constants()
+				self.set_column_params()
 
 
 	class action:
 	class action:
 
 

+ 9 - 3
mmgen/tw/unspent.py

@@ -53,6 +53,7 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit):
 		No spendable outputs found!  Import addresses with balances into your
 		No spendable outputs found!  Import addresses with balances into your
 		watch-only wallet using 'mmgen-addrimport' and then re-run this program.
 		watch-only wallet using 'mmgen-addrimport' and then re-run this program.
 	"""
 	"""
+	update_params_on_age_toggle = False
 
 
 	class MMGenTwUnspentOutput(MMGenListItem):
 	class MMGenTwUnspentOutput(MMGenListItem):
 		txid         = ListItemAttr(CoinTxID)
 		txid         = ListItemAttr(CoinTxID)
@@ -84,6 +85,7 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit):
 		self.minconf      = minconf
 		self.minconf      = minconf
 		self.addrs        = addrs
 		self.addrs        = addrs
 		self.rpc          = await rpc_init(proto)
 		self.rpc          = await rpc_init(proto)
+		self.min_cols     = g.min_screen_width
 
 
 		from .ctl import TrackingWallet
 		from .ctl import TrackingWallet
 		self.wallet = await TrackingWallet(proto,mode='w')
 		self.wallet = await TrackingWallet(proto,mode='w')
@@ -109,11 +111,13 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit):
 					self.proto,
 					self.proto,
 					**{ k:v for k,v in o.items() if k in self.MMGenTwUnspentOutput.valid_attrs } )
 					**{ 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
 		data = self.data
 		for i in data:
 		for i in data:
 			i.skip = ''
 			i.skip = ''
 
 
+		self.cols = self.get_term_columns(g.min_screen_width)
+
 		# allow for 7-digit confirmation nums
 		# allow for 7-digit confirmation nums
 		col1_w = max(3,len(str(len(data)))+1) # num + ')'
 		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
 		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
 		tx_w = min(self.txid_w,self.cols-addr_w-29-col1_w) # min=6 TODO
 		txdots = ('','..')[tx_w < self.txid_w]
 		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):
 	def gen_display_output(self,c):
 		fs     = self.display_fs_fs.format(     cw=c.col1_w, tw=c.tx_w )
 		fs     = self.display_fs_fs.format(     cw=c.col1_w, tw=c.tx_w )