jsbox-cview 1.3.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/alert/input-alert.ts +12 -6
- package/components/alert/login-alert.ts +11 -7
- package/components/alert/plain-alert.ts +9 -6
- package/components/alert/uialert.ts +3 -4
- package/components/base.ts +3 -4
- package/components/custom-navigation-bar.ts +52 -53
- package/components/dialogs/dialog-sheet.ts +10 -15
- package/components/dialogs/form-dialog.ts +5 -7
- package/components/dialogs/list-dialog.ts +9 -6
- package/components/dialogs/text-dialog.ts +7 -6
- package/components/dynamic-itemsize-matrix.ts +25 -26
- package/components/dynamic-preference-listview.ts +29 -31
- package/components/dynamic-rowheight-list.ts +10 -11
- package/components/enhanced-imageview.ts +4 -4
- package/components/flowlayout.ts +233 -0
- package/components/image-pager.ts +16 -10
- package/components/page-control.ts +16 -13
- package/components/pageviewer-titlebar.ts +15 -16
- package/components/pageviewer.ts +16 -15
- package/components/rotating-view.ts +27 -22
- package/components/searchbar.ts +30 -25
- package/components/sheet.ts +16 -17
- package/components/single-views.ts +107 -105
- package/components/spinners/loading-dual-ring.ts +15 -8
- package/components/spinners/loading-wedges.ts +8 -4
- package/components/spinners/spinner-androidstyle.ts +15 -16
- package/components/static-preference-listview.ts +94 -95
- package/components/symbol-button.ts +15 -23
- package/components/tabbar.ts +24 -25
- package/controller/base-controller.ts +57 -58
- package/controller/controller-router.ts +2 -3
- package/controller/pageviewer-controller.ts +16 -15
- package/controller/presented-page-controller.ts +14 -13
- package/controller/splitview-controller.ts +22 -13
- package/controller/tabbar-controller.ts +15 -15
- package/dist/components/alert/input-alert.js +12 -5
- package/dist/components/alert/login-alert.js +10 -5
- package/dist/components/alert/plain-alert.js +9 -5
- package/dist/components/alert/uialert.js +3 -3
- package/dist/components/base.js +4 -4
- package/dist/components/custom-navigation-bar.js +30 -30
- package/dist/components/dialogs/dialog-sheet.js +9 -12
- package/dist/components/dialogs/form-dialog.js +5 -5
- package/dist/components/dialogs/list-dialog.js +9 -5
- package/dist/components/dialogs/text-dialog.js +7 -5
- package/dist/components/dynamic-itemsize-matrix.js +15 -15
- package/dist/components/dynamic-preference-listview.js +4 -4
- package/dist/components/dynamic-rowheight-list.js +3 -3
- package/dist/components/enhanced-imageview.js +3 -3
- package/dist/components/flowlayout.js +184 -0
- package/dist/components/image-pager.js +14 -9
- package/dist/components/page-control.js +21 -18
- package/dist/components/pageviewer-titlebar.js +15 -15
- package/dist/components/pageviewer.js +16 -14
- package/dist/components/rotating-view.js +24 -19
- package/dist/components/searchbar.js +29 -24
- package/dist/components/sheet.js +13 -14
- package/dist/components/single-views.js +5 -5
- package/dist/components/spinners/loading-dual-ring.js +12 -5
- package/dist/components/spinners/loading-wedges.js +7 -3
- package/dist/components/spinners/spinner-androidstyle.js +13 -15
- package/dist/components/static-preference-listview.js +94 -94
- package/dist/components/symbol-button.js +10 -18
- package/dist/components/tabbar.js +24 -24
- package/dist/controller/base-controller.js +36 -36
- package/dist/controller/controller-router.js +2 -2
- package/dist/controller/pageviewer-controller.js +10 -8
- package/dist/controller/presented-page-controller.js +8 -6
- package/dist/controller/splitview-controller.js +19 -12
- package/dist/controller/tabbar-controller.js +3 -3
- package/dist/index.js +1 -2
- package/dist/test/flowlayout.js +74 -0
- package/index.ts +1 -2
- package/package.json +1 -1
- package/test/flowlayout.ts +77 -0
- package/components/artificial-flowlayout.ts +0 -321
- package/components/spinners/loading-double-rings.ts +0 -121
- package/dist/components/artificial-flowlayout.js +0 -258
- package/dist/components/spinners/loading-double-rings.js +0 -104
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { Base } from "./base";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 流式布局:间距固定,项目高度固定但宽度不定,左对齐,自动换行,不能滚动。
|
|
5
|
+
*
|
|
6
|
+
* 注意事项:
|
|
7
|
+
* 1. 此控件默认是可变高度的,但前提是布局中必须有关于高度的约束。如果不需要可变高度,可以设置fixedHeight为true
|
|
8
|
+
* 1. 此控件的边缘是不留白的,这和Matrix不同
|
|
9
|
+
* 2. itemWidth 如果超过总宽度,会被设定为总宽度
|
|
10
|
+
* 3. maxRows 可以控制最大行数,如果超过则会被截断
|
|
11
|
+
*
|
|
12
|
+
* ## 属性
|
|
13
|
+
* 属性的写法尽可能和Matrix的风格保持一致
|
|
14
|
+
* - items: FlowlayoutItem[] 关键参数,必须实现一个方法itemWidth(): number, 用于告知自身理想的宽度
|
|
15
|
+
* - spacing: number
|
|
16
|
+
* - itemHeight: number
|
|
17
|
+
* - maxRows?: number
|
|
18
|
+
* - fixedHeight?: boolean
|
|
19
|
+
* - menu?: UiTypes.ContextMenuOptions
|
|
20
|
+
*
|
|
21
|
+
* ## 事件
|
|
22
|
+
* - didSelect: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void
|
|
23
|
+
* - didLongPress: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void
|
|
24
|
+
*
|
|
25
|
+
* ## 方法
|
|
26
|
+
* - heightToWidth(width: number): height: number 根据宽度计算其应有的高度
|
|
27
|
+
* - cell(index: number): FlowlayoutItem 获取对应位置的 cview
|
|
28
|
+
* - set items(items: FlowlayoutItem[]) 设置子视图
|
|
29
|
+
* - get items(): FlowlayoutItem[] 获取子视图
|
|
30
|
+
*/
|
|
31
|
+
export class Flowlayout extends Base<UIView, UiTypes.ViewOptions> {
|
|
32
|
+
private _width: number; // 缓存宽度,用于判断是否需要重新布局
|
|
33
|
+
private _props: {
|
|
34
|
+
items: FlowlayoutItem[];
|
|
35
|
+
spacing: number;
|
|
36
|
+
itemHeight: number;
|
|
37
|
+
fixedRows?: number;
|
|
38
|
+
fixedHeight?: boolean;
|
|
39
|
+
menu?: UiTypes.ContextMenuOptions;
|
|
40
|
+
}
|
|
41
|
+
private _wrappers: WrapperView[];
|
|
42
|
+
private _events?: {
|
|
43
|
+
didSelect?: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void;
|
|
44
|
+
didLongPress?: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void;
|
|
45
|
+
}
|
|
46
|
+
_defineView: () => UiTypes.ViewOptions;
|
|
47
|
+
|
|
48
|
+
constructor({ props, layout, events }: {
|
|
49
|
+
props: {
|
|
50
|
+
items: FlowlayoutItem[];
|
|
51
|
+
spacing: number;
|
|
52
|
+
itemHeight: number;
|
|
53
|
+
fixedRows?: number;
|
|
54
|
+
fixedHeight?: boolean;
|
|
55
|
+
menu?: UiTypes.ContextMenuOptions;
|
|
56
|
+
};
|
|
57
|
+
layout: (make: MASConstraintMaker, view: UIView) => void;
|
|
58
|
+
events?: {
|
|
59
|
+
didSelect?: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void;
|
|
60
|
+
didLongPress?: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void;
|
|
61
|
+
}
|
|
62
|
+
}) {
|
|
63
|
+
super();
|
|
64
|
+
this._width = 0;
|
|
65
|
+
this._props = props;
|
|
66
|
+
this._events = events;
|
|
67
|
+
this._wrappers = props.items.map((item, index) => new WrapperView({
|
|
68
|
+
item,
|
|
69
|
+
menu: props.menu,
|
|
70
|
+
didSelect: events?.didSelect,
|
|
71
|
+
didLongPress: events?.didLongPress,
|
|
72
|
+
flowlayout: this,
|
|
73
|
+
index
|
|
74
|
+
}));
|
|
75
|
+
this._defineView = () => ({
|
|
76
|
+
type: "view",
|
|
77
|
+
props: {
|
|
78
|
+
id: this.id
|
|
79
|
+
},
|
|
80
|
+
layout,
|
|
81
|
+
events: {
|
|
82
|
+
layoutSubviews: sender => {
|
|
83
|
+
if (this._width !== sender.frame.width) {
|
|
84
|
+
this._width = sender.frame.width;
|
|
85
|
+
const height = this._layoutWrappers();
|
|
86
|
+
if (!this._props.fixedHeight) sender.updateLayout((make) => make.height.equalTo(height));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
views: this._wrappers.map(wrapper => wrapper.definition)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
cell(index: number): FlowlayoutItem {
|
|
95
|
+
return this._props.items[index];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
get items(): FlowlayoutItem[] {
|
|
99
|
+
return this._props.items;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
set items(items: FlowlayoutItem[]) {
|
|
103
|
+
this._props.items = items;
|
|
104
|
+
this._wrappers = items.map((item, index) => new WrapperView({
|
|
105
|
+
item,
|
|
106
|
+
menu: this._props.menu,
|
|
107
|
+
didSelect: this._events?.didSelect,
|
|
108
|
+
didLongPress: this._events?.didLongPress,
|
|
109
|
+
flowlayout: this,
|
|
110
|
+
index
|
|
111
|
+
}));
|
|
112
|
+
this.view.views.forEach(v => v.remove());
|
|
113
|
+
this._wrappers.forEach(wrapper => this.view.add(wrapper.definition));
|
|
114
|
+
const height = this._layoutWrappers();
|
|
115
|
+
if (!this._props.fixedHeight) this.view.updateLayout((make) => make.height.equalTo(height));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
_layoutWrappers(): number {
|
|
119
|
+
const totalWidth = this._width;
|
|
120
|
+
const itemHeight = this._props.itemHeight;
|
|
121
|
+
const itemSpacing = this._props.spacing;
|
|
122
|
+
let x = 0;
|
|
123
|
+
let y = 0;
|
|
124
|
+
let line = 1;
|
|
125
|
+
this._wrappers.forEach((wrapper, index) => {
|
|
126
|
+
const itemWidth = wrapper.item.itemWidth();
|
|
127
|
+
const width = Math.min(itemWidth, totalWidth);
|
|
128
|
+
if (x + width > totalWidth) {
|
|
129
|
+
x = 0;
|
|
130
|
+
y += itemHeight + itemSpacing;
|
|
131
|
+
line++;
|
|
132
|
+
}
|
|
133
|
+
if (this._props.fixedRows && line > this._props.fixedRows) {
|
|
134
|
+
wrapper.hidden = true;
|
|
135
|
+
} else {
|
|
136
|
+
wrapper.hidden = false;
|
|
137
|
+
}
|
|
138
|
+
wrapper.frame = $rect(x, y, width, itemHeight);
|
|
139
|
+
x += width + itemSpacing;
|
|
140
|
+
});
|
|
141
|
+
if (this._props.fixedRows && line > this._props.fixedRows) {
|
|
142
|
+
return this._props.fixedRows * (itemHeight + itemSpacing) - itemSpacing;
|
|
143
|
+
}
|
|
144
|
+
return y + itemHeight;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
heightToWidth(width: number): number {
|
|
148
|
+
const totalWidth = width;
|
|
149
|
+
const itemHeight = this._props.itemHeight;
|
|
150
|
+
const itemSpacing = this._props.spacing;
|
|
151
|
+
let x = 0;
|
|
152
|
+
let y = 0;
|
|
153
|
+
let line = 1;
|
|
154
|
+
this._wrappers.forEach((wrapper, index) => {
|
|
155
|
+
const itemWidth = wrapper.item.itemWidth();
|
|
156
|
+
const width = Math.min(itemWidth, totalWidth);
|
|
157
|
+
if (x + width > totalWidth) {
|
|
158
|
+
x = 0;
|
|
159
|
+
y += itemHeight + itemSpacing;
|
|
160
|
+
line++;
|
|
161
|
+
}
|
|
162
|
+
x += width + itemSpacing;
|
|
163
|
+
});
|
|
164
|
+
if (this._props.fixedRows && line > this._props.fixedRows) {
|
|
165
|
+
return this._props.fixedRows * (itemHeight + itemSpacing) - itemSpacing;
|
|
166
|
+
}
|
|
167
|
+
return y + itemHeight;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
interface FlowlayoutItem extends Base<any, any> {
|
|
172
|
+
itemWidth: () => number;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
class WrapperView extends Base<UIView, UiTypes.ViewOptions> {
|
|
176
|
+
_defineView: () => UiTypes.ViewOptions;
|
|
177
|
+
item: FlowlayoutItem;
|
|
178
|
+
constructor({
|
|
179
|
+
item,
|
|
180
|
+
menu,
|
|
181
|
+
didSelect,
|
|
182
|
+
didLongPress,
|
|
183
|
+
flowlayout,
|
|
184
|
+
index
|
|
185
|
+
}: {
|
|
186
|
+
item: FlowlayoutItem;
|
|
187
|
+
menu?: UiTypes.ContextMenuOptions;
|
|
188
|
+
didSelect?: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void;
|
|
189
|
+
didLongPress?: (sender: Flowlayout, index: number, item: FlowlayoutItem) => void;
|
|
190
|
+
flowlayout: Flowlayout;
|
|
191
|
+
index: number;
|
|
192
|
+
}) {
|
|
193
|
+
super();
|
|
194
|
+
this.item = item;
|
|
195
|
+
const props: UiTypes.BaseViewProps = {
|
|
196
|
+
id: this.id,
|
|
197
|
+
frame: $rect(0, 0, 0, 0),
|
|
198
|
+
userInteractionEnabled: true,
|
|
199
|
+
}
|
|
200
|
+
if (menu) {
|
|
201
|
+
props.menu = menu;
|
|
202
|
+
}
|
|
203
|
+
this._defineView = () => ({
|
|
204
|
+
type: "view",
|
|
205
|
+
props,
|
|
206
|
+
views: [item.definition],
|
|
207
|
+
events: {
|
|
208
|
+
tapped: sender => {
|
|
209
|
+
if (didSelect) didSelect(flowlayout, index, item)
|
|
210
|
+
},
|
|
211
|
+
longPressed: sender => {
|
|
212
|
+
if (didLongPress) didLongPress(flowlayout, index, item)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
set frame(frame: JBRect) {
|
|
219
|
+
this.view.frame = frame;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
get frame(): JBRect {
|
|
223
|
+
return this.view.frame;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
set hidden(hidden: boolean) {
|
|
227
|
+
this.view.hidden = hidden;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
get hidden(): boolean {
|
|
231
|
+
return this.view.hidden;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -1,17 +1,12 @@
|
|
|
1
|
+
import { Base } from "./base";
|
|
2
|
+
import { Matrix } from "./single-views";
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
|
-
*
|
|
5
|
+
* 图片浏览组件
|
|
3
6
|
*
|
|
4
|
-
*
|
|
5
|
-
* srcs: string[] - 图片地址列表
|
|
6
|
-
* page: number - 当前页码
|
|
7
|
+
* 与内置的Gallery组件相比,ImagePager组件可以动态刷新,适用于图片数量较多的场景,以及需要动态加载图片列表的场景
|
|
7
8
|
*
|
|
8
|
-
* # Events
|
|
9
|
-
* changed: (page: number) => void - 页码变化时触发
|
|
10
|
-
* tapped: (sender: ImagePager) => void - 点击图片时触发
|
|
11
9
|
*/
|
|
12
|
-
import { Base } from "./base";
|
|
13
|
-
import { Matrix } from "./single-views";
|
|
14
|
-
|
|
15
10
|
export class ImagePager extends Base<UIView, UiTypes.ViewOptions> {
|
|
16
11
|
_props: {
|
|
17
12
|
srcs: string[];
|
|
@@ -20,6 +15,17 @@ export class ImagePager extends Base<UIView, UiTypes.ViewOptions> {
|
|
|
20
15
|
_matrix: Matrix;
|
|
21
16
|
_pageLoadRecorder: { [key: number]: boolean };
|
|
22
17
|
_defineView: () => UiTypes.ViewOptions;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @param props
|
|
22
|
+
* - srcs: string[] - 图片地址列表
|
|
23
|
+
* - page: number - 当前页码
|
|
24
|
+
* @param layout
|
|
25
|
+
* @param events
|
|
26
|
+
* - changed: (page: number) => void - 页码变化时触发
|
|
27
|
+
* - tapped: (sender: ImagePager) => void - 点击图片时触发
|
|
28
|
+
*/
|
|
23
29
|
constructor({ props, layout, events = {} }: {
|
|
24
30
|
props: {
|
|
25
31
|
srcs?: string[];
|
|
@@ -1,24 +1,14 @@
|
|
|
1
|
+
import { Runtime } from "./single-views";
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
|
-
* # CView PageControl
|
|
3
4
|
*
|
|
4
5
|
* 基于 Runtime 构建 PageControl
|
|
5
6
|
*
|
|
6
7
|
* 请注意本视图如果没有足够的横向宽度,会显示不全
|
|
7
|
-
* ## Props
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* - 读写 currentPage: number
|
|
11
|
-
* - 只写 pageIndicatorTintColor?: JSBoxColor
|
|
12
|
-
* - 只写 currentPageIndicatorTintColor?: JSBoxColor
|
|
13
|
-
* - 其他通用属性
|
|
9
|
+
* @property currentPage: number
|
|
14
10
|
*
|
|
15
|
-
* ## Events
|
|
16
|
-
*
|
|
17
|
-
* changed: (cview: Cview, currentPage: number) => void
|
|
18
11
|
*/
|
|
19
|
-
|
|
20
|
-
import { Runtime } from "./single-views";
|
|
21
|
-
|
|
22
12
|
export class PageControl extends Runtime {
|
|
23
13
|
private _numberOfPages: number;
|
|
24
14
|
private _currentPage: number;
|
|
@@ -26,6 +16,19 @@ export class PageControl extends Runtime {
|
|
|
26
16
|
private _currentPageIndicatorTintColor?: UIColor;
|
|
27
17
|
private _changed?: (sender: PageControl, currentPage: number) => void;
|
|
28
18
|
private _pageControl: any;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param props 属性
|
|
23
|
+
* - numberOfPages: 页面数量
|
|
24
|
+
* - currentPage: 当前页面
|
|
25
|
+
* - pageIndicatorTintColor?: 页面指示器颜色
|
|
26
|
+
* - currentPageIndicatorTintColor?: 当前页面指示器颜色
|
|
27
|
+
* @param layout 布局
|
|
28
|
+
* @param events 事件
|
|
29
|
+
* - changed: (sender: PageControl, currentPage: number) => void
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
29
32
|
constructor({ props, layout, events = {} }: {
|
|
30
33
|
props: {
|
|
31
34
|
numberOfPages?: number;
|
|
@@ -1,21 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* # CView PageViewer TitleBar
|
|
3
|
-
*
|
|
4
|
-
* props:
|
|
5
|
-
*
|
|
6
|
-
* - 只写 items: string[]
|
|
7
|
-
* - 读写 index: number
|
|
8
|
-
* - 只写 selectedItemColor
|
|
9
|
-
* - 只写 defaultItemColor
|
|
10
|
-
*
|
|
11
|
-
* events:
|
|
12
|
-
*
|
|
13
|
-
* - changed: (cview, index) => void 在点击变更 index 的时候回调
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
1
|
import { Base } from './base';
|
|
17
2
|
import { ContentView, Label, Stack } from "./single-views";
|
|
18
|
-
//const { getTextWidth } = require("cview-util-ui");
|
|
19
3
|
|
|
20
4
|
function weightedAverageColors(c0: UIColor, c1: UIColor, w: number) {
|
|
21
5
|
const red = c0.components.red * w + c1.components.red * (1 - w);
|
|
@@ -35,6 +19,10 @@ interface PageViewerTitleBarEvents extends UiTypes.BaseViewEvents {
|
|
|
35
19
|
changed?: (cview: PageViewerTitleBar, index: number) => void;
|
|
36
20
|
}
|
|
37
21
|
|
|
22
|
+
/**
|
|
23
|
+
* [PageViewer](./pageviewer.ts)配套的标题栏
|
|
24
|
+
* @property index: number
|
|
25
|
+
*/
|
|
38
26
|
export class PageViewerTitleBar extends Base<UIView, UiTypes.ViewOptions> {
|
|
39
27
|
private _props: Required<PageViewerTitleBarProps>;
|
|
40
28
|
private _floatedIndex: number;
|
|
@@ -46,6 +34,17 @@ export class PageViewerTitleBar extends Base<UIView, UiTypes.ViewOptions> {
|
|
|
46
34
|
|
|
47
35
|
_defineView: () => UiTypes.ViewOptions;
|
|
48
36
|
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @param props 属性
|
|
40
|
+
* - items: string[]
|
|
41
|
+
* - index: number
|
|
42
|
+
* - selectedItemColor
|
|
43
|
+
* - defaultItemColor
|
|
44
|
+
* @param layout 布局
|
|
45
|
+
* @param events 事件
|
|
46
|
+
* - changed: (cview, index) => void 在点击变更 index 的时候回调
|
|
47
|
+
*/
|
|
49
48
|
constructor({ props, layout, events = {} }: {
|
|
50
49
|
props: PageViewerTitleBarProps;
|
|
51
50
|
layout: (make: MASConstraintMaker, view: UIView) => void;
|
package/components/pageviewer.ts
CHANGED
|
@@ -1,21 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* # CView PageViewer
|
|
3
|
-
*
|
|
4
|
-
* props:
|
|
5
|
-
* - 读写 page: number
|
|
6
|
-
* - 只写 cviews: cview[] cview的布局会被自动指定为占用一整页
|
|
7
|
-
*
|
|
8
|
-
* events:
|
|
9
|
-
* - changed: (cview, page) => void 页面改变时回调
|
|
10
|
-
* - floatPageChanged: (cview, floatPage) => void 滚动时回调(用于绑定其他联合滚动的控件)
|
|
11
|
-
*
|
|
12
|
-
* methods:
|
|
13
|
-
* - scrollToPage(page: number) 滚动到某一页(带有动画效果)
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
1
|
import { Base } from './base';
|
|
17
2
|
import { ContentView, Scroll } from "./single-views";
|
|
18
3
|
|
|
4
|
+
/**
|
|
5
|
+
* 与JSBox内置的Gallery功能类似,但是效果更好,可以伴随翻页实现联动效果,参见[pageviewer-titlebar.ts](./pageviewer-titlebar.ts)
|
|
6
|
+
*
|
|
7
|
+
* @property page: number 当前页码(无动画效果)
|
|
8
|
+
* @method scrollToPage(page: number) 滚动到某一页(带有动画效果)
|
|
9
|
+
*/
|
|
19
10
|
export class PageViewer extends Base<UIView, UiTypes.ViewOptions> {
|
|
20
11
|
private _props: {
|
|
21
12
|
page: number;
|
|
@@ -30,6 +21,16 @@ export class PageViewer extends Base<UIView, UiTypes.ViewOptions> {
|
|
|
30
21
|
scroll: Scroll;
|
|
31
22
|
_defineView: () => UiTypes.ViewOptions;
|
|
32
23
|
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* @param props 属性
|
|
27
|
+
* - page: number
|
|
28
|
+
* - cviews: Base<any, any>[]
|
|
29
|
+
* @param layout 布局
|
|
30
|
+
* @param events 事件
|
|
31
|
+
* - changed: (cview, page) => void 页面改变时回调
|
|
32
|
+
* - floatPageChanged: (cview, floatPage) => void 滚动时回调(用于绑定其他联合滚动的控件)
|
|
33
|
+
*/
|
|
33
34
|
constructor({ props, layout, events = {} }: {
|
|
34
35
|
props: {
|
|
35
36
|
page?: number;
|
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 创建一个可以旋转的视图。理论上来说,这个视图的布局必须是方形的。
|
|
3
|
-
*
|
|
4
|
-
* props:
|
|
5
|
-
* - image 图片
|
|
6
|
-
* - tintColor
|
|
7
|
-
* - contentMode = 1
|
|
8
|
-
* - cview 使用自定义的cview,上面两项将失效
|
|
9
|
-
* - rps = 0.5 每秒转多少圈
|
|
10
|
-
* - clockwise = true 是否顺时针旋转
|
|
11
|
-
*
|
|
12
|
-
* events:
|
|
13
|
-
* - ready: cview => void 可以在ready事件中启动旋转
|
|
14
|
-
*
|
|
15
|
-
* methods:
|
|
16
|
-
* - startRotating() 开始旋转
|
|
17
|
-
* - stopRotating() 结束旋转,请注意旋转是不能立即结束的,必须等到动画归位
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
1
|
import { Base } from "./base";
|
|
21
2
|
import { Image } from "./single-views";
|
|
22
3
|
|
|
@@ -29,15 +10,35 @@ interface RotatingViewProps {
|
|
|
29
10
|
clockwise?: boolean;
|
|
30
11
|
}
|
|
31
12
|
|
|
32
|
-
|
|
13
|
+
/**
|
|
14
|
+
* 创建一个可以旋转的视图。理论上来说,这个视图的布局必须是方形的。
|
|
15
|
+
*
|
|
16
|
+
* @method startRotating() 开始旋转
|
|
17
|
+
* @method stopRotating() 结束旋转,请注意旋转是不能立即结束的,必须等到动画归位
|
|
18
|
+
*/
|
|
19
|
+
export class RotatingView extends Base<UIView, UiTypes.ViewOptions> {
|
|
33
20
|
private _props: RotatingViewProps;
|
|
34
21
|
private _rotatingFlag: boolean;
|
|
35
22
|
private _innerView: Base<any, any>
|
|
36
23
|
_defineView: () => UiTypes.ViewOptions;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
* @param props 属性
|
|
28
|
+
* - image: UIImage
|
|
29
|
+
* - tintColor: UIColor
|
|
30
|
+
* - contentMode = 1
|
|
31
|
+
* - cview 使用自定义的cview,如果设置上面三项将失效
|
|
32
|
+
* - rps = 0.5 每秒转多少圈
|
|
33
|
+
* - clockwise = true 是否顺时针旋转
|
|
34
|
+
* @param layout 布局
|
|
35
|
+
* @param events 事件
|
|
36
|
+
* - ready?: (cview: RotatingView) => void 默认的ready事件是自动开始旋转;也可以手动指定其他效果
|
|
37
|
+
*/
|
|
37
38
|
constructor({ props, layout, events = {} }: {
|
|
38
39
|
props: RotatingViewProps;
|
|
39
40
|
layout: (make: MASConstraintMaker, view: UIView) => void;
|
|
40
|
-
events
|
|
41
|
+
events: {
|
|
41
42
|
ready?: (cview: RotatingView) => void;
|
|
42
43
|
}
|
|
43
44
|
}) {
|
|
@@ -74,8 +75,12 @@ export class RotatingView extends Base<UIView, UiTypes.ViewOptions>{
|
|
|
74
75
|
layout,
|
|
75
76
|
events: {
|
|
76
77
|
ready: sender => {
|
|
77
|
-
|
|
78
|
+
if (events.ready) {
|
|
79
|
+
events.ready(this);
|
|
80
|
+
} else {
|
|
81
|
+
this.startRotating();
|
|
78
82
|
}
|
|
83
|
+
}
|
|
79
84
|
},
|
|
80
85
|
views: [this._innerView.definition]
|
|
81
86
|
};
|
package/components/searchbar.ts
CHANGED
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* # CView SearchBar
|
|
3
|
-
*
|
|
4
|
-
* props
|
|
5
|
-
*
|
|
6
|
-
* - 读写 text: string
|
|
7
|
-
* - style: number 搜索框的样式
|
|
8
|
-
* - 0: 取消按钮在输入框内,聚焦时显示取消按钮
|
|
9
|
-
* - 1: 取消按钮在输入框右侧,聚焦时会有左右移动的动画
|
|
10
|
-
* - 2: 取消按钮布局同 1,但是 placeholder 平时显示在中间,聚焦时才会移动到左边。
|
|
11
|
-
* 如果使用此样式,建议每次 blur 的时候都清除 text
|
|
12
|
-
* - accessoryCview: cview 请通过下面的事件来和 SearchBar 互相操作
|
|
13
|
-
* - placeholder: string
|
|
14
|
-
* - cancelText: string
|
|
15
|
-
* - tintColor: \$color("systemLink")
|
|
16
|
-
* - bgcolor: colors.searchBarBgcolor
|
|
17
|
-
*
|
|
18
|
-
* events
|
|
19
|
-
*
|
|
20
|
-
* - didBeginEditing: cview => void
|
|
21
|
-
* - didEndEditing: cview => void
|
|
22
|
-
* - changed: cview => void
|
|
23
|
-
* - returned: cview => void
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
1
|
import { Base } from "./base";
|
|
27
2
|
import { Input, Label, ContentView } from "./single-views";
|
|
28
3
|
import { searchBarBgcolor } from "../utils/colors";
|
|
@@ -38,6 +13,15 @@ interface SearchBarProps {
|
|
|
38
13
|
accessoryCview?: Base<any, any>;
|
|
39
14
|
}
|
|
40
15
|
|
|
16
|
+
/**
|
|
17
|
+
* 搜索框
|
|
18
|
+
*
|
|
19
|
+
* 有三种样式可供选择,通过 style 属性设置
|
|
20
|
+
*
|
|
21
|
+
* @method focus() 聚焦
|
|
22
|
+
* @method blur() 失焦
|
|
23
|
+
* @property text: string 文本
|
|
24
|
+
*/
|
|
41
25
|
export class SearchBar extends Base<UIView, UiTypes.ViewOptions> {
|
|
42
26
|
_props: SearchBarProps;
|
|
43
27
|
_defineView: () => UiTypes.ViewOptions;
|
|
@@ -61,6 +45,27 @@ export class SearchBar extends Base<UIView, UiTypes.ViewOptions> {
|
|
|
61
45
|
};
|
|
62
46
|
};
|
|
63
47
|
_focused: boolean;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
* @param props 属性
|
|
52
|
+
* - text: string
|
|
53
|
+
* - style: number 搜索框的样式
|
|
54
|
+
* - 0: 取消按钮在输入框内,聚焦时显示取消按钮
|
|
55
|
+
* - 1: 取消按钮在输入框右侧,聚焦时会有左右移动的动画
|
|
56
|
+
* - 2: 取消按钮布局同 1,但是 placeholder 平时显示在中间,聚焦时才会移动到左边。如果使用此样式,建议每次 blur 的时候都清除 text。
|
|
57
|
+
* - accessoryCview: cview 请通过下面的事件来和 SearchBar 互相操作
|
|
58
|
+
* - placeholder: string
|
|
59
|
+
* - cancelText: string
|
|
60
|
+
* - tintColor: \$color("systemLink")
|
|
61
|
+
* - bgcolor: colors.searchBarBgcolor
|
|
62
|
+
* @param layout 布局
|
|
63
|
+
* @param events 事件
|
|
64
|
+
* - didBeginEditing: cview => void
|
|
65
|
+
* - didEndEditing: cview => void
|
|
66
|
+
* - changed: cview => void
|
|
67
|
+
* - returned: cview => void
|
|
68
|
+
*/
|
|
64
69
|
constructor({ props, layout, events = {} }: {
|
|
65
70
|
props: Partial<SearchBarProps>;
|
|
66
71
|
layout: (make: MASConstraintMaker, view: UIView) => void;
|
package/components/sheet.ts
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
|
+
import {cvid} from "../utils/cvid";
|
|
2
|
+
import {Base} from "./base";
|
|
3
|
+
|
|
4
|
+
const UIModalPresentationStyle = {
|
|
5
|
+
automatic: -2,
|
|
6
|
+
pageSheet: 1,
|
|
7
|
+
formSheet: 2,
|
|
8
|
+
fullScreen: 0,
|
|
9
|
+
currentContext: 3,
|
|
10
|
+
custom: 4,
|
|
11
|
+
overFullScreen: 5,
|
|
12
|
+
overCurrentContext: 6,
|
|
13
|
+
popover: 7,
|
|
14
|
+
none: -1
|
|
15
|
+
};
|
|
16
|
+
|
|
1
17
|
/**
|
|
2
|
-
* # cview Sheet
|
|
3
18
|
*
|
|
4
19
|
* 创建新的 UIViewController,主要用于 formSheet 和 pageSheet
|
|
5
20
|
*
|
|
@@ -16,22 +31,6 @@
|
|
|
16
31
|
* - dismiss()
|
|
17
32
|
*
|
|
18
33
|
*/
|
|
19
|
-
import {cvid} from "../utils/cvid";
|
|
20
|
-
import {Base} from "./base";
|
|
21
|
-
|
|
22
|
-
const UIModalPresentationStyle = {
|
|
23
|
-
automatic: -2,
|
|
24
|
-
pageSheet: 1,
|
|
25
|
-
formSheet: 2,
|
|
26
|
-
fullScreen: 0,
|
|
27
|
-
currentContext: 3,
|
|
28
|
-
custom: 4,
|
|
29
|
-
overFullScreen: 5,
|
|
30
|
-
overCurrentContext: 6,
|
|
31
|
-
popover: 7,
|
|
32
|
-
none: -1
|
|
33
|
-
};
|
|
34
|
-
|
|
35
34
|
export class Sheet<T extends Base<U, R>, U extends AllUIView, R extends UiTypes.AllViewOptions> {
|
|
36
35
|
id: string;
|
|
37
36
|
_animated: boolean;
|