mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-20 20:34:25 -04:00
History Browser:
- Fixed crash on delete history items - Threaded load of messages git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@3599 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
9c562a97d4
commit
49320c2ed9
6 changed files with 153 additions and 21 deletions
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
#include "IMHistoryItemPainter.h"
|
#include "IMHistoryItemPainter.h"
|
||||||
|
|
||||||
IMHistoryItemPainter::IMHistoryItemPainter(QString text)
|
IMHistoryItemPainter::IMHistoryItemPainter(const QString &text)
|
||||||
{
|
{
|
||||||
itemText = text;
|
itemText = text;
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ class IMHistoryItemPainter
|
||||||
public:
|
public:
|
||||||
enum EditMode { /*Editable,*/ ReadOnly };
|
enum EditMode { /*Editable,*/ ReadOnly };
|
||||||
|
|
||||||
IMHistoryItemPainter(QString text = "");
|
IMHistoryItemPainter(const QString &text = "");
|
||||||
|
|
||||||
void paint(QPainter *painter, const QStyleOptionViewItem &option, EditMode mode) const;
|
void paint(QPainter *painter, const QStyleOptionViewItem &option, EditMode mode) const;
|
||||||
QSize sizeHint() const;
|
QSize sizeHint() const;
|
||||||
|
|
|
@ -235,7 +235,7 @@ void IMHistoryKeeper::removeMessages(QList<int> &hiids)
|
||||||
if (qFind(hiids, it->hiid) != hiids.end()) {
|
if (qFind(hiids, it->hiid) != hiids.end()) {
|
||||||
emit historyRemove(*it);
|
emit historyRemove(*it);
|
||||||
|
|
||||||
hitems.erase(it);
|
it = hitems.erase(it);
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <QTextEdit>
|
#include <QTextEdit>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
#include "ImHistoryBrowser.h"
|
#include "ImHistoryBrowser.h"
|
||||||
#include "IMHistoryItemDelegate.h"
|
#include "IMHistoryItemDelegate.h"
|
||||||
|
@ -40,6 +41,40 @@
|
||||||
#define ROLE_PLAINTEXT Qt::UserRole + 1
|
#define ROLE_PLAINTEXT Qt::UserRole + 1
|
||||||
#define ROLE_OFFLINE Qt::UserRole + 2
|
#define ROLE_OFFLINE Qt::UserRole + 2
|
||||||
|
|
||||||
|
ImHistoryBrowserCreateItemsThread::ImHistoryBrowserCreateItemsThread(ImHistoryBrowser *parent, IMHistoryKeeper &histKeeper)
|
||||||
|
: QThread(parent), m_historyKeeper(histKeeper)
|
||||||
|
{
|
||||||
|
m_historyBrowser = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImHistoryBrowserCreateItemsThread::~ImHistoryBrowserCreateItemsThread()
|
||||||
|
{
|
||||||
|
// remove all items (when items are available, the thread was terminated)
|
||||||
|
QList<QListWidgetItem*>::iterator it;
|
||||||
|
for (it = m_items.begin(); it != m_items.end(); it++) {
|
||||||
|
delete(*it);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_items.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImHistoryBrowserCreateItemsThread::run()
|
||||||
|
{
|
||||||
|
QList<IMHistoryItem> historyItems;
|
||||||
|
m_historyKeeper.getMessages(historyItems, 0);
|
||||||
|
|
||||||
|
int count = historyItems.count();
|
||||||
|
int current = 0;
|
||||||
|
|
||||||
|
foreach(IMHistoryItem item, historyItems) {
|
||||||
|
QListWidgetItem *itemWidget = m_historyBrowser->createItem(item);
|
||||||
|
if (itemWidget) {
|
||||||
|
m_items.push_back(itemWidget);
|
||||||
|
emit progress(++current, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Default constructor */
|
/** Default constructor */
|
||||||
ImHistoryBrowser::ImHistoryBrowser(const std::string &peerId, IMHistoryKeeper &histKeeper, QTextEdit *edit, QWidget *parent, Qt::WFlags flags)
|
ImHistoryBrowser::ImHistoryBrowser(const std::string &peerId, IMHistoryKeeper &histKeeper, QTextEdit *edit, QWidget *parent, Qt::WFlags flags)
|
||||||
: QDialog(parent, flags), historyKeeper(histKeeper)
|
: QDialog(parent, flags), historyKeeper(histKeeper)
|
||||||
|
@ -82,26 +117,75 @@ ImHistoryBrowser::ImHistoryBrowser(const std::string &peerId, IMHistoryKeeper &h
|
||||||
// call once
|
// call once
|
||||||
privateChatChanged(NOTIFY_LIST_PRIVATE_OUTGOING_CHAT, NOTIFY_TYPE_ADD);
|
privateChatChanged(NOTIFY_LIST_PRIVATE_OUTGOING_CHAT, NOTIFY_TYPE_ADD);
|
||||||
|
|
||||||
QList<IMHistoryItem> historyItems;
|
|
||||||
historyKeeper.getMessages(historyItems, 0);
|
|
||||||
foreach(IMHistoryItem item, historyItems) {
|
|
||||||
addItem(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray geometry = Settings->valueFromGroup("HistorieBrowser", "Geometry", QByteArray()).toByteArray();
|
QByteArray geometry = Settings->valueFromGroup("HistorieBrowser", "Geometry", QByteArray()).toByteArray();
|
||||||
if (geometry.isEmpty() == false) {
|
if (geometry.isEmpty() == false) {
|
||||||
restoreGeometry(geometry);
|
restoreGeometry(geometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
// dummy call for set butons
|
// dummy call for set buttons
|
||||||
itemSelectionChanged();
|
itemSelectionChanged();
|
||||||
|
|
||||||
ui.listWidget->installEventFilter(this);
|
ui.listWidget->installEventFilter(this);
|
||||||
|
|
||||||
|
m_createThread = new ImHistoryBrowserCreateItemsThread(this, historyKeeper);
|
||||||
|
connect(m_createThread, SIGNAL(finished()), this, SLOT(createThreadFinished()));
|
||||||
|
connect(m_createThread, SIGNAL(terminated()), this, SLOT(createThreadTerminated()));
|
||||||
|
connect(m_createThread, SIGNAL(progress(int,int)), this, SLOT(createThreadProgress(int,int)));
|
||||||
|
m_createThread->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImHistoryBrowser::~ImHistoryBrowser()
|
ImHistoryBrowser::~ImHistoryBrowser()
|
||||||
{
|
{
|
||||||
Settings->setValueToGroup("HistorieBrowser", "Geometry", saveGeometry());
|
Settings->setValueToGroup("HistorieBrowser", "Geometry", saveGeometry());
|
||||||
|
|
||||||
|
if (m_createThread) {
|
||||||
|
m_createThread->terminate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImHistoryBrowser::createThreadTerminated()
|
||||||
|
{
|
||||||
|
if (m_createThread == sender()) {
|
||||||
|
ui.progressBar->setVisible(false);
|
||||||
|
m_createThread = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImHistoryBrowser::createThreadFinished()
|
||||||
|
{
|
||||||
|
if (m_createThread == sender()) {
|
||||||
|
ui.progressBar->setVisible(false);
|
||||||
|
|
||||||
|
// append created items
|
||||||
|
QList<QListWidgetItem*>::iterator it;
|
||||||
|
for (it = m_createThread->m_items.begin(); it != m_createThread->m_items.end(); it++) {
|
||||||
|
ui.listWidget->addItem(*it);
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear list
|
||||||
|
m_createThread->m_items.clear();
|
||||||
|
|
||||||
|
filterRegExpChanged();
|
||||||
|
|
||||||
|
// dummy call for set buttons
|
||||||
|
itemSelectionChanged();
|
||||||
|
|
||||||
|
delete(m_createThread);
|
||||||
|
m_createThread = NULL;
|
||||||
|
|
||||||
|
QList<IMHistoryItem>::iterator histIt;
|
||||||
|
for (histIt = m_itemsAddedOnLoad.begin(); histIt != m_itemsAddedOnLoad.end(); histIt++) {
|
||||||
|
historyAdd(*histIt);
|
||||||
|
}
|
||||||
|
m_itemsAddedOnLoad.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImHistoryBrowser::createThreadProgress(int current, int count)
|
||||||
|
{
|
||||||
|
if (count) {
|
||||||
|
ui.progressBar->setValue(current * ui.progressBar->maximum() / count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImHistoryBrowser::eventFilter(QObject *obj, QEvent *event)
|
bool ImHistoryBrowser::eventFilter(QObject *obj, QEvent *event)
|
||||||
|
@ -122,8 +206,15 @@ bool ImHistoryBrowser::eventFilter(QObject *obj, QEvent *event)
|
||||||
|
|
||||||
void ImHistoryBrowser::historyAdd(IMHistoryItem item)
|
void ImHistoryBrowser::historyAdd(IMHistoryItem item)
|
||||||
{
|
{
|
||||||
QListWidgetItem *itemWidget = addItem(item);
|
if (m_createThread) {
|
||||||
|
// create later
|
||||||
|
m_itemsAddedOnLoad.push_back(item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QListWidgetItem *itemWidget = createItem(item);
|
||||||
if (itemWidget) {
|
if (itemWidget) {
|
||||||
|
ui.listWidget->addItem(itemWidget);
|
||||||
filterItems(itemWidget);
|
filterItems(itemWidget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,14 +281,11 @@ void ImHistoryBrowser::fillItem(QListWidgetItem *itemWidget, IMHistoryItem &item
|
||||||
QTextDocument doc;
|
QTextDocument doc;
|
||||||
doc.setHtml(item.messageText);
|
doc.setHtml(item.messageText);
|
||||||
itemWidget->setData(ROLE_PLAINTEXT, doc.toPlainText());
|
itemWidget->setData(ROLE_PLAINTEXT, doc.toPlainText());
|
||||||
|
|
||||||
filterRegExpChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QListWidgetItem *ImHistoryBrowser::addItem(IMHistoryItem &item)
|
QListWidgetItem *ImHistoryBrowser::createItem(IMHistoryItem &item)
|
||||||
{
|
{
|
||||||
QListWidgetItem *itemWidget = new QListWidgetItem;
|
QListWidgetItem *itemWidget = new QListWidgetItem;
|
||||||
ui.listWidget->addItem(itemWidget);
|
|
||||||
fillItem(itemWidget, item);
|
fillItem(itemWidget, item);
|
||||||
return itemWidget;
|
return itemWidget;
|
||||||
}
|
}
|
||||||
|
@ -415,5 +503,7 @@ void ImHistoryBrowser::privateChatChanged(int list, int type)
|
||||||
fillItem(itemWidget, item);
|
fillItem(itemWidget, item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filterRegExpChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,11 +32,14 @@
|
||||||
#include "ui_ImHistoryBrowser.h"
|
#include "ui_ImHistoryBrowser.h"
|
||||||
|
|
||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
|
class ImHistoryBrowserCreateItemsThread;
|
||||||
|
|
||||||
class ImHistoryBrowser : public QDialog
|
class ImHistoryBrowser : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
friend class ImHistoryBrowserCreateItemsThread;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Default constructor */
|
/** Default constructor */
|
||||||
ImHistoryBrowser(const std::string &peerId, IMHistoryKeeper &histKeeper, QTextEdit *edit, QWidget *parent = 0, Qt::WFlags flags = 0);
|
ImHistoryBrowser(const std::string &peerId, IMHistoryKeeper &histKeeper, QTextEdit *edit, QWidget *parent = 0, Qt::WFlags flags = 0);
|
||||||
|
@ -47,6 +50,10 @@ protected:
|
||||||
bool eventFilter(QObject *obj, QEvent *ev);
|
bool eventFilter(QObject *obj, QEvent *ev);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void createThreadTerminated();
|
||||||
|
void createThreadFinished();
|
||||||
|
void createThreadProgress(int current, int count);
|
||||||
|
|
||||||
void historyAdd(IMHistoryItem item);
|
void historyAdd(IMHistoryItem item);
|
||||||
void historyRemove(IMHistoryItem item);
|
void historyRemove(IMHistoryItem item);
|
||||||
void historyClear();
|
void historyClear();
|
||||||
|
@ -65,12 +72,14 @@ private slots:
|
||||||
void privateChatChanged(int list, int type);
|
void privateChatChanged(int list, int type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QListWidgetItem *addItem(IMHistoryItem &item);
|
QListWidgetItem *createItem(IMHistoryItem &item);
|
||||||
void fillItem(QListWidgetItem *itemWidget, IMHistoryItem &item);
|
void fillItem(QListWidgetItem *itemWidget, IMHistoryItem &item);
|
||||||
void filterItems(QListWidgetItem *item = NULL);
|
void filterItems(QListWidgetItem *item = NULL);
|
||||||
|
|
||||||
void getSelectedItems(QList<int> &items);
|
void getSelectedItems(QList<int> &items);
|
||||||
|
|
||||||
|
ImHistoryBrowserCreateItemsThread *m_createThread;
|
||||||
|
|
||||||
std::string m_peerId;
|
std::string m_peerId;
|
||||||
bool m_isPrivateChat;
|
bool m_isPrivateChat;
|
||||||
QTextEdit *textEdit;
|
QTextEdit *textEdit;
|
||||||
|
@ -79,9 +88,31 @@ private:
|
||||||
ChatStyle style;
|
ChatStyle style;
|
||||||
|
|
||||||
std::list<ChatInfo> m_savedOfflineChat;
|
std::list<ChatInfo> m_savedOfflineChat;
|
||||||
|
QList<IMHistoryItem> m_itemsAddedOnLoad;
|
||||||
|
|
||||||
/** Qt Designer generated object */
|
/** Qt Designer generated object */
|
||||||
Ui::ImHistoryBrowser ui;
|
Ui::ImHistoryBrowser ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ImHistoryBrowserCreateItemsThread : public QThread
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ImHistoryBrowserCreateItemsThread(ImHistoryBrowser *parent, IMHistoryKeeper &histKeeper);
|
||||||
|
~ImHistoryBrowserCreateItemsThread();
|
||||||
|
|
||||||
|
void run();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void progress(int current, int count);
|
||||||
|
|
||||||
|
public:
|
||||||
|
QList<QListWidgetItem*> m_items;
|
||||||
|
|
||||||
|
private:
|
||||||
|
IMHistoryKeeper &m_historyKeeper;
|
||||||
|
ImHistoryBrowser *m_historyBrowser;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -240,7 +240,7 @@ border-image: url(:/images/closepressed.png)
|
||||||
<property name="margin">
|
<property name="margin">
|
||||||
<number>9</number>
|
<number>9</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QListWidget" name="listWidget">
|
<widget class="QListWidget" name="listWidget">
|
||||||
<property name="contextMenuPolicy">
|
<property name="contextMenuPolicy">
|
||||||
<enum>Qt::CustomContextMenu</enum>
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
|
@ -250,7 +250,7 @@ border-image: url(:/images/closepressed.png)
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="2" column="0">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
<property name="topMargin">
|
<property name="topMargin">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
|
@ -283,14 +283,25 @@ border-image: url(:/images/closepressed.png)
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QProgressBar" name="progressBar">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>24</number>
|
||||||
|
</property>
|
||||||
|
<property name="textVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../images.qrc"/>
|
<include location="../images.qrc"/>
|
||||||
<include location="../images.qrc"/>
|
|
||||||
<include location="../images.qrc"/>
|
|
||||||
</resources>
|
</resources>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue