diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index b5ef7161..9d7379d9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -21,13 +21,14 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.util.enumerations.IntIdentifiable +import timber.log.Timber import java.util.* import kotlin.collections.ArrayList open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable { - enum class Type(override var uniqueIdentifier: Int, var resId: Int) : IntIdentifiable { + enum class Type(override var uniqueIdentifier: Int, var resId: Int, var isEnabled: Boolean = true) : IntIdentifiable { LIST(0, R.string.enum_custom_field_type), NUMBER(1, R.string.number), AMOUNT(2, R.string.amount) @@ -72,16 +73,19 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa private var rowRepresentation: List = mutableListOf() - //helper + //helper - val isListType: Boolean - get() { return this.type == Type.LIST.uniqueIdentifier } - - val isAmountType: Boolean - get() { return this.type == Type.AMOUNT.uniqueIdentifier } + val isListType: Boolean + get() { + return this.type == Type.LIST.uniqueIdentifier + } + val isAmountType: Boolean + get() { + return this.type == Type.AMOUNT.uniqueIdentifier + } - override fun localizedTitle(context: Context): String { + override fun localizedTitle(context: Context): String { return this.name } @@ -118,12 +122,13 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa } override fun isValidForDelete(context: Context, realm: Realm): Boolean { - return true + val sessions = realm.where().contains("customFieldEntries.customField.id", id).findAll() + return sessions.isEmpty() } override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int { //TODO: - return R.string.relationship_error + return R.string.cf_entry_delete_popup_message } override val bottomSheetType: BottomSheetType @@ -247,6 +252,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa } entriesToDelete.forEach { + Timber.d("Delete entry: ${it.value} / ${it.id}") realm.where().equalTo("id", it.id).findFirst()?.deleteFromRealm() } entriesToDelete.clear() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt index 5c358258..7990e996 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt @@ -130,6 +130,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa override fun boolForRow(row: RowRepresentable): Boolean { return when (row) { CustomFieldRow.COPY_ON_DUPLICATE -> customField.duplicateValue + CustomFieldRow.TYPE -> isUpdating else -> super.boolForRow(row) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index 4493bc52..51ec4f92 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -23,6 +23,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat lateinit var rowRepresentableAdapter: RowRepresentableAdapter var shouldOpenKeyboard = true + var isUpdating = false override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) @@ -67,6 +68,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat proxyItem?.let { this.appBar.toolbar.title = this.liveDataType.updateEntityLocalizedTitle(requireContext()) deleteButtonShouldAppear = true + isUpdating = true } ?: run { this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext()) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index ed8dfffd..499fe8dd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -437,12 +437,18 @@ enum class RowViewType(private var layoutRes: Int) { chipGroup.removeAllViews() chipGroup.setOnCheckedChangeListener(null) - CustomField.Type.values().forEach { type -> + val currentChoice = adapter.dataSource.intForRow(row) + val isUpdating = adapter.dataSource.boolForRow(row) + + row.getChoices(currentChoice, isUpdating)?.forEach { type -> val chip = Chip(itemView.context) chip.id = type.ordinal chip.text = itemView.context.getString(type.resId) chip.chipStartPadding = 8f.px chip.chipEndPadding = 8f.px + chip.isEnabled = type.isEnabled + chip.alpha = if (type.isEnabled) 1f else 0.5f + chip.isChecked = adapter.dataSource.intForRow(row) == type.ordinal chipGroup.addView(chip) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt index f4df59a2..f85d24c9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt @@ -8,39 +8,51 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource { - TYPE, - COPY_ON_DUPLICATE; - - override val resId: Int? - get() { - return when (this) { - COPY_ON_DUPLICATE -> R.string.copy_on_duplicate - else -> null - } - } - - override val viewType: Int - get() { - return when (this) { - TYPE -> RowViewType.LIST.ordinal - COPY_ON_DUPLICATE -> RowViewType.TITLE_SWITCH.ordinal - } - } - - override val bottomSheetType: BottomSheetType - get() { - return when (this) { - TYPE -> BottomSheetType.NONE - COPY_ON_DUPLICATE -> BottomSheetType.NONE - } - } - - - override val choices: List<*>? - get() { - return when(this) { - TYPE -> CustomField.Type.values().toList() - else -> null - } - } + TYPE, + COPY_ON_DUPLICATE; + + override val resId: Int? + get() { + return when (this) { + COPY_ON_DUPLICATE -> R.string.copy_on_duplicate + else -> null + } + } + + override val viewType: Int + get() { + return when (this) { + TYPE -> RowViewType.LIST.ordinal + COPY_ON_DUPLICATE -> RowViewType.TITLE_SWITCH.ordinal + } + } + + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + TYPE -> BottomSheetType.NONE + COPY_ON_DUPLICATE -> BottomSheetType.NONE + } + } + + + override val choices: List? + get() { + return when (this) { + TYPE -> CustomField.Type.values().toList() + else -> null + } + } + + fun getChoices(currentChoiceIndex: Int, isUpdating: Boolean): List? { + val list = CustomField.Type.values().toList() + list.forEach { type -> + type.isEnabled = if (!isUpdating) { + true + } else { + !(currentChoiceIndex == CustomFieldRow.TYPE.ordinal || type == CustomField.Type.LIST) + } + } + return list + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/enumerations/SavableEnumeration.kt b/app/src/main/java/net/pokeranalytics/android/util/enumerations/SavableEnumeration.kt index d6ba4c99..a6914dbf 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/enumerations/SavableEnumeration.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/enumerations/SavableEnumeration.kt @@ -20,4 +20,4 @@ interface IntSearchable { interface IntIdentifiable { var uniqueIdentifier: Int -} \ No newline at end of file +} diff --git a/app/src/main/res/color/chips_background_states.xml b/app/src/main/res/color/chips_background_states.xml index 7d57a042..bd398e18 100755 --- a/app/src/main/res/color/chips_background_states.xml +++ b/app/src/main/res/color/chips_background_states.xml @@ -2,4 +2,9 @@ + \ No newline at end of file diff --git a/app/src/main/res/color/chips_stroke_states.xml b/app/src/main/res/color/chips_stroke_states.xml new file mode 100755 index 00000000..f0863fee --- /dev/null +++ b/app/src/main/res/color/chips_stroke_states.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/chips_text_states.xml b/app/src/main/res/color/chips_text_states.xml new file mode 100755 index 00000000..8f2660fa --- /dev/null +++ b/app/src/main/res/color/chips_text_states.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 99b100ee..eecdebee 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -300,7 +300,12 @@ @color/white @color/colorAccent 1dp - +