mirror of https://github.com/termux/termux-app
Set orientation of HandleView in show (#1477)
* Place long press menu above selection Previously, the long press menu would cover the first line of the selection. * Flip selection handle at different positions depending on drag direction When the selection handle changes direction, the selection jumps to the new point of the handle. When the handle changes direction at the same place when you come from the left as from the right, that makes it impossible to select the characters which are at the position where it changes direction. With this change the handle remains pointing towards the edge further into the line when you drag it from the edge and against the center. * Set orientation of HandleView when showing it When you hold down on a word that starts or ends at the edge of the screen, the handle will appear outside of the screen. This happens because the orientation was only switched when the handle is dragged, so when it is shown it just used the same orientation as it had for the last selection. Relates to #334, but not sure if it fixes it completely.
This commit is contained in:
parent
b086270a5a
commit
35842cf4a6
|
@ -973,12 +973,12 @@ public final class TerminalView extends View {
|
|||
return mContainer.isShowing();
|
||||
}
|
||||
|
||||
private void checkChangedOrientation() {
|
||||
if (!mIsDragging) {
|
||||
private void checkChangedOrientation(int posX, boolean force) {
|
||||
if (!mIsDragging && !force) {
|
||||
return;
|
||||
}
|
||||
long millis = SystemClock.currentThreadTimeMillis();
|
||||
if (millis - mLastTime < 50) {
|
||||
if (millis - mLastTime < 50 && !force) {
|
||||
return;
|
||||
}
|
||||
mLastTime = millis;
|
||||
|
@ -1003,10 +1003,7 @@ public final class TerminalView extends View {
|
|||
return;
|
||||
}
|
||||
|
||||
final int[] coords = mTempCoords;
|
||||
hostView.getLocationInWindow(coords);
|
||||
final int posX = coords[0] + mPointX;
|
||||
if (posX < clip.left) {
|
||||
if (posX - mHandleWidth < clip.left) {
|
||||
changeOrientation(RIGHT);
|
||||
} else if (posX + mHandleWidth > clip.right) {
|
||||
changeOrientation(LEFT);
|
||||
|
@ -1050,13 +1047,14 @@ public final class TerminalView extends View {
|
|||
posY >= clip.top && posY <= clip.bottom;
|
||||
}
|
||||
|
||||
private void moveTo(int x, int y) {
|
||||
mPointX = x;
|
||||
private void moveTo(int x, int y, boolean forceOrientationCheck) {
|
||||
float oldHotspotX = mHotspotX;
|
||||
checkChangedOrientation(x, forceOrientationCheck);
|
||||
mPointX = (int) (x - (isShowing() ? oldHotspotX : mHotspotX));
|
||||
mPointY = y;
|
||||
checkChangedOrientation();
|
||||
if (isPositionVisible()) {
|
||||
int[] coords = null;
|
||||
if (mContainer.isShowing()) {
|
||||
if (isShowing()) {
|
||||
coords = mTempCoords;
|
||||
TerminalView.this.getLocationInWindow(coords);
|
||||
int x1 = coords[0] + mPointX;
|
||||
|
@ -1138,10 +1136,10 @@ public final class TerminalView extends View {
|
|||
return mIsDragging;
|
||||
}
|
||||
|
||||
void positionAtCursor(final int cx, final int cy) {
|
||||
int left = (int) (getPointX(cx) - mHotspotX);
|
||||
void positionAtCursor(final int cx, final int cy, boolean forceOrientationCheck) {
|
||||
int left = getPointX(cx);
|
||||
int bottom = getPointY(cy + 1);
|
||||
moveTo(left, bottom);
|
||||
moveTo(left, bottom, forceOrientationCheck);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1162,9 +1160,8 @@ public final class TerminalView extends View {
|
|||
|
||||
public void show() {
|
||||
mIsShowing = true;
|
||||
updatePosition();
|
||||
mStartHandle.show();
|
||||
mEndHandle.show();
|
||||
mStartHandle.positionAtCursor(mSelX1, mSelY1, true);
|
||||
mEndHandle.positionAtCursor(mSelX2 + 1, mSelY2, true);
|
||||
|
||||
final ActionMode.Callback callback = new ActionMode.Callback() {
|
||||
@Override
|
||||
|
@ -1240,7 +1237,7 @@ public final class TerminalView extends View {
|
|||
public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
|
||||
int x1 = Math.round(mSelX1 * mRenderer.mFontWidth);
|
||||
int x2 = Math.round(mSelX2 * mRenderer.mFontWidth);
|
||||
int y1 = Math.round((mSelY1 - mTopRow) * mRenderer.mFontLineSpacing);
|
||||
int y1 = Math.round((mSelY1 - 1 - mTopRow) * mRenderer.mFontLineSpacing);
|
||||
int y2 = Math.round((mSelY2 + 1 - mTopRow) * mRenderer.mFontLineSpacing);
|
||||
|
||||
|
||||
|
@ -1395,9 +1392,9 @@ public final class TerminalView extends View {
|
|||
return;
|
||||
}
|
||||
|
||||
mStartHandle.positionAtCursor(mSelX1, mSelY1);
|
||||
mStartHandle.positionAtCursor(mSelX1, mSelY1, false);
|
||||
|
||||
mEndHandle.positionAtCursor(mSelX2 + 1, mSelY2); //bug
|
||||
mEndHandle.positionAtCursor(mSelX2 + 1, mSelY2, false);
|
||||
|
||||
if (mActionMode != null) {
|
||||
mActionMode.invalidate();
|
||||
|
|
Loading…
Reference in New Issue