Browse Source

Make SelectionMode flags.

So you can combine behaviours.
pull/278/head
Steven Kirk 11 years ago
parent
commit
271f47fb5b
  1. 2
      src/Perspex.Controls/Deck.cs
  2. 13
      src/Perspex.Controls/Primitives/SelectingItemsControl.cs
  3. 2
      src/Perspex.Controls/Primitives/TabStrip.cs
  4. 22
      src/Perspex.Controls/SelectionMode.cs
  5. 2
      src/Perspex.Controls/TabControl.cs
  6. 2
      tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests_AutoSelect.cs

2
src/Perspex.Controls/Deck.cs

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

13
src/Perspex.Controls/Primitives/SelectingItemsControl.cs

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

2
src/Perspex.Controls/Primitives/TabStrip.cs

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

22
src/Perspex.Controls/SelectionMode.cs

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

2
src/Perspex.Controls/TabControl.cs

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

2
tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests_AutoSelect.cs

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

Loading…
Cancel
Save