Skip to content
Snippets Groups Projects
Commit d447a33d authored by Vitaliy Vashchenko's avatar Vitaliy Vashchenko
Browse files

#419 added timer to move dialog back after 7sec of inactivity.

parent 9aa6b9c7
No related branches found
No related tags found
No related merge requests found
package cz.nic.tablexia.util.ui.dialog.components;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Cell;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
import com.badlogic.gdx.scenes.scene2d.utils.FocusListener;
import com.badlogic.gdx.utils.Align;
import java.util.Timer;
import java.util.TimerTask;
import cz.nic.tablexia.TablexiaSettings;
import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
import cz.nic.tablexia.loader.application.ApplicationFontManager;
......@@ -27,6 +32,8 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
private static final String DEFAULT_PLACEHOLDER_TEXT = "";
private static final int DEFAULT_TEXTFIELD_ALIGN = Align.center;
private static final float DEFAULT_TEXT_FIELD_WIDTH_PERCENT = 1;
public static final int DIALOG_REPLACE_TIMEOUT = 7000;
private boolean isScaled;
private final Color fontColor;
......@@ -39,7 +46,10 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
private TextFieldWithPlaceholder textField;
private Cell content;
private FocusListener changePositionFocusListener;
private Timer timer;
private boolean timerSet;
private InputListener repositionOnTypeListener, repositionOnTouchListener;
public TextFiledDialogComponent() {
this(null, DEFAULT_PLACEHOLDER_TEXT, DEFAULT_FONT_TYPE, DEFAULT_FONT_COLOR);
......@@ -59,7 +69,7 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
this.actualFontType = fontType;
this.fontColor = fontColor;
this.maximumLength = maximumLength;
timerSet = false;
textField = prepareTextField(placeholderText);
}
......@@ -118,31 +128,93 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
public void setRepositionOnFocusOnMobileDevices(boolean repositionOnFocus) {
if(repositionOnFocus && TablexiaSettings.getInstance().isRunningOnMobileDevice()) {
if(changePositionFocusListener == null) prepareChangePositionFocusListener();
textField.addListener(changePositionFocusListener);
if (repositionOnTypeListener == null) prepareOnTypeListener();
if (repositionOnTouchListener == null) prepareOnTouchListener();
textField.addListener(repositionOnTypeListener);
textField.addListener(repositionOnTouchListener);
}
else {
if(changePositionFocusListener != null) textField.removeListener(changePositionFocusListener);
if (repositionOnTypeListener != null) textField.removeListener(repositionOnTypeListener);
if (repositionOnTouchListener != null) textField.removeListener(repositionOnTouchListener);
}
}
private void prepareChangePositionFocusListener() {
this.changePositionFocusListener = new FocusListener() {
private void prepareOnTypeListener() {
this.repositionOnTypeListener = new InputListener() {
private static final int COMMON_INT_CODE_FOR_ENTER = 13;
private static final int ANDROID_INT_CODE_FOR_ENTER = 10;
@Override
public boolean keyTyped(InputEvent event, char character) {
if (timerSet) timer.cancel();
// have to check also (int)character because of some bug in iOS keyboard. It returns code Input.Keys.ENTER for every key after "done" button pressed
if ((event.getKeyCode() != Input.Keys.ENTER || ((int) character != ANDROID_INT_CODE_FOR_ENTER || (int) character != COMMON_INT_CODE_FOR_ENTER))) {
resetTimer();
} else {
repositionDialog(DialogPosition.CENTER);
}
return false;
}
};
}
public void prepareOnTouchListener(){
this.repositionOnTouchListener = new InputListener(){
@Override
public void keyboardFocusChanged(FocusListener.FocusEvent event, Actor actor, boolean focused) {
if(focused) repositionDialog();
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
if (timerSet) timer.cancel();
repositionDialog(DialogPosition.TOP);
resetTimer();
return super.touchDown(event, x, y, pointer, button);
}
};
}
private void repositionDialog() {
private void resetTimer() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
repositionDialog(DialogPosition.CENTER);
timerSet = false;
}
}, DIALOG_REPLACE_TIMEOUT);
timerSet = true;
}
private void repositionDialog(DialogPosition dialogPosition) {
TablexiaComponentDialog dialog = getDialog();
Stage stage = getStage();
if(dialog == null || (stage == null)) return;
dialog.setPosition(
TablexiaSettings.getViewportLeftX(stage) + TablexiaSettings.getViewportWidth(stage) / 2f - dialog.getInnerWidth()/2f,
TablexiaSettings.getViewportBottomY(stage) + TablexiaSettings.getViewportHeight(stage) - dialog.getOutterHeight()
TablexiaSettings.getViewportLeftX(stage) + TablexiaSettings.getViewportWidth(stage) * 0.5f - dialog.getInnerWidth() * 0.5f,
TablexiaSettings.getViewportBottomY(stage) + TablexiaSettings.getViewportHeight(stage) * dialogPosition.getShift() - dialog.getOutterHeight() * dialogPosition.getShift()
);
Gdx.input.setOnscreenKeyboardVisible(dialogPosition.isShowKeyboard());
}
private enum DialogPosition {
TOP(1f, true),
CENTER(0.5f, false);
private float shift;
private boolean showKeyboard;
DialogPosition(float shift, boolean showKeyboard) {
this.shift = shift;
this.showKeyboard = showKeyboard;
}
public float getShift() {
return shift;
}
public boolean isShowKeyboard() {
return showKeyboard;
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment