void MenuItemBase::PaintTopItem(Draw& w, int state) { Size sz = GetSize(); if(GUI_GlobalStyle() >= GUISTYLE_XP) { bool opaque = InOpaqueBar(); bool opaque2 = opaque || state; Color bg = SColorFace(); if(opaque2) ChPaint(w, 0, 0, sz.cx, sz.cy, style->topitem[state]); else if(opaque) w.DrawRect(0, 0, sz.cx, sz.cy, bg); String text = GetText(); Size isz = GetTextSize(text, StdFont()); Color txt = opaque ? style->topitemtext[0] : GetLabelTextColor(this); Color hltxt = opaque2 ? style->topitemtext[state] : GetLabelTextColor(this); if(!opaque && state != 2) { // Fix issues when text color is not compatible with transparent background (e.g. Ubuntu Ambience)] Color c = state == 1 ? SColorHighlight() : bg; int g = Grayscale(c); bool dark = IsDark(c); if(abs(g - Grayscale(txt)) < 70) txt = dark ? White() : Black(); if(abs(g - Grayscale(hltxt)) < 70) hltxt = dark ? White() : Black(); } DrawMenuText(w, 6, (sz.cy - isz.cy) / 2, text, GetFont(), IsItemEnabled(), state, txt, hltxt); } else { w.DrawRect(sz, SColorFace); static const ColorF b0[] = { (ColorF)1, SColorLight, SColorLight, SColorShadow, SColorShadow, }; static const ColorF b1[] = { (ColorF)1, SColorShadow, SColorShadow, SColorLight, SColorLight, }; String text = GetText(); Size isz = GetTextSize(text, StdFont()); DrawMenuText(w, 6, (sz.cy - isz.cy) / 2, text, GetFont(), IsItemEnabled(), false, SColorMenuText, SColorHighlightText); if(state) DrawBorder(w, 0, 0, sz.cx, sz.cy, state == 2 ? b1 : b0); } }
Size DrawLabel::Paint(Ctrl *ctrl, Draw& w, const Rect& r, bool visibleaccesskey) const { int lspc = this->lspc; int rspc = this->rspc; Size sz1 = limg.GetSize(); Size sz2 = rimg.GetSize(); int txtcx = r.GetWidth() - sz1.cx - Nvl(lspc, 0) - sz2.cx - Nvl(rspc, 0); Size txtsz = *text ? GetSmartTextSize(text, font, txtcx) : paintrect.GetStdSize(); if(txtsz.cx) { if(!rimg_never_hide && txtsz.cx + sz1.cx + sz2.cx + Nvl(lspc, 0) + Nvl(rspc, 0) > r.GetWidth()) { sz2.cx = 0; rspc = 0; } if(!limg_never_hide && txtsz.cx + sz1.cx + sz2.cx + Nvl(lspc, 0) + Nvl(rspc, 0) > r.GetWidth()) { sz1.cx = 0; lspc = 0; } } Size isz = GetSize(txtcx, sz1, lspc, sz2, rspc); Point p = r.TopLeft(), ip; if(align == ALIGN_LEFT) p.x = r.left; else if(align == ALIGN_RIGHT) p.x = r.right - isz.cx; else if(align == ALIGN_CENTER) p.x = (r.right + r.left - isz.cx) / 2; if(valign == ALIGN_TOP) p.y = r.top; else if(valign == ALIGN_BOTTOM) p.y = r.bottom - isz.cy; else if(valign == ALIGN_CENTER) p.y = (r.bottom + r.top - txtsz.cy) / 2; Color color = disabled && !IsNull(disabledink) ? disabledink : ink; if(IsNull(color)) color = disabled ? SColorDisabled : GetLabelTextColor(ctrl); int ix; if(IsNull(lspc)) ix = r.left + push; else { ix = p.x + push; p.x += sz1.cx; p.x += lspc; } int iy = push + (r.top + r.bottom - sz1.cy) / 2; if(sz1.cx) if(IsNull(lcolor)) w.DrawImage(ix, iy, DisabledImage(limg, disabled)); else w.DrawImage(ix, iy, limg, lcolor); iy = push + (r.top + r.bottom - sz2.cy) / 2; ix = (IsNull(rspc) ? r.right - sz2.cx : p.x + txtsz.cx + rspc) + push; if(sz2.cx) if(IsNull(rcolor)) w.DrawImage(ix, iy, DisabledImage(rimg, disabled)); else w.DrawImage(ix, iy, rimg, rcolor); paintrect.Paint(w, p.x + push, p.y + push, txtsz.cx, isz.cy, color, Null); if(*text) { if(disabled) DrawSmartText(w, p.x + push + 1, p.y + push + (isz.cy - txtsz.cy) / 2 + 1, txtsz.cx, text, font, SColorPaper); DrawSmartText(w, p.x + push, p.y + push, txtcx, text, font, color, visibleaccesskey ? accesskey : 0); if(focus) DrawFocus(w, p.x - 2, p.y, txtsz.cx + 5, isz.cy); } return isz; }