forked from github/szkolny
[UI] Refactor dropdown inputs code.
This commit is contained in:
parent
297867cbf3
commit
07fb1e0e12
@ -23,9 +23,7 @@ import pl.szczodrzynski.edziennik.data.api.events.ApiTaskAllFinishedEvent
|
||||
import pl.szczodrzynski.edziennik.data.api.events.ApiTaskErrorEvent
|
||||
import pl.szczodrzynski.edziennik.data.api.events.ApiTaskFinishedEvent
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.*
|
||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
||||
import pl.szczodrzynski.edziennik.data.db.full.LessonFull
|
||||
import pl.szczodrzynski.edziennik.databinding.DialogEventManualV2Binding
|
||||
@ -396,11 +394,11 @@ class EventManualDialog(
|
||||
private fun saveEvent() {
|
||||
val date = b.dateDropdown.getSelected() as? Date
|
||||
val timeSelected = b.timeDropdown.getSelected()
|
||||
val teamId = b.teamDropdown.getSelected() as? Long
|
||||
val type = b.typeDropdown.selected?.id
|
||||
val team = b.teamDropdown.getSelected()
|
||||
val type = b.typeDropdown.getSelected()
|
||||
val topic = b.topic.text?.toString()
|
||||
val subjectId = b.subjectDropdown.getSelected() as? Long
|
||||
val teacherId = b.teacherDropdown.getSelected()
|
||||
val subject = b.subjectDropdown.getSelected() as? Subject
|
||||
val teacher = b.teacherDropdown.getSelected()
|
||||
|
||||
val share = b.shareSwitch.isChecked
|
||||
|
||||
@ -431,7 +429,7 @@ class EventManualDialog(
|
||||
isError = true
|
||||
}
|
||||
|
||||
if (share && teamId == null) {
|
||||
if (share && team == null) {
|
||||
b.teamDropdown.error = app.getString(R.string.dialog_event_manual_team_choose)
|
||||
if (!isError) b.teamDropdown.parent.requestChildFocus(b.teamDropdown, b.teamDropdown)
|
||||
isError = true
|
||||
@ -467,10 +465,10 @@ class EventManualDialog(
|
||||
time = startTime,
|
||||
topic = topic,
|
||||
color = customColor,
|
||||
type = type ?: Event.TYPE_DEFAULT,
|
||||
teacherId = teacherId ?: -1,
|
||||
subjectId = subjectId ?: -1,
|
||||
teamId = teamId ?: -1,
|
||||
type = type?.id ?: Event.TYPE_DEFAULT,
|
||||
teacherId = teacher?.id ?: -1,
|
||||
subjectId = subject?.id ?: -1,
|
||||
teamId = team?.id ?: -1,
|
||||
addedDate = editingEvent?.addedDate ?: System.currentTimeMillis()
|
||||
).also {
|
||||
it.addedManually = true
|
||||
@ -478,7 +476,7 @@ class EventManualDialog(
|
||||
|
||||
val metadataObject = Metadata(
|
||||
profileId,
|
||||
when (type) {
|
||||
when (type?.id) {
|
||||
Event.TYPE_HOMEWORK -> Metadata.TYPE_HOMEWORK
|
||||
else -> Metadata.TYPE_EVENT
|
||||
},
|
||||
@ -578,10 +576,10 @@ class EventManualDialog(
|
||||
}
|
||||
|
||||
onSaveListener?.invoke(eventObject.withMetadata(metadataObject).also {
|
||||
it.subjectLongName = b.subjectDropdown.selected?.text?.toString()
|
||||
it.teacherName = b.teacherDropdown.selected?.text?.toString()
|
||||
it.teamName = b.teamDropdown.selected?.text?.toString()
|
||||
it.typeName = b.typeDropdown.selected?.text?.toString()
|
||||
it.subjectLongName = (b.subjectDropdown.getSelected() as? Subject)?.longName
|
||||
it.teacherName = b.teacherDropdown.getSelected()?.fullName
|
||||
it.teamName = b.teamDropdown.getSelected()?.name
|
||||
it.typeName = b.typeDropdown.getSelected()?.name
|
||||
})
|
||||
dialog.dismiss()
|
||||
Toast.makeText(activity, R.string.saved, Toast.LENGTH_SHORT).show()
|
||||
|
@ -175,7 +175,7 @@ class DateDropdown : TextInputDropDown {
|
||||
}
|
||||
}
|
||||
|
||||
fun pickerDialog() {
|
||||
private fun pickerDialog() {
|
||||
val date = getSelected() as? Date ?: Date.getToday()
|
||||
|
||||
MaterialDatePicker.Builder.datePicker()
|
||||
|
@ -5,9 +5,7 @@
|
||||
package pl.szczodrzynski.edziennik.ui.modules.views
|
||||
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.util.AttributeSet
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.mikepenz.iconics.IconicsDrawable
|
||||
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
|
||||
import com.mikepenz.iconics.utils.colorInt
|
||||
@ -23,18 +21,6 @@ class EventTypeDropdown : TextInputDropDown {
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||
|
||||
private val activity: AppCompatActivity?
|
||||
get() {
|
||||
var context: Context? = context ?: return null
|
||||
if (context is AppCompatActivity) return context
|
||||
while (context is ContextWrapper) {
|
||||
if (context is AppCompatActivity)
|
||||
return context
|
||||
context = context.baseContext
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
lateinit var db: AppDb
|
||||
var profileId: Int = 0
|
||||
var onTypeSelected: ((eventType: EventType) -> Unit)? = null
|
||||
@ -83,9 +69,7 @@ class EventTypeDropdown : TextInputDropDown {
|
||||
/**
|
||||
* Select an event type by the [typeId].
|
||||
*/
|
||||
fun selectType(typeId: Long) {
|
||||
select(typeId)
|
||||
}
|
||||
fun selectType(typeId: Long) = select(typeId)
|
||||
|
||||
/**
|
||||
* Select an event type by the [typeId] **if it's not selected yet**.
|
||||
|
@ -15,6 +15,7 @@ import kotlinx.coroutines.withContext
|
||||
import pl.szczodrzynski.edziennik.R
|
||||
import pl.szczodrzynski.edziennik.crc16
|
||||
import pl.szczodrzynski.edziennik.data.db.AppDb
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Subject
|
||||
import pl.szczodrzynski.edziennik.ui.dialogs.input
|
||||
import pl.szczodrzynski.edziennik.utils.TextInputDropDown
|
||||
|
||||
@ -40,7 +41,7 @@ class SubjectDropdown : TextInputDropDown {
|
||||
var showNoSubject = true
|
||||
var showCustomSubject = false
|
||||
var customSubjectName = ""
|
||||
var onSubjectSelected: ((subjectId: Long?) -> Unit)? = null
|
||||
var onSubjectSelected: ((subject: Subject?) -> Unit)? = null
|
||||
var onCustomSubjectSelected: ((subjectName: String) -> Unit)? = null
|
||||
|
||||
override fun create(context: Context) {
|
||||
@ -73,7 +74,7 @@ class SubjectDropdown : TextInputDropDown {
|
||||
list += subjects.map { Item(
|
||||
it.id,
|
||||
it.longName,
|
||||
tag = it.id
|
||||
tag = it
|
||||
) }
|
||||
|
||||
list
|
||||
@ -91,10 +92,11 @@ class SubjectDropdown : TextInputDropDown {
|
||||
}
|
||||
-1L -> {
|
||||
// no subject
|
||||
deselect()
|
||||
onSubjectSelected?.invoke(null)
|
||||
true
|
||||
false
|
||||
}
|
||||
is Long -> {
|
||||
is Subject -> {
|
||||
// selected a subject
|
||||
onSubjectSelected?.invoke(it.tag)
|
||||
true
|
||||
@ -104,7 +106,7 @@ class SubjectDropdown : TextInputDropDown {
|
||||
}
|
||||
}
|
||||
|
||||
fun customNameDialog() {
|
||||
private fun customNameDialog() {
|
||||
activity ?: return
|
||||
MaterialAlertDialogBuilder(activity!!)
|
||||
.setTitle("Własny przedmiot")
|
||||
@ -127,32 +129,37 @@ class SubjectDropdown : TextInputDropDown {
|
||||
.show()
|
||||
}
|
||||
|
||||
fun selectSubject(subjectId: Long) {
|
||||
if (select(subjectId) == null)
|
||||
select(Item(
|
||||
subjectId,
|
||||
"nieznany przedmiot ($subjectId)",
|
||||
tag = subjectId
|
||||
))
|
||||
/**
|
||||
* Select a subject by the [subjectId].
|
||||
*/
|
||||
fun selectSubject(subjectId: Long): Item? {
|
||||
if (subjectId == -1L) {
|
||||
deselect()
|
||||
return null
|
||||
}
|
||||
return select(subjectId)
|
||||
}
|
||||
|
||||
fun selectDefault(subjectId: Long?) {
|
||||
/**
|
||||
* Select a subject by the [subjectId] **if it's not selected yet**.
|
||||
*/
|
||||
fun selectDefault(subjectId: Long?): Item? {
|
||||
if (subjectId == null || selected != null)
|
||||
return
|
||||
selectSubject(subjectId)
|
||||
return null
|
||||
return selectSubject(subjectId)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the currently selected subject.
|
||||
* ### Returns:
|
||||
* - null if no valid subject is selected
|
||||
* - [Long] - the selected subject's ID
|
||||
* - [Subject] - the selected subject
|
||||
* - [String] - a custom subject name entered, if [showCustomSubject] == true
|
||||
*/
|
||||
fun getSelected(): Any? {
|
||||
return when (selected?.tag) {
|
||||
-1L -> null
|
||||
is Long -> selected?.tag as Long
|
||||
is Subject -> selected?.tag as Subject
|
||||
is String -> selected?.tag as String
|
||||
else -> null
|
||||
}
|
||||
|
@ -5,13 +5,12 @@
|
||||
package pl.szczodrzynski.edziennik.ui.modules.views
|
||||
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.util.AttributeSet
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import pl.szczodrzynski.edziennik.R
|
||||
import pl.szczodrzynski.edziennik.data.db.AppDb
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||
import pl.szczodrzynski.edziennik.utils.TextInputDropDown
|
||||
|
||||
class TeacherDropdown : TextInputDropDown {
|
||||
@ -19,22 +18,10 @@ class TeacherDropdown : TextInputDropDown {
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||
|
||||
private val activity: AppCompatActivity?
|
||||
get() {
|
||||
var context: Context? = context ?: return null
|
||||
if (context is AppCompatActivity) return context
|
||||
while (context is ContextWrapper) {
|
||||
if (context is AppCompatActivity)
|
||||
return context
|
||||
context = context.baseContext
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
lateinit var db: AppDb
|
||||
var profileId: Int = 0
|
||||
var showNoTeacher = true
|
||||
var onTeacherSelected: ((teacherId: Long?) -> Unit)? = null
|
||||
var onTeacherSelected: ((teacher: Teacher?) -> Unit)? = null
|
||||
|
||||
override fun create(context: Context) {
|
||||
super.create(context)
|
||||
@ -58,7 +45,7 @@ class TeacherDropdown : TextInputDropDown {
|
||||
list += teachers.map { Item(
|
||||
it.id,
|
||||
it.fullName,
|
||||
tag = it.id
|
||||
tag = it
|
||||
) }
|
||||
|
||||
list
|
||||
@ -71,10 +58,11 @@ class TeacherDropdown : TextInputDropDown {
|
||||
when (it.tag) {
|
||||
-1L -> {
|
||||
// no teacher
|
||||
deselect()
|
||||
onTeacherSelected?.invoke(null)
|
||||
true
|
||||
false
|
||||
}
|
||||
is Long -> {
|
||||
is Teacher -> {
|
||||
// selected a teacher
|
||||
onTeacherSelected?.invoke(it.tag)
|
||||
true
|
||||
@ -87,34 +75,33 @@ class TeacherDropdown : TextInputDropDown {
|
||||
/**
|
||||
* Select a teacher by the [teacherId].
|
||||
*/
|
||||
fun selectTeacher(teacherId: Long) {
|
||||
if (select(teacherId) == null)
|
||||
select(Item(
|
||||
teacherId,
|
||||
"nieznany nauczyciel ($teacherId)",
|
||||
tag = teacherId
|
||||
))
|
||||
fun selectTeacher(teacherId: Long): Item? {
|
||||
if (teacherId == -1L) {
|
||||
deselect()
|
||||
return null
|
||||
}
|
||||
return select(teacherId)
|
||||
}
|
||||
|
||||
/**
|
||||
* Select a teacher by the [teacherId] **if it's not selected yet**.
|
||||
*/
|
||||
fun selectDefault(teacherId: Long?) {
|
||||
fun selectDefault(teacherId: Long?): Item? {
|
||||
if (teacherId == null || selected != null)
|
||||
return
|
||||
selectTeacher(teacherId)
|
||||
return null
|
||||
return selectTeacher(teacherId)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the currently selected teacher.
|
||||
* ### Returns:
|
||||
* - null if no valid teacher is selected
|
||||
* - [Long] - the selected teacher's ID
|
||||
* - [Teacher] - the selected teacher
|
||||
*/
|
||||
fun getSelected(): Long? {
|
||||
fun getSelected(): Teacher? {
|
||||
return when (selected?.tag) {
|
||||
-1L -> null
|
||||
is Long -> selected?.tag as Long
|
||||
is Teacher -> selected?.tag as Teacher
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
@ -5,9 +5,7 @@
|
||||
package pl.szczodrzynski.edziennik.ui.modules.views
|
||||
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.util.AttributeSet
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import pl.szczodrzynski.edziennik.R
|
||||
@ -20,22 +18,10 @@ class TeamDropdown : TextInputDropDown {
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||
|
||||
private val activity: AppCompatActivity?
|
||||
get() {
|
||||
var context: Context? = context ?: return null
|
||||
if (context is AppCompatActivity) return context
|
||||
while (context is ContextWrapper) {
|
||||
if (context is AppCompatActivity)
|
||||
return context
|
||||
context = context.baseContext
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
lateinit var db: AppDb
|
||||
var profileId: Int = 0
|
||||
var showNoTeam = true
|
||||
var onTeamSelected: ((teamId: Long?) -> Unit)? = null
|
||||
var onTeamSelected: ((team: Team?) -> Unit)? = null
|
||||
|
||||
override fun create(context: Context) {
|
||||
super.create(context)
|
||||
@ -59,7 +45,7 @@ class TeamDropdown : TextInputDropDown {
|
||||
list += teams.map { Item(
|
||||
it.id,
|
||||
it.name,
|
||||
tag = it.id
|
||||
tag = it
|
||||
) }
|
||||
|
||||
list
|
||||
@ -72,10 +58,11 @@ class TeamDropdown : TextInputDropDown {
|
||||
when (it.tag) {
|
||||
-1L -> {
|
||||
// no team
|
||||
deselect()
|
||||
onTeamSelected?.invoke(null)
|
||||
true
|
||||
false
|
||||
}
|
||||
is Long -> {
|
||||
is Team -> {
|
||||
// selected a team
|
||||
onTeamSelected?.invoke(it.tag)
|
||||
true
|
||||
@ -85,21 +72,29 @@ class TeamDropdown : TextInputDropDown {
|
||||
}
|
||||
}
|
||||
|
||||
fun selectTeam(teamId: Long) {
|
||||
if (select(teamId) == null)
|
||||
select(Item(
|
||||
teamId,
|
||||
"nieznana grupa ($teamId)",
|
||||
tag = teamId
|
||||
))
|
||||
/**
|
||||
* Select a teacher by the [teamId].
|
||||
*/
|
||||
fun selectTeam(teamId: Long): Item? {
|
||||
if (teamId == -1L) {
|
||||
deselect()
|
||||
return null
|
||||
}
|
||||
return select(teamId)
|
||||
}
|
||||
|
||||
fun selectDefault(teamId: Long?) {
|
||||
/**
|
||||
* Select a team by the [teamId] **if it's not selected yet**.
|
||||
*/
|
||||
fun selectDefault(teamId: Long?): Item? {
|
||||
if (teamId == null || selected != null)
|
||||
return
|
||||
selectTeam(teamId)
|
||||
return null
|
||||
return selectTeam(teamId)
|
||||
}
|
||||
|
||||
/**
|
||||
* Select a team of the [Team.TYPE_CLASS] type.
|
||||
*/
|
||||
fun selectTeamClass() {
|
||||
select(items.singleOrNull {
|
||||
it.tag is Team && it.tag.type == Team.TYPE_CLASS
|
||||
@ -110,12 +105,12 @@ class TeamDropdown : TextInputDropDown {
|
||||
* Get the currently selected team.
|
||||
* ### Returns:
|
||||
* - null if no valid team is selected
|
||||
* - [Long] - the team's ID
|
||||
* - [Team] - the selected team
|
||||
*/
|
||||
fun getSelected(): Any? {
|
||||
fun getSelected(): Team? {
|
||||
return when (selected?.tag) {
|
||||
-1L -> null
|
||||
is Long -> selected?.tag as Long
|
||||
is Team -> selected?.tag as Team
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ class TimeDropdown : TextInputDropDown {
|
||||
return !noTimetable
|
||||
}
|
||||
|
||||
fun pickerDialog() {
|
||||
private fun pickerDialog() {
|
||||
val time = (getSelected() as? Pair<*, *>)?.first as? Time ?: Time.getNow()
|
||||
|
||||
MaterialTimePicker.Builder()
|
||||
|
@ -33,7 +33,7 @@ open class TextInputDropDown : TextInputEditText {
|
||||
val selectedId
|
||||
get() = selected?.id
|
||||
|
||||
fun updateText() {
|
||||
private fun updateText() {
|
||||
setText(selected?.displayText ?: selected?.text)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user