Show
Ignore:
Timestamp:
06/14/08 23:21:57 (6 months ago)
Author:
flynd
Message:

dataChanged signal cannot be sent between beginInsertRow and endInsertRow. Revised signalling when adding and removing users in groups to fix this. This fixes the empty rows sometimes seen first in groups after users have been added.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/qt4-gui/src/contactlist/contactlist.cpp

    r6283 r6309  
    6363  connect(group, SIGNAL(barDataChanged(ContactBar*, int)), 
    6464      SLOT(barDataChanged(ContactBar*, int))); 
     65  connect(group, SIGNAL(beginInsert(ContactGroup*, int)), 
     66      SLOT(groupBeginInsert(ContactGroup*, int))); 
     67  connect(group, SIGNAL(endInsert()), SLOT(groupEndInsert())); 
     68  connect(group, SIGNAL(beginRemove(ContactGroup*, int)), 
     69      SLOT(groupBeginRemove(ContactGroup*, int))); 
     70  connect(group, SIGNAL(endRemove()), SLOT(groupEndRemove())); 
    6571  return group; 
    6672} 
     
    236242    return; 
    237243 
    238   int groupRow = (group->groupId() < SystemGroupOffset 
    239       ? myUserGroups.indexOf(group) 
    240       : myUserGroups.size() + group->groupId() - SystemGroupOffset); 
    241  
    242   emit dataChanged(createIndex(groupRow, 0, group), createIndex(groupRow, myColumnCount - 1, group)); 
     244  int row = groupRow(group); 
     245  emit dataChanged(createIndex(row, 0, group), createIndex(row, myColumnCount - 1, group)); 
    243246} 
    244247 
     
    249252 
    250253  emit dataChanged(createIndex(row, 0, bar), createIndex(row, myColumnCount - 1, bar)); 
     254} 
     255 
     256void ContactListModel::groupBeginInsert(ContactGroup* group, int row) 
     257{ 
     258  beginInsertRows(createIndex(groupRow(group), 0, group), row, row); 
     259} 
     260 
     261void ContactListModel::groupEndInsert() 
     262{ 
     263  endInsertRows(); 
     264} 
     265 
     266void ContactListModel::groupBeginRemove(ContactGroup* group, int row) 
     267{ 
     268  beginRemoveRows(createIndex(groupRow(group), 0, group), row, row); 
     269} 
     270 
     271void ContactListModel::groupEndRemove() 
     272{ 
     273  endRemoveRows(); 
    251274} 
    252275 
     
    261284 
    262285  // Add all groups 
    263   beginInsertRows(QModelIndex(), 0, gUserManager.NumGroups() + 1); 
    264  
    265286  ContactGroup* newGroup = createGroup(0, tr("Other Users")); 
    266287  myUserGroups.append(newGroup); 
     
    277298  FOR_EACH_GROUP_END 
    278299 
    279   endInsertRows(); 
    280  
    281300  // Add all users 
    282301  FOR_EACH_USER_START(LOCK_R) 
     
    299318  } 
    300319  return 0; 
     320} 
     321 
     322int ContactListModel::groupRow(ContactGroup* group) const 
     323{ 
     324  unsigned short groupId = group->groupId(); 
     325 
     326  if (groupId < SystemGroupOffset) 
     327    return myUserGroups.indexOf(group); 
     328  else if (groupId <= SystemGroupOffset + NUM_GROUPS_SYSTEM_ALL) 
     329    return myUserGroups.size() + groupId - SystemGroupOffset; 
     330  else 
     331    return -1; 
    301332} 
    302333 
     
    322353    bool shouldBeMember = (gid != 0 && licqUser->GetInGroup(GROUPS_USER, gid)) || 
    323354        (gid == 0 && licqUser->GetGroups().empty() && !licqUser->IgnoreList()); 
    324     updateUserGroup(user, group, i, shouldBeMember); 
     355    updateUserGroup(user, group, shouldBeMember); 
    325356  } 
    326357 
     
    328359  for (unsigned long i = 0; i < NUM_GROUPS_SYSTEM_ALL; ++i) 
    329360  { 
    330     updateUserGroup(user, mySystemGroups[i], myUserGroups.size()+i, licqUser->GetInGroup(GROUPS_SYSTEM, i)); 
    331   } 
    332 } 
    333  
    334 void ContactListModel::updateUserGroup(ContactUserData* user, ContactGroup* group, int groupRow, bool shouldBeMember) 
     361    updateUserGroup(user, mySystemGroups[i], licqUser->GetInGroup(GROUPS_SYSTEM, i)); 
     362  } 
     363} 
     364 
     365void ContactListModel::updateUserGroup(ContactUserData* user, ContactGroup* group, bool shouldBeMember) 
    335366{ 
    336367  ContactUser* member = group->user(user); 
     
    340371    return; 
    341372 
     373  // Adding or removing the user is enough here, signals will be sent from group 
    342374  if (shouldBeMember) 
    343   { 
    344     // Add user to group 
    345     beginInsertRows(createIndex(groupRow, 0, group), group->rowCount(), group->rowCount()); 
    346375    new ContactUser(user, group); 
    347     endInsertRows(); 
    348   } 
    349376  else 
    350   { 
    351     // Remove user from the group 
    352     int index = group->indexOf(member); 
    353     beginRemoveRows(createIndex(groupRow, 0, group), index, index); 
    354377    delete member; 
    355     endRemoveRows(); 
    356   } 
    357378} 
    358379 
     
    367388    ContactGroup* group = u->group(); 
    368389    int pos = group->indexOf(u); 
    369     int groupRow = (group->groupId() < SystemGroupOffset ? myUserGroups.indexOf(group) : myUserGroups.size() + group->groupId() - SystemGroupOffset); 
    370     beginRemoveRows(createIndex(groupRow, 0, group), pos, pos); 
     390    beginRemoveRows(createIndex(groupRow(group), 0, group), pos, pos); 
    371391    delete u; 
    372392    endRemoveRows(); 
     
    436456      return QModelIndex(); 
    437457  } 
    438   int groupRow = (group->groupId() < SystemGroupOffset ? myUserGroups.indexOf(group) : myUserGroups.size() + group->groupId() - SystemGroupOffset); 
    439   return createIndex(groupRow, 0, group); 
     458  return createIndex(groupRow(group), 0, group); 
    440459} 
    441460