Add possibility to delay showing wxRichToolTip.

Optionally show the tooltip after a delay instead of doing it immediately when
Show() is called.

Closes #14846.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72997 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-11-23 14:32:15 +00:00
parent 77c8efc8c3
commit 3c3b6f6063
9 changed files with 91 additions and 38 deletions

View File

@@ -593,6 +593,7 @@ All (GUI):
- Added wxControl::GetSizeFromTextSize() (Manuel Martin).
- Optionally allow showing tooltips for disabled ribbon buttons (wxBen).
- Add wxTL_NO_HEADER style to wxTreeListCtrl (robboto).
- Add possibility to delay showing wxRichToolTip (John Roberts).
wxGTK:

View File

@@ -3,7 +3,7 @@
// Purpose: wxRichToolTipGenericImpl declaration.
// Author: Vadim Zeitlin
// Created: 2011-10-18
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
@@ -30,13 +30,15 @@ public:
// This is pretty arbitrary, we could follow MSW and use some multiple
// of double-click time here.
m_timeout = 5000;
m_delay = 0;
}
virtual void SetBackgroundColour(const wxColour& col,
const wxColour& colEnd);
virtual void SetCustomIcon(const wxIcon& icon);
virtual void SetStandardIcon(int icon);
virtual void SetTimeout(unsigned milliseconds);
virtual void SetTimeout(unsigned milliseconds,
unsigned millisecondsDelay = 0);
virtual void SetTipKind(wxTipKind tipKind);
virtual void SetTitleFont(const wxFont& font);
@@ -52,7 +54,8 @@ private:
wxColour m_colStart,
m_colEnd;
unsigned m_timeout;
unsigned m_timeout,
m_delay;
wxTipKind m_tipKind;

View File

@@ -3,7 +3,7 @@
// Purpose: wxRichToolTipImpl declaration.
// Author: Vadim Zeitlin
// Created: 2011-10-18
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
@@ -29,7 +29,8 @@ public:
const wxColour& colEnd) = 0;
virtual void SetCustomIcon(const wxIcon& icon) = 0;
virtual void SetStandardIcon(int icon) = 0;
virtual void SetTimeout(unsigned milliseconds) = 0;
virtual void SetTimeout(unsigned milliseconds,
unsigned millisecondsShowdelay = 0) = 0;
virtual void SetTipKind(wxTipKind tipKind) = 0;
virtual void SetTitleFont(const wxFont& font) = 0;

View File

@@ -3,7 +3,7 @@
// Purpose: Declaration of wxRichToolTip class.
// Author: Vadim Zeitlin
// Created: 2011-10-07
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
@@ -76,7 +76,8 @@ public:
// elapses but this method can be used to change this or also disable
// hiding the tooltip automatically entirely by passing 0 in this parameter
// (but doing this can result in native version not being used).
void SetTimeout(unsigned milliseconds);
// Optionally specify a show delay.
void SetTimeout(unsigned milliseconds, unsigned millisecondsShowdelay = 0);
// Choose the tip kind, possibly none. By default the tip is positioned
// automatically, as if wxTipKind_Auto was used.

View File

@@ -133,17 +133,21 @@ public:
//@}
/**
Set timeout after which the tooltip should disappear, in milliseconds.
Set timeout after which the tooltip should disappear and
optionally set a delay before the tooltip is shown, in milliseconds.
By default the tooltip is hidden after system-dependent interval of
time elapses but this method can be used to change this or also disable
hiding the tooltip automatically entirely by passing 0 in this parameter
(but doing this will prevent the native MSW version from being used).
By default the tooltip is shown immediately and hidden after a
system-dependent interval of time elapses. This method can be used to
change this or also disable hiding the tooltip automatically entirely
by passing 0 in this parameter (but doing this will prevent the native
MSW version from being used).
Notice that the tooltip will always be hidden if the user presses a key
or clicks a mouse button.
Parameter @a millisecondsDelay is new since wxWidgets 2.9.5.
*/
void SetTimeout(unsigned milliseconds);
void SetTimeout(unsigned millisecondsTimeout, unsigned millisecondsDelay = 0);
/**
Choose the tip kind, possibly none.

View File

@@ -1854,13 +1854,14 @@ public:
WXSIZEOF(bgStyles), bgStyles,
1, wxRA_SPECIFY_ROWS);
const wxString timeouts[] = { "&None", "&Default", "&3 seconds" };
const wxString timeouts[] = { "&None", "&Default (no delay)", "&3 seconds" };
wxCOMPILE_TIME_ASSERT( WXSIZEOF(timeouts) == Timeout_Max, TmMismatch );
m_timeouts = new wxRadioBox(this, wxID_ANY, "Timeout:",
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(timeouts), timeouts,
1, wxRA_SPECIFY_ROWS);
m_timeouts->SetSelection(Timeout_Default);
m_timeDelay = new wxCheckBox(this, wxID_ANY, "Delay show" );
// Lay them out.
m_textBody->SetMinSize(wxSize(300, 200));
@@ -1872,6 +1873,7 @@ public:
sizer->Add(m_tipKinds, wxSizerFlags().Centre().Border());
sizer->Add(m_bgStyles, wxSizerFlags().Centre().Border());
sizer->Add(m_timeouts, wxSizerFlags().Centre().Border());
sizer->Add(m_timeDelay, wxSizerFlags().Centre().Border());
wxBoxSizer* const sizerBtns = new wxBoxSizer(wxHORIZONTAL);
sizerBtns->Add(btnShowText, wxSizerFlags().Border(wxRIGHT));
sizerBtns->Add(btnShowBtn, wxSizerFlags().Border(wxLEFT));
@@ -1972,17 +1974,22 @@ private:
break;
}
int delay = m_timeDelay->IsChecked() ? 500 : 0;
switch ( m_timeouts->GetSelection() )
{
case Timeout_None:
tip.SetTimeout(0);
// Don't call SetTimeout unnecessarily
// or msw will show generic impl
if ( delay )
tip.SetTimeout(0, delay);
break;
case Timeout_Default:
break;
case Timeout_3sec:
tip.SetTimeout(3000);
tip.SetTimeout(3000, delay);
break;
}
@@ -1997,6 +2004,7 @@ private:
wxRadioBox* m_tipKinds;
wxRadioBox* m_bgStyles;
wxRadioBox* m_timeouts;
wxCheckBox* m_timeDelay;
};
void MyFrame::OnRichTipDialog(wxCommandEvent& WXUNUSED(event))

View File

@@ -3,7 +3,7 @@
// Purpose: wxRichToolTip implementation common to all platforms.
// Author: Vadim Zeitlin
// Created: 2011-10-18
// RCS-ID: $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
@@ -57,9 +57,10 @@ void wxRichToolTip::SetIcon(const wxIcon& icon)
m_impl->SetCustomIcon(icon);
}
void wxRichToolTip::SetTimeout(unsigned milliseconds)
void wxRichToolTip::SetTimeout(unsigned milliseconds,
unsigned millisecondsDelay)
{
m_impl->SetTimeout(milliseconds);
m_impl->SetTimeout(milliseconds, millisecondsDelay);
}
void wxRichToolTip::SetTipKind(wxTipKind tipKind)

View File

@@ -3,7 +3,7 @@
// Purpose: Implementation of wxRichToolTip.
// Author: Vadim Zeitlin
// Created: 2011-10-07
// RCS-ID: $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
@@ -232,7 +232,7 @@ public:
}
}
void DoShow()
void SetPosition()
{
wxPoint pos = GetTipPoint();
@@ -241,18 +241,30 @@ public:
pos -= m_anchorPos;
Move(pos, wxSIZE_NO_ADJUSTMENTS);
}
void DoShow()
{
Popup();
}
void SetTimeout(unsigned timeout)
void SetTimeoutAndShow(unsigned timeout, unsigned delay)
{
if ( !timeout )
if ( !timeout && !delay )
{
DoShow();
return;
}
Connect(wxEVT_TIMER, wxTimerEventHandler(wxRichToolTipPopup::OnTimer));
m_timer.Start(timeout, true /* one shot */);
m_timeout = timeout; // set for use in OnTimer if we have a delay
m_delayShow = delay != 0;
if ( !m_delayShow )
DoShow();
m_timer.Start((delay ? delay : timeout), true /* one shot */);
}
protected:
@@ -559,11 +571,23 @@ private:
// Timer event handler hides the tooltip when the timeout expires.
void OnTimer(wxTimerEvent& WXUNUSED(event))
{
if ( !m_delayShow )
{
// Doing "Notify" here ensures that our OnDismiss() is called and so we
// also Destroy() ourselves. We could use Dismiss() and call Destroy()
// explicitly from here as well.
DismissAndNotify();
return;
}
m_delayShow = false;
if ( m_timeout )
m_timer.Start(m_timeout, true);
DoShow();
}
@@ -574,6 +598,12 @@ private:
// The timer counting down the time until we're hidden.
wxTimer m_timer;
// We will need to accesss the timeout period when delaying showing tooltip.
int m_timeout;
// If true, delay showing the tooltip.
bool m_delayShow;
wxDECLARE_NO_COPY_CLASS(wxRichToolTipPopup);
};
@@ -621,9 +651,11 @@ void wxRichToolTipGenericImpl::SetStandardIcon(int icon)
}
}
void wxRichToolTipGenericImpl::SetTimeout(unsigned milliseconds)
void wxRichToolTipGenericImpl::SetTimeout(unsigned millisecondsTimeout,
unsigned millisecondsDelay)
{
m_timeout = milliseconds;
m_delay = millisecondsDelay;
m_timeout = millisecondsTimeout;
}
void wxRichToolTipGenericImpl::SetTipKind(wxTipKind tipKind)
@@ -653,9 +685,9 @@ void wxRichToolTipGenericImpl::ShowFor(wxWindow* win)
popup->SetBackgroundColours(m_colStart, m_colEnd);
popup->DoShow();
popup->SetTimeout(m_timeout);
popup->SetPosition();
// show or start the timer to delay showing the popup
popup->SetTimeoutAndShow( m_timeout, m_delay );
}
// Currently only wxMSW provides a native implementation.

View File

@@ -3,7 +3,7 @@
// Purpose: Native MSW implementation of wxRichToolTip.
// Author: Vadim Zeitlin
// Created: 2011-10-18
// RCS-ID: $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
@@ -123,13 +123,15 @@ public:
}
}
virtual void SetTimeout(unsigned milliseconds)
virtual void SetTimeout(unsigned millisecondsTimeout,
unsigned millisecondsDelay)
{
// We don't support changing the timeout (maybe TTM_SETDELAYTIME could
// be used for this?).
// We don't support changing the timeout or the delay
// (maybe TTM_SETDELAYTIME could be used for this?).
m_canUseNative = false;
wxRichToolTipGenericImpl::SetTimeout(milliseconds);
wxRichToolTipGenericImpl::SetTimeout(millisecondsTimeout,
millisecondsDelay);
}
virtual void SetTipKind(wxTipKind tipKind)