#include "columnhandleitem.h"
#include "messagefilter.h"
#include "qtui.h"
-#include "qtuisettings.h"
+#include "chatviewsettings.h"
const qreal minContentsWidth = 200;
_singleBufferScene = filter->isSingleBufferFilter();
}
- QtUiSettings s;
- int defaultFirstColHandlePos = s.value("ChatView/DefaultFirstColumnHandlePos", 80).toInt();
- int defaultSecondColHandlePos = s.value("ChatView/DefaultSecondColumnHandlePos", 200).toInt();
+ ChatViewSettings defaultSettings;
+ int defaultFirstColHandlePos = defaultSettings.value("FirstColumnHandlePos", 80).toInt();
+ int defaultSecondColHandlePos = defaultSettings.value("SecondColumnHandlePos", 200).toInt();
- firstColHandlePos = s.value(QString("ChatView/%1/FirstColumnHandlePos").arg(_idString),
- defaultFirstColHandlePos).toInt();
- secondColHandlePos = s.value(QString("ChatView/%1/SecondColumnHandlePos").arg(_idString),
- defaultSecondColHandlePos).toInt();
+ ChatViewSettings viewSettings(this);
+ firstColHandlePos = viewSettings.value("FirstColumnHandlePos", defaultFirstColHandlePos).toInt();
+ secondColHandlePos = viewSettings.value("SecondColumnHandlePos", defaultSecondColHandlePos).toInt();
firstColHandle = new ColumnHandleItem(QtUi::style()->firstColumnSeparator());
addItem(firstColHandle);
qreal width = sceneRect().width();
bool atTop = true;
bool atBottom = false;
+ bool moveTop = false;
bool hasWidth = (width != 0);
if(start > 0) {
if(start == _lines.count())
atBottom = true;
- // right now this method doesn't properly handle messages that are inserted at an arbitrary point
- Q_ASSERT(atBottom || atTop);
-
for(int i = end; i >= start; i--) {
ChatLine *line = new ChatLine(i, model());
_lines.insert(start, line);
_lines[i]->setRow(i);
}
+ // update selection
+ if(_selectionStart >= 0) {
+ int offset = end - start + 1;
+ if(_selectionStart >= start) _selectionStart += offset;
+ if(_selectionEnd >= start) _selectionEnd += offset;
+ if(_firstSelectionRow >= start) _firstSelectionRow += offset;
+ if(_lastSelectionRow >= start) _lastSelectionRow += offset;
+ }
+
+ // neither pre- or append means we have to do dirty work: move items...
+ if(!(atTop || atBottom)) {
+ qreal offset = h;
+ int moveStart = 0;
+ int moveEnd = _lines.count() - 1;
+ ChatLine *line = 0;
+ if(end > _lines.count() - end) {
+ // move top part
+ moveTop = true;
+ offset = -offset;
+ moveEnd = end;
+ } else {
+ // move bottom part
+ moveStart = start;
+ }
+ for(int i = moveStart; i <= moveEnd; i++) {
+ line = _lines.at(i);
+ line->setPos(0, line->pos().y() + offset);
+ }
+ }
+
// update sceneRect
- if(atBottom) {
+ if(atTop || moveTop) {
+ setSceneRect(sceneRect().adjusted(0, h, 0, 0));
+ } else {
setSceneRect(sceneRect().adjusted(0, 0, 0, h));
emit sceneHeightChanged(h);
- } else {
- setSceneRect(sceneRect().adjusted(0, h, 0, 0));
}
+
}
void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) {
bool atTop = (start == 0);
bool atBottom = (end == _lines.count() - 1);
-
- // right now this method doesn't properly handle messages that are removed at an arbitrary point
- Q_ASSERT(atBottom || atTop);
+ bool moveTop = false;
// remove items from scene
QList<ChatLine *>::iterator lineIter = _lines.begin() + start;
_lines.at(i)->setRow(i);
}
+ // update selection
+ if(_selectionStart >= 0) {
+ int offset = end - start + 1;
+ if(_selectionStart >= start)
+ _selectionStart -= offset;
+ if(_selectionEnd >= start)
+ _selectionEnd -= offset;
+ if(_firstSelectionRow >= start)
+ _firstSelectionRow -= offset;
+ if(_lastSelectionRow >= start)
+ _lastSelectionRow -= offset;
+ }
+
+ // neither removing at bottom or top means we have to move items...
+ if(!(atTop || atBottom)) {
+ qreal offset = h;
+ int moveStart = 0;
+ int moveEnd = _lines.count() - 1;
+ ChatLine *line = 0;
+ if(start > _lines.count() - end) {
+ // move top part
+ moveTop = true;
+ moveEnd = start - 1;
+ } else {
+ // move bottom part
+ moveStart = start;
+ offset = -offset;
+ }
+ for(int i = moveStart; i <= moveEnd; i++) {
+ line = _lines.at(i);
+ line->setPos(0, line->pos().y() + offset);
+ }
+ }
+
// update sceneRect
- if(atBottom) {
- setSceneRect(sceneRect().adjusted(0, 0, 0, -h));
- } else {
+ if(atTop || moveTop) {
setSceneRect(sceneRect().adjusted(0, h, 0, 0));
+ } else {
+ setSceneRect(sceneRect().adjusted(0, 0, 0, -h));
}
+
}
void ChatScene::setWidth(qreal width, bool forceReposition) {
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);
+
+ ChatViewSettings viewSettings(this);
+ viewSettings.setValue("FirstColumnHandlePos", firstColHandlePos);
+ viewSettings.setValue("SecondColumnHandlePos", secondColHandlePos);
+
+ ChatViewSettings defaultSettings;
+ defaultSettings.setValue("FirstColumnHandlePos", firstColHandlePos);
+ defaultSettings.setValue("SecondColumnHandlePos", secondColHandlePos);
setWidth(width(), true); // readjust all chatlines
// we get ugly redraw errors if we don't update this explicitly... :(