diff --git a/src/main/scala/ocelot/desktop/ui/widget/TextInput.scala b/src/main/scala/ocelot/desktop/ui/widget/TextInput.scala index 5e9f486..4f35a7b 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/TextInput.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/TextInput.scala @@ -181,8 +181,15 @@ class TextInput(val initialText: String = "") extends Widget with MouseHandler w selectWord() case DragEvent(DragEvent.State.Start | DragEvent.State.Drag, MouseEvent.Button.Left, mouse) if isFocused => - val pos = pixelToCursorPosition(mouse.x - bounds.x) - selection = Selection(selection.fold(prevCursorPosition.value)(_.start), pos) + val pos = if (mouse.y < bounds.y) { + 0 + } else if (mouse.y > bounds.max.y) { + _text.chars.length + } else { + pixelToCursorPosition(mouse.x - bounds.x) + } + + extendSelection(pos, prevCursorPosition.value) cursor.position = pos case event @ KeyEvent(KeyEvent.State.Press | KeyEvent.State.Repeat, Keyboard.KEY_LEFT, _) if isFocused => @@ -290,12 +297,16 @@ class TextInput(val initialText: String = "") extends Widget with MouseHandler w } pos } + + private def extendSelection(position: Int, cursorPosition: Int = cursor.position): Unit = { + selection = Selection(selection.fold(cursorPosition)(_.start), position) + } private def handleKeyMovement(position: Int): Unit = { - selection = if (KeyEvents.isShiftDown) { - Selection(selection.fold(cursor.position)(_.start), position) + if (KeyEvents.isShiftDown) { + extendSelection(position) } else { - None + selection = None } cursor.position = position