290 lines
7.1 KiB
C
290 lines
7.1 KiB
C
// 22 december 2015
|
|
#include "test.h"
|
|
|
|
static uiEntry *textString;
|
|
static uiEntry *textFont;
|
|
static uiEntry *textSize;
|
|
static uiCombobox *textWeight;
|
|
static uiCombobox *textItalic;
|
|
static uiCheckbox *textSmallCaps;
|
|
static uiCombobox *textStretch;
|
|
static uiEntry *textWidth;
|
|
static uiButton *textApply;
|
|
static uiCheckbox *addLeading;
|
|
static uiArea *textArea;
|
|
static uiAreaHandler textAreaHandler;
|
|
|
|
static double entryDouble(uiEntry *e)
|
|
{
|
|
char *s;
|
|
double d;
|
|
|
|
s = uiEntryText(e);
|
|
d = atof(s);
|
|
uiFreeText(s);
|
|
return d;
|
|
}
|
|
|
|
static void drawGuides(uiDrawContext *c, uiDrawTextFontMetrics *m)
|
|
{
|
|
uiDrawPath *p;
|
|
uiDrawBrush b;
|
|
uiDrawStrokeParams sp;
|
|
double leading;
|
|
double y;
|
|
|
|
leading = 0;
|
|
if (uiCheckboxChecked(addLeading))
|
|
leading = m->Leading;
|
|
|
|
memset(&b, 0, sizeof (uiDrawBrush));
|
|
b.Type = uiDrawBrushTypeSolid;
|
|
memset(&sp, 0, sizeof (uiDrawStrokeParams));
|
|
sp.Cap = uiDrawLineCapFlat;
|
|
sp.Join = uiDrawLineJoinMiter;
|
|
sp.MiterLimit = uiDrawDefaultMiterLimit;
|
|
sp.Thickness = 2;
|
|
|
|
uiDrawSave(c);
|
|
|
|
p = uiDrawNewPath(uiDrawFillModeWinding);
|
|
y = 10;
|
|
uiDrawPathNewFigure(p, 8, y);
|
|
y += m->Ascent;
|
|
uiDrawPathLineTo(p, 8, y);
|
|
uiDrawPathEnd(p);
|
|
b.R = 0.94;
|
|
b.G = 0.5;
|
|
b.B = 0.5;
|
|
b.A = 1.0;
|
|
uiDrawStroke(c, p, &b, &sp);
|
|
uiDrawFreePath(p);
|
|
|
|
p = uiDrawNewPath(uiDrawFillModeWinding);
|
|
uiDrawPathNewFigure(p, 8, y);
|
|
y += m->Descent;
|
|
uiDrawPathLineTo(p, 8, y);
|
|
uiDrawPathEnd(p);
|
|
b.R = 0.12;
|
|
b.G = 0.56;
|
|
b.B = 1.0;
|
|
b.A = 1.0;
|
|
uiDrawStroke(c, p, &b, &sp);
|
|
uiDrawFreePath(p);
|
|
|
|
// and again for the second line
|
|
p = uiDrawNewPath(uiDrawFillModeWinding);
|
|
y += leading;
|
|
uiDrawPathNewFigure(p, 8, y);
|
|
y += m->Ascent;
|
|
uiDrawPathLineTo(p, 8, y);
|
|
uiDrawPathEnd(p);
|
|
b.R = 0.94;
|
|
b.G = 0.5;
|
|
b.B = 0.5;
|
|
b.A = 0.75;
|
|
uiDrawStroke(c, p, &b, &sp);
|
|
uiDrawFreePath(p);
|
|
|
|
p = uiDrawNewPath(uiDrawFillModeWinding);
|
|
uiDrawPathNewFigure(p, 8, y);
|
|
y += m->Descent;
|
|
uiDrawPathLineTo(p, 8, y);
|
|
uiDrawPathEnd(p);
|
|
b.R = 0.12;
|
|
b.G = 0.56;
|
|
b.B = 1.0;
|
|
b.A = 0.75;
|
|
uiDrawStroke(c, p, &b, &sp);
|
|
uiDrawFreePath(p);
|
|
|
|
// and a box to text layout top-left corners
|
|
p = uiDrawNewPath(uiDrawFillModeWinding);
|
|
uiDrawPathAddRectangle(p, 0, 0, 10, 10);
|
|
uiDrawPathEnd(p);
|
|
uiDrawClip(c, p);
|
|
b.R = 0.85;
|
|
b.G = 0.65;
|
|
b.B = 0.13;
|
|
b.A = 1.0;
|
|
uiDrawStroke(c, p, &b, &sp);
|
|
uiDrawFreePath(p);
|
|
|
|
uiDrawRestore(c);
|
|
}
|
|
|
|
static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *dp)
|
|
{
|
|
uiDrawTextFontDescriptor desc;
|
|
uiDrawTextFont *font;
|
|
char *s;
|
|
char *family; // make compiler happy
|
|
uiDrawTextLayout *layout;
|
|
uiDrawTextFontMetrics metrics;
|
|
double ypos;
|
|
double width;
|
|
double height;
|
|
|
|
memset(&desc, 0, sizeof (uiDrawTextFontDescriptor));
|
|
family = uiEntryText(textFont);
|
|
desc.Family = family;
|
|
desc.Size = entryDouble(textSize);
|
|
desc.Weight = uiComboboxSelected(textWeight);
|
|
desc.Italic = uiComboboxSelected(textItalic);
|
|
desc.Stretch = uiComboboxSelected(textStretch);
|
|
font = uiDrawLoadClosestFont(&desc);
|
|
uiFreeText(family);
|
|
uiDrawTextFontGetMetrics(font, &metrics);
|
|
|
|
width = entryDouble(textWidth);
|
|
|
|
drawGuides(dp->Context, &metrics);
|
|
|
|
s = uiEntryText(textString);
|
|
layout = uiDrawNewTextLayout(s, font, width);
|
|
uiFreeText(s);
|
|
if (uiCheckboxChecked(textSmallCaps))
|
|
; // TODO
|
|
ypos = 10;
|
|
uiDrawText(dp->Context, 10, ypos, layout);
|
|
// TODO make these optional?
|
|
uiDrawTextLayoutExtents(layout, &width, &height);
|
|
uiDrawFreeTextLayout(layout);
|
|
|
|
layout = uiDrawNewTextLayout("This is a second line", font, -1);
|
|
if (/*TODO reuse width*/entryDouble(textWidth) < 0) {
|
|
double ad;
|
|
|
|
ad = metrics.Ascent + metrics.Descent;
|
|
printf("ad:%g extent:%g\n", ad, height);
|
|
}
|
|
ypos += height;
|
|
if (uiCheckboxChecked(addLeading))
|
|
ypos += metrics.Leading;
|
|
uiDrawText(dp->Context, 10, ypos, layout);
|
|
uiDrawFreeTextLayout(layout);
|
|
|
|
uiDrawFreeTextFont(font);
|
|
}
|
|
|
|
static void handlerMouseEvent(uiAreaHandler *a, uiArea *area, uiAreaMouseEvent *e)
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
static void handlerMouseCrossed(uiAreaHandler *ah, uiArea *a, int left)
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
static void handlerDragBroken(uiAreaHandler *ah, uiArea *a)
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
static int handlerKeyEvent(uiAreaHandler *ah, uiArea *a, uiAreaKeyEvent *e)
|
|
{
|
|
// do nothing
|
|
return 0;
|
|
}
|
|
|
|
static void onTextApply(uiButton *b, void *data)
|
|
{
|
|
uiAreaQueueRedrawAll(textArea);
|
|
}
|
|
|
|
uiBox *makePage9(void)
|
|
{
|
|
uiBox *page9;
|
|
uiBox *vbox;
|
|
uiBox *hbox;
|
|
|
|
page9 = newVerticalBox();
|
|
vbox = page9;
|
|
|
|
hbox = newHorizontalBox();
|
|
uiBoxAppend(vbox, uiControl(hbox), 0);
|
|
|
|
textString = uiNewEntry();
|
|
// TODO make it placeholder
|
|
uiEntrySetText(textString, "Enter text here");
|
|
uiBoxAppend(hbox, uiControl(textString), 1);
|
|
|
|
textFont = uiNewEntry();
|
|
uiEntrySetText(textFont, "Arial");
|
|
uiBoxAppend(hbox, uiControl(textFont), 1);
|
|
|
|
textSize = uiNewEntry();
|
|
uiEntrySetText(textSize, "10");
|
|
uiBoxAppend(hbox, uiControl(textSize), 1);
|
|
|
|
hbox = newHorizontalBox();
|
|
uiBoxAppend(vbox, uiControl(hbox), 0);
|
|
|
|
textWeight = uiNewCombobox();
|
|
uiComboboxAppend(textWeight, "Thin");
|
|
uiComboboxAppend(textWeight, "Ultra Light");
|
|
uiComboboxAppend(textWeight, "Light");
|
|
uiComboboxAppend(textWeight, "Book");
|
|
uiComboboxAppend(textWeight, "Normal");
|
|
uiComboboxAppend(textWeight, "Medium");
|
|
uiComboboxAppend(textWeight, "Semi Bold");
|
|
uiComboboxAppend(textWeight, "Bold");
|
|
uiComboboxAppend(textWeight, "Ultra Bold");
|
|
uiComboboxAppend(textWeight, "Heavy");
|
|
uiComboboxAppend(textWeight, "Ultra Heavy");
|
|
uiComboboxSetSelected(textWeight, uiDrawTextWeightNormal);
|
|
uiBoxAppend(hbox, uiControl(textWeight), 1);
|
|
|
|
textItalic = uiNewCombobox();
|
|
uiComboboxAppend(textItalic, "Normal");
|
|
uiComboboxAppend(textItalic, "Oblique");
|
|
uiComboboxAppend(textItalic, "Italic");
|
|
uiComboboxSetSelected(textItalic, uiDrawTextItalicNormal);
|
|
uiBoxAppend(hbox, uiControl(textItalic), 1);
|
|
|
|
textSmallCaps = uiNewCheckbox("Small Caps");
|
|
uiBoxAppend(hbox, uiControl(textSmallCaps), 1);
|
|
|
|
hbox = newHorizontalBox();
|
|
uiBoxAppend(vbox, uiControl(hbox), 0);
|
|
|
|
textStretch = uiNewCombobox();
|
|
uiComboboxAppend(textStretch, "Ultra Condensed");
|
|
uiComboboxAppend(textStretch, "Extra Condensed");
|
|
uiComboboxAppend(textStretch, "Condensed");
|
|
uiComboboxAppend(textStretch, "Semi Condensed");
|
|
uiComboboxAppend(textStretch, "Normal");
|
|
uiComboboxAppend(textStretch, "Semi Expanded");
|
|
uiComboboxAppend(textStretch, "Expanded");
|
|
uiComboboxAppend(textStretch, "Extra Expanded");
|
|
uiComboboxAppend(textStretch, "Ultra Expanded");
|
|
uiComboboxSetSelected(textStretch, uiDrawTextStretchNormal);
|
|
uiBoxAppend(hbox, uiControl(textStretch), 1);
|
|
|
|
textWidth = uiNewEntry();
|
|
uiEntrySetText(textWidth, "-1");
|
|
uiBoxAppend(hbox, uiControl(textWidth), 1);
|
|
|
|
hbox = newHorizontalBox();
|
|
uiBoxAppend(vbox, uiControl(hbox), 0);
|
|
|
|
textApply = uiNewButton("Apply");
|
|
uiButtonOnClicked(textApply, onTextApply, NULL);
|
|
uiBoxAppend(hbox, uiControl(textApply), 1);
|
|
|
|
addLeading = uiNewCheckbox("Add Leading");
|
|
uiCheckboxSetChecked(addLeading, 1);
|
|
uiBoxAppend(hbox, uiControl(addLeading), 0);
|
|
|
|
textAreaHandler.Draw = handlerDraw;
|
|
textAreaHandler.MouseEvent = handlerMouseEvent;
|
|
textAreaHandler.MouseCrossed = handlerMouseCrossed;
|
|
textAreaHandler.DragBroken = handlerDragBroken;
|
|
textAreaHandler.KeyEvent = handlerKeyEvent;
|
|
textArea = uiNewArea(&textAreaHandler);
|
|
uiBoxAppend(vbox, uiControl(textArea), 1);
|
|
|
|
return page9;
|
|
}
|