Files
o3de/Code/Framework/AzQtComponents/AzQtComponents/Components/SearchLineEdit.cpp
T
Steve Pham 38261d0800 Shorten copyright headers by splitting into 2 lines (#2213)
* Updated all copyright headers to split the longer original copyright line into 2 shorter lines

Signed-off-by: Steve Pham <spham@amazon.com>
2021-07-16 15:25:48 -07:00

109 lines
3.3 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include "SearchLineEdit.h"
#include <AzQtComponents/Components/SearchLineEdit.h>
#include <AzQtComponents/Components/Widgets/LineEdit.h>
#include <QIcon>
#include <QAction>
#include <QMenu>
#include <QCompleter>
#include <QStyle>
using namespace AzQtComponents;
SearchLineEdit::SearchLineEdit(QWidget* parent)
: QLineEdit(parent),
m_errorState(false)
{
setProperty("class", "SearchLineEdit");
m_searchAction = new QAction(QIcon(":/stylesheet/img/16x16/Search.png"), QString(), this);
m_searchAction->setEnabled(false);
addAction(m_searchAction, QLineEdit::LeadingPosition);
}
bool SearchLineEdit::errorState() const
{
return m_errorState;
}
void SearchLineEdit::setMenu(QMenu* menu)
{
if (!menu)
{
return;
}
m_menu = menu;
removeAction(m_searchAction);
m_searchAction = new QAction(QIcon(":/stylesheet/img/16x16/Search_more.png"), QString(), this);
m_searchAction->setEnabled(true);
addAction(m_searchAction, QLineEdit::LeadingPosition);
connect(m_searchAction, &QAction::triggered, this, &SearchLineEdit::displayMenu);
}
void SearchLineEdit::setIconToolTip(const QString& tooltip)
{
m_searchAction->setToolTip(tooltip);
}
QString SearchLineEdit::userInputText() const
{
QString lineEditText = text();
// The QCompleter doesn't seem to update the completion prefix when you delete anything, only when things are added.
// To get it to update correctly when the user deletes something, I'm using the combination of things:
//
// 1) If we have a completion, that text will be auto filled into the quick filter because of the completion model.
// So, we will compare those two values, and if they match, we know we want to search using the completion prefix.
//
// 2) If they don't match, it means that user deleted something, and the Completer didn't update it's internal state, so we'll just
// use whatever is in the text box.
//
// 3) When the text field is set to empty, the current completion gets invalidated, but the prefix doesn't, so that gets special cased out.
//
// Extra fun: If you type in something, "Like" then delete a middle character, "Lie", and then put the k back in. It will auto complete the E
// visually but the completion prefix will be the entire word.
if (completer()
&& completer()->currentCompletion().compare(lineEditText, Qt::CaseInsensitive) == 0
&& !lineEditText.isEmpty())
{
lineEditText = completer()->completionPrefix();
}
return lineEditText;
}
void SearchLineEdit::setErrorState(bool errorState)
{
if (m_errorState == errorState)
{
return;
}
m_errorState = errorState;
AzQtComponents::LineEdit::setExternalError(this, errorState);
emit errorStateChanged(m_errorState);
}
void SearchLineEdit::displayMenu()
{
if (m_menu)
{
const auto rect = QRect(0,0, width(), height());
const auto actionSelected = m_menu->exec(mapToGlobal(rect.bottomLeft()));
emit menuEntryClicked(actionSelected);
}
}
#include "Components/moc_SearchLineEdit.cpp"