bugfix in MessageDialog, rs could crash when removing two or more messages at once

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@3057 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2010-06-03 22:12:07 +00:00
parent 5264f46f9e
commit 08ea7232f7
2 changed files with 58 additions and 17 deletions

View File

@ -156,6 +156,23 @@ protected:
} }
}; };
MessagesDialog::LockUpdate::LockUpdate (MessagesDialog *pDialog, bool bUpdate)
{
m_pDialog = pDialog;
m_bUpdate = bUpdate;
m_pDialog->m_nLockUpdate++;
}
MessagesDialog::LockUpdate::~LockUpdate ()
{
m_pDialog->m_nLockUpdate = qMax (--m_pDialog->m_nLockUpdate, 0);
if (m_bUpdate && m_pDialog->m_nLockUpdate == 0) {
m_pDialog->insertMessages();
}
}
static int FilterColumnFromComboBox(int nIndex) static int FilterColumnFromComboBox(int nIndex)
{ {
switch (nIndex) { switch (nIndex) {
@ -205,6 +222,7 @@ MessagesDialog::MessagesDialog(QWidget *parent)
m_bProcessSettings = false; m_bProcessSettings = false;
m_bInChange = false; m_bInChange = false;
m_nLockUpdate = 0;
m_pConfig = new RSettings (CONFIG_FILE); m_pConfig = new RSettings (CONFIG_FILE);
connect( ui.messagestreeView, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( messageslistWidgetCostumPopupMenu( QPoint ) ) ); connect( ui.messagestreeView, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( messageslistWidgetCostumPopupMenu( QPoint ) ) );
@ -1216,6 +1234,10 @@ static void InitIconAndFont(RSettings *pConfig, QStandardItem *pItem [COLUMN_COU
void MessagesDialog::insertMessages() void MessagesDialog::insertMessages()
{ {
if (m_nLockUpdate) {
return;
}
std::cerr <<"MessagesDialog::insertMessages called"; std::cerr <<"MessagesDialog::insertMessages called";
fflush(0); fflush(0);
@ -1914,6 +1936,8 @@ bool MessagesDialog::getCurrentMsg(std::string &cid, std::string &mid)
void MessagesDialog::removemessage() void MessagesDialog::removemessage()
{ {
LockUpdate Lock (this, true);
QList<QModelIndex> selectedIndexList= ui.messagestreeView->selectionModel() -> selectedIndexes (); QList<QModelIndex> selectedIndexList= ui.messagestreeView->selectionModel() -> selectedIndexes ();
QList<int> rowList; QList<int> rowList;
QModelIndex selectedIndex; QModelIndex selectedIndex;
@ -1928,7 +1952,7 @@ void MessagesDialog::removemessage()
} }
bool bDelete = false; bool bDelete = false;
int listrow = ui.listWidget -> currentRow(); int listrow = ui.listWidget->currentRow();
if (listrow == ROW_TRASHBOX) { if (listrow == ROW_TRASHBOX) {
bDelete = true; bDelete = true;
} else { } else {
@ -1937,8 +1961,10 @@ void MessagesDialog::removemessage()
} }
} }
for(QList<int>::const_iterator it1(rowList.begin());it1!=rowList.end();++it1) { for(QList<int>::const_iterator it1 = rowList.begin(); it1 != rowList.end(); it1++) {
QString mid = MessagesModel->item((*it1),COLUMN_MSGID)->text(); QStandardItem *pItem = MessagesModel->item((*it1), COLUMN_MSGID);
if (pItem) {
QString mid = pItem->text();
if (bDelete) { if (bDelete) {
rsMsgs->MessageDelete(mid.toStdString()); rsMsgs->MessageDelete(mid.toStdString());
@ -1955,12 +1981,15 @@ void MessagesDialog::removemessage()
rsMsgs->MessageToTrash(mid.toStdString(), true); rsMsgs->MessageToTrash(mid.toStdString(), true);
} }
} }
}
insertMessages(); // LockUpdate -> insertMessages();
} }
void MessagesDialog::undeletemessage() void MessagesDialog::undeletemessage()
{ {
LockUpdate (this, true);
QList<int> Rows; QList<int> Rows;
getSelectedMsgCount (&Rows, NULL, NULL); getSelectedMsgCount (&Rows, NULL, NULL);
for (int nRow = 0; nRow < Rows.size(); nRow++) { for (int nRow = 0; nRow < Rows.size(); nRow++) {
@ -1968,7 +1997,7 @@ void MessagesDialog::undeletemessage()
rsMsgs->MessageToTrash(mid.toStdString(), false); rsMsgs->MessageToTrash(mid.toStdString(), false);
} }
insertMessages(); // LockUpdate -> insertMessages();
} }
void MessagesDialog::print() void MessagesDialog::print()

View File

@ -123,6 +123,17 @@ private slots:
#endif #endif
private: private:
class LockUpdate
{
public:
LockUpdate (MessagesDialog *pDialog, bool bUpdate);
~LockUpdate ();
private:
MessagesDialog *m_pDialog;
bool m_bUpdate;
};
class QStandardItemModel *MessagesModel; class QStandardItemModel *MessagesModel;
QSortFilterProxyModel *proxyModel; QSortFilterProxyModel *proxyModel;
@ -147,6 +158,7 @@ private:
#endif #endif
bool m_bProcessSettings; bool m_bProcessSettings;
bool m_bInChange; bool m_bInChange;
int m_nLockUpdate; // use with LockUpdate
enum { LIST_NOTHING, enum { LIST_NOTHING,
LIST_BOX, LIST_BOX,