electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

qrtextedit.py (3034B)


      1 from PyQt5.QtWidgets import QFileDialog
      2 
      3 from electrum.i18n import _
      4 from electrum.plugin import run_hook
      5 from electrum.simple_config import SimpleConfig
      6 from electrum.util import UserFacingException
      7 
      8 from .util import ButtonsTextEdit, MessageBoxMixin, ColorScheme, getOpenFileName
      9 
     10 
     11 class ShowQRTextEdit(ButtonsTextEdit):
     12 
     13     def __init__(self, text=None, *, config: SimpleConfig):
     14         ButtonsTextEdit.__init__(self, text)
     15         self.config = config
     16         self.setReadOnly(True)
     17         icon = "qrcode_white.png" if ColorScheme.dark_scheme else "qrcode.png"
     18         self.addButton(icon, self.qr_show, _("Show as QR code"))
     19 
     20         run_hook('show_text_edit', self)
     21 
     22     def qr_show(self):
     23         from .qrcodewidget import QRDialog
     24         try:
     25             s = str(self.toPlainText())
     26         except:
     27             s = self.toPlainText()
     28         QRDialog(
     29             data=s,
     30             parent=self,
     31             config=self.config,
     32         ).exec_()
     33 
     34     def contextMenuEvent(self, e):
     35         m = self.createStandardContextMenu()
     36         m.addAction(_("Show as QR code"), self.qr_show)
     37         m.exec_(e.globalPos())
     38 
     39 
     40 class ScanQRTextEdit(ButtonsTextEdit, MessageBoxMixin):
     41 
     42     def __init__(self, text="", allow_multi=False, *, config: SimpleConfig):
     43         ButtonsTextEdit.__init__(self, text)
     44         self.allow_multi = allow_multi
     45         self.config = config
     46         self.setReadOnly(False)
     47         self.addButton("file.png", self.file_input, _("Read file"))
     48         icon = "camera_white.png" if ColorScheme.dark_scheme else "camera_dark.png"
     49         self.addButton(icon, self.qr_input, _("Read QR code"))
     50         run_hook('scan_text_edit', self)
     51 
     52     def file_input(self):
     53         fileName = getOpenFileName(
     54             parent=self,
     55             title='select file',
     56             config=self.config,
     57         )
     58         if not fileName:
     59             return
     60         try:
     61             try:
     62                 with open(fileName, "r") as f:
     63                     data = f.read()
     64             except UnicodeError as e:
     65                 with open(fileName, "rb") as f:
     66                     data = f.read()
     67                 data = data.hex()
     68         except BaseException as e:
     69             self.show_error(_('Error opening file') + ':\n' + repr(e))
     70         else:
     71             self.setText(data)
     72 
     73     def qr_input(self):
     74         from electrum import qrscanner
     75         data = ''
     76         try:
     77             data = qrscanner.scan_barcode(self.config.get_video_device())
     78         except UserFacingException as e:
     79             self.show_error(e)
     80         except BaseException as e:
     81             self.logger.exception('camera error')
     82             self.show_error(repr(e))
     83         if not data:
     84             data = ''
     85         if self.allow_multi:
     86             new_text = self.text() + data + '\n'
     87         else:
     88             new_text = data
     89         self.setText(new_text)
     90         return data
     91 
     92     def contextMenuEvent(self, e):
     93         m = self.createStandardContextMenu()
     94         m.addAction(_("Read QR code"), self.qr_input)
     95         m.exec_(e.globalPos())