From e9cc1579573a1f9b1e7f560454f7c16bce5ca979 Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Sun, 6 Jun 2010 09:15:20 +0000 Subject: [PATCH] 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 --- samples/combo/combo.cpp | 135 +++------------------------------------- 1 file changed, 8 insertions(+), 127 deletions(-) diff --git a/samples/combo/combo.cpp b/samples/combo/combo.cpp index 0deae26b97..b5f4705b47 100644 --- a/samples/combo/combo.cpp +++ b/samples/combo/combo.cpp @@ -86,8 +86,6 @@ public: void OnIdle( wxIdleEvent& event ); - wxCheckBox* m_cbUseAnim; - protected: wxTextCtrl* m_logWin; wxLog* m_logOld; @@ -495,129 +493,22 @@ BEGIN_EVENT_TABLE(TreeCtrlComboPopup, wxTreeCtrl) END_EVENT_TABLE() // ---------------------------------------------------------------------------- -// wxComboCtrl with custom popup animation. We use EVT_TIMER, which is quite -// safe, but requires much more can than doing it in a single function (ie. -// AnimateShow) and using combination of wxSleep and wxSafeYield. +// wxComboCtrl with custom popup animation, using wxWindow::ShowWithEffect(). // ---------------------------------------------------------------------------- -#if wxUSE_TIMER - -#define CUSTOM_COMBOBOX_ANIMATION_DURATION 200 // In milliseconds - -#include "wx/timer.h" - class wxComboCtrlWithCustomPopupAnim : public wxComboCtrl { -public: - - virtual bool AnimateShow( const wxRect& rect, int flags ) - { - MyFrame* myFrame = (MyFrame*) ::wxGetTopLevelParent(this); - - if ( !myFrame->m_cbUseAnim->GetValue() ) - 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() +protected: + virtual bool AnimateShow( const wxRect& rect, int WXUNUSED(flags) ) { - 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 ); - } + wxWindow* win = GetPopupWindow(); + win->SetSize(rect); + win->Raise(); // This is needed + win->ShowWithEffect(wxSHOW_EFFECT_SLIDE_TO_BOTTOM); + return true; } - - // 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) // ---------------------------------------------------------------------------- @@ -1010,16 +901,6 @@ MyFrame::MyFrame(const wxString& title) 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->Add( new wxStaticText(panel, wxID_ANY, wxT("Log Messages:")), 0, wxTOP|wxLEFT, 3 ); colSizer->Add( m_logWin, 1, wxEXPAND|wxALL, 3 ); -- 2.47.2