Use ShowWithEffect() in the sample wxComboCtrlWithCustomPopupAnim instead of manual window manipulation in timer event
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64503 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -86,8 +86,6 @@ public:
|
|||||||
void OnIdle( wxIdleEvent& event );
|
void OnIdle( wxIdleEvent& event );
|
||||||
|
|
||||||
|
|
||||||
wxCheckBox* m_cbUseAnim;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxTextCtrl* m_logWin;
|
wxTextCtrl* m_logWin;
|
||||||
wxLog* m_logOld;
|
wxLog* m_logOld;
|
||||||
@@ -495,129 +493,22 @@ BEGIN_EVENT_TABLE(TreeCtrlComboPopup, wxTreeCtrl)
|
|||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxComboCtrl with custom popup animation. We use EVT_TIMER, which is quite
|
// wxComboCtrl with custom popup animation, using wxWindow::ShowWithEffect().
|
||||||
// safe, but requires much more can than doing it in a single function (ie.
|
|
||||||
// AnimateShow) and using combination of wxSleep and wxSafeYield.
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
#if wxUSE_TIMER
|
|
||||||
|
|
||||||
#define CUSTOM_COMBOBOX_ANIMATION_DURATION 200 // In milliseconds
|
|
||||||
|
|
||||||
#include "wx/timer.h"
|
|
||||||
|
|
||||||
class wxComboCtrlWithCustomPopupAnim : public wxComboCtrl
|
class wxComboCtrlWithCustomPopupAnim : public wxComboCtrl
|
||||||
{
|
{
|
||||||
public:
|
protected:
|
||||||
|
virtual bool AnimateShow( const wxRect& rect, int WXUNUSED(flags) )
|
||||||
virtual bool AnimateShow( const wxRect& rect, int flags )
|
|
||||||
{
|
{
|
||||||
MyFrame* myFrame = (MyFrame*) ::wxGetTopLevelParent(this);
|
wxWindow* win = GetPopupWindow();
|
||||||
|
win->SetSize(rect);
|
||||||
if ( !myFrame->m_cbUseAnim->GetValue() )
|
win->Raise(); // This is needed
|
||||||
return true;
|
win->ShowWithEffect(wxSHOW_EFFECT_SLIDE_TO_BOTTOM);
|
||||||
|
return true;
|
||||||
m_animStart = ::wxGetLocalTimeMillis();
|
|
||||||
m_animRect = rect;
|
|
||||||
m_animFlags = flags;
|
|
||||||
|
|
||||||
wxScreenDC dc;
|
|
||||||
|
|
||||||
wxBitmap bitmap( rect.width, rect.height, -1 );
|
|
||||||
wxMemoryDC memdc( bitmap );
|
|
||||||
memdc.Blit( 0, 0, rect.width, rect.height, &dc, rect.x, rect.y );
|
|
||||||
memdc.SelectObject(wxNullBitmap);
|
|
||||||
m_animBackBitmap = bitmap;
|
|
||||||
|
|
||||||
m_animTimer.SetOwner( this, wxID_ANY );
|
|
||||||
m_animTimer.Start( 10, wxTIMER_CONTINUOUS );
|
|
||||||
|
|
||||||
DoOnTimer();
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
void OnTimerEvent( wxTimerEvent& WXUNUSED(event) )
|
|
||||||
{
|
|
||||||
DoOnTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DoOnTimer()
|
|
||||||
{
|
|
||||||
bool stopTimer = false;
|
|
||||||
|
|
||||||
wxWindow* popup = GetPopupControl()->GetControl();
|
|
||||||
wxScreenDC dc;
|
|
||||||
const wxRect& rect = m_animRect;
|
|
||||||
|
|
||||||
// Popup was hidden before it was fully shown?
|
|
||||||
if ( IsPopupWindowState(Hidden) )
|
|
||||||
{
|
|
||||||
stopTimer = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLongLong t = ::wxGetLocalTimeMillis();
|
|
||||||
|
|
||||||
int pos = (int) (t-m_animStart).GetLo();
|
|
||||||
if ( pos < CUSTOM_COMBOBOX_ANIMATION_DURATION )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Actual animation happens here
|
|
||||||
//
|
|
||||||
int width = rect.width;
|
|
||||||
int height = rect.height;
|
|
||||||
|
|
||||||
int center_x = rect.x + (width/2);
|
|
||||||
int center_y = rect.y + (height/2);
|
|
||||||
|
|
||||||
double d_height = (double) height;
|
|
||||||
|
|
||||||
dc.SetPen( *wxBLACK_PEN );
|
|
||||||
dc.SetBrush( *wxTRANSPARENT_BRUSH );
|
|
||||||
|
|
||||||
int w = (((pos*256)/CUSTOM_COMBOBOX_ANIMATION_DURATION)*width)/256;
|
|
||||||
|
|
||||||
double ratio = ((double)w / (double)width);
|
|
||||||
int h = (int)(d_height * ratio);
|
|
||||||
dc.DrawBitmap( m_animBackBitmap, rect.x, rect.y );
|
|
||||||
dc.DrawRectangle( center_x - w/2, center_y - h/2, w, h );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
stopTimer = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( stopTimer )
|
|
||||||
{
|
|
||||||
dc.DrawBitmap( m_animBackBitmap, rect.x, rect.y );
|
|
||||||
popup->Move( 0, 0 );
|
|
||||||
m_animTimer.Stop();
|
|
||||||
DoShowPopup( m_animRect, m_animFlags );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Popup animation related
|
|
||||||
wxLongLong m_animStart;
|
|
||||||
wxTimer m_animTimer;
|
|
||||||
wxRect m_animRect;
|
|
||||||
wxBitmap m_animBackBitmap;
|
|
||||||
int m_animFlags;
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(wxComboCtrlWithCustomPopupAnim, wxComboCtrl)
|
|
||||||
EVT_TIMER(wxID_ANY, wxComboCtrlWithCustomPopupAnim::OnTimerEvent)
|
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define wxComboCtrlWithCustomPopupAnim wxComboCtrl
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxComboCtrl with entirely custom button action (opens file dialog)
|
// wxComboCtrl with entirely custom button action (opens file dialog)
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -1010,16 +901,6 @@ MyFrame::MyFrame(const wxString& title)
|
|||||||
|
|
||||||
colSizer = new wxBoxSizer( wxVERTICAL );
|
colSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
wxStaticBoxSizer* sbSizer = new wxStaticBoxSizer( new wxStaticBox(panel,
|
|
||||||
wxID_ANY,
|
|
||||||
wxT("Options")),
|
|
||||||
wxVERTICAL );
|
|
||||||
|
|
||||||
m_cbUseAnim = new wxCheckBox(panel, wxID_ANY, wxT("Custom popup animation for ListView wxComboCtrl"));
|
|
||||||
m_cbUseAnim->SetValue(true);
|
|
||||||
sbSizer->Add( m_cbUseAnim, 0, wxALL, 3 );
|
|
||||||
|
|
||||||
colSizer->Add( sbSizer, 0, wxEXPAND|wxALL, 3 );
|
|
||||||
colSizer->AddSpacer(8);
|
colSizer->AddSpacer(8);
|
||||||
colSizer->Add( new wxStaticText(panel, wxID_ANY, wxT("Log Messages:")), 0, wxTOP|wxLEFT, 3 );
|
colSizer->Add( new wxStaticText(panel, wxID_ANY, wxT("Log Messages:")), 0, wxTOP|wxLEFT, 3 );
|
||||||
colSizer->Add( m_logWin, 1, wxEXPAND|wxALL, 3 );
|
colSizer->Add( m_logWin, 1, wxEXPAND|wxALL, 3 );
|
||||||
|
Reference in New Issue
Block a user