author | umopapisdn <umopapisdn> | 2003-03-28 13:12:09 (UTC) |
---|---|---|
committer | umopapisdn <umopapisdn> | 2003-03-28 13:12:09 (UTC) |
commit | b271d575fa05cf570a1a829136517761bd47e69b (patch) (side-by-side diff) | |
tree | e82c8e348b3b926fb365c42454d12a56dda0adc6 | |
parent | 8e8803488d2c11b12449e785802da4a5a9adad0f (diff) | |
download | opie-b271d575fa05cf570a1a829136517761bd47e69b.zip opie-b271d575fa05cf570a1a829136517761bd47e69b.tar.gz opie-b271d575fa05cf570a1a829136517761bd47e69b.tar.bz2 |
Bugfix: (bug #0000765) Lines in /etc/passwd & /etc/group starting with a "#" are comments and should not be editable.
-rw-r--r-- | noncore/settings/usermanager/opie-usermanager.control | 2 | ||||
-rw-r--r-- | noncore/settings/usermanager/passwd.cpp | 11 | ||||
-rw-r--r-- | noncore/settings/usermanager/userdialog.cpp | 6 | ||||
-rw-r--r-- | noncore/settings/usermanager/usermanager.cpp | 26 |
4 files changed, 28 insertions, 17 deletions
diff --git a/noncore/settings/usermanager/opie-usermanager.control b/noncore/settings/usermanager/opie-usermanager.control index f971fdc..e1c7762 100644 --- a/noncore/settings/usermanager/opie-usermanager.control +++ b/noncore/settings/usermanager/opie-usermanager.control @@ -1,9 +1,9 @@ Files: bin/usermanager apps/Settings/usermanager.desktop pics/usermanager/* Priority: optional Section: opie/settings Version: $QPE_VERSION-$SUB_VERSION Depends: opie-base Architecture: arm Maintainer: Ted Parnefors <zaurus@bredband.net> License: GPL -Description: User/Group manager for OPIE. +Description: User/Group manager for Opie. diff --git a/noncore/settings/usermanager/passwd.cpp b/noncore/settings/usermanager/passwd.cpp index 1e98778..f8e6d17 100644 --- a/noncore/settings/usermanager/passwd.cpp +++ b/noncore/settings/usermanager/passwd.cpp @@ -114,187 +114,192 @@ void Passwd::splitPasswdEntry(QString &userString) { } // Splits a "group" line into the components and stores them in the gr_* variables. void Passwd::splitGroupEntry(QString &groupString) { groupdataStringList=QStringList::split(":",groupString,true); QStringList::Iterator it=groupdataStringList.begin(); gr_name=(*it++); it++; gr_gid=(*it++).toInt(); gr_mem=QStringList::split(",",(*it++)); } // Find a user in the passwdStringList. Return true if found and also fill the pw_* variables. bool Passwd::searchUser(QRegExp &userRegExp) { QStringList tempStringList(passwdStringList.grep(userRegExp)); if((tempStringList.isEmpty())) { return false; } else { userString=(*(tempStringList.begin())); splitPasswdEntry(userString); } return true; } // Find a user by login. bool Passwd::findUser(const char *username) { QRegExp userRegExp(QString("^%1\\:").arg(username)); return searchUser(userRegExp); } // Find a user by uid. bool Passwd::findUser(int uid) { QRegExp userRegExp(QString(":%1\\:").arg(uid)); return searchUser(userRegExp); } // Add a user to the passwdStringList, create home directory, and optionally create a group for the user. bool Passwd::addUser(QString pw_name, QString pw_passwd, int pw_uid, int pw_gid, QString pw_gecos,QString pw_dir, QString pw_shell, bool createGroup) { QString tempString; if((createGroup) && (!(findGroup(pw_gid)))) addGroup(pw_name,pw_gid); pw_passwd = crypt(pw_passwd, crypt_make_salt()); tempString=pw_name+":"+pw_passwd+":"+QString::number(pw_uid)+":"+QString::number(pw_gid)+":"+pw_gecos+":"+pw_dir+":"+pw_shell; passwdStringList.append(tempString); // Make home dir. QDir d; if(!(d.exists(pw_dir))) { d.mkdir(pw_dir); chown(pw_dir,pw_uid,pw_gid); chmod(pw_dir,S_IRUSR|S_IWUSR|S_IXUSR); } return 1; } // Update info for a user in passwdStringList, take info from the pw_* fields. bool Passwd::updateUser(QString login) { QRegExp userRegExp(QString("^%1\\:").arg(login)); for(QStringList::Iterator it=passwdStringList.begin(); it!=passwdStringList.end(); ++it) { if(userRegExp.find((*it),0)!=-1) { *it=QString(pw_name+":"+pw_passwd+":"+QString::number(pw_uid)+":"+QString::number(pw_gid)+":"+pw_gecos+":"+pw_dir+":"+pw_shell); return true; } } return false; } // Delete a user from passwdStringList. bool Passwd::deleteUser(QRegExp &userRegExp, bool delGroup) { for(QStringList::Iterator it=passwdStringList.begin(); it!=passwdStringList.end(); ++it) { if(userRegExp.find((*it),0)!=-1) { splitPasswdEntry(*it); if(delGroup) this->delGroup(pw_gid); passwdStringList.remove(it); return true; } } return false; } // Delete a user by login, and optionally also delete group. bool Passwd::delUser(const char *username, bool delGroup) { QRegExp userRegExp(QString("^%1\\:").arg(username)); return deleteUser(userRegExp,delGroup); } // Delete a user by uid, and optionally also delete group. bool Passwd::delUser(int uid, bool delGroup) { QRegExp userRegExp(QString(":%1\\:").arg(uid)); return deleteUser(userRegExp,delGroup); } // Locate a group in the groupStringList, fill out the gr_* variables and return "true" if found. bool Passwd::searchGroup(QRegExp &groupRegExp) { QStringList tempStringList(groupStringList.grep(groupRegExp)); if((tempStringList.isEmpty())) { return false; } else { - groupString=(*(tempStringList.begin())); - splitGroupEntry(groupString); + for(QStringList::Iterator it=tempStringList.begin(); it!=tempStringList.end(); it++) { + groupString=*it; + if(!groupString.find(QRegExp("^#"),0)) { // Skip commented lines. + splitGroupEntry(groupString); + return true; + } + } } - return true; + return false; } // Find a group by groupname. bool Passwd::findGroup(const char *groupname) { QRegExp groupRegExp(QString("^%1\\:").arg(groupname)); return searchGroup(groupRegExp); } // Find a group by gid. bool Passwd::findGroup(int gid) { QRegExp groupRegExp(QString(":%1\\:").arg(gid)); return searchGroup(groupRegExp); } // Add a group to groupStringList bool Passwd::addGroup(QString gr_name, int gr_gid) { QString tempString; tempString=gr_name+":*:"+QString::number(gr_gid)+":"; groupStringList.append(tempString); return 1; } // Update fields for a group in groupStringList, take info from the gr_* variables. bool Passwd::updateGroup(int gid) { QRegExp groupRegExp(QString(":%1\\:").arg(QString::number(gid))); for(QStringList::Iterator it=groupStringList.begin(); it!=groupStringList.end(); ++it) { if(groupRegExp.find((*it),0)!=-1) { *it=QString(gr_name+":*:"+QString::number(gr_gid)+":"); for(QStringList::Iterator member=gr_mem.begin(); member!=gr_mem.end();) { *it+=*member; ++member; if(member!=gr_mem.end()) *it+=","; } return true; } } return false; } // Delete a group from groupStringList. bool Passwd::deleteGroup(QRegExp &groupRegExp) { for(QStringList::Iterator it=groupStringList.begin(); it!=groupStringList.end(); ++it) { if(groupRegExp.find((*it),0)!=-1) { groupStringList.remove(it); return true; } } return false; } // Delete a group by groupname. bool Passwd::delGroup(const char *groupname) { QRegExp groupRegExp(QString("^%1\\:").arg(groupname)); return deleteGroup(groupRegExp); } // Delete a group by gid. bool Passwd::delGroup(int gid) { QRegExp groupRegExp(QString(":%1\\:").arg(gid)); return deleteGroup(groupRegExp); } // Add a user as a member to a group in groupStringList. bool Passwd::addGroupMember(QString groupname, QString member) { if(!(findGroup(groupname))) return false; QRegExp memberRegExp(QString("^%1$").arg(member)); QStringList templist=gr_mem.grep(memberRegExp); if(templist.isEmpty()) gr_mem << member; if(!(updateGroup(gr_gid))) return false; return true; } // Delete a user as a groupmember from a group in groupStringList. bool Passwd::delGroupMember(QString groupname, QString member) { if(!(findGroup(groupname))) return false; for(QStringList::Iterator it=gr_mem.begin(); it!=gr_mem.end(); ++it) { if(*it==member) { gr_mem.remove(it); it=gr_mem.end(); } } if(!(updateGroup(gr_gid))) return false; return true; } // Global Object Passwd *accounts; diff --git a/noncore/settings/usermanager/userdialog.cpp b/noncore/settings/usermanager/userdialog.cpp index 0d2122b..c06f639 100644 --- a/noncore/settings/usermanager/userdialog.cpp +++ b/noncore/settings/usermanager/userdialog.cpp @@ -1,144 +1,146 @@ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "userdialog.h" #include <qlayout.h> #include <qlabel.h> #include <qmessagebox.h> #include <qfile.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <signal.h> #include "passwd.h" #include <opie/odevice.h> using namespace Opie; /** * UserDialog constructor. Setup the dialog, fill the groupComboBox & groupsListView with all groups. * */ UserDialog::UserDialog(int viewmode, QWidget* parent, const char* name, bool modal, WFlags fl) : QDialog(parent, name, modal, fl) { vm=viewmode; QVBoxLayout *layout = new QVBoxLayout(this); myTabWidget=new QTabWidget(this,"User Tab Widget"); layout->addWidget(myTabWidget); setupTab1(); setupTab2(); accounts->groupStringList.sort(); // And also fill the listview & the combobox with all available groups. for( QStringList::Iterator it = accounts->groupStringList.begin(); it!=accounts->groupStringList.end(); ++it) { accounts->splitGroupEntry(*it); - new QCheckListItem(groupsListView,accounts->gr_name,QCheckListItem::CheckBox); - groupComboBox->insertItem(accounts->gr_name); + if(accounts->gr_name.find(QRegExp("^#"),0)) { // Skip commented lines. + new QCheckListItem(groupsListView,accounts->gr_name,QCheckListItem::CheckBox); + groupComboBox->insertItem(accounts->gr_name); + } } showMaximized(); } /** * Empty destructor. * */ UserDialog::~UserDialog() { } /** * Creates the first tab, all userinfo is here. * */ void UserDialog::setupTab1() { QPixmap mypixmap; QWidget *tabpage = new QWidget(myTabWidget,"page1"); QVBoxLayout *layout = new QVBoxLayout(tabpage); layout->setMargin(5); // Picture picturePushButton = new QPushButton(tabpage,"Label"); picturePushButton->setMinimumSize(48,48); picturePushButton->setMaximumSize(48,48); picturePushButton->setPixmap(Resource::loadPixmap("usermanager/usericon")); // Load default usericon. connect(picturePushButton,SIGNAL(clicked()),this,SLOT(clickedPicture())); // Clicking the picture should invoke pictureselector. // Login QLabel *loginLabel=new QLabel(tabpage,"Login: "); loginLabel->setText("Login: "); loginLineEdit=new QLineEdit(tabpage,"Login: "); // UID QLabel *uidLabel=new QLabel(tabpage,"uid: "); uidLabel->setText("UserID: "); uidLineEdit=new QLineEdit(tabpage,"uid: "); uidLineEdit->setEnabled(false); // Username (gecos) QLabel *gecosLabel=new QLabel(tabpage,"gecos"); gecosLabel->setText("Username: "); gecosLineEdit=new QLineEdit(tabpage,"gecos"); // Password QLabel *passwordLabel=new QLabel(tabpage,"password"); passwordLabel->setText("Password: "); passwordLineEdit=new QLineEdit(tabpage,"password"); passwordLineEdit->setEchoMode(QLineEdit::Password); // Shell QLabel *shellLabel=new QLabel(tabpage,"shell"); shellLabel->setText("Shell: "); shellComboBox=new QComboBox(tabpage,"shell"); shellComboBox->setEditable(true); shellComboBox->insertItem("/bin/sh"); shellComboBox->insertItem("/bin/ash"); shellComboBox->insertItem("/bin/false"); // Primary Group QLabel *groupLabel=new QLabel(tabpage,"group"); groupLabel->setText("Primary group: "); groupComboBox=new QComboBox(tabpage,"PrimaryGroup"); if(vm==VIEWMODE_NEW) { // Copy /etc/skel skelLabel=new QLabel(tabpage,"skel"); skelLabel->setText("Copy /etc/skel: "); skelCheckBox=new QCheckBox(tabpage); skelCheckBox->setChecked(true); } // Widget layout QHBoxLayout *hlayout=new QHBoxLayout(-1,"hlayout"); layout->addWidget(picturePushButton); layout->addSpacing(5); layout->addLayout(hlayout); QVBoxLayout *vlayout1=new QVBoxLayout(-1,"vlayout1"); QVBoxLayout *vlayout2=new QVBoxLayout(-1,"vlayout2"); // First column, labels vlayout1->addWidget(loginLabel); vlayout1->addSpacing(5); vlayout1->addWidget(uidLabel); vlayout1->addSpacing(5); vlayout1->addWidget(gecosLabel); vlayout1->addSpacing(5); vlayout1->addWidget(passwordLabel); vlayout1->addSpacing(5); vlayout1->addWidget(shellLabel); vlayout1->addSpacing(5); vlayout1->addWidget(groupLabel); if(vm==VIEWMODE_NEW) { vlayout1->addSpacing(5); vlayout1->addWidget(skelLabel); } // Second column, data diff --git a/noncore/settings/usermanager/usermanager.cpp b/noncore/settings/usermanager/usermanager.cpp index 57efa71..1946013 100644 --- a/noncore/settings/usermanager/usermanager.cpp +++ b/noncore/settings/usermanager/usermanager.cpp @@ -33,222 +33,226 @@ UserConfig::UserConfig(QWidget* parent, const char* name, WFlags fl) : QMainWind accounts=new Passwd(); accounts->open(); // This actually loads the files /etc/passwd & /etc/group into memory. // Create the toolbar. QPEToolBar *toolbar = new QPEToolBar(this,"Toolbar"); toolbar->setHorizontalStretchable(1); // Is there any other way to get the toolbar to stretch of the full screen!? adduserToolButton = new QToolButton(Resource::loadPixmap("usermanager/adduser"),"Add User",0,this,SLOT(addUser()),toolbar,"Add User"); edituserToolButton = new QToolButton(Resource::loadPixmap("usermanager/edituser"),"Edit User",0,this,SLOT(editUser()),toolbar,"Edit User"); deleteuserToolButton = new QToolButton(Resource::loadPixmap("usermanager/deleteuser"),"Delete User",0,this,SLOT(delUser()),toolbar,"Delete User"); QToolButton *userstext = new QToolButton(0,"User",0,0,0,toolbar,"User"); userstext->setUsesTextLabel(true); toolbar->addSeparator(); addgroupToolButton = new QToolButton(Resource::loadPixmap("usermanager/addgroup"),"Add Group",0,this,SLOT(addGroup()),toolbar,"Add Group"); editgroupToolButton = new QToolButton(Resource::loadPixmap("usermanager/editgroup"),"Edit Group",0,this,SLOT(editGroup()),toolbar,"Edit Group"); deletegroupToolButton = new QToolButton(Resource::loadPixmap("usermanager/deletegroup"),"Delete Group",0,this,SLOT(delGroup()),toolbar,"Delete Group"); QToolButton *groupstext = new QToolButton(0,"Group",0,0,0,toolbar,"Group"); groupstext->setUsesTextLabel(true); addToolBar(toolbar,"myToolBar"); // Add a tabwidget and all the tabs. myTabWidget = new QTabWidget(this,"My Tab Widget"); setupTabAccounts(); setupTabAllUsers(); setupTabAllGroups(); userPopupMenu.insertItem("Copy",0); getUsers(); // Fill out the iconview & listview with all users. getGroups(); // Fill out the group listview with all groups. setCentralWidget(myTabWidget); } UserConfig::~UserConfig() { accounts->close(); delete accounts; } void UserConfig::setupTabAccounts() { QWidget *tabpage = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout(tabpage); layout->setMargin(5); usersIconView=new QListView(tabpage,"users"); usersIconView->addColumn("Icon"); usersIconView->addColumn("Username"); usersIconView->setAllColumnsShowFocus(true); layout->addWidget(usersIconView); connect(usersIconView,SIGNAL(returnPressed(QListViewItem *)),this,SLOT(showUserMenu(QListViewItem *))); myTabWidget->addTab(tabpage,"Users"); } void UserConfig::setupTabAllUsers() { QWidget *tabpage = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout(tabpage); layout->setMargin(5); usersListView=new QListView(tabpage,"allusers"); usersListView->addColumn("UID"); usersListView->addColumn("Login"); usersListView->addColumn("Username"); layout->addWidget(usersListView); usersListView->setSorting(1,1); usersListView->setAllColumnsShowFocus(true); myTabWidget->addTab(tabpage,"All Users"); } void UserConfig::setupTabAllGroups() { QWidget *tabpage = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout(tabpage); layout->setMargin(5); groupsListView=new QListView(tabpage,"groups"); groupsListView->addColumn("GID"); groupsListView->addColumn("Groupname"); layout->addWidget(groupsListView); groupsListView->setSorting(1,1); groupsListView->setAllColumnsShowFocus(true); myTabWidget->addTab(tabpage,"All Groups"); } void UserConfig::getUsers() { QString mytext; QPixmap mypixmap; QListViewItem *listviewitem; // Empty the iconview & the listview. usersIconView->clear(); usersListView->clear(); // availableUID is used as a deposite for the next available UID on the system, this should start at an ID over 500. availableUID=500; for(QStringList::Iterator it=accounts->passwdStringList.begin(); it!=accounts->passwdStringList.end(); ++it) { accounts->splitPasswdEntry(*it); // Split the string into it's components and store in variables in the accounts object. ("pr_name" and so on.) - new QListViewItem(usersListView,QString::number(accounts->pw_uid),accounts->pw_name,accounts->pw_gecos); - if((accounts->pw_uid>=500) && (accounts->pw_uid<65000)) { // Is this user a "normal" user ? - mytext=QString(accounts->pw_name)+" - ("+QString(accounts->pw_gecos)+")"; // The string displayed next to the icon. - if(!(mypixmap.load("/opt/QtPalmtop/pics/users/"+accounts->pw_name+".png"))) { // Is there an icon for this user? Resource::loadPixmap is caching, doesn't work. - mypixmap=Resource::loadPixmap(QString("usermanager/usericon")); // If this user has no icon, load the default icon. + if(accounts->pw_name.find(QRegExp("^#"),0)) { // Skip commented lines. + new QListViewItem(usersListView,QString::number(accounts->pw_uid),accounts->pw_name,accounts->pw_gecos); + if((accounts->pw_uid>=500) && (accounts->pw_uid<65000)) { // Is this user a "normal" user ? + mytext=QString(accounts->pw_name)+" - ("+QString(accounts->pw_gecos)+")"; // The string displayed next to the icon. + if(!(mypixmap.load("/opt/QtPalmtop/pics/users/"+accounts->pw_name+".png"))) { // Is there an icon for this user? Resource::loadPixmap is caching, doesn't work. + mypixmap=Resource::loadPixmap(QString("usermanager/usericon")); // If this user has no icon, load the default icon. + } + listviewitem=new QListViewItem(usersIconView,"",mytext); // Add the icon+text to the qiconview. + listviewitem->setPixmap(0,mypixmap); } - listviewitem=new QListViewItem(usersIconView,"",mytext); // Add the icon+text to the qiconview. - listviewitem->setPixmap(0,mypixmap); + if((accounts->pw_uid>=availableUID) && (accounts->pw_uid<65000)) availableUID=accounts->pw_uid+1; // Increase 1 to the latest know UID to get a free uid. } - if((accounts->pw_uid>=availableUID) && (accounts->pw_uid<65000)) availableUID=accounts->pw_uid+1; // Increase 1 to the latest know UID to get a free uid. } usersIconView->sort(); } void UserConfig::addUser() { if(UserDialog::addUser(availableUID,availableGID)) { // Add the user to the system, also send next available UID and GID. getUsers(); // Update users views. getGroups(); // Update groups view. } } void UserConfig::editUser() { QString username; if(myTabWidget->currentPageIndex()==0) { // Users if(usersIconView->currentItem()) { // Any icon selected? username=usersIconView->currentItem()->text(1); // Get the text associated with the icon. username=username.left(username.find(" - (",0,true)); // Strip out the username. if(UserDialog::editUser(username)) { // Bring up the userinfo dialog. // If there were any changed also update the views. getUsers(); getGroups(); } } else { QMessageBox::information(this,"No selection.","No user has been selected."); } } if(myTabWidget->currentPageIndex()==1) { // All users if(usersListView->currentItem()) { // Anything changed!? username=usersListView->currentItem()->text(1); // Get the username. if(UserDialog::editUser(username)) { // Bring up the userinfo dialog. // And again update the views if there were any changes. getUsers(); getGroups(); } } else { QMessageBox::information(this,"No selection.","No user has been selected."); } } } void UserConfig::delUser() { QString username; if(myTabWidget->currentPageIndex()==0) { // Users, Iconview. if(usersIconView->currentItem()) { // Anything selected? username=usersIconView->currentItem()->text(1); // Get string associated with icon. username=username.left(username.find(" - (",0,true)); // Strip out the username. if(QMessageBox::warning(this,"Delete user","Are you sure you want to\ndelete this user? \""+QString(username)+"\" ?","&No","&Yes",0,0,1)) { if(UserDialog::delUser(username)) { // Delete the user if possible. // Update views. getUsers(); getGroups(); } } } else { QMessageBox::information(this,"No selection","No user has been selected."); } } if(myTabWidget->currentPageIndex()==1) { // All users if(usersListView->currentItem()) { // Anything changed!? username=usersListView->currentItem()->text(1); // Get the username. if(QMessageBox::warning(this,"Delete user","Are you sure you want to\ndelete this user? \""+QString(username)+"\" ?","&No","&Yes",0,0,1)) { if(UserDialog::delUser(username)) { // Try to delete the user. // Update views. getUsers(); getGroups(); } } } else { QMessageBox::information(this,"No selection","No user has been selected."); } } } void UserConfig::getGroups() { groupsListView->clear(); // Empty the listview. availableGID=500; // We need to find the next free GID, and are only interested in values between 500 & 65000. for(QStringList::Iterator it=accounts->groupStringList.begin(); it!=accounts->groupStringList.end(); ++it) { // Split the list into lines. accounts->splitGroupEntry(*it); // Split the line into its components and fill the variables of 'accounts'. (gr_name, gr_uid & gr_mem). - new QListViewItem(groupsListView,QString::number(accounts->gr_gid),accounts->gr_name); - if((accounts->gr_gid>=availableGID) && (accounts->gr_gid<65000)) availableGID=accounts->gr_gid+1; // Maybe a new free GID. + if(accounts->gr_name.find(QRegExp("^#"),0)) { // Skip commented lines. + new QListViewItem(groupsListView,QString::number(accounts->gr_gid),accounts->gr_name); + if((accounts->gr_gid>=availableGID) && (accounts->gr_gid<65000)) availableGID=accounts->gr_gid+1; // Maybe a new free GID. + } } -} +} void UserConfig::addGroup() { if(GroupDialog::addGroup(availableGID)) getGroups(); // Bring up the add group dialog. } void UserConfig::editGroup() { int gid; if(groupsListView->currentItem()) { // Any group selected? gid=groupsListView->currentItem()->text(0).toInt(); // Get the GID from the listview. if(GroupDialog::editGroup(gid)) getGroups(); // Bring up the edit group dialog. } else { QMessageBox::information(this,"No selection","No group has been selected."); } } void UserConfig::delGroup() { const char *groupname; if(groupsListView->currentItem()) { // Any group selected? groupname=groupsListView->currentItem()->text(1); // Get the groupname from the listview. if(QMessageBox::warning(this,"Delete group","Are you sure you want to\ndelete the group \""+QString(groupname)+"\" ?","&No","&Yes",0,0,1)) { // If confirmed, try to delete the group. if(GroupDialog::delGroup(groupname)) getGroups(); // And also update the view afterwards if the user was deleted. } } else { QMessageBox::information(this,"No selection","No group has been selected."); } } void UserConfig::showUserMenu(QListViewItem *item) { // userPopupMenu.exec(item->mapToGlobal(QPoint(0,0))); qWarning("Pressed!"); } |