bulkinsert.diff
| home/sphilips/projects/quassel/src/client/messagemodel.cpp 2008-08-30 03:15:00.000000000 +0000 | ||
|---|---|---|
| 25 | 25 |
MessageModel::MessageModel(QObject *parent) |
| 26 | 26 |
: QAbstractItemModel(parent) |
| 27 | 27 |
{
|
| 28 |
_grouping = false; |
|
| 28 | 29 |
} |
| 29 | 30 | |
| 30 | 31 |
QVariant MessageModel::data(const QModelIndex &index, int role) const {
|
| ... | ... | |
| 51 | 52 |
return false; |
| 52 | 53 |
} |
| 53 | 54 | |
| 55 | ||
| 56 |
/* Functions that allow intercepting the insertMessage() function. |
|
| 57 |
This way the rest of the program can still call insertMessage() without |
|
| 58 |
knowing what's happening under the hood. */ |
|
| 59 |
void MessageModel::startGroupingMessages() {
|
|
| 60 |
_grouping = true; |
|
| 61 |
} |
|
| 62 | ||
| 63 |
void MessageModel::stopGroupingMessages() {
|
|
| 64 |
_grouping = false; |
|
| 65 |
if (_pendingList.isEmpty()) return; |
|
| 66 |
insertMessageGroup(_pendingList); |
|
| 67 |
_pendingList.clear(); |
|
| 68 |
} |
|
| 69 | ||
| 70 | ||
| 54 | 71 |
bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) {
|
| 55 | 72 |
MsgId id = msg.msgId(); |
| 56 | 73 |
int idx = indexForId(id); |
| ... | ... | |
| 59 | 76 |
return false; |
| 60 | 77 |
} |
| 61 | 78 | |
| 79 |
if (_grouping) {
|
|
| 80 |
// Prevent inserting everything backwards |
|
| 81 |
if (!_pendingList.isEmpty() && _pendingList.first().msgId() > id) |
|
| 82 |
_pendingList.prepend(msg); |
|
| 83 |
else |
|
| 84 |
_pendingList.append(msg); |
|
| 85 |
return true; |
|
| 86 |
} |
|
| 87 | ||
| 88 |
// Grouping is disabled, insert it the normal way. |
|
| 62 | 89 |
MessageModelItem *item = createMessageModelItem(msg); |
| 63 | 90 |
beginInsertRows(QModelIndex(), idx, idx); |
| 64 | 91 |
_messageList.insert(idx, item); |
| ... | ... | |
| 66 | 93 |
return true; |
| 67 | 94 |
} |
| 68 | 95 | |
| 96 | ||
| 97 |
void MessageModel::insertMessageGroup(const QList<Message> &msglist) {
|
|
| 98 |
if(msglist.isEmpty()) return; |
|
| 99 | ||
| 100 |
//qDebug() << "Inserting Group: " << msglist.count(); |
|
| 101 | ||
| 102 |
int idx = indexForId(msglist.first().msgId()); |
|
| 103 |
beginInsertRows(QModelIndex(), idx, idx+msglist.count()-1); |
|
| 104 | ||
| 105 |
foreach(Message msg, msglist) {
|
|
| 106 |
MessageModelItem *item = createMessageModelItem(msg); |
|
| 107 |
_messageList.insert(idx, item); |
|
| 108 |
idx++; |
|
| 109 |
} |
|
| 110 | ||
| 111 |
endInsertRows(); |
|
| 112 |
} |
|
| 113 | ||
| 114 | ||
| 115 | ||
| 116 |
// Old code, not sure if this is doing something or not. |
|
| 69 | 117 |
void MessageModel::insertMessages(const QList<Message> &msglist) {
|
| 70 | 118 |
if(msglist.isEmpty()) return; |
| 119 | ||
| 71 | 120 |
// FIXME make this more efficient by grouping msgs |
| 72 | 121 |
foreach(Message msg, msglist) |
| 73 | 122 |
insertMessage(msg); |
| 74 | 123 |
} |
| 75 | 124 | |
| 125 | ||
| 76 | 126 |
void MessageModel::clear() {
|
| 77 | 127 |
beginRemoveRows(QModelIndex(), 0, rowCount() - 1); |
| 78 | 128 |
qDeleteAll(_messageList); |
| ... | ... | |
| 80 | 130 |
endRemoveRows(); |
| 81 | 131 |
} |
| 82 | 132 | |
| 133 | ||
| 83 | 134 |
// returns index of msg with given Id or of the next message after that (i.e., the index where we'd insert this msg) |
| 84 | 135 |
int MessageModel::indexForId(MsgId id) {
|
| 85 | 136 |
if(_messageList.isEmpty() || id <= _messageList.value(0)->data(0, MsgIdRole).value<MsgId>()) return 0; |
| home/sphilips/projects/quassel/src/client/messagemodel.h 2008-08-30 01:53:12.000000000 +0000 | ||
|---|---|---|
| 65 | 65 | |
| 66 | 66 |
bool insertMessage(const Message &, bool fakeMsg = false); |
| 67 | 67 |
void insertMessages(const QList<Message> &); |
| 68 |
void insertMessageGroup(const QList<Message> &); |
|
| 69 | ||
| 70 |
void startGroupingMessages(); |
|
| 71 |
void stopGroupingMessages(); |
|
| 68 | 72 | |
| 69 | 73 |
void clear(); |
| 70 | 74 | |
| ... | ... | |
| 73 | 77 | |
| 74 | 78 |
private: |
| 75 | 79 |
QList<MessageModelItem *> _messageList; |
| 80 |
QList<Message> _pendingList; // About to be inserted. |
|
| 81 | ||
| 82 |
bool _grouping; |
|
| 76 | 83 | |
| 77 | 84 |
int indexForId(MsgId); |
| 78 | 85 |
}; |
| home/sphilips/projects/quassel/src/qtui/chatline.cpp 2008-08-30 03:05:18.000000000 +0000 | ||
|---|---|---|
| 113 | 113 |
void ChatLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
|
| 114 | 114 |
Q_UNUSED(option); |
| 115 | 115 |
Q_UNUSED(widget); |
| 116 | ||
| 117 |
// Some tweaks. They gain us a few ms, but every bit helps. |
|
| 118 |
painter->setPen(Qt::NoPen); // Apparently, using a Pen is slow when drawing text. |
|
| 119 |
painter->setClipRect(option->exposedRect); // Don't repaint things that don't have to be repainted. |
|
| 120 | ||
| 116 | 121 |
if(_selection & Highlighted) {
|
| 117 | 122 |
painter->fillRect(boundingRect(), QBrush(QtUi::style()->highlightColor())); |
| 118 | 123 |
} |
| home/sphilips/projects/quassel/src/qtui/chatview.cpp 2008-08-30 03:08:06.000000000 +0000 | ||
|---|---|---|
| 50 | 50 |
setAlignment(Qt::AlignBottom); |
| 51 | 51 |
setInteractive(true); |
| 52 | 52 | |
| 53 |
// We don't need any of those as we just draw text and horizontal/vertical lines. |
|
| 54 |
setOptimizationFlag(QGraphicsView::DontClipPainter); |
|
| 55 |
setOptimizationFlag(QGraphicsView::DontSavePainterState); |
|
| 56 |
setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing); |
|
| 57 | ||
| 58 |
// Not sure which of these two is the fastest. |
|
| 59 |
//setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); |
|
| 60 |
setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); |
|
| 61 | ||
| 53 | 62 |
_scene = new ChatScene(filter, filter->idString(), this); |
| 54 | 63 |
connect(_scene, SIGNAL(heightChangedAt(qreal, qreal)), this, SLOT(sceneHeightChangedAt(qreal, qreal))); |
| 55 | 64 |
setScene(_scene); |
| home/sphilips/projects/quassel/src/qtui/qtuimessageprocessor.cpp 2008-08-30 02:56:10.000000000 +0000 | ||
|---|---|---|
| 82 | 82 | |
| 83 | 83 |
void QtUiMessageProcessor::processNextMessage() {
|
| 84 | 84 |
if(_currentBatch.isEmpty()) {
|
| 85 |
Client::messageModel()->stopGroupingMessages(); |
|
| 85 | 86 |
if(_processQueue.isEmpty()) {
|
| 86 | 87 |
_processTimer.stop(); |
| 87 | 88 |
_processing = false; |
| ... | ... | |
| 90 | 91 |
return; |
| 91 | 92 |
} |
| 92 | 93 |
_currentBatch = _processQueue.takeFirst(); |
| 94 |
if (_currentBatch.count() > 1) // Otherwise it's a waste of resources |
|
| 95 |
Client::messageModel()->startGroupingMessages(); |
|
| 93 | 96 |
} |
| 94 | 97 |
Message msg = _currentBatch.takeFirst(); |
| 95 | 98 |
process(msg); |
| ... | ... | |
| 125 | 128 |
nickList = myIdentity->nicks(); |
| 126 | 129 |
} |
| 127 | 130 |
foreach(QString nickname, nickList) {
|
| 128 |
QRegExp nickRegExp("^(.*\\W)?" + QRegExp::escape(nickname) + "(\\W.*)?$");
|
|
| 131 |
QRegExp nickRegExp("^(?:.*\\W)?" + QRegExp::escape(nickname) + "(?:\\W.*)?$");
|
|
| 129 | 132 |
if(nickRegExp.exactMatch(msg.contents())) {
|
| 130 | 133 |
msg.setFlags(msg.flags() | Message::Highlight); |
| 131 | 134 |
return; |
| ... | ... | |
| 135 | 138 |
for(int i = 0; i < _highlightRules.count(); i++) {
|
| 136 | 139 |
const HighlightRule &rule = _highlightRules[i]; |
| 137 | 140 |
if(!rule.isEnabled) |
| 138 |
continue;
|
|
| 141 |
continue;
|
|
| 139 | 142 | |
| 140 | 143 |
QRegExp userRegExp; |
| 141 | 144 |
if(rule.isRegExp) {
|
| 142 | 145 |
userRegExp = QRegExp(rule.name, rule.caseSensitive); |
| 143 | 146 |
} else {
|
| 144 |
userRegExp = QRegExp("^(.*\\W)?" + QRegExp::escape(rule.name) + "(\\W.*)?$", rule.caseSensitive);
|
|
| 147 |
userRegExp = QRegExp("^(?:.*\\W)?" + QRegExp::escape(rule.name) + "(?:\\W.*)?$", rule.caseSensitive);
|
|
| 145 | 148 |
} |
| 146 | 149 |
if(userRegExp.exactMatch(msg.contents())) {
|
| 147 | 150 |
msg.setFlags(msg.flags() | Message::Highlight); |