mirror of
https://github.com/szkolny-eu/szkolny-android.git
synced 2025-02-22 14:34:44 +01:00
[Grades] Implement not counting selected grades to average.
This commit is contained in:
parent
b9b4b0036f
commit
ed93627505
@ -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 }
|
get() { mYearAverageMode = mYearAverageMode ?: config.values.get("yearAverageMode", YEAR_ALL_GRADES); return mYearAverageMode ?: YEAR_ALL_GRADES }
|
||||||
set(value) { config.set("yearAverageMode", value); mYearAverageMode = value }
|
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
|
private var mHideImproved: Boolean? = null
|
||||||
var hideImproved: Boolean
|
var hideImproved: Boolean
|
||||||
get() { mHideImproved = mHideImproved ?: config.values.get("hideImproved", false); return mHideImproved ?: false }
|
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 }
|
get() { mMinusValue = mMinusValue ?: config.values.getFloat("minusValue"); return mMinusValue }
|
||||||
set(value) { config.set("minusValue", value); mMinusValue = value }
|
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
|
private var mDontCountGrades: List<String>? = null
|
||||||
var dontCountGrades: List<String>
|
var dontCountGrades: List<String>
|
||||||
get() { mDontCountGrades = mDontCountGrades ?: config.values.get("dontCountGrades", listOf()); return mDontCountGrades ?: listOf() }
|
get() { mDontCountGrades = mDontCountGrades ?: config.values.get("dontCountGrades", listOf()); return mDontCountGrades ?: listOf() }
|
||||||
|
@ -14,7 +14,7 @@ class ProfileConfigMigration(config: ProfileConfig) {
|
|||||||
|
|
||||||
if (dataVersion < 1) {
|
if (dataVersion < 1) {
|
||||||
grades.colorMode = COLOR_MODE_WEIGHTED
|
grades.colorMode = COLOR_MODE_WEIGHTED
|
||||||
grades.countZeroToAvg = true
|
grades.dontCountEnabled = false
|
||||||
grades.yearAverageMode = YEAR_ALL_GRADES
|
grades.yearAverageMode = YEAR_ALL_GRADES
|
||||||
ui.agendaViewType = AGENDA_DEFAULT
|
ui.agendaViewType = AGENDA_DEFAULT
|
||||||
|
|
||||||
|
@ -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_AVG
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_SEM
|
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 pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
class GradesConfigDialog(
|
class GradesConfigDialog(
|
||||||
val activity: AppCompatActivity,
|
val activity: AppCompatActivity,
|
||||||
@ -88,14 +89,34 @@ class GradesConfigDialog(
|
|||||||
else -> null
|
else -> null
|
||||||
}?.isChecked = true
|
}?.isChecked = true
|
||||||
|
|
||||||
b.dontCountZeroToAverage.isChecked = !profileConfig.countZeroToAvg
|
b.dontCountGrades.isChecked = profileConfig.dontCountEnabled && profileConfig.dontCountGrades.isNotEmpty()
|
||||||
b.hideImproved.isChecked = profileConfig.hideImproved
|
b.hideImproved.isChecked = profileConfig.hideImproved
|
||||||
b.averageWithoutWeight.isChecked = profileConfig.averageWithoutWeight
|
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() {
|
private fun saveConfig() {
|
||||||
profileConfig.plusValue = if (b.customPlusCheckBox.isChecked) b.customPlusValue.progress else null
|
profileConfig.plusValue = if (b.customPlusCheckBox.isChecked) b.customPlusValue.progress else null
|
||||||
profileConfig.minusValue = if (b.customMinusCheckBox.isChecked) b.customMinusValue.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() {
|
private fun initView() {
|
||||||
@ -127,7 +148,6 @@ class GradesConfigDialog(
|
|||||||
b.gradeAverageMode2.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_AVG_2_SEM }
|
b.gradeAverageMode2.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_AVG_2_SEM }
|
||||||
b.gradeAverageMode3.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_SEM_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.hideImproved.onChange { _, isChecked -> profileConfig.hideImproved = isChecked }
|
||||||
b.averageWithoutWeight.onChange { _, isChecked -> profileConfig.averageWithoutWeight = isChecked }
|
b.averageWithoutWeight.onChange { _, isChecked -> profileConfig.averageWithoutWeight = isChecked }
|
||||||
|
|
||||||
|
@ -53,6 +53,7 @@ class GradesFragment : Fragment(), CoroutineScope {
|
|||||||
GradesAdapter(activity)
|
GradesAdapter(activity)
|
||||||
}
|
}
|
||||||
private val manager by lazy { app.gradesManager }
|
private val manager by lazy { app.gradesManager }
|
||||||
|
private val dontCountEnabled by lazy { manager.dontCountEnabled }
|
||||||
private val dontCountGrades by lazy { manager.dontCountGrades }
|
private val dontCountGrades by lazy { manager.dontCountGrades }
|
||||||
private var expandSubjectId = 0L
|
private var expandSubjectId = 0L
|
||||||
|
|
||||||
@ -299,7 +300,9 @@ class GradesFragment : Fragment(), CoroutineScope {
|
|||||||
|
|
||||||
private fun countGrade(grade: Grade, averages: GradesAverages) {
|
private fun countGrade(grade: Grade, averages: GradesAverages) {
|
||||||
val value = manager.getGradeValue(grade)
|
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) {
|
when (grade.type) {
|
||||||
Grade.TYPE_NORMAL -> {
|
Grade.TYPE_NORMAL -> {
|
||||||
if (grade.value > 0f) {
|
if (grade.value > 0f) {
|
||||||
|
@ -16,7 +16,6 @@ import pl.szczodrzynski.edziennik.*
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade
|
import pl.szczodrzynski.edziennik.data.db.entity.Grade
|
||||||
import pl.szczodrzynski.edziennik.databinding.FragmentGradesEditorBinding
|
import pl.szczodrzynski.edziennik.databinding.FragmentGradesEditorBinding
|
||||||
import pl.szczodrzynski.edziennik.utils.Colors
|
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_AVG
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_SEM
|
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
|
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_AVG
|
||||||
@ -107,7 +106,7 @@ class GradesEditorFragment : Fragment() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
var weight = editorGrade.weight
|
var weight = editorGrade.weight
|
||||||
if (!config.countZeroToAvg && editorGrade.name == "0") {
|
if (config.dontCountEnabled && config.dontCountGrades.contains(editorGrade.name.toLowerCase().trim())) {
|
||||||
weight = 0f
|
weight = 0f
|
||||||
}
|
}
|
||||||
val value = editorGrade.value * weight
|
val value = editorGrade.value * weight
|
||||||
@ -172,7 +171,7 @@ class GradesEditorFragment : Fragment() {
|
|||||||
averageSemester = 0f
|
averageSemester = 0f
|
||||||
for (editorGrade in editorGrades) {
|
for (editorGrade in editorGrades) {
|
||||||
var weight = editorGrade.weight
|
var weight = editorGrade.weight
|
||||||
if (!config.countZeroToAvg && editorGrade.name == "0") {
|
if (config.dontCountEnabled && config.dontCountGrades.contains(editorGrade.name.toLowerCase().trim())) {
|
||||||
weight = 0f
|
weight = 0f
|
||||||
}
|
}
|
||||||
val value = editorGrade.value * weight
|
val value = editorGrade.value * weight
|
||||||
@ -215,7 +214,7 @@ class GradesEditorFragment : Fragment() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
var weight = grade.weight
|
var weight = grade.weight
|
||||||
if (!config.countZeroToAvg && grade.name == "0") {
|
if (config.dontCountEnabled && config.dontCountGrades.contains(grade.name.toLowerCase().trim())) {
|
||||||
weight = 0f
|
weight = 0f
|
||||||
}
|
}
|
||||||
val value = grade.value * weight
|
val value = grade.value * weight
|
||||||
|
@ -102,7 +102,7 @@ class StatsViewHolder(
|
|||||||
.show()
|
.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.customValueLayout.isVisible = b.customValueDivider.isVisible
|
||||||
b.customValueButton.onClick {
|
b.customValueButton.onClick {
|
||||||
GradesConfigDialog(activity, reloadOnDismiss = true)
|
GradesConfigDialog(activity, reloadOnDismiss = true)
|
||||||
|
@ -53,6 +53,8 @@ class GradesManager(val app: App) : CoroutineScope {
|
|||||||
get() = app.config.forProfile().grades.plusValue
|
get() = app.config.forProfile().grades.plusValue
|
||||||
val minusValue
|
val minusValue
|
||||||
get() = app.config.forProfile().grades.minusValue
|
get() = app.config.forProfile().grades.minusValue
|
||||||
|
val dontCountEnabled
|
||||||
|
get() = app.config.forProfile().grades.dontCountEnabled
|
||||||
val dontCountGrades
|
val dontCountGrades
|
||||||
get() = app.config.forProfile().grades.dontCountGrades
|
get() = app.config.forProfile().grades.dontCountGrades
|
||||||
val hideImproved
|
val hideImproved
|
||||||
@ -100,8 +102,10 @@ class GradesManager(val app: App) : CoroutineScope {
|
|||||||
return grade.value
|
return grade.value
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getGradeWeight(dontCountGrades: List<String>, grade: Grade): Float {
|
fun getGradeWeight(dontCountEnabled: Boolean, dontCountGrades: List<String>, grade: Grade): Float {
|
||||||
if (grade.name.toLowerCase() in dontCountGrades)
|
if (!dontCountEnabled)
|
||||||
|
return grade.weight
|
||||||
|
if (grade.name.toLowerCase().trim() in dontCountGrades)
|
||||||
return 0f
|
return 0f
|
||||||
return grade.weight
|
return grade.weight
|
||||||
}
|
}
|
||||||
|
@ -84,16 +84,32 @@
|
|||||||
android:background="@drawable/divider"/>
|
android:background="@drawable/divider"/>
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:id="@+id/dontCountZeroToAverage"
|
android:id="@+id/dontCountGrades"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:minHeight="0dp"
|
android:minHeight="0dp"
|
||||||
android:text="@string/settings_register_dont_count_zero_text"/>
|
android:text="@string/grades_config_dont_count_grades"/>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
|
||||||
|
android:hint="@string/grades_config_dont_count_hint"
|
||||||
|
app:placeholderText="@string/grades_config_dont_count_placeholder"
|
||||||
|
android:enabled="@{dontCountGrades.checked}">
|
||||||
|
|
||||||
|
<pl.szczodrzynski.edziennik.utils.TextInputKeyboardEdit
|
||||||
|
android:id="@+id/dontCountGradesText"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
tools:text="nb, 0, +, -, bz"/>
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:id="@+id/hideImproved"
|
android:id="@+id/hideImproved"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
android:minHeight="32dp"
|
android:minHeight="32dp"
|
||||||
android:text="@string/grades_config_dont_show_improved"/>
|
android:text="@string/grades_config_dont_show_improved"/>
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="8dp"
|
android:layout_margin="8dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:text="@string/grades_stats_custom_value_notice"
|
android:text="@string/grades_stats_custom_config_notice"
|
||||||
android:textAppearance="@style/NavView.TextView.Helper"
|
android:textAppearance="@style/NavView.TextView.Helper"
|
||||||
android:textSize="12sp"
|
android:textSize="12sp"
|
||||||
android:textStyle="italic" />
|
android:textStyle="italic" />
|
||||||
|
@ -1231,7 +1231,8 @@
|
|||||||
<string name="grades_stats_proposed_avg">Śr. ocen proponowanych:\n%s</string>
|
<string name="grades_stats_proposed_avg">Śr. ocen proponowanych:\n%s</string>
|
||||||
<string name="grades_stats_help_title">Obliczanie średniej wszystkich przedmiotów</string>
|
<string name="grades_stats_help_title">Obliczanie średniej wszystkich przedmiotów</string>
|
||||||
<string name="grades_stats_help_text">Ocena przewidywana z danego przedmiotu jest obliczana na podstawie aktualnej średniej ważonej.\n\nOcena jest liczbą całkowitą, jaką wystawił by nauczyciel bazując na średniej. Liczba zaokrąglona jest w górę jeśli część po przecinku przekroczy ,75.\nPrzykładowo: średnie 3,75 jak również 4,74 dają w wyniku ocenę dobrą (4).\n\nŚrednia przewidywana ze wszystkich przedmiotów obejmuje obliczone w ten sposób oceny końcowe.</string>
|
<string name="grades_stats_help_text">Ocena przewidywana z danego przedmiotu jest obliczana na podstawie aktualnej średniej ważonej.\n\nOcena jest liczbą całkowitą, jaką wystawił by nauczyciel bazując na średniej. Liczba zaokrąglona jest w górę jeśli część po przecinku przekroczy ,75.\nPrzykładowo: średnie 3,75 jak również 4,74 dają w wyniku ocenę dobrą (4).\n\nŚrednia przewidywana ze wszystkich przedmiotów obejmuje obliczone w ten sposób oceny końcowe.</string>
|
||||||
<string name="grades_stats_custom_value_notice">Została ustawiona własna wartość plusa/minusa. Jeśli uważasz, że średnia się nie zgadza, kliknij Konfiguruj.</string>
|
<string name="grades_stats_custom_value_notice">Została ustawiona własna wartość plusa/minusa. Jeśli uważasz, że się ona nie zgadza, kliknij Konfiguruj.</string>
|
||||||
|
<string name="grades_stats_custom_config_notice">Aktualne ustawienia ocen mogą wpływać na średnią. Jeśli uważasz, że się ona nie zgadza, kliknij Konfiguruj.</string>
|
||||||
<string name="configure">Konfiguruj</string>
|
<string name="configure">Konfiguruj</string>
|
||||||
<string name="menu_timetable_manual">Edytor planu lekcji</string>
|
<string name="menu_timetable_manual">Edytor planu lekcji</string>
|
||||||
<string name="dropdown_subject_custom">Własny przedmiot</string>
|
<string name="dropdown_subject_custom">Własny przedmiot</string>
|
||||||
@ -1257,4 +1258,7 @@
|
|||||||
<string name="grades_config_plus_value">Własna wartość plusa</string>
|
<string name="grades_config_plus_value">Własna wartość plusa</string>
|
||||||
<string name="timetable_syncing_text">Pobieranie planu lekcji na wybrany tydzień...</string>
|
<string name="timetable_syncing_text">Pobieranie planu lekcji na wybrany tydzień...</string>
|
||||||
<string name="dialog_event_manual_no_timetable">Nie pobrano planu lekcji...</string>
|
<string name="dialog_event_manual_no_timetable">Nie pobrano planu lekcji...</string>
|
||||||
|
<string name="grades_config_dont_count_grades">Wyklucz wybrane oceny ze średniej</string>
|
||||||
|
<string name="grades_config_dont_count_hint">Oceny oddziel przecinkiem</string>
|
||||||
|
<string name="grades_config_dont_count_placeholder">Podaj oceny...</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user