[Grades] Implement not counting selected grades to average.

This commit is contained in:
Kuba Szczodrzyński
2020-03-11 16:57:12 +01:00
parent b9b4b0036f
commit ed93627505
10 changed files with 66 additions and 20 deletions

View File

@ -21,11 +21,6 @@ class ProfileConfigGrades(private val config: ProfileConfig) {
get() { mYearAverageMode = mYearAverageMode ?: config.values.get("yearAverageMode", YEAR_ALL_GRADES); return mYearAverageMode ?: YEAR_ALL_GRADES }
set(value) { config.set("yearAverageMode", value); mYearAverageMode = value }
private var mCountZeroToAvg: Boolean? = null
var countZeroToAvg: Boolean
get() { mCountZeroToAvg = mCountZeroToAvg ?: config.values.get("countZeroToAvg", true); return mCountZeroToAvg ?: true }
set(value) { config.set("countZeroToAvg", value); mCountZeroToAvg = value }
private var mHideImproved: Boolean? = null
var hideImproved: Boolean
get() { mHideImproved = mHideImproved ?: config.values.get("hideImproved", false); return mHideImproved ?: false }
@ -45,6 +40,11 @@ class ProfileConfigGrades(private val config: ProfileConfig) {
get() { mMinusValue = mMinusValue ?: config.values.getFloat("minusValue"); return mMinusValue }
set(value) { config.set("minusValue", value); mMinusValue = value }
private var mDontCountEnabled: Boolean? = null
var dontCountEnabled: Boolean
get() { mDontCountEnabled = mDontCountEnabled ?: config.values.get("dontCountEnabled", false); return mDontCountEnabled ?: false }
set(value) { config.set("dontCountEnabled", value); mDontCountEnabled = value }
private var mDontCountGrades: List<String>? = null
var dontCountGrades: List<String>
get() { mDontCountGrades = mDontCountGrades ?: config.values.get("dontCountGrades", listOf()); return mDontCountGrades ?: listOf() }

View File

@ -14,7 +14,7 @@ class ProfileConfigMigration(config: ProfileConfig) {
if (dataVersion < 1) {
grades.colorMode = COLOR_MODE_WEIGHTED
grades.countZeroToAvg = true
grades.dontCountEnabled = false
grades.yearAverageMode = YEAR_ALL_GRADES
ui.agendaViewType = AGENDA_DEFAULT

View File

@ -20,6 +20,7 @@ import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_AVG
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_SEM
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
import java.util.*
class GradesConfigDialog(
val activity: AppCompatActivity,
@ -88,14 +89,34 @@ class GradesConfigDialog(
else -> null
}?.isChecked = true
b.dontCountZeroToAverage.isChecked = !profileConfig.countZeroToAvg
b.dontCountGrades.isChecked = profileConfig.dontCountEnabled && profileConfig.dontCountGrades.isNotEmpty()
b.hideImproved.isChecked = profileConfig.hideImproved
b.averageWithoutWeight.isChecked = profileConfig.averageWithoutWeight
if (profileConfig.dontCountGrades.isEmpty()) {
b.dontCountGradesText.setText("nb, 0, bz, bd")
}
else {
b.dontCountGradesText.setText(profileConfig.dontCountGrades.join(", "))
}
}
private fun saveConfig() {
profileConfig.plusValue = if (b.customPlusCheckBox.isChecked) b.customPlusValue.progress else null
profileConfig.minusValue = if (b.customMinusCheckBox.isChecked) b.customMinusValue.progress else null
b.dontCountGradesText.setText(
b.dontCountGradesText
.text
?.toString()
?.toLowerCase(Locale.getDefault())
?.replace(", ", ",")
)
profileConfig.dontCountEnabled = b.dontCountGrades.isChecked
profileConfig.dontCountGrades = b.dontCountGradesText.text
?.split(",")
?.map { it.trim() }
?: listOf()
}
private fun initView() {
@ -127,7 +148,6 @@ class GradesConfigDialog(
b.gradeAverageMode2.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_AVG_2_SEM }
b.gradeAverageMode3.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_SEM_2_SEM }
b.dontCountZeroToAverage.onChange { _, isChecked -> profileConfig.countZeroToAvg = !isChecked }
b.hideImproved.onChange { _, isChecked -> profileConfig.hideImproved = isChecked }
b.averageWithoutWeight.onChange { _, isChecked -> profileConfig.averageWithoutWeight = isChecked }

View File

@ -53,6 +53,7 @@ class GradesFragment : Fragment(), CoroutineScope {
GradesAdapter(activity)
}
private val manager by lazy { app.gradesManager }
private val dontCountEnabled by lazy { manager.dontCountEnabled }
private val dontCountGrades by lazy { manager.dontCountGrades }
private var expandSubjectId = 0L
@ -299,7 +300,9 @@ class GradesFragment : Fragment(), CoroutineScope {
private fun countGrade(grade: Grade, averages: GradesAverages) {
val value = manager.getGradeValue(grade)
val weight = manager.getGradeWeight(dontCountGrades, grade)
val weight = manager.getGradeWeight(dontCountEnabled, dontCountGrades, grade)
if (weight == 0f)
return
when (grade.type) {
Grade.TYPE_NORMAL -> {
if (grade.value > 0f) {

View File

@ -16,7 +16,6 @@ import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Grade
import pl.szczodrzynski.edziennik.databinding.FragmentGradesEditorBinding
import pl.szczodrzynski.edziennik.utils.Colors
import pl.szczodrzynski.edziennik.utils.Themes
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_AVG
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_SEM
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_AVG
@ -107,7 +106,7 @@ class GradesEditorFragment : Fragment() {
continue
}
var weight = editorGrade.weight
if (!config.countZeroToAvg && editorGrade.name == "0") {
if (config.dontCountEnabled && config.dontCountGrades.contains(editorGrade.name.toLowerCase().trim())) {
weight = 0f
}
val value = editorGrade.value * weight
@ -172,7 +171,7 @@ class GradesEditorFragment : Fragment() {
averageSemester = 0f
for (editorGrade in editorGrades) {
var weight = editorGrade.weight
if (!config.countZeroToAvg && editorGrade.name == "0") {
if (config.dontCountEnabled && config.dontCountGrades.contains(editorGrade.name.toLowerCase().trim())) {
weight = 0f
}
val value = editorGrade.value * weight
@ -215,7 +214,7 @@ class GradesEditorFragment : Fragment() {
continue
}
var weight = grade.weight
if (!config.countZeroToAvg && grade.name == "0") {
if (config.dontCountEnabled && config.dontCountGrades.contains(grade.name.toLowerCase().trim())) {
weight = 0f
}
val value = grade.value * weight

View File

@ -102,7 +102,7 @@ class StatsViewHolder(
.show()
}
b.customValueDivider.isVisible = manager.plusValue != null || manager.minusValue != null
b.customValueDivider.isVisible = manager.dontCountEnabled || manager.plusValue != null || manager.minusValue != null
b.customValueLayout.isVisible = b.customValueDivider.isVisible
b.customValueButton.onClick {
GradesConfigDialog(activity, reloadOnDismiss = true)

View File

@ -53,6 +53,8 @@ class GradesManager(val app: App) : CoroutineScope {
get() = app.config.forProfile().grades.plusValue
val minusValue
get() = app.config.forProfile().grades.minusValue
val dontCountEnabled
get() = app.config.forProfile().grades.dontCountEnabled
val dontCountGrades
get() = app.config.forProfile().grades.dontCountGrades
val hideImproved
@ -100,8 +102,10 @@ class GradesManager(val app: App) : CoroutineScope {
return grade.value
}
fun getGradeWeight(dontCountGrades: List<String>, grade: Grade): Float {
if (grade.name.toLowerCase() in dontCountGrades)
fun getGradeWeight(dontCountEnabled: Boolean, dontCountGrades: List<String>, grade: Grade): Float {
if (!dontCountEnabled)
return grade.weight
if (grade.name.toLowerCase().trim() in dontCountGrades)
return 0f
return grade.weight
}