Browse Source

All tests so far pass!

pull/4/head
Steven Kirk 12 years ago
parent
commit
5136c2f20a
  1. 2
      Perspex.UnitTests/Styling/TestSelectors.cs
  2. 33
      Perspex/Styling/Selector.cs
  3. 21
      Perspex/Styling/Selectors.cs

2
Perspex.UnitTests/Styling/TestSelectors.cs

@ -14,7 +14,7 @@ namespace Perspex.UnitTests.Styling
{
return new Selector(selector)
{
Observable = control => ((TestControlBase)control).SubscribeCheckObservable,
GetObservable = control => ((TestControlBase)control).SubscribeCheckObservable,
};
}
}

33
Perspex/Styling/Selector.cs

@ -17,29 +17,29 @@ namespace Perspex.Styling
{
private bool stopTraversal;
private Func<IStyleable, IObservable<bool>> observable;
public Selector()
{
this.GetObservable = _ => Observable.Return(true);
}
public Selector(Selector previous, bool stopTraversal = false)
: this()
{
this.Previous = previous;
this.InTemplate = previous != null ? previous.InTemplate : false;
this.stopTraversal = stopTraversal;
}
public Func<IStyleable, IObservable<bool>> Observable
public bool InTemplate
{
get
{
return this.observable;
}
set
{
this.observable = value;
}
get;
set;
}
public Func<IStyleable, IObservable<bool>> GetObservable
{
get;
set;
}
public Selector Previous
@ -66,9 +66,14 @@ namespace Perspex.Styling
while (selector != null)
{
if (selector.Observable != null)
if ((selector.InTemplate && control.TemplatedParent == null) ||
(!selector.InTemplate && control.TemplatedParent != null))
{
inputs.Add(Observable.Return(false));
}
else
{
inputs.Add(selector.Observable(control));
inputs.Add(selector.GetObservable(control));
}
selector = selector.MovePrevious();

21
Perspex/Styling/Selectors.cs

@ -20,7 +20,7 @@ namespace Perspex.Styling
return new Selector(previous)
{
Observable = control => Observable
GetObservable = control => Observable
.Return(control.Classes.Contains(name))
.Concat(control.Classes.Changed.Select(e => control.Classes.Contains(name))),
SelectorString = (name[0] == ':') ? name : '.' + name,
@ -32,7 +32,7 @@ namespace Perspex.Styling
return new Selector(previous, stopTraversal: true)
{
SelectorString = " ",
Observable = control =>
GetObservable = control =>
{
ILogical c = (ILogical)control;
List<IObservable<bool>> descendentMatches = new List<IObservable<bool>>();
@ -43,7 +43,7 @@ namespace Perspex.Styling
if (c is IStyleable)
{
descendentMatches.Add(previous.Observable((IStyleable)c));
descendentMatches.Add(previous.GetObservable((IStyleable)c));
}
}
@ -58,7 +58,7 @@ namespace Perspex.Styling
return new Selector(previous)
{
Observable = control => Observable.Return(control.Id == id),
GetObservable = control => Observable.Return(control.Id == id),
SelectorString = '#' + id,
};
}
@ -69,7 +69,7 @@ namespace Perspex.Styling
return new Selector(previous)
{
Observable = control => Observable.Return(control is T),
GetObservable = control => Observable.Return(control is T),
SelectorString = typeof(T).Name,
};
}
@ -78,9 +78,16 @@ namespace Perspex.Styling
{
Contract.Requires<ArgumentNullException>(previous != null);
return new Selector(previous)
return new Selector(previous, stopTraversal: true)
{
Observable = control => Observable.Return(control.TemplatedParent != null),
GetObservable = control =>
{
IStyleable templatedParent = control.TemplatedParent as IStyleable;
return templatedParent != null ?
previous.GetObservable(templatedParent) :
Observable.Return(true);
},
InTemplate = true,
SelectorString = " $ ",
};
}

Loading…
Cancel
Save