void wxVListBoxComboPopup::OnMouseMove(wxMouseEvent& event) { event.Skip(); // Move selection to cursor if it is inside the popup int y = event.GetPosition().y; int fromBottom = GetClientSize().y - y; // Since in any case we need to find out if the last item is only // partially visible, we might just as well replicate the HitTest // loop here. const size_t lineMax = GetVisibleEnd(); for ( size_t line = GetVisibleBegin(); line < lineMax; line++ ) { y -= OnGetRowHeight(line); if ( y < 0 ) { // Only change selection if item is fully visible if ( (y + fromBottom) >= 0 ) { wxVListBox::SetSelection((int)line); return; } } } }
void wxVListBox::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 rectRow; rectRow.width = clientSize.x; // iterate over all visible lines const size_t lineMax = GetVisibleEnd(); for ( size_t line = GetVisibleBegin(); line < lineMax; line++ ) { const wxCoord hRow = OnGetRowHeight(line); rectRow.height = hRow; // and draw the ones which intersect the update rect if ( rectRow.Intersects(rectUpdate) ) { // don't allow drawing outside of the lines rectangle wxDCClipper clip(dc, rectRow); wxRect rect = rectRow; OnDrawBackground(dc, rect, line); OnDrawSeparator(dc, rect, line); rect.Deflate(m_ptMargins.x, m_ptMargins.y); OnDrawItem(dc, rect, line); } else // no intersection { if ( rectRow.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 } rectRow.y += hRow; } }
// hit testing int wxSymbolListCtrl::HitTest(const wxPoint& pt) { wxCoord lineHeight = OnGetRowHeight(0); int atLine = GetVisibleBegin() + (pt.y/lineHeight); int symbol = (atLine*m_symbolsPerLine) + (pt.x/(m_cellSize.x+1)); if (symbol >= m_minSymbolValue && symbol <= m_maxSymbolValue) return symbol; return -1; }
wxRect wxVListBox::GetItemRect(size_t n) const { wxRect itemrect; // check that this item is visible const size_t lineMax = GetVisibleEnd(); if ( n >= lineMax ) return itemrect; size_t line = GetVisibleBegin(); if ( n < line ) return itemrect; while ( line <= n ) { itemrect.y += itemrect.height; itemrect.height = OnGetRowHeight(line); line++; } itemrect.width = GetClientSize().x; return itemrect; }
void wxSymbolListCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) { // If size is larger, recalculate double buffer bitmap wxSize clientSize = GetClientSize(); if ( !m_doubleBuffer || clientSize.x > m_doubleBuffer->GetWidth() || clientSize.y > m_doubleBuffer->GetHeight() ) { delete m_doubleBuffer; m_doubleBuffer = new wxBitmap(clientSize.x+25,clientSize.y+25); } wxBufferedPaintDC dc(this,*m_doubleBuffer); // the update rectangle wxRect rectUpdate = GetUpdateClientRect(); // fill it with background colour dc.SetBackground(GetBackgroundColour()); dc.Clear(); // set the font to be displayed dc.SetFont(GetFont()); // the bounding rectangle of the current line wxRect rectRow; rectRow.width = clientSize.x; dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT))); dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); // iterate over all visible lines const size_t lineMax = GetVisibleEnd(); for ( size_t line = GetVisibleBegin(); line < lineMax; line++ ) { const wxCoord hRow = OnGetRowHeight(line); rectRow.height = hRow; // and draw the ones which intersect the update rect if ( rectRow.Intersects(rectUpdate) ) { // don't allow drawing outside of the lines rectangle wxDCClipper clip(dc, rectRow); wxRect rect = rectRow; rect.Deflate(m_ptMargins.x, m_ptMargins.y); OnDrawItem(dc, rect, line); } else // no intersection { if ( rectRow.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 } rectRow.y += hRow; } }