This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Doric/doric-demo/src/ScrolledSliderDemo.ts

151 lines
4.0 KiB
TypeScript
Raw Normal View History

2020-03-02 14:33:08 +08:00
import { Group, text, gravity, Color, LayoutSpec, vlayout, hlayout, layoutConfig, scroller, Text, ViewHolder, VMPanel, ViewModel, network, loge, HLayout, stack, image } from "doric";
import { colors } from "./utils";
interface DoubanModel {
count: number
start: number
total: number
subjects: Array<{
rating: {
max: number,
average: number,
details: {
"1": number,
"2": number,
"3": number,
"4": number,
"5": number,
},
stars: number
min: number,
}
genres: string[],
title: string
casts: Array<{
avatars: {
small: string,
large: string,
medium: string,
},
name_en: string
name: string
alt: string
id: string
}>
durations: string[]
collect_count: number
mainland_pubdate: string
has_video: boolean
original_title: string
subtype: string
directors: Array<{
avatars: {
small: string,
large: string,
medium: string,
},
name_en: string
name: string
alt: string
id: string
}>,
pubdates: string[],
year: string,
images: {
small: string,
large: string,
medium: string,
}
alt: string
id: string
}>
title: string
}
interface MovieModel {
doubanModel?: DoubanModel
}
class MovieVH extends ViewHolder {
title!: Text
gallery!: HLayout
build(root: Group) {
vlayout(
[
this.title = text({
layoutConfig: {
widthSpec: LayoutSpec.MOST,
heightSpec: LayoutSpec.JUST,
},
textSize: 30,
textColor: Color.WHITE,
backgroundColor: colors[1],
textAlignment: gravity().center(),
height: 50,
}),
scroller(
this.gallery = hlayout(
[],
{
layoutConfig: layoutConfig().most().configWidth(LayoutSpec.FIT),
space: 100,
}),
{
layoutConfig: layoutConfig().most().configHeight(LayoutSpec.JUST),
height: 200,
backgroundColor: Color.parse("#eeeeee"),
})
],
{
layoutConfig: layoutConfig().most(),
space: 50,
}).in(root)
}
}
class MovieVM extends ViewModel<MovieModel, MovieVH>{
onAttached() {
network(context).get("https://douban.uieee.com/v2/movie/top250").then(ret => {
this.updateState(state => state.doubanModel = JSON.parse(ret.data) as DoubanModel)
})
}
onBind(state: MovieModel, vh: MovieVH) {
if (state.doubanModel) {
vh.title.text = state.doubanModel.title
vh.gallery.children.length = 0
state.doubanModel.subjects.slice(0, 5).forEach(e => {
vh.gallery.addChild(stack(
[
image({
layoutConfig: layoutConfig().just(),
width: 100,
height: 100,
imageUrl: e.images.large
})
],
{
backgroundColor: Color.YELLOW,
}))
})
}
}
}
@Entry
class SliderPanel extends VMPanel<MovieModel, MovieVH>{
getViewModelClass() {
return MovieVM
}
getViewHolderClass() {
return MovieVH
}
getState() {
return {}
}
}