1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00
qTox/src/widget/searchform.cpp
jenli669 04a9bc46f4
docs(copyright): update and add copyright info
zealously updates and adds qTox copyright information.

Fixes #5713
2019-06-28 01:18:26 +02:00

330 lines
9.4 KiB
C++

/*
Copyright © 2015-2019 by The qTox Project Contributors
This file is part of qTox, a Qt-based graphical interface for Tox.
qTox is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
qTox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with qTox. If not, see <http://www.gnu.org/licenses/>.
*/
#include "searchform.h"
#include "form/searchsettingsform.h"
#include "src/widget/style.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QKeyEvent>
#include <array>
static std::array<QString, 3> STATE_NAME = {
QString{},
QStringLiteral("green"),
QStringLiteral("red"),
};
SearchForm::SearchForm(QWidget* parent) : QWidget(parent)
{
QVBoxLayout* layout = new QVBoxLayout();
QHBoxLayout* layoutNavigation = new QHBoxLayout();
QHBoxLayout* layoutMessage = new QHBoxLayout();
QSpacerItem *lSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Ignored);
QSpacerItem *rSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Ignored);
searchLine = new LineEdit();
settings = new SearchSettingsForm();
messageLabel = new QLabel();
settings->setVisible(false);
messageLabel->setProperty("state", QStringLiteral("red"));
messageLabel->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/labels.css")));
messageLabel->setText(tr("The text could not be found."));
messageLabel->setVisible(false);
settingsButton = createButton("searchSettingsButton", "green");
upButton = createButton("searchUpButton", "green");
downButton = createButton("searchDownButton", "green");
hideButton = createButton("searchHideButton", "red");
startButton = createButton("startButton", "green");
startButton->setText(tr("Start"));
layoutNavigation->setMargin(0);
layoutNavigation->addWidget(settingsButton);
layoutNavigation->addWidget(searchLine);
layoutNavigation->addWidget(startButton);
layoutNavigation->addWidget(upButton);
layoutNavigation->addWidget(downButton);
layoutNavigation->addWidget(hideButton);
layout->addLayout(layoutNavigation);
layout->addWidget(settings);
layoutMessage->addSpacerItem(lSpacer);
layoutMessage->addWidget(messageLabel);
layoutMessage->addSpacerItem(rSpacer);
layout->addLayout(layoutMessage);
startButton->setHidden(true);
setLayout(layout);
connect(searchLine, &LineEdit::textChanged, this, &SearchForm::changedSearchPhrase);
connect(searchLine, &LineEdit::clickEnter, this, &SearchForm::clickedUp);
connect(searchLine, &LineEdit::clickShiftEnter, this, &SearchForm::clickedDown);
connect(searchLine, &LineEdit::clickEsc, this, &SearchForm::clickedHide);
connect(upButton, &QPushButton::clicked, this, &SearchForm::clickedUp);
connect(downButton, &QPushButton::clicked, this, &SearchForm::clickedDown);
connect(hideButton, &QPushButton::clicked, this, &SearchForm::clickedHide);
connect(startButton, &QPushButton::clicked, this, &SearchForm::clickedStart);
connect(settingsButton, &QPushButton::clicked, this, &SearchForm::clickedSearch);
connect(settings, &SearchSettingsForm::updateSettings, this, &SearchForm::changedState);
}
void SearchForm::removeSearchPhrase()
{
searchLine->setText("");
}
QString SearchForm::getSearchPhrase() const
{
return searchPhrase;
}
ParameterSearch SearchForm::getParameterSearch()
{
return parameter;
}
void SearchForm::setFocusEditor()
{
searchLine->setFocus();
}
void SearchForm::insertEditor(const QString &text)
{
searchLine->insert(text);
}
void SearchForm::reloadTheme()
{
settingsButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
upButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
downButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
hideButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
startButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
settings->reloadTheme();
}
void SearchForm::showEvent(QShowEvent* event)
{
QWidget::showEvent(event);
emit visibleChanged();
}
QPushButton *SearchForm::createButton(const QString& name, const QString& state)
{
QPushButton* btn = new QPushButton();
btn->setAttribute(Qt::WA_LayoutUsesWidgetRect);
btn->setObjectName(name);
btn->setProperty("state", state);
btn->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
return btn;
}
ParameterSearch SearchForm::getAndCheckParametrSearch()
{
if (isActiveSettings) {
auto sendParam = settings->getParameterSearch();
if (!isChangedPhrase && !sendParam.isUpdate) {
sendParam.period = PeriodSearch::None;
}
isChangedPhrase = false;
parameter = sendParam;
return sendParam;
}
return ParameterSearch();
}
void SearchForm::setStateName(QPushButton *btn, ToolButtonState state)
{
const auto index = static_cast<unsigned long>(state);
btn->setProperty("state", STATE_NAME[index]);
btn->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
btn->setEnabled(index != 0);
}
void SearchForm::useBeginState()
{
setStateName(upButton, ToolButtonState::Common);
setStateName(downButton, ToolButtonState::Common);
messageLabel->setVisible(false);
isPrevSearch = false;
}
void SearchForm::changedSearchPhrase(const QString& text)
{
useBeginState();
if (searchPhrase == text) {
return;
}
QString l = text.right(1);
if (!l.isEmpty() && l != " " && l[0].isSpace()) {
searchLine->setText(searchPhrase);
return;
}
searchPhrase = text;
isChangedPhrase = true;
if (isActiveSettings) {
if (startButton->isHidden()) {
changedState(true);
}
} else {
isSearchInBegin = true;
emit searchInBegin(searchPhrase, getAndCheckParametrSearch());
}
}
void SearchForm::clickedUp()
{
if (downButton->isEnabled()) {
isPrevSearch = false;
} else {
isPrevSearch = true;
setStateName(downButton, ToolButtonState::Common);
messageLabel->setVisible(false);
}
if (startButton->isHidden()) {
isSearchInBegin = false;
emit searchUp(searchPhrase, getAndCheckParametrSearch());
} else {
clickedStart();
}
}
void SearchForm::clickedDown()
{
if (upButton->isEnabled()) {
isPrevSearch = false;
} else {
isPrevSearch = true;
setStateName(upButton, ToolButtonState::Common);
messageLabel->setVisible(false);
}
if (startButton->isHidden()) {
isSearchInBegin = false;
emit searchDown(searchPhrase, getAndCheckParametrSearch());
} else {
clickedStart();
}
}
void SearchForm::clickedHide()
{
hide();
emit visibleChanged();
}
void SearchForm::clickedStart()
{
changedState(false);
isSearchInBegin = true;
emit searchInBegin(searchPhrase, getAndCheckParametrSearch());
}
void SearchForm::clickedSearch()
{
isActiveSettings = !isActiveSettings;
settings->setVisible(isActiveSettings);
useBeginState();
if (isActiveSettings) {
setStateName(settingsButton, ToolButtonState::Active);
} else {
setStateName(settingsButton, ToolButtonState::Common);
changedState(false);
}
}
void SearchForm::changedState(bool isUpdate)
{
if (isUpdate) {
startButton->setHidden(false);
upButton->setHidden(true);
downButton->setHidden(true);
} else {
startButton->setHidden(true);
upButton->setHidden(false);
downButton->setHidden(false);
}
useBeginState();
}
void SearchForm::showMessageNotFound(SearchDirection direction)
{
if (isSearchInBegin) {
if (parameter.period == PeriodSearch::AfterDate) {
setStateName(downButton, ToolButtonState::Disabled);
} else if (parameter.period == PeriodSearch::BeforeDate) {
setStateName(upButton, ToolButtonState::Disabled);
} else {
setStateName(upButton, ToolButtonState::Disabled);
setStateName(downButton, ToolButtonState::Disabled);
}
} else if (isPrevSearch) {
setStateName(upButton, ToolButtonState::Disabled);
setStateName(downButton, ToolButtonState::Disabled);
} else if (direction == SearchDirection::Up) {
setStateName(upButton, ToolButtonState::Disabled);
} else {
setStateName(downButton, ToolButtonState::Disabled);
}
messageLabel->setVisible(true);
}
LineEdit::LineEdit(QWidget* parent) : QLineEdit(parent)
{
}
void LineEdit::keyPressEvent(QKeyEvent* event)
{
int key = event->key();
if ((key == Qt::Key_Enter || key == Qt::Key_Return)) {
if ((event->modifiers() & Qt::ShiftModifier)) {
emit clickShiftEnter();
} else {
emit clickEnter();
}
} else if (key == Qt::Key_Escape) {
emit clickEsc();
}
QLineEdit::keyPressEvent(event);
}