Browse Source

WIP

pull/4/head
Steven Kirk 12 years ago
parent
commit
ced25df067
  1. 5
      Perspex.Controls/ColumnDefinition.cs
  2. 24
      Perspex.Controls/Control.cs
  3. 2
      Perspex.Controls/ItemsControl.cs
  4. 2
      Perspex.Controls/ItemsPresenter.cs
  5. 35
      Perspex.Controls/Panel.cs
  6. 2
      Perspex.Controls/TabStrip.cs
  7. 8
      Perspex.Controls/TreeView.cs
  8. 47
      Perspex.Diagnostics/DevTools.cs
  9. 1
      Perspex.Diagnostics/Perspex.Diagnostics.csproj
  10. 54
      Perspex.Input/InputElement.cs
  11. 12
      Perspex.SceneGraph/Visual.cs
  12. 4
      Perspex.Windows/Perspex.Windows.csproj
  13. 17
      Perspex.Windows/Window.cs
  14. 29
      TestApplication/Program.cs

5
Perspex.Controls/ColumnDefinition.cs

@ -21,6 +21,11 @@ namespace Perspex.Controls
{
}
public ColumnDefinition(double value, GridUnitType type)
{
this.Width = new GridLength(value, type);
}
public ColumnDefinition(GridLength width)
{
this.Width = width;

24
Perspex.Controls/Control.cs

@ -203,13 +203,6 @@ namespace Perspex.Controls
protected virtual DataTemplate FindDataTemplate(object content)
{
Control control = content as Control;
if (control != null)
{
return new DataTemplate(x => control);
}
// TODO: This needs to traverse the logical tree, not the visual.
foreach (var i in this.GetVisualAncestors().OfType<Control>())
{
@ -238,9 +231,22 @@ namespace Perspex.Controls
return null;
}
protected DataTemplate GetDataTemplate(object content)
protected Control ApplyDataTemplate(object content)
{
return this.FindDataTemplate(content) ?? DataTemplate.Default;
DataTemplate result = this.FindDataTemplate(content);
if (result != null)
{
return result.Build(content);
}
else if (content is Control)
{
return (Control)content;
}
else
{
return DataTemplate.Default.Build(content);
}
}
}
}

2
Perspex.Controls/ItemsControl.cs

@ -90,7 +90,7 @@ namespace Perspex.Controls
protected virtual Control CreateItemControlOverride(object item)
{
return (item as Control) ?? this.GetDataTemplate(item).Build(item);
return this.ApplyDataTemplate(item);
}
private void ItemsChanged(Tuple<IEnumerable, IEnumerable> value)

2
Perspex.Controls/ItemsPresenter.cs

@ -68,7 +68,7 @@ namespace Perspex.Controls
}
else
{
return this.GetDataTemplate(item).Build(item) as Control;
return this.ApplyDataTemplate(item);
}
}

35
Perspex.Controls/Panel.cs

@ -7,7 +7,7 @@
namespace Perspex.Controls
{
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
/// <summary>
@ -24,6 +24,7 @@ namespace Perspex.Controls
if (this.children == null)
{
this.children = new Controls();
this.children.CollectionChanged += ChildrenChanged;
}
return this.children;
@ -35,11 +36,41 @@ namespace Perspex.Controls
if (this.children != value)
{
if (this.children != null)
{
this.children.CollectionChanged -= ChildrenChanged;
}
this.children = value;
this.ClearVisualChildren();
this.AddVisualChildren(value);
if (this.children != null)
{
this.children.CollectionChanged += ChildrenChanged;
this.AddVisualChildren(value);
}
}
}
}
private void ChildrenChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// TODO: Handle Move and Replace.
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
this.AddVisualChildren(e.NewItems.OfType<Visual>());
break;
case NotifyCollectionChangedAction.Remove:
this.RemoveVisualChildren(e.OldItems.OfType<Visual>());
break;
case NotifyCollectionChangedAction.Reset:
this.ClearVisualChildren();
this.AddVisualChildren(this.children);
break;
}
}
}
}

2
Perspex.Controls/TabStrip.cs

@ -36,7 +36,7 @@ namespace Perspex.Controls
{
result = new TabItem
{
Content = this.GetDataTemplate(item).Build(item),
Content = this.ApplyDataTemplate(item),
};
}

8
Perspex.Controls/TreeView.cs

@ -40,7 +40,13 @@ namespace Perspex.Controls
private TreeDataTemplate GetTreeDataTemplate(object item)
{
DataTemplate template = this.GetDataTemplate(item);
DataTemplate template = this.FindDataTemplate(item);
if (template == null)
{
template = DataTemplate.Default;
}
TreeDataTemplate treeTemplate = template as TreeDataTemplate;
if (treeTemplate == null)

47
Perspex.Diagnostics/DevTools.cs

@ -0,0 +1,47 @@
// -----------------------------------------------------------------------
// <copyright file="DevTools.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Diagnostics
{
using Perspex.Controls;
public class DevTools : Decorator
{
public static readonly PerspexProperty<Control> RootProperty =
PerspexProperty.Register<DevTools, Control>("Root");
public DevTools()
{
this.Content = new Grid
{
ColumnDefinitions = new ColumnDefinitions
{
new ColumnDefinition(1, GridUnitType.Star),
new ColumnDefinition(3, GridUnitType.Star),
},
Children = new Controls
{
new TreeView
{
DataTemplates = new DataTemplates
{
new TreeDataTemplate<IVisual>(
x => new TextBlock {Text = x.GetType().Name },
x => x.VisualChildren),
},
[TreeView.ItemsProperty] = this[DevTools.RootProperty],
}
}
};
}
public Control Root
{
get { return this.GetValue(RootProperty); }
set { this.SetValue(RootProperty, value); }
}
}
}

1
Perspex.Diagnostics/Perspex.Diagnostics.csproj

@ -65,6 +65,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="DevTools.cs" />
<Compile Include="Debug.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

54
Perspex.Input/InputElement.cs

@ -47,10 +47,14 @@ namespace Perspex.Input
public InputElement()
{
this.GotFocus += (s, e) => this.IsFocused = true;
this.LostFocus += (s, e) => this.IsFocused = false;
this.PointerEnter += (s, e) => this.IsPointerOver = true;
this.PointerLeave += (s, e) => this.IsPointerOver = false;
this.GotFocus += (_, e) => this.OnGotFocus(e);
this.LostFocus += (_, e) => this.OnLostFocus(e);
this.KeyDown += (_, e) => this.OnKeyDown(e);
this.PreviewKeyDown += (_, e) => this.OnPreviewKeyDown(e);
this.PointerEnter += (_, e) => this.OnPointerEnter(e);
this.PointerLeave += (_, e) => this.OnPointerLeave(e);
this.PointerPressed += (_, e) => this.OnPointerPressed(e);
this.PointerReleased += (_, e) => this.OnPointerReleased(e);
}
public event EventHandler<RoutedEventArgs> GotFocus
@ -71,6 +75,12 @@ namespace Perspex.Input
remove { this.RemoveHandler(KeyDownEvent, value); }
}
public event EventHandler<KeyEventArgs> PreviewKeyDown
{
add { this.AddHandler(PreviewKeyDownEvent, value); }
remove { this.RemoveHandler(PreviewKeyDownEvent, value); }
}
public event EventHandler<PointerEventArgs> PointerEnter
{
add { this.AddHandler(PointerEnterEvent, value); }
@ -117,5 +127,41 @@ namespace Perspex.Input
{
Locator.Current.GetService<IFocusManager>().Focus(this);
}
protected virtual void OnGotFocus(RoutedEventArgs e)
{
this.IsFocused = true;
}
protected virtual void OnLostFocus(RoutedEventArgs e)
{
this.IsFocused = false;
}
protected virtual void OnKeyDown(KeyEventArgs e)
{
}
protected virtual void OnPreviewKeyDown(KeyEventArgs e)
{
}
protected virtual void OnPointerEnter(PointerEventArgs e)
{
this.IsPointerOver = true;
}
protected virtual void OnPointerLeave(PointerEventArgs e)
{
this.IsPointerOver = false;
}
protected virtual void OnPointerPressed(PointerEventArgs e)
{
}
protected virtual void OnPointerReleased(PointerEventArgs e)
{
}
}
}

12
Perspex.SceneGraph/Visual.cs

@ -143,6 +143,18 @@ namespace Perspex
this.visualChildren.Remove(visual);
}
protected void RemoveVisualChildren(IEnumerable<Visual> visuals)
{
Contract.Requires<ArgumentNullException>(visuals != null);
this.EnsureVisualChildrenCreated();
foreach (var v in visuals)
{
this.visualChildren.Remove(v);
}
}
protected void SetVisualBounds(Rect bounds)
{
this.bounds = bounds;

4
Perspex.Windows/Perspex.Windows.csproj

@ -78,6 +78,10 @@
<Project>{d2221c82-4a25-4583-9b43-d791e3f6820c}</Project>
<Name>Perspex.Controls</Name>
</ProjectReference>
<ProjectReference Include="..\Perspex.Diagnostics\Perspex.Diagnostics.csproj">
<Project>{7062ae20-5dcc-4442-9645-8195bdece63e}</Project>
<Name>Perspex.Diagnostics</Name>
</ProjectReference>
<ProjectReference Include="..\Perspex.Input\Perspex.Input.csproj">
<Project>{62024b2d-53eb-4638-b26b-85eeaa54866e}</Project>
<Name>Perspex.Input</Name>

17
Perspex.Windows/Window.cs

@ -12,6 +12,7 @@ namespace Perspex.Windows
using System.Reactive.Linq;
using System.Runtime.InteropServices;
using Perspex.Controls;
using Perspex.Diagnostics;
using Perspex.Input;
using Perspex.Input.Raw;
using Perspex.Layout;
@ -114,6 +115,22 @@ namespace Perspex.Windows
UnmanagedMethods.ShowWindow(this.Handle, 4);
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
if (e.Key == Key.F12)
{
Window window = new Window
{
Content = new DevTools
{
Root = this,
},
};
window.Show();
}
}
private Control DefaultTemplate(Window c)
{
Border border = new Border();

29
TestApplication/Program.cs

@ -179,7 +179,6 @@ namespace TestApplication
new TabItem
{
Header = "Lists",
IsSelected = true,
Content = new StackPanel
{
Orientation = Orientation.Horizontal,
@ -218,22 +217,20 @@ namespace TestApplication
}
};
System.Console.Write(Perspex.Diagnostics.Debug.PrintVisualTree(window));
//var treeView = window.FindControl<TreeView>("treeView");
//var newTreeViewItemText = window.FindControl<TextBox>("newTreeViewItemText");
//var addTreeViewItem = window.FindControl<Button>("addTreeViewItem");
////var treeView = window.FindControl<TreeView>("treeView");
////var newTreeViewItemText = window.FindControl<TextBox>("newTreeViewItemText");
////var addTreeViewItem = window.FindControl<Button>("addTreeViewItem");
////addTreeViewItem.Click += (s, e) =>
////{
//// if (treeView.SelectedItem != null)
//// {
//// ((Node)treeView.SelectedItem).Children.Add(new Node
//// {
//// Name = newTreeViewItemText.Text,
//// });
//// }
////};
//addTreeViewItem.Click += (s, e) =>
//{
// if (treeView.SelectedItem != null)
// {
// ((Node)treeView.SelectedItem).Children.Add(new Node
// {
// Name = newTreeViewItemText.Text,
// });
// }
//};
window.Show();
Application.Current.Run(window);

Loading…
Cancel
Save