Календарь

This commit is contained in:
2023-04-04 19:45:58 +03:00
parent 39caedaab0
commit 260c1d7b6c
@@ -1,5 +1,6 @@
package ru.megboyzz.dnevnik.screens.ui.calendar package ru.megboyzz.dnevnik.screens.ui.calendar
import android.util.Log
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
@@ -14,11 +15,13 @@ import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.kizitonwose.calendar.compose.CalendarState
import com.kizitonwose.calendar.compose.HorizontalCalendar import com.kizitonwose.calendar.compose.HorizontalCalendar
import com.kizitonwose.calendar.compose.WeekCalendar import com.kizitonwose.calendar.compose.WeekCalendar
import com.kizitonwose.calendar.compose.rememberCalendarState import com.kizitonwose.calendar.compose.rememberCalendarState
import com.kizitonwose.calendar.compose.weekcalendar.rememberWeekCalendarState import com.kizitonwose.calendar.compose.weekcalendar.rememberWeekCalendarState
import com.kizitonwose.calendar.core.* import com.kizitonwose.calendar.core.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import ru.megboyzz.dnevnik.* import ru.megboyzz.dnevnik.*
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
@@ -68,14 +71,10 @@ fun NiceCalendar(
SimpleCalendarTitle( SimpleCalendarTitle(
currentMonth = visibleMonth.yearMonth, currentMonth = visibleMonth.yearMonth,
goToPrevious = { goToPrevious = {
monthScrollCoroutineScope.launch { state.scrollToPreviousMonth(monthScrollCoroutineScope)
state.animateScrollToMonth(state.firstVisibleMonth.yearMonth.previousMonth)
}
}, },
goToNext = { goToNext = {
monthScrollCoroutineScope.launch { state.scrollToNextMonth(monthScrollCoroutineScope)
state.animateScrollToMonth(state.firstVisibleMonth.yearMonth.nextMonth)
}
}, },
transitionEnabled = transitionEnabled transitionEnabled = transitionEnabled
) )
@@ -94,7 +93,7 @@ fun NiceCalendar(
day = day, day = day,
isSelected = selections.contains(day.date) isSelected = selections.contains(day.date)
) { clickedDay -> ) { clickedDay ->
Log.i("Click!", "MonthDay is Clicked!")
//Чтобы два раза не вызывать week() //Чтобы два раза не вызывать week()
val week = clickedDay.week() val week = clickedDay.week()
@@ -104,12 +103,12 @@ fun NiceCalendar(
}else selections.remove(day.date) }else selections.remove(day.date)
weekScrollCoroutineScope.launch { weekScrollCoroutineScope.launch {
weekState.startDate = clickedDay.date weekState.startDate = week.days.first().date
weekState.endDate = week.days.last().date
weekState.animateScrollToWeek(clickedDay.date) weekState.animateScrollToWeek(clickedDay.date)
} }
selectedWeek = if (selectedWeek == week) null else week selectedWeek = if (selectedWeek == week) null else week
onClick(clickedDay, currentMonth, currentMonth.year) onClick(clickedDay, currentMonth, currentMonth.year)
} }
}, },
@@ -126,10 +125,14 @@ fun NiceCalendar(
}, },
dayContent = { day -> dayContent = { day ->
WeekDay( WeekDay(
day = CalendarDay(day.date, DayPosition.InDate), day = day,
isSelected = selections.contains(day.date) isSelected = selections.contains(day.date)
) { calendarDay -> ) { calendarDay ->
Log.i("Click!", "WeekDay is Clicked!")
if(!selections.contains(day.date)) {
selections.removeIf { it != day.date }
selections.add(day.date)
}else selections.remove(day.date)
selectedWeek = null selectedWeek = null
} }
@@ -142,6 +145,21 @@ fun NiceCalendar(
} }
fun CalendarState.scrollToPreviousMonth(coroutineScope: CoroutineScope){
val it = this
coroutineScope.launch {
it.scrollToMonth(it.firstVisibleMonth.yearMonth.previousMonth)
}
}
fun CalendarState.scrollToNextMonth(coroutineScope: CoroutineScope){
val it = this
coroutineScope.launch {
it.scrollToMonth(it.firstVisibleMonth.yearMonth.nextMonth)
}
}
@Composable @Composable
fun CalendarNavigationIcon( fun CalendarNavigationIcon(
icon: Painter, icon: Painter,
@@ -273,16 +291,27 @@ fun MonthDay(
@Composable @Composable
fun WeekDay( fun WeekDay(
day: CalendarDay, day: WeekDay,
isSelected: Boolean, isSelected: Boolean,
onClick: (CalendarDay) -> Unit onClick: (CalendarDay) -> Unit
) { ) {
val newDay = day.copy(position = DayPosition.MonthDate) Log.i("WeekDay", day.toString())
val position = when(day.position){
WeekDayPosition.InDate -> DayPosition.MonthDate
WeekDayPosition.OutDate -> DayPosition.MonthDate
WeekDayPosition.RangeDate -> DayPosition.MonthDate
}
val newDay = CalendarDay(day.date, position)
Day(day = newDay, isSelected = isSelected, onClick = onClick) Day(day = newDay, isSelected = isSelected, onClick = onClick)
} }
@Composable @Composable
fun Day(day: CalendarDay, isSelected: Boolean, onClick: (CalendarDay) -> Unit) { fun Day(
day: CalendarDay,
isSelected: Boolean,
onClick: (CalendarDay) -> Unit
) {
Log.i("BaseDay", day.toString())
Box( Box(
modifier = Modifier modifier = Modifier
.aspectRatio(ratio = 1f) // This is important for square sizing! .aspectRatio(ratio = 1f) // This is important for square sizing!