feat(editor): add preference for 'deleteEmptyLineFast' and 'deleteMultiSpaces' (closes #903)

This commit is contained in:
Akash Yadav
2023-03-27 20:43:03 +05:30
parent a948cd49ec
commit 9993793507
5 changed files with 69 additions and 5 deletions
@@ -27,6 +27,8 @@ import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
import com.itsaky.androidide.preferences.internal.AUTO_SAVE
import com.itsaky.androidide.preferences.internal.COLOR_SCHEME
import com.itsaky.androidide.preferences.internal.COMPLETIONS_MATCH_LOWER
import com.itsaky.androidide.preferences.internal.DELETE_EMPTY_LINES
import com.itsaky.androidide.preferences.internal.DELETE_TABS_ON_BACKSPACE
import com.itsaky.androidide.preferences.internal.FLAG_PASSWORD
import com.itsaky.androidide.preferences.internal.FONT_LIGATURES
import com.itsaky.androidide.preferences.internal.FONT_SIZE
@@ -40,6 +42,8 @@ import com.itsaky.androidide.preferences.internal.WORD_WRAP
import com.itsaky.androidide.preferences.internal.autoSave
import com.itsaky.androidide.preferences.internal.colorScheme
import com.itsaky.androidide.preferences.internal.completionsMatchLower
import com.itsaky.androidide.preferences.internal.deleteEmptyLines
import com.itsaky.androidide.preferences.internal.deleteTabsOnBackspace
import com.itsaky.androidide.preferences.internal.drawEmptyLineWs
import com.itsaky.androidide.preferences.internal.drawInnerWs
import com.itsaky.androidide.preferences.internal.drawLeadingWs
@@ -92,6 +96,8 @@ private class CommonConfigurations(
addPreference(UseICU())
addPreference(AutoSave())
addPreference(VisibiblePasswordFlag())
addPreference(DeleteEmptyLines())
addPreference(DeleteTabs())
addPreference(CompletionsMatchLower())
}
}
@@ -156,9 +162,8 @@ private class TabSize(
override val summary: Int? = string.msg_tab_size,
override val icon: Int? = drawable.ic_font_ligatures,
) : SingleChoicePreference() {
@IgnoredOnParcel
private val choices = arrayOf("2", "4", "6", "8")
@IgnoredOnParcel private val choices = arrayOf("2", "4", "6", "8")
override fun getChoices(context: Context): Array<String> {
return choices
@@ -303,3 +308,19 @@ private class UseCustomFont(
override val summary: Int? = string.idepref_customFont_summary,
override val icon: Int? = drawable.ic_custom_font,
) : SwitchPreference(setValue = ::useCustomFont::set, getValue = ::useCustomFont::get)
@Parcelize
private class DeleteEmptyLines(
override val key: String = DELETE_EMPTY_LINES,
override val title: Int = R.string.idepref_deleteEmptyLines_title,
override val summary: Int? = R.string.idepref_deleteEmptyLines_summary,
override val icon: Int? = drawable.ic_backspace
) : SwitchPreference(setValue = ::deleteEmptyLines::set, getValue = ::deleteEmptyLines::get)
@Parcelize
private class DeleteTabs(
override val key: String = DELETE_TABS_ON_BACKSPACE,
override val title: Int = R.string.idepref_deleteTabs_title,
override val summary: Int? = R.string.idepref_deleteTabs_summary,
override val icon: Int? = drawable.ic_backspace
) : SwitchPreference(setValue = ::deleteTabsOnBackspace::set, getValue = ::deleteTabsOnBackspace::get)
@@ -16,6 +16,8 @@
*/
package com.itsaky.androidide.ui.editor;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.DELETE_EMPTY_LINES;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.DELETE_TABS_ON_BACKSPACE;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.FLAG_LINE_BREAK;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.FLAG_PASSWORD;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.FLAG_WS_EMPTY_LINE;
@@ -28,6 +30,8 @@ import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.USE
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.USE_ICU;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.USE_MAGNIFER;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.WORD_WRAP;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.getDeleteEmptyLines;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.getDeleteTabsOnBackspace;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.getDrawEmptyLineWs;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.getDrawInnerWs;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.getDrawLeadingWs;
@@ -203,6 +207,8 @@ public class CodeEditorView extends LinearLayout {
onWordwrapPrefChanged();
onMagnifierPrefChanged();
onUseIcuPrefChanged();
onDeleteEmptyLinesPrefChanged();
onDeleteTabsPrefChanged();
}
protected void onMagnifierPrefChanged() {
@@ -257,16 +263,24 @@ public class CodeEditorView extends LinearLayout {
binding.editor.setTextSize(textSize);
}
private void onUseIcuPrefChanged() {
protected void onUseIcuPrefChanged() {
binding.editor.getProps().useICULibToSelectWords = getUseIcu();
}
private void onCustomFontPrefChanged() {
protected void onCustomFontPrefChanged() {
var state = EditorPreferencesKt.getUseCustomFont();
binding.editor.setTypefaceText(TypefaceUtilsKt.customOrJBMono(state));
binding.editor.setTypefaceLineNumber(TypefaceUtilsKt.customOrJBMono(state));
}
protected void onDeleteEmptyLinesPrefChanged() {
binding.editor.getProps().deleteEmptyLineFast = getDeleteEmptyLines();
}
protected void onDeleteTabsPrefChanged() {
binding.editor.getProps().deleteMultiSpaces = getDeleteTabsOnBackspace() ? -1 : 1;
}
/**
* For internal use only!
*
@@ -322,6 +336,12 @@ public class CodeEditorView extends LinearLayout {
case USE_CUSTOM_FONT:
onCustomFontPrefChanged();
break;
case DELETE_EMPTY_LINES:
onDeleteEmptyLinesPrefChanged();
break;
case DELETE_TABS_ON_BACKSPACE:
onDeleteTabsPrefChanged();
break;
}
}
@@ -35,6 +35,8 @@ const val USE_MAGNIFER = "idepref_editor_use_magnifier"
const val USE_ICU = "idepref_editor_useIcu"
const val USE_SOFT_TAB = "idepref_editor_useSoftTab"
const val USE_CUSTOM_FONT = "idepref_editor_useCustomFont"
const val DELETE_EMPTY_LINES = "idepref_editor_deleteEmptyLines"
const val DELETE_TABS_ON_BACKSPACE = "idepref_editor_deleteTab"
const val COLOR_SCHEME = "idepref_editor_colorScheme"
const val DEFAULT_COLOR_SCHEME = "default"
@@ -140,3 +142,15 @@ var colorScheme: String
set(value) {
prefManager.putString(COLOR_SCHEME, value)
}
var deleteEmptyLines : Boolean
get() = prefManager.getBoolean(DELETE_EMPTY_LINES, true)
set(value) {
prefManager.putBoolean(DELETE_EMPTY_LINES, value)
}
var deleteTabsOnBackspace : Boolean
get() = prefManager.getBoolean(DELETE_TABS_ON_BACKSPACE, true)
set(value) {
prefManager.putBoolean(DELETE_TABS_ON_BACKSPACE, value)
}
@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M21,11H6.83l3.58,-3.59L9,6l-6,6 6,6 1.41,-1.41L6.83,13H21z"/>
</vector>
@@ -535,4 +535,8 @@
<string name="title_reload_color_schemes">Reload color schemes</string>
<string name="msg_dir_picker_failed">Failed to start directory picker : %1$s</string>
<string name="msg_tooling_server_unavailable">Tooling API server is unavailable. Check build output and IDE logs for errors.</string>
<string name="idepref_deleteEmptyLines_title">Delete empty lines on backspace</string>
<string name="idepref_deleteEmptyLines_summary">Whether the editor should delete empty lines on a single backspace key event.</string>
<string name="idepref_deleteTabs_title">Delete tab on backspace</string>
<string name="idepref_deleteTabs_summary">When enabled, the editor will delete spaces equal to the tab width when the backspace key is pressed.</string>
</resources>