1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: MIT
3
4#include "dashboard.h"
5#include <chrono>
6#include <slint-interpreter.h>
7
8#include <fmt/core.h>
9#include <fmt/chrono.h>
10#include <random>
11#include <time.h>
12
13class PlaceholderWidget : public Widget
14{
15public:
16 PlaceholderWidget(std::string_view type_name) : m_type_name(type_name) { }
17
18 std::string type_name() const override { return m_type_name; }
19 std::vector<PropertyDeclaration> properties() const override { return {}; }
20
21private:
22 std::string m_type_name;
23};
24
25class ClockWidget : public Widget
26{
27public:
28 ClockWidget();
29 std::string type_name() const override { return "Clock"; }
30 std::vector<PropertyDeclaration> properties() const override
31 {
32 return { PropertyDeclaration { .name: "time", .type_name: "string" } };
33 }
34
35private:
36 void update_clock();
37
38 slint::Timer clock_update_timer;
39};
40
41ClockWidget::ClockWidget() : clock_update_timer(std::chrono::seconds(1), [this] { update_clock(); })
42{
43}
44
45void ClockWidget::update_clock()
46{
47 std::string current_time = fmt::format("{:%H:%M:%S}", fmt::localtime(std::time(nullptr)));
48 set_property("time", slint::SharedString(current_time));
49}
50
51class HumidityWidget : public Widget
52{
53public:
54 HumidityWidget();
55 std::string type_name() const override { return "Humidity"; }
56 std::vector<PropertyDeclaration> properties() const override
57 {
58 return { PropertyDeclaration { .name: "humidity_percent", .type_name: "int" } };
59 }
60
61private:
62 void update_fake_humidity();
63 slint::Timer fake_humidity_update_timer;
64 std::default_random_engine rng;
65};
66
67HumidityWidget::HumidityWidget()
68 : fake_humidity_update_timer(std::chrono::seconds(5), [this] { update_fake_humidity(); }),
69 rng(std::chrono::system_clock::now().time_since_epoch().count())
70{
71}
72
73void HumidityWidget::update_fake_humidity()
74{
75 std::uniform_int_distribution<> humidity_range(20, 150);
76 double humidity_percent = humidity_range(rng);
77 set_property(name: "humidity_percent", value: humidity_percent);
78}
79
80int main()
81{
82 DashboardBuilder builder;
83
84 // The widgets and their position is hardcoded for now, but one could imagine getting this
85 // from a config file, and instantiating the widgets with a factory function
86 builder.add_top_bar_widget(widget: std::make_shared<ClockWidget>());
87 builder.add_grid_widget(widget: std::make_shared<PlaceholderWidget>(args: "Usage"), location: { .row: 0, .column: 0, .row_span: 2 });
88 builder.add_grid_widget(widget: std::make_shared<PlaceholderWidget>(args: "IndoorTemperature"), location: { .row: 0, .column: 1 });
89 builder.add_grid_widget(widget: std::make_shared<HumidityWidget>(), location: { .row: 1, .column: 1 });
90 builder.add_grid_widget(widget: std::make_shared<PlaceholderWidget>(args: "MyDevices"), location: { .row: 0, .column: 2, .row_span: 2 });
91 builder.add_grid_widget(widget: std::make_shared<PlaceholderWidget>(args: "UsageDiagram"), location: { .row: 2, .column: 0, .row_span: {}, .col_span: 2 });
92 builder.add_grid_widget(widget: std::make_shared<PlaceholderWidget>(args: "LightIntensity"), location: { .row: 2, .column: 2 });
93
94 slint::interpreter::ComponentCompiler compiler;
95 compiler.set_include_paths({ SOURCE_DIR });
96 auto dashboard = builder.build(compiler);
97
98 if (!dashboard) {
99 return EXIT_FAILURE;
100 }
101
102 (*dashboard)->run();
103}
104

source code of slint/examples/iot-dashboard/main.cpp