Skip to content

Commit

Permalink
Show checkmark next to favorites menu when in a room thats a favorite
Browse files Browse the repository at this point in the history
git-svn-id: http://source.colloquy.info/svn/trunk@5428 cc480944-b4dd-0310-b5e3-89908df9b951
  • Loading branch information
zach committed Mar 14, 2012
1 parent b0e0172 commit a25a827
Showing 1 changed file with 45 additions and 20 deletions.
65 changes: 45 additions & 20 deletions Controllers/MVConnectionsController.m
Expand Up @@ -53,6 +53,9 @@ + (MVConnectionsController *) defaultController {
sharedInstance = [sharedInstance initWithWindowNibName:nil];
}

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_refreshFavoritesMenu) name:MVChatRoomJoinedNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_refreshFavoritesMenu) name:MVChatRoomPartedNotification object:nil];

return sharedInstance;
}

Expand All @@ -62,40 +65,56 @@ + (NSMenu *) favoritesMenu {
}

+ (void) refreshFavoritesMenu {
if( ! favoritesMenu ) favoritesMenu = [[NSMenu alloc] initWithTitle:@""];

[favoritesMenu removeAllItems];
for( NSMenuItem *menuItem in [[[favoritesMenu itemArray] copy] autorelease] )
[favoritesMenu removeItem:menuItem];

;
NSMutableArray *rooms = [NSMutableArray array], *roomNames = [NSMutableArray array];
if( ! favoritesMenu )
favoritesMenu = [[NSMenu alloc] initWithTitle:@""];
else [favoritesMenu removeAllItems];

NSString *path = [@"~/Library/Application Support/Colloquy/Favorites/Favorites.plist" stringByExpandingTildeInPath];
NSArray *favorites = [NSArray arrayWithContentsOfFile:path];
for( NSDictionary *item in favorites ) {
[rooms addObject:[NSURL URLWithString:[NSString stringWithFormat:@"%@://%@/%@", [item objectForKey:@"scheme"], [item objectForKey:@"server"], [item objectForKey:@"target"]]]];
[roomNames addObject:[NSString stringWithFormat:@"%@ (%@)", [item objectForKey:@"target"], [item objectForKey:@"server"]]];
}

NSMenuItem *menuItem = nil;
if( ! [rooms count] ) {
if( ! [favorites count] ) {
menuItem = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"No Favorites", "no favorites menu title" ) action:NULL keyEquivalent:@""] autorelease];
[favoritesMenu addItem:menuItem];
}

NSEnumerator *nameEnumerator = [roomNames objectEnumerator];
NSImage *icon = [[[NSImage imageNamed:@"room"] copy] autorelease];
[icon setScalesWhenResized:YES];
[icon setSize:NSMakeSize( 16., 16. )];
NSEnumerator *enumerator = [rooms objectEnumerator];
NSString *item = nil;
NSURL *url = nil;
while( ( url = [enumerator nextObject] ) && ( item = [nameEnumerator nextObject] ) ) {
menuItem = [[[NSMenuItem alloc] initWithTitle:item action:@selector( _connectToFavorite: ) keyEquivalent:@""] autorelease];

for( NSDictionary *item in favorites ) {
NSString *scheme = [item objectForKey:@"scheme"];
NSString *server = [item objectForKey:@"server"];
NSString *target = [item objectForKey:@"target"];

menuItem = [[[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@"%@ (%@)", target, server] action:@selector( _connectToFavorite: ) keyEquivalent:@""] autorelease];
[menuItem setImage:icon];
[menuItem setTarget:self];
[menuItem setRepresentedObject:url];
[menuItem setRepresentedObject:[NSURL URLWithString:[NSString stringWithFormat:@"%@://%@/%@", [item objectForKey:@"scheme"], [item objectForKey:@"server"], [item objectForKey:@"target"]]]];

for (MVChatConnection *connection in [[MVConnectionsController defaultController] connections]) {
if (!(connection.isConnected || connection.status == MVChatConnectionConnectingStatus))
continue;

if (![connection.urlScheme isEqualToString:scheme])
continue;

if (![connection.server isEqualToString:server])
continue;

for (MVChatRoom *room in connection.joinedChatRooms) {
if (![room.name isEqualToString:target])
continue;

menuItem.state = NSOnState;

break;
}

if (menuItem.state == NSOnState)
break;
}

[favoritesMenu addItem:menuItem];
}

Expand All @@ -107,6 +126,12 @@ + (void) refreshFavoritesMenu {
[favoritesMenu addItem:menuItem];
}

+ (void) _refreshFavoritesMenu {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(refreshFavoritesMenu) object:nil];

[self performSelector:@selector(refreshFavoritesMenu) withObject:nil afterDelay:.0];
}

#pragma mark -

- (MVChatConnectionType) newTypeToConnectionType {
Expand Down

0 comments on commit a25a827

Please sign in to comment.