Skip to content

Commit

Permalink
Merge pull request #6 from bitkid/sascha/improvements
Browse files Browse the repository at this point in the history
Sascha/improvements
  • Loading branch information
bitkid committed Feb 3, 2024
2 parents 2308c3b + c575894 commit e7ece9e
Show file tree
Hide file tree
Showing 7 changed files with 168 additions and 116 deletions.
8 changes: 8 additions & 0 deletions src/main/kotlin/com/bitkid/itsfranking/ITSFData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ data class ITSFPlayer(
fun hasFemaleRanking(): Boolean {
return rankings[Categories.womenDoubles] != null || rankings[Categories.womenSingles] != null
}

fun hasJuniorRankings(): Boolean {
return rankings[Categories.juniorDoubles] != null || rankings[Categories.juniorSingles] != null || rankings[Categories.classicJunior] != null
}

fun hasSeniorRankings(): Boolean {
return rankings[Categories.seniorDoubles] != null || rankings[Categories.seniorSingles] != null || rankings[Categories.classicSenior] != null
}
}

data class PlayerNameWithResults(val playerName: String, val results: List<ITSFPlayer>)
Expand Down
114 changes: 2 additions & 112 deletions src/main/kotlin/com/bitkid/itsfranking/ITSFRankingApp.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.bitkid.itsfranking

import com.bitkid.itsfranking.ui.*
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
Expand All @@ -10,62 +11,11 @@ import java.awt.Color
import java.awt.event.ActionEvent
import java.io.File
import java.nio.charset.Charset
import java.util.*
import javax.swing.*
import javax.swing.table.DefaultTableModel


private class RankingButtonPanel(clicked: (String) -> Unit) : JPanel(MigLayout("insets 0 0 0 0, wrap ${Categories.all.size}")) {
init {
Categories.all.forEach { c ->
add(JButton(c.name).apply {
addActionListener {
clicked(c.targetAudience)
}
}, "growx")
}
}
}

@OptIn(DelicateCoroutinesApi::class)
private class LoadPanel(private val jFrame: JFrame, private val load: suspend (String) -> Unit) : JPanel(MigLayout("insets 0 0 0 0, wrap 2")) {
init {
val tourField = JTextField(4)
tourField.text = "2023"
val button = JButton("Load").apply {
addActionListener {
val jDialog = showLoadingDialog(jFrame)
isEnabled = false
tourField.isEnabled = false

GlobalScope.launch(Dispatchers.IO) {
try {
load(tourField.text)
background = Color.GREEN
} catch (e: Exception) {
jDialog.dispose()
background = Color.RED
isEnabled = true
tourField.isEnabled = true
JOptionPane.showMessageDialog(
jFrame,
"Fetching data failed! \n ${e.stackTraceToString()}",
"Error",
JOptionPane.ERROR_MESSAGE
)
} finally {
jDialog.dispose()
}
}
}
}
add(tourField)
add(button, "growx")
}
}

@OptIn(DelicateCoroutinesApi::class)
private fun showLoadingDialog(jFrame: JFrame): JDialog {
fun showLoadingDialog(jFrame: JFrame): JDialog {
val jDialog = JDialog(jFrame, "loading", true)
jDialog.contentPane.layout = MigLayout()
jDialog.isUndecorated = true
Expand All @@ -81,62 +31,6 @@ private fun showLoadingDialog(jFrame: JFrame): JDialog {
return jDialog
}

@DelicateCoroutinesApi
private class LoadCsvPanel(private val jFrame: JFrame, private val load: (File, Charset, Category) -> Unit, private val isLoaded: () -> Boolean) : JPanel(MigLayout("insets 0 0 0 0")) {

private var currentDirectory = File(".")

init {
val charsetSelect = JComboBox(listOf("UTF-8", "ISO-8859-1", "WINDOWS-1252").toTypedArray())
charsetSelect.selectedIndex = 2

val category = JComboBox(Categories.all.map { it.name }.toTypedArray())
category.selectedIndex = 0

val button = JButton("Open File").apply {
addActionListener {
if (isLoaded()) {
val fileChooser = JFileChooser(currentDirectory)
fileChooser.isMultiSelectionEnabled = false
fileChooser.fileSelectionMode = JFileChooser.FILES_ONLY
val r = fileChooser.showOpenDialog(jFrame)
if (r == JFileChooser.APPROVE_OPTION) {
val dialog = showLoadingDialog(jFrame)
currentDirectory = fileChooser.selectedFile.parentFile
GlobalScope.launch(Dispatchers.IO) {
try {
val file = fileChooser.selectedFile
load(file, Charset.forName(charsetSelect.selectedItem!!.toString()), Categories.all.single { it.name == category.selectedItem!! })
} catch (e: Exception) {
dialog.dispose()
JOptionPane.showMessageDialog(
jFrame,
"Loading CSV list failed! \n ${e.stackTraceToString()}",
"Error",
JOptionPane.ERROR_MESSAGE
)
} finally {
dialog.dispose()
}
}
}
}
}
}
add(JLabel("Category:"))
add(category, "growx")
add(JLabel("Charset:"))
add(charsetSelect, "growx")
add(button, "growx")
}
}

private class ResultTableModel(columns: List<String>, private val editable: Boolean = false) : DefaultTableModel(Vector(columns), 0) {
override fun isCellEditable(row: Int, column: Int): Boolean {
return editable
}
}

@DelicateCoroutinesApi
object ITSFRankingApp {
private lateinit var itsfPlayers: ITSFPlayers
Expand Down Expand Up @@ -357,8 +251,4 @@ object ITSFRankingApp {
frame.isVisible = true
}
}

private fun ResultTableModel.addRow(data: List<*>) {
addRow(data.toTypedArray())
}
}
63 changes: 63 additions & 0 deletions src/main/kotlin/com/bitkid/itsfranking/ui/LoadCsvPanel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.bitkid.itsfranking.ui

import com.bitkid.itsfranking.Categories
import com.bitkid.itsfranking.Category
import com.bitkid.itsfranking.showLoadingDialog
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.miginfocom.swing.MigLayout
import java.io.File
import java.nio.charset.Charset
import javax.swing.*

@DelicateCoroutinesApi
class LoadCsvPanel(private val jFrame: JFrame, private val load: (File, Charset, Category) -> Unit, private val isLoaded: () -> Boolean) : JPanel(MigLayout("insets 0 0 0 0")) {

private var currentDirectory = File(System.getProperty("user.home"))

init {
val charsetSelect = JComboBox(listOf("UTF-8", "ISO-8859-1", "WINDOWS-1252").toTypedArray())
charsetSelect.selectedIndex = 2

val category = JComboBox(Categories.all.map { it.name }.toTypedArray())
category.selectedIndex = 0

val button = JButton("Open File").apply {
addActionListener {
if (isLoaded()) {
val fileChooser = JFileChooser(currentDirectory)
fileChooser.isMultiSelectionEnabled = false
fileChooser.fileSelectionMode = JFileChooser.FILES_ONLY
val r = fileChooser.showOpenDialog(jFrame)
if (r == JFileChooser.APPROVE_OPTION) {
val dialog = showLoadingDialog(jFrame)
currentDirectory = fileChooser.selectedFile.parentFile
GlobalScope.launch(Dispatchers.IO) {
try {
val file = fileChooser.selectedFile
load(file, Charset.forName(charsetSelect.selectedItem!!.toString()), Categories.all.single { it.name == category.selectedItem!! })
} catch (e: Exception) {
dialog.dispose()
JOptionPane.showMessageDialog(
jFrame,
"Loading CSV list failed! \n ${e.stackTraceToString()}",
"Error",
JOptionPane.ERROR_MESSAGE
)
} finally {
dialog.dispose()
}
}
}
}
}
}
add(JLabel("Category:"))
add(category, "growx")
add(JLabel("Charset:"))
add(charsetSelect, "growx")
add(button, "growx")
}
}
49 changes: 49 additions & 0 deletions src/main/kotlin/com/bitkid/itsfranking/ui/LoadPanel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.bitkid.itsfranking.ui

import com.bitkid.itsfranking.showLoadingDialog
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.miginfocom.swing.MigLayout
import java.awt.Color
import javax.swing.*

@OptIn(DelicateCoroutinesApi::class)
class LoadPanel(private val jFrame: JFrame, private val load: suspend (String) -> Unit) : JPanel(MigLayout("insets 0 0 0 0, wrap 3")) {
init {
val label = JLabel("Tour")
val tourField = JComboBox(listOf("2023", "2024").toTypedArray())
tourField.selectedIndex = 1
val button = JButton("Load").apply {
addActionListener {
val jDialog = showLoadingDialog(jFrame)
isEnabled = false
tourField.isEnabled = false

GlobalScope.launch(Dispatchers.IO) {
try {
load(tourField.selectedItem!!.toString())
background = Color.GREEN
} catch (e: Exception) {
jDialog.dispose()
background = Color.RED
isEnabled = true
tourField.isEnabled = true
JOptionPane.showMessageDialog(
jFrame,
"Fetching data failed! \n ${e.stackTraceToString()}",
"Error",
JOptionPane.ERROR_MESSAGE
)
} finally {
jDialog.dispose()
}
}
}
}
add(label)
add(tourField)
add(button, "growx")
}
}
18 changes: 18 additions & 0 deletions src/main/kotlin/com/bitkid/itsfranking/ui/RankingButtonPanel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.bitkid.itsfranking.ui

import com.bitkid.itsfranking.Categories
import net.miginfocom.swing.MigLayout
import javax.swing.JButton
import javax.swing.JPanel

class RankingButtonPanel(clicked: (String) -> Unit) : JPanel(MigLayout("insets 0 0 0 0, wrap ${Categories.all.size}")) {
init {
Categories.all.forEach { c ->
add(JButton(c.name).apply {
addActionListener {
clicked(c.targetAudience)
}
}, "growx")
}
}
}
14 changes: 14 additions & 0 deletions src/main/kotlin/com/bitkid/itsfranking/ui/ResultTableModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.bitkid.itsfranking.ui

import java.util.*
import javax.swing.table.DefaultTableModel

class ResultTableModel(columns: List<String>, private val editable: Boolean = false) : DefaultTableModel(Vector(columns), 0) {
override fun isCellEditable(row: Int, column: Int): Boolean {
return editable
}
}

fun ResultTableModel.addRow(data: List<*>) {
addRow(data.toTypedArray())
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@ import org.apache.commons.codec.language.bm.RuleType
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import strikt.api.expectThat
import strikt.assertions.hasSize
import strikt.assertions.isEqualTo
import strikt.assertions.isGreaterThan
import strikt.assertions.isTrue
import strikt.assertions.*
import java.io.File

class ITSFPlayerDatabaseReaderTest {
Expand Down Expand Up @@ -44,4 +41,17 @@ class ITSFPlayerDatabaseReaderTest {
expectThat(players.matchesName(engine.encode(simon.name), engine.encode("varos").split("|"))).isTrue()
expectThat(players.find("varos").size).isGreaterThan(1)
}

@Test
fun `player tests`() {
expectThat(players.find("pintilii").single().hasFemaleRanking()).isTrue()
expectThat(players.find("pintilii").single().hasJuniorRankings()).isFalse()
expectThat(players.find("pintilii").single().hasSeniorRankings()).isFalse()

expectThat(players.find("guscheh").single().hasSeniorRankings()).isFalse()
expectThat(players.find("guscheh").single().hasJuniorRankings()).isFalse()
expectThat(players.find("guscheh").single().hasFemaleRanking()).isFalse()

expectThat(players.find("bentivoglio").single().hasSeniorRankings()).isTrue()
}
}

0 comments on commit e7ece9e

Please sign in to comment.