And filled in the new functions on GTK+. Not quite right yet...
This commit is contained in:
parent
5458e10134
commit
d53bc88f50
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
// TODO have a ligature
|
// TODO have a ligature
|
||||||
// TODO allow clicking on the end of a line to put the caret there
|
// TODO allow clicking on the end of a line to put the caret there
|
||||||
|
// TODO the hiding and showing does not work properly on GTK+
|
||||||
|
|
||||||
static const char *text =
|
static const char *text =
|
||||||
"Each of the glyphs an end user interacts with are called graphemes. "
|
"Each of the glyphs an end user interacts with are called graphemes. "
|
||||||
|
@ -172,12 +173,12 @@ static void mouse(uiAreaMouseEvent *e)
|
||||||
// urgh %zd is not supported by MSVC with sprintf()
|
// urgh %zd is not supported by MSVC with sprintf()
|
||||||
// TODO get that part in test/ about having no other option
|
// TODO get that part in test/ about having no other option
|
||||||
// TODO byte 1 is actually byte 684?!
|
// TODO byte 1 is actually byte 684?!
|
||||||
/* sprintf(labelText, "pos %d line %d x position %s y position %s",
|
sprintf(labelText, "pos %d line %d x %g",// x position %s y position %s",
|
||||||
(int) (res.Pos), res.Line,
|
(int) pos, caretLine, caretX);
|
||||||
|
/* (int) (res.Pos), res.Line,
|
||||||
positions[res.XPosition],
|
positions[res.XPosition],
|
||||||
positions[res.YPosition]);
|
positions[res.YPosition]);
|
||||||
*/ sprintf(labelText, "TODO\n");
|
*/ uiLabelSetText(caretLabel, labelText);
|
||||||
uiLabelSetText(caretLabel, labelText);
|
|
||||||
|
|
||||||
/* cursorX = res.CaretX;
|
/* cursorX = res.CaretX;
|
||||||
cursorY = res.CaretY;
|
cursorY = res.CaretY;
|
||||||
|
|
|
@ -187,6 +187,8 @@ void uiDrawTextLayoutLineGetMetrics(uiDrawTextLayout *tl, int line, uiDrawTextLa
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 0 /* TODO */
|
||||||
|
|
||||||
// caret behavior, based on GtkTextView (both 2 and 3) and Qt's text views (both 4 and 5), which are all based on TkTextView:
|
// caret behavior, based on GtkTextView (both 2 and 3) and Qt's text views (both 4 and 5), which are all based on TkTextView:
|
||||||
// - clicking on the right side of a line places the cursor at the beginning of the LAST grapheme on the line
|
// - clicking on the right side of a line places the cursor at the beginning of the LAST grapheme on the line
|
||||||
// - pressing Right goes to the first grapheme of the next line, pressing Left goes back to the last grapheme of the original line
|
// - pressing Right goes to the first grapheme of the next line, pressing Left goes back to the last grapheme of the original line
|
||||||
|
@ -264,3 +266,63 @@ void uiDrawTextLayoutByteRangeToRectangle(uiDrawTextLayout *tl, size_t start, si
|
||||||
|
|
||||||
// TODO unref pll?
|
// TODO unref pll?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// this algorithm comes from Microsoft's PadWrite sample, following TextEditor::SetSelectionFromPoint()
|
||||||
|
// TODO this or the next one doesn't work right for the end of a line? it still behaves like TkTextView...
|
||||||
|
void uiDrawTextLayoutHitTest(uiDrawTextLayout *tl, double x, double y, size_t *pos, int *line)
|
||||||
|
{
|
||||||
|
int p, trailing;
|
||||||
|
|
||||||
|
pango_layout_xy_to_index(tl->layout,
|
||||||
|
cairoToPango(x), cairoToPango(y),
|
||||||
|
&p, &trailing);
|
||||||
|
// on a trailing hit, align to the nearest cluster
|
||||||
|
// fortunately Pango provides that info directly
|
||||||
|
if (trailing != 0)
|
||||||
|
p += trailing;
|
||||||
|
if (pos != NULL)
|
||||||
|
*pos = p;
|
||||||
|
|
||||||
|
// TODO do the line detection unconditionally?
|
||||||
|
// TODO optimize the call to pango_layout_get_line_count()
|
||||||
|
if (line != NULL) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < pango_layout_get_line_count(tl->layout); i++) {
|
||||||
|
double ltop, lbottom;
|
||||||
|
|
||||||
|
ltop = tl->lineMetrics[i].Y;
|
||||||
|
lbottom = ltop + tl->lineMetrics[i].Height;
|
||||||
|
// y will already >= ltop at this point since the past lbottom should == ltop
|
||||||
|
if (y < lbottom)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == pango_layout_get_line_count(tl->layout))
|
||||||
|
i--;
|
||||||
|
*line = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO find a good API for indicating that this character isn't on the line for when the layout is resized and doing that recalculation...
|
||||||
|
double uiDrawTextLayoutByteLocationInLine(uiDrawTextLayout *tl, size_t pos, int line)
|
||||||
|
{
|
||||||
|
PangoLayoutLine *pll;
|
||||||
|
gboolean trailing;
|
||||||
|
int pangox;
|
||||||
|
|
||||||
|
pll = pango_layout_get_line_readonly(tl->layout, line);
|
||||||
|
// this behavior seems correct
|
||||||
|
// there's also PadWrite's TextEditor::GetCaretRect() but that requires state...
|
||||||
|
// TODO where does this fail?
|
||||||
|
// TODO optimize everything to avoid calling strlen()
|
||||||
|
trailing = 0;
|
||||||
|
if (pos != 0 && pos != strlen(pango_layout_get_text(tl->layout)) && pos == (pll->start_index + pll->length)) {
|
||||||
|
pos--;
|
||||||
|
trailing = 1;
|
||||||
|
}
|
||||||
|
pango_layout_line_index_to_x(pll, pos, trailing, &pangox);
|
||||||
|
// TODO unref pll?
|
||||||
|
return pangoToCairo(pangox);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue