Improve custom field management UI

dev
Aurelien Hubert 7 years ago
parent ed9da94302
commit 44472999b0
  1. 18
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  2. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt
  3. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt
  4. 8
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  5. 14
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt
  6. 5
      app/src/main/res/color/chips_background_states.xml
  7. 6
      app/src/main/res/color/chips_stroke_states.xml
  8. 5
      app/src/main/res/color/chips_text_states.xml
  9. 7
      app/src/main/res/values/styles.xml

@ -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.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.enumerations.IntIdentifiable import net.pokeranalytics.android.util.enumerations.IntIdentifiable
import timber.log.Timber
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable { 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), LIST(0, R.string.enum_custom_field_type),
NUMBER(1, R.string.number), NUMBER(1, R.string.number),
AMOUNT(2, R.string.amount) AMOUNT(2, R.string.amount)
@ -75,11 +76,14 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
//helper //helper
val isListType: Boolean val isListType: Boolean
get() { return this.type == Type.LIST.uniqueIdentifier } get() {
return this.type == Type.LIST.uniqueIdentifier
}
val isAmountType: Boolean val isAmountType: Boolean
get() { return this.type == Type.AMOUNT.uniqueIdentifier } get() {
return this.type == Type.AMOUNT.uniqueIdentifier
}
override fun localizedTitle(context: Context): String { override fun localizedTitle(context: Context): String {
return this.name return this.name
@ -118,12 +122,13 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
} }
override fun isValidForDelete(context: Context, realm: Realm): Boolean { override fun isValidForDelete(context: Context, realm: Realm): Boolean {
return true val sessions = realm.where<Session>().contains("customFieldEntries.customField.id", id).findAll()
return sessions.isEmpty()
} }
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int { override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
//TODO: //TODO:
return R.string.relationship_error return R.string.cf_entry_delete_popup_message
} }
override val bottomSheetType: BottomSheetType override val bottomSheetType: BottomSheetType
@ -247,6 +252,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
} }
entriesToDelete.forEach { entriesToDelete.forEach {
Timber.d("Delete entry: ${it.value} / ${it.id}")
realm.where<CustomFieldEntry>().equalTo("id", it.id).findFirst()?.deleteFromRealm() realm.where<CustomFieldEntry>().equalTo("id", it.id).findFirst()?.deleteFromRealm()
} }
entriesToDelete.clear() entriesToDelete.clear()

@ -130,6 +130,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa
override fun boolForRow(row: RowRepresentable): Boolean { override fun boolForRow(row: RowRepresentable): Boolean {
return when (row) { return when (row) {
CustomFieldRow.COPY_ON_DUPLICATE -> customField.duplicateValue CustomFieldRow.COPY_ON_DUPLICATE -> customField.duplicateValue
CustomFieldRow.TYPE -> isUpdating
else -> super.boolForRow(row) else -> super.boolForRow(row)
} }
} }

@ -23,6 +23,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
lateinit var rowRepresentableAdapter: RowRepresentableAdapter lateinit var rowRepresentableAdapter: RowRepresentableAdapter
var shouldOpenKeyboard = true var shouldOpenKeyboard = true
var isUpdating = false
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState) super.onCreateView(inflater, container, savedInstanceState)
@ -67,6 +68,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
proxyItem?.let { proxyItem?.let {
this.appBar.toolbar.title = this.liveDataType.updateEntityLocalizedTitle(requireContext()) this.appBar.toolbar.title = this.liveDataType.updateEntityLocalizedTitle(requireContext())
deleteButtonShouldAppear = true deleteButtonShouldAppear = true
isUpdating = true
} ?: run { } ?: run {
this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext()) this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext())
} }

@ -437,12 +437,18 @@ enum class RowViewType(private var layoutRes: Int) {
chipGroup.removeAllViews() chipGroup.removeAllViews()
chipGroup.setOnCheckedChangeListener(null) 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) val chip = Chip(itemView.context)
chip.id = type.ordinal chip.id = type.ordinal
chip.text = itemView.context.getString(type.resId) chip.text = itemView.context.getString(type.resId)
chip.chipStartPadding = 8f.px chip.chipStartPadding = 8f.px
chip.chipEndPadding = 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 chip.isChecked = adapter.dataSource.intForRow(row) == type.ordinal
chipGroup.addView(chip) chipGroup.addView(chip)
} }

@ -36,11 +36,23 @@ enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource {
} }
override val choices: List<*>? override val choices: List<CustomField.Type>?
get() { get() {
return when (this) { return when (this) {
TYPE -> CustomField.Type.values().toList() TYPE -> CustomField.Type.values().toList()
else -> null else -> null
} }
} }
fun getChoices(currentChoiceIndex: Int, isUpdating: Boolean): List<CustomField.Type>? {
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
}
} }

@ -2,4 +2,9 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorAccent" android:state_checked="true" /> <item android:color="@color/colorAccent" android:state_checked="true" />
<item android:color="@android:color/transparent" /> <item android:color="@android:color/transparent" />
<!--
<item android:color="@color/colorAccent" android:state_checked="true" android:state_enabled="true" />
<item android:color="@color/green_transparent" android:state_checked="true" android:state_enabled="false" />
<item android:color="@android:color/transparent" />
-->
</selector> </selector>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/green" android:state_checked="true" android:state_enabled="true" />
<item android:color="@color/white_transparent" android:state_enabled="false" />
<item android:color="@color/white" />
</selector>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/white_transparent" android:state_enabled="false" />
<item android:color="@color/white" />
</selector>

@ -300,7 +300,12 @@
<item name="android:textColor">@color/white</item> <item name="android:textColor">@color/white</item>
<item name="chipStrokeColor">@color/colorAccent</item> <item name="chipStrokeColor">@color/colorAccent</item>
<item name="chipStrokeWidth">1dp</item> <item name="chipStrokeWidth">1dp</item>
<!--
<item name="chipBackgroundColor">@color/chips_background_states</item>
<item name="android:textColor">@color/chips_text_states</item>
<item name="chipStrokeColor">@color/chips_stroke_states</item>
<item name="chipStrokeWidth">1dp</item>
-->
</style> </style>
<!-- Subscription --> <!-- Subscription -->

Loading…
Cancel
Save