slint/examples/carousel/ui/carousel.slint
2023-06-16 10:55:08 +02:00

76 lines
No EOL
1.8 KiB
Text

// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: MIT
import { Theme } from "theme.slint";
export component Carousel inherits FocusScope {
callback move-right();
callback move-left();
callback move-focus-up();
in-out property <int> selected-index;
in property <length> spacing;
in property <length> itemWidth;
in property <int> count: 0;
private property <length> center-x: (root.width - Theme.size-big) / 2;
private property <duration> duation: Theme.duration-regular;
forward-focus: focus-scope;
height: Theme.size-big;
move-right => {
root.selected-index = min(root.selected-index + 1, root.count - 1);
}
move-left => {
root.selected-index = max(root.selected-index - 1, 0);
}
focus-scope:= FocusScope {
key-pressed(event) => {
if(event.text == Key.UpArrow) {
root.move-focus-up();
return accept;
}
if(event.text == Key.RightArrow) {
root.move-right();
return accept;
}
if(event.text == Key.LeftArrow) {
root.move-left();
return accept;
}
return accept;
}
}
TouchArea {
width: parent.width;
height: parent.height;
clicked => {
focus-scope.focus()
}
}
Rectangle {
clip: true;
background: transparent;
Flickable {
interactive: false;
animate viewport-x { duration: root.duation; easing: ease-in; }
viewport-x: root.center-x - root.selected-index * (root.itemWidth + root.spacing);
HorizontalLayout {
spacing <=> root.spacing;
@children
}
}
}
}