1
0
Fork 0

Undo/Redo (#777)

This commit is contained in:
Dimo Karaivanov 2025-04-22 15:08:07 +03:00 committed by GitHub
parent 94f3ffd9a8
commit 9998cd3c53
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 312 additions and 107 deletions

View file

@ -1,5 +1,7 @@
package io.github.sspanak.tt9.ime;
import android.view.KeyEvent;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DataStore;
import io.github.sspanak.tt9.db.words.DictionaryLoader;
@ -57,9 +59,15 @@ abstract public class CommandHandler extends TextEditingHandler {
case 3:
toggleVoiceInput();
break;
case 4:
undo();
break;
case 5:
showTextEditingPalette();
break;
case 6:
redo();
break;
case 8:
selectKeyboard();
break;
@ -250,4 +258,14 @@ abstract public class CommandHandler extends TextEditingHandler {
return true;
}
protected boolean undo() {
return textField.sendDownUpKeyEvents(KeyEvent.KEYCODE_Z, false, true);
}
protected boolean redo() {
return textField.sendDownUpKeyEvents(KeyEvent.KEYCODE_Z, true, true);
}
}

View file

@ -130,6 +130,14 @@ public abstract class HotkeyHandler extends CommandHandler {
return onKeyShowSettings(validateOnly);
}
if (keyCode == settings.getKeyUndo()) {
return onKeyUndo(validateOnly);
}
if (keyCode == settings.getKeyRedo()) {
return onKeyRedo(validateOnly);
}
if (keyCode == settings.getKeyVoiceInput()) {
return onKeyVoiceInput(validateOnly);
}
@ -416,6 +424,24 @@ public abstract class HotkeyHandler extends CommandHandler {
}
public boolean onKeyUndo(boolean validateOnly) {
if (!isInputViewShown() || shouldBeOff()) {
return false;
}
return validateOnly || undo();
}
public boolean onKeyRedo(boolean validateOnly) {
if (!isInputViewShown() || shouldBeOff()) {
return false;
}
return validateOnly || redo();
}
private boolean onKeyVoiceInput(boolean validateOnly) {
if (!isInputViewShown() || shouldBeOff() || !voiceInputOps.isAvailable()) {
return false;

View file

@ -7,7 +7,7 @@ import android.view.KeyEvent;
import io.github.sspanak.tt9.util.Logger;
public class SettingsHotkeys extends SettingsUI {
private static final String HOTKEY_VERSION = "hotkeys_v5";
private static final String HOTKEY_VERSION = "hotkeys_v6";
public static final String FUNC_ADD_WORD = "key_add_word";
public static final String FUNC_BACKSPACE = "key_backspace";
@ -23,6 +23,8 @@ public class SettingsHotkeys extends SettingsUI {
public static final String FUNC_SHIFT = "key_shift";
public static final String FUNC_SPACE_KOREAN = "key_space_korean";
public static final String FUNC_SHOW_SETTINGS = "key_show_settings";
public static final String FUNC_UNDO = "key_undo";
public static final String FUNC_REDO = "key_redo";
public static final String FUNC_VOICE_INPUT = "key_voice_input";
public static final String[] FUNCTIONS = {
@ -40,6 +42,8 @@ public class SettingsHotkeys extends SettingsUI {
FUNC_SHIFT,
FUNC_SPACE_KOREAN,
FUNC_SHOW_SETTINGS,
FUNC_UNDO,
FUNC_REDO,
FUNC_VOICE_INPUT,
};
@ -62,7 +66,7 @@ public class SettingsHotkeys extends SettingsUI {
*/
public void setDefaultKeys() {
// no default keys
String[] unassigned = { FUNC_ADD_WORD, FUNC_EDIT_TEXT, FUNC_SELECT_KEYBOARD, FUNC_SHOW_SETTINGS, FUNC_VOICE_INPUT };
String[] unassigned = { FUNC_ADD_WORD, FUNC_EDIT_TEXT, FUNC_SELECT_KEYBOARD, FUNC_SHOW_SETTINGS, FUNC_UNDO, FUNC_REDO, FUNC_VOICE_INPUT };
for (String key : unassigned) {
prefsEditor.putString(key, String.valueOf(KeyEvent.KEYCODE_UNKNOWN));
}
@ -172,6 +176,12 @@ public class SettingsHotkeys extends SettingsUI {
public int getKeyShowSettings() {
return getFunctionKey(FUNC_SHOW_SETTINGS);
}
public int getKeyUndo() {
return getFunctionKey(FUNC_UNDO);
}
public int getKeyRedo() {
return getFunctionKey(FUNC_REDO);
}
public int getKeyVoiceInput() {
return getFunctionKey(FUNC_VOICE_INPUT);
}

View file

@ -0,0 +1,23 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
public class SoftKeyF4 extends SoftKeyFn {
public SoftKeyF4(Context context) {
super(context);
}
public SoftKeyF4(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SoftKeyF4(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected boolean handleRelease() {
return tt9 != null && tt9.onKeyUndo(false);
}
}

View file

@ -0,0 +1,23 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
public class SoftKeyF6 extends SoftKeyFn {
public SoftKeyF6(Context context) {
super(context);
}
public SoftKeyF6(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SoftKeyF6(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected boolean handleRelease() {
return tt9 != null && tt9.onKeyRedo(false);
}
}

View file

@ -2,17 +2,26 @@ package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewParent;
import android.widget.RelativeLayout;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.util.chars.Characters;
public class SoftKeyPunctuation extends SoftKey {
abstract public class SoftKeyPunctuation extends BaseSoftKeyWithIcons {
public SoftKeyPunctuation(Context context) { super(context); }
public SoftKeyPunctuation(Context context, AttributeSet attrs) { super(context, attrs); }
public SoftKeyPunctuation(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
abstract protected String getKeyChar();
protected boolean isTextEditingOn() {
return tt9 != null && tt9.isTextEditingActive();
}
protected boolean isHiddenWhenLongSpace() {
return
tt9 != null
@ -21,18 +30,13 @@ public class SoftKeyPunctuation extends SoftKey {
&& !hasLettersOnAllKeys();
}
protected boolean isTransparentWhenTextEditing() {
return tt9 != null && tt9.isTextEditingActive();
}
@Override
protected boolean handleRelease() {
return
tt9 != null
&& !tt9.isTextEditingActive()
&& tt9.onText(getKeyChar(), false);
return tt9 != null && tt9.onText(getKeyChar(), false);
}
@Override
protected String getTitle() {
String keyChar = getKeyChar();
@ -44,42 +48,6 @@ public class SoftKeyPunctuation extends SoftKey {
};
}
protected String getKeyChar() {
int keyId = getId();
if (keyId == R.id.soft_key_punctuation_1) {
return getKey1Char();
} else if (keyId == R.id.soft_key_punctuation_2) {
return getKey2Char();
}
return "";
}
protected String getKey1Char() {
if (tt9 == null) return "";
if (tt9.isInputModePhone()) return "*";
if (tt9.isInputModeNumeric()) return ",";
if (LanguageKind.isChinese(tt9.getLanguage()) || LanguageKind.isJapanese(tt9.getLanguage())) {
return Characters.ZH_EXCLAMATION_MARK;
}
return "!";
}
protected String getKey2Char() {
if (tt9 == null) return "";
if (tt9.isInputModePhone()) return "#";
if (tt9.isInputModeNumeric()) return ".";
if (LanguageKind.isArabic(tt9.getLanguage())) return Characters.AR_QUESTION_MARK;
if (LanguageKind.isGreek(tt9.getLanguage())) return Characters.GR_QUESTION_MARK;
if (LanguageKind.isChinese(tt9.getLanguage()) || LanguageKind.isJapanese(tt9.getLanguage())) {
return Characters.ZH_QUESTION_MARK;
}
return "?";
}
@Override
public void setHeight(int height) {
@ -93,12 +61,12 @@ public class SoftKeyPunctuation extends SoftKey {
@Override
public void render() {
if (isHiddenWhenLongSpace()) {
setVisibility(GONE);
} else if (isTransparentWhenTextEditing()) {
setVisibility(INVISIBLE);
} else {
setVisibility(VISIBLE);
boolean isHidden = isHiddenWhenLongSpace();
setVisibility(isHidden ? GONE : VISIBLE);
ViewParent parent = getParent();
if (parent instanceof RelativeLayout) {
((RelativeLayout) parent).setVisibility(isHidden ? RelativeLayout.GONE : RelativeLayout.VISIBLE);
}
super.render();

View file

@ -0,0 +1,43 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.util.chars.Characters;
public class SoftKeyPunctuationLeft extends SoftKeyPunctuation {
public SoftKeyPunctuationLeft(Context context) { super(context); }
public SoftKeyPunctuationLeft(Context context, AttributeSet attrs) { super(context, attrs); }
public SoftKeyPunctuationLeft(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override
protected String getKeyChar() {
if (tt9 == null) return "";
if (tt9.isInputModePhone()) return "*";
if (tt9.isInputModeNumeric()) return ",";
if (tt9.isTextEditingActive()) return "";
if (LanguageKind.isChinese(tt9.getLanguage()) || LanguageKind.isJapanese(tt9.getLanguage())) {
return Characters.ZH_EXCLAMATION_MARK;
}
return "!";
}
@Override
protected boolean handleRelease() {
return isTextEditingOn() ? tt9.onKeyUndo(false) : super.handleRelease();
}
@Override
protected String getTitle() {
return isTextEditingOn() ? "" : super.getTitle();
}
@Override
protected int getCentralIcon() {
return isTextEditingOn() && !isHiddenWhenLongSpace() ? R.drawable.ic_fn_undo : -1;
}
}

View file

@ -0,0 +1,11 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
public class SoftKeyPunctuationLeftShort extends SoftKeyPunctuationLeft {
public SoftKeyPunctuationLeftShort(Context context) { super(context); }
public SoftKeyPunctuationLeftShort(Context context, AttributeSet attrs) { super(context, attrs); }
public SoftKeyPunctuationLeftShort(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override protected boolean isHiddenWhenLongSpace() { return false; }
}

View file

@ -0,0 +1,44 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.util.chars.Characters;
public class SoftKeyPunctuationRight extends SoftKeyPunctuation {
public SoftKeyPunctuationRight(Context context) { super(context); }
public SoftKeyPunctuationRight(Context context, AttributeSet attrs) { super(context, attrs); }
public SoftKeyPunctuationRight(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
protected String getKeyChar() {
if (tt9 == null) return "";
if (tt9.isInputModePhone()) return "#";
if (tt9.isInputModeNumeric()) return ".";
if (tt9.isTextEditingActive()) return "";
if (LanguageKind.isArabic(tt9.getLanguage())) return Characters.AR_QUESTION_MARK;
if (LanguageKind.isGreek(tt9.getLanguage())) return Characters.GR_QUESTION_MARK;
if (LanguageKind.isChinese(tt9.getLanguage()) || LanguageKind.isJapanese(tt9.getLanguage())) {
return Characters.ZH_QUESTION_MARK;
}
return "?";
}
@Override
protected boolean handleRelease() {
return tt9 != null && tt9.isTextEditingActive() ? tt9.onKeyRedo(false) : super.handleRelease();
}
@Override
protected String getTitle() {
return isTextEditingOn() ? "" : super.getTitle();
}
@Override
protected int getCentralIcon() {
return isTextEditingOn() && !isHiddenWhenLongSpace() ? R.drawable.ic_fn_redo : -1;
}
}

View file

@ -0,0 +1,11 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
public class SoftKeyPunctuationRightShort extends SoftKeyPunctuationRight {
public SoftKeyPunctuationRightShort(Context context) { super(context); }
public SoftKeyPunctuationRightShort(Context context, AttributeSet attrs) { super(context, attrs); }
public SoftKeyPunctuationRightShort(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override protected boolean isHiddenWhenLongSpace() { return false; }
}

View file

@ -1,29 +0,0 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
import io.github.sspanak.tt9.R;
public class SoftKeyPunctuationShort extends SoftKeyPunctuation {
public SoftKeyPunctuationShort(Context context) { super(context); }
public SoftKeyPunctuationShort(Context context, AttributeSet attrs) { super(context, attrs); }
public SoftKeyPunctuationShort(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override protected boolean isHiddenWhenLongSpace() { return false; }
protected String getKeyChar() {
if (!validateTT9Handler()) {
return "";
}
int keyId = getId();
if (keyId == R.id.soft_key_punctuation_201) {
return getKey1Char();
} else if (keyId == R.id.soft_key_punctuation_202) {
return getKey2Char();
}
return super.getKeyChar();
}
}

View file

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M18.4,10.6C16.55,8.99 14.15,8 11.5,8c-4.65,0 -8.58,3.03 -9.96,7.22L3.9,16c1.05,-3.19 4.05,-5.5 7.6,-5.5 1.95,0 3.73,0.72 5.12,1.88L13,16h9V7l-3.6,3.6z"/>
</vector>

View file

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="false" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M12.5,8c-2.65,0 -5.05,0.99 -6.9,2.6L2,7v9h9l-3.62,-3.62c1.39,-1.16 3.16,-1.88 5.12,-1.88 3.54,0 6.55,2.31 7.6,5.5l2.37,-0.78C21.08,11.03 17.15,8 12.5,8z"/>
</vector>

View file

@ -4,9 +4,12 @@
style="@style/TTheme.Numpad.CentralBlock.Row.LongSpacebar"
android:id="@+id/panel_long_spacebar">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationShort
style="@style/TTheme.Numpad.Key.ShortPunctuation"
android:id="@+id/soft_key_punctuation_201" />
<RelativeLayout style="@style/TTheme.Numpad.Key.ShortPunctuation.Overlay.Wrapper">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationLeftShort
style="@style/TTheme.Numpad.Key.Number"
android:id="@+id/soft_key_punctuation_201" />
<include layout="@layout/key_overlay_icons" />
</RelativeLayout>
<RelativeLayout style="@style/TTheme.Numpad.Key.LongSpace.Overlay.Wrapper">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyNumber0Long
@ -15,8 +18,11 @@
<include layout="@layout/key_overlay_number_hold_text" />
</RelativeLayout>
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationShort
style="@style/TTheme.Numpad.Key.ShortPunctuation"
android:id="@+id/soft_key_punctuation_202" />
<RelativeLayout style="@style/TTheme.Numpad.Key.ShortPunctuation.Overlay.Wrapper">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationRightShort
style="@style/TTheme.Numpad.Key.Number"
android:id="@+id/soft_key_punctuation_202" />
<include layout="@layout/key_overlay_icons" />
</RelativeLayout>
</LinearLayout>

View file

@ -23,7 +23,7 @@
<include layout="@layout/key_overlay_number_hold_text" />
</RelativeLayout>
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuation
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationLeft
style="@style/TTheme.Numpad.Key.Number"
android:id="@+id/soft_key_punctuation_1" />
</LinearLayout>
@ -84,7 +84,7 @@
<include layout="@layout/key_overlay_number_hold_text" />
</RelativeLayout>
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuation
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationRight
style="@style/TTheme.Numpad.Key.Number"
android:id="@+id/soft_key_punctuation_2" />
</LinearLayout>

View file

@ -27,9 +27,12 @@
<include layout="@layout/key_overlay_icons" />
</RelativeLayout>
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuation
style="@style/TTheme.Numpad.Key.Large.Placeholder"
android:id="@+id/soft_key_punctuation_101" />
<RelativeLayout style="@style/TTheme.Numpad.Key.Overlay.Wrapper">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationLeft
style="@style/TTheme.Numpad.Key.Number"
android:id="@+id/soft_key_punctuation_101" />
<include layout="@layout/key_overlay_icons" />
</RelativeLayout>
</LinearLayout>
@ -95,9 +98,12 @@
<include layout="@layout/key_overlay_icons" />
</RelativeLayout>
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuation
style="@style/TTheme.Numpad.Key.Large.Placeholder"
android:id="@+id/soft_key_punctuation_102" />
<RelativeLayout style="@style/TTheme.Numpad.Key.Overlay.Wrapper">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyPunctuationRight
style="@style/TTheme.Numpad.Key.Number"
android:id="@+id/soft_key_punctuation_102" />
<include layout="@layout/key_overlay_icons" />
</RelativeLayout>
</LinearLayout>
</merge>

View file

@ -20,11 +20,21 @@
android:id="@+id/soft_key_3"
android:drawableBottom="@drawable/ic_fn_voice" />
<io.github.sspanak.tt9.ui.main.keys.SoftKeyF4
style="@style/TTheme.CommandPalette.Key"
android:id="@+id/soft_key_4"
android:drawableBottom="@drawable/ic_fn_undo" />
<io.github.sspanak.tt9.ui.main.keys.SoftKeyF5
style="@style/TTheme.CommandPalette.Key"
android:id="@+id/soft_key_5"
android:drawableBottom="@drawable/ic_txt_cut" />
<io.github.sspanak.tt9.ui.main.keys.SoftKeyF6
style="@style/TTheme.CommandPalette.Key"
android:id="@+id/soft_key_6"
android:drawableBottom="@drawable/ic_fn_redo" />
<io.github.sspanak.tt9.ui.main.keys.SoftKeyFn
style="@style/TTheme.CommandPalette.Key"
android:id="@+id/soft_key_8"

View file

@ -177,6 +177,7 @@
<string name="virtual_numpad_alignment_left">Вляво</string>
<string name="virtual_numpad_alignment_right">Вдясно</string>
<string name="function_select_keyboard">Избор на клавиатура</string>
<string name="function_redo">Повторение (Redo)</string>
<string name="function_voice_input">Гласово въвеждане</string>
<string name="add_word_no_confirmation">Добавяне без потвърждение</string>
<string name="dictionary_import_custom_words">Импортирай</string>
@ -211,4 +212,5 @@
<string name="function_assign_instructions">* Натиснете или задръжте клавиш, за да го присвоите на функцията „%1$s“.\n\n* Натиснете 0, за да отмените.\n\n* Натиснете 2, за да деактивирате функцията.</string>
<string name="pref_allow_composing_text">Показвай текст при съставяне</string>
<string name="pref_drag_resize">Оразмеряване чрез влачене</string>
<string name="function_undo">Отмяна (Undo)</string>
</resources>

View file

@ -204,6 +204,7 @@
<string name="function_already_assigned">\tDie Taste \"%1$s\" ist bereits der Funktion \"%2$s\" zugewiesen. Möchten Sie sie \"%3$s\" zuweisen?</string>
<string name="function_assign_instructions">* Drücken oder halten Sie eine Taste, um sie der Funktion \"%1$s\" zuzuweisen.\n\n* Drücken Sie 0, um abzubrechen.\n\n* Drücken Sie 2, um die Funktion zu deaktivieren.</string>
<string name="function_reassign">Neu zuweisen</string>
<string name="function_redo">Wiederholen</string>
<string name="function_voice_input">Spracheingabe</string>
<string name="function_reset_keys_title">Standardtasten wiederherstellen</string>
<string name="key_hold_key">(halten)</string>
@ -213,4 +214,5 @@
<string name="function_show_settings">Einstellungsbildschirm anzeigen</string>
<string name="pref_allow_composing_text">Zusammengesetzten Text anzeigen</string>
<string name="pref_drag_resize">Größe durch Ziehen ändern</string>
<string name="function_undo">Rückgängig machen</string>
</resources>

View file

@ -98,6 +98,7 @@
<string name="function_reassign">Reasignar</string>
<string name="function_add_word">Agregar palabra</string>
<string name="function_show_settings">Mostrar configuración</string>
<string name="function_redo">Rehacer</string>
<string name="function_voice_input">Entrada por voz</string>
<string name="function_reset_keys_title">Restaurar valores de teclas por defecto</string>
<string name="function_reset_keys_done">Valores de teclas por defecto restaurados</string>
@ -211,4 +212,5 @@
<string name="function_assign_instructions">* Presione o mantenga pulsada una tecla para asignarla a la función \"%1$s\".\n\n* Presione 0 para cancelar.\n\n* Presione 2 para desactivar la función.</string>
<string name="pref_allow_composing_text">Mostrar texto en composición</string>
<string name="pref_drag_resize">Redimensionar arrastrando</string>
<string name="function_undo">Deshacer</string>
</resources>

View file

@ -88,6 +88,7 @@
<string name="function_reassign">Réattribuer</string>
<string name="function_add_word">Ajouter un mot</string>
<string name="function_show_settings">Afficher les paramètres</string>
<string name="function_redo">Restaurer (Redo)</string>
<string name="function_voice_input">Saisie vocale</string>
<string name="function_reset_keys_title">Restaurer les paramètres par défaut</string>
<string name="function_reset_keys_done">Paramètres par défaut sont restaurés.</string>
@ -211,4 +212,5 @@
<string name="key_hold_key">(maintenir)</string>
<string name="pref_allow_composing_text">Afficher texte en cours</string>
<string name="pref_drag_resize">Redimensionner en faisant glisser</string>
<string name="function_undo">Annuler (Undo)</string>
</resources>

View file

@ -202,6 +202,7 @@
<string name="function_already_assigned">Il tasto \"%1$s\" è già assegnato alla funzione \"%2$s\". Vuoi assegnarlo a \"%3$s\"?</string>
<string name="function_assign_instructions">* Premi o tieni premuto un tasto per assegnarlo alla funzione \"%1$s\".\n\n* Premi 0 per annullare.\n\n* Premi 2 per disabilitare la funzione.</string>
<string name="function_reassign">Riassegnare</string>
<string name="function_redo">Ripristina (Redo)</string>
<string name="function_voice_input">Input vocale</string>
<string name="function_reset_keys_title">Ripristina i tasti predefiniti</string>
<string name="key_hold_key">(tenere premuto)</string>
@ -214,5 +215,6 @@
<string name="function_show_settings">Mostrare impostazioni</string>
<string name="pref_allow_composing_text">Mostra testo in composizione</string>
<string name="pref_drag_resize">Ridimensionare trascinando</string>
<string name="function_undo">Annulla (Undo)</string>
</resources>

View file

@ -92,6 +92,7 @@
<string name="function_reassign">הקצה מחדש</string>
<string name="function_add_word">לחצן הוספת מילה</string>
<string name="function_show_settings">לחצן הצגת הגדרות</string>
<string name="function_redo">ביצוע חוזר (Redo)</string>
<string name="function_voice_input">קלט קולי</string>
<string name="function_reset_keys_title">שחזור לחצני ברירת מחדל</string>
<string name="function_reset_keys_done">הגדרות ברירת המחדל שוחזרו.</string>
@ -218,4 +219,5 @@
<string name="function_previous_suggestion">הצעה קודמת</string>
<string name="pref_allow_composing_text">הצגת טקסט בהרכבה</string>
<string name="pref_drag_resize">שינוי גודל על ידי גרירה</string>
<string name="function_undo">ביטול (Undo)</string>
</resources>

View file

@ -100,6 +100,7 @@
<string name="function_reassign">Perpriskirti</string>
<string name="function_add_word">Pridėti žodį</string>
<string name="function_show_settings">Rodyti nustatymus</string>
<string name="function_redo">Pakartoti (Redo)</string>
<string name="function_voice_input">Balso įvestis</string>
<string name="function_reset_keys_title">Atkurti numatytąsias reikšmes</string>
<string name="function_reset_keys_done">Numatytosios reikšmės atkurtos.</string>
@ -220,4 +221,5 @@
<string name="function_assign_instructions">* Paspauskite arba palaikykite klavišą, kad priskirtumėte jį funkcijai „%1$s“.\n\n* Paspauskite 0, kad atšauktumėte.\n\n* Paspauskite 2, kad išjungtumėte funkciją.</string>
<string name="pref_allow_composing_text">Rodyti rašomą tekstą</string>
<string name="pref_drag_resize">Keisti dydį tempiant</string>
<string name="function_undo">Atšaukti (Undo)</string>
</resources>

View file

@ -204,6 +204,7 @@
<string name="function_assign_instructions">* Druk of houd een toets ingedrukt om deze toe te wijzen aan de functie \"%1$s\".\n\n* Druk op 0 om te annuleren.\n\n* Druk op 2 om de functie uit te schakelen.</string>
<string name="function_reassign">Opnieuw toewijzen</string>
<string name="function_show_settings">Instellingen weergeven</string>
<string name="function_redo">Opnieuw uitvoeren</string>
<string name="function_voice_input">Spraakinvoer</string>
<string name="function_reset_keys_title">Standaardtoetsen herstellen</string>
<string name="key_hold_key">(Ingedrukt houden)</string>
@ -212,4 +213,5 @@
<string name="function_next_language">Volgende taal</string>
<string name="function_filter_clear">Filter wissen</string>
<string name="pref_allow_composing_text">Compositietekst weergeven</string>
<string name="function_undo">Ongedaan maken</string>
</resources>

View file

@ -86,6 +86,7 @@
<string name="function_reassign">Reatribuir</string>
<string name="function_add_word">Adicionar palavra</string>
<string name="function_show_settings">Entrar em Configurações</string>
<string name="function_redo">Refazer</string>
<string name="function_voice_input">Entrada por Voz</string>
<string name="function_reset_keys_title">Restaurar Atalhos Padrão</string>
<string name="function_reset_keys_done">Atalhos Restaurados.</string>
@ -218,4 +219,5 @@
<string name="function_previous_suggestion">Sugestão Anterior</string>
<string name="pref_allow_composing_text">Mostrar texto em composição</string>
<string name="pref_drag_resize">Redimensionar arrastando</string>
<string name="function_undo">Desfazer</string>
</resources>

View file

@ -89,6 +89,7 @@
<string name="function_reassign">Назначить заново</string>
<string name="function_add_word">Добавить слово</string>
<string name="function_show_settings">Настройки</string>
<string name="function_redo">Повторить (Redo)</string>
<string name="function_voice_input">Голосовой ввод</string>
<string name="function_reset_keys_title">Вернуть кнопки по умолчанию</string>
<string name="function_reset_keys_done">Настройки кнопок по умолчанию восстановлены.</string>
@ -211,4 +212,5 @@
<string name="function_assign_instructions">* Нажмите или удерживайте клавишу, чтобы назначить её на функцию «%1$s».\n\n* Нажмите 0, чтобы отменить.\n\n* Нажмите 2, чтобы отключить функцию.</string>
<string name="pref_allow_composing_text">Показывать текст при вводе</string>
<string name="pref_drag_resize">Изменять размер перетаскиванием</string>
<string name="function_undo">Отменить (Undo)</string>
</resources>

View file

@ -154,6 +154,7 @@
<string name="function_reassign">Yeniden ata</string>
<string name="function_add_word">Kelime ekle</string>
<string name="function_show_settings">Ayarları göster</string>
<string name="function_redo">Yinele (Redo)</string>
<string name="function_voice_input">Sesli giriş</string>
<string name="function_reset_keys_title">Varsayılan Ayarlara Geri Dön</string>
<string name="function_reset_keys_done">Varsayılan tuş ayarlarına dönüldü.</string>
@ -216,4 +217,5 @@
<string name="key_hold_key">(basılı tut)</string>
<string name="pref_allow_composing_text">Yazılan metni göster</string>
<string name="pref_drag_resize">Sürükleyerek yeniden boyutlandır</string>
<string name="function_undo">Geri al (Undo)</string>
</resources>

View file

@ -132,6 +132,7 @@
<string name="function_reassign">Перепризначити</string>
<string name="function_add_word">Додати слово</string>
<string name="function_show_settings">Показати налаштування</string>
<string name="function_redo">Повторити (Redo)</string>
<string name="function_voice_input">Голосове введення</string>
<string name="function_reset_keys_title">Відновити стандартні клавіші</string>
<string name="function_reset_keys_done">Стандартні налаштування клавіш відновленно.</string>
@ -222,4 +223,5 @@
<string name="function_assign_instructions">* Натисніть або утримуйте клавішу, щоб призначити її функції «%1$s».\n\n* Натисніть 0, щоб скасувати.\n\n* Натисніть 2, щоб вимкнути функцію.</string>
<string name="pref_allow_composing_text">Показувати текст під час введення</string>
<string name="pref_drag_resize">Змінювати розмір перетягуванням</string>
<string name="function_undo">Скасувати (Undo)</string>
</resources>

View file

@ -176,6 +176,8 @@
<string name="function_next_mode">Input Mode</string>
<string name="function_select_keyboard">Select Keyboard</string>
<string name="function_show_settings">Show Settings</string>
<string name="function_undo">Undo</string>
<string name="function_redo">Redo</string>
<string name="function_voice_input">Voice Input</string>
<string name="function_reset_keys_title">Restore Default Keys</string>
<string name="function_reset_keys_done">Default key settings restored.</string>

View file

@ -267,6 +267,11 @@
<item name="android:layout_width">0dp</item>
</style>
<style name="TTheme.Numpad.Key.ShortPunctuation.Overlay.Wrapper" parent="TTheme.Numpad.Key.Number">
<item name="android:layout_weight">1</item>
<item name="android:layout_width">0dp</item>
</style>
<style name="TTheme.Numpad.Key.Overlay.Element" parent="">
<item name="android:layout_height">match_parent</item>
<item name="android:layout_width">match_parent</item>
@ -387,14 +392,4 @@
<item name="rippleColor">@color/key_ok_ripple</item>
</style>
<style name="TTheme.Numpad.Key.Large.Placeholder" parent="TTheme.Numpad.Key.Number">
<item name="android:textColor">@android:color/transparent</item>
<item name="android:background">@android:color/transparent</item>
</style>
<style name="TTheme.Numpad.Key.ShortPunctuation" parent="TTheme.Numpad.Key.Number">
<item name="android:layout_weight">1</item>
<item name="android:layout_width">0dp</item>
</style>
</resources>

View file

@ -58,6 +58,14 @@
app:key="key_show_settings"
app:title="@string/function_show_settings" />
<io.github.sspanak.tt9.preferences.screens.hotkeys.PreferenceHotkey
app:key="key_undo"
app:title="@string/function_undo" />
<io.github.sspanak.tt9.preferences.screens.hotkeys.PreferenceHotkey
app:key="key_redo"
app:title="@string/function_redo" />
<io.github.sspanak.tt9.preferences.screens.hotkeys.PreferenceVoiceInputHotkey
app:key="key_voice_input"
app:title="@string/function_voice_input" />