import { TabWidget, AboutSlint, Button, LineEdit, ListView, CheckBox, ScrollView, GridBox, Palette, Spinner, SpinBox, } from "std-widgets.slint"; import { SettingsView } from "settings.slint"; import { ConnectionStatus, State, SItem } from "state.slint"; export { ConnectionStatus, State, SItem } component GoodListItem inherits Rectangle { in-out property item; background: Palette.alternate-background; border-radius: 8pt; border-width: 10pt; HorizontalLayout { spacing: 8px; padding: 8px; check := CheckBox { checked: root.item.checked; toggled() => { State.check-item(item.name); debug("CheckBox checked: ", self.checked); } } Text { opacity: (root.item.checked ? 0.5 : 1.0); font-size: 12pt; text: root.item.amount; width: 30px; } Text { opacity: (root.item.checked ? 0.5 : 1.0); font-size: 12pt; text: root.item.name; } } input := TouchArea { clicked => { //root.item.checked = !root.item.checked; State.check-item(item.name); } mouse-cursor: pointer; } } component PlusMinus inherits HorizontalLayout { in property item; plus := Rectangle { Text { text: "+"; font-weight: 800; font-size: 16pt; } background: #ffffff10; border-top-left-radius: 10px; border-bottom-left-radius: 10px; border-color: #00000070; border-width: 1px; width: self.height; plusta := TouchArea { clicked => { State.inc-amount(item.name); } mouse-cursor: pointer; } } minus := Rectangle { Text { text: "-"; font-weight: 800; font-size: 16pt; } background: #ffffff10; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-color: #00000070; border-width: 1px; height: 30px; width: self.height; minusta := TouchArea { clicked => { State.dec-amount(item.name); } mouse-cursor: pointer; } } states [ plushov when plusta.has-hover: { plus.background: #ffffff30; } minoshov when minusta.has-hover: { minus.background: #ffffff30; } ] } component GoodListItemAdd inherits Rectangle { in-out property item; background: Palette.alternate-background; border-radius: 8pt; border-width: 10pt; HorizontalLayout { spacing: 8px; padding: 8px; alignment: start; PlusMinus { item: item; } Rectangle { height: 30px; Text { text: root.item.amount; font-size: 12pt; } } Rectangle { height: 30px; Text { opacity: (root.item.checked ? 0.5 : 1.0); font-size: 12pt; text: root.item.name; } } } } component GoodsList { in property <[SItem]> items; ListView { mouse-drag-pan-enabled: true; for item in items: VerticalLayout { GoodListItem { item: item; } Rectangle { height: 4pt; } } } } component GoodsListAdd { in property <[SItem]> items; ListView { mouse-drag-pan-enabled: true; for item in items: VerticalLayout { GoodListItemAdd { item: item; } Rectangle { height: 4pt; } } } } component GoodButtons inherits ScrollView { in property <[string]> favorites: ["Mjölk", "Ost", "Ägg", "Bullens", "Oboy", "Mjöl", "Havregryn", "KrosTom"]; in property button-min-width: 100pt; in property button-height: 60pt; in property button-spacing: 10pt; property count-x: floor(root.width / (button-min-width + button-spacing)); property count-y: ceil(favorites.length / count-x); property button-width: ((self.width + button-spacing ) / count-x) - button-spacing; viewport-height: (count-y * (button-height + button-spacing)); mouse-drag-pan-enabled: true; for item[idx] in favorites: Button { x: floor(mod(idx, count-x)) * (root.button-width + root.button-spacing); y: floor(idx / count-x) * (root.button-height + root.button-spacing); width: root.button-width; height: root.button-height; text: item; clicked => { State.add-to-list(item); } } } component ConnStatusIndicator inherits Rectangle { width: 18px; Image { states [ idle when State.connection-status == ConnectionStatus.Idle: { opacity: 0%; } syncing when State.connection-status == ConnectionStatus.Syncing: { colorize: green; opacity: 75% + 25% * sin(360deg * animation-tick() / 1s); } error when State.connection-status == ConnectionStatus.Error: { colorize: red; opacity: 100%; } ] source: @image-url("../images/arrow-down-up.svg"); width: 24px; height: self.width; } } component RefreshButton inherits HorizontalLayout { spacing: 8px; alignment: center; Button { text: "Refresh"; width: 40%; clicked() => { State.refresh-list(); } } ConnStatusIndicator { } } component AddView inherits VerticalLayout { in property <[SItem]> list; padding: 8px; spacing: 8px; RefreshButton {} goods := GoodsListAdd { items <=> list; } HorizontalLayout { height: 42px; input := LineEdit { font-size: 20px; accepted(text) => { if text != "" { State.add-to-list(text); input.text = ""; } } } Rectangle { width: 4pt; // spacing } Button { width: self.height; text: "+"; clicked => { if input.text != "" { State.add-to-list(input.text); input.text = ""; } input.clear-focus() } } } GoodButtons { } } component ShopView inherits VerticalLayout { in property <[SItem]> list; padding: 8px; spacing: 8px; RefreshButton { } goods := GoodsList { items <=> list; } HorizontalLayout { padding: 12px; Button { text: "I am done hehe"; clicked => { State.delete-checked(); } } } } export component App inherits Window { preferred-height: 700px; preferred-width: 480px; TabWidget { Tab { title: "Add"; AddView { list <=> State.list; } } Tab { title: "Shop"; ShopView { list <=> State.list; } } Tab { title: "Settings"; SettingsView { } } } }