Add new 'Add task/event' bar directly in the main view

This commit is contained in:
Vyn 2024-10-09 17:07:17 +02:00
parent 534da46a26
commit 2aa039e5fc
18 changed files with 399 additions and 51 deletions

View file

@ -34,14 +34,22 @@
UiState::UiState(mirai::Mirai *miraiInstance) : miraiInstance_(miraiInstance), view_(miraiInstance)
{
sources_ = std::make_shared<slint::VectorModel<slint::SharedString>>();
sources_ = std::make_shared<slint::VectorModel<Source>>();
days_ = std::make_shared<slint::VectorModel<Day>>();
unscheduledTasks_ = std::make_shared<slint::VectorModel<TaskData>>();
tags_ = std::make_shared<slint::VectorModel<slint::SharedString>>();
auto sourcesNames = std::make_shared<slint::MapModel<Source, slint::SharedString>>(
sources_,
[&](const Source &a) {
return a.name;
}
);
taskWindow_->global<Backend>().set_sources(sources_);
mainWindow_->global<Backend>().set_sources(sourcesNames);
taskWindow_->global<Backend>().set_sources_selected(sources_);
taskWindow_->global<Backend>().set_sources(sourcesNames);
taskWindow_->global<Backend>().set_tags(tags_);
eventWindow_->global<Backend>().set_sources(sources_);
eventWindow_->global<Backend>().set_sources_selected(sources_);
eventWindow_->global<Backend>().set_tags(tags_);
view_.update();
@ -76,7 +84,7 @@ std::optional<Date> stringToDate(const std::string &dateStr)
void UiState::setupTaskWindowCallbacks()
{
taskWindow_->on_save([&](SaveTaskData newTaskData) {
mainWindow_->global<Backend>().on_saveTask([&](SaveTaskData newTaskData) {
auto source = miraiInstance_->getSourceById(newTaskData.sourceId);
assert(source);
auto task = source->getTaskById(newTaskData.id);
@ -103,7 +111,7 @@ void UiState::setupTaskWindowCallbacks()
taskWindow_->hide();
});
taskWindow_->on_create([&](NewTaskData newTaskData) {
mainWindow_->global<Backend>().on_createTask([&](NewTaskData newTaskData) {
const Date &date = newTaskData.date;
const std::string dateStr = SlintDateToStdString(date);
auto source = miraiInstance_->getSourceById(newTaskData.sourceId);
@ -152,7 +160,7 @@ void UiState::setupEventWindowCallbacks()
assert(source);
auto event = source->getEventById(eventId);
assert(event);
eventWindow_->global<Backend>().set_sources(sources_);
eventWindow_->global<Backend>().set_sources_selected(sources_);
eventWindow_->global<Backend>().set_tags(tags_);
eventWindow_->set_sourceId(sourceId);
@ -177,7 +185,7 @@ void UiState::setupEventWindowCallbacks()
reloadTasks();
});
eventWindow_->on_create([&](NewEventParams newEventParams) {
mainWindow_->global<Backend>().on_createEvent([&](NewEventParams newEventParams) {
const Date &date = newEventParams.date;
const std::string dateStr = SlintDateToStdString(date);
auto source = miraiInstance_->getSourceById(newEventParams.sourceId);
@ -195,7 +203,7 @@ void UiState::setupEventWindowCallbacks()
eventWindow_->hide();
});
eventWindow_->on_save([&](SaveEventParams newEventParams) {
mainWindow_->global<Backend>().on_saveEvent([&](SaveEventParams newEventParams) {
const Date &date = newEventParams.date;
const std::string dateStr = SlintDateToStdString(date);
auto source = miraiInstance_->getSourceById(newEventParams.sourceId);
@ -239,15 +247,28 @@ void UiState::setupCallbacks()
});
mainWindow_->global<Backend>().on_source_clicked([&](int index) {
const auto &source = miraiInstance_->getSourceById(index);
const auto &sourceName = source->getName();
if (std::ranges::find(view_.getActiveFilesFilter(), sourceName) ==
view_.getActiveFilesFilter().end()) {
view_.addSourceFilter(sourceName);
// index with value -1 is equal to no selection, aka "All"
if (index == -1) {
view_.removeFilters();
} else {
view_.removeSourceFilter(sourceName);
view_.removeFilters();
const auto &source = miraiInstance_->getSourceById(index);
const auto &sourceName = source->getName();
view_.addSourceFilter(sourceName);
/*
// Old behavior, I keep it here for now
const auto &source = miraiInstance_->getSourceById(index);
const auto &sourceName = source->getName();
if (std::ranges::find(view_.getActiveFilesFilter(), sourceName) ==
view_.getActiveFilesFilter().end()) {
view_.addSourceFilter(sourceName);
} else {
view_.removeSourceFilter(sourceName);
}
*/
}
view_.update();
reloadSources();
reloadTasks();
});
@ -294,7 +315,7 @@ void UiState::setupCallbacks()
});
mainWindow_->global<Backend>().on_open_new_task_form([&](OpenNewTaskFormParams params) {
taskWindow_->global<Backend>().set_sources(sources_);
taskWindow_->global<Backend>().set_sources_selected(sources_);
taskWindow_->global<Backend>().set_tags(tags_);
auto todayDate = std::chrono::year_month_day{
@ -329,7 +350,7 @@ void UiState::setupCallbacks()
reloadTasks();
});
mainWindow_->global<Backend>().set_sources(sources_);
mainWindow_->global<Backend>().set_sources_selected(sources_);
mainWindow_->global<Backend>().set_tags(tags_);
mainWindow_->global<Backend>().set_visible_tasks(days_);
@ -450,9 +471,17 @@ void UiState::reloadTasks()
void UiState::reloadSources()
{
sources_->clear();
bool noSourceSelected = true;
for (const auto &source : miraiInstance_->getSources()) {
sources_->push_back(slint::SharedString(source->getName()));
bool isSourceSelected = view_.isSourceFilterActive(source->getName());
sources_->push_back(
{.name = slint::SharedString(source->getName()), .selected = isSourceSelected}
);
if (isSourceSelected) {
noSourceSelected = false;
}
}
mainWindow_->global<Backend>().set_no_source_selected(noSourceSelected);
}
void UiState::reloadTags()