1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: MIT
3
4use chrono::DateTime;
5use slint::*;
6use std::rc::Rc;
7
8use crate::{
9 mvc::{TaskListController, TaskModel},
10 ui,
11};
12
13// a helper function to make adapter and controller connection a little bit easier
14pub fn connect_with_controller(
15 view_handle: &ui::MainWindow,
16 controller: &TaskListController,
17 connect_adapter_controller: impl FnOnce(ui::TaskListAdapter, TaskListController) + 'static,
18) {
19 connect_adapter_controller(view_handle.global::<ui::TaskListAdapter>(), controller.clone());
20}
21
22// one place to implement connection between adapter (view) and controller
23pub fn connect(view_handle: &ui::MainWindow, controller: TaskListController) {
24 // sets a mapped list of the task items to the ui
25 view_handle
26 .global::<ui::TaskListAdapter>()
27 .set_tasks(Rc::new(MapModel::new(controller.task_model(), map_task_to_item)).into());
28
29 connect_with_controller(view_handle, &controller, {
30 move |adapter, controller| {
31 adapter.on_toggle_task_checked(move |index| {
32 controller.toggle_done(index as usize);
33 })
34 }
35 });
36
37 connect_with_controller(view_handle, &controller, {
38 move |adapter, controller| {
39 adapter.on_remove_task(move |index| {
40 controller.remove_task(index as usize);
41 })
42 }
43 });
44
45 connect_with_controller(view_handle, &controller, {
46 move |adapter: ui::TaskListAdapter, controller| {
47 adapter.on_show_create_task(move || {
48 controller.show_create_task();
49 })
50 }
51 });
52}
53
54// maps a TaskModel (data) to a SelectionItem (ui)
55fn map_task_to_item(task: TaskModel) -> ui::SelectionListViewItem {
56 ui::SelectionListViewItem {
57 text: task.title.into(),
58 checked: task.done,
59 description: DateTimeString::from_timestamp_millis(task.due_date)
60 .unwrap()
61 // example: Thu, Jun 6, 2024 16:29
62 .format(fmt:"%a, %b %d, %Y %H:%M")
63 .to_string()
64 .into(),
65 }
66}
67