[Adium-devl] [PATCH] CL filtering expanding fix (want review)

Colin Barrett timber at lava.net
Fri Apr 24 23:06:51 UTC 2009


Zac reviewed this via IM, I pushed it earlier today.

http://hg.adiumx.com/adium/rev/7c54b52a482a

-Colin

On Apr 24, 2009, at 12:52 AM, Colin Barrett wrote:

> I've been seeing a number of problems with CL filtering causing  
> groups to expand and contract. I have what I think is a pretty good  
> patch to fix this issue. Quoting patch's commit message:
>
>> Fix many problems with the contact list filtering not properly  
>> restoring group expanding, and not properly expanding groups.
>>
>> Instead of trying to twiddle the view proxies directly, we set a  
>> special display property on each expanded group's model object. The  
>> list controller checks this property when deciding if an item is  
>> expanded or not.
>
> I have another patch that fixes this in a way more similar to the  
> old method of poking the state of the model objects directly (but  
> this time saving things properly by stashing the old values in,  
> again, display properties), but this way seems cleaner to me:  
> expanding during filtering is a temporary view expansion and  
> shouldn't actually change the state of the object. Additionally,  
> actually flipping the model object's state means that if we crash  
> during a filtering operation, there's a chance user's groups will  
> all be expanded when she starts up next.
>
> What do others think of this? I've copy pasted the patch below, and  
> attached a bundle. Personally, I'm a little wary of [contactListView  
> reloadData], it seems too straightforwad for Adium code ;)
>
> Suggestions welcome!
>
> <expandfix.hgbundle>
>
> =====================================================================
>
> diff --git a/Frameworks/Adium Framework/Source/ 
> AIAbstractListController.m b/Frameworks/Adium Framework/Source/ 
> AIAbstractListController.m
> --- a/Frameworks/Adium Framework/Source/AIAbstractListController.m	
> +++ b/Frameworks/Adium Framework/Source/AIAbstractListController.m	
> @@ -673,7 +673,7 @@
>  //
>  - (BOOL)outlineView:(NSOutlineView *)outlineView expandStateOfItem: 
> (AIProxyListObject *)item
>  {
> -    return !item || ((id<AIContainingObject>) 
> (item.listObject)).expanded;
> +    return !item || ((id<AIContainingObject>) 
> (item.listObject)).expanded || [item.listObject  
> boolValueForProperty:@"ExpandedByFiltering"];
>  }
>
>  /*!
> diff --git a/Source/AIListWindowController.m b/Source/ 
> AIListWindowController.m
> --- a/Source/AIListWindowController.m
> +++ b/Source/AIListWindowController.m
> @@ -1666,54 +1666,34 @@
>  		return;
>  	
>  	if (!filterBarExpandedGroups && ![[sender stringValue]  
> isEqualToString:@""]) {
> -		// Temporarily expand all groups when performing a search.
> -		NSMutableArray *groupsToExpand = [NSMutableArray array];
> -		NSUInteger rows = [contactListView numberOfRows];
> -		for (int i = 0; i < rows; i++) {
> -			AIProxyListObject *proxyObject = [contactListView itemAtRow:i];
> -			if ([proxyObject isKindOfClass:[AIListGroup class]] &&  
> ((AIListGroup *)proxyObject).expanded == NO)
> -				[groupsToExpand addObject:proxyObject];
> -		}
> -		
> -		if (groupsToExpand.count) {
> -			for (AIProxyListObject *proxyObject in groupsToExpand) {
> -				// Force the listgroup to save its expanded status
> -				AIListGroup *proxiedObject = (AIListGroup *)proxyObject;
> -				
> -				[proxiedObject setPreference:[NSNumber  
> numberWithBool:proxiedObject.expanded]
> -									  forKey:@"IsExpanded"
> -									   group:@"Contact List"];
> -				
> -				// Set the group as expanded
> -				[contactListView expandItem:proxyObject];
> -			}			
> -		}
> -		
> -		filterBarExpandedGroups = YES;
> -		
> -	} else if (filterBarExpandedGroups && [[sender stringValue]  
> isEqualToString:@""]) {
> -		// Restore saved expansion status when returning to no search.
> -		
> -		// Temporarily expand all groups when performing a search.
> -		NSMutableArray *groupsToCollapse = [NSMutableArray array];
> -		NSUInteger rows = [contactListView numberOfRows];
> -		for (int i = 0; i < rows; i++) {
> -			AIProxyListObject *proxyObject = [contactListView itemAtRow:i];
> -			
> -			if ([proxyObject isKindOfClass:[AIListGroup class]] &&
> -				![[(AIListGroup *)proxyObject preferenceForKey:@"IsExpanded"  
> group:@"Contact List"] boolValue]) {
> -				[groupsToCollapse addObject:proxyObject];
> -			}
> -		}
> -		
> -		if (groupsToCollapse.count) {
> -			for (AIProxyListObject *proxyObject in groupsToCollapse) {
> -				[contactListView collapseItem:proxyObject];
> -			}			
> -		}
> -		
> -		filterBarExpandedGroups = NO;
> -	}
> +        BOOL modified = NO;
> +        for (AIListObject *listObject in [self.contactList  
> containedObjects]) {
> +            if ([listObject isKindOfClass:[AIListGroup class]] &&  
> [(AIListGroup *)listObject isExpanded] == NO) {
> +                [listObject setValue:[NSNumber numberWithBool:YES]  
> forProperty:@"ExpandedByFiltering" notify:NotifyNever];
> +                modified = YES;
> +            }
> +        }
> +
> +        filterBarExpandedGroups = YES;
> +
> +        if (modified) {
> +            [contactListView reloadData];
> +        }
> +    } else if (filterBarExpandedGroups && [[sender stringValue]  
> isEqualToString:@""]) {
> +        BOOL modified = NO;
> +        for (AIListObject *listObject in [self.contactList  
> containedObjects]) {
> +            if ([listObject isKindOfClass:[AIListGroup class]] &&  
> [listObject boolValueForProperty:@"ExpandedByFiltering"]) {
> +                [listObject setValue:[NSNumber numberWithBool:NO]  
> forProperty:@"ExpandedByFiltering" notify:NotifyNever];
> +                modified = YES;
> +            }
> +        }
> +
> +        filterBarExpandedGroups = NO;
> +
> +        if (modified) {
> +            [contactListView reloadData];
> +        }
> +    }
>  	
>  	if ([[AIContactHidingController sharedController] filterContacts: 
> [sender stringValue]]) {
>  		// Select the first contact; we're guaranteed at least one  
> visible contact.
>
> _______________________________________________
> Adium-devl mailing list
> Adium-devl at adiumx.com
> http://adiumx.com/mailman/listinfo/adium-devl_adiumx.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://adium.im/pipermail/devel_adium.im/attachments/20090424/09e967ce/attachment-0001.html>


More information about the devel mailing list