This code is identical to before, but for some reason the positioning
of this affects whether Next is the default action or not!
And it didn't have that effect with the old install wizard. Odd.
Benefits of this rewrite include:
- support of disconnecting / reconnecting a device without having
to close the wallet, even in a different USB socket
- support of multiple keepkey / trezor devices, both during wallet
creation and general use
- wallet is watching-only dynamically according to whether the
associated device is currently plugged in or not
Break out the workflow logic of the install wizard
into a base class. This means reimplementing with
full support in a new GUI is now easy; you just provide
ways to request passwords, show messages etc. The API
is fully documented in the base class.
There are a couple of minor outstanding issues, including that
the old messages shown when recovering a wallet are missing.
I will come back to that. Ledger wallet might be broken.
Other improvements:
The install wizard code is now easy to follow and understand.
Hardware wallets can now be restored without any need for their
accompanying libraries.
Various bits of trustedcoin were broken and have been fixed.
Many plugin hooks can be removed. I have only started on this.
As per BIP44, 20 addresses are checked for transactions, not just the
first one.
Show the last account only if used or named.
If all accounts are used, prompt for password to create new one.
Fixes#1128
Fixes#1585
Warn user if watching-only.
Introduce new helper class WindowModalDialog and use it in a couple
of places. This is better than process-modal dialogs for our
multi-window daemon setup.
This should speed up synchronization / restoration of large wallets.
Wallets are written only when they switch to up_to_date state, or
when stop_threads() is called when closing the daemon, or when
a command line command finishes.
Unfortunately we have no way to directly destroy or remove the
lambdas embedded in the QShortcut objects, so this is the
only solution to avoid leaking references. As the QShortcut
objects have the window as parent, they are destroyed with the
window so dangling refs to the destroyed window can't happen.
This and 91349d109efix#1549.
Other wallets, such as Mycelium, do not allow the user to simply copy
and paste the seed. This is very useful to assure users follow
directions on the next screen, because previously it was easily possible
to just copy the seed and paste it on the next screen. The user's wallet
would work well for a while like this, but without having the seed
written down it's more of a ticking time bomb than a wallet.
I recommend pulling this patch as I have read many cases where users do
not write the seed down, and I believe that the main cause is lack of
friction forcing them to do so.
This patch was inspired by reading this Reddit conversation:
https://www.reddit.com/r/Bitcoin/comments/3p4bq1/electrum_v25/cw380kg
But I'm not a participant in that convo.
It's long been a pet peeve of mine that whilst editing a label,
something would cause Electrum to refresh the widget, such as
an incoming tx or a new block, and you'd lose your edits.
This changes MyTreeWidget so that, if editing, updates are
deferred until editing finishes.
Gets rid of need for EditableItem class.
New callback on_permit_edit to permit widgets to refuse editing.
Restores popup menu on activating a non-editable column behaviour.
Have AmountEdit return an int if is_int, otherwise a Decimal
Set the tray tooltip unconditionally.
More verbose logging for exchage_rate plugin.
Get rate_float from Coindesk as rate can have commas.
Plugin tracks windows itself, and doesn't create its own
members in the window objects.
Clean up the edit handling.
- better historical rate handling, including caching
- grabbing and scanning wallet transactions no longer needed
- fix autosize of fiat column
- more efficient
Only closing via the menu did it properly. Closing a window via
the window manager didn't shut the window down at all, because
the code wasn't in the closeEvent handler.
QT doesn't permit dynamic menus for QSystemTrayIcon for some reason
so we need to rebuild it each time the window set changes.
Add a close and hide/show submenu for each wallet.
Double click hides / shows all the wallets.
You can select multiple contacts, and still do all the actions
you could do on a single contact. In particular, paying to them
all and removing them all.
This covers the first two bullet points of #1372.
Finally, make the new contact dialog box have a sensible width
that can display a full address without scrolling
This fixes some bugs in contact editing:
- a changed address is now checked for validity. Shows
error if invalid and restores prior value
- the changes are saved, before they were dropped
- adding a new contact switches to the contacts tab,
it used to switch to the address tab
As an enhancement, the contact name, as well as its address,
can be edited and updated.
Finally, the platform edit key can also be used to edit,
in adition to double-clicking. This is typically the F2 key.
Password requests from the tx dialog box are now centred on the
tx dialog. Similarly for error messages if misentering the password.
Also, "Signing transaction..." and "Broadcasting transaction..." are
centred on the appropriate tx dialog.
Finally restore the old "Sign" button enabling / disabling, as we
can now tell if the user cancelled the password request.
Doesn't require any particular argument order of the wrapped
function.
Caller can tell if the user cancelled the request or not.
Optionally handles parent window hints.
QPushButton.clicked passes a "checked" argument to the action
callback. We don't use or care for it, use a wrapper to drop it
and provide a uniform function signature for menu actions and button
actions.
Password requests from the tx dialog box are now centred on the
tx dialog. Similarly for error messages if misentering the password.
Also, "Signing transaction..." and "Broadcasting transaction..." are
centred on the appropriate tx dialog.
Finally restore the old "Sign" button enabling / disabling, as we
can now tell if the user cancelled the password request.
Doesn't require any particular argument order of the wrapped
function.
Caller can tell if the user cancelled the request or not.
Optionally handles parent window hints.
The transaction dialogs have a habit of randomly disappearing,
because of garbage collection. This was particularly common
if you viewed the details of a tx in your history immediately
after electrum startup, or after pressing Broadcast.
Other tweaks:
- Distinguish saved and broadcast.
- When signed, consider unsaved and prompt to save if not
subsequently saved or broadcast.
- Hide broadcast button after broadcast.
- Hook into the closeEvent so closing the window with the mouse
has the same effect as pressing the close button.
It has long been a minor annoyance that this isn't the
default behaviour. Semantics are as follows:
- Fees are calculated automatically, as usual, and shown
in black
- If the user inputs a fee, it is retained, and shown in
blue to indicate it is user-overridden
- The user can switch back to automatic fee calculation mode
in two ways: press Clear, or blank out the fee field
- User fees are also cleared by do_clear(), for instance when
the payment is sent
I have checked all usage combinations I could think of, including
the ! case, and all work in a sensible and natural fashion.
This also fixes issue #995.
- Show Close if no action to perform, otherwise Cancel
- Add some strings for translation
- Make input hash/index constant width; previously a
3-digit index bumped the address a whole tabstop over
compared to the 1-digit indices
Show-before-send currently asks for the password
and creates a signed tx before showing anything.
This is a little unnerving as you can't see what
you're being asked to sign.
This patch does a few things:
- Adds a description label to the TX dialog
- You see the tx before being asked for password;
that is only requested on pressing Sign
- in show-before-broadcast mode, the Send button
text is instead "Show...". Hook up this button
text change to the prefs dialog too.
- Remove many redundant imports. In particular
PyQ4 is checked in main_window.py so no need
in tx_dialog too.
Note I had to remove disabling of the Sign button,
because if the user presses "cancel" nothing will
re-enable it.
This is working towards showing transactions before asking for passwords.
I think it also means the transaction dialog now interacts properly with
plugins, whereas it didn't before.
send_tx now takes a callback instead of a label, and does not decide
on whether to broadast itself; that is left to its caller.
broadcast_transaction() takes care of adding the description of the
successfully broadcast transaction to the wallet. Previously labels
could be added to the wallet even if the broadcast was cancelled by
the user or unsuccessful, which doesn't seem right.
Lengthen the dialog messages a little, as some window managers lose the
"Please Wait" title bar owing to window decorations if the message
is too short.
Two callers of get_spendable_coins were removing frozen addrs
before calling. Put that functionality in the function.
We shouldn't be able to send_from a frozen address. This was
possible in the current release because logic assumed a two-element
tuple was returned when it is now three-element. Fix that too.
Command line options listunspent and createrawtransaction currently
ignore frozen addresses. I'm not sure that's right but I've preserved
that behaviour.
With this patch only the wallet class refers to self.frozen_addresses;
other clients use is_frozen() now.