Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVsevolod Kukol <sevoku@microsoft.com>2020-01-23 03:16:31 +0300
committerGitHub <noreply@github.com>2020-01-23 03:16:31 +0300
commit1224d3b4cbb5bd0b6ece9708fc5f55b8950361e2 (patch)
tree978a8c255388c36b4ce205d39a4fae71ef7dedc4
parent0c73d866e7c74d5c1286feabe2e7dc8a98ab81a6 (diff)
parent6ef010ad35a7437b1dd986fd4732aabb2259067d (diff)
Merge pull request #9578 from mono/backport-pr-9576-to-release-8.4
[release-8.4] Fix information popover flickering
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/InformationPopoverWidget.cs52
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Wizard/WizardDialogController.cs10
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;