You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
6.8 KiB

package com.gyf.csams.association.model
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.gyf.csams.NOT_IMPL_TIP
import com.gyf.csams.uikit.ScrollList
import com.gyf.csams.uikit.StringForm
import kotlinx.coroutines.launch
import kotlin.random.Random
/**
* 题库界面类型
*
*/
enum class ExamActivityType(val menuName: String) {
//入团题库
SET_EXAM("入团题库"),
//入团申请表
JOIN_Association("入团申请表")
}
/**
* 题型
*
*/
enum class ExamType(val type: String) {
//选择题
CQ("选择题"),
//开放题
OQ("开放题")
}
sealed class Exam {
abstract val examType: ExamType
abstract val question: StringForm
}
/**
* 开放题
*
* @property examType 题型描述
* @property question 问题
*/
data class OpenQuestionsVo(
override val examType: ExamType = ExamType.OQ, override val question: StringForm
) : Exam()
/**
* 选择题
*
* @property examType 题型描述
* @property answers 答案
* @property rightAnswer 正确答案
* @property question 问题
*/
data class ChoiceQuestionVo(
override val examType: ExamType = ExamType.CQ,
val answers: List<StringForm>,
val rightAnswer: Int,
override val question: StringForm
) : Exam()
/**
* 问题长度
*/
const val QUESTION_TEXT_LENGTH = 30
/**
* 选择题选项数
*/
const val ANSWER_SIZE = 4
/**
* 答案长度
*
*/
const val ANSWER_TEXT_LENGTH = 15
/**
* 题库状态管理
*
*/
class ExamViewModel : ScrollList<Exam>() {
val questionIsNull: String = "问题不能为空"
val deleteLeastOne: String = "至少保留一道题目"
val updateExam = "更新题库"
val postAnswer = "提交答案"
val back = "返回"
val deleteTip = "确定删除此题目?"
val addTip = "确定添加此题目?"
val actionLabel = "确定"
override val initSize = 10
private val _newExam: MutableLiveData<Exam> = MutableLiveData(createExam(ExamType.CQ))
val newExam: LiveData<Exam> = _newExam
init {
load()
}
/**
* 切换题型
*
*/
fun switchType(exam: Exam) {
if (exam is ChoiceQuestionVo) _newExam.value = createExam(ExamType.OQ) else _newExam.value =
createExam(ExamType.CQ)
}
/**
* 创建题目
*
* @param type
* @return
*/
private fun createExam(type: ExamType): Exam {
val question = StringForm(formDesc = "问题", textLength = QUESTION_TEXT_LENGTH)
return when (type) {
ExamType.CQ -> ChoiceQuestionVo(
answers = ('A'..'D').map {
StringForm(
formDesc = "选项",
textLength = ANSWER_TEXT_LENGTH,
value = "选项$it"
)
},
rightAnswer = 0,
question = question
)
ExamType.OQ -> OpenQuestionsVo(question = question)
}
}
/**
* 更新题目
*
*/
fun update(oldExam: Exam, newExam: Exam) {
if (oldExam == _newExam.value) {
_newExam.value = newExam
} else {
_data.value?.apply {
this[indexOf(oldExam)] = newExam
val list = mutableListOf<Exam>()
list.addAll(this)
_data.value?.clear()
_data.value = list
}
}
}
/**
* TODO 更新题库
*
* @param callback
*/
fun updateExam(callback: (message: String) -> Unit) {
callback(NOT_IMPL_TIP)
}
/**
* TODO 提交答案
*
* @param callback
*/
fun postAnswer(callback: (message: String) -> Unit) {
callback(NOT_IMPL_TIP)
}
/**
* 加载题目
*
*/
override fun load() {
viewModelScope.launch {
_data.value?.apply {
repeat(initSize) {
if (Random.nextBoolean()) {
add(
OpenQuestionsVo(
question = StringForm(
formDesc = "问题",
textLength = QUESTION_TEXT_LENGTH,
value = "这是一道开放题:$size"
)
)
)
} else {
add(
ChoiceQuestionVo(
question = StringForm(
formDesc = "问题",
textLength = QUESTION_TEXT_LENGTH,
value = "这是一道选择题:$size"
),
answers = ('A'..'D').map {
StringForm(
formDesc = "选项",
textLength = ANSWER_TEXT_LENGTH,
value = "选项$it"
)
},
rightAnswer = Random.nextInt(ANSWER_SIZE)
)
)
}
}
}
}
}
/**
*TODO 加载更多题目
*
* @param callback
*/
override fun loadMore(callback: (message: String) -> Unit) {
// _data.value?.apply {
// val list= mutableListOf<Exam>()
// list.addAll(this)
// list.apply {
// repeat(10) {
// if (Random.nextBoolean()) add(OpenQuestionsVo(question = "这是一道开放题:$size")) else add(
// ChoiceQuestionVo(
// question = "这是一道选择题:$size,请从选项中选出正确答案",
// answers = listOf("选项A", "选项B", "选项C", "选项D"),
// rightAnswer = 3
// )
// )
// }
// }
// _data.postValue(list)
// callback("成功加载更多题目")
// }
// callback(NOT_IMPL_TIP)
}
fun addQuestion() {
_data.value?.apply {
_newExam.value?.let {
val list = mutableListOf<Exam>()
list.addAll(this)
list.add(it)
_data.postValue(list)
}
_newExam.value = createExam(ExamType.CQ)
}
}
/**
* TODO 删除题目
*
*/
fun deleteQuestion(exam: Exam) {
_data.value?.apply {
val list = mutableListOf<Exam>()
remove(exam)
list.addAll(this)
_data.postValue(list)
}
}
}