Skip to content

Commit 31b737a

Browse files
authored
Merge pull request #37 from jcassidyav/indicator-circular
fix: indicator, circular mode, binding updates
2 parents 7ed03cd + eb3efed commit 31b737a

File tree

8 files changed

+222
-108
lines changed

8 files changed

+222
-108
lines changed

demo-snippets/ng/indicator/indicator.component.html

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,13 @@
44
</ActionBar>
55

66
<StackLayout>
7-
<Pager
8-
[items]="items"
9-
height="300"
10-
[selectedIndex]="selectedIndex"
11-
(selectedIndexChange)="onIndexChanged($event)"
12-
indicator="fill"
13-
showIndicator="true"
14-
>
7+
<Pager [items]="items" height="300" [selectedIndex]="selectedIndex" (selectedIndexChange)="onIndexChanged($event)"
8+
indicator="fill" showIndicator="true">
159
<ng-template let-i="index" let-item="item">
16-
<GridLayout
17-
[backgroundColor]="item.color"
18-
>
10+
<GridLayout [backgroundColor]="item.color">
1911
<Label class="label" [text]="item.title"></Label>
2012
</GridLayout>
2113
</ng-template>
2214
</Pager>
2315
<Button text="Reset" (tap)="resetPager()"></Button>
24-
</StackLayout>
16+
</StackLayout>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Foundation
2+
import CHIPageControl
3+
4+
@objcMembers
5+
@objc(NSCProgressHelper)
6+
public class NSCProgressHelper: NSObject {
7+
8+
public static func setProgress( pageControl: CHIBasePageControl,progress: Int, animated: Bool) {
9+
10+
pageControl.set(progress: progress, animated: animated);
11+
12+
}
13+
}

src/ui-pager-indicator/index.common.ts

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,4 @@
1-
import {
2-
AddChildFromBuilder,
3-
Builder,
4-
CSSType,
5-
CoercibleProperty,
6-
Color,
7-
ContainerView,
8-
CoreTypes,
9-
GridLayout,
10-
ItemsSource,
11-
KeyedTemplate,
12-
Label,
13-
Length,
14-
Observable,
15-
ObservableArray,
16-
PercentLength,
17-
Property,
18-
Template,
19-
Trace,
20-
View,
21-
ViewBase,
22-
addWeakEventListener,
23-
makeParser,
24-
makeValidator,
25-
removeWeakEventListener
26-
} from '@nativescript/core';
1+
import { CSSType, Color, ItemsSource, Property, View, ViewBase } from '@nativescript/core';
272
import { IndicatorHolder } from '.';
283
export enum Indicator {
294
Disabled = 'disable',
@@ -62,6 +37,21 @@ export abstract class PagerIndicatorBase extends View {
6237
pagerView: View & IndicatorHolder;
6338
pagerViewId: string;
6439

40+
getPage() {
41+
if (this.page) {
42+
return this.page;
43+
} else {
44+
return this.getTopmost(this);
45+
}
46+
}
47+
getTopmost<View>(arg: ViewBase) {
48+
if (arg.parent) {
49+
return this.getTopmost(arg.parent);
50+
} else {
51+
return arg;
52+
}
53+
}
54+
6555
disposeNativeView() {
6656
this.pagerView = null;
6757
super.disposeNativeView();
@@ -70,12 +60,11 @@ export abstract class PagerIndicatorBase extends View {
7060
onLoaded() {
7161
super.onLoaded();
7262
if (this.pagerViewId) {
73-
this.setPagerView(this.page.getViewById(this.pagerViewId));
63+
this.setPagerView(this.getPage().getViewById(this.pagerViewId));
7464
}
7565
}
7666

7767
setPagerView(view: View) {
78-
console.log('setPagerView', view);
7968
if (this.pagerView !== view) {
8069
if (this.pagerView) {
8170
this.pagerView.setIndicator(null);
@@ -89,7 +78,9 @@ export abstract class PagerIndicatorBase extends View {
8978
}
9079

9180
[pagerViewIdProperty.setNative](value) {
92-
this.setPagerView(this.page.getViewById(value));
81+
if (this.page) {
82+
this.setPagerView(this.page?.getViewById(value));
83+
}
9384
}
9485

9586
abstract setSelection(index: number, animated?: boolean);

src/ui-pager-indicator/index.ios.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export class PagerIndicator extends PagerIndicatorBase {
4848
}
4949

5050
setProgress(position: number, progress: number) {
51-
this.nativeViewProtected.setWithProgressAnimated(progress, true);
51+
NSCProgressHelper.setProgressWithPageControlProgressAnimated(this.nativeViewProtected, progress, true);
5252
}
5353
getCount(): number {
5454
return this.nativeViewProtected.numberOfPages;
@@ -58,7 +58,7 @@ export class PagerIndicator extends PagerIndicatorBase {
5858
}
5959
setInteractiveAnimation(animated?: boolean) {}
6060
setSelection(progress: number, animated: boolean = true) {
61-
this.nativeViewProtected.setWithProgressAnimated(progress, animated);
61+
NSCProgressHelper.setProgressWithPageControlProgressAnimated(this.nativeViewProtected, progress, animated);
6262
}
6363
setCount(count: number) {
6464
this.nativeViewProtected.numberOfPages = count;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/// <reference path="./typings/objc!CHIPageControl.d.ts" />
2+
/// <reference path="./typings/objc!nsswiftsupport.d.ts" />
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
declare class NSCProgressHelper extends NSObject {
3+
4+
static alloc(): NSCProgressHelper; // inherited from NSObject
5+
6+
static new(): NSCProgressHelper; // inherited from NSObject
7+
8+
static setProgressWithPageControlProgressAnimated(pageControl: CHIBasePageControl, progress: number, animated: boolean): void;
9+
}

src/ui-pager/index.android.ts

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@ export class Pager extends PagerBase {
255255
}
256256
this._initAutoPlay(this.autoPlay);
257257
}
258+
if (this.indicator && this.mObservableArrayInstance && this.mObservableArrayInstance.length) {
259+
this.indicator.setCount(this.mObservableArrayInstance.length);
260+
this.pagerAdapter.notifyDataSetChanged();
261+
this.scrollToIndexAnimated(0, false);
262+
}
258263
};
259264
disposeViewHolderViews() {
260265
this.enumerateViewHolders((v) => {
@@ -318,7 +323,7 @@ export class Pager extends PagerBase {
318323
const indicator = this.indicator;
319324
const toDo = () => {
320325
nativeView.setCurrentItem(index, false);
321-
indicator.setSelection(this.selectedIndex, false);
326+
if (indicator) indicator.setSelection(this.selectedIndex, false);
322327
};
323328
if (indicator) {
324329
indicator.withoutAnimation(toDo);
@@ -363,10 +368,13 @@ export class Pager extends PagerBase {
363368
public scrollToIndexAnimated(index: number, animate: boolean) {
364369
const nativeView = this.nativeViewProtected;
365370
if (nativeView) {
366-
nativeView.setCurrentItem(index, animate);
371+
nativeView.setCurrentItem(this.pagerAdapter.getIndex(index), animate);
367372
if (!animate) {
368373
// without animate we wont go through the delegate
369374
selectedIndexProperty.nativeValueChange(this, index);
375+
if (this.indicator) {
376+
this.indicator.setSelection(index, false);
377+
}
370378
}
371379
}
372380
}
@@ -526,7 +534,6 @@ export class Pager extends PagerBase {
526534

527535
if (isRightOverScrolled || isLeftOverScrolled) {
528536
selectedPosition = position;
529-
indicator.setSelection(selectedPosition);
530537
}
531538

532539
const slideToRightSide = selectedPosition === position && positionOffset !== 0;
@@ -581,6 +588,14 @@ function initPagerChangeCallback() {
581588
onPageSelected(position: number) {
582589
const owner = this.owner && this.owner.get();
583590
if (owner) {
591+
if (owner.lastEvent === 0 && !owner.circularMode) {
592+
// page changing without scroll so do the indicator etc.
593+
selectedIndexProperty.nativeValueChange(owner, position);
594+
if (owner.indicator) {
595+
owner.indicator.setSelection(position, true);
596+
}
597+
}
598+
584599
owner.notify({
585600
eventName: Pager.swipeEvent,
586601
object: owner
@@ -619,7 +634,10 @@ function initPagerChangeCallback() {
619634
const selectingPosition = progress[0];
620635
const selectingProgress = progress[1];
621636
indicator.setInteractiveAnimation(true);
622-
indicator.setProgress(selectingPosition, selectingProgress);
637+
if (position < owner.lastIndex) {
638+
indicator.setSelection(position, false);
639+
indicator.setProgress(selectingPosition, selectingProgress);
640+
}
623641
}
624642
}
625643
}
@@ -702,6 +720,7 @@ interface PagerRecyclerAdapter extends androidx.recyclerview.widget.RecyclerView
702720
new (owner: WeakRef<Pager>): PagerRecyclerAdapter;
703721
getPosition(index: number): number;
704722
lastIndex(): number;
723+
getIndex(index: number): number;
705724
}
706725
// eslint-disable-next-line no-redeclare
707726
let PagerRecyclerAdapter: PagerRecyclerAdapter;
@@ -767,7 +786,27 @@ function initPagerRecyclerAdapter() {
767786
}
768787
return position;
769788
}
770-
789+
/**
790+
*
791+
* Get the position in the CollectionView from the selected index
792+
*
793+
* @param index The position in the collectionView
794+
* @returns The selected Index ( i.e. the number in the slides as the user would view it).
795+
*/
796+
getIndex(index: number): number {
797+
let position = index;
798+
const owner = this.owner && this.owner.get();
799+
if (owner && owner.circularMode) {
800+
if (position === 0) {
801+
position = 1;
802+
} else if (position === this.firstDummy()) {
803+
position = 0;
804+
} else {
805+
position = position + 1;
806+
}
807+
}
808+
return position;
809+
}
771810
onBindViewHolder(holder: any, index: number): void {
772811
const owner = this.owner ? this.owner.get() : null;
773812
if (owner) {

0 commit comments

Comments
 (0)