[Grades] Add option to hide improved grades. Make counting average without weight configurable.

This commit is contained in:
Kuba Szczodrzyński
2020-03-08 17:57:44 +01:00
parent 630361849c
commit e282af0e80
6 changed files with 109 additions and 26 deletions

View File

@ -26,6 +26,16 @@ class ProfileConfigGrades(private val config: ProfileConfig) {
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", true); return mHideImproved ?: true }
set(value) { config.set("hideImproved", value); mHideImproved = value }
private var mAverageWithoutWeight: Boolean? = null
var averageWithoutWeight: Boolean
get() { mAverageWithoutWeight = mAverageWithoutWeight ?: config.values.get("averageWithoutWeight", true); return mAverageWithoutWeight ?: true }
set(value) { config.set("averageWithoutWeight", value); mAverageWithoutWeight = value }
private var mPlusValue: Float? = null
var plusValue: Float?
get() { mPlusValue = mPlusValue ?: config.values.getFloat("plusValue"); return mPlusValue }

View File

@ -89,6 +89,8 @@ class GradesConfigDialog(
}?.isChecked = true
b.dontCountZeroToAverage.isChecked = !profileConfig.countZeroToAvg
b.hideImproved.isChecked = profileConfig.hideImproved
b.averageWithoutWeight.isChecked = profileConfig.averageWithoutWeight
}
private fun saveConfig() {
@ -125,6 +127,16 @@ class GradesConfigDialog(
b.gradeAverageMode2.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_AVG_2_SEM }
b.gradeAverageMode3.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_SEM_2_SEM }
b.dontCountZeroToAverage.setOnCheckedChangeListener { _, isChecked -> profileConfig.countZeroToAvg = !isChecked }
b.dontCountZeroToAverage.onChange { _, isChecked -> profileConfig.countZeroToAvg = !isChecked }
b.hideImproved.onChange { _, isChecked -> profileConfig.hideImproved = isChecked }
b.averageWithoutWeight.onChange { _, isChecked -> profileConfig.averageWithoutWeight = isChecked }
b.averageWithoutWeightHelp.onClick {
MaterialAlertDialogBuilder(activity)
.setTitle(R.string.grades_config_average_without_weight)
.setMessage(R.string.grades_config_average_without_weight_message)
.setPositiveButton(R.string.ok, null)
.show()
}
}
}

View File

@ -121,6 +121,8 @@ class GradesFragment : Fragment(), CoroutineScope {
var subject = GradesSubject(subjectId, "")
var semester = GradesSemester(0, 1)
val hideImproved = manager.hideImproved
// grades returned by the query are ordered
// by the subject ID, so it's easier and probably
// a bit faster to build all the models
@ -152,7 +154,10 @@ class GradesFragment : Fragment(), CoroutineScope {
Grade.TYPE_YEAR_PROPOSED -> subject.proposedGrade = grade
Grade.TYPE_YEAR_FINAL -> subject.finalGrade = grade
else -> {
semester.grades += grade
if (!hideImproved || grade.parentId ?: -1L == -1L) {
// hide improved grades if parent(new grade) ID is not set
semester.grades += grade
}
countGrade(grade, subject.averages)
countGrade(grade, semester.averages)
}
@ -247,8 +252,13 @@ class GradesFragment : Fragment(), CoroutineScope {
val weight = manager.getGradeWeight(dontCountGrades, grade)
when (grade.type) {
Grade.TYPE_NORMAL -> {
averages.normalSum += value
averages.normalCount ++
if (grade.value > 0f) {
// count to the arithmetic average
// only if value more than 0
// to exclude "+", "-", "np" etc.
averages.normalSum += value
averages.normalCount++
}
averages.normalWeightedSum += value * weight
averages.normalWeightedCount += weight
}

View File

@ -45,6 +45,10 @@ class GradesManager(val app: App) {
get() = app.config.forProfile().grades.minusValue
val dontCountGrades
get() = app.config.forProfile().grades.dontCountGrades
val hideImproved
get() = app.config.forProfile().grades.hideImproved
val averageWithoutWeight
get() = app.config.forProfile().grades.averageWithoutWeight
fun getOrderByString() = when (orderBy) {
@ -142,7 +146,7 @@ class GradesManager(val app: App) {
averages.normalWeightedCount > 0f -> {
averages.normalWeightedSum / averages.normalWeightedCount
}
averages.normalSum > 0f && averages.normalCount > 0f -> {
averageWithoutWeight && averages.normalSum > 0f && averages.normalCount > 0f -> {
averages.normalSum / averages.normalCount
}
else -> null