ultimatepp/uppsrc/ide/IconDes/Text.cpp
2026-04-18 10:16:13 +02:00

111 lines
2.4 KiB
C++

#include "IconDes.h"
IconDes::TextDlg::TextDlg()
{
CtrlLayout(*this, "Text");
for(Ctrl *q = GetFirstChild(); q; q = q->GetNext())
if(!dynamic_cast<Button *>(q))
q->WhenAction = Proxy(WhenAction);
face.Add(Font::ARIAL);
face.Add(Font::ROMAN);
face.Add(Font::COURIER);
for(int i = Font::COURIER + 1; i < Font::GetFaceCount(); i++)
if(Font::GetFaceInfo(i) & Font::SCALEABLE)
face.Add(i);
SetupFaceList(face);
face <<= Font::ARIAL;
height.MinMax(4, 2000);
height <<= 12;
for(int i = 4; i < 300; i += i < 16 ? 1 : i < 32 ? 4 : i < 48 ? 8 : 16)
height.AddList(i);
symbol.SetImage(RichEditImg::InsertSymbol());
symbol << [=] {
Font fnt;
int c = SelectFontSymbol(fnt);
if(IsNull(c))
return;
text.Insert(c);
face <<= fnt.GetFace();
WhenAction();
};
}
Font IconDes::TextDlg::GetFont()
{
Font fnt(~face, ~height);
fnt.Bold(~bold);
fnt.Italic(~italic);
fnt.Underline(~underline);
fnt.Strikeout(~strikeout);
fnt.NonAntiAliased(~nonaa);
return fnt;
}
void IconDes::CloseText()
{
if(textdlg.IsOpen())
textdlg.Close();
SetBar();
}
void IconDes::PasteText()
{
if(!IsCurrent() || !IsPasting() || !textdlg.IsOpen())
return;
WString text = ~textdlg.text;
Font font = textdlg.GetFont();
Size tsz = GetTextSize(text, font);
tsz.cx += tsz.cy / 3;
Image img;
if(textdlg.outline) {
ImagePainter iw(tsz + 2 * pen, textdlg.nonaa ? MODE_NOAA : MODE_ANTIALIASED);
iw.Clear();
iw.Text(pen, pen, text, font).Stroke(pen, CurrentColor());
img = iw;
}
else {
ImageDraw iw(tsz);
iw.Alpha().DrawText(0, 0, text, font, GrayColor(CurrentColor().a));
iw.DrawRect(tsz, CurrentColor());
img = iw;
}
#ifdef PLATFORM_WIN32 // non-antialiased works
Current().paste_image = img;
#else
if(!font.IsNonAntiAliased())
Current().paste_image = img;
else {
ImageBuffer ib(img);
RGBA cc = CurrentColor();
for(RGBA& c : ib)
c = c.a < 128 ? RGBAZero() : cc;
Current().paste_image = ib;
}
#endif
MakePaste();
}
void IconDes::Text()
{
if(textdlg.IsOpen())
textdlg.Close();
else {
ONCELOCK {
Rect r = GetScreenView();
Size sz = textdlg.GetLayoutSize();
r.left = r.left + (r.GetWidth() - sz.cx) / 2;
r.right = r.left + sz.cx;
r.top = r.bottom - sz.cy;
textdlg.NoCenter().SetRect(r);
}
Paste(CreateImage(Size(1, 1), RGBAZero()));
textdlg.nonaa = Current().flags & IML_IMAGE_FLAG_S3;
textdlg.WhenClose = THISBACK(CloseText);
textdlg <<= THISBACK(PasteText);
textdlg.Open();
PasteText();
}
SetBar();
}