aliveline/ui/app-window.slint
2026-04-08 14:32:38 +03:00

108 lines
3.2 KiB
Text

import { TabWidget, VerticalBox, ComboBox } from "std-widgets.slint";
import { RecordWidget } from "record.slint";
import { ReviewWidget } from "review.slint";
import { TimelineEvent, Timeline, TimelineState } from "timeline.slint";
import { Const } from "global.slint";
export { Palette } from "theme.slint";
export component AppWindow inherits Window {
callback update-record-offset(int);
callback save-log;
callback new-day-started();
update-record-offset(new-offset) => {
record-state.offset = new-offset;
}
preferred-width: 800px;
preferred-height: 600px;
max-width: 2147483647px;
max-height: 2147483647px;
callback start-new-event <=> record.start-new-event;
callback stop-event <=> record.stop-event;
callback chain-event <=> record.chain-event;
callback get-previous-event <=> record.get-previous-event;
callback fetch-log <=> review.fetch-log;
callback update-visible-time(bool, string);
in-out property record-state <=> record.state;
in-out property review-state <=> review.state;
in-out property in-progress <=> record.in-progress;
in property previous-event-name <=> record.previous-event-name;
property<[string]> combo-spans: ["1 Hour", "4 Hours", "8 Hours", "24 Hours"];
property<bool> minimized: false;
property<bool> in-record-mode: true;
init => {
record-state.visible-time = 3600;
review-state.visible-time = 3600;
}
Timer {
interval: 1s;
running: true;
triggered => {
if (record-state.offset >= Const.max-offset) {
root.new-day-started();
record-state.offset = 0;
return;
}
record-state.offset += 1;
}
}
title: "Aliveline";
VerticalLayout {
width: 100%;
height: 100%;
tl := Timeline {
preferred-height: 100%;
min-height: 50px;
state: in-record-mode ? record-state : review-state;
clicked => {
minimized = !minimized;
}
}
spacing: minimized ? 0 : 8px;
record := RecordWidget {
combo-spans: combo-spans;
update-visible-time(time) => {
root.update-visible-time(true, time);
}
minimized: minimized || !in-record-mode;
}
review := ReviewWidget {
combo-spans: combo-spans;
update-visible-time(time) => {
root.update-visible-time(false, time)
}
minimized: minimized;
is-active: !in-record-mode;
}
if !minimized: HorizontalLayout {
padding-left: 8px;
padding-right: 8px;
padding-bottom: 8px;
spacing: 16px;
Text {
text: "Mode:";
font-size: 24px;
horizontal-alignment: right;
}
ComboBox {
model: ["Record", "Review"];
current-index: in-record-mode ? 0 : 1;
selected(current-value) => {
in-record-mode = current-value == "Record";
}
}
}
}
}