• 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  allowChildCount(): number {
26    return 0;
27  }
28  initialize(value: Object[]): this {
29    if (!value.length) {
30      return this;
31    }
32    if (!isUndefined(value[0]) && !isNull(value[0]) && isObject(value[0])) {
33      modifierWithKey(this._modifiersWithKeys, SliderOptionsModifier.identity, SliderOptionsModifier, value[0]);
34    } else {
35      modifierWithKey(this._modifiersWithKeys, SliderOptionsModifier.identity, SliderOptionsModifier, undefined);
36    }
37    return this;
38  }
39  blockColor(value: ResourceColor): this {
40    modifierWithKey(this._modifiersWithKeys, BlockColorModifier.identity, BlockColorModifier, value);
41    return this;
42  }
43  trackColor(value: ResourceColor): this {
44    modifierWithKey(this._modifiersWithKeys, TrackColorModifier.identity, TrackColorModifier, value);
45    return this;
46  }
47  selectedColor(value: ResourceColor): this {
48    modifierWithKey(this._modifiersWithKeys, SelectColorModifier.identity, SelectColorModifier, value);
49    return this;
50  }
51  minLabel(value: string): this {
52    throw new Error('Method not implemented.');
53  }
54  maxLabel(value: string): this {
55    throw new Error('Method not implemented.');
56  }
57  showSteps(value: boolean): this {
58    modifierWithKey(this._modifiersWithKeys, ShowStepsModifier.identity, ShowStepsModifier, value);
59    return this;
60  }
61  showTips(value: boolean, content?: any): this {
62    let showTips = new ArkSliderTips(value, content);
63    modifierWithKey(this._modifiersWithKeys, ShowTipsModifier.identity, ShowTipsModifier, showTips);
64    return this;
65  }
66  trackThickness(value: Length): this {
67    modifierWithKey(this._modifiersWithKeys, TrackThicknessModifier.identity, TrackThicknessModifier, value);
68    return this;
69  }
70  onChange(callback: (value: number, mode: SliderChangeMode) => void): this {
71    modifierWithKey(this._modifiersWithKeys, OnChangeModifier.identity, OnChangeModifier, callback);
72    return this;
73  }
74  blockBorderColor(value: ResourceColor): this {
75    modifierWithKey(this._modifiersWithKeys, BlockBorderColorModifier.identity, BlockBorderColorModifier, value);
76    return this;
77  }
78  blockBorderWidth(value: Length): this {
79    modifierWithKey(this._modifiersWithKeys, BlockBorderWidthModifier.identity, BlockBorderWidthModifier, value);
80    return this;
81  }
82  stepColor(value: ResourceColor): this {
83    modifierWithKey(this._modifiersWithKeys, StepColorModifier.identity, StepColorModifier, value);
84    return this;
85  }
86  trackBorderRadius(value: Length): this {
87    modifierWithKey(this._modifiersWithKeys, TrackBorderRadiusModifier.identity, TrackBorderRadiusModifier, value);
88    return this;
89  }
90  selectedBorderRadius(value: Dimension): this {
91    modifierWithKey(this._modifiersWithKeys, SelectedBorderRadiusModifier.identity, SelectedBorderRadiusModifier, value);
92    return this;
93  }
94  blockSize(value: SizeOptions): this {
95    modifierWithKey(this._modifiersWithKeys, BlockSizeModifier.identity, BlockSizeModifier, value);
96    return this;
97  }
98  blockStyle(value: SliderBlockStyle): this {
99    modifierWithKey(this._modifiersWithKeys, BlockStyleModifier.identity, BlockStyleModifier, value);
100    return this;
101  }
102  stepSize(value: Length): this {
103    modifierWithKey(this._modifiersWithKeys, StepSizeModifier.identity, StepSizeModifier, value);
104    return this;
105  }
106  sliderInteractionMode(value: SliderInteraction): this {
107    modifierWithKey(this._modifiersWithKeys, InteractionModeModifier.identity, InteractionModeModifier, value);
108    return this;
109  }
110  minResponsiveDistance(value: number): this {
111    modifierWithKey(this._modifiersWithKeys, MinResponsiveDistanceModifier.identity, MinResponsiveDistanceModifier, value);
112    return this;
113  }
114  contentModifier(value: ContentModifier<SliderConfiguration>): this {
115    modifierWithKey(this._modifiersWithKeys, SliderContentModifier.identity, SliderContentModifier, value);
116    return this;
117  }
118  slideRange(value: ValidSlideRange): this {
119    modifierWithKey(this._modifiersWithKeys, ValidSlideRangeModifier.identity, ValidSlideRangeModifier, value);
120    return this;
121  }
122  setContentModifier(modifier: ContentModifier<SliderConfiguration>): this {
123    if (modifier === undefined || modifier === null) {
124      getUINativeModule().slider.setContentModifierBuilder(this.nativePtr, false);
125      return;
126    }
127    this.needRebuild = false;
128    if (this.builder !== modifier.applyContent()) {
129      this.needRebuild = true;
130    }
131    this.builder = modifier.applyContent();
132    this.modifier = modifier;
133    getUINativeModule().slider.setContentModifierBuilder(this.nativePtr, this);
134  }
135  makeContentModifierNode(context: UIContext, sliderConfiguration: SliderConfiguration): FrameNode | null {
136    sliderConfiguration.contentModifier = this.modifier;
137    if (isUndefined(this.sliderNode) || this.needRebuild) {
138      const xNode = globalThis.requireNapi('arkui.node');
139      this.sliderNode = new xNode.BuilderNode(context);
140      this.sliderNode.build(this.builder, sliderConfiguration);
141      this.needRebuild = false;
142    } else {
143      this.sliderNode.update(sliderConfiguration);
144    }
145    return this.sliderNode.getFrameNode();
146  }
147  enableHapticFeedback(value: boolean): this {
148    modifierWithKey(this._modifiersWithKeys, SliderEnableHapticFeedbackModifier.identity, SliderEnableHapticFeedbackModifier, value);
149    return this;
150  }
151}
152
153class SliderOptionsModifier extends ModifierWithKey<SliderOptions> {
154  constructor(value: SliderOptions) {
155    super(value);
156  }
157  static identity: Symbol = Symbol('sliderOptions');
158  applyPeer(node: KNode, reset: boolean): void {
159    if (reset) {
160      getUINativeModule().slider.setSliderOptions(node, undefined, undefined, undefined, undefined, undefined,
161        undefined, undefined);
162    } else {
163      getUINativeModule().slider.setSliderOptions(node, this.value.value, this.value.min, this.value.max,
164        this.value.step, this.value.style, this.value.direction, this.value.reverse);
165    }
166  }
167
168  checkObjectDiff(): boolean {
169    return !isBaseOrResourceEqual(this.stageValue?.value, this.value?.value) ||
170      !isBaseOrResourceEqual(this.stageValue?.min, this.value?.min) ||
171      !isBaseOrResourceEqual(this.stageValue?.max, this.value?.max) ||
172      !isBaseOrResourceEqual(this.stageValue?.step, this.value?.step) ||
173      !isBaseOrResourceEqual(this.stageValue?.style, this.value?.style) ||
174      !isBaseOrResourceEqual(this.stageValue?.direction, this.value?.direction) ||
175      !isBaseOrResourceEqual(this.stageValue?.reverse, this.value?.reverse);
176  }
177}
178
179class BlockStyleModifier extends ModifierWithKey<SliderBlockStyle> {
180  constructor(value: SliderBlockStyle) {
181    super(value);
182  }
183  static identity: Symbol = Symbol('sliderBlockStyle');
184  applyPeer(node: KNode, reset: boolean): void {
185    if (reset) {
186      getUINativeModule().slider.resetBlockStyle(node);
187    } else {
188      getUINativeModule().slider.setBlockStyle(node, this.value);
189    }
190  }
191
192  checkObjectDiff(): boolean {
193    return !((this.stageValue as SliderBlockStyle).type === (this.value as SliderBlockStyle).type &&
194      (this.stageValue as SliderBlockStyle).image === (this.value as SliderBlockStyle).image &&
195      (this.stageValue as SliderBlockStyle).shape === (this.value as SliderBlockStyle).shape);
196
197  }
198}
199
200class ShowTipsModifier extends ModifierWithKey<ArkSliderTips> {
201  constructor(value: ArkSliderTips) {
202    super(value);
203  }
204  static identity: Symbol = Symbol('sliderShowTips');
205  applyPeer(node: KNode, reset: boolean) {
206    if (reset) {
207      getUINativeModule().slider.resetShowTips(node);
208    } else {
209      getUINativeModule().slider.setShowTips(node, this.value.showTip, this.value?.tipText);
210    }
211  }
212
213  checkObjectDiff(): boolean {
214    let showTipDiff = this.stageValue.showTip !== this.value.showTip;
215    let tipTextDiff = !isBaseOrResourceEqual(this.stageValue.tipText, this.value.tipText);
216    return showTipDiff || tipTextDiff;
217  }
218
219}
220
221class StepSizeModifier extends ModifierWithKey<Length> {
222  constructor(value: Length) {
223    super(value);
224  }
225  static identity: Symbol = Symbol('sliderStepSize');
226  applyPeer(node: KNode, reset: boolean): void {
227    if (reset) {
228      getUINativeModule().slider.resetStepSize(node);
229    } else {
230      getUINativeModule().slider.setStepSize(node, this.value);
231    }
232  }
233
234  checkObjectDiff(): boolean {
235    return !isBaseOrResourceEqual(this.stageValue, this.value);
236  }
237}
238
239class BlockSizeModifier extends ModifierWithKey<SizeOptions> {
240  constructor(value: SizeOptions) {
241    super(value);
242  }
243  static identity: Symbol = Symbol('sliderBlockSize');
244  applyPeer(node: KNode, reset: boolean) {
245    if (reset) {
246      getUINativeModule().slider.resetBlockSize(node);
247    } else {
248      getUINativeModule().slider.setBlockSize(node, this.value!.width, this.value!.height);
249    }
250  }
251
252  checkObjectDiff(): boolean {
253    if (isResource(this.stageValue.height) && isResource(this.value.height) && isResource(this.stageValue.width) && isResource(this.value.width)) {
254      return !(isResourceEqual(this.stageValue.height, this.value.height) && isResourceEqual(this.stageValue.width, this.value.width));
255    } else {
256      return true;
257    }
258  }
259}
260
261class TrackBorderRadiusModifier extends ModifierWithKey<Length> {
262  constructor(value: Length) {
263    super(value);
264  }
265  static identity: Symbol = Symbol('sliderTrackBorderRadius');
266  applyPeer(node: KNode, reset: boolean): void {
267    if (reset) {
268      getUINativeModule().slider.resetTrackBorderRadius(node);
269    } else {
270      getUINativeModule().slider.setTrackBorderRadius(node, this.value);
271    }
272  }
273
274  checkObjectDiff(): boolean {
275    return !isBaseOrResourceEqual(this.stageValue, this.value);
276  }
277}
278
279class StepColorModifier extends ModifierWithKey<ResourceColor> {
280  constructor(value: ResourceColor) {
281    super(value);
282  }
283  static identity: Symbol = Symbol('sliderStepColor');
284  applyPeer(node: KNode, reset: boolean): void {
285    if (reset) {
286      getUINativeModule().slider.resetStepColor(node);
287    } else {
288      getUINativeModule().slider.setStepColor(node, this.value);
289    }
290  }
291
292  checkObjectDiff(): boolean {
293    return !isBaseOrResourceEqual(this.stageValue, this.value);
294  }
295}
296
297class OnChangeModifier extends ModifierWithKey<(value:number,mode:SliderChangeMode) => void> {
298  constructor(value: (value:number,mode:SliderChangeMode) => void) {
299    super(value);
300  }
301  static identity: Symbol = Symbol('sliderOnChange');
302  applyPeer(node: KNode, reset: boolean): void {
303    if (reset) {
304      getUINativeModule().slider.resetOnChange(node);
305    } else {
306      getUINativeModule().slider.setOnChange(node, this.value);
307    }
308  }
309}
310
311class BlockBorderColorModifier extends ModifierWithKey<ResourceColor> {
312  constructor(value: ResourceColor) {
313    super(value);
314  }
315  static identity: Symbol = Symbol('sliderBlockBorderColor');
316  applyPeer(node: KNode, reset: boolean): void {
317    if (reset) {
318      getUINativeModule().slider.resetBlockBorderColor(node);
319    } else {
320      getUINativeModule().slider.setBlockBorderColor(node, this.value);
321    }
322  }
323
324  checkObjectDiff(): boolean {
325    return !isBaseOrResourceEqual(this.stageValue, this.value);
326  }
327}
328
329class BlockBorderWidthModifier extends ModifierWithKey<Length> {
330  constructor(value: Length) {
331    super(value);
332  }
333  static identity: Symbol = Symbol('sliderBlockBorderWidth');
334  applyPeer(node: KNode, reset: boolean): void {
335    if (reset) {
336      getUINativeModule().slider.resetBlockBorderWidth(node);
337    } else {
338      getUINativeModule().slider.setBlockBorderWidth(node, this.value);
339    }
340  }
341
342  checkObjectDiff(): boolean {
343    return !isBaseOrResourceEqual(this.stageValue, this.value);
344  }
345}
346
347class BlockColorModifier extends ModifierWithKey<ResourceColor> {
348  constructor(value: ResourceColor) {
349    super(value);
350  }
351  static identity: Symbol = Symbol('sliderBlockColor');
352  applyPeer(node: KNode, reset: boolean): void {
353    if (reset) {
354      getUINativeModule().slider.resetBlockColor(node);
355    } else {
356      getUINativeModule().slider.setBlockColor(node, this.value);
357    }
358  }
359
360  checkObjectDiff(): boolean {
361    return !isBaseOrResourceEqual(this.stageValue, this.value);
362  }
363}
364
365class TrackColorModifier extends ModifierWithKey<ResourceColor> {
366  constructor(value: ResourceColor) {
367    super(value);
368  }
369  static identity: Symbol = Symbol('sliderTrackColor');
370  applyPeer(node: KNode, reset: boolean): void {
371    if (reset) {
372      getUINativeModule().slider.resetTrackBackgroundColor(node);
373    } else {
374      getUINativeModule().slider.setTrackBackgroundColor(node, this.value);
375    }
376  }
377
378  checkObjectDiff(): boolean {
379    return !isBaseOrResourceEqual(this.stageValue, this.value);
380  }
381}
382
383class SelectColorModifier extends ModifierWithKey<ResourceColor> {
384  constructor(value: ResourceColor) {
385    super(value);
386  }
387  static identity: Symbol = Symbol('sliderSelectColor');
388  applyPeer(node: KNode, reset: boolean): void {
389    if (reset) {
390      getUINativeModule().slider.resetSelectColor(node);
391    } else {
392      getUINativeModule().slider.setSelectColor(node, this.value);
393    }
394  }
395
396  checkObjectDiff(): boolean {
397    return !isBaseOrResourceEqual(this.stageValue, this.value);
398  }
399}
400
401class ShowStepsModifier extends ModifierWithKey<boolean> {
402  constructor(value: boolean) {
403    super(value);
404  }
405  static identity: Symbol = Symbol('sliderShowSteps');
406  applyPeer(node: KNode, reset: boolean) {
407    if (reset) {
408      getUINativeModule().slider.resetShowSteps(node);
409    } else {
410      getUINativeModule().slider.setShowSteps(node, this.value);
411    }
412  }
413  checkObjectDiff(): boolean {
414    return this.stageValue !== this.value;
415  }
416}
417
418class TrackThicknessModifier extends ModifierWithKey<Length> {
419  constructor(value: Length) {
420    super(value);
421  }
422  static identity: Symbol = Symbol('sliderTrackThickness');
423  applyPeer(node: KNode, reset: boolean): void {
424    if (reset) {
425      getUINativeModule().slider.resetThickness(node);
426    } else {
427      getUINativeModule().slider.setThickness(node, this.value);
428    }
429  }
430
431  checkObjectDiff(): boolean {
432    return !isBaseOrResourceEqual(this.stageValue, this.value);
433  }
434}
435
436class ValidSlideRangeModifier extends ModifierWithKey<ValidSlideRange> {
437  constructor(value: ValidSlideRange) {
438    super(value);
439  }
440  static identity: Symbol = Symbol('slideRange');
441  applyPeer(node: KNode, reset: boolean): void {
442    if (reset) {
443      getUINativeModule().slider.resetValidSlideRange(node);
444    } else {
445      getUINativeModule().slider.setValidSlideRange(node, this.value);
446    }
447  }
448
449  checkObjectDiff(): boolean {
450    return !isBaseOrResourceEqual(this.stageValue, this.value);
451  }
452}
453
454class SelectedBorderRadiusModifier extends ModifierWithKey<Dimension> {
455  constructor(value: Dimension) {
456    super(value);
457  }
458  static identity: Symbol = Symbol('sliderSelectedBorderRadius');
459  applyPeer(node: KNode, reset: boolean): void {
460    if (reset) {
461      getUINativeModule().slider.resetSelectedBorderRadius(node);
462    } else {
463      getUINativeModule().slider.setSelectedBorderRadius(node, this.value);
464    }
465  }
466
467  checkObjectDiff(): boolean {
468    return !isBaseOrResourceEqual(this.stageValue, this.value);
469  }
470}
471
472class InteractionModeModifier extends ModifierWithKey<SliderInteraction> {
473  constructor(value: SliderInteraction) {
474    super(value);
475  }
476  static identity: Symbol = Symbol('sliderInteractionMode');
477  applyPeer(node: KNode, reset: boolean): void {
478    if (reset) {
479      getUINativeModule().slider.resetInteractionMode(node);
480    } else {
481      getUINativeModule().slider.setInteractionMode(node, this.value);
482    }
483  }
484
485  checkObjectDiff(): boolean {
486    return !isBaseOrResourceEqual(this.stageValue, this.value);
487  }
488}
489
490class MinResponsiveDistanceModifier extends ModifierWithKey<number> {
491  constructor(value: number) {
492    super(value);
493  }
494  static identity: Symbol = Symbol('sliderMinResponsiveDistance');
495  applyPeer(node: KNode, reset: boolean): void {
496    if (reset) {
497      getUINativeModule().slider.resetMinResponsiveDistance(node);
498    } else {
499      getUINativeModule().slider.setMinResponsiveDistance(node, this.value);
500    }
501  }
502
503  checkObjectDiff(): boolean {
504    return !isBaseOrResourceEqual(this.stageValue, this.value);
505  }
506}
507
508class SliderContentModifier extends ModifierWithKey<ContentModifier<SliderConfiguration>> {
509  constructor(value: ContentModifier<SliderConfiguration>) {
510    super(value);
511  }
512  static identity: Symbol = Symbol('sliderContentModifier');
513  applyPeer(node: KNode, reset: boolean, component: ArkComponent) {
514    let sliderComponent = component as ArkSliderComponent;
515    sliderComponent.setContentModifier(this.value);
516  }
517}
518
519class SliderEnableHapticFeedbackModifier extends ModifierWithKey<boolean> {
520  constructor(value: boolean) {
521    super(value);
522  }
523  static identity: Symbol = Symbol('sliderEnableHapticFeedback');
524  applyPeer(node: KNode, reset: boolean): void {
525    if (reset) {
526      getUINativeModule().slider.resetEnableHapticFeedback(node);
527    } else {
528      getUINativeModule().slider.setEnableHapticFeedback(node, this.value);
529    }
530  }
531}
532
533// @ts-ignore
534globalThis.Slider.attributeModifier = function (modifier: ArkComponent): void {
535  attributeModifierFunc.call(this, modifier, (nativePtr: KNode) => {
536    return new ArkSliderComponent(nativePtr);
537  }, (nativePtr: KNode, classType: ModifierType, modifierJS: ModifierJS) => {
538    return new modifierJS.SliderModifier(nativePtr, classType);
539  });
540};
541
542// @ts-ignore
543globalThis.Slider.contentModifier = function (modifier): void {
544  const elmtId = ViewStackProcessor.GetElmtIdToAccountFor();
545  let nativeNode = getUINativeModule().getFrameNodeById(elmtId);
546  let component = this.createOrGetNode(elmtId, () => {
547    return new ArkSliderComponent(nativeNode);
548  });
549  component.setContentModifier(modifier);
550};
551