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