mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-16 13:31:18 +00:00
Change CPTheme implementation to fix how searching for a matching theme works
This commit is contained in:
1 parent
f8ef6ab397
commit
5309cc5916
1 file changed
+40
-18
+40
-18
@@ -333,6 +333,7 @@ function ThemeState(stateNames)
|
||||
var stateNameLength = stateNameKeys.length;
|
||||
for (var stateIndex = 1; stateIndex < stateNameLength; stateIndex++)
|
||||
this._stateNameString = this._stateNameString + "+" + stateNameKeys[stateIndex];
|
||||
this._stateNameCount = stateNameLength;
|
||||
}
|
||||
|
||||
ThemeState.prototype.toString = function()
|
||||
@@ -355,6 +356,21 @@ ThemeState.prototype.hasThemeState = function(aState)
|
||||
return true;
|
||||
}
|
||||
|
||||
ThemeState.prototype.isSubsetOf = function(aState)
|
||||
{
|
||||
if (aState._stateNameCount < this._stateNameCount)
|
||||
return false;
|
||||
|
||||
for (key in this._stateNames)
|
||||
{
|
||||
if (!this._stateNames.hasOwnProperty(key))
|
||||
continue;
|
||||
if (!aState._stateNames[key])
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
var CPThemeStates = {};
|
||||
|
||||
/*
|
||||
@@ -370,6 +386,13 @@ function CPThemeState()
|
||||
if (arguments.length < 1)
|
||||
throw "CPThemeState() must be called with at least one string argument";
|
||||
|
||||
if (arguments.length === 1 && typeof arguments[0] === 'string')
|
||||
{
|
||||
var themeState = CPThemeStates[arguments[0]];
|
||||
if (themeState !== undefined)
|
||||
return themeState;
|
||||
}
|
||||
|
||||
var stateNames = {};
|
||||
for (var argIndex = 0; argIndex < arguments.length; argIndex++)
|
||||
{
|
||||
@@ -532,17 +555,10 @@ CPThemeStateKeyWindow = CPThemeState("keyWindow");
|
||||
{
|
||||
_cache = { };
|
||||
|
||||
var componentStates = aState._stateNames;
|
||||
for (var state in componentStates)
|
||||
{
|
||||
if (componentStates.hasOwnProperty(state))
|
||||
{
|
||||
if ((aValue === undefined) || (aValue === nil))
|
||||
[_values removeObjectForKey:state];
|
||||
else
|
||||
[_values setObject:aValue forKey:state];
|
||||
}
|
||||
}
|
||||
if ((aValue === undefined) || (aValue === nil))
|
||||
[_values removeObjectForKey:String(aState)];
|
||||
else
|
||||
[_values setObject:aValue forKey:String(aState)];
|
||||
}
|
||||
|
||||
- (id)value
|
||||
@@ -565,14 +581,20 @@ CPThemeStateKeyWindow = CPThemeState("keyWindow");
|
||||
// If we don't have a value, and we have a non-normal state...
|
||||
if ((value === undefined || value === nil) && aState !== CPThemeStateNormal)
|
||||
{
|
||||
for (var state in aState._stateNames)
|
||||
{
|
||||
if (!aState._stateNames.hasOwnProperty(state))
|
||||
continue;
|
||||
// If this is a composite state, find the closest partial subset match.
|
||||
var states = [_values allKeys],
|
||||
count = states.length,
|
||||
largestThemeState = 0;
|
||||
|
||||
value = [_values objectForKey:state];
|
||||
if (value !== undefined && value !== nil)
|
||||
break;
|
||||
while (count--)
|
||||
{
|
||||
var stateObject = CPThemeState(states[count]);
|
||||
|
||||
if (stateObject.isSubsetOf(aState) && stateObject._stateNameCount > largestThemeState)
|
||||
{
|
||||
value = [_values objectForKey:String(states[count])];
|
||||
largestThemeState = stateObject._stateNameCount;
|
||||
}
|
||||
}
|
||||
|
||||
// Still don't have a value? OK, let's use the normal value.
|
||||
|
||||
Reference in new issue
Block a user