diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2020-01-23 03:16:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-23 03:16:31 +0300 |
commit | 1224d3b4cbb5bd0b6ece9708fc5f55b8950361e2 (patch) | |
tree | 978a8c255388c36b4ce205d39a4fae71ef7dedc4 /main/src/core | |
parent | 0c73d866e7c74d5c1286feabe2e7dc8a98ab81a6 (diff) | |
parent | 6ef010ad35a7437b1dd986fd4732aabb2259067d (diff) |
Merge pull request #9578 from mono/backport-pr-9576-to-release-8.4
[release-8.4] Fix information popover flickering
Diffstat (limited to 'main/src/core')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Components/InformationPopoverWidget.cs | 52 | ||||
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Wizard/WizardDialogController.cs | 10 |
2 files changed, 45 insertions, 17 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/InformationPopoverWidget.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/InformationPopoverWidget.cs index 3f033c6bf0..a1f4a5522d 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/InformationPopoverWidget.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/InformationPopoverWidget.cs @@ -24,6 +24,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; +using System.Timers; using MonoDevelop.Core; using MonoDevelop.Ide; using MonoDevelop.Ide.Tasks; @@ -158,9 +159,10 @@ namespace MonoDevelop.Components void ShowPopover () { - if (popover != null) - popover.Destroy (); - popover = TooltipPopoverWindow.Create (!WorkaroundNestedDialogFlickering ()); + if (hideTooltipTimer?.Enabled == true) + hideTooltipTimer.Stop (); + if (popover == null) + popover = TooltipPopoverWindow.Create (!WorkaroundNestedDialogFlickering ()); popover.ShowArrow = true; if (markup) popover.Markup = message; @@ -172,41 +174,65 @@ namespace MonoDevelop.Components void UpdatePopover () { - if (popover != null) + if (popover?.Visible == true) ShowPopover (); } protected override void OnLostFocus (EventArgs args) { base.OnLostFocus (args); - DestroyPopover (); + HidePopover (); } protected override void OnMouseExited (EventArgs args) { base.OnMouseExited (args); - DestroyPopover (); + HidePopover (true); } protected override void OnPreferredSizeChanged () { base.OnPreferredSizeChanged (); if (!Visible) - DestroyPopover (); + HidePopover (); } - void DestroyPopover () + Timer hideTooltipTimer; + + void HidePopover (bool delayed = false) { - if (popover != null) { - popover.Destroy (); - popover = null; + if (delayed) { + // we delay hiding using a timer to avoid tooltip flickering in case of focus stealing + // due to weird toolkit behaviour. + if (hideTooltipTimer == null) { + hideTooltipTimer = new Timer (50) { + AutoReset = false, + SynchronizingObject = this, + }; + hideTooltipTimer.Elapsed += (sender, e) => { + if (popover?.Visible == true) + popover.Hide (); + }; + } + hideTooltipTimer.Start (); + } else { + if (hideTooltipTimer?.Enabled == true) + hideTooltipTimer.Stop (); + if (popover?.Visible == true) + popover.Hide (); } } protected override void Dispose (bool disposing) { - if (disposing) - DestroyPopover (); + if (disposing) { + hideTooltipTimer?.Dispose (); + if (popover?.Visible == true) + popover.Hide (); + popover?.Dispose (); + } + hideTooltipTimer = null; + popover = null; base.Dispose (disposing); } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Wizard/WizardDialogController.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Wizard/WizardDialogController.cs index 94ee7d76f6..7981d7c6eb 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Wizard/WizardDialogController.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Wizard/WizardDialogController.cs @@ -125,14 +125,16 @@ namespace MonoDevelop.Ide.Gui.Wizard public bool RunWizard () { - var dialog = new WizardDialog (this); - return dialog.Run (Xwt.MessageDialog.RootWindow); + using (var dialog = new WizardDialog (this)) { + return dialog.Run (Xwt.MessageDialog.RootWindow); + } } public bool RunWizard (Xwt.WindowFrame parentWindow) { - var dialog = new WizardDialog (this); - return dialog.Run (parentWindow); + using (var dialog = new WizardDialog (this)) { + return dialog.Run (parentWindow); + } } public event EventHandler Completed; |