Browse Source

Make SelectionMode flags.

So you can combine behaviours.
Steven Kirk 10 years ago
parent
commit
271f47fb5b

+ 1 - 1
src/Perspex.Controls/Deck.cs

@@ -31,7 +31,7 @@ namespace Perspex.Controls
         /// </summary>
         static Deck()
         {
-            SelectionModeProperty.OverrideDefaultValue<Deck>(SelectionMode.SingleAlways);
+            SelectionModeProperty.OverrideDefaultValue<Deck>(SelectionMode.AlwaysSelected);
             ItemsPanelProperty.OverrideDefaultValue<Deck>(PanelTemplate);
         }
 

+ 9 - 4
src/Perspex.Controls/Primitives/SelectingItemsControl.cs

@@ -173,6 +173,11 @@ namespace Perspex.Controls.Primitives
             set { SetValue(SelectionModeProperty, value); }
         }
 
+        /// <summary>
+        /// Gets a value indicating whether <see cref="SelectionMode.AlwaysSelected"/> is set.
+        /// </summary>
+        protected bool AlwaysSelected => (SelectionMode & SelectionMode.AlwaysSelected) != 0;
+
         /// <inheritdoc/>
         protected override void ItemsChanged(PerspexPropertyChangedEventArgs e)
         {
@@ -182,7 +187,7 @@ namespace Perspex.Controls.Primitives
             {
                 SelectedIndex = IndexOf((IEnumerable)e.NewValue, SelectedItem);
             }
-            else if (SelectionMode == SelectionMode.SingleAlways && Items != null & Items.Cast<object>().Any())
+            else if (AlwaysSelected && Items != null & Items.Cast<object>().Any())
             {
                 SelectedIndex = 0;
             }
@@ -196,7 +201,7 @@ namespace Perspex.Controls.Primitives
             switch (e.Action)
             {
                 case NotifyCollectionChangedAction.Add:
-                    if (SelectionMode == SelectionMode.SingleAlways && SelectedIndex == -1)
+                    if (AlwaysSelected && SelectedIndex == -1)
                     {
                         SelectedIndex = 0;
                     }
@@ -210,7 +215,7 @@ namespace Perspex.Controls.Primitives
                     if (selectedIndex >= e.OldStartingIndex &&
                         selectedIndex < e.OldStartingIndex + e.OldItems.Count)
                     {
-                        if (SelectionMode != SelectionMode.SingleAlways)
+                        if (!AlwaysSelected)
                         {
                             SelectedIndex = -1;
                         }
@@ -411,7 +416,7 @@ namespace Perspex.Controls.Primitives
         {
             var items = Items?.Cast<object>();
 
-            if (items != null && SelectionMode == SelectionMode.SingleAlways)
+            if (items != null && AlwaysSelected)
             {
                 var index = Math.Min(SelectedIndex, items.Count() - 1);
 

+ 1 - 1
src/Perspex.Controls/Primitives/TabStrip.cs

@@ -15,7 +15,7 @@ namespace Perspex.Controls.Primitives
 
         static TabStrip()
         {
-            SelectionModeProperty.OverrideDefaultValue<TabStrip>(SelectionMode.SingleAlways);
+            SelectionModeProperty.OverrideDefaultValue<TabStrip>(SelectionMode.AlwaysSelected);
             FocusableProperty.OverrideDefaultValue(typeof(TabStrip), false);
         }
 

+ 11 - 11
src/Perspex.Controls/SelectionMode.cs

@@ -1,34 +1,34 @@
 // Copyright (c) The Perspex Project. All rights reserved.
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
+using System;
+
 namespace Perspex.Controls
 {
     /// <summary>
     /// Defines the selection mode for a control which can select multiple items.
     /// </summary>
+    [Flags]
     public enum SelectionMode
     {
         /// <summary>
-        /// One item can be selected at a time.
+        /// One item can be selected.
         /// </summary>
-        Single,
+        Single = 0x00,
 
         /// <summary>
-        /// One item can be selected at a time, and there will always be a selected item as long
-        /// as there are items to select.
+        /// Multiple items can be selected.
         /// </summary>
-        SingleAlways,
+        Multiple = 0x01,
 
         /// <summary>
-        /// Multiple items can be selected and their selection state is toggled by presses or by 
-        /// pressing the spacebar.
+        /// Item selection can be toggled by tapping/spacebar.
         /// </summary>
-        MultipleToggle,
+        Toggle = 0x02,
 
         /// <summary>
-        /// A range of items can be selected by holding the shift key, and individual items can be
-        /// selected by holding the ctrl key.
+        /// An item will always be selected as long as there are items to select.
         /// </summary>
-        MultipleRange,
+        AlwaysSelected = 0x04,
     }
 }

+ 1 - 1
src/Perspex.Controls/TabControl.cs

@@ -33,7 +33,7 @@ namespace Perspex.Controls
         /// </summary>
         static TabControl()
         {
-            SelectionModeProperty.OverrideDefaultValue<TabControl>(SelectionMode.SingleAlways);
+            SelectionModeProperty.OverrideDefaultValue<TabControl>(SelectionMode.AlwaysSelected);
             FocusableProperty.OverrideDefaultValue<TabControl>(false);
             SelectedIndexProperty.Changed.AddClassHandler<TabControl>(x => x.SelectedIndexChanged);
         }

+ 1 - 1
tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests_AutoSelect.cs

@@ -97,7 +97,7 @@ namespace Perspex.Controls.UnitTests.Primitives
         {
             static TestSelector()
             {
-                SelectionModeProperty.OverrideDefaultValue<TestSelector>(SelectionMode.SingleAlways);
+                SelectionModeProperty.OverrideDefaultValue<TestSelector>(SelectionMode.AlwaysSelected);
             }
         }