diff --git a/Telegram/SourceFiles/base/flat_set.h b/Telegram/SourceFiles/base/flat_set.h index 661350d52e..1a5061b147 100644 --- a/Telegram/SourceFiles/base/flat_set.h +++ b/Telegram/SourceFiles/base/flat_set.h @@ -32,10 +32,10 @@ template > class flat_multi_set; template -class flat_multi_set_iterator_base_impl; +class flat_multi_set_iterator_impl; template -class flat_multi_set_iterator_base_impl { +class flat_multi_set_iterator_impl { public: using iterator_category = typename iterator_impl::iterator_category; @@ -44,12 +44,12 @@ public: using pointer = typename flat_multi_set::pointer; using reference = typename flat_multi_set::reference; - flat_multi_set_iterator_base_impl(iterator_impl impl = iterator_impl()) + flat_multi_set_iterator_impl(iterator_impl impl = iterator_impl()) : _impl(impl) { } template - flat_multi_set_iterator_base_impl( - const flat_multi_set_iterator_base_impl< + flat_multi_set_iterator_impl( + const flat_multi_set_iterator_impl< Type, Compare, other_iterator_impl> &other) : _impl(other._impl) { @@ -61,37 +61,37 @@ public: pointer operator->() const { return std::addressof(**this); } - flat_multi_set_iterator_base_impl &operator++() { + flat_multi_set_iterator_impl &operator++() { ++_impl; return *this; } - flat_multi_set_iterator_base_impl operator++(int) { + flat_multi_set_iterator_impl operator++(int) { return _impl++; } - flat_multi_set_iterator_base_impl &operator--() { + flat_multi_set_iterator_impl &operator--() { --_impl; return *this; } - flat_multi_set_iterator_base_impl operator--(int) { + flat_multi_set_iterator_impl operator--(int) { return _impl--; } - flat_multi_set_iterator_base_impl &operator+=(difference_type offset) { + flat_multi_set_iterator_impl &operator+=(difference_type offset) { _impl += offset; return *this; } - flat_multi_set_iterator_base_impl operator+(difference_type offset) const { + flat_multi_set_iterator_impl operator+(difference_type offset) const { return _impl + offset; } - flat_multi_set_iterator_base_impl &operator-=(difference_type offset) { + flat_multi_set_iterator_impl &operator-=(difference_type offset) { _impl -= offset; return *this; } - flat_multi_set_iterator_base_impl operator-(difference_type offset) const { + flat_multi_set_iterator_impl operator-(difference_type offset) const { return _impl - offset; } template difference_type operator-( - const flat_multi_set_iterator_base_impl< + const flat_multi_set_iterator_impl< Type, Compare, other_iterator_impl> &right) const { @@ -103,7 +103,7 @@ public: template bool operator==( - const flat_multi_set_iterator_base_impl< + const flat_multi_set_iterator_impl< Type, Compare, other_iterator_impl> &right) const { @@ -111,7 +111,7 @@ public: } template bool operator!=( - const flat_multi_set_iterator_base_impl< + const flat_multi_set_iterator_impl< Type, Compare, other_iterator_impl> &right) const { @@ -119,7 +119,7 @@ public: } template bool operator<( - const flat_multi_set_iterator_base_impl< + const flat_multi_set_iterator_impl< Type, Compare, other_iterator_impl> &right) const { @@ -135,7 +135,7 @@ private: typename OtherType, typename OtherCompare, typename other_iterator_impl> - friend class flat_multi_set_iterator_base_impl; + friend class flat_multi_set_iterator_impl; Type &wrapped() { return _impl->wrapped(); @@ -214,23 +214,6 @@ class flat_multi_set { using impl = std::deque; - using iterator_base = flat_multi_set_iterator_base_impl< - Type, - Compare, - typename impl::iterator>; - using const_iterator_base = flat_multi_set_iterator_base_impl< - Type, - Compare, - typename impl::const_iterator>; - using reverse_iterator_base = flat_multi_set_iterator_base_impl< - Type, - Compare, - typename impl::reverse_iterator>; - using const_reverse_iterator_base = flat_multi_set_iterator_base_impl< - Type, - Compare, - typename impl::const_reverse_iterator>; - public: using value_type = Type; using size_type = typename impl::size_type; @@ -238,26 +221,22 @@ public: using pointer = const Type*; using reference = const Type&; - class iterator : public iterator_base { - public: - using iterator_base::iterator_base; - - }; - class const_iterator : public const_iterator_base { - public: - using const_iterator_base::const_iterator_base; - - }; - class reverse_iterator : public reverse_iterator_base { - public: - using reverse_iterator_base::reverse_iterator_base; - - }; - class const_reverse_iterator : public const_reverse_iterator_base { - public: - using const_reverse_iterator_base::const_reverse_iterator_base; - - }; + using iterator = flat_multi_set_iterator_impl< + Type, + Compare, + typename impl::iterator>; + using const_iterator = flat_multi_set_iterator_impl< + Type, + Compare, + typename impl::const_iterator>; + using reverse_iterator = flat_multi_set_iterator_impl< + Type, + Compare, + typename impl::reverse_iterator>; + using const_reverse_iterator = flat_multi_set_iterator_impl< + Type, + Compare, + typename impl::const_reverse_iterator>; flat_multi_set() = default; diff --git a/Telegram/SourceFiles/info/info_top_bar_override.cpp b/Telegram/SourceFiles/info/info_top_bar_override.cpp index 7cd1518663..139b748722 100644 --- a/Telegram/SourceFiles/info/info_top_bar_override.cpp +++ b/Telegram/SourceFiles/info/info_top_bar_override.cpp @@ -105,6 +105,11 @@ void TopBarOverride::setItems(SelectedItems &&items) { updateControlsGeometry(width()); } +SelectedItems TopBarOverride::takeItems() { + _canDelete = false; + return std::move(_items); +} + rpl::producer<> TopBarOverride::cancelRequests() const { return rpl::merge( _cancel->clicks(), diff --git a/Telegram/SourceFiles/info/info_top_bar_override.h b/Telegram/SourceFiles/info/info_top_bar_override.h index 9a8ec6d02d..c36f53c3be 100644 --- a/Telegram/SourceFiles/info/info_top_bar_override.h +++ b/Telegram/SourceFiles/info/info_top_bar_override.h @@ -59,6 +59,7 @@ public: SelectedItems &&items); void setItems(SelectedItems &&items); + SelectedItems takeItems(); rpl::producer<> cancelRequests() const; diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index d3762efd51..d9622bd5fb 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -193,6 +193,7 @@ void WrapWidget::setupTop( } else { createTopBar(section, peerId); } + refreshTopBarOverride(); } void WrapWidget::createTopBar( @@ -234,6 +235,14 @@ void WrapWidget::refreshTopBarOverride(SelectedItems &&items) { } } +void WrapWidget::refreshTopBarOverride() { + if (_topBarOverride) { + auto items = _topBarOverride->takeItems(); + destroyTopBarOverride(); + createTopBarOverride(std::move(items)); + } +} + void WrapWidget::destroyTopBarOverride() { if (!_topBarOverride) { return; diff --git a/Telegram/SourceFiles/info/info_wrap_widget.h b/Telegram/SourceFiles/info/info_wrap_widget.h index 98247e3cd3..d9ac111239 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.h +++ b/Telegram/SourceFiles/info/info_wrap_widget.h @@ -192,6 +192,7 @@ private: not_null memento); rpl::producer selectedListValue() const; + void refreshTopBarOverride(); void refreshTopBarOverride(SelectedItems &&items); void createTopBarOverride(SelectedItems &&items); void destroyTopBarOverride(); diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index baa17c2a90..8b1728c6b5 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -1435,7 +1435,7 @@ void ListWidget::mouseActionStart(const QPoint &screenPos, Qt::MouseButton butto _pressWasInactive = _controller->window()->wasInactivePress(); if (_pressWasInactive) _controller->window()->setInactivePress(false); - if (ClickHandler::getPressed()) { + if (ClickHandler::getPressed() && !hasSelected()) { _mouseAction = MouseAction::PrepareDrag; } else if (hasSelectedItems()) { if (isItemUnderPressSelected()) { @@ -1611,7 +1611,8 @@ void ListWidget::mouseActionFinish(const QPoint &screenPos, Qt::MouseButton butt && hasSelectedText(); auto activated = ClickHandler::unpressed(); - if (_mouseAction == MouseAction::Dragging) { + if (_mouseAction == MouseAction::Dragging + || _mouseAction == MouseAction::Selecting) { activated.clear(); } else if (needSelectionToggle) { activated.clear(); diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index ed0f784709..22c09c17e0 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -316,12 +316,6 @@ object_ptr InnerWidget::setupSharedMedia( object_ptr(parent) ); - //result->toggleOn(rpl::combine( - // tracker.atLeastOneShownValue(), - // std::move(wrapValue), - // _isStackBottom.events(), - // $1 && ($2 != Wrap::Side || !$3))); - using ToggledData = std::tuple; rpl::combine( tracker.atLeastOneShownValue(), diff --git a/Telegram/SourceFiles/overview/overview_layout.cpp b/Telegram/SourceFiles/overview/overview_layout.cpp index 1e39c71eaa..32ecdd7204 100644 --- a/Telegram/SourceFiles/overview/overview_layout.cpp +++ b/Telegram/SourceFiles/overview/overview_layout.cpp @@ -1332,7 +1332,7 @@ HistoryTextState Link::getState( } for (int32 i = 0, l = _links.size(); i < l; ++i) { if (rtlrect(left, top, qMin(w, _links.at(i).width), st::normalFont->height, _width).contains(point)) { - return _links.at(i).lnk; + return ClickHandlerPtr(_links[i].lnk); } top += st::normalFont->height; } diff --git a/Telegram/SourceFiles/rpl/merge.h b/Telegram/SourceFiles/rpl/merge.h index d254f7419d..23c2dd1bd2 100644 --- a/Telegram/SourceFiles/rpl/merge.h +++ b/Telegram/SourceFiles/rpl/merge.h @@ -21,7 +21,6 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #pragma once #include -#include namespace rpl { namespace details {