Move Calendar to its own view

This commit is contained in:
Vyn 2025-06-17 17:03:07 +02:00
parent a03e71890c
commit d26f2f5a9f
Signed by: vyn
GPG key ID: E1B2BE34E7A971E7
19 changed files with 407 additions and 137 deletions

View file

@ -34,15 +34,15 @@
AppWindow::AppWindow(mirai::Mirai *miraiInstance)
: miraiInstance_(miraiInstance), addSourceWindow_(miraiInstance),
editSourceWindow_(miraiInstance), settingsWindow_(miraiInstance), view_(miraiInstance)
editSourceWindow_(miraiInstance), settingsWindow_(miraiInstance),
editEventWindow_(miraiInstance), view_(miraiInstance)
{
sources_ = std::make_shared<slint::VectorModel<ui::Source>>();
days_ = std::make_shared<slint::VectorModel<ui::Day>>();
calendar_ = std::make_shared<slint::VectorModel<ui::CalendarDay>>();
unscheduledTasks_ = std::make_shared<slint::VectorModel<ui::TaskData>>();
auto sourcesNames = std::make_shared<slint::MapModel<ui::Source, slint::SharedString>>(
sources_,
[&](const ui::Source &a) {
sources_, [&](const ui::Source &a) {
return a.name;
}
);
@ -125,6 +125,9 @@ void AppWindow::setupCallbacks()
assert(source);
editSourceWindow_.open(source);
});
actions().on_open_add_event_window([&]() {
editEventWindow_.open();
});
actions().on_task_clicked([&](int sourceId, int taskId) {
auto source = miraiInstance_->getSourceById(sourceId);
@ -217,7 +220,7 @@ void AppWindow::setupCallbacks()
reloadTasks();
});
actions().on_delete_event_clicked([&](int sourceId, int eventId) {
actions().on_delete_event([&](int sourceId, int eventId) {
auto source = miraiInstance_->getSourceById(sourceId);
assert(source);
auto event = source->getEventById(eventId);
@ -228,10 +231,12 @@ void AppWindow::setupCallbacks()
reloadTasks();
});
actions().on_create_event([&](ui::NewEventParams newEventParams) {
actions().on_create_event([&](ui::CreateEventParams newEventParams) {
std::println("okkk");
const ui::Date &date = newEventParams.date;
const std::string dateStr = SlintDateToStdString(date);
auto source = miraiInstance_->getSourceById(newEventParams.sourceId);
const auto sourceId = models().get_default_source_index();
auto source = miraiInstance_->getSourceById(sourceId == -1 ? 0 : sourceId);
source->createEvent({
.title = std::string(newEventParams.title),
@ -244,23 +249,23 @@ void AppWindow::setupCallbacks()
reloadTasks();
});
actions().on_save_event([&](ui::SaveEventParams newEventParams) {
const ui::Date &date = newEventParams.date;
const std::string dateStr = SlintDateToStdString(date);
auto source = miraiInstance_->getSourceById(newEventParams.sourceId);
assert(source);
auto event = source->getEventById(newEventParams.id);
assert(event);
event->setTitle(std::string(newEventParams.title));
event->setStartTime(SlintTimeToMiraiTime(newEventParams.startsAt));
event->setEndTime(SlintTimeToMiraiTime(newEventParams.endsAt));
/*actions().on_save_event([&](ui::SaveEventParams newEventParams) {*/
/*const ui::Date &date = newEventParams.date;*/
/*const std::string dateStr = SlintDateToStdString(date);*/
/*auto source = miraiInstance_->getSourceById(newEventParams.sourceId);*/
/*assert(source);*/
/*auto event = source->getEventById(newEventParams.id);*/
/*assert(event);*/
/*event->setTitle(std::string(newEventParams.title));*/
/*event->setStartTime(SlintTimeToMiraiTime(newEventParams.startsAt));*/
/*event->setEndTime(SlintTimeToMiraiTime(newEventParams.endsAt));*/
// TODO we can't change the date of the event for now.
/*// TODO we can't change the date of the event for now.*/
miraiInstance_->save();
view_.update();
reloadTasks();
});
/*miraiInstance_->save();*/
/*view_.update();*/
/*reloadTasks();*/
/*});*/
}
std::shared_ptr<slint::VectorModel<slint::SharedString>>
@ -291,14 +296,16 @@ void AppWindow::reloadTasks()
std::chrono::sys_days(todayDate.toStdChrono())
)
.count();
slintDays->push_back(ui::Day{
.date = MiraiDateToSlintDate(currentDate),
.events = slintEvents,
.tasks = slintDayTasks,
.isLate = currentDate < todayDate,
.isToday = currentDate == todayDate,
.relativeDaysDiff = static_cast<int>(relativeDaysDiff)
});
slintDays->push_back(
ui::Day{
.date = MiraiDateToSlintDate(currentDate),
.events = slintEvents,
.tasks = slintDayTasks,
.isLate = currentDate < todayDate,
.isToday = currentDate == todayDate,
.relativeDaysDiff = static_cast<int>(relativeDaysDiff)
}
);
// Day's tasks
const std::vector<mirai::Task> tasksForDate = view_.getTasksForDate(currentDate);
for (int taskIndex = 0; taskIndex < tasksForDate.size(); ++taskIndex) {
@ -317,14 +324,16 @@ void AppWindow::reloadTasks()
for (int eventIndex = 0; eventIndex < eventsForDate.size(); ++eventIndex) {
auto &currentEvent = eventsForDate.at(eventIndex);
auto slintTasks = std::make_shared<slint::VectorModel<ui::TaskData>>();
slintEvents->push_back(ui::Event{
.sourceId = currentEvent.sourceId(),
.id = currentEvent.id(),
.title = slint::SharedString(currentEvent.title()),
.startsAt = MiraiTimeToSlintTime(currentEvent.startsAt()),
.endsAt = MiraiTimeToSlintTime(currentEvent.endsAt()),
.tasks = slintTasks,
});
slintEvents->push_back(
ui::Event{
.sourceId = currentEvent.sourceId(),
.id = currentEvent.id(),
.title = slint::SharedString(currentEvent.title()),
.startsAt = MiraiTimeToSlintTime(currentEvent.startsAt()),
.endsAt = MiraiTimeToSlintTime(currentEvent.endsAt()),
.tasks = slintTasks,
}
);
auto eventTasks = currentEvent.queryTasks();
for (int taskIndex = 0; taskIndex < eventTasks.size(); ++taskIndex) {
auto &task = eventTasks.at(taskIndex);
@ -370,25 +379,29 @@ void AppWindow::reloadTasks()
std::chrono::sys_days(todayDate.toStdChrono())
)
.count();
if (relativeDaysDiff < 0 || relativeDaysDiff >= 3) {
if (relativeDaysDiff < 0 || relativeDaysDiff >= 7) {
continue;
}
const std::vector<mirai::Event> eventsForDate = view_.getEventsForDate(currentDate);
for (int eventIndex = 0; eventIndex < eventsForDate.size(); ++eventIndex) {
auto &currentEvent = eventsForDate.at(eventIndex);
slintEvents->push_back(ui::CalendarDayEvent{
.title = slint::SharedString(currentEvent.title()),
.startsAt = MiraiTimeToSlintTime(currentEvent.startsAt()),
.endsAt = MiraiTimeToSlintTime(currentEvent.endsAt()),
});
slintEvents->push_back(
ui::CalendarDayEvent{
.sourceId = currentEvent.sourceId(),
.id = currentEvent.id(),
.title = slint::SharedString(currentEvent.title()),
.startsAt = MiraiTimeToSlintTime(currentEvent.startsAt()),
.endsAt = MiraiTimeToSlintTime(currentEvent.endsAt()),
}
);
}
auto calendarDay = ui::CalendarDay{
.events = slintEvents,
.date = MiraiDateToSlintDate(currentDate),
.header =
slint::SharedString(capitalize(formatDateRelative(MiraiDateToSlintDate(currentDate))
))
.header = slint::SharedString(
capitalize(formatDateRelative(MiraiDateToSlintDate(currentDate)))
)
};
calendar_->push_back(calendarDay);
}