-void ChatScene::handlePositionChanged(qreal xpos) {
- bool first = (sender() == firstColHandle);
- qreal oldx;
- if(first) {
- oldx = firstColHandlePos;
- firstColHandlePos = xpos;
- } else {
- oldx = secondColHandlePos;
- secondColHandlePos = xpos;
- }
- QtUiSettings s;
- s.setValue(QString("ChatView/%1/FirstColumnHandlePos").arg(_idString), firstColHandlePos);
- s.setValue(QString("ChatView/%1/SecondColumnHandlePos").arg(_idString), secondColHandlePos);
- s.setValue(QString("ChatView/DefaultFirstColumnHandlePos"), firstColHandlePos);
- s.setValue(QString("ChatView/DefaultSecondColumnHandlePos"), secondColHandlePos);
-
- setWidth(width()); // readjust all chatlines
- // we get ugly redraw errors if we don't update this explicitly... :(
- // width() should be the same for both handles, so just use firstColHandle regardless
- update(qMin(oldx, xpos) - firstColHandle->width()/2, 0, qMax(oldx, xpos) + firstColHandle->width()/2, height());
+void ChatScene::secondHandlePositionChanged(qreal xpos) {
+ if(_secondColHandlePos == xpos)
+ return;
+
+ _secondColHandlePos = xpos;
+ ChatViewSettings viewSettings(this);
+ viewSettings.setValue("SecondColumnHandlePos", _secondColHandlePos);
+ ChatViewSettings defaultSettings;
+ defaultSettings.setValue("SecondColumnHandlePos", _secondColHandlePos);
+
+ // clock_t startT = clock();
+
+ // disabling the index while doing this complex updates is about
+ // 2 to 10 times faster!
+ //setItemIndexMethod(QGraphicsScene::NoIndex);
+
+ QList<ChatLine *>::iterator lineIter = _lines.end();
+ QList<ChatLine *>::iterator lineIterBegin = _lines.begin();
+ qreal linePos = _sceneRect.y() + _sceneRect.height();
+ qreal senderWidth = secondColumnHandle()->sceneLeft() - firstColumnHandle()->sceneRight();
+ qreal contentsWidth = _sceneRect.width() - secondColumnHandle()->sceneRight();
+ QPointF contentsPos(secondColumnHandle()->sceneRight(), 0);
+ while(lineIter != lineIterBegin) {
+ lineIter--;
+ (*lineIter)->setSecondColumn(senderWidth, contentsWidth, contentsPos, linePos);
+ }
+ //setItemIndexMethod(QGraphicsScene::BspTreeIndex);
+
+ setHandleXLimits();
+
+// clock_t endT = clock();
+// qDebug() << "resized" << _lines.count() << "in" << (float)(endT - startT) / CLOCKS_PER_SEC << "sec";
+}
+
+void ChatScene::setHandleXLimits() {
+ _firstColHandle->setXLimits(0, _secondColHandle->sceneLeft());
+ _secondColHandle->setXLimits(_firstColHandle->sceneRight(), width() - minContentsWidth);