From 6a8489d6d45045a50baac7f650d01a42655564c7 Mon Sep 17 00:00:00 2001 From: simonpoole Date: Sat, 19 Oct 2024 19:45:14 +0200 Subject: [PATCH] Use a specific row type instead of TextRow for the value widgets --- .../tagform/TagFormFragment.java | 4 + .../propertyeditor/tagform/TextRow.java | 19 --- .../tagform/ValueWidgetRow.java | 115 ++++++++++++++++++ .../res/layout/tag_form_value_widget_row.xml | 57 +++++++++ 4 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 src/main/java/de/blau/android/propertyeditor/tagform/ValueWidgetRow.java create mode 100644 src/main/res/layout/tag_form_value_widget_row.xml diff --git a/src/main/java/de/blau/android/propertyeditor/tagform/TagFormFragment.java b/src/main/java/de/blau/android/propertyeditor/tagform/TagFormFragment.java index fc072ca3a..cbf5d5d0f 100644 --- a/src/main/java/de/blau/android/propertyeditor/tagform/TagFormFragment.java +++ b/src/main/java/de/blau/android/propertyeditor/tagform/TagFormFragment.java @@ -1014,6 +1014,10 @@ void addRow(@Nullable final LinearLayout rowLayout, @NonNull final PresetTagFiel rowLayout.addView(LongTextDialogRow.getRow(this, inflater, rowLayout, preset, (PresetTextField) field, value, maxStringLength)); return; } + if ( ValueType.INTEGER == valueType || ValueType.CARDINAL_DIRECTION == valueType) { + rowLayout.addView(ValueWidgetRow.getRow(this, inflater, rowLayout, preset, field, value, values, allTags)); + return; + } rowLayout.addView(TextRow.getRow(this, inflater, rowLayout, preset, field, value, values, allTags)); return; } diff --git a/src/main/java/de/blau/android/propertyeditor/tagform/TextRow.java b/src/main/java/de/blau/android/propertyeditor/tagform/TextRow.java index 042280e7b..8362d7f6d 100644 --- a/src/main/java/de/blau/android/propertyeditor/tagform/TextRow.java +++ b/src/main/java/de/blau/android/propertyeditor/tagform/TextRow.java @@ -178,7 +178,6 @@ static TextRow getRow(@NonNull final TagFormFragment caller, @NonNull final Layo final TextRow row = (TextRow) inflater.inflate(R.layout.tag_form_text_row, rowLayout, false); final String key = field.getKey(); final String hint = preset != null ? field.getHint() : null; - final String defaultValue = field.getDefaultValue(); row.valueType = preset != null ? preset.getValueType(key) : null; final boolean isName = Tags.isLikeAName(key); final Context context = rowLayout.getContext(); @@ -218,24 +217,6 @@ static TextRow getRow(@NonNull final TagFormFragment caller, @NonNull final Layo dialog.show(); }); } - if (ValueType.INTEGER == valueType) { - ourValueView.setFocusable(false); - ourValueView.setFocusableInTouchMode(false); - ourValueView.setOnClickListener(v -> { - final View finalView = v; - finalView.setEnabled(false); // debounce - IntegerValueFragment.show(caller, hint != null ? hint : key, key, ((TextView) v).getText().toString(), values, preset, allTags); - }); - } - if (ValueType.CARDINAL_DIRECTION == valueType) { - ourValueView.setFocusable(false); - ourValueView.setFocusableInTouchMode(false); - ourValueView.setOnClickListener(v -> { - final View finalView = v; - finalView.setEnabled(false); // debounce - DirectionValueFragment.show(caller, hint != null ? hint : key, key, ((TextView) v).getText().toString(), values, preset, allTags); - }); - } ourValueView.setOnFocusChangeListener((v, hasFocus) -> { Log.d(DEBUG_TAG, "onFocusChange"); String rowValue = row.getValue(); diff --git a/src/main/java/de/blau/android/propertyeditor/tagform/ValueWidgetRow.java b/src/main/java/de/blau/android/propertyeditor/tagform/ValueWidgetRow.java new file mode 100644 index 000000000..023eeeee1 --- /dev/null +++ b/src/main/java/de/blau/android/propertyeditor/tagform/ValueWidgetRow.java @@ -0,0 +1,115 @@ +package de.blau.android.propertyeditor.tagform; + +import java.util.List; +import java.util.Map; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import de.blau.android.R; +import de.blau.android.presets.PresetComboField; +import de.blau.android.presets.PresetItem; +import de.blau.android.presets.PresetTagField; +import de.blau.android.presets.ValueType; +import de.blau.android.propertyeditor.TagChanged; +import de.blau.android.util.StringWithDescription; +import de.blau.android.util.StringWithDescriptionAndIcon; +import de.blau.android.util.Value; +import de.blau.android.views.CustomAutoCompleteTextView; + +public class ValueWidgetRow extends DialogRow implements TagChanged { + + private ValueType valueType; + private PresetTagField field; + + /** + * Construct a row that will display a Dialog when clicked + * + * @param context Android Context + */ + public ValueWidgetRow(@NonNull Context context) { + super(context); + } + + /** + * Construct a row that will display a Dialog when clicked + * + * @param context Android Context + * @param attrs an AttributeSet + */ + public ValueWidgetRow(@NonNull Context context, AttributeSet attrs) { + super(context, attrs); + } + + /** + * Add a row that displays a dialog for selecting a single when clicked + * + * @param caller the calling TagFormFragment instance + * @param inflater the inflater to use + * @param rowLayout the Layout holding the roes + * @param preset the relevant PresetItem + * @param field the current PresetTagField + * @param value the current value + * @param values all relevant values (preset MRU etc) + * @param allTags all current tags + * @return + */ + static ValueWidgetRow getRow(@NonNull final TagFormFragment caller, @NonNull final LayoutInflater inflater, @NonNull final LinearLayout rowLayout, + @NonNull final PresetItem preset, @NonNull final PresetTagField field, @NonNull final String value, @Nullable final List values, + final Map allTags) { + final ValueWidgetRow row = (ValueWidgetRow) inflater.inflate(R.layout.tag_form_value_widget_row, rowLayout, false); + final String key = field.getKey(); + final String hint = preset != null ? field.getHint() : key; + row.keyView.setText(hint); + row.keyView.setTag(key); + row.setPreset(preset); + row.valueType = preset != null ? preset.getValueType(key) : null; + row.field = field; + + row.valueView.setHint(R.string.tag_dialog_value_hint); + row.setValue(value == null ? "" : value); + + row.valueView.setFocusable(false); + row.valueView.setFocusableInTouchMode(false); + row.setOnClickListener(v -> { + final View finalView = v; + finalView.setEnabled(false); // debounce + if (ValueType.INTEGER == row.valueType) { + IntegerValueFragment.show(caller, hint, key, row.getValue(), values, preset, allTags); + } + if (ValueType.CARDINAL_DIRECTION == row.valueType) { + DirectionValueFragment.show(caller, hint, key, row.getValue(), values, preset, allTags); + } + }); + return row; + } + + @Override + public void changed(String key, String value) { + if (key.equals(this.getKey())) { + valueView.setEnabled(true); + setValue(value); + } + } + + @Override + public void setValue(@NonNull String value) { + // it might be simpler to simply use the normal autocomplete adapter here + if (field instanceof PresetComboField) { + for (StringWithDescription swd : ((PresetComboField) field).getValues()) { + if (value.equals(swd.getValue())) { + setValue(swd); + return; + } + } + } + super.setValue(value); + } +} diff --git a/src/main/res/layout/tag_form_value_widget_row.xml b/src/main/res/layout/tag_form_value_widget_row.xml new file mode 100644 index 000000000..8c085094c --- /dev/null +++ b/src/main/res/layout/tag_form_value_widget_row.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + \ No newline at end of file