class AddressNavigator(lv.obj): def __init__(self, account, # account is the HDKey *args, # unknown args we will pass to the parent script_fn=script.p2wpkh, # how to calculate scriptpubkey network=NETWORKS["main"], # what network to use to get an address **kwargs # unknown kwargs we will pass to the parent ): super().__init__(*args, **kwargs) self.account = account self.script_fn = script_fn self.network = network self._index = 0 # create title self.title = lv.label(self) self.title.set_align(lv.label.ALIGN.CENTER) self.title.align(self, lv.ALIGN.IN_TOP_MID, 0, 50) # create qr code self.qr = QRCode(self) self.qr.set_size(400) self.qr.align(self.title,lv.ALIGN.OUT_BOTTOM_MID, 0, 20) self.lbl = lv.label(self) # create buttons self.next_btn = lv.btn(self) lbl = lv.label(self.next_btn) lbl.set_text("Next") self.next_btn.set_width(150) self.next_btn.set_event_cb(self.next_address) self.prev_btn = lv.btn(self) self.prev_btn.set_width(150) lbl = lv.label(self.prev_btn) lbl.set_text("Previous") self.prev_btn.set_event_cb(self.prev_address) # finally show first address self.show_address(self._index) def show_address(self, idx:int, change=False): self.title.set_text("Address #%d" % (idx+1)) self.title.align(self, lv.ALIGN.IN_TOP_MID, 0, 50) child = self.account.derive([int(change), idx]) addr = self.script_fn(child).address(network=self.network) self.qr.set_text("bitcoin:"+addr) self.lbl.set_text(addr) self.lbl.set_align(lv.label.ALIGN.CENTER) self.lbl.align(self.qr, lv.ALIGN.OUT_BOTTOM_MID, 0, 20) # disable the previous button if child index is 0 self.prev_btn.set_state(lv.btn.STATE.INA if idx == 0 else lv.btn.STATE.REL) self.next_btn.align(self.qr, lv.ALIGN.OUT_BOTTOM_MID, 90, 70) self.prev_btn.align(self.qr, lv.ALIGN.OUT_BOTTOM_MID, -90, 70) def next_address(self, obj, event): if event == lv.EVENT.RELEASED: self._index += 1 self.show_address(self._index) def prev_address(self, obj, event): if event == lv.EVENT.RELEASED and self._index > 0: self._index -= 1 self.show_address(self._index)
class AddressNavigator(lv.obj): def __init__(self, account, *args, script_fn=script.p2wpkh, network=NETWORKS["main"], **kwargs): super().__init__(*args, **kwargs) self.account = account self.script_fn = script_fn self.network = network self._index = 0 # create title self.title = lv.label(self) self.title.set_align(lv.label.ALIGN.CENTER) self.title.align(self, lv.ALIGN.IN_TOP_MID, 0, 50) # create qr code self.qr = QRCode(self) self.qr.set_size(400) self.qr.align(self.title,lv.ALIGN.OUT_BOTTOM_MID, 0, 20) self.lbl = lv.label(self) # create buttons self.next_btn = lv.btn(self) lbl = lv.label(self.next_btn) lbl.set_text("Next") self.next_btn.set_width(150) self.next_btn.set_event_cb(self.next_address) self.prev_btn = lv.btn(self) self.prev_btn.set_width(150) lbl = lv.label(self.prev_btn) lbl.set_text("Previous") self.prev_btn.set_event_cb(self.prev_address) # finally show first address self.show_address(self._index) def show_address(self, idx:int, change=False): self.title.set_text("Address #%d" % (idx+1)) self.title.align(self, lv.ALIGN.IN_TOP_MID, 0, 50) pub = self.account.derive([int(change), idx]).key addr = self.script_fn(pub).address(network=self.network) self.qr.set_text("bitcoin:"+addr) self.lbl.set_text(addr) self.lbl.set_align(lv.label.ALIGN.CENTER) self.lbl.align(self.qr, lv.ALIGN.OUT_BOTTOM_MID, 0, 20) self.prev_btn.set_state(lv.btn.STATE.INA if idx == 0 else lv.btn.STATE.REL) self.next_btn.align(self.qr, lv.ALIGN.OUT_BOTTOM_MID, 90, 70) self.prev_btn.align(self.qr, lv.ALIGN.OUT_BOTTOM_MID, -90, 70) def next_address(self, obj, event): if event == lv.EVENT.RELEASED: self._index += 1 self.show_address(self._index) def prev_address(self, obj, event): if event == lv.EVENT.RELEASED and self._index > 0: self._index -= 1 self.show_address(self._index)
class QRScreen(PopupScreen): def __init__(self, title="Title", message="Text", qrmessage="Text"): super().__init__() # create title self.title = lv.label(self) self.title.set_text(title) self.title.set_align(lv.label.ALIGN.CENTER) self.title.align(self, lv.ALIGN.IN_TOP_MID, 0, 50) # create qr code self.qr = QRCode(self) self.qr.set_text(qrmessage) self.qr.set_size(400) self.qr.align(self.title, lv.ALIGN.OUT_BOTTOM_MID, 0, 20) self.lbl = lv.label(self) # make sure it is within the screen self.lbl.set_long_mode(lv.label.LONG.BREAK) self.lbl.set_width(400) self.lbl.set_text(message) self.lbl.set_align(lv.label.ALIGN.CENTER) self.lbl.align(self.qr, lv.ALIGN.OUT_BOTTOM_MID, 0, 20)
class AddressView(): def __init__(self, address, path): self.address = address self.path = path self.show_address() def show_address(self): self.screen = lv.obj() self.qr = QRCode(self.screen) self.qr.set_size(400) self.qr.align(self.screen, lv.ALIGN.CENTER, 0, -100) self.qr.set_text(self.address) self.address_label = lv.label(self.screen) address_text = format_address(self.address) self.address_label.set_text(address_text) self.address_label.align(self.screen, lv.ALIGN.CENTER, 0, 150) self.path_label = lv.label(self.screen) self.path_label.set_text("BIP32: " + self.path) self.path_label.align(self.screen, lv.ALIGN.CENTER, 0, 250) lv.scr_load(self.screen)