Memory leak fix

Instantiate the smiley pop-up window (and all its buttons) only once.


git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@2890 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
leander-256 2010-05-12 19:03:30 +00:00
parent 988c6c31f5
commit faace1f322
2 changed files with 59 additions and 54 deletions

View File

@ -96,7 +96,8 @@
/** Constructor */ /** Constructor */
PeersDialog::PeersDialog(QWidget *parent) PeersDialog::PeersDialog(QWidget *parent)
: RsAutoUpdatePage(1500,parent), : RsAutoUpdatePage(1500,parent),
historyKeeper(Rshare::dataDirectory() + "/his1.xml") historyKeeper(Rshare::dataDirectory() + "/his1.xml"),
smWidget(0)
{ {
/* Invoke the Qt Designer generated object setup routine */ /* Invoke the Qt Designer generated object setup routine */
ui.setupUi(this); ui.setupUi(this);
@ -238,6 +239,7 @@ PeersDialog::~PeersDialog ()
delete (it->second); delete (it->second);
} }
} }
delete smWidget;
} }
void PeersDialog::pasteLink() void PeersDialog::pasteLink()
@ -1403,65 +1405,67 @@ void PeersDialog::loadEmoticonsgroupchat()
void PeersDialog::smileyWidgetgroupchat() void PeersDialog::smileyWidgetgroupchat()
{ {
qDebug("MainWindow::smileyWidget()"); qDebug("MainWindow::smileyWidget()");
QWidget *smWidget = new QWidget(this , Qt::Popup ); if(smWidget == 0) {
smWidget->setWindowTitle("Emoticons"); smWidget = new QWidget(this , Qt::Popup );
smWidget->setWindowIcon(QIcon(QString(":/images/rstray3.png"))); smWidget->setWindowTitle("Emoticons");
//smWidget->setFixedSize(256,256); smWidget->setWindowIcon(QIcon(QString(":/images/rstray3.png")));
//smWidget->setFixedSize(256,256);
smWidget->setBaseSize( 4*24, (smileys.size()/4)*24 ); smWidget->setBaseSize( 4*24, (smileys.size()/4)*24 );
//Warning: this part of code was taken from kadu instant messenger; //Warning: this part of code was taken from kadu instant messenger;
// It was EmoticonSelector::alignTo(QWidget* w) function there // It was EmoticonSelector::alignTo(QWidget* w) function there
// comments are Polish, I dont' know how does it work... // comments are Polish, I dont' know how does it work...
// oblicz pozycj<63> widgetu do kt<6B>rego r<>wnamy // oblicz pozycj<63> widgetu do kt<6B>rego r<>wnamy
QWidget* w = ui.emoticonBtn; QWidget* w = ui.emoticonBtn;
QPoint w_pos = w->mapToGlobal(QPoint(0,0)); QPoint w_pos = w->mapToGlobal(QPoint(0,0));
// oblicz rozmiar selektora // oblicz rozmiar selektora
QSize e_size = smWidget->sizeHint(); QSize e_size = smWidget->sizeHint();
// oblicz rozmiar pulpitu // oblicz rozmiar pulpitu
QSize s_size = QApplication::desktop()->size(); QSize s_size = QApplication::desktop()->size();
// oblicz dystanse od widgetu do lewego brzegu i do prawego // oblicz dystanse od widgetu do lewego brzegu i do prawego
int l_dist = w_pos.x(); int l_dist = w_pos.x();
int r_dist = s_size.width() - (w_pos.x() + w->width()); int r_dist = s_size.width() - (w_pos.x() + w->width());
// oblicz pozycj<63> w zale<6C>no<6E>ci od tego czy po lewej stronie // oblicz pozycj<63> w zale<6C>no<6E>ci od tego czy po lewej stronie
// jest wi<77>cej miejsca czy po prawej // jest wi<77>cej miejsca czy po prawej
int x; int x;
if (l_dist >= r_dist) if (l_dist >= r_dist)
x = w_pos.x() - e_size.width(); x = w_pos.x() - e_size.width();
else else
x = w_pos.x() + w->width(); x = w_pos.x() + w->width();
// oblicz pozycj<63> y - centrujemy w pionie // oblicz pozycj<63> y - centrujemy w pionie
int y = w_pos.y() + w->height()/2 - e_size.height()/2; int y = w_pos.y() + w->height()/2 - e_size.height()/2;
// je<6A>li wychodzi poza doln<6C> kraw<61>d<EFBFBD> to r<>wnamy do niej // je<6A>li wychodzi poza doln<6C> kraw<61>d<EFBFBD> to r<>wnamy do niej
if (y + e_size.height() > s_size.height()) if (y + e_size.height() > s_size.height())
y = s_size.height() - e_size.height(); y = s_size.height() - e_size.height();
// je<6A>li wychodzi poza g<>rn<72> kraw<61>d<EFBFBD> to r<>wnamy do niej // je<6A>li wychodzi poza g<>rn<72> kraw<61>d<EFBFBD> to r<>wnamy do niej
if (y < 0) if (y < 0)
y = 0; y = 0;
// ustawiamy selektor na wyliczonej pozycji // ustawiamy selektor na wyliczonej pozycji
smWidget->move(x, y); smWidget->move(x, y);
x = 0; x = 0;
y = 0; y = 0;
QHashIterator<QString, QString> i(smileys); QHashIterator<QString, QString> i(smileys);
while(i.hasNext()) while(i.hasNext())
{
i.next();
QPushButton *smButton = new QPushButton("", smWidget);
smButton->setGeometry(x*24, y*24, 24,24);
smButton->setIconSize(QSize(24,24));
smButton->setIcon(QPixmap(i.value()));
smButton->setToolTip(i.key());
//smButton->setFixedSize(24,24);
++x;
if(x > 4)
{ {
x = 0; i.next();
y++; QPushButton *smButton = new QPushButton("", smWidget);
smButton->setGeometry(x*24, y*24, 24,24);
smButton->setIconSize(QSize(24,24));
smButton->setIcon(QPixmap(i.value()));
smButton->setToolTip(i.key());
//smButton->setFixedSize(24,24);
++x;
if(x > 4)
{
x = 0;
y++;
}
connect(smButton, SIGNAL(clicked()), this, SLOT(addSmileys()));
connect(smButton, SIGNAL(clicked()), smWidget, SLOT(close()));
} }
connect(smButton, SIGNAL(clicked()), this, SLOT(addSmileys()));
connect(smButton, SIGNAL(clicked()), smWidget, SLOT(close()));
} }
smWidget->show(); smWidget->show();

View File

@ -194,6 +194,7 @@ private:
time_t last_status_send_time ; time_t last_status_send_time ;
QHash<QString, QString> smileys; QHash<QString, QString> smileys;
QWidget *smWidget;
std::map<std::string, PopupChatDialog *> chatDialogs; std::map<std::string, PopupChatDialog *> chatDialogs;