diff --git a/src/ChooseAccountVC.mm b/src/ChooseAccountVC.mm index 7441f1d90126684225ae554d10f39c51b3f6d3f5..1e3f335040d6981a80ab4358d1b5ebd7db9c95f8 100644 --- a/src/ChooseAccountVC.mm +++ b/src/ChooseAccountVC.mm @@ -60,6 +60,7 @@ Boolean menuIsOpen; Boolean menuNeedsUpdate; NSMenu* accountsMenu; NSMenuItem* selectedMenuItem; +NSMutableDictionary* menuItemsTags; -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil model:(lrc::api::NewAccountModel*) accMdl delegate:(id <ChooseAccountDelegate> )mainWindow { @@ -85,6 +86,7 @@ NSMenuItem* selectedMenuItem; [accountsMenu setDelegate:self]; accountSelectionButton.menu = accountsMenu; [accountSelectionButton setAutoenablesItems:NO]; + menuItemsTags = [[NSMutableDictionary alloc] init]; [self update]; QObject::connect(accMdl_, @@ -122,11 +124,12 @@ NSMenuItem* selectedMenuItem; QObject::connect(accMdl_, &lrc::api::NewAccountModel::accountStatusChanged, [self] (const std::string& accountID) { + [self updateMenuItemForAccount:accountID]; if([self selectedAccount].id == accountID) { - [self update]; - return; + // update account state + [self updatePhoto]; + [self setPopUpButtonSelection]; } - [self updateMenuItemForAccount:accountID]; }); } @@ -138,9 +141,7 @@ NSMenuItem* selectedMenuItem; auto accountList = accMdl_->getAccountList(); if (!accountList.empty()) { const auto& fallbackAccount = accMdl_->getAccountInfo(accountList.at(0)); - if (accountList.size() == 1) { - [accountSelectionManager_ setSavedAccount:fallbackAccount]; - } + [accountSelectionManager_ setSavedAccount:fallbackAccount]; return fallbackAccount; } else { NSException* noAccEx = [NSException @@ -153,13 +154,11 @@ NSMenuItem* selectedMenuItem; } -(void) updateMenuItemForAccount: (const std::string&) accountID { - AccountMenuItemView *itemView = - [accountsMenu itemWithTag:[@(accountID.c_str()) intValue]].view; - if(!itemView) { - return; - } - [self configureView:itemView forAccount:accountID]; - + NSMenuItem *item =[accountsMenu itemWithTag:[menuItemsTags[@(accountID.c_str())] intValue]]; + if(!item) {return;} + AccountMenuItemView *itemView =item.view; + if(!itemView) {return;} + [self configureView:itemView forAccount:accountID forMenuItem: item]; } -(void) updateMenu { @@ -175,12 +174,11 @@ NSMenuItem* selectedMenuItem; action:NULL keyEquivalent:@""]; - menuBarItem.attributedTitle = [self attributedItemTitleForAccount:account]; AccountMenuItemView *itemView = [[AccountMenuItemView alloc] initWithFrame:CGRectZero]; - [self configureView:itemView forAccount:accId]; - if([@(accId.c_str()) intValue] != 0) { - [menuBarItem setTag:[@(accId.c_str()) intValue]]; - } + [self configureView:itemView forAccount:accId forMenuItem: menuBarItem]; + int itemTag = arc4random_uniform(1000); + menuItemsTags[@(accId.c_str())] = [NSNumber numberWithInt: itemTag]; + [menuBarItem setTag:itemTag]; [menuBarItem setView:itemView]; [accountsMenu addItem:menuBarItem]; } @@ -204,8 +202,9 @@ NSMenuItem* selectedMenuItem; [accountStatus setHidden:accList.empty()]; } --(void) configureView: (AccountMenuItemView *) itemView forAccount:(const std::string&) accountId { +-(void) configureView: (AccountMenuItemView *) itemView forAccount:(const std::string&) accountId forMenuItem:(NSMenuItem *) item { auto& account = accMdl_->getAccountInfo(accountId); + item.attributedTitle = [self attributedItemTitleForAccount:account]; [itemView.accountLabel setStringValue:@(account.profileInfo.alias.c_str())]; NSString* userNameString = [self nameForAccount: account]; [itemView.userNameLabel setStringValue:userNameString]; @@ -323,7 +322,7 @@ NSMenuItem* selectedMenuItem; if(account.profileInfo.type == lrc::api::profile::Type::INVALID){ return; } - [accountSelectionButton selectItemWithTitle:[self itemTitleForAccount:account]]; + [accountSelectionButton selectItemWithTag:[menuItemsTags[@(account.id.c_str())] intValue]]; } @catch (NSException *ex) { NSLog(@"Caught exception %@: %@", [ex name], [ex reason]);