ChatboxTextInput: support moving between lines with up/down keys
This commit is contained in:
@@ -119,7 +119,8 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
|||||||
|
|
||||||
// These are lambdas for atomic updates
|
// These are lambdas for atomic updates
|
||||||
private Predicate<MouseEvent> isInBounds = null;
|
private Predicate<MouseEvent> isInBounds = null;
|
||||||
private ToIntFunction<MouseEvent> getCharOffset = null;
|
private ToIntFunction<Integer> getLineOffset = null;
|
||||||
|
private ToIntFunction<Point> getPointCharOffset = null;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
protected ChatboxTextInput(ChatboxPanelManager chatboxPanelManager, ClientThread clientThread)
|
protected ChatboxTextInput(ChatboxPanelManager chatboxPanelManager, ClientThread clientThread)
|
||||||
@@ -441,15 +442,15 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
|||||||
net.runelite.api.Point ccl = container.getCanvasLocation();
|
net.runelite.api.Point ccl = container.getCanvasLocation();
|
||||||
|
|
||||||
isInBounds = ev -> bounds.contains(new Point(ev.getX() - ccl.getX(), ev.getY() - ccl.getY()));
|
isInBounds = ev -> bounds.contains(new Point(ev.getX() - ccl.getX(), ev.getY() - ccl.getY()));
|
||||||
getCharOffset = ev ->
|
getPointCharOffset = p ->
|
||||||
{
|
{
|
||||||
if (bounds.width <= 0)
|
if (bounds.width <= 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cx = ev.getX() - ccl.getX() - ox;
|
int cx = p.x - ccl.getX() - ox;
|
||||||
int cy = ev.getY() - ccl.getY() - oy;
|
int cy = p.y - ccl.getY() - oy;
|
||||||
|
|
||||||
int currentLine = Ints.constrainToRange(cy / oh, 0, editLines.size() - 1);
|
int currentLine = Ints.constrainToRange(cy / oh, 0, editLines.size() - 1);
|
||||||
|
|
||||||
@@ -491,6 +492,48 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
|||||||
charIndex = Ints.constrainToRange(charIndex, 0, tsValue.length());
|
charIndex = Ints.constrainToRange(charIndex, 0, tsValue.length());
|
||||||
return line.start + charIndex;
|
return line.start + charIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
getLineOffset = code ->
|
||||||
|
{
|
||||||
|
if (editLines.size() < 2)
|
||||||
|
{
|
||||||
|
return cursorStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentLine = -1;
|
||||||
|
for (int i = 0; i < editLines.size(); i++)
|
||||||
|
{
|
||||||
|
Line l = editLines.get(i);
|
||||||
|
if (cursorOnLine(cursorStart, l.start, l.end)
|
||||||
|
|| (cursorOnLine(cursorStart, l.start, l.end + 1) && i == editLines.size() - 1))
|
||||||
|
{
|
||||||
|
currentLine = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentLine == -1
|
||||||
|
|| (code == KeyEvent.VK_UP && currentLine == 0)
|
||||||
|
|| (code == KeyEvent.VK_DOWN && currentLine == editLines.size() - 1))
|
||||||
|
{
|
||||||
|
return cursorStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Line line = editLines.get(currentLine);
|
||||||
|
final int direction = code == KeyEvent.VK_UP ? -1 : 1;
|
||||||
|
final Point dest = new Point(cursor.getCanvasLocation().getX(), cursor.getCanvasLocation().getY() + (direction * oh));
|
||||||
|
final int charOffset = getPointCharOffset.applyAsInt(dest);
|
||||||
|
|
||||||
|
// Place cursor on right line if whitespace keep it on the same line or skip a line
|
||||||
|
final Line nextLine = editLines.get(currentLine + direction);
|
||||||
|
if ((direction == -1 && charOffset >= line.start)
|
||||||
|
|| (direction == 1 && (charOffset > nextLine.end && (currentLine + direction != editLines.size() - 1))))
|
||||||
|
{
|
||||||
|
return nextLine.end;
|
||||||
|
}
|
||||||
|
|
||||||
|
return charOffset;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean cursorOnLine(final int cursor, final int start, final int end)
|
private boolean cursorOnLine(final int cursor, final int start, final int end)
|
||||||
@@ -498,6 +541,16 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
|||||||
return (cursor >= start) && (cursor <= end);
|
return (cursor >= start) && (cursor <= end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getCharOffset(MouseEvent ev)
|
||||||
|
{
|
||||||
|
if (getPointCharOffset == null)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getPointCharOffset.applyAsInt(ev.getPoint());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void open()
|
protected void open()
|
||||||
{
|
{
|
||||||
@@ -668,6 +721,14 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
|||||||
ev.consume();
|
ev.consume();
|
||||||
newPos++;
|
newPos++;
|
||||||
break;
|
break;
|
||||||
|
case KeyEvent.VK_UP:
|
||||||
|
ev.consume();
|
||||||
|
newPos = getLineOffset.applyAsInt(code);
|
||||||
|
break;
|
||||||
|
case KeyEvent.VK_DOWN:
|
||||||
|
ev.consume();
|
||||||
|
newPos = getLineOffset.applyAsInt(code);
|
||||||
|
break;
|
||||||
case KeyEvent.VK_HOME:
|
case KeyEvent.VK_HOME:
|
||||||
ev.consume();
|
ev.consume();
|
||||||
newPos = 0;
|
newPos = 0;
|
||||||
@@ -739,12 +800,12 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
|||||||
{
|
{
|
||||||
selectionStart = -1;
|
selectionStart = -1;
|
||||||
selectionEnd = -1;
|
selectionEnd = -1;
|
||||||
cursorAt(getCharOffset.applyAsInt(mouseEvent));
|
cursorAt(getCharOffset(mouseEvent));
|
||||||
}
|
}
|
||||||
return mouseEvent;
|
return mouseEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nco = getCharOffset.applyAsInt(mouseEvent);
|
int nco = getCharOffset(mouseEvent);
|
||||||
|
|
||||||
if (mouseEvent.isShiftDown() && selectionEnd != -1)
|
if (mouseEvent.isShiftDown() && selectionEnd != -1)
|
||||||
{
|
{
|
||||||
@@ -786,7 +847,7 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
|||||||
return mouseEvent;
|
return mouseEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nco = getCharOffset.applyAsInt(mouseEvent);
|
int nco = getCharOffset(mouseEvent);
|
||||||
if (selectionStart != -1)
|
if (selectionStart != -1)
|
||||||
{
|
{
|
||||||
selectionEnd = nco;
|
selectionEnd = nco;
|
||||||
|
|||||||
Reference in New Issue
Block a user