Browse Source

All tests so far pass!

pull/4/head
Steven Kirk 13 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) 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 bool stopTraversal;
private Func<IStyleable, IObservable<bool>> observable;
public Selector() public Selector()
{ {
this.GetObservable = _ => Observable.Return(true);
} }
public Selector(Selector previous, bool stopTraversal = false) public Selector(Selector previous, bool stopTraversal = false)
: this()
{ {
this.Previous = previous; this.Previous = previous;
this.InTemplate = previous != null ? previous.InTemplate : false;
this.stopTraversal = stopTraversal; this.stopTraversal = stopTraversal;
} }
public Func<IStyleable, IObservable<bool>> Observable public bool InTemplate
{ {
get get;
{ set;
return this.observable; }
}
public Func<IStyleable, IObservable<bool>> GetObservable
set {
{ get;
this.observable = value; set;
}
} }
public Selector Previous public Selector Previous
@ -66,9 +66,14 @@ namespace Perspex.Styling
while (selector != null) 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(); selector = selector.MovePrevious();

21
Perspex/Styling/Selectors.cs

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

Loading…
Cancel
Save