Hide send message in Info for current chat.

This commit is contained in:
John Preston 2017-09-20 21:40:23 +03:00
parent 3db696d52f
commit e1ba9f8ff8
19 changed files with 111 additions and 65 deletions

View File

@ -335,7 +335,7 @@ bool StickersListWidget::Footer::event(QEvent *e) {
} }
} }
} }
return TWidget::event(e); return InnerFooter::event(e);
} }
void StickersListWidget::Footer::updateSelected() { void StickersListWidget::Footer::updateSelected() {

View File

@ -843,7 +843,7 @@ void DialogsWidget::setSearchInPeer(PeerData *peer, UserData *from) {
if (searchInPeerUpdated) { if (searchInPeerUpdated) {
_searchInPeer = newSearchInPeer; _searchInPeer = newSearchInPeer;
from = nullptr; from = nullptr;
controller()->searchInPeerChanged().notify(_searchInPeer, true); controller()->searchInPeer = _searchInPeer;
updateJumpToDateVisibility(); updateJumpToDateVisibility();
} else if (!_searchInPeer) { } else if (!_searchInPeer) {
from = nullptr; from = nullptr;

View File

@ -578,7 +578,7 @@ bool HistoryInner::event(QEvent *e) {
return true; return true;
} }
} }
return QWidget::event(e); return TWidget::event(e);
} }
void HistoryInner::onTouchScrollTimer() { void HistoryInner::onTouchScrollTimer() {

View File

@ -1817,7 +1817,8 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re
App::main()->dlgUpdated(wasHistory ? wasHistory->peer : nullptr, wasMsgId); App::main()->dlgUpdated(wasHistory ? wasHistory->peer : nullptr, wasMsgId);
emit historyShown(_history, _showAtMsgId); emit historyShown(_history, _showAtMsgId);
controller()->historyPeerChanged().notify(_peer, true); controller()->historyCanWrite = _canSendMessages;
controller()->historyPeer = _peer;
update(); update();
} }
@ -5913,7 +5914,7 @@ void HistoryWidget::fullPeerUpdated(PeerData *peer) {
bool newCanSendMessages = canSendMessages(_peer); bool newCanSendMessages = canSendMessages(_peer);
if (newCanSendMessages != _canSendMessages) { if (newCanSendMessages != _canSendMessages) {
_canSendMessages = newCanSendMessages; _canSendMessages = newCanSendMessages;
controller()->historyPeerCanWriteChanged().notify(_peer); controller()->historyCanWrite = _canSendMessages;
if (!_canSendMessages) { if (!_canSendMessages) {
cancelReply(); cancelReply();
} }
@ -5952,7 +5953,7 @@ void HistoryWidget::handlePeerUpdate() {
bool newCanSendMessages = canSendMessages(_peer); bool newCanSendMessages = canSendMessages(_peer);
if (newCanSendMessages != _canSendMessages) { if (newCanSendMessages != _canSendMessages) {
_canSendMessages = newCanSendMessages; _canSendMessages = newCanSendMessages;
controller()->historyPeerCanWriteChanged().notify(_peer); controller()->historyCanWrite = _canSendMessages;
if (!_canSendMessages) { if (!_canSendMessages) {
cancelReply(); cancelReply();
} }

View File

@ -30,6 +30,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
#include "ui/widgets/discrete_sliders.h" #include "ui/widgets/discrete_sliders.h"
#include "ui/widgets/shadow.h" #include "ui/widgets/shadow.h"
#include "ui/widgets/buttons.h" #include "ui/widgets/buttons.h"
#include "ui/effects/widget_fade_wrap.h"
#include "window/window_controller.h" #include "window/window_controller.h"
#include "window/main_window.h" #include "window/main_window.h"
#include "mainwindow.h" #include "mainwindow.h"
@ -44,7 +45,10 @@ NarrowWrap::NarrowWrap(
QWidget *parent, QWidget *parent,
not_null<Window::Controller*> controller, not_null<Window::Controller*> controller,
not_null<Memento*> memento) not_null<Memento*> memento)
: Window::SectionWidget(parent, controller) { : Window::SectionWidget(parent, controller)
, _topShadow(this, object_ptr<Ui::PlainShadow>(this, st::shadowFg)) {
_topShadow->hideFast();
_topShadow->raise();
setInternalState(geometry(), memento); setInternalState(geometry(), memento);
} }
@ -52,7 +56,10 @@ NarrowWrap::NarrowWrap(
QWidget *parent, QWidget *parent,
not_null<Window::Controller*> controller, not_null<Window::Controller*> controller,
not_null<MoveMemento*> memento) not_null<MoveMemento*> memento)
: Window::SectionWidget(parent, controller) { : Window::SectionWidget(parent, controller)
, _topShadow(this, object_ptr<Ui::PlainShadow>(this, st::shadowFg)) {
_topShadow->hideFast();
_topShadow->raise();
restoreState(memento); restoreState(memento);
} }
@ -102,9 +109,11 @@ rpl::producer<int> NarrowWrap::desiredHeightForContent() const {
QPixmap NarrowWrap::grabForShowAnimation( QPixmap NarrowWrap::grabForShowAnimation(
const Window::SectionSlideParams &params) { const Window::SectionSlideParams &params) {
// if (params.withTopBarShadow) _topShadow->hide(); anim::SetDisabled(true);
if (params.withTopBarShadow) _topShadow->hide();
auto result = myGrab(this); auto result = myGrab(this);
// if (params.withTopBarShadow) _topShadow->show(); if (params.withTopBarShadow) _topShadow->show();
anim::SetDisabled(false);
return result; return result;
} }
@ -112,6 +121,10 @@ void NarrowWrap::doSetInnerFocus() {
// _content->setInnerFocus(); // _content->setInnerFocus();
} }
bool NarrowWrap::hasTopBarShadow() const {
return !_topShadow->isHidden() && !_topShadow->animating();
}
bool NarrowWrap::showInternal( bool NarrowWrap::showInternal(
not_null<Window::SectionMemento*> memento) { not_null<Window::SectionMemento*> memento) {
if (auto infoMemento = dynamic_cast<Memento*>(memento.get())) { if (auto infoMemento = dynamic_cast<Memento*>(memento.get())) {

View File

@ -26,6 +26,8 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
namespace Ui { namespace Ui {
class PlainShadow; class PlainShadow;
class SettingsSlider; class SettingsSlider;
template <typename Widget>
class WidgetFadeWrap;
} // namespace Ui } // namespace Ui
namespace Info { namespace Info {
@ -58,9 +60,7 @@ public:
return peer(); return peer();
} }
bool hasTopBarShadow() const override { bool hasTopBarShadow() const override;
return true;
}
QPixmap grabForShowAnimation( QPixmap grabForShowAnimation(
const Window::SectionSlideParams &params) override; const Window::SectionSlideParams &params) override;
@ -99,7 +99,7 @@ private:
void showContent(object_ptr<ContentWidget> content); void showContent(object_ptr<ContentWidget> content);
object_ptr<TopBar> createTopBar(); object_ptr<TopBar> createTopBar();
object_ptr<Ui::PlainShadow> _topShadow = { nullptr }; object_ptr<Ui::WidgetFadeWrap<Ui::PlainShadow>> _topShadow = { nullptr };
object_ptr<ContentWidget> _content = { nullptr }; object_ptr<ContentWidget> _content = { nullptr };
object_ptr<TopBar> _topBar = { nullptr }; object_ptr<TopBar> _topBar = { nullptr };

View File

@ -120,16 +120,24 @@ object_ptr<Ui::RpWidget> InnerWidget::setupMuteToggle(
void InnerWidget::setupMainUserButtons( void InnerWidget::setupMainUserButtons(
Ui::VerticalLayout *wrap, Ui::VerticalLayout *wrap,
not_null<UserData*> user) const { not_null<UserData*> user) const {
auto sendMessage = wrap->add(object_ptr<Button>( auto sendMessage = wrap->add(object_ptr<Ui::SlideWrap<Button>>(
wrap, wrap,
Lang::Viewer(lng_profile_send_message) | ToUpperValue(), object_ptr<Button>(
st::infoMainButton)); wrap,
sendMessage->clicks() Lang::Viewer(lng_profile_send_message) | ToUpperValue(),
st::infoMainButton)));
_controller->historyPeer.value()
| rpl::map([user](PeerData *peer) { return peer == user; })
| rpl::start([sendMessage](bool peerHistoryShown) {
sendMessage->toggleAnimated(!peerHistoryShown);
}, sendMessage->lifetime());
sendMessage->entity()->clicks()
| rpl::start([this, user](auto&&) { | rpl::start([this, user](auto&&) {
_controller->showPeerHistory( _controller->showPeerHistory(
user, user,
Ui::ShowWay::Forward); Ui::ShowWay::Forward);
}, sendMessage->lifetime()); }, sendMessage->lifetime());
sendMessage->finishAnimations();
auto addContact = wrap->add(object_ptr<Ui::SlideWrap<Button>>( auto addContact = wrap->add(object_ptr<Ui::SlideWrap<Button>>(
wrap, wrap,

View File

@ -23,6 +23,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
#include <rpl/filter.h> #include <rpl/filter.h>
#include <rpl/never.h> #include <rpl/never.h>
#include <rpl/before_next.h> #include <rpl/before_next.h>
#include <rpl/after_next.h>
#include <rpl/combine.h> #include <rpl/combine.h>
#include "styles/style_info.h" #include "styles/style_info.h"
#include "profile/profile_userpic_button.h" #include "profile/profile_userpic_button.h"
@ -274,10 +275,16 @@ LabeledLine::LabeledLine(
auto layout = entity(); auto layout = entity();
auto nonEmptyText = std::move(text) auto nonEmptyText = std::move(text)
| rpl::before_next([this](const TextWithEntities &value) { | rpl::before_next([this](const TextWithEntities &value) {
toggleAnimated(!value.text.isEmpty()); if (value.text.isEmpty()) {
}) | rpl::filter([this](const TextWithEntities &value) { hideAnimated();
return !value.text.isEmpty(); }
}); })
| rpl::filter([this](const TextWithEntities &value) {
return !value.text.isEmpty();
})
| rpl::after_next([this](const TextWithEntities &value) {
showAnimated();
});
layout->add(object_ptr<Ui::FlatLabel>( layout->add(object_ptr<Ui::FlatLabel>(
this, this,
std::move(nonEmptyText), std::move(nonEmptyText),

View File

@ -20,6 +20,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/ */
#include "mainwidget.h" #include "mainwidget.h"
#include <rpl/combine.h>
#include "styles/style_dialogs.h" #include "styles/style_dialogs.h"
#include "styles/style_history.h" #include "styles/style_history.h"
#include "ui/special_buttons.h" #include "ui/special_buttons.h"
@ -168,12 +169,12 @@ MainWidget::MainWidget(
subscribe(_controller->floatPlayerAreaUpdated(), [this] { subscribe(_controller->floatPlayerAreaUpdated(), [this] {
checkFloatPlayerVisibility(); checkFloatPlayerVisibility();
}); });
subscribe(_controller->historyPeerChanged(), [this](PeerData *peer) { rpl::combine(
updateThirdColumnToCurrentPeer(peer); _controller->historyPeer.value(),
}); _controller->historyCanWrite.value())
subscribe(_controller->historyPeerCanWriteChanged(), [this](PeerData *peer) { | rpl::start([this](PeerData *peer, bool canWrite) {
updateThirdColumnToCurrentPeer(peer); updateThirdColumnToCurrentPeer(peer, canWrite);
}); }, lifetime());
QCoreApplication::instance()->installEventFilter(this); QCoreApplication::instance()->installEventFilter(this);
@ -3545,11 +3546,13 @@ void MainWidget::updateDialogsWidthAnimated() {
} }
} }
void MainWidget::updateThirdColumnToCurrentPeer(PeerData *peer) { void MainWidget::updateThirdColumnToCurrentPeer(
PeerData *peer,
bool canWrite) {
if (Adaptive::ThreeColumn() if (Adaptive::ThreeColumn()
&& Auth().data().tabbedSelectorSectionEnabled() && Auth().data().tabbedSelectorSectionEnabled()
&& peer) { && peer) {
if (!peer->canWrite()) { if (!canWrite) {
_controller->showPeerInfo( _controller->showPeerInfo(
peer, peer,
anim::type::instant, anim::type::instant,
@ -3750,7 +3753,7 @@ int MainWidget::backgroundFromY() const {
} }
void MainWidget::onHistoryShown(History *history, MsgId atMsgId) { void MainWidget::onHistoryShown(History *history, MsgId atMsgId) {
updateControlsGeometry(); // updateControlsGeometry();
dlgUpdated(history ? history->peer : nullptr, atMsgId); dlgUpdated(history ? history->peer : nullptr, atMsgId);
} }

View File

@ -505,7 +505,9 @@ private:
void updateMediaPlaylistPosition(int x); void updateMediaPlaylistPosition(int x);
void updateControlsGeometry(); void updateControlsGeometry();
void updateDialogsWidthAnimated(); void updateDialogsWidthAnimated();
void updateThirdColumnToCurrentPeer(PeerData *peer); void updateThirdColumnToCurrentPeer(
PeerData *peer,
bool canWrite);
void createPlayer(); void createPlayer();
void switchToPanelPlayer(); void switchToPanelPlayer();

View File

@ -71,6 +71,10 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
#include <gsl/gsl> #include <gsl/gsl>
#ifndef _DEBUG
#include <rpl/rpl.h>
#endif // _DEBUG
#include "base/variant.h" #include "base/variant.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/algorithm.h" #include "base/algorithm.h"

View File

@ -71,12 +71,12 @@ void AbstractButton::mouseReleaseEvent(QMouseEvent *e) {
onStateChanged(was, StateChangeSource::ByPress); onStateChanged(was, StateChangeSource::ByPress);
if (was & StateFlag::Over) { if (was & StateFlag::Over) {
_modifiers = e->modifiers(); _modifiers = e->modifiers();
_clicks.fire({});
if (_clickedCallback) { if (_clickedCallback) {
_clickedCallback(); _clickedCallback();
} else { } else {
emit clicked(); emit clicked();
} }
_clicks.fire({});
} else { } else {
setOver(false, StateChangeSource::ByHover); setOver(false, StateChangeSource::ByHover);
} }

View File

@ -116,6 +116,9 @@ bool Disabled() {
void SetDisabled(bool disabled) { void SetDisabled(bool disabled) {
AnimationsDisabled = disabled; AnimationsDisabled = disabled;
if (disabled && _manager) {
_manager->timeout();
}
} }
} // anim } // anim

View File

@ -66,7 +66,9 @@ RippleButton::RippleButton(QWidget *parent, const style::RippleAnimation &st) :
, _st(st) { , _st(st) {
} }
void RippleButton::setForceRippled(bool rippled, SetForceRippledWay way) { void RippleButton::setForceRippled(
bool rippled,
anim::type animated) {
if (_forceRippled != rippled) { if (_forceRippled != rippled) {
_forceRippled = rippled; _forceRippled = rippled;
if (_forceRippled) { if (_forceRippled) {
@ -80,7 +82,7 @@ void RippleButton::setForceRippled(bool rippled, SetForceRippledWay way) {
_ripple->lastStop(); _ripple->lastStop();
} }
} }
if (way == SetForceRippledWay::SkipAnimation && _ripple) { if (animated == anim::type::instant && _ripple) {
_ripple->lastFinish(); _ripple->lastFinish();
} }
update(); update();

View File

@ -53,12 +53,9 @@ class RippleButton : public AbstractButton {
public: public:
RippleButton(QWidget *parent, const style::RippleAnimation &st); RippleButton(QWidget *parent, const style::RippleAnimation &st);
// Displays full ripple circle constantly. void setForceRippled(
enum class SetForceRippledWay { bool rippled,
Default, anim::type animated = anim::type::normal);
SkipAnimation,
};
void setForceRippled(bool rippled, SetForceRippledWay way = SetForceRippledWay::Default);
bool forceRippled() const { bool forceRippled() const {
return _forceRippled; return _forceRippled;
} }

View File

@ -170,6 +170,7 @@ FlatLabel::FlatLabel(
, _text(st.width ? st.width : QFIXED_MAX) , _text(st.width ? st.width : QFIXED_MAX)
, _st(st) , _st(st)
, _contextCopyText(lang(lng_context_copy_text)) { , _contextCopyText(lang(lng_context_copy_text)) {
textUpdated();
std::move(text) std::move(text)
| rpl::start([this](const QString &value) { | rpl::start([this](const QString &value) {
setText(value); setText(value);
@ -184,6 +185,7 @@ FlatLabel::FlatLabel(
, _text(st.width ? st.width : QFIXED_MAX) , _text(st.width ? st.width : QFIXED_MAX)
, _st(st) , _st(st)
, _contextCopyText(lang(lng_context_copy_text)) { , _contextCopyText(lang(lng_context_copy_text)) {
textUpdated();
std::move(text) std::move(text)
| rpl::start([this](const TextWithEntities &value) { | rpl::start([this](const TextWithEntities &value) {
setMarkedText(value); setMarkedText(value);
@ -455,7 +457,7 @@ bool FlatLabel::event(QEvent *e) {
return true; return true;
} }
} }
return QWidget::event(e); return RpWidget::event(e);
} }
void FlatLabel::touchEvent(QTouchEvent *e) { void FlatLabel::touchEvent(QTouchEvent *e) {

View File

@ -21,6 +21,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
#include "window/top_bar_widget.h" #include "window/top_bar_widget.h"
#include <rpl/combine.h> #include <rpl/combine.h>
#include <rpl/combine_previous.h>
#include "styles/style_window.h" #include "styles/style_window.h"
#include "boxes/add_contact_box.h" #include "boxes/add_contact_box.h"
#include "boxes/confirm_box.h" #include "boxes/confirm_box.h"
@ -72,15 +73,28 @@ TopBarWidget::TopBarWidget(
_menuToggle->setClickedCallback([this] { showMenu(); }); _menuToggle->setClickedCallback([this] { showMenu(); });
_infoToggle->setClickedCallback([this] { toggleInfoSection(); }); _infoToggle->setClickedCallback([this] { toggleInfoSection(); });
subscribe(_controller->searchInPeerChanged(), [this](PeerData *peer) { rpl::combine(
_searchInPeer = peer; _controller->historyPeer.value(),
auto historyPeer = App::main() ? App::main()->historyPeer() : nullptr; _controller->searchInPeer.value())
_search->setForceRippled(historyPeer && historyPeer == _searchInPeer); | rpl::combine_previous(std::make_tuple(nullptr, nullptr))
}); | rpl::map([](
subscribe(_controller->historyPeerChanged(), [this](PeerData *peer) { const std::tuple<PeerData*, PeerData*> &previous,
_search->setForceRippled(peer && peer == _searchInPeer, Ui::IconButton::SetForceRippledWay::SkipAnimation); const std::tuple<PeerData*, PeerData*> &current) {
update(); auto peer = std::get<0>(current);
}); auto searchPeer = std::get<1>(current);
auto peerChanged = (peer != std::get<0>(previous));
auto searchInPeer
= (peer != nullptr) && (peer == searchPeer);
return std::make_tuple(searchInPeer, peerChanged);
})
| rpl::start([this](
bool searchInHistoryPeer,
bool peerChanged) {
auto animated = peerChanged
? anim::type::instant
: anim::type::normal;
_search->setForceRippled(searchInHistoryPeer, animated);
}, lifetime());
subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); }); subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); });
if (Adaptive::OneColumn()) { if (Adaptive::OneColumn()) {

View File

@ -84,7 +84,6 @@ private:
not_null<Window::Controller*> _controller; not_null<Window::Controller*> _controller;
PeerData *_searchInPeer = nullptr;
int _selectedCount = 0; int _selectedCount = 0;
bool _canDelete = false; bool _canDelete = false;
bool _canForward = false; bool _canForward = false;

View File

@ -20,6 +20,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/ */
#pragma once #pragma once
#include <rpl/variable.h>
#include "base/flags.h" #include "base/flags.h"
class MainWidget; class MainWidget;
@ -53,19 +54,13 @@ public:
// This is needed for History TopBar updating when searchInPeer // This is needed for History TopBar updating when searchInPeer
// is changed in the DialogsWidget of the current window. // is changed in the DialogsWidget of the current window.
base::Observable<PeerData*> &searchInPeerChanged() { rpl::variable<PeerData*> searchInPeer;
return _searchInPeerChanged;
}
// This is needed while we have one HistoryWidget and one TopBarWidget // This is needed while we have one HistoryWidget and one TopBarWidget
// for all histories we show in a window. Once each history is shown // for all histories we show in a window. Once each history is shown
// in its own HistoryWidget with its own TopBarWidget this can be removed. // in its own HistoryWidget with its own TopBarWidget this can be removed.
base::Observable<PeerData*> &historyPeerChanged() { rpl::variable<PeerData*> historyPeer;
return _historyPeerChanged; rpl::variable<bool> historyCanWrite;
}
base::Observable<PeerData*> &historyPeerCanWriteChanged() {
return _historyPeerCanWriteChanged;
}
void enableGifPauseReason(GifPauseReason reason); void enableGifPauseReason(GifPauseReason reason);
void disableGifPauseReason(GifPauseReason reason); void disableGifPauseReason(GifPauseReason reason);
@ -180,10 +175,6 @@ private:
not_null<MainWindow*> _window; not_null<MainWindow*> _window;
base::Observable<PeerData*> _searchInPeerChanged;
base::Observable<PeerData*> _historyPeerChanged;
base::Observable<PeerData*> _historyPeerCanWriteChanged;
GifPauseReasons _gifPauseReasons = 0; GifPauseReasons _gifPauseReasons = 0;
base::Observable<void> _gifPauseLevelChanged; base::Observable<void> _gifPauseLevelChanged;
base::Observable<void> _floatPlayerAreaUpdated; base::Observable<void> _floatPlayerAreaUpdated;