/* This file is part of Telegram Desktop, the official desktop version of Telegram messaging app, see https://telegram.org Telegram Desktop is free 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. It 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. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library. Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org */ #include "ui/search_field_controller.h" #include "styles/style_widgets.h" #include "ui/wrap/padding_wrap.h" #include "ui/widgets/input_fields.h" #include "ui/widgets/shadow.h" #include "ui/widgets/buttons.h" #include "lang/lang_keys.h" namespace Ui { SearchFieldController::SearchFieldController(const QString &query) : _query(query) { } base::unique_qptr SearchFieldController::createRowView( QWidget *parent, const style::SearchFieldRow &st) { auto result = base::make_unique_q( parent, st.height); auto wrap = result.get(); auto field = createField(wrap, st.field).release(); field->show(); field->connect(field, &Ui::InputField::cancelled, [=] { field->setText(QString()); }); auto cancel = CreateChild( wrap, st.fieldCancel); cancel->addClickHandler([=] { field->setText(QString()); }); queryValue() | rpl::map([](const QString &value) { return !value.isEmpty(); }) | rpl::start_with_next([cancel](bool shown) { cancel->toggleAnimated(shown); }, cancel->lifetime()); cancel->finishAnimations(); auto shadow = CreateChild(wrap); shadow->show(); wrap->widthValue() | rpl::start_with_next([=, &st](int newWidth) { auto availableWidth = newWidth - st.fieldIconSkip - st.fieldCancelSkip; field->setGeometryToLeft( st.padding.left() + st.fieldIconSkip, st.padding.top(), availableWidth, field->height()); cancel->moveToRight(0, 0); shadow->setGeometry( 0, st.height - st::lineWidth, newWidth, st::lineWidth); }, wrap->lifetime()); wrap->paintRequest() | rpl::start_with_next([=, &st] { Painter p(wrap); st.fieldIcon.paint( p, st.padding.left(), st.padding.top(), wrap->width()); }, wrap->lifetime()); _view.release(); _view.reset(wrap); return std::move(result); } base::unique_qptr SearchFieldController::createField( QWidget *parent, const style::InputField &st) { auto result = base::make_unique_q( parent, st, langFactory(lng_dlg_filter), _query.current()); auto field = result.get(); field->connect(field, &Ui::InputField::changed, [=] { _query = field->getLastText(); }); _view.reset(field); return result; } } // namespace Ui