+void ChatScene::clearSelection() {
+ clearGlobalSelection();
+ if(selectingItem())
+ selectingItem()->clearSelection();
+}
+
+/******** *************************************************************************************/
+
+void ChatScene::requestBacklog() {
+ MessageFilter *filter = qobject_cast<MessageFilter*>(model());
+ if(filter)
+ return filter->requestBacklog();
+ return;
+}
+
+ChatLineModel::ColumnType ChatScene::columnByScenePos(qreal x) {
+ if(x < _firstColHandle->x())
+ return ChatLineModel::TimestampColumn;
+ if(x < _secondColHandle->x())
+ return ChatLineModel::SenderColumn;
+
+ return ChatLineModel::ContentsColumn;
+}
+
+int ChatScene::rowByScenePos(qreal y) {
+ // This is somewhat hacky... we look at the contents item that is at the given y position, since
+ // it has the full height. From this item, we can then determine the row index and hence the ChatLine.
+ // ChatItems cover their ChatLine, so we won't get to the latter directly.
+ ChatItem *contentItem = static_cast<ChatItem *>(itemAt(QPointF(_secondColHandle->sceneRight() + 1, y)));
+ if(!contentItem) return -1;
+ return contentItem->row();
+}
+
+void ChatScene::updateSceneRect(qreal width) {
+ if(_lines.isEmpty()) {
+ updateSceneRect(QRectF(0, 0, width, 0));
+ return;
+ }
+
+ // we hide day change messages at the top by making the scene rect smaller
+ // and by calling QGraphicsItem::hide() on all leading day change messages
+ // the first one is needed to ensure proper scrollbar ranges
+ // the second for cases where the viewport is larger then the set scenerect
+ // (in this case the items are shown anyways)
+ if(_firstLineRow == -1) {
+ int numRows = model()->rowCount();
+ _firstLineRow = 0;
+ QModelIndex firstLineIdx;
+ while(_firstLineRow < numRows) {
+ firstLineIdx = model()->index(_firstLineRow, 0);
+ if((Message::Type)(model()->data(firstLineIdx, MessageModel::TypeRole).toInt()) != Message::DayChange)
+ break;
+ _lines.at(_firstLineRow)->hide();
+ _firstLineRow++;
+ }
+ }