C4PortraitSelDlg::ListItem::ListItem(const char *szFilename) : C4FileSelDlg::ListItem(szFilename), fError(false), fLoaded(false) { CStdFont *pUseFont = &(C4GUI::GetRes()->MiniFont); // determine label text StdStrBuf sDisplayLabel; if (szFilename) { sDisplayLabel.Copy(::GetFilename(szFilename)); ::RemoveExtension(&sDisplayLabel); } else { sDisplayLabel.Ref(LoadResStr("IDS_MSG_NOPORTRAIT")); } // insert linebreaks into label text int32_t iLineHgt = Max<int32_t>( pUseFont->BreakMessage(sDisplayLabel.getData(), ImagePreviewSize - 6, &sFilenameLabelText, false), 1); // set size SetBounds(C4Rect(0, 0, ImagePreviewSize, ImagePreviewSize + iLineHgt)); }
void Screen::DrawToolTip(const char *szTip, C4FacetEx &cgo, int32_t x, int32_t y) { CStdFont *pUseFont = &(GetRes()->TooltipFont); StdStrBuf sText; pUseFont->BreakMessage(szTip, Min<int32_t>(C4GUI_MaxToolTipWdt, Max<int32_t>(cgo.Wdt, 50)), &sText, true); // get tooltip rect int32_t tWdt,tHgt; if (pUseFont->GetTextExtent(sText.getData(), tWdt, tHgt, true)) { tWdt+=6; tHgt+=4; int32_t tX, tY; if (y < cgo.Y+cgo.TargetY+tHgt+5) tY = Min<int32_t>(y+5, cgo.TargetY+cgo.Hgt-tHgt); else tY = y-tHgt-5; tX = BoundBy<int32_t>(x-tWdt/2, cgo.TargetX+cgo.X, cgo.TargetX+cgo.Wdt-tWdt); // draw tooltip box lpDDraw->DrawBoxDw(cgo.Surface, tX,tY,tX+tWdt-1,tY+tHgt-2, C4GUI_ToolTipBGColor); lpDDraw->DrawFrameDw(cgo.Surface, tX,tY,tX+tWdt-1,tY+tHgt-1, C4GUI_ToolTipFrameColor); // draw tooltip lpDDraw->TextOut(sText.getData(), *pUseFont, 1.0f, cgo.Surface, tX+3,tY+1, C4GUI_ToolTipColor, ALeft); // while there's a tooltip, redraw the bg, because it might overlap Game.GraphicsSystem.InvalidateBg(); } }
void C4StartupNetListEntry::UpdateText() { bool fRestackElements=false; CStdFont *pUseFont = &(::GraphicsResource.TextFont); // adjust icons int32_t sx=iInfoIconCount*pUseFont->GetLineHeight(); int32_t i; for (i=iInfoIconCount; i<MaxInfoIconCount; ++i) { pInfoIcons[i]->SetIcon(C4GUI::Ico_None); pInfoIcons[i]->SetToolTip(nullptr); } // text to labels for (i=0; i<InfoLabelCount; ++i) { int iAvailableWdt = GetClientRect().Wdt - pInfoLbl[i]->GetBounds().x - 1; if (!i) iAvailableWdt -= sx; StdStrBuf BrokenText; pUseFont->BreakMessage(sInfoText[i].getData(), iAvailableWdt, &BrokenText, true); int32_t iHgt, iWdt; if (pUseFont->GetTextExtent(BrokenText.getData(), iWdt, iHgt, true)) { if ((pInfoLbl[i]->GetBounds().Hgt != iHgt) || (pInfoLbl[i]->GetBounds().Wdt != iAvailableWdt)) { C4Rect rcBounds = pInfoLbl[i]->GetBounds(); rcBounds.Wdt = iAvailableWdt; rcBounds.Hgt = iHgt; pInfoLbl[i]->SetBounds(rcBounds); fRestackElements = true; } } pInfoLbl[i]->SetText(BrokenText.getData()); pInfoLbl[i]->SetColor(fIsEnabled ? C4GUI_MessageFontClr : C4GUI_InactMessageFontClr); } if (fRestackElements) UpdateEntrySize(); }