From 08da454529a0f8c2f971cf2a64635c66920b8bfb Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 4 May 2015 16:52:07 +0200 Subject: [PATCH] Added a DeckPresenter. Which displays only the active card. --- Perspex.Controls/Perspex.Controls.csproj | 1 + Perspex.Controls/Presenters/DeckPresenter.cs | 128 ++++++++++++++++++ Perspex.Controls/Presenters/ItemsPresenter.cs | 9 +- Perspex.Diagnostics/DevTools.cs | 2 +- Perspex.Themes.Default/DeckStyle.cs | 17 +-- 5 files changed, 135 insertions(+), 22 deletions(-) create mode 100644 Perspex.Controls/Presenters/DeckPresenter.cs diff --git a/Perspex.Controls/Perspex.Controls.csproj b/Perspex.Controls/Perspex.Controls.csproj index a21f9cc112..3551d7aa15 100644 --- a/Perspex.Controls/Perspex.Controls.csproj +++ b/Perspex.Controls/Perspex.Controls.csproj @@ -48,6 +48,7 @@ + diff --git a/Perspex.Controls/Presenters/DeckPresenter.cs b/Perspex.Controls/Presenters/DeckPresenter.cs new file mode 100644 index 0000000000..c3fbe01544 --- /dev/null +++ b/Perspex.Controls/Presenters/DeckPresenter.cs @@ -0,0 +1,128 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2015 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls.Presenters +{ + using Perspex.Controls.Generators; + using Perspex.Controls.Primitives; + using Perspex.Input; + using Perspex.Styling; + using System; + using System.Collections; + using System.Collections.Specialized; + using System.Reactive.Linq; + + public class DeckPresenter : Control, IVisual, IPresenter, ITemplatedControl + { + public static readonly PerspexProperty ItemsProperty = + ItemsControl.ItemsProperty.AddOwner(); + + public static readonly PerspexProperty ItemsPanelProperty = + ItemsControl.ItemsPanelProperty.AddOwner(); + + public static readonly PerspexProperty SelectedItemProperty = + SelectingItemsControl.SelectedItemProperty.AddOwner(); + + private bool createdPanel; + + public DeckPresenter() + { + this.GetObservableWithHistory(SelectedItemProperty).Subscribe(this.SelectedItemChanged); + } + + public ItemContainerGenerator ItemContainerGenerator + { + get; + private set; + } + + public IEnumerable Items + { + get { return this.GetValue(ItemsProperty); } + set { this.SetValue(ItemsProperty, value); } + } + + public ItemsPanelTemplate ItemsPanel + { + get { return this.GetValue(ItemsPanelProperty); } + set { this.SetValue(ItemsPanelProperty, value); } + } + + public object SelectedItem + { + get { return this.GetValue(SelectedItemProperty); } + set { this.SetValue(SelectedItemProperty, value); } + } + + public Panel Panel + { + get; + private set; + } + + public override sealed void ApplyTemplate() + { + if (!this.createdPanel) + { + this.CreatePanel(); + } + } + + protected override Size MeasureOverride(Size availableSize) + { + this.Panel.Measure(availableSize); + return this.Panel.DesiredSize.Value; + } + + protected override Size ArrangeOverride(Size finalSize) + { + this.Panel.Arrange(new Rect(finalSize)); + return finalSize; + } + + private void CreatePanel() + { + this.ClearVisualChildren(); + this.Panel = this.ItemsPanel.Build(); + this.Panel.TemplatedParent = this; + KeyboardNavigation.SetTabNavigation(this.Panel, KeyboardNavigationMode.Once); + ((IItemsPanel)this.Panel).ChildLogicalParent = this.TemplatedParent as ILogical; + this.AddVisualChild(this.Panel); + this.createdPanel = true; + this.SelectedItemChanged(Tuple.Create(null, this.SelectedItem)); + } + + private IItemContainerGenerator GetGenerator() + { + if (this.ItemContainerGenerator == null) + { + ItemsControl i = this.TemplatedParent as ItemsControl; + this.ItemContainerGenerator = i?.ItemContainerGenerator ?? new ItemContainerGenerator(this); + } + + return this.ItemContainerGenerator; + } + + private void SelectedItemChanged(Tuple value) + { + if (this.createdPanel) + { + var generator = this.GetGenerator(); + + if (value.Item1 != null) + { + generator.RemoveAll(); + this.Panel.Children.Clear(); + } + + if (value.Item2 != null) + { + this.Panel.Children.AddRange(generator.Generate(new[] { value.Item2 })); + } + } + } + } +} diff --git a/Perspex.Controls/Presenters/ItemsPresenter.cs b/Perspex.Controls/Presenters/ItemsPresenter.cs index 7e09b5f8e5..2730546c96 100644 --- a/Perspex.Controls/Presenters/ItemsPresenter.cs +++ b/Perspex.Controls/Presenters/ItemsPresenter.cs @@ -6,14 +6,13 @@ namespace Perspex.Controls.Presenters { + using Perspex.Controls.Generators; + using Perspex.Input; + using Perspex.Styling; using System; using System.Collections; using System.Collections.Specialized; using System.Reactive.Linq; - using Perspex.Controls.Generators; - using Perspex.Input; - using Perspex.Styling; - using Perspex.Controls.Templates; public class ItemsPresenter : Control, IVisual, IPresenter, ITemplatedControl { @@ -25,8 +24,6 @@ namespace Perspex.Controls.Presenters private bool createdPanel; - private DataTemplate memberSelectorTemplate; - public ItemsPresenter() { this.GetObservableWithHistory(ItemsProperty).Subscribe(this.ItemsChanged); diff --git a/Perspex.Diagnostics/DevTools.cs b/Perspex.Diagnostics/DevTools.cs index df76a45e54..4149b84ce2 100644 --- a/Perspex.Diagnostics/DevTools.cs +++ b/Perspex.Diagnostics/DevTools.cs @@ -152,7 +152,7 @@ namespace Perspex.Diagnostics Children = new Controls { new TextBlock { Text = x.Name }, - new TextBlock { [!TextBlock.TextProperty] = x.WhenAnyValue(v => v.Value).Select(v => v.ToString()) }, + new TextBlock { [!TextBlock.TextProperty] = x.WhenAnyValue(v => v.Value).Select(v => v?.ToString()) }, new TextBlock { Text = x.Priority }, }, }), diff --git a/Perspex.Themes.Default/DeckStyle.cs b/Perspex.Themes.Default/DeckStyle.cs index 07494599e3..b932aeb72f 100644 --- a/Perspex.Themes.Default/DeckStyle.cs +++ b/Perspex.Themes.Default/DeckStyle.cs @@ -24,30 +24,17 @@ namespace Perspex.Themes.Default new Setter(Deck.TemplateProperty, ControlTemplate.Create(this.Template)), }, }, - new Style(x => x.OfType().Descendent().Is()) - { - Setters = new[] - { - new Setter(Control.IsVisibleProperty, false), - }, - }, - new Style(x => x.OfType().Descendent().Is().Class(":selected")) - { - Setters = new[] - { - new Setter(Control.IsVisibleProperty, true), - }, - } }); } private Control Template(Deck control) { - return new ItemsPresenter + return new DeckPresenter { Id = "itemsPresenter", [~ItemsPresenter.ItemsProperty] = control[~Deck.ItemsProperty], [~ItemsPresenter.ItemsPanelProperty] = control[~Deck.ItemsPanelProperty], + [~DeckPresenter.SelectedItemProperty] = control[~Deck.SelectedItemProperty], }; } }