summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls/CoreGalleryPages/CoreGalleryPage.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Controls/CoreGalleryPages/CoreGalleryPage.cs')
-rw-r--r--Xamarin.Forms.Controls/CoreGalleryPages/CoreGalleryPage.cs185
1 files changed, 185 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls/CoreGalleryPages/CoreGalleryPage.cs b/Xamarin.Forms.Controls/CoreGalleryPages/CoreGalleryPage.cs
new file mode 100644
index 00000000..41b3a796
--- /dev/null
+++ b/Xamarin.Forms.Controls/CoreGalleryPages/CoreGalleryPage.cs
@@ -0,0 +1,185 @@
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Threading;
+
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ internal class CoreGalleryPage<T> : ContentPage
+ where T : View, new ()
+ {
+ List<View> _views;
+ int _currentIndex;
+ Picker _picker;
+ StackLayout _moveNextStack;
+
+ ViewContainer<T> _backgroundColorViewContainer;
+ ViewContainer<T> _opacityViewContainer;
+ ViewContainer<T> _rotationViewContainer;
+ ViewContainer<T> _rotationXViewContainer;
+ ViewContainer<T> _rotationYViewContainer;
+ ViewContainer<T> _scaleViewContainer;
+ ViewContainer<T> _translationXViewContainer;
+ ViewContainer<T> _translationYViewContainer;
+
+ StateViewContainer<T> _focusStateViewContainer;
+ StateViewContainer<T> _isFocusedStateViewContainer;
+ StateViewContainer<T> _isVisibleStateViewContainer;
+
+ EventViewContainer<T> _gestureRecognizerEventViewContainer;
+ EventViewContainer<T> _focusedEventViewContainer;
+ EventViewContainer<T> _unfocusedEventViewContainer;
+
+ LayeredViewContainer<T> _inputTransparentViewContainer;
+
+ protected StateViewContainer<T> IsEnabledStateViewContainer { get; private set; }
+
+ protected StackLayout Layout { get; private set; }
+
+ internal CoreGalleryPage ()
+ {
+ Layout = new StackLayout {
+ Padding = new Thickness (20)
+ };
+
+ var modalDismissButton = new Button () {
+ Text = "Dismiss Page",
+ Command = new Command (async () => await Navigation.PopModalAsync ())
+ };
+ Layout.Children.Add (modalDismissButton);
+
+ Build (Layout);
+
+ Content = new ScrollView { AutomationId = "GalleryScrollView", Content = Layout };
+
+ }
+
+ protected virtual void InitializeElement (T element) {}
+
+ protected virtual void Build (StackLayout stackLayout)
+ {
+ var isFocusedView = new T ();
+ isFocusedView.SetValueCore (IsFocusedPropertyKey, true);
+
+ var viewContainers = new[] {
+ _isFocusedStateViewContainer = new StateViewContainer<T> (Test.VisualElement.IsFocused, isFocusedView),
+ _backgroundColorViewContainer = new ViewContainer<T> (Test.VisualElement.BackgroundColor, new T { BackgroundColor = Color.Blue }),
+ _focusStateViewContainer = new StateViewContainer<T> (Test.VisualElement.Focus, new T ()),
+ _gestureRecognizerEventViewContainer = new EventViewContainer<T> (Test.View.GestureRecognizers, new T ()),
+ _inputTransparentViewContainer = new LayeredViewContainer<T> (Test.VisualElement.InputTransparent, new T { InputTransparent = true }),
+ IsEnabledStateViewContainer = new StateViewContainer<T> (Test.VisualElement.IsEnabled, new T { IsEnabled = true }),
+ _focusedEventViewContainer = new EventViewContainer<T> (Test.VisualElement.Focused, new T ()),
+ _unfocusedEventViewContainer = new EventViewContainer<T> (Test.VisualElement.Unfocused, new T ()),
+ _isVisibleStateViewContainer = new StateViewContainer<T> (Test.VisualElement.IsVisible, new T { IsVisible = true }),
+ _opacityViewContainer = new ViewContainer<T> (Test.VisualElement.Opacity, new T { Opacity = 0.5 }),
+ _rotationViewContainer = new ViewContainer<T> (Test.VisualElement.Rotation, new T { Rotation = 10 }),
+ _rotationXViewContainer = new ViewContainer<T> (Test.VisualElement.RotationX, new T { RotationX = 33 }),
+ _rotationYViewContainer = new ViewContainer<T> (Test.VisualElement.RotationY, new T { RotationY = 10 }),
+ _scaleViewContainer = new ViewContainer<T> (Test.VisualElement.Scale, new T { Scale = 0.5 }),
+ _translationXViewContainer = new ViewContainer<T> (Test.VisualElement.TranslationX, new T { TranslationX = 30 }),
+ _translationYViewContainer = new ViewContainer<T> (Test.VisualElement.TranslationY, new T { TranslationY = 30 }),
+ };
+
+ // Set state
+ IsEnabledStateViewContainer.StateChangeButton.Command = new Command (() => {
+ IsEnabledStateViewContainer.View.IsEnabled = !IsEnabledStateViewContainer.View.IsEnabled;
+ });
+ _isVisibleStateViewContainer.StateChangeButton.Command = new Command (() => {
+ _isVisibleStateViewContainer.View.IsVisible = !_isVisibleStateViewContainer.View.IsVisible;
+ });
+
+ _focusStateViewContainer.StateChangeButton.Command = new Command (() => {
+ if (_focusStateViewContainer.View.IsFocused) {
+ _focusStateViewContainer.View.Unfocus ();
+ } else {
+ _focusStateViewContainer.View.Focus ();
+ }
+ });
+
+ _focusedEventViewContainer.View.Focused += (sender, args) => _focusedEventViewContainer.EventFired ();
+ _unfocusedEventViewContainer.View.Unfocused += (sender, args) => _unfocusedEventViewContainer.EventFired ();
+
+ _gestureRecognizerEventViewContainer.View.GestureRecognizers.Add (
+ new TapGestureRecognizer {
+ Command = new Command (() => _gestureRecognizerEventViewContainer.EventFired ())
+ }
+ );
+
+ _views = new List<View> (viewContainers.Select (o => o.ContainerLayout));
+
+ _moveNextStack = new StackLayout ();
+ var moveNextButton = new Button ();
+ moveNextButton.Text = "Move Next";
+ moveNextButton.AutomationId = "MoveNextButton";
+ moveNextButton.Clicked += delegate (object sender, EventArgs e) {
+ if (!_views.Any ())
+ return;
+
+ if (_currentIndex + 1 >= _views.Count) {
+ return;
+ }
+
+ _currentIndex += 1;
+
+ _moveNextStack.Children.RemoveAt (2);
+ _moveNextStack.Children.Add (_views[_currentIndex]);
+ _picker.SelectedIndexChanged -= PickerSelectedIndexChanged;
+ _picker.SelectedIndex = _currentIndex;
+ _picker.SelectedIndexChanged += PickerSelectedIndexChanged;
+ };
+
+ _picker = new Picker();
+ foreach (var container in viewContainers) {
+ _picker.Items.Add(container.TitleLabel.Text);
+ }
+
+ _picker.SelectedIndex = _currentIndex;
+
+ _picker.SelectedIndexChanged += PickerSelectedIndexChanged;
+
+ _moveNextStack.Children.Add (_picker);
+ _moveNextStack.Children.Add (moveNextButton);
+ _moveNextStack.Children.Add (_views[_currentIndex]);
+
+ stackLayout.Children.Add (_moveNextStack);
+
+ if (!SupportsFocus) {
+ stackLayout.Children.Remove (_focusStateViewContainer.ContainerLayout);
+ stackLayout.Children.Remove (_isFocusedStateViewContainer.ContainerLayout);
+ }
+
+ if (!SupportsTapGestureRecognizer)
+ stackLayout.Children.Remove (_gestureRecognizerEventViewContainer.ContainerLayout);
+
+ foreach (var element in viewContainers)
+ InitializeElement (element.View);
+ }
+
+ void PickerSelectedIndexChanged (object sender, EventArgs eventArgs)
+ {
+ _currentIndex = _picker.SelectedIndex;
+ _moveNextStack.Children.RemoveAt (2);
+ _moveNextStack.Children.Add (_views[_currentIndex]);
+ }
+
+
+ protected virtual bool SupportsTapGestureRecognizer
+ {
+ get { return true; }
+ }
+
+ protected virtual bool SupportsFocus
+ {
+ get { return true; }
+ }
+
+ protected void Add (ViewContainer<T> view) {
+ _views.Add (view.ContainerLayout);
+ _picker.Items.Add(view.TitleLabel.Text);
+ }
+ }
+} \ No newline at end of file