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