Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keep focus on "Hide" while ModalOverlay is visible #795

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

jadijadi
Copy link
Contributor

During the initial sync, the Tab moves the focus to the widgets of the main window, even when the ModalOverlay is visible. This creates some weird rectangular selections on the screen.

This PR fixes this by keeping the focus on the "Hide" button while the ModalOverlay is visible.

Fixes #783

@DrahtBot
Copy link
Contributor

DrahtBot commented Feb 14, 2024

The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

Reviews

See the guideline for information on the review process.

Type Reviewers
ACK pablomartin4btc
Concept ACK BrandonOdiwuor
Stale ACK hebasto

If your review is incorrectly listed, please react with 👎 to this comment and the bot will ignore it on the next update.

@jadijadi
Copy link
Contributor Author

To reproduce the issue (tested on Mac & KDE):

  • open bitcoin gui with wallet
  • Hide the sync modal
  • Go to send tab
  • Highlight the Label
  • Click on the progress bar to open the sync modal
  • press TAB and a misplaced rectangular highlight should appear

@hebasto hebasto changed the title qt: prevent weird focus rect on inital sync Prevent weird focus rect on inital sync Feb 15, 2024
@hebasto
Copy link
Member

hebasto commented Feb 15, 2024

Why does the issue happen only on certain platforms?

Copy link
Member

@hebasto hebasto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... keeping the focus on the "Hide" button while the ModalOverlay is visible.

That looks like a better commit message / PR description.

src/qt/modaloverlay.cpp Show resolved Hide resolved
src/qt/modaloverlay.cpp Show resolved Hide resolved
@jadijadi
Copy link
Contributor Author

Why does the issue happen only on certain platforms?

Not sure about other platforms. I had a mac and a KDE machine and happened on both of them. Have not checked on other platforms.

Copy link
Member

@hebasto hebasto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can actually see two distinct issues here:

  1. The "Hide" button doesn't have focus when the overlay shows for the first time. This can be resolved with ui->closeButton->setFocus(); in the ModalOverlay constructor.

  2. The other issue is a bit convoluted. As a child widget, the overlay also follows its parent's tab order when processing "Tab" or "Shift+Tab" keys. Isolating the overlay's tab order might also be a solution to the issue.

This PR indeed forces focus on the "Hide" button as long as the overlay is visible. This approach is acceptable as the "Hide" button is the only one in the overlay.

Concept and approach ACK 1b34e0d. Also tested on Ubuntu 22.04.

src/qt/modaloverlay.cpp Outdated Show resolved Hide resolved
@hebasto hebasto changed the title Prevent weird focus rect on inital sync Keep focus on "Hide" while ModalOverlay is visible Feb 17, 2024
@hebasto hebasto added this to the 27.0 milestone Feb 17, 2024
During the initial sync, the Tab moves the focus to the widgets
of the main window, even when the ModalOverlay is visible. This
creates some weird rectangular *selections on the screen*.

This PR fixes this by keeping the focus on the "Hide" button while
the ModalOverlay is visible.

Fixes bitcoin-core#783
@jadijadi
Copy link
Contributor Author

I can actually see two distinct issues here:

  1. The "Hide" button doesn't have focus when the overlay shows for the first time. This can be resolved with ui->closeButton->setFocus(); in the ModalOverlay constructor.
  2. The other issue is a bit convoluted. As a child widget, the overlay also follows its parent's tab order when processing "Tab" or "Shift+Tab" keys. Isolating the overlay's tab order might also be a solution to the issue.

This PR indeed forces focus on the "Hide" button as long as the overlay is visible. This approach is acceptable as the "Hide" button is the only one in the overlay.

Concept and approach ACK 1b34e0d. Also tested on Ubuntu 22.04.

Thanks for the ACK. Algo agree with your point on better readability of layerIsVisible. Added that to the commit & squashed.

@hebasto
Copy link
Member

hebasto commented Feb 17, 2024

cc @jarolrod @furszy @Sjors

@luke-jr
Copy link
Member

luke-jr commented Feb 20, 2024

Wouldn't it be better to hide the covered widgets instead?

@hebasto hebasto modified the milestones: 27.0, 28.0 Mar 4, 2024
@hebasto
Copy link
Member

hebasto commented Mar 4, 2024

@jadijadi

Are you still working on this? If so, do you mind addressing #795 (comment)?

@jadijadi
Copy link
Contributor Author

jadijadi commented Mar 4, 2024

@jadijadi

Are you still working on this? If so, do you mind addressing #795 (comment)?

sorry I have missed that comment. Will check it and come back to you soon.

@jadijadi
Copy link
Contributor Author

jadijadi commented Mar 5, 2024

Wouldn't it be better to hide the covered widgets instead?

Thanks for the suggestion @luke-jr . This is the path I tried first but moved to the current solution because of two issues:

  1. If I used parent()->findChildren<QWidget *>() to find the widgets "behind" this modal and call their hide(), the current modal and its closeButton will be disabled too. To prevent this we have to enable all the direct parents of the closeButton and this needs another loop or a few IMO ugly if (child != ui->closeButton....) clauses.
  2. The above method might interfere with other sourced whom are "hiding" widget in the parent gui and can make future bugs. Imagine this situation:
    a. an element is disabled on the gui for any reason
    b. user opens the modal
    c. I will disable all widgets on the parent (and enable all parents on my CloseButton to enable it)
    d. user closes the modal
    e. I enable all widgets on the main window
    As you can see in this situation the initial state is lost. I have to keep track of the status of all widgets to prevent this.

Because of these two, I chose the method I implemented but I will be more than happy to hear your comments and update the PR accordingly.

Copy link
Contributor

@BrandonOdiwuor BrandonOdiwuor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concept ACK

Copy link
Contributor

@pablomartin4btc pablomartin4btc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concept & approach ACK 992b1bb

Tested this PR on Ubuntu 22.04 with GNOME desktop, not seen any issues with it but I couldn't reproduce the original issue, perhaps it depends on the platform or it's KDE's specific (?).

I agree with the reasoning on the author's taken approach, unless there's another problem that @luke-jr still sees with it.

@jadijadi
Copy link
Contributor Author

jadijadi commented May 8, 2024

Please do not hesitate to ask me if any other update is needed on this from my side. Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Weird focus rect displayed on inital sync
6 participants