24
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
25
// THE SOFTWARE.
26
26
using System ;
27
+ using System . Timers ;
27
28
using MonoDevelop . Core ;
28
29
using MonoDevelop . Ide ;
29
30
using MonoDevelop . Ide . Tasks ;
@@ -158,9 +159,10 @@ bool WorkaroundNestedDialogFlickering ()
158
159
159
160
void ShowPopover ( )
160
161
{
161
- if ( popover != null )
162
- popover . Destroy ( ) ;
163
- popover = TooltipPopoverWindow . Create ( ! WorkaroundNestedDialogFlickering ( ) ) ;
162
+ if ( hideTooltipTimer ? . Enabled == true )
163
+ hideTooltipTimer . Stop ( ) ;
164
+ if ( popover == null )
165
+ popover = TooltipPopoverWindow . Create ( ! WorkaroundNestedDialogFlickering ( ) ) ;
164
166
popover . ShowArrow = true ;
165
167
if ( markup )
166
168
popover . Markup = message ;
@@ -172,41 +174,65 @@ void ShowPopover ()
172
174
173
175
void UpdatePopover ( )
174
176
{
175
- if ( popover != null )
177
+ if ( popover ? . Visible == true )
176
178
ShowPopover ( ) ;
177
179
}
178
180
179
181
protected override void OnLostFocus ( EventArgs args )
180
182
{
181
183
base . OnLostFocus ( args ) ;
182
- DestroyPopover ( ) ;
184
+ HidePopover ( ) ;
183
185
}
184
186
185
187
protected override void OnMouseExited ( EventArgs args )
186
188
{
187
189
base . OnMouseExited ( args ) ;
188
- DestroyPopover ( ) ;
190
+ HidePopover ( true ) ;
189
191
}
190
192
191
193
protected override void OnPreferredSizeChanged ( )
192
194
{
193
195
base . OnPreferredSizeChanged ( ) ;
194
196
if ( ! Visible )
195
- DestroyPopover ( ) ;
197
+ HidePopover ( ) ;
196
198
}
197
199
198
- void DestroyPopover ( )
200
+ Timer hideTooltipTimer ;
201
+
202
+ void HidePopover ( bool delayed = false )
199
203
{
200
- if ( popover != null ) {
201
- popover . Destroy ( ) ;
202
- popover = null ;
204
+ if ( delayed ) {
205
+ // we delay hiding using a timer to avoid tooltip flickering in case of focus stealing
206
+ // due to weird toolkit behaviour.
207
+ if ( hideTooltipTimer == null ) {
208
+ hideTooltipTimer = new Timer ( 50 ) {
209
+ AutoReset = false ,
210
+ SynchronizingObject = this ,
211
+ } ;
212
+ hideTooltipTimer . Elapsed += ( sender , e ) => {
213
+ if ( popover ? . Visible == true )
214
+ popover . Hide ( ) ;
215
+ } ;
216
+ }
217
+ hideTooltipTimer . Start ( ) ;
218
+ } else {
219
+ if ( hideTooltipTimer ? . Enabled == true )
220
+ hideTooltipTimer . Stop ( ) ;
221
+ if ( popover ? . Visible == true )
222
+ popover . Hide ( ) ;
203
223
}
204
224
}
205
225
206
226
protected override void Dispose ( bool disposing )
207
227
{
208
- if ( disposing )
209
- DestroyPopover ( ) ;
228
+ if ( disposing ) {
229
+ hideTooltipTimer ? . Dispose ( ) ;
230
+ if ( popover ? . Visible == true )
231
+ popover . Hide ( ) ;
232
+ popover ? . Dispose ( ) ;
233
+ }
234
+ hideTooltipTimer = null ;
235
+ popover = null ;
210
236
base . Dispose ( disposing ) ;
211
237
}
212
238
}
0 commit comments