Changes the PlayerSetup display, always shows the hero position

hh
Laurent 6 years ago
parent eaafa7b5e9
commit eb049a8ed2
  1. 4
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt
  2. 61
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryAdapter.kt
  3. 12
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt
  4. 45
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/HandHistoryViewModel.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/PlayerSetupRow.kt
  6. 10
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/PositionAdapter.kt
  7. 13
      app/src/main/java/net/pokeranalytics/android/ui/view/holder/RowViewHolder.kt
  8. 22
      app/src/main/res/layout/row_hhsettings_hero_position.xml
  9. 8
      app/src/main/res/layout/row_hhsettings_player_setup.xml
  10. 2
      app/src/main/res/layout/row_hhsettings_player_setup_read.xml
  11. 3
      app/src/main/res/values/strings.xml

@ -172,6 +172,10 @@ interface DisplayableDataSource {
return true return true
} }
fun backgroundColor(position: Int, row: RowRepresentable): Int? {
return null
}
} }
/** /**

@ -55,7 +55,8 @@ enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable {
PLAYER_SETUP_READ(R.layout.row_hhsettings_player_setup_read), PLAYER_SETUP_READ(R.layout.row_hhsettings_player_setup_read),
ANTE(R.layout.row_title_value), ANTE(R.layout.row_title_value),
BIG_BLIND_ANTE(R.layout.row_title_switch), BIG_BLIND_ANTE(R.layout.row_title_switch),
ACTION_READ(R.layout.row_hand_action_read) ACTION_READ(R.layout.row_hand_action_read),
HERO_POSITION(R.layout.row_hhsettings_hero_position)
; ;
override val viewType: Int = this.ordinal override val viewType: Int = this.ordinal
@ -113,14 +114,15 @@ class HandHistoryAdapter(
return when (rowType) { return when (rowType) {
HandRowType.DEFAULT -> RowViewHolder(layout) HandRowType.DEFAULT -> RowViewHolder(layout)
HandRowType.HEADER -> RowViewHolder(layout) HandRowType.HEADER -> RowViewHolder(layout)
HandRowType.ACTION -> RowHandAction(layout) HandRowType.ACTION -> RowActionHolder(layout)
HandRowType.STREET -> RowHandStreet(layout) HandRowType.STREET -> RowStreetHolder(layout)
HandRowType.PLAYER_SUMMARY -> RowHandPlayerSummary(layout) HandRowType.PLAYER_SUMMARY -> RowPlayerSummaryHolder(layout)
HandRowType.STRADDLE -> RowHandStraddle(layout) HandRowType.STRADDLE -> RowStraddleHolder(layout)
HandRowType.PLAYER_SETUP -> RowHandPlayerSetup(layout) HandRowType.PLAYER_SETUP -> RowPlayerSetupHolder(layout)
HandRowType.PLAYER_SETUP_READ -> RowHandReadOnlyPlayerSetup(layout) HandRowType.PLAYER_SETUP_READ -> RowReadOnlyPlayerSetupHolder(layout)
HandRowType.COMMENT -> RowViewHolder(layout) HandRowType.COMMENT -> RowViewHolder(layout)
HandRowType.ACTION_READ -> RowActionRead(layout) HandRowType.ACTION_READ -> RowActionReadHolder(layout)
HandRowType.HERO_POSITION -> RowPositionHolder(layout)
HandRowType.PLAYER_NUMBER, HandRowType.ANTE, HandRowType.BIG_BLIND_ANTE -> RowViewHolder(layout) HandRowType.PLAYER_NUMBER, HandRowType.ANTE, HandRowType.BIG_BLIND_ANTE -> RowViewHolder(layout)
} }
} }
@ -290,7 +292,7 @@ class HandHistoryAdapter(
} }
inner class RowHandStraddle(itemView: View) : RowHandHolder(itemView) { inner class RowStraddleHolder(itemView: View) : RowHandHolder(itemView) {
override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) {
super.onBind(position, row, adapter) super.onBind(position, row, adapter)
@ -325,7 +327,7 @@ class HandHistoryAdapter(
/** /**
* Display a hand action * Display a hand action
*/ */
inner class RowHandAction(itemView: View) : RowHandHolder(itemView) { inner class RowActionHolder(itemView: View) : RowHandHolder(itemView) {
init { init {
itemView.actionButton.tag = ComputedAction.Tag.ACTION.ordinal itemView.actionButton.tag = ComputedAction.Tag.ACTION.ordinal
@ -404,7 +406,7 @@ class HandHistoryAdapter(
} }
inner class RowActionRead(itemView: View) : RowHandHolder(itemView) { inner class RowActionReadHolder(itemView: View) : RowHandHolder(itemView) {
override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) {
@ -420,7 +422,7 @@ class HandHistoryAdapter(
/** /**
* Display a hand street * Display a hand street
*/ */
inner class RowHandStreet(itemView: View) : RowHandHolder(itemView) { inner class RowStreetHolder(itemView: View) : RowHandHolder(itemView) {
override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) {
super.onBind(position, row, adapter) super.onBind(position, row, adapter)
@ -436,7 +438,7 @@ class HandHistoryAdapter(
/** /**
* Display a hand action * Display a hand action
*/ */
inner class RowHandPlayerSummary(itemView: View) : RowHandHolder(itemView) { inner class RowPlayerSummaryHolder(itemView: View) : RowHandHolder(itemView) {
init { init {
itemView.handLayout.tag = PlayerCardsRow.Tag.CARDS.ordinal itemView.handLayout.tag = PlayerCardsRow.Tag.CARDS.ordinal
@ -502,7 +504,7 @@ class HandHistoryAdapter(
} }
} }
inner class RowHandReadOnlyPlayerSetup(itemView: View) : AbstractRowHandPlayerSetup(itemView) { inner class RowReadOnlyPlayerSetupHolder(itemView: View) : AbstractRowHandPlayerSetup(itemView) {
init { init {
itemView.ps_player_image.tag = PlayerSetupRow.Tag.PLAYER.ordinal itemView.ps_player_image.tag = PlayerSetupRow.Tag.PLAYER.ordinal
@ -520,7 +522,36 @@ class HandHistoryAdapter(
} }
inner class RowHandPlayerSetup(itemView: View) : AbstractRowHandPlayerSetup(itemView) { inner class RowPositionHolder(itemView: View) : RowHandHolder(itemView) {
private var positionAdapter: PositionAdapter = PositionAdapter()
private var positionViewManager: LinearLayoutManager =
LinearLayoutManager(itemView.context, RecyclerView.HORIZONTAL, false)
init {
itemView.position_recycler.apply {
setHasFixedSize(true)
layoutManager = positionViewManager
adapter = positionAdapter
}
}
override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) {
super.onBind(position, row, adapter)
this.positionAdapter.positions = adapter.dataSource.contentForRow(row, itemView.context, Position::class)
this.positionAdapter.setOnClickListener { pos ->
adapter.delegate?.onRowValueChanged(pos, row)
this.positionAdapter.notifyDataSetChanged()
}
val heroIndex = adapter.dataSource.intForRow(row)
positionAdapter.setSelectedPosition(heroIndex)
}
}
inner class RowPlayerSetupHolder(itemView: View) : AbstractRowHandPlayerSetup(itemView) {
private var positionAdapter: PositionAdapter = PositionAdapter() private var positionAdapter: PositionAdapter = PositionAdapter()
private var positionViewManager: LinearLayoutManager private var positionViewManager: LinearLayoutManager

@ -358,6 +358,10 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL
this.model.setBigBlindAnte(value as Boolean) this.model.setBigBlindAnte(value as Boolean)
this.handHistoryAdapter.notifyDataSetChanged() this.handHistoryAdapter.notifyDataSetChanged()
} }
HandRowType.HERO_POSITION -> {
this.model.setHeroPosition(value as Position)
this.handHistoryAdapter.notifyItemChanged(this.indexOfRowRepresentable(row))
}
is ComputedAction -> { is ComputedAction -> {
this.model.currentAmount = value as String this.model.currentAmount = value as String
} }
@ -372,10 +376,10 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL
this.handHistoryAdapter.notifyItemChanged(index) this.handHistoryAdapter.notifyItemChanged(index)
// Change the focus only for the row, don't look elsewhere // Change the focus only for the row, don't look elsewhere
val anyEmpty = row.tagsForCompletion().any { row.isFieldNeedsInput(it, this.model.handHistory) } // val anyEmpty = row.tagsForCompletion().any { row.isFieldNeedsInput(it, this.model.handHistory) }
if (anyEmpty) { // if (anyEmpty) {
this.findNextActionToEdit(index) // this.findNextActionToEdit(index)
} // }
} }
} }
} }

@ -288,6 +288,8 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra
rows.add(StraddleRowRepresentable(positions, this.straddlePositions)) rows.add(StraddleRowRepresentable(positions, this.straddlePositions))
} }
rows.add(HandRowType.HERO_POSITION)
this.playerSetups().forEach { this.playerSetups().forEach {
rows.add(it) rows.add(it)
} }
@ -791,6 +793,13 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra
} }
} }
override fun intForRow(row: RowRepresentable): Int {
return when (row) {
HandRowType.HERO_POSITION -> this.handHistory.heroIndex ?: - 1
else -> throw PAIllegalStateException("undefined intForRow for $row")
}
}
override fun editDescriptors(row: RowRepresentable): List<RowRepresentableEditDescriptor>? { override fun editDescriptors(row: RowRepresentable): List<RowRepresentableEditDescriptor>? {
return when (row) { return when (row) {
HandRowType.COMMENT -> listOf(RowRepresentableEditDescriptor(this.handHistory.comment, R.string.comment)) HandRowType.COMMENT -> listOf(RowRepresentableEditDescriptor(this.handHistory.comment, R.string.comment))
@ -841,24 +850,28 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra
val hh = this.handHistory val hh = this.handHistory
val arrangedSetups = hh.playerSetups.sortedBy { it.position }.map { val arrangedSetups = mutableListOf<PlayerSetupRow>()
val position = this.positionForIndex(it.position) if (hh.playerSetups.size < hh.numberOfPlayers) {
createPlayerSetupRow(it, position, false) arrangedSetups.add(createPlayerSetupRow(hero = false))
}.toMutableList()
val heroSetup = arrangedSetups.firstOrNull { it.playerSetup?.position == hh.heroIndex }
heroSetup?.let {
it.hero = true
arrangedSetups.remove(it)
arrangedSetups.add(0, it)
} ?: run {
arrangedSetups.add(0, createPlayerSetupRow(hero = true))
} }
if (arrangedSetups.size < hh.numberOfPlayers) { val existingSetups = hh.playerSetups.sortedBy { it.position }.map {
arrangedSetups.add(createPlayerSetupRow(hero = false)) val position = this.positionForIndex(it.position)
val hero = (it.position == hh.heroIndex)
createPlayerSetupRow(it, position, hero)
} }
arrangedSetups.addAll(existingSetups)
// val heroSetup = arrangedSetups.firstOrNull { it.playerSetup?.position == hh.heroIndex }
// heroSetup?.let {
// it.hero = true
// arrangedSetups.remove(it)
// arrangedSetups.add(0, it)
// } ?: run {
// arrangedSetups.add(0, createPlayerSetupRow(hero = true))
// }
return arrangedSetups return arrangedSetups
} }
@ -945,4 +958,8 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra
} ?: throw PAIllegalStateException("Click position not set for player selection") } ?: throw PAIllegalStateException("Click position not set for player selection")
} }
fun setHeroPosition(position: Position) {
this.handHistory.heroIndex = this.sortedActions.positions.indexOf(position)
}
} }

@ -46,7 +46,7 @@ class PlayerSetupRow(var hero: Boolean = false,
fun title(context: Context): String { fun title(context: Context): String {
return if (this.hero) { return if (this.hero) {
context.getString(R.string.hero) context.getString(R.string.set_hero_position)
} else { } else {
this.playerSetup?.let { setup -> this.playerSetup?.let { setup ->
setup.player?.name?.let { setup.player?.name?.let {
@ -55,7 +55,7 @@ class PlayerSetupRow(var hero: Boolean = false,
this.position?.value this.position?.value
} }
} ?: run { } ?: run {
context.getString(R.string.add_vilain) context.getString(R.string.set_position_details)
} }
} }
} }

@ -22,6 +22,8 @@ class PositionAdapter(var listener: PositionSelectionListener? = null) :
private var rawListener: ((Position) -> (Unit))? = null private var rawListener: ((Position) -> (Unit))? = null
private var selectedIndex: Int = -1
var positions: List<Position> = listOf() var positions: List<Position> = listOf()
set(value) { set(value) {
field = value field = value
@ -65,8 +67,16 @@ class PositionAdapter(var listener: PositionSelectionListener? = null) :
this.rawListener?.invoke(this.positions[position]) this.rawListener?.invoke(this.positions[position])
} }
override fun backgroundColor(position: Int, row: RowRepresentable): Int? {
return if (position == this.selectedIndex) R.color.kaki_lighter else R.color.kaki_medium
}
fun setOnClickListener(listener: (Position) -> (Unit)) { fun setOnClickListener(listener: (Position) -> (Unit)) {
this.rawListener = listener this.rawListener = listener
} }
fun setSelectedPosition(index: Int) {
this.selectedIndex = index
}
} }

@ -89,17 +89,8 @@ class RowViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Bindabl
else -> { // Standard row else -> { // Standard row
// View background // View background
itemView.findViewById<ViewGroup>(R.id.container)?.let { adapter.dataSource.backgroundColor(position, row)?.let { color ->
// it.setBackgroundColor(itemView.context.getColor(R.color.kaki)) itemView.findViewById<ViewGroup>(R.id.container)?.setBackgroundColor(itemView.context.getColor(color))
//
// val enabled = adapter.dataSource.isEnabled(row, 0)
// val color = if (enabled) {
// R.color.kaki_light
// } else {
// R.color.kaki
// }
// it.setBackgroundColor(itemView.context.getColor(color))
// it.isEnabled = enabled
} }
// Title // Title

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title"
android:text="@string/set_hero_position"
style="@style/PokerAnalyticsTheme.TextView.RowTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginStart="8dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/position_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -44,9 +43,9 @@
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_weight="1" android:layout_weight="1.2"
android:background="@drawable/rounded_board_background" android:background="@drawable/rounded_board_background"
android:layout_marginStart="16dp" android:layout_marginStart="8dp"
android:paddingStart="4dp" android:paddingStart="4dp"
android:paddingEnd="0dp" android:paddingEnd="0dp"
android:gravity="center"/> android:gravity="center"/>
@ -60,7 +59,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="end" android:gravity="end"
android:inputType="none" android:inputType="none"
android:maxLines="1" /> android:maxLines="1"
android:layout_marginStart="8dp" />
</LinearLayout> </LinearLayout>

@ -24,7 +24,7 @@
android:id="@+id/ps_hand_layout" android:id="@+id/ps_hand_layout"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginStart="16dp" android:layout_marginStart="8dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@drawable/rounded_board_background" android:background="@drawable/rounded_board_background"
android:gravity="center" android:gravity="center"

@ -792,7 +792,8 @@
<string name="rallin">r_allin</string> <string name="rallin">r_allin</string>
<string name="backspace"></string> <string name="backspace"></string>
<string name="mississipi">mississipi</string> <string name="mississipi">mississipi</string>
<string name="add_vilain">Add vilain</string> <string name="set_hero_position">Hero position</string>
<string name="set_position_details">Set position details</string>
<string name="forward">Forward</string> <string name="forward">Forward</string>
<string name="video">Video</string> <string name="video">Video</string>
<string name="text">Text</string> <string name="text">Text</string>

Loading…
Cancel
Save