Browse Source

Added a DeckPresenter.

Which displays only the active card.
pull/58/head
Steven Kirk 11 years ago
parent
commit
08da454529
  1. 1
      Perspex.Controls/Perspex.Controls.csproj
  2. 128
      Perspex.Controls/Presenters/DeckPresenter.cs
  3. 9
      Perspex.Controls/Presenters/ItemsPresenter.cs
  4. 2
      Perspex.Diagnostics/DevTools.cs
  5. 17
      Perspex.Themes.Default/DeckStyle.cs

1
Perspex.Controls/Perspex.Controls.csproj

@ -48,6 +48,7 @@
<Compile Include="Popup.cs" />
<Compile Include="IDataTemplate.cs" />
<Compile Include="Presenters\IPresenter.cs" />
<Compile Include="Presenters\DeckPresenter.cs" />
<Compile Include="Primitives\AdornerDecorator.cs" />
<Compile Include="Primitives\AdornerLayer.cs" />
<Compile Include="RadioButton.cs" />

128
Perspex.Controls/Presenters/DeckPresenter.cs

@ -0,0 +1,128 @@
// -----------------------------------------------------------------------
// <copyright file="DeckPresenter.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
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<IEnumerable> ItemsProperty =
ItemsControl.ItemsProperty.AddOwner<DeckPresenter>();
public static readonly PerspexProperty<ItemsPanelTemplate> ItemsPanelProperty =
ItemsControl.ItemsPanelProperty.AddOwner<DeckPresenter>();
public static readonly PerspexProperty<object> SelectedItemProperty =
SelectingItemsControl.SelectedItemProperty.AddOwner<DeckPresenter>();
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<object, object>(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<object, object> 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 }));
}
}
}
}
}

9
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);

2
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 },
},
}),

17
Perspex.Themes.Default/DeckStyle.cs

@ -24,30 +24,17 @@ namespace Perspex.Themes.Default
new Setter(Deck.TemplateProperty, ControlTemplate.Create<Deck>(this.Template)),
},
},
new Style(x => x.OfType<Deck>().Descendent().Is<DeckItem>())
{
Setters = new[]
{
new Setter(Control.IsVisibleProperty, false),
},
},
new Style(x => x.OfType<Deck>().Descendent().Is<DeckItem>().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],
};
}
}

Loading…
Cancel
Save