+void ChatView::zoomIn()
+{
+ _currentScaleFactor *= 1.2;
+ scale(1.2, 1.2);
+ scene()->setWidth(viewport()->width() / _currentScaleFactor - 2);
+}
+
+void ChatView::zoomOut()
+{
+ _currentScaleFactor /= 1.2;
+ scale(1 / 1.2, 1 / 1.2);
+ scene()->setWidth(viewport()->width() / _currentScaleFactor - 2);
+}
+
+void ChatView::zoomOriginal()
+{
+ scale(1 / _currentScaleFactor, 1 / _currentScaleFactor);
+ _currentScaleFactor = 1;
+ scene()->setWidth(viewport()->width() - 2);
+}
+
+void ChatView::invalidateFilter()
+{
+ // if this is the currently selected chatview
+ // invalidate immediately
+ if (isVisible()) {
+ _scene->filter()->invalidateFilter();
+ _invalidateFilter = false;
+ }
+ // otherwise invalidate whenever the view is shown
+ else {
+ _invalidateFilter = true;
+ }
+}
+
+void ChatView::scrollContentsBy(int dx, int dy)
+{
+ QGraphicsView::scrollContentsBy(dx, dy);
+ checkChatLineCaches();
+}
+
+void ChatView::setHasCache(ChatLine* line, bool hasCache)
+{
+ if (hasCache)
+ _linesWithCache.insert(line);
+ else
+ _linesWithCache.remove(line);
+}
+
+void ChatView::checkChatLineCaches()
+{
+ qreal top = mapToScene(viewport()->rect().topLeft()).y() - 10; // some grace area to avoid premature cleaning
+ qreal bottom = mapToScene(viewport()->rect().bottomRight()).y() + 10;
+ QSet<ChatLine*>::iterator iter = _linesWithCache.begin();
+ while (iter != _linesWithCache.end()) {
+ ChatLine* line = *iter;
+ if (line->pos().y() + line->height() < top || line->pos().y() > bottom) {
+ line->clearCache();
+ iter = _linesWithCache.erase(iter);
+ }
+ else
+ ++iter;
+ }
+}