forked from qt-creator/qt-creator
Show wrap indicator when searching in text edits.
Adds a showWrapIndicator(parent) method to IFindSupport, to be used by implementations. First implementation is given for the BaseFindSupport that's used for all searches in Q(Plain)TextEdits. Task-number: QTCREATORBUG-2753
This commit is contained in:
@@ -50,26 +50,32 @@ struct BaseTextFindPrivate {
|
|||||||
|
|
||||||
QPointer<QTextEdit> m_editor;
|
QPointer<QTextEdit> m_editor;
|
||||||
QPointer<QPlainTextEdit> m_plaineditor;
|
QPointer<QPlainTextEdit> m_plaineditor;
|
||||||
|
QPointer<QWidget> m_widget;
|
||||||
QTextCursor m_findScopeStart;
|
QTextCursor m_findScopeStart;
|
||||||
QTextCursor m_findScopeEnd;
|
QTextCursor m_findScopeEnd;
|
||||||
int m_findScopeVerticalBlockSelectionFirstColumn;
|
int m_findScopeVerticalBlockSelectionFirstColumn;
|
||||||
int m_findScopeVerticalBlockSelectionLastColumn;
|
int m_findScopeVerticalBlockSelectionLastColumn;
|
||||||
int m_incrementalStartPos;
|
int m_incrementalStartPos;
|
||||||
|
bool m_incrementalWrappedState;
|
||||||
};
|
};
|
||||||
|
|
||||||
BaseTextFindPrivate::BaseTextFindPrivate(QTextEdit *editor)
|
BaseTextFindPrivate::BaseTextFindPrivate(QTextEdit *editor)
|
||||||
: m_editor(editor)
|
: m_editor(editor)
|
||||||
|
, m_widget(editor)
|
||||||
, m_findScopeVerticalBlockSelectionFirstColumn(-1)
|
, m_findScopeVerticalBlockSelectionFirstColumn(-1)
|
||||||
, m_findScopeVerticalBlockSelectionLastColumn(-1)
|
, m_findScopeVerticalBlockSelectionLastColumn(-1)
|
||||||
, m_incrementalStartPos(-1)
|
, m_incrementalStartPos(-1)
|
||||||
|
, m_incrementalWrappedState(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseTextFindPrivate::BaseTextFindPrivate(QPlainTextEdit *editor)
|
BaseTextFindPrivate::BaseTextFindPrivate(QPlainTextEdit *editor)
|
||||||
: m_plaineditor(editor)
|
: m_plaineditor(editor)
|
||||||
|
, m_widget(editor)
|
||||||
, m_findScopeVerticalBlockSelectionFirstColumn(-1)
|
, m_findScopeVerticalBlockSelectionFirstColumn(-1)
|
||||||
, m_findScopeVerticalBlockSelectionLastColumn(-1)
|
, m_findScopeVerticalBlockSelectionLastColumn(-1)
|
||||||
, m_incrementalStartPos(-1)
|
, m_incrementalStartPos(-1)
|
||||||
|
, m_incrementalWrappedState(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,6 +133,7 @@ Find::FindFlags BaseTextFind::supportedFindFlags() const
|
|||||||
void BaseTextFind::resetIncrementalSearch()
|
void BaseTextFind::resetIncrementalSearch()
|
||||||
{
|
{
|
||||||
d->m_incrementalStartPos = -1;
|
d->m_incrementalStartPos = -1;
|
||||||
|
d->m_incrementalWrappedState = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseTextFind::clearResults()
|
void BaseTextFind::clearResults()
|
||||||
@@ -174,7 +181,13 @@ IFindSupport::Result BaseTextFind::findIncremental(const QString &txt, Find::Fin
|
|||||||
if (d->m_incrementalStartPos < 0)
|
if (d->m_incrementalStartPos < 0)
|
||||||
d->m_incrementalStartPos = cursor.selectionStart();
|
d->m_incrementalStartPos = cursor.selectionStart();
|
||||||
cursor.setPosition(d->m_incrementalStartPos);
|
cursor.setPosition(d->m_incrementalStartPos);
|
||||||
bool found = find(txt, findFlags, cursor);
|
bool wrapped = false;
|
||||||
|
bool found = find(txt, findFlags, cursor, &wrapped);
|
||||||
|
if (wrapped != d->m_incrementalWrappedState) {
|
||||||
|
d->m_incrementalWrappedState = wrapped;
|
||||||
|
if (found)
|
||||||
|
showWrapIndicator(d->m_widget);
|
||||||
|
}
|
||||||
if (found)
|
if (found)
|
||||||
emit highlightAll(txt, findFlags);
|
emit highlightAll(txt, findFlags);
|
||||||
else
|
else
|
||||||
@@ -184,9 +197,14 @@ IFindSupport::Result BaseTextFind::findIncremental(const QString &txt, Find::Fin
|
|||||||
|
|
||||||
IFindSupport::Result BaseTextFind::findStep(const QString &txt, Find::FindFlags findFlags)
|
IFindSupport::Result BaseTextFind::findStep(const QString &txt, Find::FindFlags findFlags)
|
||||||
{
|
{
|
||||||
bool found = find(txt, findFlags, textCursor());
|
bool wrapped = false;
|
||||||
if (found)
|
bool found = find(txt, findFlags, textCursor(), &wrapped);
|
||||||
|
if (wrapped)
|
||||||
|
showWrapIndicator(d->m_widget);
|
||||||
|
if (found) {
|
||||||
d->m_incrementalStartPos = textCursor().selectionStart();
|
d->m_incrementalStartPos = textCursor().selectionStart();
|
||||||
|
d->m_incrementalWrappedState = false;
|
||||||
|
}
|
||||||
return found ? Found : NotFound;
|
return found ? Found : NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,7 +238,11 @@ bool BaseTextFind::replaceStep(const QString &before, const QString &after,
|
|||||||
Find::FindFlags findFlags)
|
Find::FindFlags findFlags)
|
||||||
{
|
{
|
||||||
QTextCursor cursor = replaceInternal(before, after, findFlags);
|
QTextCursor cursor = replaceInternal(before, after, findFlags);
|
||||||
return find(before, findFlags, cursor);
|
bool wrapped = false;
|
||||||
|
bool found = find(before, findFlags, cursor, &wrapped);
|
||||||
|
if (wrapped)
|
||||||
|
showWrapIndicator(d->m_widget);
|
||||||
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BaseTextFind::replaceAll(const QString &before, const QString &after,
|
int BaseTextFind::replaceAll(const QString &before, const QString &after,
|
||||||
@@ -254,7 +276,7 @@ int BaseTextFind::replaceAll(const QString &before, const QString &after,
|
|||||||
|
|
||||||
bool BaseTextFind::find(const QString &txt,
|
bool BaseTextFind::find(const QString &txt,
|
||||||
Find::FindFlags findFlags,
|
Find::FindFlags findFlags,
|
||||||
QTextCursor start)
|
QTextCursor start, bool *wrapped)
|
||||||
{
|
{
|
||||||
if (txt.isEmpty()) {
|
if (txt.isEmpty()) {
|
||||||
setTextCursor(start);
|
setTextCursor(start);
|
||||||
@@ -264,11 +286,15 @@ bool BaseTextFind::find(const QString &txt,
|
|||||||
regexp.setPatternSyntax((findFlags&Find::FindRegularExpression) ? QRegExp::RegExp : QRegExp::FixedString);
|
regexp.setPatternSyntax((findFlags&Find::FindRegularExpression) ? QRegExp::RegExp : QRegExp::FixedString);
|
||||||
regexp.setCaseSensitivity((findFlags&Find::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive);
|
regexp.setCaseSensitivity((findFlags&Find::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive);
|
||||||
QTextCursor found = findOne(regexp, start, Find::textDocumentFlagsForFindFlags(findFlags));
|
QTextCursor found = findOne(regexp, start, Find::textDocumentFlagsForFindFlags(findFlags));
|
||||||
|
if (wrapped)
|
||||||
|
*wrapped = false;
|
||||||
|
|
||||||
if (!d->m_findScopeStart.isNull()) {
|
if (!d->m_findScopeStart.isNull()) {
|
||||||
|
|
||||||
// scoped
|
// scoped
|
||||||
if (found.isNull() || !inScope(found.selectionStart(), found.selectionEnd())) {
|
if (found.isNull() || !inScope(found.selectionStart(), found.selectionEnd())) {
|
||||||
|
if (wrapped)
|
||||||
|
*wrapped = true;
|
||||||
if ((findFlags&Find::FindBackward) == 0)
|
if ((findFlags&Find::FindBackward) == 0)
|
||||||
start.setPosition(d->m_findScopeStart.position());
|
start.setPosition(d->m_findScopeStart.position());
|
||||||
else
|
else
|
||||||
@@ -281,6 +307,8 @@ bool BaseTextFind::find(const QString &txt,
|
|||||||
|
|
||||||
// entire document
|
// entire document
|
||||||
if (found.isNull()) {
|
if (found.isNull()) {
|
||||||
|
if (wrapped)
|
||||||
|
*wrapped = true;
|
||||||
if ((findFlags&Find::FindBackward) == 0)
|
if ((findFlags&Find::FindBackward) == 0)
|
||||||
start.movePosition(QTextCursor::Start);
|
start.movePosition(QTextCursor::Start);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -85,7 +85,8 @@ signals:
|
|||||||
private:
|
private:
|
||||||
bool find(const QString &txt,
|
bool find(const QString &txt,
|
||||||
Find::FindFlags findFlags,
|
Find::FindFlags findFlags,
|
||||||
QTextCursor start);
|
QTextCursor start,
|
||||||
|
bool *wrapped);
|
||||||
QTextCursor replaceInternal(const QString &before, const QString &after,
|
QTextCursor replaceInternal(const QString &before, const QString &after,
|
||||||
Find::FindFlags findFlags);
|
Find::FindFlags findFlags);
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ SOURCES += findtoolwindow.cpp \
|
|||||||
searchresulttreemodel.cpp \
|
searchresulttreemodel.cpp \
|
||||||
searchresulttreeview.cpp \
|
searchresulttreeview.cpp \
|
||||||
searchresultwindow.cpp \
|
searchresultwindow.cpp \
|
||||||
ifindfilter.cpp
|
ifindfilter.cpp \
|
||||||
|
ifindsupport.cpp
|
||||||
FORMS += findwidget.ui \
|
FORMS += findwidget.ui \
|
||||||
finddialog.ui
|
finddialog.ui
|
||||||
RESOURCES += find.qrc
|
RESOURCES += find.qrc
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/find" >
|
<qresource prefix="/find">
|
||||||
<file>images/casesensitively.png</file>
|
<file>images/casesensitively.png</file>
|
||||||
<file>images/wholewords.png</file>
|
<file>images/wholewords.png</file>
|
||||||
<file>images/regexp.png</file>
|
<file>images/regexp.png</file>
|
||||||
<file>images/expand.png</file>
|
<file>images/expand.png</file>
|
||||||
|
<file>images/wrapindicator.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
102
src/plugins/find/ifindsupport.cpp
Normal file
102
src/plugins/find/ifindsupport.cpp
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||||
|
**
|
||||||
|
** No Commercial Usage
|
||||||
|
**
|
||||||
|
** This file contains pre-release code and may not be distributed.
|
||||||
|
** You may use this file in accordance with the terms and conditions
|
||||||
|
** contained in the Technology Preview License Agreement accompanying
|
||||||
|
** this package.
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||||
|
** General Public License version 2.1 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||||
|
** packaging of this file. Please review the following information to
|
||||||
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||||
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||||
|
**
|
||||||
|
** In addition, as a special exception, Nokia gives you certain additional
|
||||||
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||||
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||||
|
**
|
||||||
|
** If you have questions regarding the use of this file, please contact
|
||||||
|
** Nokia at qt-info@nokia.com.
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "ifindsupport.h"
|
||||||
|
|
||||||
|
#include <QtCore/QTimer>
|
||||||
|
#include <QtCore/QPropertyAnimation>
|
||||||
|
#include <QtGui/QWidget>
|
||||||
|
#include <QtGui/QPaintEvent>
|
||||||
|
#include <QtGui/QPainter>
|
||||||
|
|
||||||
|
namespace Find {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class WrapIndicator : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity USER true)
|
||||||
|
|
||||||
|
public:
|
||||||
|
WrapIndicator(QWidget *parent = 0)
|
||||||
|
: QWidget(parent),
|
||||||
|
m_opacity(1.0)
|
||||||
|
{
|
||||||
|
if (parent)
|
||||||
|
setGeometry(QRect(parent->rect().center() - QPoint(25, 25),
|
||||||
|
parent->rect().center() + QPoint(25, 25)));
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal opacity() const { return m_opacity; }
|
||||||
|
void setOpacity(qreal value) { m_opacity = value; update(); }
|
||||||
|
|
||||||
|
void run()
|
||||||
|
{
|
||||||
|
show();
|
||||||
|
QTimer::singleShot(300, this, SLOT(runInternal()));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent *)
|
||||||
|
{
|
||||||
|
static QPixmap foreground(QLatin1String(":/find/images/wrapindicator.png"));
|
||||||
|
QPainter p(this);
|
||||||
|
p.setOpacity(m_opacity);
|
||||||
|
p.drawPixmap(rect(), foreground);
|
||||||
|
}
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void runInternal()
|
||||||
|
{
|
||||||
|
QPropertyAnimation *anim = new QPropertyAnimation(this, "opacity", this);
|
||||||
|
anim->setDuration(200);
|
||||||
|
anim->setEndValue(0.);
|
||||||
|
connect(anim, SIGNAL(finished()), this, SLOT(deleteLater()));
|
||||||
|
anim->start(QAbstractAnimation::DeleteWhenStopped);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
qreal m_opacity;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // Internal
|
||||||
|
} // Find
|
||||||
|
|
||||||
|
using namespace Find;
|
||||||
|
|
||||||
|
void IFindSupport::showWrapIndicator(QWidget *parent)
|
||||||
|
{
|
||||||
|
(new Internal::WrapIndicator(parent))->run();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "ifindsupport.moc"
|
||||||
@@ -73,6 +73,8 @@ public:
|
|||||||
virtual void defineFindScope(){}
|
virtual void defineFindScope(){}
|
||||||
virtual void clearFindScope(){}
|
virtual void clearFindScope(){}
|
||||||
|
|
||||||
|
static void showWrapIndicator(QWidget *parent);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void changed();
|
void changed();
|
||||||
};
|
};
|
||||||
|
|||||||
BIN
src/plugins/find/images/wrapindicator.png
Normal file
BIN
src/plugins/find/images/wrapindicator.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Reference in New Issue
Block a user