cryptoadvance / specter-diy

DIY airgapped hardware wallet that uses QR codes for communication with the host
MIT License
447 stars 75 forks source link

UIUX: Improve entering recovery phrase screen #223

Open moneymanolis opened 1 year ago

moneymanolis commented 1 year ago

Two things would massively improve the UX here:

stepansnigirev commented 1 year ago

I think jumping to the cell using touch screen makes most sense. I think it's better than having a "previous word" button. Cursor also makes sense to implement. I didn't do that because right now the cursor is always at the end.

moneymanolis commented 8 months ago

I've thought about this screen more.

We should split the UX improvements into two parts. The first part should make the "enter your phrase" UX better and the second part should improve the UI if you want / need to correct a word. Let's start with the first part. I think these relatively easy (?) changes would go a long way:

(a) Highlighting the currently used row in RecoverMnemonicScreen. This would, for example, help to understand that clicking on one of the auto-complete options is using this word and moving on to the next row / word.

(b) Separate "Next word" and "Auto-complete"-functionality into two different UI elements. It might be enough to have the "Next word" button really just move on to the next word (if the current one is a valid one) instead of it performing an auto-complete as well. So, the auto-completion would only be done when clicking on the suggested word(s).

@stepansnigirev let me know what you think.

For future reference, (b) can be achieved probably by changing:

        elif c == "Next word":
            word = self.table.get_last_word()
            if self.lookup is not None and len(word) >= 2:
                candidates = self.lookup(word, 2)
                if len(candidates) == 1:
                    self.table.autocomplete_word(candidates[0])

to

        elif c == "Next word":
            word = self.table.get_last_word()
            self.table.autocomplete_word(candidates[0])

and by changing the control of the button:

if len(candidates) == 1 or word in candidates in get_mnemonic to if len(candidates) == 1 and word in candidates