1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: MIT
3
4#include <slint-interpreter.h>
5
6#include <ctime>
7
8using slint::interpreter::Value;
9
10struct InkLevelModel : slint::Model<Value>
11{
12 size_t row_count() const override { return m_data.size(); }
13 std::optional<Value> row_data(size_t i) const override
14 {
15 if (i < m_data.size())
16 return { m_data[i] };
17 return {};
18 }
19
20private:
21 static Value make_inklevel_value(slint::Color color, float level)
22 {
23 slint::interpreter::Struct s;
24 s.set_field(name: "color", value: Value(color));
25 s.set_field(name: "level", value: level);
26 return s;
27 }
28
29 std::vector<Value> m_data = {
30 make_inklevel_value(color: slint::Color::from_rgb_uint8(red: 255, green: 255, blue: 0), level: 0.9),
31 make_inklevel_value(color: slint::Color::from_rgb_uint8(red: 255, green: 0, blue: 255), level: 0.8),
32 make_inklevel_value(color: slint::Color::from_rgb_uint8(red: 0, green: 255, blue: 255), level: 0.5),
33 make_inklevel_value(color: slint::Color::from_rgb_uint8(red: 0, green: 0, blue: 0), level: 0.1),
34 };
35};
36
37int main()
38{
39 slint::interpreter::ComponentCompiler compiler;
40 auto definition = compiler.build_from_path(SOURCE_DIR "/../ui/printerdemo.slint");
41
42 for (auto diagnostic : compiler.diagnostics()) {
43 std::cerr << (diagnostic.level == slint::interpreter::DiagnosticLevel::Warning ? "warning: "
44 : "error: ")
45 << diagnostic.message << std::endl;
46 std::cerr << "location: " << diagnostic.source_file;
47 if (diagnostic.line > 0)
48 std::cerr << ":" << diagnostic.line;
49 if (diagnostic.column > 0)
50 std::cerr << ":" << diagnostic.column;
51 std::cerr << std::endl;
52 }
53
54 if (!definition) {
55 std::cerr << "compilation failure!" << std::endl;
56 return EXIT_FAILURE;
57 }
58 auto instance = definition->create();
59 std::shared_ptr<slint::Model<Value>> ink_levels = std::make_shared<InkLevelModel>();
60 if (!instance->set_property("ink_levels", ink_levels)) {
61 std::cerr << "Could not set property ink_levels" << std::endl;
62 return EXIT_FAILURE;
63 }
64
65 auto printer_queue = std::make_shared<slint::VectorModel<Value>>();
66
67 slint::SharedVector<Value> default_queue =
68 *instance->get_global_property("PrinterQueue", "printer_queue")->to_array();
69 for (const auto &default_item : default_queue)
70 printer_queue->push_back(default_item);
71
72 instance->set_global_property("PrinterQueue", "printer_queue", Value(printer_queue));
73
74 instance->set_global_callback("PrinterQueue", "start_job", [=](auto args) {
75 std::time_t now = std::chrono::system_clock::to_time_t(t: std::chrono::system_clock::now());
76 char time_buf[100] = { 0 };
77 std::strftime(s: time_buf, maxsize: sizeof(time_buf), format: "%H:%M:%S %d/%m/%Y", tp: std::localtime(timer: &now));
78
79 slint::interpreter::Struct item { { "status", Value(slint::SharedString("waiting")) },
80 { "progress", Value(0.) },
81 { "title", args[0] },
82 { "owner", slint::SharedString("joe@example.com") },
83 { "pages", Value(1.) },
84 { "size", slint::SharedString("100kB") },
85 { "submission_date", slint::SharedString(time_buf) } };
86 printer_queue->push_back(item);
87 return Value();
88 });
89
90 instance->set_global_callback("PrinterQueue", "cancel_job", [=](auto args) {
91 auto index = *args[0].to_number();
92 printer_queue->erase(index: int(index));
93 return Value();
94 });
95
96 slint::Timer printer_queue_progress_timer(std::chrono::seconds(1), [=]() {
97 if (printer_queue->row_count() > 0) {
98 auto top_item = *(*printer_queue->row_data(i: 0)).to_struct();
99 auto progress = *top_item.get_field("progress")->to_number() + 1.;
100 top_item.set_field("progress", progress);
101 top_item.set_field("status", slint::SharedString("printing"));
102 if (progress > 100) {
103 printer_queue->erase(index: 0);
104 } else {
105 printer_queue->set_row_data(i: 0, value: top_item);
106 }
107 }
108 });
109
110 instance->set_callback("quit", [](auto) {
111 std::exit(status: 0);
112 return Value();
113 });
114 instance->run();
115}
116

source code of slint/examples/printerdemo/cpp_interpreted/main.cpp