int SortArray::GetIndexColor(size_t idx) { int clr; // select color if (idx == m_access1.index) { clr = m_access1.color; } else if (idx == m_access2.index) { clr = m_access2.color; } else if ( (clr = InWatchList(idx)) != 0 ) { // clr already set } else if (m_mark[idx] != 0) { clr = m_mark[idx]; } else if ( (clr = InAccessList(idx)) >= 0 ) { } else { clr = 0; } return clr; }
void WSortView::paint(wxDC& dc, const wxSize& dcsize) { dc.SetBackground(*wxBLACK_BRUSH); dc.Clear(); if (size() == 0) return; size_t fwidth = dcsize.GetWidth(); size_t fheight = dcsize.GetHeight(); size_t width = fwidth - 20; size_t height = fheight - 20; dc.SetDeviceOrigin(10,10); // *** draw array element bars // draw | | | | bars: each bar is width w, separation is w/2 // thus n bars need n * w + (n-1) * w/2 width // 1st variant: space is 0.5 of bar size //double wbar = width / (size() + (size()-1) / 2.0); //double bstep = 1.5 * wbar; // 2nd variant: one pixel between bars double wbar = (width - (size()-1)) / (double)size(); if (width <= (size()-1)) wbar = 0.0; double bstep = wbar + 1.0; // special case for bstep = 2 pixel -> draw 2 pixel bars instead of 1px // bar/1px gaps. if ( fabs(wbar - 1.0) < 0.1 && fabs(bstep - 2.0) < 0.1 ) wbar = 2, bstep = 2; static const wxPen pens[] = { *wxWHITE_PEN, *wxRED_PEN, *wxGREEN_PEN, *wxCYAN_PEN, wxPen(wxColour(255,255,0)), // 4 yellow wxPen(wxColour(255,0,255)), // 5 magenta wxPen(wxColour(255,192,128)), // 6 orange wxPen(wxColour(255,128,192)), // 7 pink wxPen(wxColour(128,192,255)), // 8 darker cyan wxPen(wxColour(192,255,128)), // 9 darker green wxPen(wxColour(192,128,255)), // 10 purple wxPen(wxColour(128,255,192)), // 11 light green wxPen(wxColour(128,128,255)), // 12 blue wxPen(wxColour(192,128,192)), // 13 dark purple wxPen(wxColour(128,192,192)), // 14 dark cyan wxPen(wxColour(192,192,128)), // 15 dark yellow wxPen(wxColour(0,128,255)), // 16 blue/cyan mix }; static const wxBrush brushes[] = { *wxWHITE_BRUSH, *wxRED_BRUSH, *wxGREEN_BRUSH, *wxCYAN_BRUSH, wxBrush(wxColour(255,255,0)), // 4 yellow wxBrush(wxColour(255,0,255)), // 5 magenta wxBrush(wxColour(255,192,128)), // 6 orange wxBrush(wxColour(255,128,192)), // 7 pink wxBrush(wxColour(128,192,255)), // 8 darker cyan wxBrush(wxColour(192,255,128)), // 9 darker green wxBrush(wxColour(192,128,255)), // 10 purple wxBrush(wxColour(128,255,192)), // 11 light green wxBrush(wxColour(128,128,255)), // 12 blue wxBrush(wxColour(192,128,192)), // 13 dark purple wxBrush(wxColour(128,192,192)), // 14 dark cyan wxBrush(wxColour(192,192,128)), // 15 dark yellow wxBrush(wxColour(0,128,255)), // 16 blue/cyan mix }; wxMutexLocker lock(m_mutex); ASSERT(lock.IsOk()); for (size_t i = 0; i < size(); ++i) { int clr; // select color if (i == m_access1.index) { clr = m_access1.color; } else if (i == m_access2.index) { clr = m_access2.color; } else if ( (clr = InWatchList(i)) != 0 ) { // clr already set } else if (m_mark[i] != 0) { clr = m_mark[i]; } else if ( (clr = InAccessList(i)) >= 0 ) { } else { clr = 0; } ASSERT(clr < (int)(sizeof(brushes) / sizeof(brushes[0]))); dc.SetPen( pens[clr] ); dc.SetBrush( brushes[clr] ); dc.DrawRectangle(i*bstep, height, wxMax(1, // draw at least 1 pixel (wxCoord((i+1)*bstep) - wxCoord(i*bstep)) // integral gap to next bar - (bstep - wbar) // space between bars ), -(double)height * m_array[i].get_direct() / m_array_max); } }