mCursorBlinkEnabled( true ),
mGrabHandleEnabled( true ),
mGrabHandlePopupEnabled( true ),
- mSelectionEnabled( false ),
+ mSelectionEnabled( true ),
mHorizontalScrollingEnabled( true ),
mVerticalScrollingEnabled( false ),
mUpdateCursorPosition( false )
2u == tapCount )
{
ChangeState( SELECTING );
+
+ RepositionSelectionHandles( event.p2.mFloat, event.p3.mFloat );
}
}
}
}
+ void RepositionSelectionHandles( float visualX, float visualY )
+ {
+ // TODO - Find which word was selected
+
+ const Vector<GlyphInfo>& glyphs = mVisualModel->mGlyphs;
+ const Vector<Vector2>::SizeType glyphCount = glyphs.Count();
+
+ const Vector<Vector2>& positions = mVisualModel->mGlyphPositions;
+ const Vector<Vector2>::SizeType positionCount = positions.Count();
+
+ // Guard against glyphs which did not fit inside the layout
+ const Vector<Vector2>::SizeType count = (positionCount < glyphCount) ? positionCount : glyphCount;
+
+ if( count )
+ {
+ float primaryX = positions[0].x;
+ float secondaryX = positions[count-1].x + glyphs[count-1].width;
+
+ // TODO - multi-line selection
+ const Vector<LineRun>& lines = mVisualModel->mLines;
+ float height = lines.Count() ? lines[0].lineSize.height : 0.0f;
+
+ mDecorator->SetPosition( PRIMARY_SELECTION_HANDLE, primaryX, 0.0f, height );
+ mDecorator->SetPosition( SECONDARY_SELECTION_HANDLE, secondaryX, 0.0f, height );
+
+ mDecorator->ClearHighlights();
+ mDecorator->AddHighlight( primaryX, 0.0f, secondaryX, height );
+ }
+ }
+
void ChangeState( State newState )
{
if( mState != newState )
totalHeight += lines[lineIndex].lineSize.height;
if( y < totalHeight )
{
- break;
+ return lineIndex;
}
}
- return lineIndex;
+ return lineIndex-1;
}
void GetClosestCursorPosition( CharacterIndex& logical, float& visualX, float& visualY, float& height )
float visualX( 0.0f );
float visualY( 0.0f );
- LineIndex lineIndex( 0u );
+ float height( 0.0f );
const Vector<LineRun>& lineRuns = mVisualModel->mLines;
if( cursorGlyph > 0 )
visualX += mVisualModel->mGlyphs[ cursorGlyph ].width;
// Find the line height
- for( GlyphIndex lastGlyph = 0; lineIndex < lineRuns.Count(); ++lineIndex )
+ GlyphIndex lastGlyph( 0 );
+ for( LineIndex lineIndex = 0u; lineIndex < lineRuns.Count(); ++lineIndex )
{
lastGlyph = (lineRuns[lineIndex].glyphIndex + lineRuns[lineIndex].numberOfGlyphs);
if( cursorGlyph < lastGlyph )
{
+ height = lineRuns[lineIndex].lineSize.height;
break;
}
}
}
- mDecorator->SetPosition( PRIMARY_CURSOR, visualX, visualY, lineRuns[lineIndex].lineSize.height );
+ mDecorator->SetPosition( PRIMARY_CURSOR, visualX, visualY, height );
mDecoratorUpdated = true;
}