modernize: Prefer default member init over ctor init
[quassel.git] / src / qtui / chatviewsearchcontroller.cpp
index e21dc8a..930aea5 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2015 by the Quassel Project                        *
+ *   Copyright (C) 2005-2018 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #include "messagemodel.h"
 
 ChatViewSearchController::ChatViewSearchController(QObject *parent)
-    : QObject(parent),
-    _scene(0),
-    _currentHighlight(0),
-    _caseSensitive(false),
-    _searchSenders(false),
-    _searchMsgs(true),
-    _searchOnlyRegularMsgs(true)
+    : QObject(parent)
 {
 }
 
@@ -65,8 +59,8 @@ void ChatViewSearchController::setScene(ChatScene *scene)
         return;
 
     if (_scene) {
-        disconnect(_scene, 0, this, 0);
-        disconnect(Client::messageModel(), 0, this, 0);
+        disconnect(_scene, nullptr, this, nullptr);
+        disconnect(Client::messageModel(), nullptr, this, nullptr);
         qDeleteAll(_highlightItems);
         _highlightItems.clear();
     }
@@ -166,6 +160,30 @@ void ChatViewSearchController::updateHighlights(bool reuse)
                         _currentHighlight = start;
                         break;
                     }
+                    if (end == 0 && start == 0) {
+                        // Sometimes we can run into an issue where the start and end are both set
+                        // to zero.  Rather than endlessly spin this loop, bail out.  Search seems
+                        // to work fine.
+                        // [Test case]
+                        // Unfortunately, this seems specific to the contents of a buffer.  First,
+                        // find a buffer that you've encountered freezing, and keep track of what
+                        // was loaded, where it was, and the two most recent search terms.
+                        // For example...
+                        // 1.  Load some backlog to a buffer
+                        // 2.  Search for term with any number of matches
+                        // 3.  Making sure to -type over existing words without first backspacing-,
+                        //     search for another term with only one match
+                        // Expected: Search results found, no freezing
+                        // Actual:   Quassel hangs.  startPos and endPos = same place, start = 0,
+                        //           end = 0, _currentHighlight appears to retain values from the
+                        //           previous search.
+
+                        // Reset _currentHighlight to start, otherwise it'll retain the value from
+                        // previous search, resulting in an index-out-of-bounds error.
+                        _currentHighlight = start;
+                        // Escape from the loop!
+                        break;
+                    }
                     int pivot = (end + start) / 2;
                     QPointF pivotPos = _highlightItems[pivot]->scenePos();
                     if (startPos.y() == endPos.y()) {
@@ -333,7 +351,7 @@ void ChatViewSearchController::repositionHighlights(ChatLine *line)
 void ChatViewSearchController::sceneDestroyed()
 {
     // WARNING: don't call any methods on scene!
-    _scene = 0;
+    _scene = nullptr;
     // the items will be automatically deleted when the scene is destroyed
     // so we just have to clear the list;
     _highlightItems.clear();