void ContentBoxCtrol::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxSize clientSize = GetClientSize(); wxAutoBufferedPaintDC dc(this); // the update rectangle wxRect rectUpdate = GetUpdateClientRect(); // fill it with background colour dc.SetBackground(GetBackgroundColour()); dc.Clear(); // the bounding rectangle of the current line wxRect rectLine; rectLine.width = clientSize.x; // iterate over all visible lines const size_t lineMax = GetVisibleEnd(); for ( size_t line = GetVisibleRowsBegin(); line < lineMax; line++ ) { const wxCoord hLine = OnGetLineHeight(line); rectLine.height = hLine; // and draw the ones which intersect the update rect if ( rectLine.Intersects(rectUpdate) ) { // don't allow drawing outside of the lines rectangle wxDCClipper clip(dc, rectLine); wxRect rect = rectLine; OnDrawBackground(dc, rect, line); OnDrawSeparator(dc, rect, line); rect.Deflate(m_ptMargins.x, m_ptMargins.y); OnDrawItem(dc, rect, line); } else // no intersection { if ( rectLine.GetTop() > rectUpdate.GetBottom() ) { // we are already below the update rect, no need to continue // further break; } //else: the next line may intersect the update rect } rectLine.y += hLine; } }
bool wxVListBox::DoSetCurrent(int current) { wxASSERT_MSG( current == wxNOT_FOUND || (current >= 0 && (size_t)current < GetItemCount()), wxT("wxVListBox::DoSetCurrent(): invalid item index") ); if ( current == m_current ) { // nothing to do return false; } if ( m_current != wxNOT_FOUND ) RefreshRow(m_current); m_current = current; if ( m_current != wxNOT_FOUND ) { // if the line is not visible at all, we scroll it into view but we // don't need to refresh it -- it will be redrawn anyhow if ( !IsVisible(m_current) ) { ScrollToRow(m_current); } else // line is at least partly visible { // it is, indeed, only partly visible, so scroll it into view to // make it entirely visible // BUT scrolling down when m_current is first visible makes it // completely hidden, so that is even worse while ( (size_t)m_current + 1 == GetVisibleRowsEnd() && (size_t)m_current != GetVisibleRowsBegin() && ScrollToRow(GetVisibleBegin() + 1) ) ; // but in any case refresh it as even if it was only partly visible // before we need to redraw it entirely as its background changed RefreshRow(m_current); } } return true; }
// -------------------------------------------------------------------------------- // void guAlListBox::ReloadItems( bool reset ) { wxArrayInt Selection; int FirstVisible = GetVisibleRowsBegin(); if( reset ) SetSelection( -1 ); else Selection = GetSelectedItems( false ); m_Items->Empty(); GetItemsList(); m_Items->Insert( new guAlbumItem( 0, wxString::Format( wxT( "%s (%lu)" ), _( "All" ), m_Items->Count() ) ), 0 ); SetItemCount( m_Items->Count() ); if( !reset ) { SetSelectedItems( Selection ); ScrollToRow( FirstVisible ); } RefreshAll(); }
void ContentBoxCtrol::OnKeyDown(wxKeyEvent& event) { // flags for DoHandleItemClick() int flags = ItemClick_Kbd; int current; switch ( event.GetKeyCode() ) { case WXK_HOME: current = 0; break; case WXK_END: current = GetRowCount() - 1; break; case WXK_DOWN: if ( m_current == (int)GetRowCount() - 1 ) return; current = m_current + 1; break; case WXK_UP: if ( m_current == wxNOT_FOUND ) current = GetRowCount() - 1; else if ( m_current != 0 ) current = m_current - 1; else // m_current == 0 return; break; case WXK_PAGEDOWN: PageDown(); current = GetVisibleRowsBegin(); break; case WXK_PAGEUP: if ( m_current == (int)GetVisibleRowsBegin() ) { PageUp(); } current = GetVisibleRowsBegin(); break; case WXK_SPACE: // hack: pressing space should work like a mouse click rather than // like a keyboard arrow press, so trick DoHandleItemClick() in // thinking we were clicked flags &= ~ItemClick_Kbd; current = m_current; break; #if (LENMUS_PLATFORM_WIN32 == 1) case WXK_TAB: // Since we are using wxWANTS_CHARS we need to send navigation // events for the tabs on MSW { wxNavigationKeyEvent ne; ne.SetDirection(!event.ShiftDown()); ne.SetCurrentFocus(this); ne.SetEventObject(this); GetParent()->GetEventHandler()->ProcessEvent(ne); } // fall through to default #endif default: event.Skip(); //continue processing the event current = 0; // just to silent the stupid compiler warnings wxUnusedVar(current); return; } if ( event.ShiftDown() ) flags |= ItemClick_Shift; if ( event.ControlDown() ) flags |= ItemClick_Ctrl; DoHandleItemClick(current, flags); }