void wxComboCtrl::DoTimerEvent() { bool stopTimer = false; wxWindow* win = GetPopupWindow(); wxWindow* popup = GetPopupControl()->GetControl(); // Popup was hidden before it was fully shown? if ( IsPopupWindowState(Hidden) ) { stopTimer = true; } else { wxMilliClock_t t = ::wxGetLocalTimeMillis(); const wxRect& rect = m_animRect; #if wxUSE_LONGLONG int pos = (int) (t-m_animStart).GetLo(); #else int pos = (int) (t-m_animStart); #endif if ( pos < COMBOBOX_ANIMATION_DURATION ) { int height = rect.height; //int h0 = rect.height; int h = (((pos*256)/COMBOBOX_ANIMATION_DURATION)*height)/256; int y = (height - h); if ( y < 0 ) y = 0; if ( m_animFlags & ShowAbove ) { win->SetSize( rect.x, rect.y + height - h, rect.width, h ); } else { // Note that apparently Move() should be called after // SetSize() to reduce (or even eliminate) animation garbage win->SetSize( rect.x, rect.y, rect.width, h ); popup->Move( 0, -y ); } } else { stopTimer = true; } } if ( stopTimer ) { m_animTimer.Stop(); DoShowPopup( m_animRect, m_animFlags ); popup->Move( 0, 0 ); // Do a one final refresh to clean up the rare cases of animation // garbage win->Refresh(); } }
void wxComboCtrl::DoTimerEvent() { bool stopTimer = false; wxWindow* popup = GetPopupControl()->GetControl(); // Popup was hidden before it was fully shown? if ( IsPopupWindowState(Hidden) ) { stopTimer = true; } else { wxLongLong t = ::wxGetLocalTimeMillis(); const wxRect& rect = m_animRect; wxWindow* win = GetPopupWindow(); int pos = (int) (t-m_animStart).GetLo(); if ( pos < COMBOBOX_ANIMATION_DURATION ) { int height = rect.height; //int h0 = rect.height; int h = (((pos*256)/COMBOBOX_ANIMATION_DURATION)*height)/256; int y = (height - h); if ( y < 0 ) y = 0; if ( m_animFlags & ShowAbove ) { win->SetSize( rect.x, rect.y + height - h, rect.width, h ); } else { popup->Move( 0, -y ); win->SetSize( rect.x, rect.y, rect.width, h ); } } else { stopTimer = true; } } if ( stopTimer ) { popup->Move( 0, 0 ); m_animTimer.Stop(); DoShowPopup( m_animRect, m_animFlags ); } }
bool DropDownBase::ShowPopup() { int x = 0, y = GetSize().y; ClientToScreen( &x, &y ); // control too low, can't show scrollbar, don't bother displaying wxRect displayRect = wxGetClientDisplayRect(); if (displayRect.GetBottom() - y < DROPDOWN_DROP_HEIGHT) return false; int width = GetSize().x; int height = DoGetBestDropHeight(displayRect.GetBottom() - y); if (height < 1) return false; m_popupWin = new DropDownPopup(this); m_popupWin->SetSize(x, y, width, height); if (m_popupWin->GetChild()) m_popupWin->GetChild()->SetSize(width, height); //wxPrintf(wxT("ShowPopup %d %d, %d %d -- %d\n"), width, height, m_popupWin->GetSize().x, m_popupWin->GetSize().y, m_popupWin->GetMinHeight()); return DoShowPopup(); }