From 414f626309449491739b2ec343f854f60a433694 Mon Sep 17 00:00:00 2001 From: Doc West Date: Wed, 4 Jul 2018 21:03:54 +0200 Subject: [PATCH] Implemented search case sensitivity --- apps/opencs/model/tools/search.cpp | 18 ++++++------ apps/opencs/model/tools/search.hpp | 7 +++-- apps/opencs/view/tools/searchbox.cpp | 43 ++++++++++++++-------------- apps/opencs/view/tools/searchbox.hpp | 2 ++ 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/apps/opencs/model/tools/search.cpp b/apps/opencs/model/tools/search.cpp index 0c068ba11..7cf89f3b5 100644 --- a/apps/opencs/model/tools/search.cpp +++ b/apps/opencs/model/tools/search.cpp @@ -22,7 +22,8 @@ void CSMTools::Search::searchTextCell (const CSMWorld::IdTableBase *model, int pos = 0; - while ((pos = text.indexOf (search, pos, Qt::CaseInsensitive))!=-1) + Qt::CaseSensitivity caseSensitivity = mCase ? Qt::CaseSensitive : Qt::CaseInsensitive; + while ((pos = text.indexOf (search, pos, caseSensitivity))!=-1) { std::ostringstream hint; hint @@ -120,25 +121,26 @@ QString CSMTools::Search::flatten (const QString& text) const return flat; } -CSMTools::Search::Search() : mType (Type_None), mValue (0), mIdColumn (0), mTypeColumn (0), +CSMTools::Search::Search() : mType (Type_None), mValue (0), mCase (false), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) {} -CSMTools::Search::Search (Type type, const std::string& value) -: mType (type), mText (value), mValue (0), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) +CSMTools::Search::Search (Type type, bool caseSensitive, const std::string& value) +: mType (type), mText (value), mValue (0), mCase (caseSensitive), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) { if (type!=Type_Text && type!=Type_Id) throw std::logic_error ("Invalid search parameter (string)"); } -CSMTools::Search::Search (Type type, const QRegExp& value) -: mType (type), mRegExp (value), mValue (0), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) +CSMTools::Search::Search (Type type, bool caseSensitive, const QRegExp& value) +: mType (type), mRegExp (value), mValue (0), mCase (caseSensitive), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) { + mRegExp.setCaseSensitivity(mCase ? Qt::CaseSensitive : Qt::CaseInsensitive); if (type!=Type_TextRegEx && type!=Type_IdRegEx) throw std::logic_error ("Invalid search parameter (RegExp)"); } -CSMTools::Search::Search (Type type, int value) -: mType (type), mValue (value), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) +CSMTools::Search::Search (Type type, bool caseSensitive, int value) +: mType (type), mValue (value), mCase (caseSensitive), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) { if (type!=Type_RecordState) throw std::logic_error ("invalid search parameter (int)"); diff --git a/apps/opencs/model/tools/search.hpp b/apps/opencs/model/tools/search.hpp index 69b98bbdb..35cfa6402 100644 --- a/apps/opencs/model/tools/search.hpp +++ b/apps/opencs/model/tools/search.hpp @@ -43,6 +43,7 @@ namespace CSMTools std::string mText; QRegExp mRegExp; int mValue; + bool mCase; std::set mColumns; int mIdColumn; int mTypeColumn; @@ -67,11 +68,11 @@ namespace CSMTools Search(); - Search (Type type, const std::string& value); + Search (Type type, bool caseSensitive, const std::string& value); - Search (Type type, const QRegExp& value); + Search (Type type, bool caseSensitive, const QRegExp& value); - Search (Type type, int value); + Search (Type type, bool caseSensitive, int value); // Configure search for the specified model. void configure (const CSMWorld::IdTableBase *model); diff --git a/apps/opencs/view/tools/searchbox.cpp b/apps/opencs/view/tools/searchbox.cpp index d98044760..0c547c880 100644 --- a/apps/opencs/view/tools/searchbox.cpp +++ b/apps/opencs/view/tools/searchbox.cpp @@ -35,7 +35,7 @@ void CSVTools::SearchBox::updateSearchButton() } CSVTools::SearchBox::SearchBox (QWidget *parent) -: QWidget (parent), mSearch ("Search"), mSearchEnabled (false), mReplace ("Replace All") +: QWidget (parent), mSearch (tr("Search")), mSearchEnabled (false), mReplace (tr("Replace All")) { mLayout = new QGridLayout (this); @@ -48,29 +48,27 @@ CSVTools::SearchBox::SearchBox (QWidget *parent) ++iter) mRecordState.addItem (QString::fromUtf8 (iter->c_str())); - mMode.addItem ("Text"); - mMode.addItem ("Text (RegEx)"); - mMode.addItem ("ID"); - mMode.addItem ("ID (RegEx)"); - mMode.addItem ("Record State"); - + mMode.addItem (tr("Text")); + mMode.addItem (tr("Text (RegEx)")); + mMode.addItem (tr("ID")); + mMode.addItem (tr("ID (RegEx)")); + mMode.addItem (tr("Record State")); + connect (&mMode, SIGNAL (activated (int)), this, SLOT (modeSelected (int))); mLayout->addWidget (&mMode, 0, 0); - mLayout->addWidget (&mSearch, 0, 3); - + connect (&mText, SIGNAL (textChanged (const QString&)), this, SLOT (textChanged (const QString&))); + connect (&mText, SIGNAL (returnPressed()), this, SLOT (startSearch())); mInput.insertWidget (0, &mText); - mInput.insertWidget (1, &mRecordState); - mLayout->addWidget (&mInput, 0, 1); - - connect (&mMode, SIGNAL (activated (int)), this, SLOT (modeSelected (int))); + mInput.insertWidget (1, &mRecordState); + mLayout->addWidget (&mInput, 0, 1); - connect (&mText, SIGNAL (textChanged (const QString&)), - this, SLOT (textChanged (const QString&))); + mCaseSensitive.setText (tr ("Case")); + connect (&mCaseSensitive, SIGNAL (toggled (bool)), this, SLOT (caseSensitiveChanged (bool))); + mLayout->addWidget (&mCaseSensitive, 0, 2); connect (&mSearch, SIGNAL (clicked (bool)), this, SLOT (startSearch (bool))); - - connect (&mText, SIGNAL (returnPressed()), this, SLOT (startSearch())); + mLayout->addWidget (&mSearch, 0, 3); // replace panel mReplaceInput.insertWidget (0, &mReplaceText); @@ -102,23 +100,24 @@ void CSVTools::SearchBox::setSearchMode (bool enabled) CSMTools::Search CSVTools::SearchBox::getSearch() const { - CSMTools::Search::Type type = static_cast (mMode.currentIndex()); - + CSMTools::Search::Type type = static_cast (mMode.currentIndex()); + bool caseSensitive = mCaseSensitive.isChecked(); + switch (type) { case CSMTools::Search::Type_Text: case CSMTools::Search::Type_Id: - return CSMTools::Search (type, std::string (mText.text().toUtf8().data())); + return CSMTools::Search (type, caseSensitive, std::string (mText.text().toUtf8().data())); case CSMTools::Search::Type_TextRegEx: case CSMTools::Search::Type_IdRegEx: - return CSMTools::Search (type, QRegExp (mText.text().toUtf8().data(), Qt::CaseInsensitive)); + return CSMTools::Search (type, caseSensitive, QRegExp (mText.text().toUtf8().data(), Qt::CaseInsensitive)); case CSMTools::Search::Type_RecordState: - return CSMTools::Search (type, mRecordState.currentIndex()); + return CSMTools::Search (type, caseSensitive, mRecordState.currentIndex()); case CSMTools::Search::Type_None: diff --git a/apps/opencs/view/tools/searchbox.hpp b/apps/opencs/view/tools/searchbox.hpp index fe56966d1..eff5296b4 100644 --- a/apps/opencs/view/tools/searchbox.hpp +++ b/apps/opencs/view/tools/searchbox.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,7 @@ namespace CSVTools QStackedWidget mInput; QLineEdit mText; QComboBox mRecordState; + QCheckBox mCaseSensitive; QPushButton mSearch; QGridLayout *mLayout; QComboBox mMode;