From e658cb91df65655121be317617116466b4a78c94 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 27 Nov 2025 11:34:04 +0000 Subject: [PATCH] tw.view: make `get_idx()` and `get_idx_from_user()` into methods --- mmgen/proto/xmr/tw/unspent.py | 8 +++- mmgen/tw/view.py | 79 ++++++++++++++++------------------- 2 files changed, 43 insertions(+), 44 deletions(-) diff --git a/mmgen/proto/xmr/tw/unspent.py b/mmgen/proto/xmr/tw/unspent.py index 394e084d..ab7255c3 100755 --- a/mmgen/proto/xmr/tw/unspent.py +++ b/mmgen/proto/xmr/tw/unspent.py @@ -25,7 +25,6 @@ class MoneroTwUnspentOutputs(MoneroTwView, TwUnspentOutputs): hdr_lbl = 'spendable accounts' desc = 'spendable accounts' item_desc = 'account' - account_based = True include_empty = False total = None nice_addr_w = {'addr': 20} @@ -131,3 +130,10 @@ class MoneroTwUnspentOutputs(MoneroTwView, TwUnspentOutputs): a = d.addr.fmt(self.addr_view_pref, cw.addr, color=color), c = d.comment.fmt2(cw.comment, color=color, nullrepl='-'), A = d.amt.fmt(cw.iwidth, color=color, prec=self.disp_prec)) + + async def get_idx_from_user(self): + if res := await self.get_idx(f'{self.item_desc} number', self.accts_data): + return await self.get_idx( + 'address index', + list(self.accts_data.values())[res.idx - 1].data, + is_addr_idx = True) diff --git a/mmgen/tw/view.py b/mmgen/tw/view.py index 81e2122a..320456c1 100755 --- a/mmgen/tw/view.py +++ b/mmgen/tw/view.py @@ -80,7 +80,6 @@ class TwView(MMGenObject, metaclass=AsyncInit): def do(method, data, cw, fs, color, fmt_method): return [l.rstrip() for l in method(data, cw, fs, color, fmt_method)] - account_based = False has_wallet = True has_amt2 = False dates_set = False @@ -639,6 +638,41 @@ class TwView(MMGenObject, metaclass=AsyncInit): msg_r('\r'+''.ljust(self.term_width)+'\r'+yellow('Canceling! ')) return False + async def get_idx_from_user(self): + return await self.get_idx(f'{self.item_desc} number', self.disp_data) + + async def get_idx(self, desc, data, *, is_addr_idx=False): + + async def do_error_msg(): + msg_r( + 'Choice must be a single number between {n} and {m} inclusive{s}'.format( + n = list(data.keys())[0] if is_addr_idx else 1, + m = list(data.keys())[-1] if is_addr_idx else len(data), + s = ' ' if self.scroll else '')) + if self.scroll: + await asyncio.sleep(1.5) + msg_r(CUR_UP(1) + '\r' + ERASE_ALL) + + from ..ui import line_input + ur = namedtuple('usr_idx_data', ['idx', 'addr_idx']) + while True: + msg_r(self.blank_prompt if self.scroll else '\n') + usr_ret = line_input( + self.cfg, + f'Enter {desc} (or ENTER to return to main menu): ') + if usr_ret == '': + if self.scroll: + msg_r(CUR_UP(1) + '\r' + ''.ljust(self.term_width)) + return None + if is_addr_idx: + if is_int(usr_ret) and int(usr_ret) in data: + return ur(MMGenIdx(data[int(usr_ret)].disp_data_idx + 1), int(usr_ret)) + else: + idx = get_obj(MMGenIdx, n=usr_ret, silent=True) + if idx and idx <= len(data): + return ur(idx, None) + await do_error_msg() + class action: @enable_echo @@ -702,47 +736,6 @@ class TwView(MMGenObject, metaclass=AsyncInit): if not parent.disp_data: return - async def do_error_msg(data, is_addr_idx): - msg_r( - 'Choice must be a single number between {n} and {m} inclusive{s}'.format( - n = list(data.keys())[0] if is_addr_idx else 1, - m = list(data.keys())[-1] if is_addr_idx else len(data), - s = ' ' if parent.scroll else '')) - if parent.scroll: - await asyncio.sleep(1.5) - msg_r(CUR_UP(1) + '\r' + ERASE_ALL) - - async def get_idx(desc, data, *, is_addr_idx=False): - from ..ui import line_input - ur = namedtuple('usr_idx_data', ['idx', 'addr_idx']) - while True: - msg_r(parent.blank_prompt if parent.scroll else '\n') - usr_ret = line_input( - parent.cfg, - f'Enter {desc} (or ENTER to return to main menu): ') - if usr_ret == '': - if parent.scroll: - msg_r(CUR_UP(1) + '\r' + ''.ljust(parent.term_width)) - return None - if is_addr_idx: - if is_int(usr_ret) and int(usr_ret) in data: - return ur(MMGenIdx(data[int(usr_ret)].disp_data_idx + 1), int(usr_ret)) - else: - idx = get_obj(MMGenIdx, n=usr_ret, silent=True) - if idx and idx <= len(data): - return ur(idx, None) - await do_error_msg(data, is_addr_idx) - - async def get_idx_from_user(): - if parent.account_based: - if res := await get_idx(f'{parent.item_desc} number', parent.accts_data): - return await get_idx( - 'address index', - list(parent.accts_data.values())[res.idx - 1].data, - is_addr_idx = True) - else: - return await get_idx(f'{parent.item_desc} number', parent.disp_data) - while True: # action_method return values: # True: action successfully performed @@ -750,7 +743,7 @@ class TwView(MMGenObject, metaclass=AsyncInit): # None: action aborted by user or no action performed # 'redo': user will be re-prompted for item number # 'redraw': action successfully performed, screen will be redrawn - if usr_ret := await get_idx_from_user(): + if usr_ret := await parent.get_idx_from_user(): ret = await action_method(parent, usr_ret.idx, usr_ret.addr_idx) else: ret = None