PixelRect ButtonFrameRenderer::GetDrawingRect(PixelRect rc, bool pressed) const { rc.Grow(-2); if (pressed) rc.Offset(1, 1); return rc; }
void ListControl::DrawItems(Canvas &canvas, unsigned start, unsigned end) const { PixelRect rc = item_rect(start); canvas.SetBackgroundColor(look.list.background_color); canvas.SetBackgroundTransparent(); canvas.Select(*look.list.font); #ifdef ENABLE_OPENGL /* enable clipping */ GLScissor scissor(OpenGL::translate.x, OpenGL::screen_height - OpenGL::translate.y - canvas.GetHeight() - 1, scroll_bar.GetLeft(GetSize()), canvas.GetHeight()); #endif unsigned last_item = std::min(length, end); const bool focused = HasFocus(); for (unsigned i = start; i < last_item; i++) { const bool selected = i == cursor; const bool pressed = selected && drag_mode == DragMode::CURSOR; canvas.DrawFilledRectangle(rc, look.list.GetBackgroundColor(selected, focused, pressed)); canvas.SetTextColor(look.list.GetTextColor(selected, focused, pressed)); if (item_renderer != nullptr) item_renderer->OnPaintItem(canvas, rc, i); if (focused && selected) canvas.DrawFocusRectangle(rc); rc.Offset(0, rc.bottom - rc.top); } /* paint the bottom part below the last item */ rc.bottom = canvas.GetHeight(); if (rc.bottom > rc.top) canvas.DrawFilledRectangle(rc, look.list.background_color); }