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; 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 minimized: false; property 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%; 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"; } } } } }