/***************************************************************************
- * Copyright (C) 2005-2013 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)
{
}
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();
}
_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()) {
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();