def __init__(self, form_context, parent=None): super().__init__(parent) self._form_context = form_context self.setObjectName("FundsSelector") balance = form_context.wallet_api.get_balance() sv_text, fiat_text = form_context.wallet_api.get_amount_and_units(balance) if fiat_text: column_count = 3 else: column_count = 2 model = QStandardItemModel(1, 3, self) model.setItem(0, 0, QStandardItem(_("All available funds"))) sv_item = QStandardItem(sv_text) sv_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) model.setItem(0, 1, sv_item) if fiat_text: fiat_item = QStandardItem(fiat_text) fiat_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) model.setItem(0, 2, fiat_item) tableView = QTableView(self) tableView.setObjectName("FundsSelectionPopup") tableView.setWordWrap(False) tableView.setModel(model) tableView.verticalHeader().setVisible(False) tableView.horizontalHeader().setVisible(False) tableView.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) tableView.setSelectionBehavior(QAbstractItemView.SelectRows) tableView.setAutoScroll(False) tableView.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) # Show more compact rows, this will actually be larger forced out by the contents to be # just the necessary size. tableView.setRowHeight(0, 20) combo = QComboBox() combo.setObjectName("FundsSelectorCombo") combo.setModel(model) combo.setView(tableView) combo.setMinimumWidth(300) # Detect when the combobox popup view is shown by rebinding and wrapping the method. def _new_showPopup(_self: QTableView) -> None: nonlocal old_showPopup, tableView old_showPopup() tableView.resizeColumnsToContents() old_showPopup = combo.showPopup setattr(combo, "showPopup", _new_showPopup.__get__(combo, combo.__class__)) hlayout1 = QHBoxLayout() hlayout1.setSpacing(0) hlayout1.setContentsMargins(0, 0, 0, 2) hlayout1.addWidget(combo, 1) hlayout2 = QHBoxLayout() hlayout2.setSpacing(0) hlayout2.setContentsMargins(0, 2, 0, 0) balance_icon_label = QLabel("") balance_icon_label.setPixmap(QPixmap(icon_path("sb_balance.png"))) balance_icon_label.setToolTip(_("The balance of the selected account.")) hlayout2.addWidget(balance_icon_label) hlayout2.addSpacing(4) sv_balance = QLineEdit(sv_text) sv_balance.balance_currency = form_context.wallet_api.get_base_unit() sv_balance.balance_amount = form_context.wallet_api.get_base_amount(balance) sv_balance.setAlignment(Qt.AlignHCenter) sv_balance.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) sv_balance.setReadOnly(True) hlayout2.addWidget(sv_balance) if fiat_text: hlayout2.addSpacing(2) balance_equals_label = QLabel("") balance_equals_label.setPixmap(QPixmap(icon_path("sb_approximate"))) hlayout2.addWidget(balance_equals_label) hlayout2.addSpacing(2) fiat_balance = QLineEdit(fiat_text) fiat_balance.balance_currency = form_context.wallet_api.get_fiat_unit() fiat_balance.balance_amount = form_context.wallet_api.get_fiat_amount(balance) fiat_balance.setAlignment(Qt.AlignHCenter) fiat_balance.setReadOnly(True) hlayout2.addWidget(fiat_balance) else: fiat_balance = None vlayout = QVBoxLayout() vlayout.setSpacing(0) vlayout.setContentsMargins(0, 0, 0, 0) vlayout.addLayout(hlayout1) vlayout.addLayout(hlayout2) self.setLayout(vlayout) self._sv_balance = sv_balance self._fiat_balance = fiat_balance sv_balance.installEventFilter(self) fiat_balance.installEventFilter(self)