electrum

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

commit e1dcdde272530193040f8cf52697d2f75d0028a1
parent a32af44ff9657276999f3785bced0a44f9e05584
Author: SomberNight <somber.night@protonmail.com>
Date:   Fri, 28 Feb 2020 21:59:09 +0100

Qt tx dialog: fix file extension when exporting (on MacOS...)

closes #5954

We are now giving every(?) hint possible to the MacOS file dialog...
The extension is put in the filename as before (which turned out not to be enough).
It is also set using QFileDialog.setDefaultSuffix, which again, turns out not to be enough.
In desperation, the file extension filter-list now contains *.psbt and *.txn as separate filters,
and the one with the expected extension is pre-selected. This seems enough...

Diffstat:
Melectrum/gui/qt/main_window.py | 32+++++++++++++++++++++++---------
Melectrum/gui/qt/transaction_dialog.py | 17+++++++++++++----
Melectrum/gui/qt/util.py | 7++++++-
3 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py @@ -45,7 +45,7 @@ from PyQt5.QtWidgets import (QMessageBox, QComboBox, QSystemTrayIcon, QTabWidget QVBoxLayout, QGridLayout, QLineEdit, QHBoxLayout, QPushButton, QScrollArea, QTextEdit, QShortcut, QMainWindow, QCompleter, QInputDialog, - QWidget, QSizePolicy, QStatusBar, QToolTip) + QWidget, QSizePolicy, QStatusBar, QToolTip, QDialog) import electrum from electrum import (keystore, ecc, constants, util, bitcoin, commands, @@ -89,7 +89,7 @@ from .util import (read_QIcon, ColorScheme, text_dialog, icon_path, WaitingDialo CloseButton, HelpButton, MessageBoxMixin, EnterButton, import_meta_gui, export_meta_gui, filename_field, address_field, char_width_in_lineedit, webopen, - TRANSACTION_FILE_EXTENSION_FILTER, MONOSPACE_FONT) + TRANSACTION_FILE_EXTENSION_FILTER_ANY, MONOSPACE_FONT) from .util import ButtonsTextEdit from .installwizard import WIF_HELP_TEXT from .history_list import HistoryList, HistoryModel @@ -780,13 +780,27 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): self.config.set_key('io_dir', os.path.dirname(fileName), True) return fileName - def getSaveFileName(self, title, filename, filter = ""): + def getSaveFileName(self, title, filename, filter="", + *, default_extension: str = None, + default_filter: str = None) -> Optional[str]: directory = self.config.get('io_dir', os.path.expanduser('~')) - path = os.path.join( directory, filename ) - fileName, __ = QFileDialog.getSaveFileName(self, title, path, filter) - if fileName and directory != os.path.dirname(fileName): - self.config.set_key('io_dir', os.path.dirname(fileName), True) - return fileName + path = os.path.join(directory, filename) + + file_dialog = QFileDialog(self, title, path, filter) + file_dialog.setAcceptMode(QFileDialog.AcceptSave) + if default_extension: + # note: on MacOS, the selected filter's first extension seems to have priority over this... + file_dialog.setDefaultSuffix(default_extension) + if default_filter: + assert default_filter in filter, f"default_filter={default_filter!r} does not appear in filter={filter!r}" + file_dialog.selectNameFilter(default_filter) + if file_dialog.exec() != QDialog.Accepted: + return None + + selected_path = file_dialog.selectedFiles()[0] + if selected_path and directory != os.path.dirname(selected_path): + self.config.set_key('io_dir', os.path.dirname(selected_path), True) + return selected_path def timer_actions(self): self.request_list.refresh_status() @@ -2509,7 +2523,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): def read_tx_from_file(self) -> Optional[Transaction]: fileName = self.getOpenFileName(_("Select your transaction file"), - TRANSACTION_FILE_EXTENSION_FILTER) + TRANSACTION_FILE_EXTENSION_FILTER_ANY) if not fileName: return try: diff --git a/electrum/gui/qt/transaction_dialog.py b/electrum/gui/qt/transaction_dialog.py @@ -50,7 +50,9 @@ from electrum.logging import get_logger from .util import (MessageBoxMixin, read_QIcon, Buttons, icon_path, MONOSPACE_FONT, ColorScheme, ButtonsLineEdit, text_dialog, - char_width_in_lineedit, TRANSACTION_FILE_EXTENSION_FILTER, + char_width_in_lineedit, TRANSACTION_FILE_EXTENSION_FILTER_SEPARATE, + TRANSACTION_FILE_EXTENSION_FILTER_ONLY_COMPLETE_TX, + TRANSACTION_FILE_EXTENSION_FILTER_ONLY_PARTIAL_TX, BlockingWaitingDialog) from .fee_slider import FeeSlider @@ -323,12 +325,19 @@ class BaseTxDialog(QDialog, MessageBoxMixin): if isinstance(tx, PartialTransaction): tx.finalize_psbt() if tx.is_complete(): - name = 'signed_%s.txn' % (tx.txid()[0:8]) + name = 'signed_%s' % (tx.txid()[0:8]) + extension = 'txn' + default_filter = TRANSACTION_FILE_EXTENSION_FILTER_ONLY_COMPLETE_TX else: - name = self.wallet.basename() + time.strftime('-%Y%m%d-%H%M.psbt') + name = self.wallet.basename() + time.strftime('-%Y%m%d-%H%M') + extension = 'psbt' + default_filter = TRANSACTION_FILE_EXTENSION_FILTER_ONLY_PARTIAL_TX + name = f'{name}.{extension}' fileName = self.main_window.getSaveFileName(_("Select where to save your transaction"), name, - TRANSACTION_FILE_EXTENSION_FILTER) + TRANSACTION_FILE_EXTENSION_FILTER_SEPARATE, + default_extension=extension, + default_filter=default_filter) if not fileName: return if tx.is_complete(): # network tx hex diff --git a/electrum/gui/qt/util.py b/electrum/gui/qt/util.py @@ -51,7 +51,12 @@ pr_icons = { # filter tx files in QFileDialog: -TRANSACTION_FILE_EXTENSION_FILTER = "Transaction (*.txn *.psbt);;All files (*)" +TRANSACTION_FILE_EXTENSION_FILTER_ANY = "Transaction (*.txn *.psbt);;All files (*)" +TRANSACTION_FILE_EXTENSION_FILTER_ONLY_PARTIAL_TX = "Partial Transaction (*.psbt)" +TRANSACTION_FILE_EXTENSION_FILTER_ONLY_COMPLETE_TX = "Complete Transaction (*.txn)" +TRANSACTION_FILE_EXTENSION_FILTER_SEPARATE = (f"{TRANSACTION_FILE_EXTENSION_FILTER_ONLY_PARTIAL_TX};;" + f"{TRANSACTION_FILE_EXTENSION_FILTER_ONLY_COMPLETE_TX};;" + f"All files (*)") class EnterButton(QPushButton):