• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/// <reference path='./import.ts' />
17class ArkSliderComponent extends ArkComponent implements SliderAttribute {
18  builder: WrappedBuilder<Object[]> | null = null;
19  sliderNode: BuilderNode<[SliderConfiguration]> | null = null;
20  modifier: ContentModifier<SliderConfiguration>;
21  needRebuild: boolean = false;
22  constructor(nativePtr: KNode, classType?: ModifierType) {
23    super(nativePtr, classType);
24  }
25  blockColor(value: ResourceColor): this {
26    modifierWithKey(this._modifiersWithKeys, BlockColorModifier.identity, BlockColorModifier, value);
27    return this;
28  }
29  trackColor(value: ResourceColor): this {
30    modifierWithKey(this._modifiersWithKeys, TrackColorModifier.identity, TrackColorModifier, value);
31    return this;
32  }
33  selectedColor(value: ResourceColor): this {
34    modifierWithKey(this._modifiersWithKeys, SelectColorModifier.identity, SelectColorModifier, value);
35    return this;
36  }
37  minLabel(value: string): this {
38    throw new Error('Method not implemented.');
39  }
40  maxLabel(value: string): this {
41    throw new Error('Method not implemented.');
42  }
43  showSteps(value: boolean): this {
44    modifierWithKey(this._modifiersWithKeys, ShowStepsModifier.identity, ShowStepsModifier, value);
45    return this;
46  }
47  showTips(value: boolean, content?: any): this {
48    let showTips = new ArkSliderTips(value, content);
49    modifierWithKey(this._modifiersWithKeys, ShowTipsModifier.identity, ShowTipsModifier, showTips);
50    return this;
51  }
52  trackThickness(value: Length): this {
53    modifierWithKey(this._modifiersWithKeys, TrackThicknessModifier.identity, TrackThicknessModifier, value);
54    return this;
55  }
56  onChange(callback: (value: number, mode: SliderChangeMode) => void): this {
57    throw new Error('Method not implemented.');
58  }
59  blockBorderColor(value: ResourceColor): this {
60    modifierWithKey(this._modifiersWithKeys, BlockBorderColorModifier.identity, BlockBorderColorModifier, value);
61    return this;
62  }
63  blockBorderWidth(value: Length): this {
64    modifierWithKey(this._modifiersWithKeys, BlockBorderWidthModifier.identity, BlockBorderWidthModifier, value);
65    return this;
66  }
67  stepColor(value: ResourceColor): this {
68    modifierWithKey(this._modifiersWithKeys, StepColorModifier.identity, StepColorModifier, value);
69    return this;
70  }
71  trackBorderRadius(value: Length): this {
72    modifierWithKey(this._modifiersWithKeys, TrackBorderRadiusModifier.identity, TrackBorderRadiusModifier, value);
73    return this;
74  }
75  selectedBorderRadius(value: Dimension): this {
76    modifierWithKey(this._modifiersWithKeys, SelectedBorderRadiusModifier.identity, SelectedBorderRadiusModifier, value);
77    return this;
78  }
79  blockSize(value: SizeOptions): this {
80    modifierWithKey(this._modifiersWithKeys, BlockSizeModifier.identity, BlockSizeModifier, value);
81    return this;
82  }
83  blockStyle(value: SliderBlockStyle): this {
84    modifierWithKey(this._modifiersWithKeys, BlockStyleModifier.identity, BlockStyleModifier, value);
85    return this;
86  }
87  stepSize(value: Length): this {
88    modifierWithKey(this._modifiersWithKeys, StepSizeModifier.identity, StepSizeModifier, value);
89    return this;
90  }
91  sliderInteractionMode(value: SliderInteraction): this {
92    modifierWithKey(this._modifiersWithKeys, InteractionModeModifier.identity, InteractionModeModifier, value);
93    return this;
94  }
95  minResponsiveDistance(value: number): this {
96    modifierWithKey(this._modifiersWithKeys, MinResponsiveDistanceModifier.identity, MinResponsiveDistanceModifier, value);
97    return this;
98  }
99  contentModifier(value: ContentModifier<SliderConfiguration>): this {
100    modifierWithKey(this._modifiersWithKeys, SliderContentModifier.identity, SliderContentModifier, value);
101    return this;
102  }
103  slideRange(value: ValidSlideRange): this {
104    modifierWithKey(this._modifiersWithKeys, ValidSlideRangeModifier.identity, ValidSlideRangeModifier, value);
105    return this;
106  }
107  setContentModifier(modifier: ContentModifier<SliderConfiguration>): this {
108    if (modifier === undefined || modifier === null) {
109      getUINativeModule().slider.setContentModifierBuilder(this.nativePtr, false);
110      return;
111    }
112    this.needRebuild = false;
113    if (this.builder !== modifier.applyContent()) {
114      this.needRebuild = true;
115    }
116    this.builder = modifier.applyContent();
117    this.modifier = modifier;
118    getUINativeModule().slider.setContentModifierBuilder(this.nativePtr, this);
119  }
120  makeContentModifierNode(context: UIContext, sliderConfiguration: SliderConfiguration): FrameNode | null {
121    sliderConfiguration.contentModifier = this.modifier;
122    if (isUndefined(this.sliderNode) || this.needRebuild) {
123      const xNode = globalThis.requireNapi('arkui.node');
124      this.sliderNode = new xNode.BuilderNode(context);
125      this.sliderNode.build(this.builder, sliderConfiguration);
126      this.needRebuild = false;
127    } else {
128      this.sliderNode.update(sliderConfiguration);
129    }
130    return this.sliderNode.getFrameNode();
131  }
132}
133
134class BlockStyleModifier extends ModifierWithKey<SliderBlockStyle> {
135  constructor(value: SliderBlockStyle) {
136    super(value);
137  }
138  static identity: Symbol = Symbol('sliderBlockStyle');
139  applyPeer(node: KNode, reset: boolean): void {
140    if (reset) {
141      getUINativeModule().slider.resetBlockStyle(node);
142    } else {
143      getUINativeModule().slider.setBlockStyle(node, this.value);
144    }
145  }
146
147  checkObjectDiff(): boolean {
148    return !((this.stageValue as SliderBlockStyle).type === (this.value as SliderBlockStyle).type &&
149      (this.stageValue as SliderBlockStyle).image === (this.value as SliderBlockStyle).image &&
150      (this.stageValue as SliderBlockStyle).shape === (this.value as SliderBlockStyle).shape);
151
152  }
153}
154
155class ShowTipsModifier extends ModifierWithKey<ArkSliderTips> {
156  constructor(value: ArkSliderTips) {
157    super(value);
158  }
159  static identity: Symbol = Symbol('sliderShowTips');
160  applyPeer(node: KNode, reset: boolean) {
161    if (reset) {
162      getUINativeModule().slider.resetShowTips(node);
163    } else {
164      getUINativeModule().slider.setShowTips(node, this.value.showTip, this.value?.tipText);
165    }
166  }
167
168  checkObjectDiff(): boolean {
169    let showTipDiff = this.stageValue.showTip !== this.value.showTip;
170    let tipTextDiff = !isBaseOrResourceEqual(this.stageValue.tipText, this.value.tipText);
171    return showTipDiff || tipTextDiff;
172  }
173
174}
175
176class StepSizeModifier extends ModifierWithKey<Length> {
177  constructor(value: Length) {
178    super(value);
179  }
180  static identity: Symbol = Symbol('sliderStepSize');
181  applyPeer(node: KNode, reset: boolean): void {
182    if (reset) {
183      getUINativeModule().slider.resetStepSize(node);
184    } else {
185      getUINativeModule().slider.setStepSize(node, this.value);
186    }
187  }
188
189  checkObjectDiff(): boolean {
190    return !isBaseOrResourceEqual(this.stageValue, this.value);
191  }
192}
193
194class BlockSizeModifier extends ModifierWithKey<SizeOptions> {
195  constructor(value: SizeOptions) {
196    super(value);
197  }
198  static identity: Symbol = Symbol('sliderBlockSize');
199  applyPeer(node: KNode, reset: boolean) {
200    if (reset) {
201      getUINativeModule().slider.resetBlockSize(node);
202    } else {
203      getUINativeModule().slider.setBlockSize(node, this.value!.width, this.value!.height);
204    }
205  }
206
207  checkObjectDiff(): boolean {
208    if (isResource(this.stageValue.height) && isResource(this.value.height) && isResource(this.stageValue.width) && isResource(this.value.width)) {
209      return !(isResourceEqual(this.stageValue.height, this.value.height) && isResourceEqual(this.stageValue.width, this.value.width));
210    } else {
211      return true;
212    }
213  }
214}
215
216class TrackBorderRadiusModifier extends ModifierWithKey<Length> {
217  constructor(value: Length) {
218    super(value);
219  }
220  static identity: Symbol = Symbol('sliderTrackBorderRadius');
221  applyPeer(node: KNode, reset: boolean): void {
222    if (reset) {
223      getUINativeModule().slider.resetTrackBorderRadius(node);
224    } else {
225      getUINativeModule().slider.setTrackBorderRadius(node, this.value);
226    }
227  }
228
229  checkObjectDiff(): boolean {
230    return !isBaseOrResourceEqual(this.stageValue, this.value);
231  }
232}
233
234class StepColorModifier extends ModifierWithKey<ResourceColor> {
235  constructor(value: ResourceColor) {
236    super(value);
237  }
238  static identity: Symbol = Symbol('sliderStepColor');
239  applyPeer(node: KNode, reset: boolean): void {
240    if (reset) {
241      getUINativeModule().slider.resetStepColor(node);
242    } else {
243      getUINativeModule().slider.setStepColor(node, this.value);
244    }
245  }
246
247  checkObjectDiff(): boolean {
248    return !isBaseOrResourceEqual(this.stageValue, this.value);
249  }
250}
251
252class BlockBorderColorModifier extends ModifierWithKey<ResourceColor> {
253  constructor(value: ResourceColor) {
254    super(value);
255  }
256  static identity: Symbol = Symbol('sliderBlockBorderColor');
257  applyPeer(node: KNode, reset: boolean): void {
258    if (reset) {
259      getUINativeModule().slider.resetBlockBorderColor(node);
260    } else {
261      getUINativeModule().slider.setBlockBorderColor(node, this.value);
262    }
263  }
264
265  checkObjectDiff(): boolean {
266    return !isBaseOrResourceEqual(this.stageValue, this.value);
267  }
268}
269
270class BlockBorderWidthModifier extends ModifierWithKey<Length> {
271  constructor(value: Length) {
272    super(value);
273  }
274  static identity: Symbol = Symbol('sliderBlockBorderWidth');
275  applyPeer(node: KNode, reset: boolean): void {
276    if (reset) {
277      getUINativeModule().slider.resetBlockBorderWidth(node);
278    } else {
279      getUINativeModule().slider.setBlockBorderWidth(node, this.value);
280    }
281  }
282
283  checkObjectDiff(): boolean {
284    return !isBaseOrResourceEqual(this.stageValue, this.value);
285  }
286}
287
288class BlockColorModifier extends ModifierWithKey<ResourceColor> {
289  constructor(value: ResourceColor) {
290    super(value);
291  }
292  static identity: Symbol = Symbol('sliderBlockColor');
293  applyPeer(node: KNode, reset: boolean): void {
294    if (reset) {
295      getUINativeModule().slider.resetBlockColor(node);
296    } else {
297      getUINativeModule().slider.setBlockColor(node, this.value);
298    }
299  }
300
301  checkObjectDiff(): boolean {
302    return !isBaseOrResourceEqual(this.stageValue, this.value);
303  }
304}
305
306class TrackColorModifier extends ModifierWithKey<ResourceColor> {
307  constructor(value: ResourceColor) {
308    super(value);
309  }
310  static identity: Symbol = Symbol('sliderTrackColor');
311  applyPeer(node: KNode, reset: boolean): void {
312    if (reset) {
313      getUINativeModule().slider.resetTrackBackgroundColor(node);
314    } else {
315      getUINativeModule().slider.setTrackBackgroundColor(node, this.value);
316    }
317  }
318
319  checkObjectDiff(): boolean {
320    return !isBaseOrResourceEqual(this.stageValue, this.value);
321  }
322}
323
324class SelectColorModifier extends ModifierWithKey<ResourceColor> {
325  constructor(value: ResourceColor) {
326    super(value);
327  }
328  static identity: Symbol = Symbol('sliderSelectColor');
329  applyPeer(node: KNode, reset: boolean): void {
330    if (reset) {
331      getUINativeModule().slider.resetSelectColor(node);
332    } else {
333      getUINativeModule().slider.setSelectColor(node, this.value);
334    }
335  }
336
337  checkObjectDiff(): boolean {
338    return !isBaseOrResourceEqual(this.stageValue, this.value);
339  }
340}
341
342class ShowStepsModifier extends ModifierWithKey<boolean> {
343  constructor(value: boolean) {
344    super(value);
345  }
346  static identity: Symbol = Symbol('sliderShowSteps');
347  applyPeer(node: KNode, reset: boolean) {
348    if (reset) {
349      getUINativeModule().slider.resetShowSteps(node);
350    } else {
351      getUINativeModule().slider.setShowSteps(node, this.value);
352    }
353  }
354  checkObjectDiff(): boolean {
355    return this.stageValue !== this.value;
356  }
357}
358
359class TrackThicknessModifier extends ModifierWithKey<Length> {
360  constructor(value: Length) {
361    super(value);
362  }
363  static identity: Symbol = Symbol('sliderTrackThickness');
364  applyPeer(node: KNode, reset: boolean): void {
365    if (reset) {
366      getUINativeModule().slider.resetThickness(node);
367    } else {
368      getUINativeModule().slider.setThickness(node, this.value);
369    }
370  }
371
372  checkObjectDiff(): boolean {
373    return !isBaseOrResourceEqual(this.stageValue, this.value);
374  }
375}
376
377class ValidSlideRangeModifier extends ModifierWithKey<ValidSlideRange> {
378  constructor(value: ValidSlideRange) {
379    super(value);
380  }
381  static identity: Symbol = Symbol('slideRange');
382  applyPeer(node: KNode, reset: boolean): void {
383    if (reset) {
384      getUINativeModule().slider.resetValidSlideRange(node);
385    } else {
386      getUINativeModule().slider.setValidSlideRange(node, this.value);
387    }
388  }
389
390  checkObjectDiff(): boolean {
391    return !isBaseOrResourceEqual(this.stageValue, this.value);
392  }
393}
394
395class SelectedBorderRadiusModifier extends ModifierWithKey<Dimension> {
396  constructor(value: Dimension) {
397    super(value);
398  }
399  static identity: Symbol = Symbol('sliderSelectedBorderRadius');
400  applyPeer(node: KNode, reset: boolean): void {
401    if (reset) {
402      getUINativeModule().slider.resetSelectedBorderRadius(node);
403    } else {
404      getUINativeModule().slider.setSelectedBorderRadius(node, this.value);
405    }
406  }
407
408  checkObjectDiff(): boolean {
409    return !isBaseOrResourceEqual(this.stageValue, this.value);
410  }
411}
412
413class InteractionModeModifier extends ModifierWithKey<SliderInteraction> {
414  constructor(value: SliderInteraction) {
415    super(value);
416  }
417  static identity: Symbol = Symbol('sliderInteractionMode');
418  applyPeer(node: KNode, reset: boolean): void {
419    if (reset) {
420      getUINativeModule().slider.resetInteractionMode(node);
421    } else {
422      getUINativeModule().slider.setInteractionMode(node, this.value);
423    }
424  }
425
426  checkObjectDiff(): boolean {
427    return !isBaseOrResourceEqual(this.stageValue, this.value);
428  }
429}
430
431class MinResponsiveDistanceModifier extends ModifierWithKey<number> {
432  constructor(value: number) {
433    super(value);
434  }
435  static identity: Symbol = Symbol('sliderMinResponsiveDistance');
436  applyPeer(node: KNode, reset: boolean): void {
437    if (reset) {
438      getUINativeModule().slider.resetMinResponsiveDistance(node);
439    } else {
440      getUINativeModule().slider.setMinResponsiveDistance(node, this.value);
441    }
442  }
443
444  checkObjectDiff(): boolean {
445    return !isBaseOrResourceEqual(this.stageValue, this.value);
446  }
447}
448
449class SliderContentModifier extends ModifierWithKey<ContentModifier<SliderConfiguration>> {
450  constructor(value: ContentModifier<SliderConfiguration>) {
451    super(value);
452  }
453  static identity: Symbol = Symbol('sliderContentModifier');
454  applyPeer(node: KNode, reset: boolean, component: ArkComponent) {
455    let sliderComponent = component as ArkSliderComponent;
456    sliderComponent.setContentModifier(this.value);
457  }
458}
459
460// @ts-ignore
461globalThis.Slider.attributeModifier = function (modifier: ArkComponent): void {
462  attributeModifierFunc.call(this, modifier, (nativePtr: KNode) => {
463    return new ArkSliderComponent(nativePtr);
464  }, (nativePtr: KNode, classType: ModifierType, modifierJS: ModifierJS) => {
465    return new modifierJS.SliderModifier(nativePtr, classType);
466  });
467};
468
469// @ts-ignore
470globalThis.Slider.contentModifier = function (modifier): void {
471  const elmtId = ViewStackProcessor.GetElmtIdToAccountFor();
472  let nativeNode = getUINativeModule().getFrameNodeById(elmtId);
473  let component = this.createOrGetNode(elmtId, () => {
474    return new ArkSliderComponent(nativeNode);
475  });
476  component.setContentModifier(modifier);
477};
478