- fix: crash when input using input method in an empty file.
- optimize for ligature and force monospace both enabled.
This commit is contained in:
parent
8b0c53dc69
commit
0a4acbec46
|
@ -836,6 +836,8 @@ QString Document::glyph(int line, int glyphIdx)
|
|||
QString Document::glyphAt(int line, int charPos)
|
||||
{
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (line<0 || line>=count())
|
||||
return QString();
|
||||
QList<int> glyphStartCharList = mLines[line]->glyphStartCharList();
|
||||
int glyphIdx = charToGlyphIndex(mLines[line]->lineText(), glyphStartCharList, charPos);
|
||||
return mLines[line]->glyph(glyphIdx);
|
||||
|
@ -844,6 +846,8 @@ QString Document::glyphAt(int line, int charPos)
|
|||
int Document::charToGlyphStartChar(int line, int charPos)
|
||||
{
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (line<0 || line>=count())
|
||||
return 0;
|
||||
QList<int> glyphStartCharList = mLines[line]->glyphStartCharList();
|
||||
int glyphIdx = charToGlyphIndex(mLines[line]->lineText(), glyphStartCharList, charPos);
|
||||
return mLines[line]->glyphStartChar(glyphIdx);
|
||||
|
@ -1029,6 +1033,8 @@ int Document::xposToGlyphIndex(int strWidth, QList<int> glyphPositionList, int x
|
|||
int Document::charToGlyphStartPosition(int line, int charPos)
|
||||
{
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (line<0 || line>=count())
|
||||
return 0;
|
||||
QList<int> glyphStartCharList = mLines[line]->glyphStartCharList();
|
||||
int glyphIdx = charToGlyphIndex(mLines[line]->lineText(), glyphStartCharList, charPos);
|
||||
return mLines[line]->glyphStartPosition(glyphIdx);
|
||||
|
@ -1047,7 +1053,7 @@ int Document::xposToGlyphStartChar(int line, int xpos)
|
|||
int Document::charToGlyphStartPosition(int line, const QString newStr, int charPos)
|
||||
{
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (mLines[line]->lineText() == newStr) {
|
||||
if (line>=0 && line<count() && mLines[line]->lineText() == newStr) {
|
||||
return charToGlyphStartPosition(line,charPos);
|
||||
} else {
|
||||
QList<int> glyphStartCharList = calcGlyphStartCharList(newStr);
|
||||
|
|
|
@ -379,13 +379,13 @@ void QSynEditPainter::paintToken(
|
|||
bool tryLigature = false;
|
||||
if (glyph.length()==0) {
|
||||
} else if (glyph.length()==1 && glyph.front().unicode()<=32){
|
||||
} else if (mEdit->mOptions.testFlag(eoForceMonospace)
|
||||
&& glyphWidth != mPainter->fontMetrics().horizontalAdvance(glyph)) {
|
||||
} else {
|
||||
tryLigature = true;
|
||||
}
|
||||
if (tryLigature) {
|
||||
QString textToPaint = glyph;
|
||||
int oldGlyphWidth = glyphWidth;
|
||||
int oldI = i;
|
||||
while(i+1<endGlyph) {
|
||||
int glyphStart = glyphStartCharList[i+1];
|
||||
int glyphLen = calcSegmentInterval(glyphStartCharList,lineText.length(),i+1);
|
||||
|
@ -395,16 +395,20 @@ void QSynEditPainter::paintToken(
|
|||
if ( glyph2.length()<1
|
||||
||
|
||||
(glyph2.length()==1
|
||||
&& glyph2.front().unicode()<32))
|
||||
&& glyph2.front().unicode()<=32))
|
||||
break;
|
||||
i+=1;
|
||||
glyphWidth += calcSegmentInterval(glyphStartPositionList, tokenRight, i);
|
||||
textToPaint+=glyph2;
|
||||
int glyph2Width = calcSegmentInterval(glyphStartPositionList, tokenRight, i+1);
|
||||
if (mEdit->mOptions.testFlag(eoForceMonospace)) {
|
||||
if (glyphWidth+glyph2Width != mPainter->fontMetrics().horizontalAdvance(textToPaint+glyph2)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
glyphWidth += glyph2Width;
|
||||
textToPaint += glyph2;
|
||||
if (tokenWidth + glyphWidth > last )
|
||||
break;
|
||||
}
|
||||
if (glyphWidth
|
||||
== mPainter->fontMetrics().horizontalAdvance(textToPaint)) {
|
||||
if (!fontInited) {
|
||||
mPainter->setFont(font);
|
||||
fontInited = true;
|
||||
|
@ -412,10 +416,6 @@ void QSynEditPainter::paintToken(
|
|||
//qDebug()<<"paint 1:"<<textToPaint;
|
||||
mPainter->drawText(nX,rcToken.bottom()-mPainter->fontMetrics().descent() , textToPaint);
|
||||
drawed = true;
|
||||
} else {
|
||||
glyphWidth = oldGlyphWidth;
|
||||
i=oldI;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!drawed) {
|
||||
|
|
|
@ -864,14 +864,12 @@ QString QSynEdit::GetLeftSpacing(int charCount, bool wantTabs) const
|
|||
|
||||
int QSynEdit::charToGlyphLeft(int line, int charPos) const
|
||||
{
|
||||
Q_ASSERT(line>=1 && line <= mDocument->count());
|
||||
QString s = getDisplayStringAtLine(line);
|
||||
return mDocument->charToGlyphStartPosition(line-1, s, charPos-1);
|
||||
}
|
||||
|
||||
int QSynEdit::charToGlyphLeft(int line, const QString &s, int charPos) const
|
||||
{
|
||||
Q_ASSERT(line>=1 && line <= mDocument->count());
|
||||
return mDocument->charToGlyphStartPosition(line-1, s, charPos-1);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue