Add a Calendar view on the right side

This commit is contained in:
Vyn 2024-10-29 15:02:46 +01:00
parent a80515ff90
commit f1ac8a42d1
18 changed files with 406 additions and 130 deletions

View file

@ -5,10 +5,13 @@
*/
#include "AppWindowBackend.h"
#include "AppWindow.h"
#include "SeleniteSetup.h"
#include "Utils.h"
#include "appwindow.h"
#include "mirai-core/DataProvider.h"
#include "mirai-core/DateTime.h"
#include "mirai-core/Day.h"
#include "mirai-core/MarkdownDataProvider.h"
#include "mirai-core/Mirai.h"
#include "slint.h"
#include "slint_string.h"
@ -34,6 +37,7 @@ AppWindowBackend::AppWindowBackend(mirai::Mirai *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>>();
tags_ = std::make_shared<slint::VectorModel<slint::SharedString>>();
auto sourcesNames = std::make_shared<slint::MapModel<ui::Source, slint::SharedString>>(
@ -43,14 +47,23 @@ AppWindowBackend::AppWindowBackend(mirai::Mirai *miraiInstance)
}
);
const auto palette =
selenite::parseJson(std::string(getenv("HOME")) + "/.config/evalyte/theme.json");
const auto palettePath = std::string(getenv("HOME")) + "/.config/evalyte/theme.json";
const auto palette = selenite::parseJson(palettePath);
if (palette.has_value()) {
std::cerr << "Warning, no evalyte/theme.json found" << std::endl;
setSelenitePalette(mainWindow_, palette.value());
std::cerr << "Warning, no " << palettePath << " found" << std::endl;
setSelenitePalette(mainWindow_->global<ui::Palette>(), palette.value());
setSelenitePalette(settingsWindow_->global<ui::Palette>(), palette.value());
}
mainWindow_->global<ui::Backend>().set_sources(sourcesNames);
settingsWindow_->global<ui::Backend>().set_sources(sourcesNames);
mainWindow_->global<ui::Backend>().set_sources_selected(sources_);
settingsWindow_->global<ui::Backend>().set_sources_selected(sources_);
mainWindow_->global<ui::Backend>().set_tags(tags_);
mainWindow_->global<ui::Backend>().set_days(days_);
mainWindow_->global<ui::Backend>().set_calendar(calendar_);
view_.setAllSources();
view_.update();
@ -92,10 +105,17 @@ void AppWindowBackend::setupUtilsCallbacks()
};
return std::format("{:%B %d}", chronoDate);
});
mainWindow_->global<ui::Backend>().on_format_date_relative([&](const ui::Date &date) {
return formatDateRelative(date);
});
}
void AppWindowBackend::setupCallbacks()
{
mainWindow_->global<ui::Backend>().on_settings_clicked([&]() {
settingsWindow_->show();
});
mainWindow_->global<ui::Backend>().on_task_clicked([&](int sourceId, int taskId) {
auto source = miraiInstance_->getSourceById(sourceId);
assert(source);
@ -142,10 +162,6 @@ void AppWindowBackend::setupCallbacks()
reloadTasks();
});
mainWindow_->global<ui::Backend>().set_sources_selected(sources_);
mainWindow_->global<ui::Backend>().set_tags(tags_);
mainWindow_->global<ui::Backend>().set_days(days_);
mainWindow_->global<ui::Backend>().on_save_task([&](ui::SaveTaskData newTaskData) {
auto source = miraiInstance_->getSourceById(newTaskData.sourceId);
assert(source);
@ -326,6 +342,42 @@ void AppWindowBackend::reloadTasks()
});
}
mainWindow_->global<ui::Backend>().set_unscheduled_tasks(unscheduledTasks_);
calendar_->clear();
for (int dayIndex = 0; dayIndex < 7; ++dayIndex) {
std::chrono::year_month_day nextDate =
std::chrono::floor<std::chrono::days>(std::chrono::system_clock::now()) +
std::chrono::days{dayIndex};
auto currentDate = mirai::Date{nextDate};
auto events = view_.getEventsForDate(currentDate);
auto slintEvents = std::make_shared<slint::VectorModel<ui::CalendarDayEvent>>();
auto relativeDaysDiff = std::chrono::duration_cast<std::chrono::days>(
std::chrono::sys_days(currentDate.toStdChrono()) -
std::chrono::sys_days(todayDate.toStdChrono())
)
.count();
if (relativeDaysDiff < 0 || relativeDaysDiff >= 3) {
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()),
});
}
auto calendarDay = ui::CalendarDay{
.events = slintEvents,
.date = MiraiDateToSlintDate(currentDate),
.header =
slint::SharedString(capitalize(formatDateRelative(MiraiDateToSlintDate(currentDate))
))
};
calendar_->push_back(calendarDay);
}
}
void AppWindowBackend::reloadSources()
@ -334,9 +386,12 @@ void AppWindowBackend::reloadSources()
bool noSourceSelected = miraiInstance_->getSources().size() == view_.activeSourceCount();
for (const auto &source : miraiInstance_->getSources()) {
bool isSourceSelected = view_.isSourceSelected(*source);
mirai::MarkdownDataProvider *sourceProvider =
dynamic_cast<mirai::MarkdownDataProvider *>(source->dataProvider());
sources_->push_back(
{.name = slint::SharedString(source->name()),
.selected = isSourceSelected && !noSourceSelected}
.selected = isSourceSelected && !noSourceSelected,
.path = slint::SharedString(sourceProvider->path())}
);
}
mainWindow_->global<ui::Backend>().set_no_source_selected(noSourceSelected);