Changeset 6477 for trunk/qt4-gui/src

Show
Ignore:
Timestamp:
08/07/08 04:41:10 (4 months ago)
Author:
flynd
Message:

Only update groups that have actually changed. Set server group before local group so we never locally remove the server group from a user.

Location:
trunk/qt4-gui/src/userdlg
Files:
2 modified

Legend:

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

    r6474 r6477  
    136136  mySysGroupLayout = new QVBoxLayout(mySysGroupBox); 
    137137 
    138   myOnlineNotifyCheck = new QCheckBox(tr("Online notify")); 
    139   myOnlineNotifyCheck->setToolTip(tr("Notify when this contact comes online.")); 
    140   mySysGroupLayout->addWidget(myOnlineNotifyCheck); 
    141  
    142   myVisibleListCheck = new QCheckBox(tr("Visible List")); 
    143   myVisibleListCheck->setToolTip(tr("Contact will see you online even if you're invisible.")); 
    144   mySysGroupLayout->addWidget(myVisibleListCheck); 
    145  
    146   myInvisibleListCheck = new QCheckBox(tr("Invisible List")); 
    147   myInvisibleListCheck->setToolTip(tr("Contact will always see you as offline.")); 
    148   mySysGroupLayout->addWidget(myInvisibleListCheck); 
    149  
    150   myIgnoreListCheck = new QCheckBox(tr("Ignore List")); 
    151   myIgnoreListCheck->setToolTip(tr("Ignore any events from this contact.")); 
    152   mySysGroupLayout->addWidget(myIgnoreListCheck); 
    153  
    154   myNewUsersCheck = new QCheckBox(tr("New Users")); 
    155   myNewUsersCheck->setToolTip(tr("Contact was recently added to the list.")); 
    156   mySysGroupLayout->addWidget(myNewUsersCheck); 
     138  mySystemGroupCheck[GROUP_ONLINE_NOTIFY] = new QCheckBox(tr("Online notify")); 
     139  mySystemGroupCheck[GROUP_ONLINE_NOTIFY]->setToolTip(tr("Notify when this contact comes online.")); 
     140  mySysGroupLayout->addWidget(mySystemGroupCheck[GROUP_ONLINE_NOTIFY]); 
     141 
     142  mySystemGroupCheck[GROUP_VISIBLE_LIST] = new QCheckBox(tr("Visible List")); 
     143  mySystemGroupCheck[GROUP_VISIBLE_LIST]->setToolTip(tr("Contact will see you online even if you're invisible.")); 
     144  mySysGroupLayout->addWidget(mySystemGroupCheck[GROUP_VISIBLE_LIST]); 
     145 
     146  mySystemGroupCheck[GROUP_INVISIBLE_LIST] = new QCheckBox(tr("Invisible List")); 
     147  mySystemGroupCheck[GROUP_INVISIBLE_LIST]->setToolTip(tr("Contact will always see you as offline.")); 
     148  mySysGroupLayout->addWidget(mySystemGroupCheck[GROUP_INVISIBLE_LIST]); 
     149 
     150  mySystemGroupCheck[GROUP_IGNORE_LIST] = new QCheckBox(tr("Ignore List")); 
     151  mySystemGroupCheck[GROUP_IGNORE_LIST]->setToolTip(tr("Ignore any events from this contact.")); 
     152  mySysGroupLayout->addWidget(mySystemGroupCheck[GROUP_IGNORE_LIST]); 
     153 
     154  mySystemGroupCheck[GROUP_NEW_USERS] = new QCheckBox(tr("New Users")); 
     155  mySystemGroupCheck[GROUP_NEW_USERS]->setToolTip(tr("Contact was recently added to the list.")); 
     156  mySysGroupLayout->addWidget(mySystemGroupCheck[GROUP_NEW_USERS]); 
    157157 
    158158  mySysGroupLayout->addStretch(1); 
     
    188188 
    189189  myPageGroupsLayout->addWidget(myGroupsBox); 
    190   myPageGroupsLayout->addStretch(1); 
    191190 
    192191  return w; 
     
    218217  myStatusDndRadio->setChecked(statusToUser == ICQ_STATUS_DND); 
    219218 
    220   myOnlineNotifyCheck->setChecked(user->OnlineNotify()); 
    221   myVisibleListCheck->setChecked(user->VisibleList()); 
    222   myInvisibleListCheck->setChecked(user->InvisibleList()); 
    223   myIgnoreListCheck->setChecked(user->IgnoreList()); 
    224   myNewUsersCheck->setChecked(user->NewUser()); 
     219  for (unsigned short i = 1; i < NUM_GROUPS_SYSTEM_ALL; ++i) 
     220    mySystemGroupCheck[i]->setChecked(user->GetInGroup(GROUPS_SYSTEM, i)); 
    225221 
    226222  unsigned int ppid = user->PPID(); 
     
    329325    return; 
    330326 
    331   // Set user groups (SetUserInGroup will take lock so must be called here) 
     327  const ICQUser* u = gUserManager.FetchUser(id.toLatin1(), ppid, LOCK_R); 
     328  if (u == NULL) 
     329    return; 
     330 
     331  // Get current group memberships so we only set those that have actually changed 
     332  int serverGroup = 0; 
     333  if (u->GetSID() != 0) 
     334    serverGroup = gUserManager.GetGroupFromID(u->GetGSID()); 
     335  const UserGroupList& userGroups = u->GetGroups(); 
     336  unsigned long systemGroups = u->GetSystemGroups(); 
     337 
     338  gUserManager.DropUser(u); 
     339 
     340  // First set server group 
    332341  for (int i = 0; i < myGroupsTable->rowCount(); ++i) 
    333342  { 
    334343    unsigned short gid = myGroupsTable->item(i, 0)->data(Qt::UserRole).toUInt(); 
    335344 
     345    if (dynamic_cast<QRadioButton*>(myGroupsTable->cellWidget(i, 2))->isChecked()) 
     346    { 
     347      if (gid != serverGroup) 
     348        gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_USER, gid, true, true); 
     349    } 
     350  } 
     351 
     352  // Set local user groups 
     353  for (int i = 0; i < myGroupsTable->rowCount(); ++i) 
     354  { 
     355    unsigned short gid = myGroupsTable->item(i, 0)->data(Qt::UserRole).toUInt(); 
     356 
    336357    bool inLocal = dynamic_cast<QCheckBox*>(myGroupsTable->cellWidget(i, 1))->isChecked(); 
    337     bool inServer = dynamic_cast<QRadioButton*>(myGroupsTable->cellWidget(i, 2))->isChecked(); 
    338     gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_USER, gid, inLocal | inServer, inServer); 
     358    if ((userGroups.count(gid) > 0) != inLocal) 
     359      gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_USER, gid, inLocal, false); 
    339360  } 
    340361 
    341362  // Set system groups 
    342   gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_SYSTEM, 
    343       GROUP_ONLINE_NOTIFY, myOnlineNotifyCheck->isChecked(), true); 
    344   gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_SYSTEM, 
    345       GROUP_VISIBLE_LIST, myVisibleListCheck->isChecked(), true); 
    346   gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_SYSTEM, 
    347       GROUP_INVISIBLE_LIST, myInvisibleListCheck->isChecked(), true); 
    348   gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_SYSTEM, 
    349       GROUP_IGNORE_LIST, myIgnoreListCheck->isChecked(), true); 
    350   gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_SYSTEM, 
    351       GROUP_NEW_USERS, myNewUsersCheck->isChecked(), true); 
     363  for (unsigned short i = 1; i < NUM_GROUPS_SYSTEM_ALL; ++i) 
     364  { 
     365    bool inGroup = mySystemGroupCheck[i]->isChecked(); 
     366    if ((systemGroups & (1L << (i - 1))) != inGroup) 
     367      gUserManager.SetUserInGroup(id.toLatin1().data(), ppid, GROUPS_SYSTEM, i, inGroup, true); 
     368  } 
    352369} 
    353370 
  • trunk/qt4-gui/src/userdlg/modes.h

    r6475 r6477  
    2525 
    2626#include <QObject> 
     27 
     28#include <licq_user.h> 
    2729 
    2830class QCheckBox; 
     
    112114  QGroupBox* mySysGroupBox; 
    113115  QVBoxLayout* mySysGroupLayout; 
    114   QCheckBox* myOnlineNotifyCheck; 
    115   QCheckBox* myVisibleListCheck; 
    116   QCheckBox* myInvisibleListCheck; 
    117   QCheckBox* myIgnoreListCheck; 
    118   QCheckBox* myNewUsersCheck; 
     116  QCheckBox* mySystemGroupCheck[NUM_GROUPS_SYSTEM_ALL]; 
    119117 
    120118  // Widgets for groups page