void DrawSmartText(Draw& draw, int x, int y, int cx, const char *text, Font font, Color ink, int accesskey) { if(*text == '\1') { RichText txt = ParseQTF(text + 1, accesskey); txt.ApplyZoom(GetRichTextStdScreenZoom()); txt.Paint(Zoom(1, 1), draw, x, y, cx); return; } DrawTLText(draw, x, y, cx, ToUnicode(text, CHARSET_DEFAULT), font, ink, accesskey); }
Size QTFDisplayCls::RatioSize(const Value& q, int cx, int cy) const { if(cy == 0 && cx > 0) { RichText txt = ParseQTF((String)q); txt.ApplyZoom(GetRichTextStdScreenZoom()); return Size(cx, txt.GetHeight(Zoom(1, 1), cx)); } return GetStdSize(q); }
Size QTFDisplayCls::GetStdSize(const Value& q) const { Size sz; RichText txt = ParseQTF((String)q); txt.ApplyZoom(GetRichTextStdScreenZoom()); sz.cx = txt.GetWidth(); sz.cy = txt.GetHeight(Zoom(1, 1), sz.cx); return sz; }
Size GetSmartTextSize(const char *text, Font font, int cx) { if(*text == '\1') { Size sz; RichText txt = ParseQTF(text + 1); txt.ApplyZoom(GetRichTextStdScreenZoom()); sz.cx = min(cx, txt.GetWidth()); sz.cy = txt.GetHeight(Zoom(1, 1), sz.cx); return sz; } return GetTLTextSize(ToUnicode(text, CHARSET_DEFAULT), font); }
void QTFDisplayCls::Paint(Draw& draw, const Rect& r, const Value& v, Color ink, Color paper, dword style) const { String s; s << "[@(" << ink.GetR() << "." << ink.GetG() << "." << ink.GetB() << ") " << v; RichText rtext = ParseQTF(s); rtext.ApplyZoom(GetRichTextStdScreenZoom()); draw.DrawRect(r, paper); draw.Clipoff(r); rtext.Paint(Zoom(1, 1), draw, 0, 0, r.Width()); draw.End(); }
int GetRichTextScreenStdFontHeight() { static int gh = 67; ONCELOCK { for(int i = 0; i < 1000; i++) { int h = GetRichTextStdScreenZoom() * i; if(h > 0 && StdFont(h).GetCy() == StdFont().GetCy()) { gh = i; break; } } } return gh; }
int GetSmartTextHeight(const char *s, int cx, Font font) { if(*s == '\1') { Size sz; RichText txt = ParseQTF(s + 1); txt.ApplyZoom(GetRichTextStdScreenZoom()); return txt.GetHeight(Zoom(1, 1), cx); } int cy = font.Info().GetHeight(); int h = cy; while(*s) { if(*s == '\n') h += cy; s++; } return h; }
int Prompt(const char *title, const Image& iconbmp, const char *qtf, Callback HelpDlg, bool okcancel, const char *button1, const char *button2, const char *button3, const char *help, int cx) { int fcy = Draw::GetStdFontCy(); PromptDlgWnd__ dlg; RichTextCtrl qtfctrl; Icon icon; //qtfctrl.WhenLink = WhenLink; icon.SetImage(iconbmp); Button b1, b2, b3, bh; promptTopic = help; qtfctrl.SetQTF(String("[G1 ") + qtf, GetRichTextStdScreenZoom()); int bcy = 2 * fcy; int bcx = 6 * fcy; Size bsz = icon.GetStdSize(); if(cx == 0) { cx = qtfctrl.GetWidth(); if(!cx) cx = 350; cx += 2 * fcy; if(bsz.cx) cx += bsz.cx + fcy; } int nbtn = !!button1 + !!button2 + !!button3 + !!help; cx = min(550, max(nbtn * bcx + (1 + nbtn) * fcy, cx)); int qcx = cx - 2 * fcy; if(bsz.cx) qcx -= bsz.cx + fcy; int ccy = qtfctrl.GetHeight(qcx); int qcy = min(400, ccy); if(qcy <= ccy) { qcx += ScrollBarSize() + fcy; cx += ScrollBarSize(); } int mcy = max(qcy, bsz.cy); int cy = mcy + 4 * fcy; dlg.SetRect(Size(cx, cy)); fcy /= 2; dlg << icon.TopPos(fcy + (mcy - bsz.cy) / 2, bsz.cy).LeftPos(fcy, bsz.cx); dlg << qtfctrl.TopPos(fcy + (mcy - qcy) / 2, qcy).LeftPos(2 * fcy + bsz.cx, qcx); if(okcancel) b1.Ok(); b1.SetLabel(button1); b1.WhenAction = dlg.Breaker(1); b2.WhenAction = dlg.Breaker(0); b3.WhenAction = dlg.Breaker(-1); bh.WhenAction = HelpDlg; int nextx = 4; if(help) { bh.SetLabel(t_("?")); dlg << bh.RightPosZ(nextx, 80).BottomPosZ(4, 22); nextx += 84; } if(button2) { b2.SetLabel(button2); if(button3) { dlg << b3.SetLabel(button3).RightPosZ(nextx, 80).BottomPosZ(4, 22); nextx += 84; dlg << b2.RightPosZ(nextx, 80).BottomPosZ(4, 22); nextx += 84; if(okcancel) b3.Cancel(); } else { dlg << b2.RightPosZ(nextx, 80).BottomPosZ(4, 22); nextx += 84; if(okcancel) b2.Cancel(); } dlg << b1.RightPosZ(nextx, 80).BottomPosZ(4, 22); nextx += 84; } else { dlg << b1.RightPosZ(nextx, 80).BottomPosZ(4, 22); nextx += 84; } dlg.WhenClose = dlg.Breaker(button3 ? -1 : 0); dlg.Open(); dlg.Title(title); return dlg.RunAppModal(); }
int Prompt(Callback1<const String&> WhenLink, const char *title, const Image& iconbmp, const char *qtf, bool okcancel, const char *button1, const char *button2, const char *button3, int cx, Image im1, Image im2, Image im3) { int fcy = Draw::GetStdFontCy(); PromptDlgWnd__ dlg; RichTextCtrl qtfctrl; Icon icon; qtfctrl.WhenLink = WhenLink; icon.SetImage(iconbmp); Button b1, b2, b3; qtfctrl.SetQTF(String("[G1 ") + qtf, GetRichTextStdScreenZoom()); int bcy = Ctrl::VertLayoutZoom(24); int bcx = Ctrl::HorzLayoutZoom(72); if(button1) bcx = max(2 * fcy + GetTextSize(button1, Draw::GetStdFont()).cx, bcx); if(button2) bcx = max(2 * fcy + GetTextSize(button2, Draw::GetStdFont()).cx, bcx); if(button3) bcx = max(2 * fcy + GetTextSize(button3, Draw::GetStdFont()).cx, bcx); Size bsz = icon.GetStdSize(); if(cx == 0) { cx = qtfctrl.GetWidth(); if(!cx) cx = 350; cx += 2 * fcy; if(bsz.cx) cx += bsz.cx + fcy; } int nbtn = !!button1 + !!button2 + !!button3; dlg.esc = okcancel && nbtn == 1; cx = min(550, max(nbtn * bcx + (1 + nbtn) * fcy, cx)); int qcx = cx - 2 * fcy; if(bsz.cx) qcx -= bsz.cx + fcy; int ccy = qtfctrl.GetHeight(qcx); int qcy = min(400, ccy); if(qcy <= ccy) { qcx += ScrollBarSize() + fcy; cx += ScrollBarSize() + fcy; } int mcy = max(qcy, bsz.cy); int cy = mcy + 48 * fcy / 10; dlg.SetRect(Size(cx, cy)); dlg << icon.TopPos(fcy, bsz.cy).LeftPos(fcy, bsz.cx); dlg << qtfctrl.TopPos(fcy + (mcy - qcy) / 2, qcy).RightPos(fcy, qcx); if(okcancel) { b1.Ok(); if(nbtn == 2) b2.Cancel(); if(nbtn == 3) b3.Cancel(); } b1.WhenAction = dlg.Breaker(1); b2.WhenAction = dlg.Breaker(0); b3.WhenAction = dlg.Breaker(-1); dlg.b = &b1; int bx = bcx; int gap = fcy / 2; fcy = 8 * fcy / 10; if(button2) bx += gap + bcx; if(button3) bx += gap + bcx; bx = (cx - bx) / 2; if(SwapOKCancel()) { sAdd(dlg, fcy, bcy, bx, bcx, gap, b2, button2, im2); sAdd(dlg, fcy, bcy, bx, bcx, gap, b3, button3, im3); sAdd(dlg, fcy, bcy, bx, bcx, gap, b1, button1, im1); } else { sAdd(dlg, fcy, bcy, bx, bcx, gap, b1, button1, im1); sAdd(dlg, fcy, bcy, bx, bcx, gap, b2, button2, im2); sAdd(dlg, fcy, bcy, bx, bcx, gap, b3, button3, im3); } dlg.WhenClose = dlg.Breaker(button3 ? -1 : 0); dlg.Title(title); int result; Ctrl::Call(callback2(sExecutePrompt, &dlg, &result)); return result; }