feat(scrollbar): add isScrollEnabled property (#6640)

This commit is contained in:
Manol Donev
2018-11-30 17:18:40 +02:00
committed by GitHub
parent 64bccb9bbc
commit ae0fa90290
6 changed files with 52 additions and 19 deletions

View File

@ -31,7 +31,6 @@ const androidBackPressedEvent = "androidBackPressed";
const modalMap = new Map<number, DialogOptions>(); const modalMap = new Map<number, DialogOptions>();
let TouchListener: TouchListener; let TouchListener: TouchListener;
let disableUserInteractionListener: org.nativescript.widgets.DisableUserInteractionListener;
let DialogFragment: DialogFragment; let DialogFragment: DialogFragment;
interface DialogOptions { interface DialogOptions {
@ -50,14 +49,6 @@ interface DialogFragment {
new(): android.support.v4.app.DialogFragment; new(): android.support.v4.app.DialogFragment;
} }
function initializeDisabledListener(): void {
if (disableUserInteractionListener) {
return;
}
disableUserInteractionListener = new org.nativescript.widgets.DisableUserInteractionListener();
}
function initializeTouchListener(): void { function initializeTouchListener(): void {
if (TouchListener) { if (TouchListener) {
return; return;
@ -649,9 +640,8 @@ export class View extends ViewCommon {
} }
[isUserInteractionEnabledProperty.setNative](value: boolean) { [isUserInteractionEnabledProperty.setNative](value: boolean) {
if (this.nativeViewProtected.setClickable) { this.nativeViewProtected.setClickable(value);
this.nativeViewProtected.setClickable(value); this.nativeViewProtected.setFocusable(value);
}
} }
[visibilityProperty.getDefault](): Visibility { [visibilityProperty.getDefault](): Visibility {

View File

@ -11,6 +11,7 @@ export abstract class ScrollViewBase extends ContentView implements ScrollViewDe
public orientation: Orientation; public orientation: Orientation;
public scrollBarIndicatorVisible: boolean; public scrollBarIndicatorVisible: boolean;
public isScrollEnabled: boolean;
public addEventListener(arg: string, callback: any, thisArg?: any) { public addEventListener(arg: string, callback: any, thisArg?: any) {
super.addEventListener(arg, callback, thisArg); super.addEventListener(arg, callback, thisArg);
@ -103,3 +104,9 @@ export const scrollBarIndicatorVisibleProperty = new Property<ScrollViewBase, bo
valueConverter: booleanConverter valueConverter: booleanConverter
}); });
scrollBarIndicatorVisibleProperty.register(ScrollViewBase); scrollBarIndicatorVisibleProperty.register(ScrollViewBase);
export const isScrollEnabledProperty = new Property<ScrollViewBase, boolean>({
name: "isScrollEnabled", defaultValue: true,
valueConverter: booleanConverter
});
isScrollEnabledProperty.register(ScrollViewBase);

View File

@ -1,5 +1,8 @@
import { ScrollEventData } from "."; import { ScrollEventData } from ".";
import { ScrollViewBase, layout, scrollBarIndicatorVisibleProperty } from "./scroll-view-common"; import {
ScrollViewBase, layout, scrollBarIndicatorVisibleProperty,
isUserInteractionEnabledProperty, isScrollEnabledProperty
} from "./scroll-view-common";
export * from "./scroll-view-common"; export * from "./scroll-view-common";
@ -44,6 +47,21 @@ export class ScrollView extends ScrollViewBase {
return nativeView.getScrollableLength() / layout.getDisplayDensity(); return nativeView.getScrollableLength() / layout.getDisplayDensity();
} }
[isUserInteractionEnabledProperty.setNative](value: boolean) {
// NOTE: different behavior on iOS & Android:
// iOS disables user interaction recursively for all subviews as well
this.nativeViewProtected.setClickable(value);
this.nativeViewProtected.setFocusable(value);
this.nativeViewProtected.setScrollEnabled(value);
}
[isScrollEnabledProperty.getDefault](): boolean {
return this.nativeViewProtected.getScrollEnabled();
}
[isScrollEnabledProperty.setNative](value: boolean) {
this.nativeViewProtected.setScrollEnabled(value);
}
[scrollBarIndicatorVisibleProperty.getDefault](): boolean { [scrollBarIndicatorVisibleProperty.getDefault](): boolean {
return true; return true;
} }
@ -57,7 +75,7 @@ export class ScrollView extends ScrollViewBase {
public scrollToVerticalOffset(value: number, animated: boolean) { public scrollToVerticalOffset(value: number, animated: boolean) {
const nativeView = this.nativeViewProtected; const nativeView = this.nativeViewProtected;
if (nativeView && this.orientation === "vertical") { if (nativeView && this.orientation === "vertical" && this.isScrollEnabled) {
value *= layout.getDisplayDensity(); value *= layout.getDisplayDensity();
if (animated) { if (animated) {
@ -70,7 +88,7 @@ export class ScrollView extends ScrollViewBase {
public scrollToHorizontalOffset(value: number, animated: boolean) { public scrollToHorizontalOffset(value: number, animated: boolean) {
const nativeView = this.nativeViewProtected; const nativeView = this.nativeViewProtected;
if (nativeView && this.orientation === "horizontal") { if (nativeView && this.orientation === "horizontal" && this.isScrollEnabled) {
value *= layout.getDisplayDensity(); value *= layout.getDisplayDensity();
if (animated) { if (animated) {

View File

@ -14,6 +14,11 @@ export class ScrollView extends ContentView {
*/ */
public static scrollEvent: string; public static scrollEvent: string;
/**
* Gets or sets a value indicating whether scroll is enabled.
*/
isScrollEnabled: boolean;
/** /**
* Gets a value that contains the vertical offset of the scrolled content. * Gets a value that contains the vertical offset of the scrolled content.
*/ */

View File

@ -1,5 +1,7 @@
import { ScrollEventData } from "."; import { ScrollEventData } from ".";
import { View, layout, ScrollViewBase, scrollBarIndicatorVisibleProperty } from "./scroll-view-common"; import {
View, layout, ScrollViewBase, scrollBarIndicatorVisibleProperty, isScrollEnabledProperty
} from "./scroll-view-common";
import { ios as iosUtils } from "../../utils/utils"; import { ios as iosUtils } from "../../utils/utils";
// HACK: Webpack. Use a fully-qualified import to allow resolve.extensions(.ios.js) to // HACK: Webpack. Use a fully-qualified import to allow resolve.extensions(.ios.js) to
// kick in. `../utils` doesn't seem to trigger the webpack extensions mechanism. // kick in. `../utils` doesn't seem to trigger the webpack extensions mechanism.
@ -99,6 +101,13 @@ export class ScrollView extends ScrollViewBase {
return Math.max(0, this.nativeViewProtected.contentSize.height - this.nativeViewProtected.bounds.size.height); return Math.max(0, this.nativeViewProtected.contentSize.height - this.nativeViewProtected.bounds.size.height);
} }
[isScrollEnabledProperty.getDefault](): boolean {
return this.nativeViewProtected.scrollEnabled;
}
[isScrollEnabledProperty.setNative](value: boolean) {
this.nativeViewProtected.scrollEnabled = value;
}
[scrollBarIndicatorVisibleProperty.getDefault](): boolean { [scrollBarIndicatorVisibleProperty.getDefault](): boolean {
return true; return true;
} }
@ -107,14 +116,14 @@ export class ScrollView extends ScrollViewBase {
} }
public scrollToVerticalOffset(value: number, animated: boolean) { public scrollToVerticalOffset(value: number, animated: boolean) {
if (this.nativeViewProtected && this.orientation === "vertical") { if (this.nativeViewProtected && this.orientation === "vertical" && this.isScrollEnabled) {
const bounds = this.nativeViewProtected.bounds.size; const bounds = this.nativeViewProtected.bounds.size;
this.nativeViewProtected.scrollRectToVisibleAnimated(CGRectMake(0, value, bounds.width, bounds.height), animated); this.nativeViewProtected.scrollRectToVisibleAnimated(CGRectMake(0, value, bounds.width, bounds.height), animated);
} }
} }
public scrollToHorizontalOffset(value: number, animated: boolean) { public scrollToHorizontalOffset(value: number, animated: boolean) {
if (this.nativeViewProtected && this.orientation === "horizontal") { if (this.nativeViewProtected && this.orientation === "horizontal" && this.isScrollEnabled) {
const bounds = this.nativeViewProtected.bounds.size; const bounds = this.nativeViewProtected.bounds.size;
this.nativeViewProtected.scrollRectToVisibleAnimated(CGRectMake(value, 0, bounds.width, bounds.height), animated); this.nativeViewProtected.scrollRectToVisibleAnimated(CGRectMake(value, 0, bounds.width, bounds.height), animated);
} }

View File

@ -342,11 +342,15 @@
export class VerticalScrollView extends android.widget.ScrollView { export class VerticalScrollView extends android.widget.ScrollView {
constructor(context: android.content.Context); constructor(context: android.content.Context);
public getScrollableLength(): number; public getScrollableLength(): number;
public getScrollEnabled(): boolean;
public setScrollEnabled(value: boolean): void;
} }
export class HorizontalScrollView extends android.widget.HorizontalScrollView { export class HorizontalScrollView extends android.widget.HorizontalScrollView {
constructor(context: android.content.Context); constructor(context: android.content.Context);
public getScrollableLength(): number; public getScrollableLength(): number;
public getScrollEnabled(): boolean;
public setScrollEnabled(value: boolean): void;
} }
export class ImageView extends android.widget.ImageView { export class ImageView extends android.widget.ImageView {