add undo/redo, link
This commit is contained in:
parent
b5d6fedffc
commit
a914912b76
BIN
.idea/caches/build_file_checksums.ser
generated
BIN
.idea/caches/build_file_checksums.ser
generated
Binary file not shown.
@ -1,9 +1,12 @@
|
|||||||
package adrienmalin.pingpoints
|
package adrienmalin.pingpoints
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
|
import android.text.method.LinkMovementMethod
|
||||||
|
import android.widget.TextView
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CreditsActivity : AppCompatActivity() {
|
class CreditsActivity : AppCompatActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@ -11,6 +14,7 @@ class CreditsActivity : AppCompatActivity() {
|
|||||||
setContentView(R.layout.activity_credits)
|
setContentView(R.layout.activity_credits)
|
||||||
setSupportActionBar(findViewById(R.id.toolbar))
|
setSupportActionBar(findViewById(R.id.toolbar))
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
|
findViewById<TextView>(R.id.iconsCredit)?.movementMethod = LinkMovementMethod.getInstance()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
@ -8,6 +8,7 @@ import android.view.View
|
|||||||
import android.widget.Button
|
import android.widget.Button
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.support.v7.app.AppCompatDelegate
|
import android.support.v7.app.AppCompatDelegate
|
||||||
|
import android.support.v7.view.menu.ActionMenuItem
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
@ -22,8 +23,10 @@ class MainActivity : AppCompatActivity(), StarterNameDialog.StarterNameDialogLis
|
|||||||
var textService: android.widget.TextView? = null
|
var textService: android.widget.TextView? = null
|
||||||
var buttons: Array<Button> = emptyArray()
|
var buttons: Array<Button> = emptyArray()
|
||||||
var imageViews: Array<ImageView?> = emptyArray()
|
var imageViews: Array<ImageView?> = emptyArray()
|
||||||
var history: ArrayList<State> = ArrayList()
|
var history: MutableList<State> = ArrayList()
|
||||||
var step: Int = 0
|
var step: Int = 0
|
||||||
|
var undo: MenuItem? = null
|
||||||
|
var redo: MenuItem? = null
|
||||||
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@ -31,7 +34,6 @@ class MainActivity : AppCompatActivity(), StarterNameDialog.StarterNameDialogLis
|
|||||||
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
|
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
|
||||||
setContentView(R.layout.activity_main)
|
setContentView(R.layout.activity_main)
|
||||||
setSupportActionBar(findViewById(R.id.toolbar))
|
setSupportActionBar(findViewById(R.id.toolbar))
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
|
||||||
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
|
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
|
||||||
}
|
}
|
||||||
@ -41,7 +43,6 @@ class MainActivity : AppCompatActivity(), StarterNameDialog.StarterNameDialogLis
|
|||||||
Player(names[Side.LEFT.value]),
|
Player(names[Side.LEFT.value]),
|
||||||
Player(names[Side.RIGHT.value])
|
Player(names[Side.RIGHT.value])
|
||||||
)
|
)
|
||||||
|
|
||||||
textScore = findViewById(R.id.textScore)
|
textScore = findViewById(R.id.textScore)
|
||||||
textService = findViewById(R.id.textService)
|
textService = findViewById(R.id.textService)
|
||||||
buttons = arrayOf(
|
buttons = arrayOf(
|
||||||
@ -52,18 +53,30 @@ class MainActivity : AppCompatActivity(), StarterNameDialog.StarterNameDialogLis
|
|||||||
findViewById(R.id.imgLeftService),
|
findViewById(R.id.imgLeftService),
|
||||||
findViewById(R.id.imgRightService)
|
findViewById(R.id.imgRightService)
|
||||||
)
|
)
|
||||||
|
|
||||||
updateUI()
|
updateUI()
|
||||||
|
|
||||||
openStarterNameDialog()
|
openStarterNameDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
menuInflater.inflate(R.menu.main, menu)
|
menuInflater.inflate(R.menu.main, menu)
|
||||||
|
undo = menu.findItem(R.id.action_undo)
|
||||||
|
redo = menu.findItem(R.id.action_redo)
|
||||||
return super.onCreateOptionsMenu(menu)
|
return super.onCreateOptionsMenu(menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
|
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
|
||||||
|
R.id.action_undo -> {
|
||||||
|
step--
|
||||||
|
reloadState()
|
||||||
|
redo?.isVisible = true
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.action_redo -> {
|
||||||
|
step++
|
||||||
|
reloadState()
|
||||||
|
undo?.isVisible = true
|
||||||
|
true
|
||||||
|
}
|
||||||
R.id.action_new_match -> {
|
R.id.action_new_match -> {
|
||||||
startActivity(
|
startActivity(
|
||||||
Intent(this, MainActivity::class.java).apply {
|
Intent(this, MainActivity::class.java).apply {
|
||||||
@ -81,15 +94,34 @@ class MainActivity : AppCompatActivity(), StarterNameDialog.StarterNameDialogLis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reloadState(): {
|
fun saveState() {
|
||||||
history[step].apply{
|
val state = State(players.map { it.score }, serviceSide)
|
||||||
players.zip(score).forEach{(player, playerScore) -> player.score = playerScore}
|
if (step == history.size) {
|
||||||
serviceSide = service
|
history.add(state)
|
||||||
|
} else {
|
||||||
|
history[step] = state
|
||||||
|
history = history.subList(0, step+1).toMutableList()
|
||||||
|
}
|
||||||
|
if (step > 0) {
|
||||||
|
undo?.isVisible = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reloadState() {
|
||||||
|
history[step].let{
|
||||||
|
players.zip(it.score).forEach{(player, score) -> player.score = score}
|
||||||
|
serviceSide = it.serviceSide
|
||||||
relaunchSide = when(serviceSide) {
|
relaunchSide = when(serviceSide) {
|
||||||
Side.LEFT -> Side.RIGHT
|
Side.LEFT -> Side.RIGHT
|
||||||
Side.RIGHT -> Side.LEFT
|
Side.RIGHT -> Side.LEFT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
when(step){
|
||||||
|
0 -> undo?.isVisible = false
|
||||||
|
history.size - 1 -> redo?.isVisible = false
|
||||||
|
}
|
||||||
|
this.step = step
|
||||||
|
updateUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun openStarterNameDialog() {
|
fun openStarterNameDialog() {
|
||||||
@ -108,7 +140,7 @@ class MainActivity : AppCompatActivity(), StarterNameDialog.StarterNameDialogLis
|
|||||||
Side.LEFT -> Side.RIGHT
|
Side.LEFT -> Side.RIGHT
|
||||||
Side.RIGHT -> Side.LEFT
|
Side.RIGHT -> Side.LEFT
|
||||||
}
|
}
|
||||||
|
saveState()
|
||||||
updateUI()
|
updateUI()
|
||||||
Toast.makeText(applicationContext, R.string.info, Toast.LENGTH_LONG).show()
|
Toast.makeText(applicationContext, R.string.info, Toast.LENGTH_LONG).show()
|
||||||
}
|
}
|
||||||
@ -142,25 +174,18 @@ class MainActivity : AppCompatActivity(), StarterNameDialog.StarterNameDialogLis
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun updateScore(scoringPlayer: Player) {
|
fun updateScore(scoringPlayer: Player) {
|
||||||
val state = State(players.map { it.score }, serviceSide)
|
|
||||||
if (step >= history.size) {
|
|
||||||
history.add(state)
|
|
||||||
} else {
|
|
||||||
history.removeAt(step + 1)
|
|
||||||
history[step] = state
|
|
||||||
}
|
|
||||||
step ++
|
|
||||||
|
|
||||||
if ( !matchIsFinished() ) {
|
if ( !matchIsFinished() ) {
|
||||||
|
step++
|
||||||
scoringPlayer.score++
|
scoringPlayer.score++
|
||||||
if (players.sumBy { it.score } % 2 == 0) {
|
if (players.sumBy { it.score } % 2 == 0) {
|
||||||
serviceSide = relaunchSide.also { relaunchSide = serviceSide }
|
serviceSide = relaunchSide.also { relaunchSide = serviceSide }
|
||||||
}
|
}
|
||||||
|
saveState()
|
||||||
|
updateUI()
|
||||||
}
|
}
|
||||||
if ( matchIsFinished() ) {
|
if ( matchIsFinished() ) {
|
||||||
openEndOfMatchDialog()
|
openEndOfMatchDialog()
|
||||||
}
|
}
|
||||||
updateUI()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun matchIsFinished(): Boolean {
|
fun matchIsFinished(): Boolean {
|
||||||
|
@ -47,7 +47,7 @@ class StarterNameDialog : DialogFragment() {
|
|||||||
setView(namesView)
|
setView(namesView)
|
||||||
setPositiveButton(R.string.go_button) { dialog, id ->
|
setPositiveButton(R.string.go_button) { dialog, id ->
|
||||||
mainActivity?.setStarterName(
|
mainActivity?.setStarterName(
|
||||||
when ((namesView.findViewById(R.id.radioGroup) as RadioGroup).checkedRadioButtonId) {
|
when (namesView.findViewById<RadioGroup>(R.id.radioGroup)?.checkedRadioButtonId) {
|
||||||
R.id.radioLeftPlayer -> Side.LEFT
|
R.id.radioLeftPlayer -> Side.LEFT
|
||||||
else -> Side.RIGHT
|
else -> Side.RIGHT
|
||||||
},
|
},
|
||||||
|
@ -19,7 +19,7 @@ enum class Side(val value:Int) {
|
|||||||
|
|
||||||
data class State(
|
data class State(
|
||||||
val score: List<Int>,
|
val score: List<Int>,
|
||||||
val service: Side
|
val serviceSide: Side
|
||||||
)
|
)
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
|
@ -42,8 +42,7 @@
|
|||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:paddingLeft="16dp"
|
android:gravity="left"
|
||||||
android:paddingRight="16dp"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Large"
|
android:textAppearance="@style/TextAppearance.AppCompat.Large"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/linearLayoutButtons"
|
app:layout_constraintBottom_toTopOf="@+id/linearLayoutButtons"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
@ -59,8 +58,7 @@
|
|||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:paddingLeft="16dp"
|
android:gravity="right|center"
|
||||||
android:paddingRight="16dp"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Large"
|
android:textAppearance="@style/TextAppearance.AppCompat.Large"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
@ -19,13 +19,13 @@
|
|||||||
android:id="@+id/radioLeftPlayer"
|
android:id="@+id/radioLeftPlayer"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="0"
|
||||||
android:checked="true"
|
android:checked="true"
|
||||||
android:inputType="text" />
|
android:inputType="text" />
|
||||||
|
|
||||||
<android.support.design.widget.TextInputEditText
|
<android.support.design.widget.TextInputEditText
|
||||||
android:id="@+id/inputLeftPlayerName"
|
android:id="@+id/inputLeftPlayerName"
|
||||||
android:layout_width="100dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:hint="@string/name"
|
android:hint="@string/name"
|
||||||
@ -36,12 +36,12 @@
|
|||||||
android:id="@+id/radioRightPlayer"
|
android:id="@+id/radioRightPlayer"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="0"
|
||||||
android:inputType="none" />
|
android:inputType="none" />
|
||||||
|
|
||||||
<android.support.design.widget.TextInputEditText
|
<android.support.design.widget.TextInputEditText
|
||||||
android:id="@+id/inputRightPlayerName"
|
android:id="@+id/inputRightPlayerName"
|
||||||
android:layout_width="100dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:hint="@string/name"
|
android:hint="@string/name"
|
||||||
|
@ -1,6 +1,20 @@
|
|||||||
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
|
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_undo"
|
||||||
|
android:icon="@drawable/ic_undo"
|
||||||
|
android:title="@string/undo"
|
||||||
|
app:showAsAction="ifRoom"
|
||||||
|
android:enabled="false" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_redo"
|
||||||
|
android:icon="@drawable/ic_redo"
|
||||||
|
android:title="@string/redo"
|
||||||
|
app:showAsAction="ifRoom"
|
||||||
|
android:visible="false" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_new_match"
|
android:id="@+id/action_new_match"
|
||||||
android:icon="@drawable/ic_new_match"
|
android:icon="@drawable/ic_new_match"
|
||||||
|
@ -17,8 +17,10 @@
|
|||||||
<string name="share_button">Partager</string>
|
<string name="share_button">Partager</string>
|
||||||
<string name="share_subject">Match Ping Points : %s contre %s</string>
|
<string name="share_subject">Match Ping Points : %s contre %s</string>
|
||||||
<string name="share_message">%s contre %s:\n%s a gagné par %d à %d\nPing Points est disponible sur Google Play</string>
|
<string name="share_message">%s contre %s:\n%s a gagné par %d à %d\nPing Points est disponible sur Google Play</string>
|
||||||
<string name="PingPointsCredits">Ping Points par Adrien Malingrey</string>
|
<string name="PingPointsCredits">Ping Points par Adrien Malin</string>
|
||||||
<string name="iconCredits"><div>Icônes par <a href="http://www.freepik.com" title="Freepik">Freepik</a> chez <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> Licence <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div></string>
|
<string name="iconCredits"><div>Icônes par <a href="http://www.freepik.com" title="Freepik">Freepik</a> chez <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> Licence <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div></string>
|
||||||
<string name="about">À propos</string>
|
<string name="about">À propos</string>
|
||||||
<string name="service_img_description">Service</string>
|
<string name="service_img_description">Service</string>
|
||||||
|
<string name="undo">Annuler</string>
|
||||||
|
<string name="redo">Rétablir</string>
|
||||||
</resources>
|
</resources>
|
@ -18,8 +18,10 @@
|
|||||||
<string name="share_subject">Ping Points Match: %s vs. %s</string>
|
<string name="share_subject">Ping Points Match: %s vs. %s</string>
|
||||||
<string name="share_message">%s vs. %s:\n%s won by %d to %d\n\nGet Ping Points on Google Play</string>
|
<string name="share_message">%s vs. %s:\n%s won by %d to %d\n\nGet Ping Points on Google Play</string>
|
||||||
<string name="radioText" translatable="false"></string>
|
<string name="radioText" translatable="false"></string>
|
||||||
<string name="PingPointsCredits">Ping Points by Adrien Malingrey</string>
|
<string name="PingPointsCredits">Ping Points by Adrien Malin</string>
|
||||||
<string name="iconCredits">Icons made by <a href="http://www.freepik.com" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></string>
|
<string name="iconCredits">Icons made by <a href="http://www.freepik.com" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></string>
|
||||||
<string name="about">About</string>
|
<string name="about">About</string>
|
||||||
<string name="service_img_description">Service</string>
|
<string name="service_img_description">Service</string>
|
||||||
|
<string name="undo">Undo</string>
|
||||||
|
<string name="redo">Redo</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user