示例#1
0
    def get_card(self, req):
        address = req['address']
        timestamp = req.get('time', 0)
        amount = req.get('amount')
        expiration = req.get('exp', None)
        status = req.get('status')
        signature = req.get('sig')

        ci = self.cards.get(address)
        if ci is None:
            ci = Factory.RequestItem()
            ci.screen = self
            ci.address = address
            self.cards[address] = ci

        ci.memo = self.app.wallet.get_label(address)
        if amount:
            status = req.get('status')
            ci.status = request_text[status]
        else:
            received = self.app.wallet.get_addr_received(address)
            ci.status = self.app.format_amount_and_units(amount)
        ci.icon = pr_icon[status]
        ci.amount = self.app.format_amount_and_units(amount) if amount else _(
            'No Amount')
        ci.date = format_time(timestamp)
        return ci
示例#2
0
 def update(self):
     inv_list = self.parent.invoices.unpaid_invoices()
     self.model().clear()
     self.update_headers(self.__class__.headers)
     self.header().setSectionResizeMode(self.Columns.REQUESTOR,
                                        QHeaderView.Interactive)
     for idx, pr in enumerate(inv_list):
         key = pr.get_id()
         status = self.parent.invoices.get_status(key)
         if status is None:
             continue
         requestor = pr.get_requestor()
         exp = pr.get_expiration_date()
         date_str = format_time(exp) if exp else _('Never')
         labels = [
             date_str, requestor, pr.memo,
             self.parent.format_amount(pr.get_amount(), whitespaces=True),
             pr_tooltips.get(status, '')
         ]
         items = [QStandardItem(e) for e in labels]
         self.set_editability(items)
         items[self.Columns.STATUS].setIcon(read_QIcon(
             pr_icons.get(status)))
         items[self.Columns.DATE].setData(key, role=Qt.UserRole)
         items[self.Columns.REQUESTOR].setFont(QFont(MONOSPACE_FONT))
         items[self.Columns.AMOUNT].setFont(QFont(MONOSPACE_FONT))
         self.model().insertRow(idx, items)
     self.selectionModel().select(self.model().index(0, 0),
                                  QItemSelectionModel.SelectCurrent)
     if self.parent.isVisible():
         b = len(inv_list) > 0
         self.setVisible(b)
         self.parent.invoices_label.setVisible(b)
     self.filter()
示例#3
0
    def update(self):
        self.wallet = self.parent.wallet
        # hide receive tab if no receive requests available
        if self.parent.isVisible():
            b = len(self.wallet.receive_requests) > 0
            self.setVisible(b)
            self.parent.receive_requests_label.setVisible(b)
            if not b:
                self.parent.expires_label.hide()
                self.parent.expires_combo.show()

        # update the receive address if necessary
        current_address = self.parent.receive_address_e.text()
        domain = self.wallet.get_receiving_addresses()
        try:
            addr = self.wallet.get_unused_address()
        except InternalAddressCorruption as e:
            self.parent.show_error(str(e))
            addr = ''
        if current_address not in domain and addr:
            self.parent.set_receive_address(addr)
        self.parent.new_request_button.setEnabled(addr != current_address)
        self.parent.update_receive_address_styling()

        self.model().clear()
        self.update_headers(self.__class__.headers)
        self.hideColumn(self.Columns.ADDRESS)
        for req in self.wallet.get_sorted_requests(self.config):
            address = req['address']
            if address not in domain:
                continue
            timestamp = req.get('time', 0)
            amount = req.get('amount')
            expiration = req.get('exp', None)
            message = req['memo']
            date = format_time(timestamp)
            status = req.get('status')
            signature = req.get('sig')
            requestor = req.get('name', '')
            amount_str = self.parent.format_amount(amount) if amount else ""
            labels = [
                date, address, '', message, amount_str,
                pr_tooltips.get(status, '')
            ]
            items = [QStandardItem(e) for e in labels]
            self.set_editability(items)
            if signature is not None:
                items[self.Columns.SIGNATURE].setIcon(read_QIcon("seal.png"))
                items[self.Columns.SIGNATURE].setToolTip(
                    f'signed by {requestor}')
            if status is not PR_UNKNOWN:
                items[self.Columns.STATUS].setIcon(
                    read_QIcon(pr_icons.get(status)))
            items[self.Columns.DESCRIPTION].setData(address, Qt.UserRole)
            self.model().insertRow(self.model().rowCount(), items)
        self.filter()
示例#4
0
 def update(self):
     # not calling maybe_defer_update() as it interferes with conditional-visibility
     self.parent.update_receive_address_styling()
     self.proxy.setDynamicSortFilter(
         False)  # temp. disable re-sorting after every change
     self.std_model.clear()
     self.update_headers(self.__class__.headers)
     for req in self.wallet.get_sorted_requests():
         assert isinstance(req, OnchainInvoice)
         key = req.id
         status = self.parent.wallet.get_request_status(key)
         status_str = req.get_status_str(status)
         request_type = req.type
         timestamp = req.time
         amount = req.get_amount_sat()
         message = req.message
         date = format_time(timestamp)
         amount_str = self.parent.format_amount(amount) if amount else ""
         labels = [date, message, amount_str, status_str]
         assert isinstance(req, OnchainInvoice)
         key = req.get_address()
         icon = read_QIcon("dashcoin.png")
         tooltip = 'onchain request'
         items = [QStandardItem(e) for e in labels]
         self.set_editability(items)
         items[self.Columns.DATE].setData(request_type, ROLE_REQUEST_TYPE)
         items[self.Columns.DATE].setData(key, ROLE_KEY)
         items[self.Columns.DATE].setData(timestamp, ROLE_SORT_ORDER)
         items[self.Columns.DATE].setIcon(icon)
         items[self.Columns.STATUS].setIcon(read_QIcon(
             pr_icons.get(status)))
         items[self.Columns.DATE].setToolTip(tooltip)
         self.std_model.insertRow(self.std_model.rowCount(), items)
     self.filter()
     self.proxy.setDynamicSortFilter(True)
     # sort requests by date
     self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder)
     # hide list if empty
     if self.parent.isVisible():
         b = self.std_model.rowCount() > 0
         self.setVisible(b)
         self.parent.receive_requests_label.setVisible(b)
         if not b:
             # list got hidden, so selected item should also be cleared:
             self.item_changed(None)
示例#5
0
 def update(self):
     # not calling maybe_defer_update() as it interferes with conditional-visibility
     self.proxy.setDynamicSortFilter(
         False)  # temp. disable re-sorting after every change
     self.std_model.clear()
     self.update_headers(self.__class__.headers)
     for idx, item in enumerate(self.parent.wallet.get_unpaid_invoices()):
         key = self.parent.wallet.get_key_for_outgoing_invoice(item)
         invoice_ext = self.parent.wallet.get_invoice_ext(key)
         icon_name = 'dashcoin.png'
         if item.bip70:
             icon_name = 'seal.png'
         status = self.parent.wallet.get_invoice_status(item)
         status_str = item.get_status_str(status)
         message = item.message
         amount = item.get_amount_sat()
         timestamp = item.time or 0
         ps_str = _('PrivateSend') if invoice_ext.is_ps else _('Regular')
         tx_type = invoice_ext.tx_type
         type_str = SPEC_TX_NAMES[tx_type]
         date_str = format_time(timestamp) if timestamp else _('Unknown')
         amount_str = self.parent.format_amount(amount, whitespaces=True)
         labels = [
             date_str, type_str, message, amount_str, ps_str, status_str
         ]
         items = [QStandardItem(e) for e in labels]
         self.set_editability(items)
         items[self.Columns.DATE].setIcon(read_QIcon(icon_name))
         items[self.Columns.STATUS].setIcon(read_QIcon(
             pr_icons.get(status)))
         items[self.Columns.DATE].setData(key, role=ROLE_REQUEST_ID)
         items[self.Columns.DATE].setData(item.type, role=ROLE_REQUEST_TYPE)
         items[self.Columns.DATE].setData(timestamp, role=ROLE_SORT_ORDER)
         items[self.Columns.TX_TYPE].setData(type_str, role=ROLE_SORT_ORDER)
         items[self.Columns.IS_PS].setData(ps_str, role=ROLE_SORT_ORDER)
         self.std_model.insertRow(idx, items)
     self.filter()
     self.proxy.setDynamicSortFilter(True)
     # sort requests by date
     self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder)
     # hide list if empty
     if self.parent.isVisible():
         b = self.std_model.rowCount() > 0
         self.setVisible(b)
         self.parent.invoices_label.setVisible(b)
示例#6
0
 def on_update(self):
     inv_list = self.parent.invoices.unpaid_invoices()
     self.clear()
     for pr in inv_list:
         key = pr.get_id()
         status = self.parent.invoices.get_status(key)
         requestor = pr.get_requestor()
         exp = pr.get_expiration_date()
         date_str = format_time(exp) if exp else _('Never')
         item = QTreeWidgetItem([date_str, requestor, pr.memo, self.parent.format_amount(pr.get_amount(), whitespaces=True), pr_tooltips.get(status,'')])
         item.setIcon(4, self.icon_cache.get(pr_icons.get(status)))
         item.setData(0, Qt.UserRole, key)
         item.setFont(1, QFont(MONOSPACE_FONT))
         item.setFont(3, QFont(MONOSPACE_FONT))
         self.addTopLevelItem(item)
     self.setCurrentItem(self.topLevelItem(0))
     self.setVisible(len(inv_list))
     self.parent.invoices_label.setVisible(len(inv_list))
示例#7
0
 def on_update(self):
     inv_list = self.parent.invoices.unpaid_invoices()
     self.clear()
     for pr in inv_list:
         key = pr.get_id()
         status = self.parent.invoices.get_status(key)
         requestor = pr.get_requestor()
         exp = pr.get_expiration_date()
         date_str = format_time(exp) if exp else _('Never')
         item = QTreeWidgetItem([date_str, requestor, pr.memo, self.parent.format_amount(pr.get_amount(), whitespaces=True), pr_tooltips.get(status,'')])
         item.setIcon(4, QIcon(pr_icons.get(status)))
         item.setData(0, Qt.UserRole, key)
         item.setFont(1, QFont(MONOSPACE_FONT))
         item.setFont(3, QFont(MONOSPACE_FONT))
         self.addTopLevelItem(item)
     self.setCurrentItem(self.topLevelItem(0))
     self.setVisible(len(inv_list))
     self.parent.invoices_label.setVisible(len(inv_list))
示例#8
0
    def on_update(self):
        self.wallet = self.parent.wallet
        # hide receive tab if no receive requests available
        b = len(self.wallet.receive_requests) > 0
        self.setVisible(b)
        self.parent.receive_requests_label.setVisible(b)
        if not b:
            self.parent.expires_label.hide()
            self.parent.expires_combo.show()

        # update the receive address if necessary
        current_address = self.parent.receive_address_e.text()
        domain = self.wallet.get_receiving_addresses()
        addr = self.wallet.get_unused_address()
        if not current_address in domain and addr:
            self.parent.set_receive_address(addr)
        self.parent.new_request_button.setEnabled(addr != current_address)

        # clear the list and fill it again
        self.clear()
        for req in self.wallet.get_sorted_requests(self.config):
            address = req['address']
            if address not in domain:
                continue
            timestamp = req.get('time', 0)
            amount = req.get('amount')
            expiration = req.get('exp', None)
            message = req.get('memo', '')
            date = format_time(timestamp)
            status = req.get('status')
            signature = req.get('sig')
            requestor = req.get('name', '')
            amount_str = self.parent.format_amount(amount) if amount else ""
            item = QTreeWidgetItem([
                date, address, '', message, amount_str,
                pr_tooltips.get(status, '')
            ])
            if signature is not None:
                item.setIcon(2, self.icon_cache.get(":icons/seal.png"))
                item.setToolTip(2, 'signed by ' + requestor)
            if status is not PR_UNKNOWN:
                item.setIcon(6, self.icon_cache.get(pr_icons.get(status)))
            self.addTopLevelItem(item)
示例#9
0
 def show_pr_details(self, req, status, is_invoice):
     from electrum_dash.util import format_time
     requestor = req.get('requestor')
     exp = req.get('exp')
     memo = req.get('memo')
     amount = req.get('amount')
     popup = Builder.load_file('gui/kivy/uix/ui_screens/invoice.kv')
     popup.is_invoice = is_invoice
     popup.amount = amount
     popup.requestor = requestor if is_invoice else req.get('address')
     popup.exp = format_time(exp) if exp else ''
     popup.description = memo if memo else ''
     popup.signature = req.get('signature', '')
     popup.status = status
     txid = req.get('txid')
     popup.tx_hash = txid or ''
     popup.on_open = lambda: popup.ids.output_list.update(
         req.get('outputs', []))
     popup.open()
示例#10
0
    def update(self, h):
        self.wallet = self.parent.wallet
        item = self.currentItem()
        current_tx = item.data(0, Qt.UserRole).toString() if item else None
        self.clear()
        for item in h:
            tx_hash, conf, value, timestamp, balance = item
            time_str = _("unknown")
            if conf is None and timestamp is None:
                continue  # skip history in offline mode
            if conf > 0:
                time_str = format_time(timestamp)
            if conf == -1:
                time_str = 'unverified'
                icon = QIcon(":icons/unconfirmed.png")
            elif conf == 0:
                time_str = 'pending'
                icon = QIcon(":icons/unconfirmed.png")
            elif conf < 6:
                icon = QIcon(":icons/clock%d.png"%conf)
            else:
                icon = QIcon(":icons/confirmed.png")
            v_str = self.parent.format_amount(value, True, whitespaces=True)
            balance_str = self.parent.format_amount(balance, whitespaces=True)
            label, is_default_label = self.wallet.get_label(tx_hash)
            item = QTreeWidgetItem( [ '', time_str, label, v_str, balance_str] )
            item.setFont(2, QFont(MONOSPACE_FONT))
            item.setFont(3, QFont(MONOSPACE_FONT))
            item.setFont(4, QFont(MONOSPACE_FONT))
            if value < 0:
                item.setForeground(3, QBrush(QColor("#BC1E1E")))
            if tx_hash:
                item.setData(0, Qt.UserRole, tx_hash)
            if is_default_label:
                item.setForeground(2, QBrush(QColor('grey')))
            item.setIcon(0, icon)
            self.insertTopLevelItem(0, item)
            if current_tx == tx_hash:
                self.setCurrentItem(item)

        run_hook('history_tab_update')
示例#11
0
    def update(self, h):
        self.wallet = self.parent.wallet
        item = self.currentItem()
        current_tx = item.data(0, Qt.UserRole).toString() if item else None
        self.clear()
        for item in h:
            tx_hash, conf, value, timestamp, balance = item
            time_str = _("unknown")
            if conf is None and timestamp is None:
                continue  # skip history in offline mode
            if conf > 0:
                time_str = format_time(timestamp)
            if conf == -1:
                time_str = 'unverified'
                icon = QIcon(":icons/unconfirmed.png")
            elif conf == 0:
                time_str = 'pending'
                icon = QIcon(":icons/unconfirmed.png")
            elif conf < 6:
                icon = QIcon(":icons/clock%d.png" % conf)
            else:
                icon = QIcon(":icons/confirmed.png")
            v_str = self.parent.format_amount(value, True, whitespaces=True)
            balance_str = self.parent.format_amount(balance, whitespaces=True)
            label, is_default_label = self.wallet.get_label(tx_hash)
            item = QTreeWidgetItem(['', time_str, label, v_str, balance_str])
            item.setFont(2, QFont(MONOSPACE_FONT))
            item.setFont(3, QFont(MONOSPACE_FONT))
            item.setFont(4, QFont(MONOSPACE_FONT))
            if value < 0:
                item.setForeground(3, QBrush(QColor("#BC1E1E")))
            if tx_hash:
                item.setData(0, Qt.UserRole, tx_hash)
            if is_default_label:
                item.setForeground(2, QBrush(QColor('grey')))
            item.setIcon(0, icon)
            self.insertTopLevelItem(0, item)
            if current_tx == tx_hash:
                self.setCurrentItem(item)

        run_hook('history_tab_update')
示例#12
0
 def show_pr_details(self, req, status, is_invoice):
     from electrum_dash.util import format_time
     requestor = req.get('requestor')
     exp = req.get('exp')
     memo = req.get('memo')
     amount = req.get('amount')
     fund = req.get('fund')
     popup = Builder.load_file('electrum_dash/gui/kivy/uix/ui_screens/invoice.kv')
     popup.is_invoice = is_invoice
     popup.amount = amount
     popup.requestor = requestor if is_invoice else req.get('address')
     popup.exp = format_time(exp) if exp else ''
     popup.description = memo if memo else ''
     popup.signature = req.get('signature', '')
     popup.status = status
     popup.fund = fund if fund else 0
     txid = req.get('txid')
     popup.tx_hash = txid or ''
     popup.on_open = lambda: popup.ids.output_list.update(req.get('outputs', []))
     popup.export = self.export_private_keys
     popup.open()
示例#13
0
    def on_update(self):
        self.wallet = self.parent.wallet
        # hide receive tab if no receive requests available
        b = len(self.wallet.receive_requests) > 0
        self.setVisible(b)
        self.parent.receive_requests_label.setVisible(b)
        if not b:
            self.parent.expires_label.hide()
            self.parent.expires_combo.show()

        # update the receive address if necessary
        current_address = self.parent.receive_address_e.text()
        domain = self.wallet.get_receiving_addresses()
        addr = self.wallet.get_unused_address()
        if not current_address in domain and addr:
            self.parent.set_receive_address(addr)
        self.parent.new_request_button.setEnabled(addr != current_address)

        # clear the list and fill it again
        self.clear()
        for req in self.wallet.get_sorted_requests(self.config):
            address = req['address']
            if address not in domain:
                continue
            timestamp = req.get('time', 0)
            amount = req.get('amount')
            expiration = req.get('exp', None)
            message = req.get('memo', '')
            date = format_time(timestamp)
            status = req.get('status')
            signature = req.get('sig')
            requestor = req.get('name', '')
            amount_str = self.parent.format_amount(amount) if amount else ""
            item = QTreeWidgetItem([date, address, '', message, amount_str, pr_tooltips.get(status,'')])
            if signature is not None:
                item.setIcon(2, self.icon_cache.get(":icons/seal.png"))
                item.setToolTip(2, 'signed by '+ requestor)
            if status is not PR_UNKNOWN:
                item.setIcon(6, self.icon_cache.get(pr_icons.get(status)))
            self.addTopLevelItem(item)
示例#14
0
 def get_card(self, pr):
     key = pr.get_id()
     ci = self.cards.get(key)
     if ci is None:
         ci = Factory.InvoiceItem()
         ci.key = key
         ci.screen = self
         self.cards[key] = ci
     ci.requestor = pr.get_requestor()
     ci.memo = pr.get_memo()
     amount = pr.get_amount()
     if amount:
         ci.amount = self.app.format_amount_and_units(amount)
         status = self.app.wallet.invoices.get_status(ci.key)
         ci.status = invoice_text[status]
         ci.icon = pr_icon[status]
     else:
         ci.amount = _('No Amount')
         ci.status = ''
     exp = pr.get_expiration_date()
     ci.date = format_time(exp) if exp else _('Never')
     return ci
示例#15
0
 def data(self, index: QModelIndex, role: Qt.ItemDataRole) -> QVariant:
     assert index.isValid()
     col = index.column()
     coin_item = index.internalPointer()
     address = coin_item['address']
     is_frozen_addr = coin_item['is_frozen_addr']
     is_frozen_coin = coin_item['is_frozen_coin']
     height = coin_item['height']
     time_str = ''
     if self.view.config.get('show_utxo_time', False):
         prevout_timestamp = coin_item['prevout_timestamp']
         time_str = (format_time(prevout_timestamp)
                     if prevout_timestamp < math.inf else _('unknown'))
     outpoint = coin_item['outpoint']
     out_short = coin_item['out_short']
     label = coin_item['label']
     balance = coin_item['balance']
     ps_rounds = coin_item['ps_rounds']
     is_ps_ks = coin_item['is_ps_ks']
     if ps_rounds is None:
         ps_rounds = 'N/A'
     else:
         ps_rounds = ps_coin_rounds_str(ps_rounds)
     if (role == self.view.ROLE_CLIPBOARD_DATA
             and col == UTXOColumns.OUTPOINT):
         return QVariant(outpoint)
     elif role == Qt.ToolTipRole:
         if col == UTXOColumns.ADDRESS and is_frozen_addr:
             return QVariant(_('Address is frozen'))
         elif col == UTXOColumns.OUTPOINT and is_frozen_coin:
             return QVariant(f'{outpoint}\n{_("Coin is frozen")}')
         elif outpoint in (self.view._spend_set or set()):
             if col == UTXOColumns.OUTPOINT:
                 return QVariant(f'{outpoint}\n{SELECTED_TO_SPEND_TOOLTIP}')
             else:
                 return QVariant(SELECTED_TO_SPEND_TOOLTIP)
         elif col == UTXOColumns.OUTPOINT:
             return QVariant(outpoint)
     elif role not in (Qt.DisplayRole, Qt.EditRole):
         if role == Qt.TextAlignmentRole:
             if col in [
                     UTXOColumns.DATE, UTXOColumns.AMOUNT,
                     UTXOColumns.HEIGHT, UTXOColumns.PS_ROUNDS,
                     UTXOColumns.KEYSTORE_TYPE
             ]:
                 return QVariant(Qt.AlignRight | Qt.AlignVCenter)
             else:
                 return QVariant(Qt.AlignVCenter)
         elif role == Qt.FontRole:
             return QVariant(QFont(MONOSPACE_FONT))
         elif role == Qt.BackgroundRole:
             if col == UTXOColumns.ADDRESS and is_frozen_addr:
                 return QVariant(ColorScheme.BLUE.as_color(True))
             elif col == UTXOColumns.OUTPOINT and is_frozen_coin:
                 return QVariant(ColorScheme.BLUE.as_color(True))
             elif outpoint in (self.view._spend_set or set()):
                 return QVariant(ColorScheme.GREEN.as_color(True))
     elif col == UTXOColumns.DATE:
         return QVariant(time_str)
     elif col == UTXOColumns.OUTPOINT:
         return QVariant(out_short)
     elif col == UTXOColumns.ADDRESS:
         return QVariant(address)
     elif col == UTXOColumns.LABEL:
         return QVariant(label)
     elif col == UTXOColumns.AMOUNT:
         return QVariant(balance)
     elif col == UTXOColumns.HEIGHT:
         return QVariant(height)
     elif col == UTXOColumns.PS_ROUNDS:
         return QVariant(ps_rounds)
     elif col == UTXOColumns.KEYSTORE_TYPE:
         return QVariant(_('PS Keystore') if is_ps_ks else _('Main'))
     else:
         return QVariant()