Skip to content

Commit

Permalink
Add text find modes and options
Browse files Browse the repository at this point in the history
  • Loading branch information
IgKh committed Jan 28, 2024
1 parent 86503d5 commit 8074122
Show file tree
Hide file tree
Showing 5 changed files with 162 additions and 17 deletions.
1 change: 1 addition & 0 deletions assets/assets.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<file>icons/go-up.svg</file>
<file>icons/help-about.svg</file>
<file>icons/help-contents.svg</file>
<file>icons/settings-configure.svg</file>
<file>icons/window-close.svg</file>
</qresource>
</RCC>
13 changes: 13 additions & 0 deletions assets/icons/settings-configure.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
112 changes: 101 additions & 11 deletions src/katvan_searchbar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,47 @@
*/
#include "katvan_searchbar.h"

#include <QActionGroup>
#include <QCoreApplication>
#include <QHBoxLayout>
#include <QKeyEvent>
#include <QLabel>
#include <QLineEdit>
#include <QMenu>
#include <QMessageBox>
#include <QPushButton>
#include <QRegularExpression>
#include <QTextEdit>
#include <QToolButton>
#include <QValidator>

namespace katvan {

class RegexFormatValidator : public QValidator
{
public:
RegexFormatValidator(QAction* regexModeAction, QObject* parent = nullptr)
: QValidator(parent)
, d_regexModeAction(regexModeAction)
{
}

QValidator::State validate(QString& input, int&) const override
{
if (!d_regexModeAction->isChecked()) {
return QValidator::Acceptable;
}

QRegularExpression regex(input, QRegularExpression::UseUnicodePropertiesOption);
if (regex.isValid()) {
return QValidator::Acceptable;
}
return QValidator::Intermediate;
}

private:
QAction* d_regexModeAction;
};

static QString processToolTip(const QString& toolTipTemplate, const QKeySequence& shortcut)
{
QString shortcutStr = shortcut.toString(QKeySequence::NativeText);
Expand All @@ -51,25 +81,57 @@ SearchBar::SearchBar(QTextEdit* editor, QWidget* parent)

void SearchBar::setupUI()
{
QMenu* settingsMenu = new QMenu();
settingsMenu->addSection(tr("Find Type"));

QActionGroup* matchTypeGroup = new QActionGroup(this);
connect(matchTypeGroup, &QActionGroup::triggered, this, &SearchBar::checkTermIsValid);

d_normalMatchType = settingsMenu->addAction(tr("Normal"));
d_normalMatchType->setActionGroup(matchTypeGroup);
d_normalMatchType->setCheckable(true);
d_normalMatchType->setChecked(true);

d_regexMatchType = settingsMenu->addAction(tr("Regular Expression"));
d_regexMatchType->setActionGroup(matchTypeGroup);
d_regexMatchType->setCheckable(true);

d_wholeWordsMatchType = settingsMenu->addAction(tr("Whole Words"));
d_wholeWordsMatchType->setActionGroup(matchTypeGroup);
d_wholeWordsMatchType->setCheckable(true);

settingsMenu->addSeparator();

d_matchCase = settingsMenu->addAction(tr("Match Case"));
d_matchCase->setCheckable(true);

d_searchTerm = new QLineEdit();
d_searchTerm->setValidator(new RegexFormatValidator(d_regexMatchType, this));
connect(d_searchTerm, &QLineEdit::returnPressed, this, &SearchBar::findNext);
connect(d_searchTerm, &QLineEdit::textEdited, this, &SearchBar::checkTermIsValid);

QPushButton* findNextButton = new QPushButton();
QToolButton* findNextButton = new QToolButton();
findNextButton->setIcon(QIcon::fromTheme("go-down", QIcon(":/icons/go-down.svg")));
findNextButton->setShortcut(QKeySequence::FindNext);
findNextButton->setToolTip(processToolTip(tr("Go to next match (%1)"), QKeySequence::FindNext));
connect(findNextButton, &QPushButton::clicked, this, &SearchBar::findNext);
connect(findNextButton, &QToolButton::clicked, this, &SearchBar::findNext);

QPushButton* findPrevButton = new QPushButton();
QToolButton* findPrevButton = new QToolButton();
findPrevButton->setIcon(QIcon::fromTheme("go-up", QIcon(":/icons/go-up.svg")));
findPrevButton->setShortcut(QKeySequence::FindPrevious);
findPrevButton->setToolTip(processToolTip(tr("Go to previous match (%1)"), QKeySequence::FindPrevious));
connect(findPrevButton, &QPushButton::clicked, this, &SearchBar::findPrevious);
connect(findPrevButton, &QToolButton::clicked, this, &SearchBar::findPrevious);

QToolButton* settingsButton = new QToolButton();
settingsButton->setMenu(settingsMenu);
settingsButton->setPopupMode(QToolButton::InstantPopup);
settingsButton->setIcon(QIcon::fromTheme("settings-configure", QIcon(":/icons/settings-configure.svg")));
settingsButton->setToolTip(tr("Find settings"));

QPushButton* closeButton = new QPushButton();
findPrevButton->setIcon(QIcon::fromTheme("window-close", QIcon(":/icons/window-close.svg")));
findPrevButton->setToolTip(tr("Close search bar"));
connect(closeButton, &QPushButton::clicked, this, &QWidget::hide);
QToolButton* closeButton = new QToolButton();
closeButton->setIcon(QIcon::fromTheme("window-close", QIcon(":/icons/window-close.svg")));
closeButton->setToolTip(tr("Close search bar"));
connect(closeButton, &QToolButton::clicked, this, &QWidget::hide);

QHBoxLayout* layout = new QHBoxLayout(this);
layout->setContentsMargins(
Expand All @@ -82,6 +144,7 @@ void SearchBar::setupUI()
layout->addWidget(d_searchTerm, 1);
layout->addWidget(findNextButton);
layout->addWidget(findPrevButton);
layout->addWidget(settingsButton);
layout->addWidget(closeButton);
}

Expand All @@ -98,6 +161,18 @@ void SearchBar::ensureVisible()
d_searchTerm->selectAll();
}

void SearchBar::checkTermIsValid()
{
if (!d_searchTerm->hasAcceptableInput()) {
d_searchTerm->setStyleSheet("background-color: #e59596");
d_searchTerm->setToolTip(tr("Invalid regular expression entered"));
}
else {
d_searchTerm->setStyleSheet(QString());
d_searchTerm->setToolTip(QString());
}
}

void SearchBar::findNext()
{
find(true);
Expand All @@ -115,15 +190,30 @@ void SearchBar::find(bool forward)
return;
}

QRegularExpression regex;
if (d_regexMatchType->isChecked()) {
regex.setPattern(searchTerm);
regex.setPatternOptions(QRegularExpression::UseUnicodePropertiesOption);
}
else {
regex.setPattern(QRegularExpression::escape(searchTerm));
}

QTextDocument::FindFlags flags;
if (!forward) {
flags |= QTextDocument::FindBackward;
}
if (d_wholeWordsMatchType->isChecked()) {
flags |= QTextDocument::FindWholeWords;
}
if (d_matchCase->isChecked()) {
flags |= QTextDocument::FindCaseSensitively;
}

QTextDocument* document = d_editor->document();
QTextCursor cursor = d_editor->textCursor();

QTextCursor found = document->find(searchTerm, cursor, flags);
QTextCursor found = document->find(regex, cursor, flags);
if (!found.isNull()) {
d_editor->setTextCursor(found);
return;
Expand All @@ -135,7 +225,7 @@ void SearchBar::find(bool forward)
edgeCursor.movePosition(QTextCursor::End);
}

found = document->find(searchTerm, edgeCursor, flags);
found = document->find(regex, edgeCursor, flags);
if (!found.isNull()) {
d_editor->setTextCursor(found);
return;
Expand Down
6 changes: 6 additions & 0 deletions src/katvan_searchbar.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public slots:
void ensureVisible();

private slots:
void checkTermIsValid();
void findNext();
void findPrevious();

Expand All @@ -51,6 +52,11 @@ private slots:
QTextEdit* d_editor;

QLineEdit* d_searchTerm;

QAction* d_normalMatchType;
QAction* d_regexMatchType;
QAction* d_wholeWordsMatchType;
QAction* d_matchCase;
};

}
47 changes: 41 additions & 6 deletions src/translations/katvan_he.ts
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ To export the document, please correct them.</source>
<message>
<location filename="../katvan_mainwindow.cpp" line="561"/>
<source>&lt;h3&gt;Katvan&lt;/h3&gt;&lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;&lt;p&gt;A bare-bones editor for &lt;i&gt;typst&lt;/i&gt; files, with a bias for RTL&lt;/p&gt;&lt;p&gt;Version %2 (Qt %3)</source>
<translation type="unfinished">&lt;h3&gt;כתבן&lt;/h3&gt;&lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;&lt;p&gt;עורך ענייני לקבצי &lt;i&gt;typst&lt;/i&gt;, עם דגש על כתיבה מימין לשמאל&lt;/p&gt;&lt;p&gt;גרסא %2 (על בסיס גרסת Qt %3)</translation>
<translation>&lt;h3&gt;כתבן&lt;/h3&gt;&lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;&lt;p&gt;עורך ענייני לקבצי &lt;i&gt;typst&lt;/i&gt;, עם דגש על כתיבה מימין לשמאל&lt;/p&gt;&lt;p&gt;גרסא %2 (על בסיס גרסת Qt %3)</translation>
</message>
<message>
<source>&lt;p&gt;Katvan is offered under the terms of the &lt;a href=&quot;%1&quot;&gt;GNU General Public License Version 3&lt;/a&gt;&lt;/p&gt;</source>
Expand Down Expand Up @@ -306,7 +306,7 @@ To export the document, please correct them.</source>
<translation type="vanished">הבא</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="60"/>
<location filename="../katvan_searchbar.cpp" line="116"/>
<source>Go to next match (%1)</source>
<translation>עבור להתאמה הבאה (%1)</translation>
</message>
Expand All @@ -315,7 +315,7 @@ To export the document, please correct them.</source>
<translation type="vanished">הקודם</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="66"/>
<location filename="../katvan_searchbar.cpp" line="122"/>
<source>Go to previous match (%1)</source>
<translation>עבור להתאמה הקודמת (%1)</translation>
</message>
Expand All @@ -324,17 +324,52 @@ To export the document, please correct them.</source>
<translation type="vanished">סגור</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="71"/>
<location filename="../katvan_searchbar.cpp" line="85"/>
<source>Find Type</source>
<translation>סוג החיפוש</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="90"/>
<source>Normal</source>
<translation>רגיל</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="95"/>
<source>Regular Expression</source>
<translation>ביטוי רגולרי</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="99"/>
<source>Whole Words</source>
<translation>מילים שלמות</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="105"/>
<source>Match Case</source>
<translation>התאם רישיות</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="129"/>
<source>Find settings</source>
<translation>הגדרות חיפוש</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="133"/>
<source>Close search bar</source>
<translation>סגור את איזור החיפוש</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="81"/>
<location filename="../katvan_searchbar.cpp" line="143"/>
<source>Find:</source>
<translation>חפש:</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="145"/>
<location filename="../katvan_searchbar.cpp" line="168"/>
<source>Invalid regular expression entered</source>
<translation>הביטוי שהוזן אינו ביטוי רגולרי תקין</translation>
</message>
<message>
<location filename="../katvan_searchbar.cpp" line="235"/>
<source>No matches found</source>
<translation>לא נמצאו התאמות</translation>
</message>
Expand Down

0 comments on commit 8074122

Please sign in to comment.