/*
* This file is a part of VyQChat.
*
* Copyright (C) 2002-2004 Pawel Stolowski <yogin@linux.bydg.org>
*
* VyQChat is free software; you can redestribute it and/or modify it
* under terms of GNU General Public License by Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY. See GPL for more details.
*/
#include "ulist.h"
#include "msgsndwin.h"
#include "icons.h"
#include "vcprotocol.h"
#include <qpopupmenu.h>
UsersList::UsersList(QWidget *parent): QListBox(parent)/*{{{*/
{
setMinimumWidth(120);
setFocusPolicy(QWidget::NoFocus);
setSelectionMode(QListBox::Single);
setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding));
setAutoBottomScrollBar(false);
//
// context menu when no user selected
menu = new QPopupMenu(this);
menu->insertItem(Icons::icon_massmessage, tr("Mass Message"), ID_MASSMESSAGE);
menu->insertItem(tr("Refresh list"), ID_REFRESH);
connect(menu, SIGNAL(activated(int)), this, SLOT(menuAction(int)));
//
// context menu for user
usermenu = new QPopupMenu(this);
usermenu->insertItem(Icons::icon_message, tr("Message"), ID_MESSAGE);
usermenu->insertItem(Icons::icon_private, tr("Private chat"), ID_PRVCHAT);
usermenu->insertItem(Icons::icon_info, tr("Request info"), ID_REQINFO);
usermenu->insertItem(Icons::icon_beep, tr("Beep"), ID_BEEP);
usermenu->insertItem(tr("Say \"Nick:\""), ID_SAYNICK);
usermenu->insertSeparator();
usermenu->insertItem(Icons::icon_massmessage, tr("Mass Message"), ID_MASSMESSAGE);
usermenu->insertSeparator();
usermenu->insertItem(tr("Refresh list"), ID_REFRESH);
connect(usermenu, SIGNAL(activated(int)), this, SLOT(menuAction(int)));
connect(this, SIGNAL(contextMenuRequested(QListBoxItem *, const QPoint &)), this, SLOT(popupContextMenu(QListBoxItem*, const QPoint &)));
connect(this, SIGNAL(doubleClicked(QListBoxItem *)), this, SLOT(sendMessage(QListBoxItem *)));
}/*}}}*/
UsersList::~UsersList()/*{{{*/
{
}/*}}}*/
bool UsersList::newNick(const QString &onick, const QString &nnick)/*{{{*/
{
User *user = getUser(onick);
if (user)
{
user->setNick(nnick);
umap.remove(onick);
umap[nnick] = user;
updateItem(user);
return true;
}
return false;
}/*}}}*/
User *UsersList::addUser(const QString &nick, char status, const QHostAddress &addr, char gender)/*{{{*/
{
if (exists(nick))
return NULL;
User *u = new User(this, nick, addr);
u->setGender(gender);
u->setStatus(status);
QListBox::sort();
return umap[nick] = u;
}/*}}}*/
bool UsersList::delUser(const QString &nick)/*{{{*/
{
User *user = getUser(nick);
if (user)
{
umap.remove(nick);
delete user;
return true;
}
return false;
}/*}}}*/
char UsersList::getStatus(const QString &nick) const/*{{{*/
{
User *user = getUser(nick);
return user!=NULL ? user->getStatus() : STATUS_UNKNOWN;
}/*}}}*/
bool UsersList::setStatus(const QString &nick, char s)/*{{{*/
{
User *user = getUser(nick);
return user!=NULL ? updateItem(user), setStatus(user, s) : false;
}/*}}}*/
void UsersList::decDeadCounters()/*{{{*/
{
QStringList l;
//
// create a temporary list of non-existent users;
for (UserMap::iterator it = umap.begin(); it!=umap.end(); ++it)
if (it.data()->decDeadCounter() < 0)
l.append(it.key());
//
// delete all users from list
if (!l.empty())
for (QStringList::iterator it=l.begin(); it!=l.end(); ++it)
delUser(*it);
}/*}}}*/
void UsersList::popupContextMenu(QListBoxItem *it, const QPoint &p)/*{{{*/
{
if (it)
usermenu->popup(p);
else
menu->popup(p);
}/*}}}*/
void UsersList::dummy()/*{{{*/
{
}/*}}}*/
void UsersList::sendMessage(QListBoxItem *it)/*{{{*/
{
if (it)
emit sendMessage(it->text());
}/*}}}*/
void UsersList::menuAction(int option)/*{{{*/
{
// printf("%d\n", option);
int i = currentItem();
const QString nick = text(i);
if (option == ID_MASSMESSAGE)
{
/* QStringList allnicks;
for (int i=0; i<count(); i++)
allnicks.append(text(i));*/
emit sendMassMessage(getAllUsers());
return;
}
if (option == ID_REFRESH)
{
emit refresh();
return ;
}
if (i<0)
return;
switch (option)
{
case ID_MESSAGE: emit sendMessage(nick); break;
case ID_REQINFO: emit requestInfo(nick); break;
case ID_BEEP: emit beep(nick); break;
case ID_PRVCHAT: emit privateChat(nick); break;
case ID_SAYNICK: emit sayNick(nick); break;
default: break;
}
}/*}}}*/
QStringList UsersList::getAllUsers() const/*{{{*/
{
QStringList allnicks;
for (int i=0; i<count(); i++)
allnicks.append(text(i));
return allnicks;
}/*}}}*/
syntax highlighted by Code2HTML, v. 0.9.1