From 763b347a8fa3e6b53057fba86acd6e7a0e69d43f Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 20 Oct 2016 14:34:48 +0300 Subject: [PATCH 01/10] Moved a cute userpic checkbox from ShareBox to a separate class. --- Telegram/SourceFiles/boxes/boxes.style | 23 +- Telegram/SourceFiles/boxes/sharebox.cpp | 212 +++--------------- Telegram/SourceFiles/boxes/sharebox.h | 22 +- .../ui/effects/round_image_checkbox.cpp | 202 +++++++++++++++++ .../ui/effects/round_image_checkbox.h | 65 ++++++ Telegram/SourceFiles/ui/widgets/widgets.style | 13 ++ Telegram/gyp/Telegram.gyp | 2 + 7 files changed, 332 insertions(+), 207 deletions(-) create mode 100644 Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp create mode 100644 Telegram/SourceFiles/ui/effects/round_image_checkbox.h diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 306381f21..5cf04db88 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -19,6 +19,7 @@ Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ using "basic.style"; +using "ui/widgets/widgets.style"; confirmInviteTitle: flatLabel(labelDefFlat) { font: font(16px semibold); @@ -71,22 +72,24 @@ localStorageBoxSkip: 10px; shareRowsTop: 12px; shareRowHeight: 108px; -sharePhotoRadius: 28px; -sharePhotoSmallRadius: 24px; sharePhotoTop: 6px; -shareSelectWidth: 2px; -shareSelectFg: windowActiveBg; -shareCheckBorder: windowBg; -shareCheckBg: windowActiveBg; -shareCheckRadius: 10px; -shareCheckSmallRadius: 3px; -shareCheckIcon: icon {{ "default_checkbox_check", windowBg, point(3px, 6px) }}; +sharePhotoCheckbox: RoundImageCheckbox { + imageRadius: 28px; + imageSmallRadius: 24px; + selectWidth: 2px; + selectFg: windowActiveBg; + selectDuration: 150; + checkBorder: windowBg; + checkBg: windowActiveBg; + checkRadius: 10px; + checkSmallRadius: 3px; + checkIcon: icon {{ "default_checkbox_check", windowBg, point(3px, 6px) }}; +} shareNameFont: font(11px); shareNameFg: windowTextFg; shareNameActiveFg: btnYesColor; shareNameTop: 6px; shareColumnSkip: 6px; -shareSelectDuration: 150; shareActivateDuration: 150; shareScrollDuration: 300; diff --git a/Telegram/SourceFiles/boxes/sharebox.cpp b/Telegram/SourceFiles/boxes/sharebox.cpp index a7cb219ce..bdecfb495 100644 --- a/Telegram/SourceFiles/boxes/sharebox.cpp +++ b/Telegram/SourceFiles/boxes/sharebox.cpp @@ -34,6 +34,16 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "ui/toast/toast.h" #include "history/history_media_types.h" +namespace { + +Ui::RoundImageCheckbox::PaintRoundImage paintUserpicCallback(PeerData *peer) { + return [peer](Painter &p, int x, int y, int outerWidth, int size) { + peer->paintUserpicLeft(p, size, x, y, outerWidth); + }; +} + +} // namespace + ShareBox::ShareBox(CopyCallback &©Callback, SubmitCallback &&submitCallback, FilterCallback &&filterCallback) : ItemListBox(st::boxScroll) , _copyCallback(std_::move(copyCallback)) , _submitCallback(std_::move(submitCallback)) @@ -260,8 +270,6 @@ ShareInner::ShareInner(QWidget *parent, ShareBox::FilterCallback &&filterCallbac _filter = qsl("a"); updateFilter(); - prepareWideCheckIcons(); - using UpdateFlag = Notify::PeerUpdate::Flag; auto observeEvents = UpdateFlag::NameChanged | UpdateFlag::PhotoChanged; subscribe(Notify::PeerUpdated(), Notify::PeerUpdatedHandler(observeEvents, [this](const Notify::PeerUpdate &update) { @@ -426,7 +434,8 @@ ShareInner::Chat *ShareInner::getChat(Dialogs::Row *row) { auto peer = row->history()->peer; auto i = _dataMap.constFind(peer); if (i == _dataMap.cend()) { - _dataMap.insert(peer, data = new Chat(peer)); + data = new Chat(peer, [this, peer] { repaintChat(peer); }); + _dataMap.insert(peer, data); updateChatName(data, peer); } else { data = i.value(); @@ -440,8 +449,8 @@ void ShareInner::setActive(int active) { if (active != _active) { auto changeNameFg = [this](int index, style::color from, style::color to) { if (auto chat = getChatAtIndex(index)) { - chat->nameFg.start([this, chat] { - repaintChat(chat->peer); + chat->nameFg.start([this, peer = chat->peer] { + repaintChat(peer); }, from->c, to->c, st::shareActivateDuration); } }; @@ -457,67 +466,10 @@ void ShareInner::paintChat(Painter &p, Chat *chat, int index) { auto x = _rowsLeft + qFloor((index % _columnCount) * _rowWidthReal); auto y = _rowsTop + (index / _columnCount) * _rowHeight; - auto selectionLevel = chat->selection.current(chat->selected ? 1. : 0.); - - auto w = width(); - auto photoLeft = (_rowWidth - (st::sharePhotoRadius * 2)) / 2; + auto outerWidth = width(); + auto photoLeft = (_rowWidth - (st::sharePhotoCheckbox.imageRadius * 2)) / 2; auto photoTop = st::sharePhotoTop; - if (chat->selection.animating()) { - p.setRenderHint(QPainter::SmoothPixmapTransform, true); - auto userpicRadius = qRound(WideCacheScale * (st::sharePhotoRadius + (st::sharePhotoSmallRadius - st::sharePhotoRadius) * selectionLevel)); - auto userpicShift = WideCacheScale * st::sharePhotoRadius - userpicRadius; - auto userpicLeft = x + photoLeft - (WideCacheScale - 1) * st::sharePhotoRadius + userpicShift; - auto userpicTop = y + photoTop - (WideCacheScale - 1) * st::sharePhotoRadius + userpicShift; - auto to = QRect(userpicLeft, userpicTop, userpicRadius * 2, userpicRadius * 2); - auto from = QRect(QPoint(0, 0), chat->wideUserpicCache.size()); - p.drawPixmapLeft(to, w, chat->wideUserpicCache, from); - p.setRenderHint(QPainter::SmoothPixmapTransform, false); - } else { - if (!chat->wideUserpicCache.isNull()) { - chat->wideUserpicCache = QPixmap(); - } - auto userpicRadius = chat->selected ? st::sharePhotoSmallRadius : st::sharePhotoRadius; - auto userpicShift = st::sharePhotoRadius - userpicRadius; - auto userpicLeft = x + photoLeft + userpicShift; - auto userpicTop = y + photoTop + userpicShift; - chat->peer->paintUserpicLeft(p, userpicRadius * 2, userpicLeft, userpicTop, w); - } - - if (selectionLevel > 0) { - p.setRenderHint(QPainter::HighQualityAntialiasing, true); - p.setOpacity(snap(selectionLevel, 0., 1.)); - p.setBrush(Qt::NoBrush); - QPen pen = st::shareSelectFg; - pen.setWidth(st::shareSelectWidth); - p.setPen(pen); - p.drawEllipse(myrtlrect(x + photoLeft, y + photoTop, st::sharePhotoRadius * 2, st::sharePhotoRadius * 2)); - p.setOpacity(1.); - p.setRenderHint(QPainter::HighQualityAntialiasing, false); - } - - removeFadeOutedIcons(chat); - p.setRenderHint(QPainter::SmoothPixmapTransform, true); - for (auto &icon : chat->icons) { - auto fadeIn = icon.fadeIn.current(1.); - auto fadeOut = icon.fadeOut.current(1.); - auto iconRadius = qRound(WideCacheScale * (st::shareCheckSmallRadius + fadeOut * (st::shareCheckRadius - st::shareCheckSmallRadius))); - auto iconShift = WideCacheScale * st::shareCheckRadius - iconRadius; - auto iconLeft = x + photoLeft + 2 * st::sharePhotoRadius + st::shareSelectWidth - 2 * st::shareCheckRadius - (WideCacheScale - 1) * st::shareCheckRadius + iconShift; - auto iconTop = y + photoTop + 2 * st::sharePhotoRadius + st::shareSelectWidth - 2 * st::shareCheckRadius - (WideCacheScale - 1) * st::shareCheckRadius + iconShift; - auto to = QRect(iconLeft, iconTop, iconRadius * 2, iconRadius * 2); - auto from = QRect(QPoint(0, 0), _wideCheckIconCache.size()); - auto opacity = fadeIn * fadeOut; - p.setOpacity(opacity); - if (fadeOut < 1.) { - p.drawPixmapLeft(to, w, icon.wideCheckCache, from); - } else { - auto divider = qRound((WideCacheScale - 2) * st::shareCheckRadius + fadeIn * 3 * st::shareCheckRadius); - p.drawPixmapLeft(QRect(iconLeft, iconTop, divider, iconRadius * 2), w, _wideCheckIconCache, QRect(0, 0, divider * cIntRetinaFactor(), _wideCheckIconCache.height())); - p.drawPixmapLeft(QRect(iconLeft + divider, iconTop, iconRadius * 2 - divider, iconRadius * 2), w, _wideCheckCache, QRect(divider * cIntRetinaFactor(), 0, _wideCheckCache.width() - divider * cIntRetinaFactor(), _wideCheckCache.height())); - } - } - p.setRenderHint(QPainter::SmoothPixmapTransform, false); - p.setOpacity(1.); + chat->checkbox.paint(p, x + photoLeft, y + photoTop, outerWidth); if (chat->nameFg.animating()) { p.setPen(chat->nameFg.current()); @@ -527,11 +479,14 @@ void ShareInner::paintChat(Painter &p, Chat *chat, int index) { auto nameWidth = (_rowWidth - st::shareColumnSkip); auto nameLeft = st::shareColumnSkip / 2; - auto nameTop = photoTop + st::sharePhotoRadius * 2 + st::shareNameTop; - chat->name.drawLeftElided(p, x + nameLeft, y + nameTop, nameWidth, w, 2, style::al_top, 0, -1, 0, true); + auto nameTop = photoTop + st::sharePhotoCheckbox.imageRadius * 2 + st::shareNameTop; + chat->name.drawLeftElided(p, x + nameLeft, y + nameTop, nameWidth, outerWidth, 2, style::al_top, 0, -1, 0, true); } -ShareInner::Chat::Chat(PeerData *peer) : peer(peer), name(st::sharePhotoRadius * 2) { +ShareInner::Chat::Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) +: peer(peer) +, checkbox(st::sharePhotoCheckbox, std_::move(updateCallback), paintUserpicCallback(peer)) +, name(st::sharePhotoCheckbox.imageRadius * 2) { } void ShareInner::paintEvent(QPaintEvent *e) { @@ -613,7 +568,7 @@ void ShareInner::updateUpon(const QPoint &pos) { auto left = _rowsLeft + qFloor(column * _rowWidthReal) + st::shareColumnSkip / 2; auto top = _rowsTop + row * _rowHeight + st::sharePhotoTop; auto xupon = (x >= left) && (x < left + (_rowWidth - st::shareColumnSkip)); - auto yupon = (y >= top) && (y < top + st::sharePhotoRadius * 2 + st::shareNameTop + st::shareNameFont->height * 2); + auto yupon = (y >= top) && (y < top + st::sharePhotoCheckbox.imageRadius * 2 + st::shareNameTop + st::shareNameFont->height * 2); auto upon = (xupon && yupon) ? (row * _columnCount + column) : -1; if (upon >= displayedChatsCount()) { upon = -1; @@ -633,28 +588,13 @@ void ShareInner::onSelectActive() { } void ShareInner::resizeEvent(QResizeEvent *e) { - _columnSkip = (width() - _columnCount * st::sharePhotoRadius * 2) / float64(_columnCount + 1); - _rowWidthReal = st::sharePhotoRadius * 2 + _columnSkip; + _columnSkip = (width() - _columnCount * st::sharePhotoCheckbox.imageRadius * 2) / float64(_columnCount + 1); + _rowWidthReal = st::sharePhotoCheckbox.imageRadius * 2 + _columnSkip; _rowsLeft = qFloor(_columnSkip / 2); _rowWidth = qFloor(_rowWidthReal); update(); } -struct AnimBumpy { - AnimBumpy(float64 bump) : bump(bump) - , dt0(bump - sqrt(bump * (bump - 1.))) - , k(1 / (2 * dt0 - 1)) { - } - float64 bump; - float64 dt0; - float64 k; -}; - -float64 anim_bumpy(const float64 &delta, const float64 &dt) { - static AnimBumpy data = { 1.25 }; - return delta * (data.bump - data.k * (dt - data.dt0) * (dt - data.dt0)); -} - void ShareInner::changeCheckState(Chat *chat) { if (!chat) return; @@ -664,110 +604,22 @@ void ShareInner::changeCheckState(Chat *chat) { row = _chatsIndexed->addToEnd(App::history(chat->peer)).value(0); } chat = getChat(row); - if (!chat->selected) { + if (!chat->checkbox.selected()) { _chatsIndexed->moveToTop(chat->peer); } emit filterCancel(); } - chat->selected = !chat->selected; - if (chat->selected) { + chat->checkbox.toggleSelected(); + if (chat->checkbox.selected()) { _selected.insert(chat->peer); - chat->icons.push_back(Chat::Icon()); - chat->icons.back().fadeIn.start([this, chat] { - repaintChat(chat->peer); - }, 0, 1, st::shareSelectDuration); + setActive(chatIndex(chat->peer)); } else { _selected.remove(chat->peer); - prepareWideCheckIconCache(&chat->icons.back()); - chat->icons.back().fadeOut.start([this, chat] { - repaintChat(chat->peer); - removeFadeOutedIcons(chat); // this call can destroy current lambda - }, 1, 0, st::shareSelectDuration); - } - prepareWideUserpicCache(chat); - chat->selection.start([this, chat] { - repaintChat(chat->peer); - }, chat->selected ? 0 : 1, chat->selected ? 1 : 0, st::shareSelectDuration, anim_bumpy); - if (chat->selected) { - setActive(chatIndex(chat->peer)); } emit selectedChanged(); } -void ShareInner::removeFadeOutedIcons(Chat *chat) { - while (!chat->icons.empty() && !chat->icons.front().fadeIn.animating() && !chat->icons.front().fadeOut.animating()) { - if (chat->icons.size() > 1 || !chat->selected) { - chat->icons.erase(chat->icons.begin()); - } else { - break; - } - } -} - -void ShareInner::prepareWideUserpicCache(Chat *chat) { - if (chat->wideUserpicCache.isNull()) { - auto size = st::sharePhotoRadius * 2; - auto wideSize = size * WideCacheScale; - QImage cache(wideSize * cIntRetinaFactor(), wideSize * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); - cache.setDevicePixelRatio(cRetinaFactor()); - { - Painter p(&cache); - p.setCompositionMode(QPainter::CompositionMode_Source); - p.fillRect(0, 0, wideSize, wideSize, Qt::transparent); - p.setCompositionMode(QPainter::CompositionMode_SourceOver); - chat->peer->paintUserpic(p, size, (wideSize - size) / 2, (wideSize - size) / 2); - } - chat->wideUserpicCache = App::pixmapFromImageInPlace(std_::move(cache)); - chat->wideUserpicCache.setDevicePixelRatio(cRetinaFactor()); - } -} - -void ShareInner::prepareWideCheckIconCache(Chat::Icon *icon) { - QImage wideCache(_wideCheckCache.width(), _wideCheckCache.height(), QImage::Format_ARGB32_Premultiplied); - wideCache.setDevicePixelRatio(cRetinaFactor()); - { - Painter p(&wideCache); - p.setCompositionMode(QPainter::CompositionMode_Source); - auto iconRadius = WideCacheScale * st::shareCheckRadius; - auto divider = qRound((WideCacheScale - 2) * st::shareCheckRadius + icon->fadeIn.current(1.) * 3 * st::shareCheckRadius); - p.drawPixmapLeft(QRect(0, 0, divider, iconRadius * 2), width(), _wideCheckIconCache, QRect(0, 0, divider * cIntRetinaFactor(), _wideCheckIconCache.height())); - p.drawPixmapLeft(QRect(divider, 0, iconRadius * 2 - divider, iconRadius * 2), width(), _wideCheckCache, QRect(divider * cIntRetinaFactor(), 0, _wideCheckCache.width() - divider * cIntRetinaFactor(), _wideCheckCache.height())); - } - icon->wideCheckCache = App::pixmapFromImageInPlace(std_::move(wideCache)); - icon->wideCheckCache.setDevicePixelRatio(cRetinaFactor()); -} - -void ShareInner::prepareWideCheckIcons() { - auto size = st::shareCheckRadius * 2; - auto wideSize = size * WideCacheScale; - QImage cache(wideSize * cIntRetinaFactor(), wideSize * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); - cache.setDevicePixelRatio(cRetinaFactor()); - { - Painter p(&cache); - p.setCompositionMode(QPainter::CompositionMode_Source); - p.fillRect(0, 0, wideSize, wideSize, Qt::transparent); - p.setCompositionMode(QPainter::CompositionMode_SourceOver); - p.setRenderHint(QPainter::HighQualityAntialiasing, true); - auto pen = st::shareCheckBorder->p; - pen.setWidth(st::shareSelectWidth); - p.setPen(pen); - p.setBrush(st::shareCheckBg); - auto ellipse = QRect((wideSize - size) / 2, (wideSize - size) / 2, size, size); - p.drawEllipse(ellipse); - } - QImage cacheIcon = cache; - { - Painter p(&cacheIcon); - auto ellipse = QRect((wideSize - size) / 2, (wideSize - size) / 2, size, size); - st::shareCheckIcon.paint(p, ellipse.topLeft(), wideSize); - } - _wideCheckCache = App::pixmapFromImageInPlace(std_::move(cache)); - _wideCheckCache.setDevicePixelRatio(cRetinaFactor()); - _wideCheckIconCache = App::pixmapFromImageInPlace(std_::move(cacheIcon)); - _wideCheckIconCache.setDevicePixelRatio(cRetinaFactor()); -} - bool ShareInner::hasSelected() const { return _selected.size(); } @@ -867,7 +719,7 @@ void ShareInner::peopleReceived(const QString &query, const QVector &pe auto *peer = App::peer(peerId); if (!peer || !_filterCallback(peer)) continue; - auto chat = new Chat(peer); + auto chat = new Chat(peer, [this, peer] { repaintChat(peer); }); updateChatName(chat, peer); if (auto row = _chatsIndexed->getRow(peer->id)) { continue; @@ -902,7 +754,7 @@ QVector ShareInner::selected() const { QVector result; result.reserve(_dataMap.size()); for_const (auto chat, _dataMap) { - if (chat->selected) { + if (chat->checkbox.selected()) { result.push_back(chat->peer); } } diff --git a/Telegram/SourceFiles/boxes/sharebox.h b/Telegram/SourceFiles/boxes/sharebox.h index 7f7d8e99d..245285cdf 100644 --- a/Telegram/SourceFiles/boxes/sharebox.h +++ b/Telegram/SourceFiles/boxes/sharebox.h @@ -24,6 +24,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "core/lambda_wrap.h" #include "core/observer.h" #include "core/vector_of_moveable.h" +#include "ui/effects/round_image_checkbox.h" namespace Dialogs { class Row; @@ -151,30 +152,19 @@ private: int displayedChatsCount() const; - static constexpr int WideCacheScale = 4; + static constexpr int kWideCacheScale = Ui::kWideRoundImageCheckboxScale; struct Chat { - Chat(PeerData *peer); + Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback); + PeerData *peer; + Ui::RoundImageCheckbox checkbox; Text name; - bool selected = false; - QPixmap wideUserpicCache; ColorAnimation nameFg; - FloatAnimation selection; - struct Icon { - FloatAnimation fadeIn; - FloatAnimation fadeOut; - QPixmap wideCheckCache; - }; - std_::vector_of_moveable icons; }; void paintChat(Painter &p, Chat *chat, int index); void updateChat(PeerData *peer); void updateChatName(Chat *chat, PeerData *peer); void repaintChat(PeerData *peer); - void removeFadeOutedIcons(Chat *chat); - void prepareWideUserpicCache(Chat *chat); - void prepareWideCheckIconCache(Chat::Icon *icon); - void prepareWideCheckIcons(); int chatIndex(PeerData *peer) const; void repaintChatAtIndex(int index); Chat *getChatAtIndex(int index); @@ -204,8 +194,6 @@ private: using FilteredDialogs = QVector; FilteredDialogs _filtered; - QPixmap _wideCheckCache, _wideCheckIconCache; - using DataMap = QMap; DataMap _dataMap; using SelectedChats = OrderedSet; diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp new file mode 100644 index 000000000..000376c63 --- /dev/null +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp @@ -0,0 +1,202 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" +#include "ui/effects/round_image_checkbox.h" + +namespace Ui { +namespace { + +void prepareCheckCaches(const style::RoundImageCheckbox *st, QPixmap &checkBgCache, QPixmap &checkFullCache) { + auto size = st->checkRadius * 2; + auto wideSize = size * kWideRoundImageCheckboxScale; + QImage cache(wideSize * cIntRetinaFactor(), wideSize * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); + cache.setDevicePixelRatio(cRetinaFactor()); + { + Painter p(&cache); + p.setCompositionMode(QPainter::CompositionMode_Source); + p.fillRect(0, 0, wideSize, wideSize, Qt::transparent); + p.setCompositionMode(QPainter::CompositionMode_SourceOver); + p.setRenderHint(QPainter::HighQualityAntialiasing, true); + auto pen = st->checkBorder->p; + pen.setWidth(st->selectWidth); + p.setPen(pen); + p.setBrush(st->checkBg); + auto ellipse = QRect((wideSize - size) / 2, (wideSize - size) / 2, size, size); + p.drawEllipse(ellipse); + } + QImage cacheIcon = cache; + { + Painter p(&cacheIcon); + auto ellipse = QRect((wideSize - size) / 2, (wideSize - size) / 2, size, size); + st->checkIcon.paint(p, ellipse.topLeft(), wideSize); + } + checkBgCache = App::pixmapFromImageInPlace(std_::move(cache)); + checkBgCache.setDevicePixelRatio(cRetinaFactor()); + checkFullCache = App::pixmapFromImageInPlace(std_::move(cacheIcon)); + checkFullCache.setDevicePixelRatio(cRetinaFactor()); +} + +struct AnimBumpy { + AnimBumpy(float64 bump) : bump(bump) + , dt0(bump - sqrt(bump * (bump - 1.))) + , k(1 / (2 * dt0 - 1)) { + } + float64 bump; + float64 dt0; + float64 k; +}; + +template +float64 anim_bumpy(const float64 &delta, const float64 &dt) { + static AnimBumpy data = { BumpRatioPercent / 100. }; + return delta * (data.bump - data.k * (dt - data.dt0) * (dt - data.dt0)); +} + +} // namespace + +RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, UpdateCallback &&updateCallback, PaintRoundImage &&paintRoundImage) +: _st(st) +, _updateCallback(std_::move(updateCallback)) +, _paintRoundImage(std_::move(paintRoundImage)) { + prepareCheckCaches(&_st, _wideCheckBgCache, _wideCheckFullCache); +} + +void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { + auto selectionLevel = _selection.current(_selected ? 1. : 0.); + if (_selection.animating()) { + p.setRenderHint(QPainter::SmoothPixmapTransform, true); + auto userpicRadius = qRound(kWideRoundImageCheckboxScale * (_st.imageRadius + (_st.imageSmallRadius - _st.imageRadius) * selectionLevel)); + auto userpicShift = kWideRoundImageCheckboxScale * _st.imageRadius - userpicRadius; + auto userpicLeft = x - (kWideRoundImageCheckboxScale - 1) * _st.imageRadius + userpicShift; + auto userpicTop = y - (kWideRoundImageCheckboxScale - 1) * _st.imageRadius + userpicShift; + auto to = QRect(userpicLeft, userpicTop, userpicRadius * 2, userpicRadius * 2); + auto from = QRect(QPoint(0, 0), _wideCache.size()); + p.drawPixmapLeft(to, outerWidth, _wideCache, from); + p.setRenderHint(QPainter::SmoothPixmapTransform, false); + } else { + if (!_wideCache.isNull()) { + _wideCache = QPixmap(); + } + auto userpicRadius = _selected ? _st.imageSmallRadius : _st.imageRadius; + auto userpicShift = _st.imageRadius - userpicRadius; + auto userpicLeft = x + userpicShift; + auto userpicTop = y + userpicShift; + _paintRoundImage(p, userpicLeft, userpicTop, outerWidth, userpicRadius * 2); + } + + if (selectionLevel > 0) { + p.setRenderHint(QPainter::HighQualityAntialiasing, true); + p.setOpacity(snap(selectionLevel, 0., 1.)); + p.setBrush(Qt::NoBrush); + QPen pen = _st.selectFg; + pen.setWidth(_st.selectWidth); + p.setPen(pen); + p.drawEllipse(rtlrect(x, y, _st.imageRadius * 2, _st.imageRadius * 2, outerWidth)); + p.setOpacity(1.); + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + } + + removeFadeOutedIcons(); + p.setRenderHint(QPainter::SmoothPixmapTransform, true); + for (auto &icon : _icons) { + auto fadeIn = icon.fadeIn.current(1.); + auto fadeOut = icon.fadeOut.current(1.); + auto iconRadius = qRound(kWideRoundImageCheckboxScale * (_st.checkSmallRadius + fadeOut * (_st.checkRadius - _st.checkSmallRadius))); + auto iconShift = kWideRoundImageCheckboxScale * _st.checkRadius - iconRadius; + auto iconLeft = x + 2 * _st.imageRadius + _st.selectWidth - 2 * _st.checkRadius - (kWideRoundImageCheckboxScale - 1) * _st.checkRadius + iconShift; + auto iconTop = y + 2 * _st.imageRadius + _st.selectWidth - 2 * _st.checkRadius - (kWideRoundImageCheckboxScale - 1) * _st.checkRadius + iconShift; + auto to = QRect(iconLeft, iconTop, iconRadius * 2, iconRadius * 2); + auto from = QRect(QPoint(0, 0), _wideCheckFullCache.size()); + auto opacity = fadeIn * fadeOut; + p.setOpacity(opacity); + if (fadeOut < 1.) { + p.drawPixmapLeft(to, outerWidth, icon.wideCheckCache, from); + } else { + auto divider = qRound((kWideRoundImageCheckboxScale - 2) * _st.checkRadius + fadeIn * 3 * _st.checkRadius); + p.drawPixmapLeft(QRect(iconLeft, iconTop, divider, iconRadius * 2), outerWidth, _wideCheckFullCache, QRect(0, 0, divider * cIntRetinaFactor(), _wideCheckFullCache.height())); + p.drawPixmapLeft(QRect(iconLeft + divider, iconTop, iconRadius * 2 - divider, iconRadius * 2), outerWidth, _wideCheckBgCache, QRect(divider * cIntRetinaFactor(), 0, _wideCheckBgCache.width() - divider * cIntRetinaFactor(), _wideCheckBgCache.height())); + } + } + p.setRenderHint(QPainter::SmoothPixmapTransform, false); + p.setOpacity(1.); +} + +void RoundImageCheckbox::toggleSelected() { + _selected = !_selected; + if (_selected) { + _icons.push_back(Icon()); + _icons.back().fadeIn.start(UpdateCallback(_updateCallback), 0, 1, _st.selectDuration); + } else { + prepareWideCheckIconCache(&_icons.back()); + _icons.back().fadeOut.start([this] { + _updateCallback(); + removeFadeOutedIcons(); // this call can destroy current lambda + }, 1, 0, _st.selectDuration); + } + prepareWideCache(); + _selection.start(UpdateCallback(_updateCallback), _selected ? 0 : 1, _selected ? 1 : 0, _st.selectDuration, anim_bumpy<125>); +} + +void RoundImageCheckbox::removeFadeOutedIcons() { + while (!_icons.empty() && !_icons.front().fadeIn.animating() && !_icons.front().fadeOut.animating()) { + if (_icons.size() > 1 || !_selected) { + _icons.erase(_icons.begin()); + } else { + break; + } + } +} + +void RoundImageCheckbox::prepareWideCache() { + if (_wideCache.isNull()) { + auto size = _st.imageRadius * 2; + auto wideSize = size * kWideRoundImageCheckboxScale; + QImage cache(wideSize * cIntRetinaFactor(), wideSize * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); + cache.setDevicePixelRatio(cRetinaFactor()); + { + Painter p(&cache); + p.setCompositionMode(QPainter::CompositionMode_Source); + p.fillRect(0, 0, wideSize, wideSize, Qt::transparent); + p.setCompositionMode(QPainter::CompositionMode_SourceOver); + _paintRoundImage(p, (wideSize - size) / 2, (wideSize - size) / 2, wideSize, size); + } + _wideCache = App::pixmapFromImageInPlace(std_::move(cache)); + } +} + +void RoundImageCheckbox::prepareWideCheckIconCache(Icon *icon) { + auto cacheWidth = _wideCheckBgCache.width() / _wideCheckBgCache.devicePixelRatio(); + auto cacheHeight = _wideCheckBgCache.height() / _wideCheckBgCache.devicePixelRatio(); + auto wideCache = QImage(cacheWidth * cIntRetinaFactor(), cacheHeight * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); + wideCache.setDevicePixelRatio(cRetinaFactor()); + { + Painter p(&wideCache); + p.setCompositionMode(QPainter::CompositionMode_Source); + auto iconRadius = kWideRoundImageCheckboxScale * _st.checkRadius; + auto divider = qRound((kWideRoundImageCheckboxScale - 2) * _st.checkRadius + icon->fadeIn.current(1.) * (kWideRoundImageCheckboxScale - 1) * _st.checkRadius); + p.drawPixmapLeft(QRect(0, 0, divider, iconRadius * 2), cacheWidth, _wideCheckFullCache, QRect(0, 0, divider * cIntRetinaFactor(), _wideCheckFullCache.height())); + p.drawPixmapLeft(QRect(divider, 0, iconRadius * 2 - divider, iconRadius * 2), cacheWidth, _wideCheckBgCache, QRect(divider * cIntRetinaFactor(), 0, _wideCheckBgCache.width() - divider * cIntRetinaFactor(), _wideCheckBgCache.height())); + } + icon->wideCheckCache = App::pixmapFromImageInPlace(std_::move(wideCache)); + icon->wideCheckCache.setDevicePixelRatio(cRetinaFactor()); +} + +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.h b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h new file mode 100644 index 000000000..3d4c5955e --- /dev/null +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h @@ -0,0 +1,65 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#pragma once + +#include "styles/style_widgets.h" + +namespace Ui { + +static constexpr int kWideRoundImageCheckboxScale = 4; +class RoundImageCheckbox { +public: + using PaintRoundImage = base::lambda_unique; + using UpdateCallback = base::lambda_wrap; + RoundImageCheckbox(const style::RoundImageCheckbox &st, UpdateCallback &&updateCallback, PaintRoundImage &&paintRoundImage); + + void paint(Painter &p, int x, int y, int outerWidth); + + void toggleSelected(); + bool selected() const { + return _selected; + } + +private: + struct Icon { + FloatAnimation fadeIn; + FloatAnimation fadeOut; + QPixmap wideCheckCache; + }; + void removeFadeOutedIcons(); + void prepareWideCache(); + void prepareWideCheckIconCache(Icon *icon); + + const style::RoundImageCheckbox &_st; + UpdateCallback _updateCallback; + PaintRoundImage _paintRoundImage; + + bool _selected = false; + QPixmap _wideCache; + FloatAnimation _selection; + std_::vector_of_moveable _icons; + + // Those pixmaps are shared among all checkboxes that have the same style. + QPixmap _wideCheckBgCache, _wideCheckFullCache; + +}; + +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/widgets/widgets.style b/Telegram/SourceFiles/ui/widgets/widgets.style index 3128f0521..171a0089e 100644 --- a/Telegram/SourceFiles/ui/widgets/widgets.style +++ b/Telegram/SourceFiles/ui/widgets/widgets.style @@ -54,6 +54,19 @@ FilledSlider { duration: int; } +RoundImageCheckbox { + imageRadius: pixels; + imageSmallRadius: pixels; + selectWidth: pixels; + selectFg: color; + selectDuration: int; + checkBorder: color; + checkBg: color; + checkRadius: pixels; + checkSmallRadius: pixels; + checkIcon: icon; +} + widgetSlideDuration: 200; discreteSliderHeight: 39px; diff --git a/Telegram/gyp/Telegram.gyp b/Telegram/gyp/Telegram.gyp index 5a49cd29b..3c86f2e6d 100644 --- a/Telegram/gyp/Telegram.gyp +++ b/Telegram/gyp/Telegram.gyp @@ -455,6 +455,8 @@ '<(src_loc)/ui/effects/radial_animation.h', '<(src_loc)/ui/effects/rect_shadow.cpp', '<(src_loc)/ui/effects/rect_shadow.h', + '<(src_loc)/ui/effects/round_image_checkbox.cpp', + '<(src_loc)/ui/effects/round_image_checkbox.h', '<(src_loc)/ui/style/style_core.cpp', '<(src_loc)/ui/style/style_core.h', '<(src_loc)/ui/style/style_core_color.cpp', From 2bd561821a217c51b4e2552416b3cf7f9bb74406 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 20 Oct 2016 16:41:46 +0300 Subject: [PATCH 02/10] Using cute userpic checkbox Ui::RoundImageCheckbox in ContactsBox. --- Telegram/Resources/art/sprite.png | Bin 40486 -> 40270 bytes Telegram/Resources/art/sprite_200x.png | Bin 86789 -> 85777 bytes Telegram/Resources/basic.style | 3 - Telegram/SourceFiles/boxes/boxes.style | 23 +- Telegram/SourceFiles/boxes/contactsbox.cpp | 355 +++++++++++------- Telegram/SourceFiles/boxes/contactsbox.h | 36 +- Telegram/SourceFiles/boxes/sharebox.cpp | 21 +- Telegram/SourceFiles/boxes/sharebox.h | 1 - .../ui/effects/round_image_checkbox.cpp | 77 ++-- .../ui/effects/round_image_checkbox.h | 14 +- 10 files changed, 323 insertions(+), 207 deletions(-) diff --git a/Telegram/Resources/art/sprite.png b/Telegram/Resources/art/sprite.png index 450efca535869b05ed82c96d9f587f14d770a499..c51595ddf239d09e8ef602dda9247a3f7a35d9ca 100644 GIT binary patch literal 40270 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 TB4mAtz(-HZShHN+{`vm_YSumR diff --git a/Telegram/Resources/art/sprite_200x.png b/Telegram/Resources/art/sprite_200x.png index ed5987c106c5e46d5a901d7ba952a02c70638522..29705dde0c1839d345ab7fc375415aaa686b1c19 100644 GIT binary patch literal 85777 zcmYIv1yqz>)GiFo&>aFYprCX~gCgBX!vI4`cQ;6PDP59EBQ^8@QlfN+bayx2m+$}Y zy=$q9rM~Cvv(K~pIgzT$GPu}O*hol7xN@?RACQnxD1hJInCMS`^X`Zb3F$eKoa8$V z&#e7Lk1UOgwtpwnuXyHD(cE{G&|=Xf>7`?^tyvKt++V#R;glXXP0Dn4aTr-6M zUTujk73-vg5=dauhY&!lnnCXa)q~pK(&Y)OqJIVnsZz`|B69{7AdHuhs)?^rXF$G~ z&*Y5{)YKVaPhUu2CaOLJsUezzWU5ee1Ne`Xmutvo5|_{ViuhnSe!iK5Me8ISmkzCm zGgu8Q?w{DYm8(L7{OS;o=p&#kOc6ZelDUT&tIOw?4yk^B`=wZ^j_%FZv_4BI8{b z+DrvEKQg$c&-R}9ntNpYPrjrtHW*AN?+Qm6;kBEpX#DG~oj=S1V5N`}?QU>G4@Q+v z&5o$_qq-dCro6LIz_#iXm_^zbbK?oDg;u_x;WZ5}3lDlxc+)!g{qrFk1&em&eSY8C zjlz%J(Y!ni31wBq@c{&*0<;8lB5dKi{ zAcI(xg*&bzlY`=6_yl^`&_ipfe05;ORxP#9KFMCVnwoqD(_2+KHLDqBhB5#)96JSI z$g_ZekF#X3f8|(T_Sh&;0v${Ps!Lj+3dJ|%?&9qjfu`)!tJwVdoGBbeVtUgTM%&F| zzrH{qW*M7Q@-4LX_{C7>R90kvsZSp%{!Eg^jLtj^ zKcXxIg+%N4l3k-+CS3$bh;@I~ZF1iDVpw$*>WWW}lu;b3rFpT@+}v#Yh%SpsFX_IG zcOSX{CWrm|9f16c*y#rpOfgqJQaNJXXAy*S+C zZi{;-p8l)uG=QB;Vko0*Ce9nI4}&&M0?3>Oz67epiazWn>7T2BL&_vF~^K~il7 zK2lCo<(2NLHrhP7hdC~iYo3w81BtP>9Q(tN%7Dh&2kLwIWfn%`PkyOX={QV|5}ym|U>JyQj@YIMJNayt(Lp2ZzCY)9R0VB1mDkh^ z_-2*yo9ZRtw5YR#L!vK9Oak5*q5X}$T(;eVXoiRyok%l63zKtU@uTp`1BsADlhK6* z-vLc+1HOtjM`Xu~Np10fjW61Uz+a0DaK@~CFINMuU-m~Qf-b>vG*M!I*wV2M&pzWC6ndNfTUK9Wmy}$Gz)+5DmSqBW z>;;>;kFMxWZhVtpDrdnLXB%v1f3$mfd3C61UYKZV-ho8^-Jj7R+u+d%oj>f1mmHx` zi2M6KoNf$Oq2wr>QxH7u7Ai7x^;~U{a|=#8V`Juvbu8ulwzv_tfM+Y+CH3-__ELz^ z$gw2>YMik-+!ssTIO^5ryz$EhjE((w-0eY+35sNy;T~0NRr~ALufO^=COw`OcTes| zgJh%Xd!_!9lJe+a@ofa7f*9Avg~Arrh;4L{@HRx|dG;U_C1|V0;x&Ps8Ab1*wvpe3 z*w#f9DNC+iC3?(v1O|f7o*Y87S@u@cF=sy1j73WA(S6#$qaNvZI!|Aj)!aiO>r}~Jv-WtM zxKI^}L2=5<8jU90QSek59D*ko-L zNXIsR7_U=@h-!`35e|#p*&ZYAlhGr@EklKIy+%lK*D1Cy;LV+v~FIqfGU@gxT(+LI?rNsq{B*D7LC ze3@CaFsrFr-~#(>^slf_C-RXu9&{X^FbdPqx&U_ z5UKM%JlQC{4+w`vb_uvVn%46rk)KNAb+uVrooif>$%%>c{4=N;i7qpMdC8X)NQzD^ z5v*FV50tr#G$_(s+kiloEGt?9!$=@zu9VOWz{qZ7+E$AfQ$Ct z-rg#qs#I28=dgU{(=ByChGuF^=!QF?;IceSb-ULUn<6;y0->9|&*VIemgHSLIt!!=2dEdP8zP&o?7(VdM=f%6@arlC_gqj=O=9v0h zkpaSo<4Fuh6-BcV|0YHsj2CnsF#b2OYsFsf48C5Dwjp@JR3!K&9rcWBYi#}$xRzEpQdKZc5}P+ z#;-3+={y$7B^7V+MULN|{QANYuzBK1w$sdBAq@!4{qD;=nxw+CTL65EvhYurk9`9y z3$Hcmj$X#BQaxxoa2S~hh|Z>{pSm2_+pkxv0GUoZH#av+KK1Dail((xS3ABwb~Bjv zX;S|V#0$cD9xR@1fkiJ7+5l72f_d|wrUaK3|HRJ3GNwldvXGXL9cwPjLFeBtMZFl6*mNP zFYU-8f6p}O>=E~}Tx0Z8bPKV$MSfUhhmbW_hWq6h-RK5cMK1F@#j@a$sGE_Q*|B$Z$Fn()+szrr|K`nO z|A7!-S!Qi6KxV527+_q>v8RZA3Q^T(w3tZ5;wyL@L8l=SI@~~#TSH5$k_TrEGR`|q z5ti8CGDjKaw7?ldii?ZOz@(H>H+$e6vK^DpEOQe`Bnu0&zHV6s|Te5 zX8GbF2-*nBcE-LM<3r#aqtW|_%T`Pr_m&7V_-2O9U!-2RK{#OMadLst%FkA8Wg&Zx zy2byB1x06(*N*xnyt_n8kmFJK;RX@a1LAcOzOU7moCkAR=#hM4>tnv8rcU3A!1);7 zXD9s*~+Pr8DCkTo(-7-0rNG`#^F^TGmJ0avuq3k{@UPwDX#OEe~tTB+%y6&~EXAVXr+tFwH_mx}&96qn3F6oOe6gk#@> zc}PYoQlJrLEh~w*##Q|sc!rrM|GxUJW%{T0r?2r21&?7tk!7-l6}!9EB|Rpzkyw-m zq0!W(Wo6{OYNfI+9S;W%V00XcV<}jE<(@WrhsRnhzw<%;^b|@xlX8})=jQM9T)27> z0p<5`$DGX{JJj!a{&G=t2k8^3MG~-I*UqCw{8lqC5T#3#n-BPzl|c9>EhbYy5K18n z@An3xP^;B4B1qrWphKJ&D&T5BSGsqrA}=p5=DYj7#GlJzC@bdQYxM{c!Obx@el2Zn zaa99@2P9RxJvkx)mx=kOR3^AUCf=W5CLzy7de5^J`91nzlwvV*hieOFq973gw|&>) z2P!Id`_GPvZGfufs0C6KqcW|E z*FHN%slTM-X&>ZU>wj*miXfX}a|)?_!CXnALwZYKK{@awxF8f`YdA`N(^Nh3|$DF*QpE zpugUG6=TsH?bm!JmV*7m!|{!1YkyX{!>fRj)KsV()kNkN!SHYD}_9hB=%69s`VmqiOjQI8LC-$ZLbNWaIhfp&XZ@`rYN0*i{q%-rk-< zHf~9_`&|^^vrbyGxZ;c$y+xgRfJ=bEVw1#Sjg!X2Nl`_MS8B9g3vc%%} zU<>K}uR~-}#9dmD5)*~Mlm}s8GpDg~Z7B5KR8un=S#caH4#@B?Zu9!PdWo1FMekMi zbVl*R>rp=JM5zY2=Ru;)bYgn(iaf<~)o)^GMQ`it zZKhKMsfWbw_6sg9F1q=YS~ydPU-rw?pvG{3f{CCJ1oka>j%BaZ%o^e(q~VTEqD1UJ z{$>ffv_|Eldc-y}q@3-~)^5EU=e-JA)U*aV8wEs~1q8aA?^CM+9y9oC!~!NYwd=!T zwsL$b_kcoR3h7A3C4X77P5AimNg=-!INBzt*xBLBpBRqX?+!6FH8~VewVWh8kz?n7=`r1`Of(CPv@K}zXO{-w!w_O zR-oo}mQus?$D~IRK;3t13NwBx*$aRCIL)hFY1+!!(*ukXa(skpXtDNGn&{PAYudmm z_^c;Zri}s~Knr_h8#CZ%F>hco7|l#yDd@*KHMm{f91_X8LUF3*L=jq#<3P>@qj)ixXY9{m&MGy+n@R`Cx2pY)IYOb@uM=?gofl zEw~tDSy4a}+V8YOz=<@Z*Y10hR$5v*CEikBU%v>T=n_=@Y5}=(G2hj|fy4HG zUe}|0))BY`8pGO;f41b}9g(?EV|apw8B56M$9iqwZf26#zzID`T5L3!aeXchsnzuo z`^h>xN=&G*UQ5P#P9A_hWz~D0tg=+L95zp-#FXTCm(Isf@)$nQz!o^`I6?9bGMYgIzMusB(3iuyJ*BiLd05V=syMCGVza!Fzc6;E}y)OK3*2p1(0 zw{ytSkwZ4Oy4vUVlPng`3kNAR_dXYP`X38@K{CzPzdxaYE7OGBtZfu}?{CgphSIp! zyo4w|(-yZ(gg@QZQm*gmz?7q!rlyoYy^f3hfH7-^sDoI_+e8e0qk z`y~%X5W6Z z37qxjY|A5C&}H*X@=g6=IM2u5o{y1CIhHgoTyDD)!O`R#?KlD~SQoto7q#)cuzuXs z{uf(FK!uE%NGOC&t}^<#|AC16#{!_OUEJ;&yu7{JKppY{pVdgFp-Eo5l(XiV8Yd}} z*CY@d(Ia9Dex<@hg)-MKXxgo80{`ov4MtX#&@PKJY4^J`&;}X?#p5{J^SBL z*E9gAcI-}8d-zA4;Er|F++-Yvtn>^m51n55d$&iqo~w~A1)@QHYhEK>_7uHQnfA?A zF8NW!5QR2;Tep@7&M=Y78PjRhMze{D30D`1uwtvPYwQibvjl6E;P8`PYJ4_8uGh;k zB$Ll#?GVyip(eVQ!#w9Fb_X<^MAzD5gG7~Tq@4GTc?0WjljYL2R~Alv(Nnfv2h~S4 zLQTcQ=i@0`o686l)F^aTJCDPugFo}d84rU@UF*~za8cCNm4qd>5FU>r(c7*KDQ~y8 zs4&T0BJD#DscTT=wgVT_fw**5@LGpa2{Qe~b2$hj%I9+bCa7}H@5y5d10FLPBI*zH zUH?6`w6K@2?v%PYrImBVL|@ge_b<^v27e=&=q+%gH7qrfeYCNGME-3 ziloBkRX2{~v@=Lj;EBvKiyVhS;phCorBA_1FYl<7u-!t>ew|Th9h%QA6NxRAAo2Yc zuN(Gv%@VAlTYl&k8)80N9Xw1pQCfbCb596Nq{+vk;0gnWhs59{^e5Cfu5_K0ma{sR6#u!-46Vnu14PDyS?Jz=#Uw&n>ri_Gro7;o%k*;uVYNVeuS53{wvTz zZfU2p0GpDMfIXvT`j?GC5ASk`wf#EKvD;)7lYeY|{Zaiz&d#Yxl$0OHG|`rdX0w144xUDnfvm8y-+H1M*3B=!L8i~0MW(Gw=XxLuDeg14Dj6SKFIRsI*V7<9gz zw*6_MK9`*`v|fyh-Jx`FvTJ5fQwzG=n8Gg%N%Ebv~wbg^mj@l#)DFg{Z}6>^Ix-0rzV^9sJKSG2Sm--%fY`Z`TD zwW#n1qmS5oi1%D-`CpSkh~wfUBaqO{?XkOQj`(!FNHOnOh$3W%J`-}?j?#B%yLhhJ z1mJb0v{dU=lyi}}uAiF$9bi!LNSSPdrTj{@?ziVV3dGlIn2BYyT{-TCd$uy<7ac&5 ze~C2c|L<$~(Gm zHZ}hw+G?7cy;p!_aIM)LNEYuAf>{Y%z|f{L8C%%Kd2j5)-SiBGP;|aE)Du?Pfi-7x4&bhGNy*Owsp29Jox~OfP!9%`%vNV zq7AWJoj#lmUPFg{#gO0>E>`C-BE9p2rVj@J(VszBW?poDL{SDH||X6 zZO>!|MO*k_V8FI$%&oz=0u*h|0bTZ?>~1Xy%IDXc{2e#uKy}r{wcL66ci%GM>TYJ~ zZxruxNYwj3{+Dkk()^=WHoTx*c?n?eb#*U!!oL)K>OXf=s}9!#rf4>PpGwFUI20!5 z;iVBA#=26kvn4TP>p>-VCC|24#=ArBX~}gfv9D|9rOeWEO&eh$lZN14FJR!2P5e5p zL1$mc7w!DP|FfRiJxXb-Z%Zx z8Gt1QD{>{WG~7ToMJN0ry`iiv(COW(4PoLKiO-cz}Qg?Xkl2zad&vk4T zWxNojPhJ{4e6O`i{v8+}H60LP$oc_F!wV(O6`wL4sDd4Y3jG4tIKd5s703X4sq z?gQ!Z&5CO6K#+9u;mzxk6mR&&Z=y=!wh)(JXN&AL>JCQ&{ipG9;~ft8oVD#fpG|o$ z=Q#U1X%}cdnxN84ru5fm-azlX)aB4eO0s>bTSRjY-03MlGN{!dg@P&8h_s^vRb(*e zu5|ZBRtkO=IO}~M`cp#ga|!{0TLXM73S%GXUi`q_Yq;D|E#49l0;b@8gdk_B zj>2Ym-oAQ!B=Kc_==DbPxB|s2Pi`xT3QH#Q9zKOD2TSko>_fFUMV)i$h^zwUUvm88 zLwj-dp!pW$RB9ReAAb#(GZ9ABK1>mpG<}cdm(nh(@IZQgH78XP%Qq{@Yhw3g=d7wt zJLe_&YYX^7MkR=~_z1A!t;ohkulD_OWRkgas zn~IxK&%|?@P<5^Vbnki$ZX};2mY9Ly;wJ7hRgg=pfA(I+TQ+1g3$aE#+U}YP3h)9A z(DTT~d}tms?Djy_>Dxe|h|0$9V<>d2Bry7pgtHa$fMFvuyn28l_WD;8*PmxG#$|w6e#prAD7UALz-j0;eDz9{7=%A86j$E}i@k`_hoK z_nd9{^fA=8K}M|LZbLbGj)D5p)S6a<_1>O*jW*p$B7&D-0O`OLAAi6$NbxGyAcD7! zG7arMWg+|6lHu3@X4J}rjZ5Kt_Os;cDy%lw4;MWHM1J|pVtW}r`?6-wCYU8i^uH9T_hxB;gKVq@zWwL z2Aga+ZZXeW0FEcZ^LHk{L&)@=-}v4|`wnWXWSX#t{hn8LUZN!tdkDd+x@T}?9|F$? zZ}6Rkq9q(jHLIgKT&!IQ#T}V6vR$@W4JnuIk}v(4-5bFojjb4Nj>!^Im&rhhTM~;) zJ<>?`{F-#a_{Yr6E_M{IH6A~ErWx4$9n9L)^Wx1|G^>nB*e3|`&-@vNlSESN> z$8WP{9>MR(=6S%_8GigQDv+(oIkY27}ihkcn}EI_(NL8-RTC4j7<>2X8w zD8B;JPN1U*A-jaM{6n(GC`JA=8D(MtiVg}7>>g-UbtM1(IMAAq`56)LhR*7pI;;O> z(_wkqL@J*;`thW(!3(JC>cAB~(6jCQwbQv6_cyS-nu&W180$^f*VV<~EYjL|e823H z;ss0-Gm#$8G+r|euRJg&Lv8Yx$8v_)IY;7DlqKt|YXTdt>ONLB{__&^yBH$K zU=KAnBNUS!bw02q=wt?bZs%5?(a>Nr%}d+TTk)O!`E?~1%huJ>v>A7yM#<(cs8Jf1 zcgoUms|Wr_5hvYXt{hvCT&i#xOH?_jO+PTR2_dk12BJkN2Jxc=pt!?T`{EGw4tNu% zI(cujQ88ld?MV|ATU01~10?yI*Ufi5pIzC``NX*0`JKOF`K-%1_u8=qiJpjlE`feU zB4Ybh6eOORmeQWVkxrG=^B&u0zxyvE)W%_Xp#!`5uU`-qlw2fQBi%-mG1BT?P33WV zrD3DOfUJ%Cv#qpMDfRO8-^M9TK=f1!D!Cw1E=%8W5m`s<-5`mAc zv2XNxnN~mZ;3Rjnc|;t(2-WdV7kwSVsFkP*^vZ_LM%MmY|0f>E0hM-O9eL9jBlCq^ zdx|Od<=azTRP;6skHlZi_H@`VJ+d&@qsX~CpZJrZcXXl(r%83F3ew5xAjzqnZ!Mog zo?wb;2t#%hJ!ZU&4fvsi2i@~tK6#642MVLz%!?@o$>_7XKO4U3S;@cbYFOj_W~d=Y zzS93$55iJU&MhGa2gVE;JEVU9*K)8Z|HFmH7DO$LcK$&EZq3B%~#b>cZi8-~QYN8Y3^Z zzTT#-^x7oOd4T24zbL9Vjr}8Xmb-Sor^On*SFiHeORD?5)^Q~vfnIXA@J`9Uc{&n&<-oB%$#?&u1NC2X1+c39liZ`Q+q2ly~u*E%!H zOVTb?rz(Zx?9fg&p#!}e2q6TQJWjXvqg=o2b1Ai?OJIPticbmT1eVmCc#Ra`cUu$5UbeF#I6j+p0xVJ@gD!m zA-hc>HNG)V&}91I-I~P6!_jM}h#$bBrgzo=JH;Qx56a{kmBr4sV z=kaxjvhCN*CdYcFO+2T`-(36E59NbBX=C{^)-( zrj^0t9uwBHt3tIiRYalQEF)z?{G9G{zm9UhtOnds;J-x`IAUtRji!`aPYs2?-?Z;zJW5q5JfF;{VV=i52)=H^@1 zNvL;?^JtiaRqQ1>jd-wuLF#;=%F7}Tp?Pzfk>awAq*Q)Yx1FX@Qf5H-g3t!o`h*_E ziQ`8==tAeiKzmyraMRhJHE4q)xWms}_%8lqub%DM?p1Av6uruq8gjz9J$Gb@!rFmU zoW0}vC%>s0D*8=$Aq_0U%i`ZiNX7X^%I6bw3pF<92D=->ZOgPQ;;7v_ZIH}iibrEST7+2i##q(B5ak{9N*8E8sUY|SNp=O zoWCao^zFoEUD9|4H6Fc{#HDeWU0TYMTOUr0*^OF*|B5!}%ON5p!6U>1P=I0DXhR5L z2+e%=YWic9!X)d5rpu;cz2ko}H|0|3JIqjlH7+6{B{oD0Vg(aSa=?ibTuB>!hVEt| zEEVJBExhMZw1k5=d$Ye){eATdB{73${Qb?-5L)u%E-Mr&;|iRUg%@^>i8Drgaz=?> zl4|W49o2Mmh8o5zZdNNt?$jl?InY)$Zm=LSMr47Ma(vUPw?~|fm#$0NLKMES3tet zi5jmV7T0XIpS`@C&#;uQ$4tw+jsDIm5DPVjL|e*UlRe4#GV%@Z0rt}eXW5#s^R?CT zYK)D*_>(P5QBKF6#KR5_c>#@(dv3Te)e+Em|L<@iCVLDG<4u^%FRXS?6sP zDAw&R^X6dwkiCdAVC~&`s|bk#x`zyXzSZo1A3;;TIj%$qnbnbVnz6+&9_y3&MTy?u zw3%KTWbpVLjiNu+tfBe=2)TIylU&jLUlndk<^z$nG-1>b@hyI(E1#HbMAXQ9kSkc+ zPGDUg*G61yh&@+2sHE-R1tf-S83kY#K=fZlC8^^Bbgd+_P_WET`hvEW->E^1P9)Fg zOy6DkW{XeJb;j-()6IJ(+)_y_VLuhMX&LJAYjS=Q+v^kT!&VQm&k%N zWx&%45xi?5F=&k9P=Tz36VxC_catMwC5Gl80mg!Jp_qtX}5(6?L2YmBM;-_VceS(!*G zgl>ff9GOlw5N8Q~BN;q?u|cIPkM04c?<)QN{ng%7#XPH~CKF2(Hx!^D4gu5nc9ilr zIHvZRnv>q-gCr7|+LGM4BXmiIQtY*Pts~vT|J(v!G6r2 zVA78b|1cjsEdTaxW)~PilvvGeFFPXVS&4^q;cx~_lJYeoWnD0{)E^aRn!_mnj&*m2Z zY;K(|qXw_nmc)2m2T&7nUIXj=^p2F2RG&{tnBTJnpgjT&&c@8lOb)O}sp5F+@X=Lc zdN6eQf(l4&BA}zQ6gYjNh^r)BS@zmMe<`7VGo$@cc1%PPLV;laVdBY*%NSF1LCkuf(n*R83ksqoW_D_U^ z?q^aj&+11`MrQ15Uv!(RhLI9|tVfda`a~&OCm_?1^!^6iF`#)PngwTLir!W%;+Hr_ zmPl8?U>jd0jdNuP;HjN`(&qsd;V@1A?}aHDxPn1Ce`#hW#cG z$(eD^2b6?vM+YN3M@MV*i%MBO^5lxSziCNBy?{PLh@+9uiplEF$XbY~3;>>6;AjH? zMfV?)s%E`{m)8vqA{&cCCxUef7_W^sR((Cveb=GaSw&4v9o%>m?2qfO6G-WKcyEpR zV2v)CHQk;!%@(x97Bnrr{E&jE>a4=e6Wn$?t{H0BL^LcvWZAq4ZPMDd3Gny#m+w=T znfru%>;Y5xflYV`(kKcQ;ya>K>c26(T}O?Yj(!o`Qc#0Av-)H&R{-^D7#9ziL5LA6 z!5uX;H7njIor!JL=QDfAvV;*}ec3h-nFq5T7z|_E)=K2a3^sA#wZVCw6WxH-Bdf|Q|{nIIBxUh6l#(@{0BZrZ=I(~6BC z6%*`1T$_Z+z0iIy;I&0|+1{<uuPfW7@!A}cOMdA#f!$1%hLy+sE3fb#Ny6-V9v3RxfIxtOfdTxFAHP*+}!liuEv{(bdKI0p_|-!8%Roa z=Bq@eI&`$=#>ewYx$P6vJu5DUs{#r2VQ&8nnBG~-2k4q*M>|$f1HOuu-#*KPqIZ9} zo}E{zg~4qSOi#3LzkFv;PPl$I!xt*QCuE9C@$$Gf7E#RfSK{i zNu${2pWv4dzp$&z>!^;BhXB?#a1xJ+sj0X~PH0x$FffkT0x4z*I8~bKx@2DoQy7g3 z5iIcj;lsKE0%0Wgmt+0|akQbn9H-a1Eas^o2GBJ2#RKrx<9oV>g@~V}KiHR|?1&c zPDTeqk|SYrRHHFPnQ%)^u~l;RR*Jb@Y>7L)WS3XaQmCyD1{^aj*sm&~E?t9#g(Y57 zORHT|S67h9@sEdudsAa&fh)3YT-U?df^|+lJgkx;^+W5V7`Zf z|44W!Uh6T_Ce^M$CfCrF;~4g9`B3)HQzJ@p7p<#jce#cD(6zhX3(%eGT=U9^o1d1< zbQ$2V)ivFmM~Wv;COAT5;Z|=u66}nSr;3{sfOiM=K{gnBU`3|)yD{b&bFi`?@<5hV zk$B5+w6x;fuNz+b0$*JYN=0LIJ8}mx$i{mLK6F$CnbXl4%hdj|P(Dy;M;Bu#D(kfP zk&6N}I=R0qD2!&jcJ{a@%4+BA|rl z^`H)gTX{T@Yb(mi?p|H)SHului7eUzuy#NoT~i&u0}U|_ti2AK(Bq<9aJ)Stt!u&+mJp0 z#Fr1u0Mm%3vebHSqAuvW-4X60z!DIAcgKpAlP!;#NG3*o>Yd1MHxNLj&yr>3%HQgx;OjmGr&`1s5L>Qb4eCe5}j z500tf@v3KHoxN*a)$mp(=`-3azpUw?DR8>Ee8l-U%lgGf?NUpYy0E`l3!f5!ZLGhB z7$FG*q|;H#!LHN08by>r2lS-yh%Ohz*?;GvVS)k=Mk;InaK?BM15{1YRu%YEtZcWG zC5sFrvLt5Wn^OrxnMUcicfV>d4D{c{H$nuffBfKft!_x|-+Kn$$7!l0oq5v`JSgo4 zg$ofk5zW`3<|ss%)l_51VbMFw0(DXCRP3^!u+7F(oF8}dvp*Iqw)#t2nfZkPQnvVO zfW<~U?bF^PX-f}-#u36NQmiso5_Kg5~k@bc;x$P?YrAxxb+svGxk?4o^t_lb`VyRm)2{Vk2rKQ`WB&&?0{iTio#pAotuxMF535Z}W0c0;013k<(GhB33QA@!U z_*MvOiv(iG6lnd#WiB)X#@KgHCebBzOcC+qbPv9{G3YRMer;{_jRg9Yk_hehhWdrY zKA-o9xS}<_H3t4edF031B7@S@MXXEpZYUKmI-DoT#s+e zdYS2+r(nya33eQ?;r5J+q)~u24~080{zt18gEjq^yvYFWZ~;f^Pp$@O?yF*4tiGEc#DR zc|uC%UWbd}-NPdTV3^KuP68^)F0^pVt|$VC1r+RxKYMBM{7V^xgDFZkm&g%HJz(33 zq=S1eFfdJ!FG?Kb_aFZ7!DOryg}{>-*WDmTuHw>CYrpOGC)I46c+Q~`c5{9VtpnV# zijOhS`cap_@MuH|a4H~ZWE6%WE#QhIecHn$+}}e)|F;+&FsAkp8WskVXQL&`UIO#R zLU7=4n617d$r|~OcdtR{Gky(*Dx>uwo|v8pp!Gwr!!Y7axUjf0@E@;s7`}ae%|Rth6*mvNoRJ`3gI2ig}ZPgvdwZ z;pe2RTY4PN-3$t!(SgWIt}`I~`yjC+Aa9I_8QFPm3+N1kYzt)$pS<%9lioSw*MKN< z94Nj?6^zh~slVeYz>ACsWhibI*^dLYWjMGV>Hf>{_@7I>*3|8_IY$OqplF}{7lmoE*$rk+ z?CbdXP~iPW@3A8_aDpj*e*Ro?5wQZ`$z6GCs|YXjcQP<6!6X!d&x2@P3lak3rhdrw z`q;rqIgwJ3_**>v5^r$!xyX-zX9)z5Hp;M?Ij>5qxk5BB84h-%(J{>KKc{6s;!uw(OL-D!%m_&Mtvi+ietH=| zp}u3RA3C3g6#2*I%IzgXJ3FU~fHuNoz5^G+El+$Y@#aSZfMk;t^ZGDsrSX?+0OIYR za?EXifNcR3Vox7;0S|YM*k+XXbA$w0zKl<}uUqX0Ee$stM9BIG2Mq=(0q@^J`dNuz zD#Bf6f0!p{F9QU`-%(LfTu)UZki8J)DNbK-Mdkm-rgZ`GGvT|dquhNxVEp6yhQ{Y1 z8isG`vF1L`K1athI$F9~Lpv=kR0k7CG3BT@oU-&ue0&44U;v0KgavDT@hW(SuZv1| z-vWejpnSNBZ*6VW1AZob`Cp3cUZOsaP4E0+d)XdE7zRJk>caS>BGAX%&K^P+>Nh|5&(KFG-D_3C|oTtI^A*5FhAF- zJYk}}b9&RvMoos_@_4(~2-HnDuYpo7A1JHiF8P$s{wp3{0SC%*#9_wrHi!~cH@A>} zQS$6tS=k_Xb^^ppteZU;X);yf83)$35UPg>G$1ns1^`ztOC8XY!zSM)b-Tw34P5+u zUqUhgk<_WR7#0&T?h4`h^XE@0P^Bn3Mu#mOEqw$k$EQN^rDB?6IN*kzdn*&BQJ~-R zD>~_`JQC^MiuJ)^rX23#cjBh}lMxFSG|L{q1HVIBe}UbpnX_trLUs&v^aeXL!=LRp z@z%Rbc`3n%gtQ-m7Ny4N{IY8CPcgJa z)YBfym1P8Ud1S*zbaVYd&~0gYBp^Q~2f0YR;h=xNt9S*#8NA=4aQUQ`bpD{Tpg!Qa z+aL)N%Z_hC$|o8zEdsy(h+<*6c;;cCIF?`>geDWY;2n|5D-*e?4jJ^v}$e#(|bq9}W=L>wK8)514Q$cQ!bg~DY z`B3m2l=WbU6y=y0)vmIzi&|wT4W-5MQd+w(yuHeLCg0>R6Tgb_Us4yvZY-X* z3H8t_u$+2}+>~mwT{P+#N@+%AJ!Ex4zp9T*{sdQuat>1rrt$QyVssR{{9LkaNMpuj zi*oyIYi)1Ml^H)-^=}yK4SQ6vPf5RFbf6K+5_tBJxNAwVxBr~$DatGwMgyQ5FY+BCfTAzTbSQ51e`FB^+esLR-U2V zRrL$@=Hk@dQoWB7=4q{`&>8=G^UypWiYoHq`E7f{(pxa4=PUc*8G-BOxyrP%PpyspI3lj9y zsrn>Qks3AEEpcXQ;J1$`nDi^&EzMurO@?9^rUTqs+#ZZedq=O z=?>}c?iK`<5J>^aLw751Na;}NMv)Tf?(UWbX%5}_Zhp`I{h-%%zOZN3teShRbH zWZke-A@~xwc+6Y`r@exz$K6dctmG&9|MgJOyBRXwlFqK%Uv%ju;L-JY>n`aCms>u5 zQmC)V5CoMMB=ZI-Pf^!<-{q|%-P zK5&c%cQ-6`^Nek9L`>mL6-K$GJAMTw4tcJ_qebP8*=_SZYK@)#O|hB%%nROEN7%mg zAR2EoFdevhg?)h$^F-x;{y2E%p1ZN zIc&7HLCADc%{NuGpq_2IGA z9yzKjD2;;K|K)s=QV1Sr?OCzZ-XV{8kb1tGgjgJ1fviW_!H)kNyoKW6wBlUKr^dIo z_+S;KW)FX70R7nx5ii($6PPU*x+#yTSdOxSI$NoJPkbTtqvPp&ca#m}lgkU7@~%bb zwJ2i1lH%=RKKp)hi+3fopQvqKjERTj} z5jzxIqfIWW0?=+1Uz@{T>>qr_{SX>8aP68N$uWyqPyOP?UTgJ^&{J~zoMd05o|tK6 zK{iYoiz-!UcTKDCR>G^Wh}Ed?`Hn&*JF>#wa#Nn|qgu1;rR2~|qxJbhgL#31Q@krW zXe_)rbFRJ5#0uGq8C;T)QjDaF6!GO4lmqqUm9pXJl1 z)HtaM>4jRVpGMc4Y?FE|HBM+cKP=xwW&O}c_6m8P;s?)=n+}IvGFXLa+J{CdcOWZ+ z21qVua!2fle5Ac!N||p@l%#k83{LONF+(vJGN7;A7un7#n_c8X3n_udp@;J`Tf(ik}6_#WKvJ5cqRpQ6PD1=29?^Nw- zg>K&G^&V{Ojb{<_2O=ib``$k13qJW9y1)-yQm`E$HgGJCewJ^Ez4IVflJIMogc1Gw z1}$j!0rjKDzC*f2l0_VvRM&$GLF3T|V(W_)MqO5Xx<~`3`+!S+wa5{~620%pl`%g? z(;JtJNzS{B?=0arg-aHTqM7po=$HAd=AHPQ(g=!qk{II22-mILE8;7vE3dQKo5t6E zQ#NGYVXXM!^Ofu7l|fp&TCZE@X4~qBHSs+kNy^E6(uRCm-_Mrlimf%;6I`r$I~?t- z`B3dYZ&5-dUlVWH?gV2FzVq_+)p|^iYX-S}txPu&Q(KYN1V&@WFu8rsxmyEKoUd2C z_uuWfiJNPfF4PmW#L6LX()kwbJOS&JG!S|s^;scR2a}Pkw?I^Tvne@R6p|v)W&eCO z+OIWrHpr*u!}4Sk>@4W<5#(9&By@W~J-QsUa~DcgC1YTS4IcI3dX2#P89qrcu;}GX zbhN+lLr()jo_u=ti)q(un? zt-f5l>)}ww2C>8IYDXcmYFd>R$mnv189}{23c}Yt$6Ke__SVqybGz$xJi88TDd$>_ zXVpu;Pgmd9!m;NKqKyG0ixyK@MLKn4j)OxA%M82vc;U8-UU#+FZ<>>;0?{{p(Nk*V zd1dkPc$86l>&F-n9eQ5wbJWC0JKEnVg{k`5Qo;cOhLGxCXyy1i%&2EbVx zLkP~SPS@PF<9j;0CW?EL2H7+W6K*?59yQH;^baTyQSToCnFNZE90{u{j$V9=R+Gg< zT&V%50B)nt7brk&%bulBprvVQ=DMx0A@=)TukqFDx3e&ndz2;YlzNo9hJ8_Q!geZ&X>))0%#7rHUq*trzGNc9}q&q0FI=nNmp zNSIdI05k6Kph1^7fFptqzN;qQ-{P-=L0(8r&&|#ui{Ivn()YLd9kE8nAMptEBdGY2&* zh{IRjO(GfYO@%8Bm_STm9L%omg3lW2_6pIer!o*Ihh=@U&TiZME$)Yemj5jCleD%# zUdCUKiUA8q^WqrndgTC6{-F!w)rc9;2+Z%kj%F|CNWB#_Kuy^Ld;^V_i4P_rdbQx} zsmkSo<8%8uM?v-R)&rA-7;;6@MxHT)vBC;0-+~i|Gqi~1*d6tVTL%fN zYPIFXhP95S-*ICudyh}!Nxi>Zw7(;G9Q-|K#y;>uWvrP74f`{V*@I&r$x4q~#|X`Wq*#T-L&mm0Al_fE#?(?;MR`pi2DT0llmXV7+uf>Fl z`~E|4nmuQIeZ3B>{8ZKX_zK6ZP>)_D6_Kd;?$W; z?K&>Bc5?L}C=Lb!OPD_L1-co=oC+B9ZhjWaXb@E`_KLB1H)rIKY~hmg=lc-x!tnxi zO91>+%!Viqx}n+Qkz;*PBy~^V7>gmM)-x2ck{332lgO_wZ%hv#{RG9(mwzTDQ`r%wQEk)2Y>wV));F&%0W{PU1P!s|?@We|-tBj>R8?*8K>1W!stW z>dop6a!mKygfA(T65UCvr^-J$!POPYx^`5kyrKvb}rm6S_RP!epnFKS;<^- z>gkjY@ig`P{`>T!gWLIR{~06Jx59L%fr&S{dW$CcYP4~Ikza=U(**7>m?{%XgOM@| zV`(jFfp$k6SVIP;Pc7h2xwpjsAZAT?kr@s#$H< z(tXuEHJL#BV+n9a^dzlj8(lpj+XbSKkLUt3O>V{FSFA&!T|cCNZFCd7KyuUh@9n#rc2`WXtd_{d5 zpS__Zm8m?Q8#{l6X^g3C$ zre#u)t3Ez*9BLb>VL)=$gNVE(H>H> z8n|h${DHPz$^d9Z0|IpF(PrDbEF6}-j#GeAc@s8nKh%|on#0B`HXy~V3JSl01S*-# zpB<3SCMTS$>DGD@wZ6gX5XYBp`aNELvi}XgB(gnm)ys1QCUUhK;&as5&c^L=;wbKZ zy785tU3ctnSmVi-lmuD@OofnBxoAa?Qy}2)_Pd=FPHtvHO!U&TGuOFxWIPl|N2aM( zseF5WQe=~z8!x14$_Dry z1}V;J`$3;32I&Qx`2?{z9|b$pT!gw4iUemGH&V=^ugJsYAm!D(dJ0{@V3rG&M^SBi z1Ij!5$*7Q#aaJo2hQ6`A@`puLwj%?sRbIsY*d&b!Ti1lVX~CFcmQXfT;x0oH zEAl?{imRcsG0)xV;-j%QHKt?dm5Udecbb}EI=L)G0`V(fy$4PzMAPlF#@+DNB6_*U zn#L1OPPdj*i(EMv#EaZrZ_WCT#Q$03U!N`XEMK?piI4!Tr_)^1O}@(xz9l?(&H?_x zv>&@m26}kd=XG~v(T-s>t#-S1f17WcHqKRN#tr|a8x^Ip`fxu*N3fl#!LUCg@?hcI z{NLuLePIR`zU)WDtI3!QteVxFy%$t17u@2AE3`~-&)vRQMuXmPQ@yfKYV7?9%z#Eu z3>|S-`lo*np2vil9mpUXr2*ahFY?d!qe5Q2%5jvL47SJ?*d{34Fm7Q`*wGKG|G{a( z4hCF7F)<&ef#38L4k^3_vvnAx>;uug!^2A|v_Zjm#&R&BRfO^qqgBtj-kI165>|9# z%hG7kJRie3D^X3sFUKxmv` z-ztuF!m)()hrbu$B7XUrl_|IygUiTfh@r(bg&eiNzt2JTW%F0X;b)pVX1Ch%%1|sB zJb%|l!`v~fA#g2p=g0qEM6A7&dRt!CIW2dvBCTG@LykA3AslvnuGrV??T z^RcVY+Q8ZTd8bBf(#Qt;JAm;Av6oqQwzMp~=sS*hHIsAYT4FqMUZ8_-kl`5mSZ=ScH8Ts1;1?Yo$R)93Lj zymKwXR%Q;4bki#Rk-tkB7IS_7mng}faJ|1Z2a_`r-;9$LT;w&{oia=9l8dh~>Zb>WVFj*xuG*lD-D*&VyDiX%zv;VPAq~ zTpf2edBWGfK&VGDmoUW~Y#G~lo^0KXtU434HM-|0QKb$sRBukV7Bz_Z!d|^4<_7CG z(>nV4qAGa7_t7=;DRD`>=C%4Ns^Cv>P&{F>K0cA5z8zW5o^?QBD2~Pa2(U*y5}WmA zy3@v<&%p7ZLrRfP3ZICjHLWdo0VDYvg<2pGXKDNV_GS-$>jbBNY~OkxaD3~TdP#M9 zTh~0P`Y%c9aYyD4AqTn=U59*RxL*OSL#YO+&)!9xCO~zp7FgBFC~jiSLnA#%{=vb? zDamEfu5c+rx^yQD!}JkjCl+Ax=w0byVE=;Zh#e@zXm=_A%+P<9gQd%_whzDQ)l>(U z06pY%z(dOJnD40}Q};Zb;P5~HxG$j}(LL>+nTZPEA)QuxqzGMIn$zW12(j2lb*!N^q5&ymE?XVDw-)PD>?J{NN&x90bnT?RkbxbJ z17z0L8KbVy0Wk=kO?z8fvl?F)OMX?Nv@YULDf@5OC%3Q?ad~`I>a4``JJ7lEzV%-y zKZ9m^^EJ==&CYZPhFtc={;pvkat=%K*CFtiOSf zUIJb^7K5unl@Vk>dL@9Fz4%+C1z)~5RHw~tBm`33xAYvCM)0I)&1~?eLM_K>wFY7U zM*;IaH~H?gC>Oz%%2Ssf2VDd8?P?#GDM^{f9S-v6K*R^}vgSH$2mg9x2fya2;-1^z z6-FKp)5>`XQim6M(AOiUdPxB(_-h62MJ^=inmR;Z%Ma{D2bP^U*iM6NA|OCkAO_Zvb)c>643T zUTR*3n@z*Tkt(}(FF{V4I3#9=QXG|UZ%DcMIn(6{(_wHSrw4-4=J)6jFk&JeQSdg- z;l;FvkW;mX)bbnm&ul6PXO2qXwc;8+o=?Y?Zv7LfDd@v>81|DTmLNJ9s zlY`lR8iwVq!QJ!ba|2f)tl?0@DVgsgXxZ&=YRfVC&HpEDEK+x!j7Oy`=-skML&dFQ zpGb`ZmdPO|P>#`l3K5XL6TFUzIV;$(La%^>M3$2F`0e`!@yhi3{w%)e|2tp*S|BZR zVHa3nlbH{IWF4P;wfP6FEk6}9_ax`se@o6Q*jRlf_NfL%9BYT1NiH7&o#bIuna8T1VMBM+l&xVV_E4dOQ4=HL=`}@e14-7=0c<1(Kdo^uZOaW6P84-b|sI zLzTJX9(9+zvA_KGc*%b~&mnW?I1!0^i1~+Vt)Wkdi<*|(t`YRK_z`~$Cbu&x4$am6WPYesZIWA#H{!R*7kAM?*Khyzb8%qAG^T53{y z-X`cGpb@*5%67Bi#5lQ6O&2?wGDWOaI#Th<-b6SWy1@-U)1-;TwWGodGz|Qg+4Syq zduDG2oLc^ZPA{*t{-RWRm*#==HZ*kN|C~SmZxSom*{gi@t6ox5O76f)Ih2vpC&JxQ z@8d3Fv4`WB09QgnLW8c;JADjdAlWVgo|5#NAnjx4yBbt31H4CH*MZ{YL4-RTVt31s zs8T@?EPPa%byux9Wigl)K_`ug$hpcp+&~#w5*QIo<=FH>2o7v7O4@SDDq1Mp!od4J zM0DB+B1~F7G&<=Z3DbE6&oTeuXFObaHt#f#y>&V8+8B)TA~6NQwYxbgudM!20uFzo zPZ5=r%m4}F-laD5gtFc4jUJ{4`MlHN>pqtJv=zWEs?9h5rWQ}(_@&qf6D|X?;YGxC zty%Z&57LM=udxLKGykuUVee%Lguqa6 zT%+&SfhVv?x+A0|6ZPS%-~7qDG@V-xJst8tK?s2~U%e{54(f%d7Dy)7VSy$OxAna1 z$%Tbu@qdCnLoG?-Z0(nSdrkco{V^Y%c>3EhyFPH0?FT}5vEbChO^9CWS1c3Dn)#22 zdc@MH(I*hQ9rt;!a%lG!*TzVo@96zK9%oBS8}I4J$k3=Fk8#DX7tG|p&_7oV**)W0 zyt=tx3~-?TJPt9N{_^UK;Oy^M1d&WwKblF@eucxd!&2iMt3`v&V{-(*sg%4b&gzw# z(OVrcxfPC33I{V0d*`Q=0#r5=xXzv(N&Cmyi(<65&jaB`R0(*6g3bPq$v6a33V2s$ z&eUq)|CBHMRr6q&`RW7Kdp={t)!KOo&U(aO=OPiK2{@MTU1*pf#VaFih^sIL# za;G($8?4TGV=hd-WQKASj|6Q2TIZ$`r9%nh&?+~Ex==;gB74A_ zF?L;a+v&8>(=Vu(%Q2)bT4rG#7Da{Fy|W||jE76Ykt*c1M8}f+m5EhBE>AqHcBUuB z!iJH8&H@I_FFcSS8UrqXBaah3h@INx_lCs`j4XsxaGW8EUN1`*#QhlXyRNYNWn(ooEp}7ZIj4{fzissIkry5s-vVhAp70FkXP?2ExKwRy| z48hR+j&L>F+wv!rK9Zm5L(8bp!wY|s?ExmYZ3NE+&WB#)+hPhPO!-=EiN#RG<#1F5 z7%PxrkQiai%=B%5#?u=sY{HL7g0{sbwgI^!Y~|*fX9XOer-eqk0zE+IwN@@Y1_=g6 zQlM!MR+FO7!=MwNUUF(b_n;%r2OK^7$#=N;SAODO@wEtX(GVUxVCp{AAkgY@Xh^U5 z!sKPM*R|E()6bst-B~kt{ug0?LSOgKzT@vv{tL8X1Rv+)Pv{`?Q%rLhdUnvFTd{VH0GbXe(Il@Sa>vi zCM>qpNhGo^|NNl}?^r;_@c8>z%m#-jrOan<08Sn`VAJlM$x@tDcDI@yn$Gcijo^kt zhZuuI5~F5jV0~|0p*NP+1ZYhMj9gp-2<_AcHCoHWTr*M1F{`I?7C2%&gaQLpHR+`x za$1Dk?eEJGyRR`b();+7adu_GSq((}%rCkULNhZH;&=_qCdl$^W+tr#A6#o)r_3Du zt95<~$~{{i{bMozePi*m?gZTrr#LbZ(gBt8xvbBu6t-UwE^AitEzynUDssGGyxcuM z#^deGzlQQ6VNtc71JlZr8H-hbWUwn+kyfi?hdJ+$wIO^;O8CVxPukL{4L-5(%ZQnvedDL&g6?Pil2kda2;b>Le@Ah-r+uvv+4XjQ)|(8#A<`jK8aMcy*C`B# z>S|>2x@%@e#^bM@{1exKnw=ikNIkB8ITyoC8t|gXcU8Z7prRUnzL-5?>Xse2TIhJK zaCvin>|dLh$c2Ub-l1a;zX}u&F)jRLkdS-fh{;5+M2BBMAiKGl3LHmS5gvxGdu8+- zulK~o$A9kZl$TdfxHe!yjv6KG3~bXdzFMFl$}!h1kX!ua6vW3lLM_0@MepVvC3868 zoC8w538+K6fB(FhZbwuojP|d!AJHnFqU%$Y$u^m;Z6nnkr0_F+9GvuR(jfljm(_aO z=r%E;wCuf`UM7UH_qDC_`(TTm!L?Of%Sa)(0ra{+nHK4`jS1pfkBGLPX&erSL?`|G5INPK zx|jMsCRtmE>dO3-OU(U1N{e2hp)E0yq_FAy#5$oHr@xU~fW;{`zG`2@pnmruMK>VF z9NQTW>1)kHobvGoP^wTX(Prf8KG)bs(Kl@A7?k!8xamYE;K?ozAgl{ z>P9+;Ai&6%kg&7}oz^{HI58eGD7HGLp_)n9q&SE;=tn)mUUXpCLJUWMF)c#34`RF_%n z(FNktM3OBA$!gHM`Z?>~m6Bx32z%0ttijM4KyUdRtZ35Ots(;WCi7fo6n0{+BZ?-e z+g?Hc?MDW$96Ddk*F-c7vUQ^F?Cgy0xPm1JqDW-0k(HUv#qR+B`STF#iGok(Yjhk> zY8Dmfv{Vv<`{jdMkcE^c+SO%lKs{5T$L`yam_!Y;;)?ywAG=WM()lX4<%-`h6RP*!NGXamLvvka~No40{aOU8*4^*&?nACL%$`MYIyBz|~Y0j`=v)U`+`v@q~l zjyW!g+@|$uVRQpY)IKpCp~ps4MV*Inz(b|#w5H*VtK(%{!gABySa*7Y(!ad?&Ms2e zzw`cS>zqFl2?RHyl7ftFv3plr!LwiOZeuw!h=Vt)FJAZD?!Ax7&$-%*9y=d`7K(`u z6`XwU{#mezv;L|__2-9keX!&3Rf~z0{SD)ow_#&cfVK*M^`9i8)1&v19oGJsD*;?6 zpqo;g4Jg9@#-2K-Q)@o4@ZdMz{9Hb}WP3EO_-IXl@(R@tz+2vN6)mIMQZFw*q)<1@$7Ow|7OOD6tStzZQC!8^=8ZqotbpS<@il6bTvAfT9kjgOTtJpXStnM$ zEzN_NgZ$FVeA`$G#GyPb-QIdHS}h{vC^R!%#6{Upi4SZ_xwN}}`Iwq~#ZwXS@%V(q z!~^b86NRtVx5sj~kVv!$t=ml)_Jrug@RRea)S|-Gb?Q;pTFw%$v`mFwVgyR6&f~gL zkyX>>_&8u-+Q&owxiNGbwySVVhCnU6SV~L82YQB57b1sgaY>_>& zGmPc&Tfc<++e>l6N}iML#LM%Z%MDfsx^Fy0hyVj-ASD z;{nwq&Jg7o1e7>^rocL&8Nw~Qs{ijdZYv|;Yt$o#|83|aArTP*U}NJuzaqrRi36@e zSwln7)%EO~1P78#V4t}xczUdCY~X_``_+^gTj`uZ^ED2}Bv{SqK0H_xxUHT5I3U`5 zE@bW+5?Kf2kie{;DQGp9QaE>?&1ViGjf4!sY-HNFU6b@SKxT-fhL4EtY$kvS@;w0L zgLm>gC2CQ5oI=P;z>zCZ0xhO*loIg&47EH82Urt1lq4GGmUG0S*SSqvfhcMzD!-dE znU^mI-;r-tuww?b1r83rj3O7pk%M6!+wyv-sDzJkMVun4(v6iaA;^ zXqzK{D=NG_Lf26~9Ui~vou_FY|EoAF!#~Ek? zR`kYmsIX+i?DXHi2SLpyfAJnC5=r0M8L&`gXUDD>O|kRl6^uE;3Ve0qS}%tg0}yQQ z$-u%O?(YxViz{)(R<(k2-#n;k$f~;7DuG_2R{<#{y0I?qccWit>@QR^kofmEy9zk7 z6J6}`4rZDI+!3`Z05_1MbDM9^q@M-40S`3E;Yp^CjQe#2pFKxzA)YT_b*E+hKiGV@HcyWLVl`GYGNYNm+o`4 z(W@&@uyCR3{;W$IL}i|ljdK~AfCVftlqbG^vuwA^?e>}rrdsufwAf}hwZosWoXXoz z9>)|*myjC`9Wle3Zt+Zc*vWkzWNdB3p|q#+(V4HStK*yp!!+n4E-qrJyll9blx`yD zG-SKG45bJ;2?e&itCJ@bPz3=VRCm<+#I4CS4$~bq#+#_fh$2%zOj7IvroFgZD z=OzGy7-P-VU?sulZRyYED$O0Tuz>!bwlOT=H_F-nm_17Sd^aM_CJ~ZbVP;-)9qk5Kx#b^FbYAp7Sd=FB=!YJEY_+G4T2G=cmGs z=w}YqjQ4F9&MP*eWgTs z)?g$_k_UYW3psEB;mk!QdP&J8c=X@JckD#qv>>%& z?pTj1bTtRu>{j0z3k!=R^}sS^J&QTgNEmrC10S7Q@tEuB(#(8~{;%mU2`B9!ddBCr zy1vz3U@3_?d}5rNr7Aa2MtS=hG4Rsq;I-cfq?SuhK{$03K7?N#EgUTedQ3mj(lM(} z(2*^cicW#!;*=K$i;>gQE{ZO7V7UvWWV!|}dIx$YLf*WM-TatU;qT15onzxalRFfi zFEbmWI+a%Bmz+K5N*euerBvmse2L#3?bh_372WG;ryN2ESGb@YUm@yI{Gu}`A=-dT zl1ATL!1qp%#l*y%R$3uE1!rpbBGQs#eijqa( zAB@>xPn%m=tWHN8q_gES^EUYE_UCzKs;JnG2WRIWa&_#OmeZ*d_gs~XFWzs12^2Q( zAjH>#-O0g(hdrElvc3Wc(ky_3E~E~<^}Vprl@w%!XQ$tJWa9N7a2!?q;EKej*HK{S zeeqPzt4v8|Ha0m~SpxM>3(I%3DKoY}D}o8o~MXB05&?xcajjo8X0?7_&aRMX*A>xpC( z90{aXk*AwUAN?VOUar2@pz?X~7EHvNi~=?pV%LQ`dwR_7u8t+k_%|ZIekFPNogY0s zJlqoOZUAwLbadiQpX_SZ)ByqS^KSDJ7CgmvJZR!Tfcs%@5hkvv=?gsQuZu&Rt6J# z0naCJLuW>S@@+j1V^tM7n@-8%{p2CF;ql~mY#)ur;}&%(F8}j{TU+u}3I7M={>izy zi)rHbDGE0cTAVziSdWWA;i@Szce#44Xs78Z^swT4qV`oLAOLC9ucwyH1d}Q{p@z7v zx=`WL`0m!^Jx@PJ_>$0G+Tyl)?a^ArUZYpK0NEE~wJvXba`MRSZL7M+5*4%$P+iGz zVk7;g<1fmF)fdXv8#m;cdR_sS1b1=@h2I}eMg(37RFe(-6Ll}H$UW%NUY4r&zJK)_ zl~h12dV0*~T|Stm;O(RX+~m^Gn)!fG<51Z})D>!BF@vyjxYMyLp3R?Iq(BN|#}GjB z*q!;M?B}!8YDFcbAd7d5g31gSsx7XcK3Oc{s4(C>0V|bzntiPKduT7fEAe4~=vg;> zr14Ql?oIJT5?y~WSyar!-YL@)qLC-r{A0qd@iIT=z_{g9vu+X^N**_L`4o7m!JMFX zohDEO08wRs%s?oRap>NFwqif)&Hq`EP=U`bTd_aZiK11)5bC24o#2as6URc&qj2+w zY?I1weZqm&CYA2v*I`^_rDd> zHQ&mSm-ghEwEB5oGop!O?R}$t48if9{9zVo@-Wk{lZs{Z8C%kuI}z@;G;5Dwl4RSi<6T`GI&PvT4GR!QOFoO$1PpQ}c{B44PP38~;2v(Cum$o$-X z!j)WlWz$p>V|+Zf>BrZNGn*3koq5jo&0C|#$hXiCF}{w@4tE{{&3d9W@+Z03q6Q8C zzQ|ilaJs;da(DnOsZ{CGd*IjZP2B#~lAS+O1f8pB`oJw8FE4mk3Uqm4TUc1Q4x&23 z?)zUSwz_(H-n52E>u}(2M-F+EP`*&P_`u`#{fjY_%X6b@DwQIol@le9Bkv$= z+vavE^M#Yk`iu827cNHxsIP7sIecOQ{O;4xUG?103!)9~%k( zBsGQcZ>Ofk`0Bxjm0eK+cS3q@<*lA-P~=#vqJ zAE0An18t#pVtkw%Oy{B~MB;T~Bc%1YCxcc){}$+|!1jGBs#Y==+q+2NiV5czmP-M} z|6JiZEYTa7kyAGMC&MXa?@EX=%Yq+oi{ZB=I!m{P5{p)c+jja5W-WFJJsoi-%HgMX z%=k9UCV2Q1#)wxEcG(Dqk4>blEzgUYJHg{M1p#Z}!^YF6RWdL!nSoDAQDx2)zM{@6 zDEKg%B?G>5!m1cW@~O5~_pl$ol%yQ&@WBhq=-#m-ToLMG`-8BGPZfrOFnSJa(U+TLr0+~pKK%eJM&0dQ6CtaCdI`6Uy zV+>1KRyM3M14A~3w@OXr%HxlfRmDNZXmZgFMNN<5re- zyXbk3`~?0dRyjxzo~*KFpTM0a-s&ZWGEx!L3fmLmBsjZ{zR}O_qkjCpgvR+09L(&Q zSeEcKNkk3wRXTDJ@SZCiLaVX^!AA`lwx4u@jQ{Hc@t)p|2Bxx;1ynr?dN!acHZtFX z)2phEe&(6MUxnIyLjY|5A!{M-TJ@5-G9MVZ%`2jR&2!`*!i!I~-2oEqhkeMyAVmzt zDr8H8{Pip1Us;uxSi|!B_=P-eb;#_tpwRQYR=PZj|JIJ78=PmGA0J(CURXBl49D&X zKYP$21sxxrEFq(UgQ9HCBYEeu)bBSR-!zO7j;g)}9IvCswtP-&&l2V5W;Qh7&t~3# zcVD|dfU=a>%f_rvQ2f zfpuzcB&i#REc>a$jrjhZPo6R{C+pF}njSt{=t?H>LA zt2tq``ctD%@@*g-4SR?q>Ghupsbb3q%u558lFHi;Sl&YpmeKCy(s?;!j(<}*#T;a5 zp#LsZBEQ7&oE>k~Z3w7O`p`l!N$LZ${!dl-9b{2*v)R&KGnYXzYEe7v2Uqrsb;X_6 zDWf~`|Cjvf-`%#nVC?Lx)TtmKfSsk2_nvNzr1K`N-=(tqXO*XI8pnpoQ};eii1RRU z;o81RJGyZ~$(8PZ|46}> z`w~N^Si#C#2)3AK{slH+BxTu7&qh^u91R+j5xoEYs-0~!iaOq>sio&`<7x-`AeoY; zZX)j;P>kg!^2Am6FKV~Ddd*}w4z1ux43DSVnFTsR{BSPTvd4{-+`{OTw^M>}F`eny zIkrA-e-n)|f4|p!-MGWe+#D?aVJ$t`iw*f*VeIFc|F^>6G^hINY%53i`f-b1*t)Q~ zq7B#$Bt?Aw|9b(VCjaqFDB{L$kW68JxwX2q$L}i|2!EodwA`0)W-TYZMpAk;eV6Bo z9n2h#fI=G_8|Y@d*!N(mTchSDPM3b@LCuolo#VmqWS}PZrRl0O&vfMVk~lwI!C=bZ zp3uYA`t(TAzKepMR%d$MnZLH4*L88g9 zEo9Rn*ylxX4faUST<@hV{I{EQ%EFm?ql$PQfvc9V{)C%WG z9I<%4245IT=de7hWcZF>tDEhuQUv+`9Cs@U0bTh0)*ht~c>ACT$9kzcBke0E@jrjF z@hV2aqh~kDHRR0)#w54U#8Me`Rkl43LH?@o!)z?ijO-ch|JJS*^>$!J$GE*+-rh)}Og)mz?fn*lLP_jQ{ zV!KO^A7@O#^jcR3^W3Be`+wm>hH-{-fevZ6>u6$MMUF3h(MWsQmw&dZNb7j#hEk_E zB>8nxcv8){&wC52cp-4J_;Y1XZf2;!KQUAGe+E;Qe1pcMc-f9 zDIJE#LBD;vs5we(oP6(;$S)`wZ8k|N6+5hh41U`1^VekPJ*E5LVO5%yBoT7Ig-J%D zKZUU`+IFaguFtcXYF_E@Q*XWe%F7^Trf>6ljYc;nRl;dDD>q-;5-z(qI%y+mI8j^Z zpx94%&8A)0q%<%M;%36@q>8`pY(mgI-|V~&!~IWXFh9#!S$e6GEZ)Pr)$E6N(s!Mt zB4tE&=pp+D{r`~-uAO6DL$fp=+9-ypnSIa4u06-e~VMbns~E=4*)3DzbUfH~l=x=^4 zRy_X7wScL3BS7SFAgO0?d13kf()yh2 zV0xhNO9r3yEJp=w+q}-!WwVl_#dmA}0$KN8%}6g;1qo1eb9_i!WMF6{l=JBXs^R}u8@Wq_>*YGbysp_$qi zb@Kgf2z`Fi@3P&=$-hR;Yn4N{X^TQX0}f9YC4?$1aly`&S)Im=r3qH~|7B0J-0#^Z zgPvs-pD2kL^6W|(Ki0-=c@hDd?1w*O!9P?I%R9WxvcuRaFg?4+3%k)$|xGuhr_AK zanoz}o=-FR_QZfY73V|dl#Pg`F-&HzX|2-xh5E_a-B&BacnY@=`iz>_F?p*0$=h|} zrmGL1Uta59RgN+fBM!eo;?m5Pfw1+q!mzz@rRhlc?oGk{CtZs-U{j3h&+7Wy8K(Ch zY7%+HPrJz1CQrLCTDVEwaSzFrIb zv~ud#TxsW)mMmR{oUqqmLvp#>sQh1b&ILJd^?wc=5}qk;)F;xBZr8L z6oZgov=DUr5BP$Qj%V7^z<&Y?%gH+!;`Y$r$?Nq--zZ;&R-OZf3N&>g(pl!h+#-K>77vafq+(0eZ z$T|8xJ1v9JyUOJr&0oU|z{@yhDdFN9=Wm5NVXp25kLPvkw<#>nJBUwGa6OWn4|5y2 z1Fl|k2BAGcKM~X9{tJL57B#fn0WX`M^CuE>mc~($_nme$k>)n=yX`JmMcG_;5OW!^1gpXa3E`s`q z5YWv)UFlHqo);n+vN{OjTCOGCP1J35xOOuyrB6u7U{o|DSOOlIy5$DsO@pVEBO!s zKx7h}SuU@-^6N7SR>-8=&FKA2N#EMmjYAuCwrZhTz}xM_P7Y-X})Uo1@$)ZLowc_wq-QzoZ*T#m>!h-HQ*!nX(be#SU z_|>~VTXz-<*XEGcQ1why#|T!7s9M9V&xhB7__rwwrM44a`T6z))t0vIQaRF{S-Tv3 z_szaeSTP&bWD&MMAUD82*k=P37k?vR%i|wrr;mLWOgUz?kkbO*eSrzPTzzCclBun` zpKmU?dODN~DM=GtyJNibUhVL&c*j`w=s0zg*6#S!12u5fux9!-4gzKEWvq6-TxbAN zzEYcmflUuls5_57F*@2mk4LXcAjP_2Dkc9#h3as<;txt=!S%l9yD>;0^anqhV+80< zyWhMut7eM|kBoZwEuEfU-}Pl7wb0a;_4v0F`?dR-5ItL(q!~tb*R7BSGNgP=gbGlg zsF!d3UI--F>Foc$4T`m{Y5`2VzD|E@rFLX~#6vz784uwFh=3|i#(VWMjH=0$#!*#@ zymz5(^oYAB=~FzGvs=(7g*CPVD9xS^Z5y0>ekQLxU_V$D9CJ}Z+xKud4KH5PM`$rQ z=4{j`fuWLP!>vt0LM;sm+HE_elk(ld-LN1}4T|aEBfm#<(i7yO|ZXLO;4(oE%XTjl^;j{~*uxNrOciob( zN8QuM41XU6!~*z!^dAG$nZiVnsmp@pFh=@X?VVTqRKxQkNrrmoOfr1WxBEfm+6soc zg@x|ZuAZIb=X(K+L=ESQnH=2{TfBPb*Oi`FZo_}RYIAbb?bYFA=p7gsXsSRJw(8Uj z^qbeKEX4IR4aSU|Pm`wNg3Ohvcw1KK-26Zf^7aH?_0o>46f$ZA*ULF45V=a|WFh7j zT!Eye|CBRvlE3KG7Gyz5`fIW-dLc`TR6GI6Cu(zW07*`I9q6Wpdo# z+?*)_CsE-H*o`1o@qH_0a~wKK>7bo2Y8-qeH27=yuxx98-+iyGdKN2O9#ruy@Y=22 z0zYzkE-*mH*#5f3zUBRpR^{HM>!Jr}hsMhSbr0y&)N()GX?WdVJ8RJ4#65G-p`)NN zo1h&SS`Vx*(N2peUO#L1TED~Roe(Ws4&|&SY?z!Mo+8+A;PGNmN#kNWKNoCNhoa$e zoRM?rR~~F8*wtYYfq?pYmZJIA$vT3%ZDFMbkBUqQvF&Aja*#|Q{y%3C_NMihG67hg z)e#rV`~6wEX1Mhd3y42|ixcUW%K`$*UFq zSc;O}y3c)WHD>#)o01FRDKj;P-R17vrh~Dw+mc2AUMcM|)b%uBXG4%oU&O_5;o@XL zThn_nd>(cDF3D||L;vx%3|^`A zAHd0s3p%ATh+($ARd4VE@4^VOKKFF4eK`AiAhQq=&pbHia+-w9*dy+DcI#qz>6nd! z00IobQuDS9{HW?&dd7`GvcxZl2yIsue~=IcF~?~;G|Uiw<}SL|)<+)AdR(Y{`7=l^ zyrG%@CEF$3gvK|i4gsAl>I>*{ilO}LO>lF*=hbj=@^D7uOG$6)e9XOYwh71UiUe52 zEl4noX`uoc_hxX*`vMsm)q}XTmKP&*U0B^sz9%h(9%dR?!cB7yi!*zT_^o`Fk_OWs7ZmHoh@IH=mbCbmy|~z*tPc~4 z{eK7iz0iEZq|N8U>@xWwS1#pUL`0dz3#T18 z*RIyrm+l%rtuA1z>cRb_qDHpno;{z8C}0UpQIQ)O-y}0i<}dqu!%m8EF9Be0544dg zN*d=>-h75mjW<(zMTG?;Vk=pN7ar++>@cpZLKKoh4$1)^e-{47;Z<3Q9fV(#oU>rc z;peyIp>SuGy23@K4tZ$F34y_a@6mBNqr3H;2)X4(7K()-Odt= z^WdGI%l$=uN)|h+LW9ZLB{ulwDp`z^Pk&_$ePVRJ%y5(RPnFHW;lqsRKJNRkJ@2}L?!A#mj>aDqz(}P{M>0TyyCoZmslU}0sq?aWp~@qm zC@FaO!+-uCPqci9<~xOhtC_p~SzSH6RBw~?cS*{$&@>?6v{1seDlAVSxX0)8e<9Oj zP=8p5Y%W&l_N3U-R@eduBRegQ@DvMBWRE@~9ODR|k2DeC{$*w!BN-k0QHo(7yz@#p zwU=9U0O!*zWMD7{D9+X_?o^ymFslg20}9b!OMvo$DNF+5r8^mgzhLlM>jy}x1+9BP zJTzWSsvMa=e?MDuG;9p~NbBEYL*Fc0zlE|$9Y7O`Ut!BA6zEJ(M^*$lqI0>Xv^AZ7 z1mUxF$t-JFHhgNr#a};1jh!^G(u|Ju%TZRw>=i_7kVh3$9V)o9Zm6Y{w~{*V!@Uzg z;1KmU7+E%g)$gY$G8`jMWIxMg=iz~l*CEWSABbt*@exjkE)9O_rbrV>hIqc z(UH4d+}%NG(STt@GX0%QnMRbdTr#O4@&G6 zH-%{QmDC~dO3#iSOnTk7;uNk+X&3)aa9MJ!ZhfYe^c>veD5wtu13H3a-x|PP=Qv|I z8ljY)23J!(tUrHrNb&bc+5?sB*w`z>ZkWMSkL(4|dnFW8kKEd4G3|K9puBj@u2KK~ zJpm#@kR}c-09kq_K?XVLVm3FZY?1+>R{Ld6sByFR(wQ3^vyN0se#BO{P%weWIM}>W za9G;h`n8KH)o~q_5ID!8_9XnW1!wF`rTIDT}}m2uE8fjAuIPyb2}4hwgqV#D6Xm_um6^xhpO z#IaGWi?Vm!_iEy_J|Ce9Mw<;Ps1g~z@Sy`xj84K@|JHf;BsG!BKaniknO#i_o_0qV zh)96bHajnUU_3nPc;&GxSjnM>L4A|NuYx|(2Z^XdrzU5u*ov*JL>UR<2eFqh-7OH(Ec4Jrtbai(2`{}+y2*K`%U=?n#z)@C-J_4AJw{M zo~JOKl^si);%vo{%LB9e=DVU4AU1TTBPa+XZPHiAPWu^EG{@eO zv*Z`T=XpdTpj($atmok@@Pg4&4jhxMzoPyU?bHUwosr=^@aaE@9NFufk3f&9z*8Rf ze8bGq2=@T7Dho#m!&d}Ec3c~3k397`8nDFE_g&ca=qjCK+VN5)aGM1`pvz+{=xUYC@aR^X7aYdu-Z9&cL+0prJe5x=c9q z)wEj56P@WHiEV~mb_Ip}_ZZX!(|R>8EOo5pztRnLUL>li?O`d%FEO;rr3oZW9@5yA znd*iY>5q%WntSb2SxAfVq^$Pkb@(=AMvEmUI}LbIc5B{s>D$UpBOv zNcTtkRM9c0^%I#J$Q;6o9d;jNe_9U4N{3eTX@mZX!3ybzq9ebZykDkg0DK8A;Y6XRx;5%;cnPt@a!GnGwK_ zKb8}?If0VeRnT}#v}Y$QOo;P2YsF&XM$-|4=a7sw@Y%w*ySQm;g1?C3F>|g=5JPm@ z)%ZHvy3iBu`+QJb6~88XdF$KR)#XsDS2JhpEoLH=F=xxj${G$PsvjL6m-ahgWd`Cw z9~&?I?(VLo4l52F{qABn*mPc0e?Ge-tPo0;YBS<<({Y>GATZ$&5=fnoVq#?#wzp?{ zb$v}jN!hu7-X*eNUatD)P5W|3IM_r(2TB1qKiIVkGN1(uMbh)fw~hbbCS_tnPS4M-ppPd##TUy(FoU$1M?#-^xnYx=>WAJ`09)*@O(F_n`tt=jbQ_5r+EeJ+*Jq4OY#;03j<&+BG>Dw2i>gNV* zs^_F__kQ^ev0?no-Vb-Kc+7+h~#Iph)(8vu3x?c1K7o*Vo77HvUTV5h_L zuPsDYX_}H`wdmrE`WVu7cAOLx6neFes84t0I@{Y(Ko1;Dy)paHT_jD&C9FudT0S=B z)4?C4i1xjaTm|@62u&6IRu>`U`qXpYF~VJ)`Qx9+A!7t3T0GpSLOR}dv9C#TT? zTTn&}ZWoBzvU8{J>y<n+XlT4r{{2dmo;>?m-J&zLjr$qpSm<&ab^l+=W0!3SyaVF zgxvR_38%#5@q?j6pTI^DH3PAn@8)lmp>aQcuz;!a8$kUE3c{P3hV*Yi-D`46iZM9L zMB#l*`T<$+*(?Uql81d=U8{0kz$%XDw}w70(p`-W4QWcLeA;_0kx@}WB9_V)v7iAX z=Cvd4AJ=-&{__qDiQ^tTzP>#z|w?ri@0bp93hF1B~_qhpeMqGi%H5WgB=_I%nexaqg7_womONP!f4=#NOxoLc-z3XnyiS|wVool4c9^PY0^Ou z;}!yFWi2l&X7hEJK`4&)Ml;#0Y)Zlzmn){+y4GVXl;dlr${a=+UD` z_IEcP3=9>cCa5qXB8HsH}t=p79bx6$1l8bC`gCcXo4IaTe09 zcV+MW!l|-xy|KM*Vr2B;<42^h@bK=zL6waw_d+@%zSPK(k&*a)UO~ZbaGT)vI@XU% z-w)F~eE5)wiRr1hcqS+}EGsXE$~=TvStX^Vk)qN;|62?2t-9Ln$|5y0Q^m%{W_Gy! zjfY4^2#mhbfRi$sapjx{X>qYxe7^a#F}hJN*05~GoEB2Nf=fdQw*oh(D&z?<;bew+ zaS)@SP@dT0Vvd0{ z!MMB)nwc^)OrT^AgZ18*M<)dN_VUbC)>E->VjWg{2nRC7GY?!|h7)m`U!U#bM(a0u zCxbzQ+Vj+X=H;be!#K%8*U->osB*eI6UL9iLQ`-_4(o^4-ePe3RtcGq5OWhsCmub6;=q4uY^5kra%?QD;fV=;TFZ(lYquQy*wMG*a zv9ZoYGC28N2Fk|lJmGE5HHmR!v4K|n_HuW3m$oSX_U#i`k!EU&mJ9B(%4P=M!c0Qm zU_g8XJR#gbym>=#SQm(A@q7uE{p@Q=$)MUtTu6p@87+wp1axz;XHv;kD7!%*kkL;} zq|FQBE7!y%BuilOY=kZuy`GyJzdSRa-8}hm!~Fa_NjEC7%J}v5_2&LQS_EA&xSZwX z<;`~5N$%)#(SA+G;rV%G@KUpq){c&`K<^$rcmTK1b9FA@QRtp4acfgX2ZIYMHfSVu zaS+tY)SQ69+Q1N0ttx90U>H)XVGHe%OUpcdJPk_}(M@`#&WE;SLPz#L9y@KA7dQ>u zXK~|bRomIkb=OAG$B|+`w?$4teB0mzv#BG3R<41)i_|KCU~cAQjf07FwFMYMW)AL= zT7{Rkqikq7qGRj%_oE|6*WKw3pYypc_#fbd+1$np=V|BhXN_Wq=jLqkMY%FuRg{%= z#KdD|)kA@H;wf`{1m;!HDQIcw9k5z(ArYuW-`d&=t0ycQYYx|e1O*3MLLe)k{8`a^RywlJ!23k&&$cx1O5CdL&2M_Bu+sx@6$# znHOj$^V*hLwoj!+87BqN*doJ{WISRCE&E?6C@72s;ta>3{zGF)hRn?p;k$CXWNE6+W{IzvJ?wdt8TO zp^Fn(oY&cohjz(r$4tUpMsoHm39a12X=taP>%nGMk@!o!MIbhs$l?$95bnLA+LGC; zkxP*5kf+VJ^Z2-g3~X$^o)_ll%hjy40ZWcvMdWQW2JnGJp~ZU$1k>XxxmZB`9sPj& za-;-kiyf5Z==)JnureO{Q)uK}`4k(yOep%QnL)qmr8Ve~T+Y6btkr|d zeM+M1GQAqG9-|Wz>V}4yBgJy9mKxx2$c0_mR=NWxwpV9sonYy%P?(&Q6sj<&jo$mj zn)`DGJ{JeQdWNF>PVw#Aw|y(!j`edD6&2s&^-!>YB^eost(vR)6tcG18ZiH*`7rb? zwBhbgkV&8{TF0N3$;DoNZO2kVcP!f4nknm+i}~t-aV#4IaGuonKg}&H7*8a{^uZ^2 zmC;Z?XDcKu3|-)i7gzx(F$>f}ZyjoN2PQZH9D%RHqpGiOlaFl8+b!!Nuc)Nd9}(j} zrBxlvR6xtyIvfGk2u6ret4ySXFJdcBO-%t{6<=2;1ayVwjsjymGStk`@!3~qSIzfD zn|pi8+Y103G}Wjte3C^gsua74jHc?^7Ftr5ciqM<@4;?UddqQlGFmO>2UDDY2n@O7 z96b9xsri{dag|s+z{`BaoX^OUrPCRu_sd{6Ulc%zofRxj)&O0&$E#T{G>KZ_8ReE! z?WTdYE?^za1)p#U<;_&tl)urQ0{E{-CkYs^kQrE>$qCIIUSxiD_Qx5!W>MPhz>x&K z58NLsJdVv>cP3lc`crdk9kv~7!J75Z)YlK<{GE$C>}&Oa=0KmDaion4EfXkGKU-bo zr?e}@iEb{e$O!SPdYpfJb@Rp0`)D}R_3ofM)qF|2&A)S@J?V)C`TlI`3+~RrWquwX z+8H3yzX_0Y-^?OeBv)8Zm3@Xzw6(Rt>S1)GpmUQB;0I@CXRQ>c%-@&8%N6pF^znh1 z+Bs8G3yX5dL~#WjNvX8Oa>r``RUPzSxi^MiK247Lt`@f1`^9NJ-K`ARyNVry_<=t( zOkkna+5-fDB7uHN&nZ5=8MHSwrCS>MG7o@;KzVC_(#$LCtgfz3?w)Pt2LODTk&#gY2`;p+pM%ZZm`i|| zO(Bu3v_k*qw2a#sH1YM1ZI8b%~-qvC;Lun(UqoZTiv6r2@ zKyR=Mg_eRG8x36Z>VWXR>E+QX24mpoSy_3OkLo$uAPN9*z7%fBm9Ib$1_yoB)n5Q& zeSn4r4~7O61oqDq07t@=7o6h~C8e&S}eN}p_UflZS=6kC7RoL%B=92s6a22tu zW#CLE{Yz-O0}1^?56i<02-xMK4hG~3l?_DX^Eaa;o>An!=a$@h(Gkuw!doh29GXGJ z{GfoM5rBi5u9@lSYz`wk8=J`bnlY=djj|u*q#I%)0F)0@RNvm)TkA{aNfZtT?ZJgQ zm0~oId0#po z>1%58HHvkw9NL3(`0PZ1ji#-w4JMeq*42erj<&2Hn>klQ0W^%*@udGmDAROVi&%Nt zO0-w!)1^y}eZ6B7!(_`w%DGaU6MVmW$m+ea;zZG3h(R!PjeYPT5VkO7pH+&ofimsi z`(g$JamnoS1X4g_RZO$ASuyMGAAd)fS0cqc68t6nIe*8|WKS!vtm)~^<|Xh+5ogOC z$(fmhpgrohMd?~Rqo;3$K+#V%l#<%ok0&0sa{rPkdq`!*dO||L@3qp>}ZE+%Yp(?!SX!(*{u=HX@dy%fQs<>o# zM%RtnN44{0O1n;l4#$Y#j~9Y$q5E5cr~^h9SFbB+IRp2l!0%mrwzI@8jS?4eOS0)e z-HQ#IGe8%lqIhV<%&zt1W1sC6$-!z;3p!1=#~`**@FW{>-cci9?}j625YKr+*$P|) zvq4X4_eMpM={L0*8a!6Qx*QTx(jNDZOXt@n%8lyse+4~#4v$UEmo0LyU zGyx3(=LXPue*ukKtWn72;&1h6{hHHraqiEl`p)5H`G259A*r456Ml!Mj8ww;l^Jo+ z11I{z4+bnpAN2i8#2;16VR%!yKXJEQn6JA$t>E#o?UMa5qV{JQ2-DbbXC_Y0OjT2d;@oYE zNBQ(bMv8Gg&aK^xwzk7y@iN=;py}aqM|?s;|Ak0`WxT{JTa@>)6EYmU%-3JpfT@v{ zwjew@jyu{`-5)wg4bHsOTj+mI|1fLmg$c#Mf@yJQ$Fs!%|B@zfc?&2_4R&_=H>l;9 zDnFkta3V+MKmTJdKu%3zQZgaTDkojY_-Tp4rG73-jb%vy7@hAwew2}`XRphI!NP!V zgaeb(T`mQA`H|_`!R~G_%_##;O}J2m7T3y30rmnQmSb}QT24;R&0Y7l+!Vc*oly+H zoN@cD1B0JU8D}aH@`pmieF!tHVWm}k|2J#V>}J45v-NV`vbww%BO_-+(|yUnyyDE@ z1Js8bKG9PJ4y7m;Oa~TNXr#^9H>YrYn;EyaWkWMSoDWq^;$*G@CXpqajNf)PDba~G z^2axx0cSba6GpA~oFj?pn(L>mxircFU}v97%}@p*xc|gB%pzVe$4S{s;}0)n{99$? zn?k+XXYA?btN^}TM?^+HT$PLL<;B?}=Z<6!;IMx!*@GcQe1K{sAt!JD7f}NyLI5;#&8i{- zmMq` zYNhc6k@h2OY-v#yNdLiseS5xa{*k-L$@#gus_IJsALW^Kbad=%CHPYhu5ST`;ClYN zeQT@$rgjWAFS2k|-|b|e-G9^nQv6+gl82XFvQOPt+%|Z|XRX7|cPq9@jwk}$)h#W_ zqyg{C+!i-7?B~9u?%qH{$TkOQ(M)8DagYs_PK;&1miXT%VTXr@6-u|VniWM(MDl6o zXgHMZ=H)T};$h&@fUGMq(t>VmV6i{xscUHwyKN8u`Xyn_r#tF`08ATrZXOYlzKaV1 z5F`U`<7{Ut?sv7ot3qBP1aPeb?_*VUb$bW>?v4cu)U)D^0rRJtxf~3bAf{aN2no7a zJwTKt&Ccrio|R{ID2fCJ1wD&30^A2|cD4^#Pq2{~V0Q4vvI+{AqN1Wa#-tP!tDplB z=wk#Bn7-*c4r*Hl|GEby`yLmE^17M>n$2aoZW9>X`xn5}Y=oC&+zggqZK&d0iwjOr z_lE-2Q{WEU=y!2^clP#$9Pkz5^{ugwggXbXw6j=aFev~Hpx5Z>auon~0fkyI^9OhY zVwoZW)xyI9fTXUqUqS*@llA0J>b+t(=L@_YH{dq`!?7Zk8}$SV#@_(SbMerfn1Uj` z_(uQD8%eMW^aTH1IdGI9b|gHWkFhcZSbB5wYfcWW@kitNIYtsqB4>+d-M@Q#bHHZU zy08mt-6n5AFxxqC;MB9R;c_iCA~I5mF&5}FxC$`!z*w*rf!0I6*3qmlaBuTR@Yl+W zJNVH64gp*P5TOIl#y4-@f?H_=NLU*L>mVNFsd7KN^oHe-06g9MJF!UuUEtzmWllan z@k%Zqc@tz)%gD$;0T=!1CmC zXbbV@P|qh$xyUAO^FPI6BFMN~KPA+ zA?Z0wDBu@CtB^{`E*zUD8)-%IFfuY4-@;>c5S7;gdJ}}a)G8Uhy}f|{kD5-_tF#)6 zU>rk6Mh2(dpHyX>*u$5n85h2|t;j$EI3ct5@0sY9(y)M}78*9sA6)_znraYFd2?Jv zBT|d5)9A@NH#es`A@B$XC#SNifvEIghtrI_b=TM)AJ+u_2nZWfE|>zI3rs0^ z(c!5nK@*$NjSVJnbfaTq+F^3&F*PmElf$hhiqB@Mnw@MC*&*q4r2G$dk53hAWCkfO z*VfluZ4X4s0pBqNB+bp3jwE$Wh%zpkpZvW@E%>h6n$YLx0^u=w&U8+tw2X|w+1c5f z1JUCt0|UyMB?jr8#6{aXJC8QopAZr%G2(`HS{BpnoL>t9I-;nk2=G(JLL|iGXFUYD$psH%c9=&>2VNsMN?S-oCOxkE2}hWSKCqm9R>jpP|*mrFrc^aaMAeq z(i@y2_;e&Z^G0ml8(Uk;fQ3n{&Q6b{1JajRT3V`IV4R+i&~dgq!>$qu%##Cal?)zx zErQ8h|JCWXrFBGuQ`+FViL>*lnokrUDn`b~pYTvef<9LZX=^|wgXtn5^0c(ENk6o} zDd)vVb(SCehJN<+&t9m5~J>ICwF|L4;hvd+%tN3gm4-+lS z{ecVIdk{Yo9Uw0j*G4hEKs2-iUpfO*7Vbo$_|O2=7fbePKNC5E@zsZ0t{2xE$ zJ>-?LMJNX&pd)Lz!ICS5MMd!F)zo1Jm?*GNmwSbYnK|_Gn~*`8IXD{_EZex&^OOZl z69l2BPhH9(93ODR1Gh^q?ki%BgiooEjiS_LX0kJ;MJ1{C1)SAf;h-c@SgckK^Ox z6_rFvfQOuxG5C~ZqXW4oyT7`~1u2?CsvJF;1Vi0>v{!wk;uno#_h!YFw--Zk(G)R% zXt=M>#+4A75pR0+x{Qy)0WMh(oOnsMWXR>4$b65yfsli*p|1}TI>#seK*s?J5L!e zz~H7r8Gm1aR8)T^)>J0IS)v(s+AmskBUT-(Ind;Bcd%sfCsg_&P_AQM^7l8iS!5Tz zD4bNtSKL;;7u=LhL`DQ-3LQiMHr%-biR&hqNoLPP6+``IMpU@jb)uo60frU?IX~tA zZri@=ISIf3dJV)v8tmfY;>H@grXXjL4iH>y0_)oW`Lrc&#xhMK5J7=$+}}IUQ&Up# zNNdqMjWp_F!?P3_Nk9a-Gg})64slRRA&w1DiQ`4Ouqwi`zf6d_wstolTGc6AL#r0O zK>j#16hoo8T%I{i*8CN=yg)u!HQl3%Oi4;g+LMBFD1bWo9AyUd1dPY-)>5qp@KrfejAF#$wR|af z+V3#6C-P}8bsz?Qx2K;ne@;wH47z)YadEYPlpwwpBgo*)*w*)t{2Fs+Br*pWh+0ls zXy$>5O<%q`RBi8*xtST5OOsie9SC%H!oZ8&G{X-NIc{?alcbe^J_*5W;0kE&BAW(X|2w0u+6uqQ``1qedhC;f4*ZyY0@T5W%M?4LA8&UzQk{`D; zjZ$H@fz2y-{hrJvy1OmUAH;pa4W!4L-yXquFYj#L$7}mewAHoOe*w`KC*%g_)%Pb^ zt_$-*el+Ky4)>Cr9ykX@#9ebO1`!`Uxp!w$Cv87dPw9h{4B)yk1mD@)e~x2RVYq3Z z4Fl>ILh%a#yY`(5z-9)-s{voe;JpCk=kq|#xX>QbsjPAT6o0R&BVw{)+>*1}S!N!xyE`u+Bj9pQxLVbik zk1H>MxTg^q9v^tzsZWg2iTHG!X;deo$Ur?&(h+x%sdJEtR(ESat6LA04_sVaoSYRK zDNbEp4*CrM?}?vcg|8qZg9efYNvf#sn!7WpouTMEo)8ns&L4&l}BS+f787dj1cVP?HgK)SC6q!askCYE}7 zd#4&a%5$+0)qwHq2bxGTE-Tj_ghgil=Ax=@NLU}7rg>pFAZR>v+`iV|-(ADT6Ccx* z#i3E|qk1N&Re@sgiG<6*DGg<_g3<3&b83$M&ceM$w}u!URIEbh6=Az zP=t;NF|)B%=n)s!)Fl1-^=lKlkSxpbk%pcGp5C*`Aq!OtOGzOGmR`_pPj6PgHeRjJ zpwY9=ebyQT*KigKlZfNnsPZ?|1ppTFgT8zQ$NHJ#3kcyxo-NaVN+Q#Nh!0^nKZuL` z^)YR=$F|@F55I={x?twQ1jsFVI!V_F8Mv>pZfZYbQmX=huJlDwL?!|W^8xrmALoDw z_@GP#G3*8^311c8B5)enKs(lY7s3^YbvLR^j~HsiFRKH$+R5oP|FiJYyJ5z=dQ&O4(Z&BnTp>7E0 zR!U8RSHWtu-~b9?SNod_2f%4QOVmS2j*9@O53n~dF~^^#-FQGs1bnWXN1<0BG6f_K z{c3u4Y$@1G35JORdljM`BSv}r(XM_@%;d@_FES$HQ$!XVb81Ta8-u_{V)Tj$)HYyf zm=Z0Un=A7noQd4TEX#RKsX_ZePJRl;kK^dCs-xn5Q#Z3tx$S$~7wv^Ch20@i0nSDt zYwJAv0|iNg3jfe!+2?n77qk(+u9Tffhx=w*^B4kA-0UpA{#68lY)4Tb4GxbGy4XZC zUcY_;l2YJtVHB8|gTXVqfFSMABLWy^>gT&xJ>hB~ZZ%>%5_MSq1SnYmJ?JX#vO$^? z90VP&RLAz|GZB%rqc`*gAhXHD!7=bY_zk2VFqt5Yg|&(PB_RQxNv^QTNr?c}Ng%zN zUsR-I+4UnMgA$OM@VA)8oatBw2|B?RYyE$YtN@!zWkV$EOv3x>R|1K;r;xN*(nKUWshcfS{TDNop8b&nDSK}M6aM_S!TjGX(KU!%$Gv*(l zBHsAgiX?;>2z!wa1vw2BNGg^GCDK`|ap)87KD9SuS$vFPR@f1bfa zGuBZt$8}H9V2Yqdv4w9qt35~V!8f-12MRe#I3P_dw_AG zMQK~wS#PV(A|)8dzq6qOP1`6Yq;}p5%KU8=}m&Y0<{eR_sdz-wEL7@Yv5;;0L`aL+9dCV*fvT;Bb zfW{D$k{Ww^r*(ICZ?^vi%us5o0-&(r%n;avRlwLOF>C#=zR_G>5Y#z_q$d2WGHh35 znc{s2$_+tvFFLMr6)E1ozkiGT`_JIJAr&zwum1ge3?Hb9`}>pBBmXKL;dP4B0&7AD z@b60Ui-;7qGWD<&Vm`@aXJLum{T7&H_Uz-o-}od;M)J47a;2gcrgA#_icijAIgo}Glw1m=6}y&hfwFvsf%BKDI zfKjMbHVPCoZ*$eQX!Bs2Rz+0YjrSbVM+YkM`A$094n}GaQH+`o3dFEDU(5?enCQHe z(bk*SG_bEo8_kn8H~{1xN09~2UJ>h}k!9mJc%Eu8XHE zH%KujnDHtDD+s@fPa!+PI@=Fm*K<1C6grTKaf+6y_e7ntj{%4ZMxwZ+LE5J1TW2g4 z-4QD~ol)HPQ-b)YJRLA!T$gM2kYYX!ctLK~qFLY|{~uwNB#_UiZP`bleV2(NBeXEP ziM=0@s>h=w&hn^&-$yy#QsHp<2ID7&No(!pu|L7`4qwM>tN-t5Xof6pJG6fL44kz4 zhL2yJo9N*?Oyst3XXfXK%~4fz*)SWVt#dtbY<^d_##eO8IPw@eXZ3%w?mwI#^=6y; zAera_c~MF|_zIcWg+XF~pQr)T_sQ9`h0p|LetCvO8s*}XMH2P2Ow^`C$ut94E%yKS z0bX3dJjz?vGe>pq>o-^2kPHyb{WM35pI^Y__|D0iRF9$p4N5k!PGvQs7Q=Q7(6Mxl(Bp>9Q``SN zq9nl@cFnk_%i;?30}?{+DDUFS+))genO|=FRSvP-3r;SQ_il}9KbVHbPcYW#e)aHG zzH_j}_Vy-b!l;-)E>xFqG_KqEptj}L8FI|B_^_h>6|;sp{r?FhS7?Q9?6{C2GofBR zm(&K*d+~#pMW@k? z)OE}hwKD^6_t!godXf@uRJ}RbO?*n*gz7!&tj~V%DvP185tawp?nk4E)JodNWgKuz zifSaK9cV`O9dp(f?Tr5(`EK{N&w01;e@}`Yhn{{efmF|dh~IKNT#Tj24Mvf8O@_8~ zNwrk_>$f_6h-*n`xwdJk65!SfEhjKx)#1vMzLiN6$i$rG7l{1vNC2~8j9|ThxL)~d zWfNu%tHJ+i$;;nDK?kqS-|aMfQrij{_Z;;$xX=lCA3hD)-)hWDE@-d zA~r*WZgLJJ+_=f=%5>gMyCLS9#p-|j z1Tiy&@c&G;WFn^b?@|A|YFWl)8FXXk<#Wp-ame(8GwelH`Fsoi))vd=qIjKmwyX{0=99L7XkkBd`|~GREv>F=+r?_7 z;B!>5XwSylAjycTXq0IR?6hY5NvpcOCyR5XKsC=g4X30nYwn;28>N9t2R81(vRd!PD9(4Ixrq9 zeJ$_8lhsw@z$G~X0)dN76~D0F)rXf2MMaS&T~Yn2ZzSkcAo?G;b(S7^I}=O^9*r5HeEvQHp}(>-&jEBT%F`VxI)AN|i6*q+ zhbls{gvas}vJq-*FfO-4;Uui|Nqd;jV^_l36@{Juf` z3oWG~Af{bhT*}E49y4FFy*BnN;l}%r@Bz(yJcDcEV@UO0>q*_?8sH^z<7FU?hRiM+ z%%>oXyW>45{uy=ehqRh^?z@N}&5r3ty26G!fY1z$cZ3v)7sS_nkH2#Lq;SvwQwPHS z&*b2(fW(UT1s5P6aHB!}Q8}Q%w4>xhDg+)_^EDb$U8GPqhuOym7U|`nz0jKnMGE72ipg(Nc9P7`a0Y92s#OBX#V8tWE8Du zW?}L0L&O8?>~Y~`w1<;NtG%_S?%(_oJ1v^QD zcKuHuL%CTzQ~g@2kej8lc&HAD4~n!SoRpsC&G`%XJzzuTNKR=cyHJ0sBK;SSyqg-% zkpVTW;qHZ?9$$E`202wJ!!QhW*I^Mt+_9bg#0A57grX%&&FTZX0?sdKjD{DX<8^EY zq!E^H$6Dey%Ty!e7w*5udnzoJKPak1yU5sVSU|nQV?t_>#0{aw+|ZDBaqv-fuMn7f zQ9JHwxyVZlE9OIp%jjTgP1pmvTXHUq76{ikZ^3Z!IYpd>uhy%3Z<&(*t`RL@ul zvQR(E7QP7}RuApruBxPO$Cx0*RBM}rva#-^iQ~xJ2W$tkk;>E|yhAi}TU*?}d)N7<6i(YVGcrTUp zKqky#4=JOPcpZ4Sduo3H@lT~IW2&Deyx_tbk^>6X09`F3lKACISB9vUse+C}TR8W# zgNM>sVeXKp97y-L`Dc>ut->$}&JgjWCCivVvrHC~VVVG$zn?6ZGQYjRPgwjvpc}FW z5+vk;j&#eVfDZz>^H&B2^K3Ho?K@!;Q{y^*Y7mM`qK+Z#25}wsu=ljcYfd8s>-Cl6 z;-SNm`1Wsq{5Qmq90fJmz?wZN4FLRm?Rth6DE&_g`2FekBi5PflyO!?zbEc<2sd~K z+bwtz$r5eEV^vV7RPsz^*|vHiacsn~O^cU5j?s>>8S;YbI!AFWjM|Q)vXHyE_#GL`q7!yFpUAI|P&t0SW02si8rT?hd76knX$D z&-eat|Axz>k2uQAIs2@=;$820_l(M*GZ7KdN?wv)$NJGAzghi!p(wZRrDDdF$0q6k_lC(L-o(y1zXiP*7eot3xv8%g^8#(!^RIaQDW& zpoMvbtfRS+!UUqaC{rhigyj5{(AS+1UEAJ#l8bv-t5>RESYvZa+dkUe2J|Zek+Ij_ zH<|&X-w1X?&^I@GzuG;M>57sI$(SWs8HY-9kuSPn66NBp_6H*yd(Qb7aPDb5h1sq! z^)I~rx2JJc08vs!MFqF`Lz50G7P)ZW?fEj>WOMh=Ul~MC&%cnbJcDuee4;1(;!kG4 z;2;Eh7o`O6=VmCpbw7{Md+7sT%K|^=e~%!H&W(`k&wuQ1wUWevSMbyS_?{nU6ZvuD zH&8Q!rKT(cJ==$|fuk9~hnq+x7GLmV^plo9%<6tk)QXr6CBjbzzlq?7;O--o77i%n zr*8!-o(DRXA-0-%-19`?eiB2*f?I_0OL0yhlOc%)a_sN2$xU~s!Se?Gv-XOwpqCHW z0aC)e{QP~{5}~k5uLnP0ec&cv9%~dOu5lZAZ@c2R?JZ7)fa=k8a@7rOX(lMYrG$ML zzaEwr;=uc7K8CYk1OS{D5aV6~fRxTqZ0QA;H({iGtmC_E)Q-1e#!(J_mANX0KX4__ z-i_~KgV*T%Dxtgj5N3N~y8nFt``yy|Dll~t)(d>{k2or6GXcuyX7ac_T1f0ux;ipd z8C?0(1IiKfRh(stZ95RHc$?mvf#x4OlK-#)%I9G82Kd-O8rj5G!b?+Ae>=nAQJYDM z;*^wfei9ej=%Qu|cFke<<&o~qP-Cnh$9yRLztHpF_5tjC%v283bXm|9-fU1AZ;xG7bbjva}1jPKlw!gB!;ZCs6#&MYeCv`b9L>P3hlLp zD*Dr9xm%nMwggKu?pa#(Hq#3;$=jypF)26KGb{#(7c8sKXVnhr%DSb!e`JV8@& zZy{x5D3KB_c2DdR!XCm>@98)8m%H%#hrTBF*}iahC*h&4iqFQ{b@pgJqb028Pyc49 zc`RSHeQJTWAC;`9uG#YX-=3$W0o0g>OC1kB180`^l-4grD6ih?#bNpXTI(f}oLIa4 zc#m_@Pj!v`yGKA#L&eNvF%B%$^R}u&a~k_^+b&LM`^nQOs#-0t|K-GAO8}PZdC(YY zI*{lHn9)YnGK5rtcW@1K{>NZT4ZUUNOXJC(76I!^uGZJZTkDcPz0Xj?W#PdxKY{k( zLtMcb7Vpm&LHH@KzN$wd)Nnewqh`JBls==Fi#u?)6W=Jf2vi!5IE>$R`PISsP1DjN z;|Htq#=bL)`qQL;wU5ziSj|R9kqO>o+#kXLaX%(^pv4G?C504-uar=Gtt14t&no#<`+!jW)pqku}W@Lix4dI73aI|1tEb-{Tp? z8{xdIvSP#o%w~W9F$dRiJ7BmA^}wHN`)#i4Qd2z)?FQkXhyJ$ufoo#KIP}v5dHQ;2 zoBq%HsS^)Rk~#G6p}UT)nIUI`;lqpXSU>)+Si2a^*rl?xI8+-w=RbQg>?B6cv>TqPZV^FHiX9`RE__$%<R{T8-lWw;=8u!PdU1b@X5_o^?n$jNX^*ki2?-92Ud z{@Qka+Tj*z4bAXB_l4}qR+YLrdO!DN+D_@gpFp}HgfaP_XTgi&?VJ2V4TCf^?%?^8 zp_gn3n8XpkrOc5C{$ld0 zS7FxlU*q`(Q1(wKp4GAhtfxT8e_w5Nhx!q$P0wpcZVegvBBaZBI!{N#9U`_8x`X3x z&@Oy85={PQNV{n4Qhs~>=LIMkB%c_{A7Xvyve^*ISA*aKH?AgLnn@WmOQPjjv|?7y(fBxauVO!_L?c+nB)!#4V^Cr zI7t>=)?Z|9w{+0&)ua3?i-I)X01z~y?e4DjL8!wC}iE?uBLQ$Mh#~#z`XP$Zh+kfwry!qf?g<#|>PoY=*1%ybg zR{r%Va~3_xV)us+kIFqnTz9KApps?3+(7tqmUSDFdm^U#gfc+!*DsSZc(zT$7;Sk{%?`n!H)17*aVV~DbB zdNQm#q!M9D(&>NjEyu8M)%{x*SUL15@%L_R_WaqKy|~-ZyOoFiGce*!P?U){4R7762>KJ zyb!HU&_QH@&-4ZnCc4^vn6$sxzucV_VflvxbL9;?41ZX&gia2(ALYTIIbs2=ie*9i zh?4j|a%5l3T$UB4xx%-xvcwl4?bn8I5cR(KDQG9U;5%(kv&Tmv=aAXM+x2Rw$8rCc zaBjq2Z^D*VYYAQ%iAHc>ZregRqu#7666KOEx6cI}&BBVIo*Z@Sy1{YSHOAEB*RLhg zt0MoFZC%1geRmR0a~uzwo70F^nb!J0@b~}bupoP~{m*7_#J@&^tQ6elMkQ#Pe7eg% zyU6xjP)w5L+L@BOjM}K$j|gDy9ut-{ZN=Oq6ML^i?-+4HLP7D+x=K$c0|VG#Zp`Va z@~ez>A1qgQ`hKMa{m+u`LOQ@iLF4l&XdkQc!y00mS-d&+0L<81A6BeuSl2hUy_)t^ zN+Fj>+l9)Bmw*9t;s{tJ--wbYn!P4v=fkqR3f9i@Tx{r2C>s!DZsbBbh;Y3CX3;=<%D={uh z3Jb%ouC6|OHc8(*{-a1oCn2h>Vp5PT8k)`x&SCh067n}y>=HJkX(vjb@VX921DtL*zt_2%mRf3gk37tJ7Nu$`|1 zEGrRYrJpB*!3>%9=YtnsYS|fLONj|naW$miNLGfwD+zz5m6YTwbZ9t6DuVq@%Osa` zSz`dlYfW&QYf8{L)>^QKa#-FYw^w={O5LWt`)kPbn+q{m+HKB_QRisMJG}z05y3Tc z89TGAG0$7rA^~5yD~Zg|fhpEf?NqoiImU&1iypXVN^;VFQ@SS8WxD(s0BB&I2vT=y zW_vI0^`Wa*tXZI)s_DJvujc1}0%}qy+JYbA{_C(Q*gm=)xOyq!*1Eo)QrV{qdX{uz z3Y+E&xgT2Qd*fKySUR&aE@a9#NX-{&qOUG9PBl>#cOMohZ9Lzhr;p;jc{cLdo+S2g zy=Or|_HCOhHWq2K_5OnE92_9qrhu-$hZkt^J#ertU-xtyirqdQB}8_KxxO4bLcKH5 zJ_yiw%&q;;GjqgBrc(Z%hD~fU#Jo!OQPH>CjLE}tO{6<_zR@U;?bOv<+RKi*6lL^=Dl(C#4wt8L@@#?q)3Mbmltd@BSZ-CMqZ z@oLI4d8=06{?1WwY@_JU2ua>|1T%#UHA*Q3^h3O@0aP4qRX^HmWqzi$=q>pB-2IW{ zUDDni1e31^qjFbfqOUSfta?NQ4=j{uL8BRTtXVRIfQ&#Q9JpKxOj3w7 zLM$jwk0%onZf3D&b^pT!=32TY>+LR@6N!Tg$UeZ5OUHYeGM2VIFpo+!OpMRpBfGIwCu}BX`0Rrj0O=UA z_I-ttbu4h)Z9k|gIB_QBI#p7K$s9S-p;;eBN}tBbE@)wvK7!>By3E17slvy$A42=EbAa82XZUC+AbdQ6BX;B4xLu~DYbZ5gBUbku zCF!L?usm_N+=ZK~F)$+zRLYbFTgk;;EG$u&{s)hWPXiD_oG_WyHj*}zq}sZad)vEJM8ix;u#dyv3m;i z$P##mqfRjn7e99QDDNJR>3?7QJuXfAp=?sZFfpfRO*PM}fKp60n7NSr*y8=uiaP$2 zyX`P8&G0VbVd&Qlrhn1Q_^$0tnEf z*TyD>=ML6qSs5J};*E)kh7@@M5ucI5ZySZk?z38iuw#qA4vt93I9BQT-HkGdr;09=rZPE*5VFX5dqaM?M@1EIWM)<@BBE z52PY`_3BkZx;m1N6K&PZ$%YjA)O4OY{cS?7p2di|_*MVtNm)f%xr&36sz_(K;x*OA zMcU+$4UwfeW3CUTcC5!JZ=qP>3}r>#yB>4(IoQ!aNg>0SG^J@kY?NPH>&iZBz>cRs55&FxeiNaSUr@sBgtFfEC2$I<~T%VP) zTH8~{X)9V4+6xl3kG}op9b}8#=WUt$-CLZ|KfJg(1=C78+T;@-KbfpLqnSZueSGbK zFf%S9YGj-bIOag(py!hl5Z{vIB5)`~*8@-|9fJWUu5b6IGsr_latQi#g{ z2NzfVefcYwm}ODf{sGQh8Up`abIC^`usZxVLMq>!QM`;&Ftc<`JLwWN9W_mFELj(G zNiuCt^GYgFETBvoJ}TB6g3@Zu4n4?R(>qE$-Vxg7SY_Yq>+2=dehMA-^`Xqo&B+Pr z_eJjOUC7;>4#yU{7ujA-8ngfXXd`bs7Ncn^8OZd+raft~_0H!o%)L3*qAe$D;@axv z($#KPF+H2}TrpR%_L3OI2?Z)dKdVsa9<^-4mFmhjUbaUfN5jOr7v5L#5fa`T(Y$07 z?045+bEosNO`!{ZK$s&G%uuKdqe8&&hlHD3z2&CR0wL6zK`NK?Xx>S*dDQmq10B~R z3`)uznZ43Nh3z>Knu2TkugaE$8rqME$*|6m#_Y@o{36&|*E-gFTikCN2=%?XKi3$i z9UO(vSthCr-Oem#TzFX*nd;1ci3-M0e4($~hmq7wf~C{qohpj%HfN(&ivwyA0KYl*&k^& zx9`>5O{zq+kGfT#;^LL#nwo9>s=IEg>-gT5)1i|L-A>z}9b?zM&!bqe`#uA<8l4Hj z(m`3V@P*K^6>X7(>-saMC}o9=)84WkrGNiw)b$np01!rjqKD$OBLIz(#e98!tOIi3 z$kI}#%s6H9((m5NyAz4|9TKGa!TNmRGVpmZXWLwAjK0PtV3&PT-n1~0u4?5!_In5x}HEg_erj$@)=oUs1(%j}()Fj%sBa-v`F|+0{;-Qv!)Y z$LxW7QyfZ4$~T34RtPm#(i<5GZ(mjroO#n0<;*#>=jAO9h47zZR>w~WfAti`Y0H@P zs2!)^ddjThT^V#fM4?Z6z9EGaL)~Q3bVKr8nrCkt%b;(?N+QLMEIGyx6@ePed3TSD zyfqu9SYR>+tX+CW#y1`%z3UHDd`=H?i2G#;_P#{QZAa@$n&YrCX;EanFFBhB_sv22 zC6m6q6j}SuTxdk@Y8Awm1g5PD?Q%bI{M)*$z9w$Gvy%>7wjvwyMC>{9IEy{* zy|1)?eS*~%Kb;|6aPf4hjf$X_T-_$OugTa3dwL7#sg8Nu1_tm~i2)@ww3v3L(UMP+4x)8&?N>a0?t+z?atDWD+731UO1*4wS-f~4+(e8Tt zgLXfZKa2bk@m0^o{~YscaTkHXiYFibpU)U1cgY^lkX-(iNz(&}3e*C;9z}5y9Q7Gy z;nPDlPqY#3tZJy!m#R*aTZ0Z>1hjDEM*_7NFzab{<1Q2bR!4`-F>TVS8_ZfIh?cdr zQRL=^7u-tjk|>RGCSSg9i$I)^VxfL(h2LOUN7GK_EPaKr#cSB^-yfy&H7qQQwlYPM zGN*HHeQagWfg)3HkzuZ`IE~R4Dh64@(0u(=hU%CFhQ; zN$7yV$Pn29=bcy5BI4s-J)_WNnedj-ytbxz_et~2fqVn;FQlZ15qT+1rOb{j8zI(22K6rDlSwp_#$ocdfeOMc_ga><1SZ7G{BmzF&Y7|ML@8 z^{e{qZ#q8;Gup&9d$Zbpbx4#qInKQ>KisQ`C_g-1Ve{SXI2_K)48$+bkg`Y>C0Rv< zlm;?pS{=6+!z($OKz;w>J2`RyV>q(kc%-AhZ$c=7##;`rDn3a7(} z1+Q^IbT%5zNETUyYi^T~FwM-TIBh%?A?@hiwIH_KOt2MgxFJ!{AA{A3*nzDYQM~&( zdCeU2Auij9>^w~y`(u)ZJ97dV`bX*zhijgwtJ4mcQrjbS*mVNoWSG&> zrsDNm6F57&ninXy>DVQSuoF~@JBKBT%6WcB4feN(EGLVl-cS%|rNG>U8DgFI$qGwK zf^gtL{4kbW1?K~snwp|g@EP}D%-GZg4X>V(%(ItI=NXN>D3$vx(NXor`>U0FbilOW zse!f;ZnAzNzrkSI^LER}sJo6KP7O+HCeXjhQMlR+5<#MjMN^@^ts2h?_U3Jasm~wr zF`diK4`LG)t)l^)mNt?F&hw4JHc8f5Xu^LI3EKqsdqZZ?5>;R0Kw>ZpXJ%JpQx2Rz zsQtMLG1*7-Th2UQpDys;B9|}ERR>|6{B!|iIZcGxj+%K*Cyn}w3D24 zhXQNMT}b2?7JB0U!Ibln$66bKsEd^^EfM>}E^RE{#jnvNYva70ul8AB*M3=PY9!4e zDiXGl7ni*QDWo`@WG9rb9rM?buY$KXP1@P?QK?7arRY3y?Eva zaE4E@vFZ@=9O8wXC1V32XG!>_cYJq^Df+aXwCL{eBvaD`SQkfVPzhQizB4Z)%tyGm zqtx}Sdc^Y_L?i0fSEt+I`p9SM1-G~=qGlSBuX;rmT?L=`50}@i$C#npJi1!pC2q)_ z4FE6DE%vdg3Bj!-UJ`H%(eOXs_O~L8r}e+2+}I zZed@>rWVpD_q$JQX85dBQF~waodv1hc~s5sgJ3GIsYwh5yMFWzykEnXwNRzTmu=p; zp^r>|-_-%ZclF<)^tPJ7GvC3sIT`!8iXrU%avkOG)ti6zBi&@Yklc0e{c|}kI+28; zqszzP`$K>GWL>?0N~n%+NX-CqSJ7-tK?cG%RJ)SufmH7L$ieHGU(9p-z;=Nh(|7)w zGec6A{NTc=$`De_zc0 zK032TvWa52xMe|#-cHy8zK3B-(B$NX3uPzzDxH?#Fc7LqbmkH+o=mL?p~P2HKzRCvkDSO$c8nqe1`L{&DdO?SK}8)C|0h;p9182ZcD0c``oZ8?OH1 zq)Mv2gbz{BQ$31pT5NEN!zYzzq+gm{?H!KwG=A5lsb8?N@!{KMBjFpNpX@864$dzm z-5)QB4lJm(k}sOr>?pR%#0P;9CQ#Ttl8}(#I45Q4P%v?J=3YH128Yjg@(@KJ>S*S! z1asjDh8Q7yO8>gD99E{pvubw+6e#Ia*La9jghU_02?zXDO_qz2(=`GKY=(pF?${6c z+JiIeO?A06g{AwRhE0LDZfR7kt{Kn75#uM<)YTXE&y3W!Bo$EAr{tEc8^lq7ie*pB z@V+al)(_segM)(x+0jIxbn{doTpADhGkU7w{IrQjLUxw+kCfXlQRe5>vNRI5P4yF+5tzgq)orR#fP8eAhx!C)W62*;TMwTL#hF{gZ3U zey27q@APD0)`q9X1Mn`nw9P{%DnC*|Y?4iFW*2p?E*;s1V!IBXO(&r&%#yVk+a`i# z0@G5xHeq~%f)QXwwt-0|4-W-#1c>dNw<4hvm`n`u@SvSJGtCgzKG!=h1RnSA|5?Mb zaBpF{W7Mi=?c3iK)%;tb;y-)ths{!DWcMwoH|BaJM$4|+_O0an7eXVC4_=FpR* z1fB8e2}LiP8Q!r)FCoq-$3e{%BF6*Xy346)k>UO=b_0*_(pop^;zk)~O}o;K$q01*8{?(TXnZiUa4HrKsg@t<^6l^e1C zed^)30)^87b2e*dphEbPo!t)m0N~6@`{mZ;c~TM*FgF%oGB5CJ5~h#5!0*WMr~1P= z9_iAOL383JC_L|5*?19krw!UelfLSS4A>2KhVmo-i-jCia8$p3N#eH&|L(j)hcmg_ z)J0i|U?e`wG;hDDTKHr|@J1*abY9L}DTc7D8@&CI)C86isGsUmF=h&E_hzrW?)k08 zX_sQp(OeL$$t~Xr=xvU7HZMx2K*Q!!ECnbUmRdYlk6y7R&Ckq)1)~$DPARA% z_;^eNilxUc$o{S_CezT06XbD?ExM?0DNFvHY;RSwb{5=|FZI`XC=KO3W*2`XLZY{S zvc7_ZPsjRbMYi%sp(H%Pr+y7RnpKdnDa?1BIHKicn8W~?E}-BSRSHiN1O-FmZ&g$h zU>txy$PZ|QUadz8Z9r`iNN}v%&6tN!-NN1EbaU0AeZqleu~yTuEch0)`AK6naqN-a z54(UWEtFt>&2A1z2#~0O@tkBHYXSh9KbL8|eP%%d zlZvHaOFvp0q``lv4BQ$;Rx98n@p2AWL%nHE(35ePhv6%R8gbhzYU{`Rr5M!enh^ZPElvvEx6zo}BC4fyj<_r7axaWOjR zLV=makm1e1qSR`tM&<#~1_Qqw1T%oLq<`mX-u!-fJ?ivPow+q^~;3dx(22X|Jh0kKD&?4LgfDb z5#POsdM-%iIa{A>n&6F`z|ZI2GJcmy*wysS$@HHe1@N08r*8$T zUxP~28ccmg0?Lwkt+pGliDnPbn*dU1X(tT`Ek45UXSm+&a*cu@n@Gc3QW{(Ie;NGobTJ5uZF)< z?2)BTlZ3eYR%51ZM71TV&=^$or9C+Ed7qx7Kgonc7xL&t_9uuHxt+1P=C=@={Lm=9 zq>w|hla-UaUypx>dXwB8e?iXDG+gJdz<3pk{sP-|IP=8NyCopS(9;Jv>)gCNnhi2w zq81hwFHB8o$gn~!i^aYbp(PCjgBingAvY`_7K3|UUsD4$tL|p@Zz`CNrPC4)8zMOE z#w)X|FaW813KnXFOr+|i8gOxI4*C#Z{>{jlQ(c6L((b_bX|KN{+6kZAiZ`+Dut6{(cLY$yz}|3!Y9xqov+0M9dkFD^E#`lWF~sjhRt4$aP6UmP9?iOH zL<~P9z4dEHF+8#-!WNm5p$Z~_5X~Tid|Sb(Y8ttPD(1zKA@(2!@xBD(ol6$7gr0Fy z77r%KXb5G?9pxgP)}c!_JK*NP@jE>CBQ@Jyd|f{uO(h-kii}DI4=nrW$jHY8wJd5G zaWDrDB%L`t&uoBlECEn?!Ik_4dLAz|HD@*CrP{PR6=Pn7phqHleVGl}C1DoOJe7&_ z`)-8l(v8PERJZcGTGYn+Gzve?8shW5D-g-_PtblDxg;8ICmIxe1r0Kcfbx^Wll$Vd zV8kg9O(g8%aM|Pa2ls(L4acniZXS}P-$`Zvp|YH=N*Y}Flx6^Ys2uO-cA)aKsyjTm%(XO@sEmz8DG3BvdQz_PRT)T>{My_$5V&hDmgr zHpwQdl)sc`JV$_fWFMw~|DJ zP3T8X>x1Y$VZ;PMhxo#Z`9@{_t^`_o5ghj6`4`h?u3ssYyv4cYCFB|)ek~$!7}vrV zyOXX&jX2(GMmD72;rlpHQ;mPjwt~80-2^bb{z~9RX4eo_9jud z<_0#j7R)88qnEdW@blfolWuGh!WNQDyW_Q5R{cHY0@fAam4RP7>T>j-Pb+cv3_M!% zz=WoWz>yuG8ysMu%KyIl?8s#t5$BNo8fx0E&^W&@1#~I9Zo#bSV*=I=HQ;~0eM1G( zKNL-+AT9uHbgBwNH@9EiXXkvgw9Gm|+FH-o5#)J=eY~1kccRI~?z&2|4c9oOoZo7o zu4rzJ=j1SqNQ5A+^tSh2u#46*9w2}%QRvsQ^gEW6b@08{i|&I1zifw(^biwLPCe0G zMNOx;!EWl8yGaGj?q@-KW_mut$ZQvmHqh8u)>>oviRR0?c1Ww!h%G&0^c9b=>qOv` zKSZ=@BJ=%F8y&>!+7H=Y(&Z+S1s;8X8kCOA%n73!wC$;ew|=7zM=AKc%K9564WJSfqvkEow3e?^jB00JhyV|84)frha&=KsMNllN)np{I`U} z2Q$wPCeMU*O8iAxiUj+QIQ=LdwcR_yDpAGg8yC$pz`eb>ECB(VrNM z85}j;G-h311UH-+g1(~a{;tc-Lc#^8uvAp^m6*G8Z zm8XS5za8zJuZ=s9AW;|GWDPjbx_1AXW9}y0Wd6gh&5j%AF*uL1eC_mcI%Q0ki=spR$q?xzUb=NV`rL zjD6_&`;*!;>3qWEN!7R!3Ia2B1|Ol2-bJ2jlH_cGT zH26nXm|~~Dp10PdSlj9lzYZi!gMh%#@><7)>N{ppQO}cwwAx`wUI5is)B6pp=QiVe8u2h?OJYM%e&0)YGj zzOGEF{cs4$fxG?l{!b?r!s=G1G9>%69^acWG-CC96pmFpn~CAiR`<~lv7vk3>am*) zo^vyX=ee-#U?22O&zOhi@wSHVGg_4H+*q?d_go>rg1P1`aJX^e#J3K~??9peXb5v~ zb0b1P$_ElZ4k|1FLEF`P?j^g|_u7`{e5tA7-gR}w_|~xUZj|GzFN{FIRCN}KF;|N0 zN{5jZQM!yExW#_8zE|Zd${=rRTNL&>(j?x=7o0mwEQ)V1iNkqmU(9INAS+fM)MxLJ zI|ff^zXv`b#D!2)xSMV?CUTLT?gM@*c&ReiVOfX4?^?tF&ycldP>n>q>Bi^187JrS z(CHUyD|&RZQlW<&M{n{8$PDz@GA23brr)w@$rH7(YYS2_!b3mvaK2L)f;Bn$2s@3L zHz@R=aCJ(0dJ2Km?{P@r*w}+22}wjwn=kd+WpJ0c<0n=^NCOv{4`oTHFi z&2>fYA}QD6e&fpYY#!d7RV{*Kdoae`%yzF6-RbZFwjDjOkSO>OVE(`&+!;098;Is5 zg)Y459YBkn^=70ql<*2`aW+OL=mhRUE=P#29RjQo*Hjh(r|)HSVg7R?V&&W)w($BI z#?rM^F8nCK34ULTWh81W$|}Un`o2I=UzW`$3F{9ni#u6<0UEc%$}qNRe%KxDfW{^t zsaZ&5i|2U`$mb|^f}~g}GgbNzc@9AfX*HZc@l}I`>yN^yIoZ&sx9DZKl1r*`5!$0*$2{urY}(Ientv9*xb-QFtds*di-`N(sO zI_EDg!eLxCyBnz8#CUKjG(q*tE7!A@9SZhF=t%ovrbG^RR-ai69X*-@=DY^-<=>$; zG>!&cX-rkC?lp56l-JhTI$A9X*GC$l!_p+B1@uJ zQUt-ktS;K0oOS6KmiW7T8TgAo;2XzsGzY}L7S=Mitw_WQG4S-4#~!IQ8nFE8&MOfft0jne)PY=Cd$_b9F_~}t{_bVr@q}Gel2P^7Q#PF-U!JB7BM8(J(oD|GyD8-f3P2UL zB5!7Z*1&eDNhd{o=R$8$(VBaQ<31=kOM=`-vkwO%`h6n8x?_h1z&GpHp(1ZF%|N;b zl}^$+;iR5Y^$*?w4Xk(~Hedt=0>+Qd86xXP!qc)r@Tv|H1TE0BqOjGvC zKwm{CZFXzr$ynPBr@ZgQyMxk~;+bmAA zUEX#JZEE$PeOJ^~K1$>I)`?``mD}=)G4T1i{+e78T5zN_X-^YPx$D(YpY~Fi!*f*7 zyy2zCd#E8_#y*OqeydAe(Z!J4&p^y7m9>pSlwtzr%NfL#Xc_n6Te*)rzDP@y%W`q= ze0qI>wR}mI{rb22%)#vTqe@h~RPxUy8uPaXeZlKfPp z`*2s2bFXAa^NpNyTTB=`tvFc`C8Tm3jsoi``Pvf@Vdew2#sk00%7)6gX7)Zg3U+gT ze{8Fl()d(|O30aRjF$*1C%v)ws?FD{i^+?44zN7{_|QeRys(fyMc)f>4`aJxpp=sm z^7+k0$j8-z5#Sy#vIrChkAUUo@%%W727t%>)HDOfctt!8d)*V;lbXT;LxqM0zaxj| zFR}5*z~1u=OoR0NrK_l}yi*&PNis@Rt$U}QHf~yoF=cXdOlo)1SQA7=IJ&x)V7S_W zQCx&?qp0i_k8L(|G)$`ld9nK?qIgHndWfiPnS$dxu8*hSS_YNZaFk8-Rc&R*;nw^( z?jc#^m_9yBhNTiyc6o_)Pt!E=iffc&BwC9MHZ=OKtVQwrF3`+W+ zy9?@bNOvB!Pw7~TGzeXn+^GnSS6ad8=dSh2*lj0Rry&Eu*j`8p!dk#{L-9VYf3cg~N^i(#&I z1pWKZ(-UQ)I)ikTu*XP78PuAs>s;EMNAtx`qfkKs6(tQ3=|Bo`iQ(2E-! z!i~K!v?TpNs?H9lf^h-fA0zYgLhnLX9r$}X+M!UtZ*WwPBh&xP(08V_+*K-leG?jV z{;0G4$p1wT+6yi_V)v`&|H#F=Jt!xNUC&fpMkiAN6@(&&?ww}_(E9U-8v(fddh zw0lV2P&1c*Ix=sP!hJoOT{8f$-`3+FNC^K>&?X>(Hd^v$lW*$P)J2UD_IJNBB0pA^ zDECyo5h!N5H7jI@cUUYrIS&Xkqt>CvgKgvU0`5<2?rnJNIJbAIYW}rhP%JGt>49ahrfE_hlhpHSBlN^ph@Bt)}T+|qjM(>09-A$ z^n$BNHG)ArL!CA+{ST*o2x8|*~)w2d}vhO%Ab`2n#(%dIaJQr%1%ZqP6O&%uD z>j1(7CQ3+zPDm6sOWi7ko>O}UqyO(Ph{LoIsYxILl8>6NcaF4BR7m6q)*{zaczq9^ zkKFEcx`V6+K~fwb%Wwc-Cph&-`iYm~qsVm5)WBS#r=Wn}^&z zV}`kxkb27ZTB`IqC|^00;{K)ze)RFJ%{yU=64xJFai2m!;Zork6Hv=jnO58aG9uf+ zN~X0}O?@ znm5<1_}VdZxcbNX;z|!2G>VgT8M7Tjf_juuoy=alS52CO^zH?ycjTRzW%x7(>#%Yg z8;L#74}j#6G&nU4XvF~mNi=Xg_xUwQp*~Gs{`}K!M%r3AjRY$DJ3XfL~F2r4Whc{bKCR3dRGq4(aO{x$k{QT_oci)`z1( z8LK~Z@@w<`#88x9#la%VsyeM{=^;=*gOeO6ppDnG9lS)xkNmR8kJqp_Ri>S$@XdLnyDS<|Qo=qu0_y^>YcIG+dp;?v`1_}vPf#1| zgP$(X?22!`wkznGG4UTRsVJ!ZU|1=+a$IZ+EHL!3CdebTwVBp`JH77+IIL?21xr}x zD!Yzv+}4cqP~11*q>3@8^i>6^ReLNIa^|_XLAY^n5)x==U(|;ygut?yhrHoD8ZHnh zJA)(owv{Z?xbc}EC}wkixFhTo^_7nl?cLdb$%_DjpL*x?Sp#M$I@~L{PEN{k2iz(^ z)ucnE&tg8)6~cj=?AM)k6*MVJ&oAtrcOX@p2j0+(K@FVhoV zr;I{?0w(z(Kwndy(K#e4Bsx(YEKHX5(To`DMXh^nf5rr_!8LK!grHPkMG{R5XC%cKWh~(_sI-@0=4x5xr zHkz4&s<5Yu+VPgkqmt9$fPm0Mt27wd7&j*PKDOcKwzHArg!O&saciYkrWf$c=Sszi zlJy+)&g;KNq`4p~k&ss08@<4zkE7@-W{@_CKbA__<;2*>{~QUC48)BkW|>%SqtZAo zgAw$W5=~5~;sB}S8OEgnfH+&d1Y@*CD`gN$)7K5H_8MckG_Mmz<_ zH@$OO0tcC7r84<4lM@p!g1m_UgaT%CW=rPdzX8z+LvS+Op80b`D=RAp(`dY-6cN6X zwR&?pSIsqtHlfYV#?_-~H5BTr^kC6GKIz3fbx140jUMLRH40v66#7U~4(9SErPnXY zB^0S1>pz?ioIU(6rk^>>tY4R}&kN)jDW1FcUZ1l1j(M}LeduNG9_evFW<^{JiBwE^ z!YUpgjKP)Pu0g$`m^AM=4_}=97T@l-9Fl&+7{~J_@nvrHevfsDXFlz2Re~6yo&JC( z7B&x*5=WPpvs|>tCYP6EK~p$v9*B#tI&2-br|$IK>-miC$TWDoV|}`fy%L_-m*+pN z%7iLL2T*xx1dYd=Wo>Y<&nxGQCm&(BT_I6EAcvN+V(n-%6YlAJAP1>_Inc6^G)|Qb zJJ^B+duIXS^rb1DXieWtpNv!ElgegGdYuvu4xOMbbmC+4*OvI5bX1T9;o*pD)_T&N zE?M{nQ-Ay{EyGZj(LZvuPW14H8CkdVQq2K}0(t%Vz4`gHeSa>l!HJh=hs&`5TU6+C zW{@8r86EY%y*`&NF#`Nupr_d5ePn%_7LOJ;pK=82b@n*7-ajSUu1PO@cZf$Q9H_4B4 zgL5z8055Qa8xv5yB642I75tEThT{jyOmJ9L47o_e(9lpad$r9hCpeiQ_I3|&dI@A^ zrn$&V)a1)0=H}N!i{K;);6f=mms*5V>Aqz5<{7#rQHTlbv=?XGg;_?xLwgfvD=T#F z?In~xg?3Q*u1ApEY`hrWhb$%ivMfV-3%}C6GECxU4yOu#!Rfc$c~MgcgSW>-mEy3| zQA#*DC%9zpdJYP~Uke9_BD3rgdYJcj`N#!q#Krv!Rb6Om2;@R$C3i+XDM7?ckYRoN|COky$eUF!8_kKHWN9kLx6FK)BpSo;UHwW~(&R zwf#k};tXv7U?9@fNxs@6#anwwDpUM>r|VVpf%a{WeL%9x(v7#G9NYKks9kSzOiJBB@381%58}zc0xPseB z_a9M!!UU9cR$ZG$Cntmb{o%l251qTGsRaB%I2Br@K=|K(eESuU(;&l=*4iwrKwoHD zh&gZM0VMd&BYz0UyFt^P-P%Bc;GyT9{i*}>lmUChEWf^J1|J}5!jL%#83ZQm7YI>! zLD7PO|GogEPgLYkcUInD=TrqQOB2dZ{!dg;>5(h& zuMXys;hHZ24s{2T8ni{WFUUbAwFF02tm3(kv*Th$)^msBM(u)19(d{CYurH|P0#9bUaMA$hnW@b&-S z=KozAmBAjmIr4>zSMw5%cD@$tk8QCxvSqlV|E;C`^LEIQDMWt`{JU7t;vF{Fmn#Dp z#Ghov$7{Um{r^4)9MJH)^@i<=NiE)u3<(j4Ca=?ua(CfAEO`#YvzHA-@D*Ga_VhcV zF(z*n{=G4N1NG`!hR~tL#SZw1Ru3XRH4ejkt3KG#N0~%9wgeQQ3u?P zk1rql|9$p_ki7p>*jolf**$T?yL5+iODNK*fRxfm3Id`aUCI&?OS4F~goq#^AV>(( zNG?c-2#827v2?SfG&~3O|2+5m>D@2HwbzL`Gjrz5nfVRiaeC1kBmW+2=Ff11um?Yn z{QDST{r9oazsDiQe;@zv?No5eqZj?^_?J0CwKNmmD4>6W8aQ|fE{Aj#5uW2Dh`W^@ zt5ao~vEm&Zf2Or%GQ&zF$9@0Nzebg!UY5&E?&7k2ak-msdFht{v3BYTon?cB46Rmy zq+!IO41ZYmeo(h3S1>1Cvc}*3aBtlGdgE@?OG;Y7dpVnybyxNOQRD+P`&`=cTyU+3 ziLUk^e;p;wCocB6kr{T*!?Uthm%CEe#kG3iOc6JNHVulOd#t{JL_xk21PHu1$1mVo zUjmu)5S!MnS6DBB0Asm?WWe!e&FXFt%9T=hLF;BGHnD}T{N5#i$U`I`I-_Td2#wY( zRVWEw{}Prki9aWw(N?oYYgv=jp{#DDvzef_hEmdl7qN$7&`_fF_1!mDoNs^<^A5BSui)?^4k|RCP9U%&H_*>Et9jrr}t)(hgoM3yOD8_Dj zV#-J-Zc!#|yaBG1yGUKg1Swh{Vw*m7^;BW#&%gOIJ9})j3 zt+SEs(1s*XAw{q$2uHWs0u zmTHwDd**XEE>e(MidpJC2V!nZp)!m}OO!HzX;(4Ed}NMnKbIa2O$)NtBZtLTxU z?Cp;sQ$NLf(=T7;fSfYb=~2f%3p;;PN7wmGU^bLkp8gil`Zy~kjn=&E?KY5e9Hc-h z;|#~R!g32L3n$QsLkzHx>5&tT)@{s-^D$wL`*n4L>ngxYxhFnjR2)L#1~Gw}<8~gr zPyI#Tw@z%Y=pxBDy`?HgJ6ghW#?9Ao^VDJ+{P+7d8$_wOEa>>U&5c-h{$h~a8;0cQ#- zO9iYjfGLK6V~>WcG?n^X+Z#bowvL2+{cwF*pC~f%h-x|Ol|2a^;1P@GjKU#KEPF?- zC5rTL1_YdteVCA)2-d;>Ek2$z{-*u|VJ=8kMEwTYB^3v7z8Qxr6U^Yaa3azn4;EIv zi5}AIjVyMepD8CtupmDID$v9{7H$?PBt=Rf{|x2^H&l^8gbpbUE$QhvDoFK!OfmTN zM$C?p3_p44DwZ8+3qewy%2iRaeZd96fp1s9*UNEyGFmMw`(;A~@ILVzj#Dc8sx~v- z!R0;`b0Yz;4!2+4Hi`HU2sUa5F^@No*xTcxnw!eTQ3#mV+=< zZ^$QrTd#lQ)I;qC`_sm;*dSihAu1`n224oY>JgGc!G!RP*SOGl>1`M<)R98rMq2(x zH{2>_6o7bTK;(EsMy<;qLLfp-dsoD@d?}H+Ot%~ly`L~WJbVjT-JK-hmE4E$LiWNZ zQ}|6zSrBFORmy<0FaoWffay5&z5CAiy2<<91P~SIso`MN$nNAzCC|+XV{Ej8dg4^d zx}<@D8Mez>XDm|^>|B}9z3h?4HH6*HBpI(-?eIFP7KJYNhcsiOF>a%*930;!_Qvgn zB%imsSd?-=oXMMOlKR~GWsR>936usb#6u(%ZrB81ZpQCBB zGj=3OFAA)74F>!ebd>4{;wIha2Sn(!?yCA)4XofLo35DNIxT=`(C>^{4a>-*iY zgxr90X~>1OYGfEwgoFFtM53({WA!d-R z#}FIW%?qqQL&SCv(B})GfK1^z<-8`3hMG_-oT`Xft(1`vvMDktTar%Ci}LW^e$wbB;e+15ZWk= z1l;C{2n!)_;j_i1p+HaGH7ddl20!8;!^_Q_ORcz_rJUrDo?p zLr;70-V(LROIJcqDSalD^KVx^BLf_k4DtaLYi)e|cvTA2K4Q5TclImTHjp5_ms#-c zS%R8TZ2Hs-;gIat6j~p&qH-L4wmazLYe31Ayc5JFMoT7tPdvWFbsU8BO|5kNY!8J; zw2s<7YytQwy=lwmAOm{4DJq9KYKlSj z(5oS7phdB$Y9Y=(bj9(e4z!xd-ji5%Hx$q)AqeroEfegGa=z64s)`+L#^*Uv+hL2E^2|G!XqG1Lgb8^q9M8 z`LX8pm|%AGPt$&G2^%aJml&tX+cG=LxtwVuJ>L4AA#E#kvlC1BTeOHT5J9Xuy6p?r z34FA)lmiRUm6`z6ak$LP*~{R=+M zeD~L5nNIg0jogP#_{XA^T0aznB);C z8n$cahM3@^srL*ZEf!m@fNc)khHe03=Xmzqf>vQvSY7%fYkb#1m;Cv5?#0>kh5s%n ztYo*;Ae+=~(|Qndy`XO?D{u<9MEWp<>@l7@3SO_|D2>DBYEV(U7YBiMw38l2l-6W5 zD)+O?n5(b&d<>=JU%t+fQ*y0-rxpj<7U`%~KU`}1xDs4##mnvg(ucc=V-vq?u@jei zb(=X(F_CLBz11pOk4>~m-Nr_5Wl7G+@G}ghi8|gV8J~;F#t)0eizB@ww0!QV{TOV5 zREr?X8O)sSiSNculX`cag>8_bIa+B){v_bY21FVQ7B6X23)9+p3=`(uh^pJDLD7O@ zU2}@?Y5#*A2Uc;SS=sbBF7+ZB1@ZX?7X6H$qaTt3Pf#=q7u#&w@5>W7JI?Jc!cCl<{8qjdBiDNU^a2l0FDK8de6Tq1ND|ok0Y#DnJI~KfF7_5)o5`Jg?)Ts9aG({% z**l1XT0OO}xO<&inHsEITs|jJqEcWp!Ot~Vy6?p zIBEs(H;Hn6!0SGcv);+bafuAc`wp&0Jib3-CcidhWHz}I%yx=SakvF5;yGlsbp&_~ z)4l*+x(dK%tD^w_9DIK|YV9qT_9XAyJ%>)ZmWPJhqgDpPulRQB*@%Dvsia4Z3rdIG zb#rrT7o3a)xsQvBwk5`ucu|RyHvtYp3@+qb@`XL>Voyh-I5WT}A1ouVvB?1$t(UgF ze%_Yzi~7Y3(Lav=$lqhRyV&by=DqMr!0hnSG$KRWX&a0L;i3pB~|%s{Qi z*P~#SWAovxKFh~IN1VrjI!)ixU)<%KJJ2JbET1dmQm2%zFD^Qc$ae^G?=NBb?#wL3sKt*m&0Z z#6Z86xCIws++$~fBA>-KZ#vj6yj+{p6~Rr!R|TWBRjB0d*h{}h)lUuffvCuDuUGav zz2V4Z&|bzkjAI2M*}eo0i*Ia#O;fp~-VIcU)B%%88*nQsIv$Ut;+A6x03~-()>?y` z+P^3CLyL+EZfc=YFrKV{J7ZZB}?Rh(c?KPK!;i#(}s0G-_mvoB`;s9zfv;7d?P&{%XV6ZZ7_TwG4 zzJ!R0&_#ar8hTflUsd(%cx|9XJ2~SsFgQ!ecfeOXa7gpiH5hU}Iy-*_s)3)*tIF+A!Vj&o0Fo;QdwXzq zrdt#bP;L4Y zzzrG!3P*g)@oI4fKy;lhoA%r7jRS(E#n4g^bO%idInYRafCFs(ApjUCONJg^whH#3 z34GIc6de`C`kJdyaIdncD7SU#Z4nmO%An@ffCvq>Ak~coX_d&;(U_UcT|_h@6exB3 z^rJIr;n~^Ke@wu|u7rzt!xR5DzqEd}s2;$X2kw=3vHAuE#oB%+X|8oZHG1#zK+H&6 zv=Z|kdv1*H_c}6xO}EtfUZT6kuU<1!xq_7t3U4zS5M-P#;mkT#=Q;-~Dmu>y3Xh-v zU`#!aYMDj_0-6fS9-=#VXa!YvCm}!sWO6}hB1}qCzy`&!S-)2LUfOg0@CTTDQ{$Z% zD$7m1U%>&XCBJBuc&3(+eRCRUiW;_y!!8G*jN>`Bi_vDV9m5nNPQExB8SICG0?Yvd zgP!?04r!c5OWFmbhHDqjn5i#$A25FLEyYVOuGT_H$zGUqMIi5TMP85YOjZ(+Q|Y!D z@zS^@VhyU$%gA+cJ56vg_NLKSe*PeG!ljZ_V)-k{!$|R$T38$63X+6?#E8ZkPlZ05 zA(d%RY_ernb^i{$|6@aOeX&s1$nKuP!Gp7aY26Gh|NMa0-vT5`fp)F$qIXjkXM`~< zH;%@wI0zB)7e=z)rk2|I=v>WwK1-MGySf_Xs`kM72W~`!ngbDZE?6)}_kn>ytk-&Z zm)!o|piZC<5d0xr3UL`z6u6;ciV<0xlP3;U$a-_zV|5c0L41<_RGQDIw9#|*S7C$V zyB~J5@)DgTAVjRu;?u5Qg;>u=1kACp$IeY2 z$}reQbM`Za_NP{wv9Iw!MRAdql9F}06q}5!(@J~sadYG0xu&KjK7cteWm;uFV2c1( zC*BEa^U0tdmqx6JM0*+SP#1lr+?B{v{hcZLfXAR<->L46Dh_I*jKtmmJgXRo&6O2n za7Q&e5-ts(GZxQvZ@9ZnpV*5ZBPYrN{Y8Xt6)P_WsaIDIePLTj5OFUv85{aNm{p_v z8zU6Tt*FX9G~7p2Pe4i8&6CvEy2kjW#DSnPS8Dt2c}XOViRAl4;v&Amjp@}B`7E41 zt%LRKd3_{gd2=&PX77h06VS6YvgE;?Yn`bVJL76vTD@F76|9x~YkKlgqMaqeofCET z13AF~RT6K(%p#FmNZfJ@Rb#stLME$WWsU?@u#x&n4($TcY=?r8+lVuo1^{#5{22WL zS6UajRRSL=&8z_?gPPY|rzJDdO?q4s%7mXudPvD}mW7~kvMD*yJ^OKoxo@AnTf1Xe z5_TM;=Ad&b=#mHhM30(rW8^@pjH$$=`(Pkuy5-^_D{ibrtVsOP&_giRTEGgEPsSru za^d`ss+Jo9h90a_3pYmIl2AnjZb#RY+GVbAJ<{B*)z3k&bLjbmkSNB7A%3rA3f5zSS>b{Ch;&virXh0DS92b<5d?b6J|KuV=HP$?{tDdA_o7GebvaV0$z1T6lfH#fcsX9b_h(n1V9l zbay$WFZm1Z9eukH)!MvTVGAjWLtg0)YrynWK&7890Mh!`P6wQPLuA<=2EeR#`EOy@ zj{N#%LS$lXJgm@DAs8v&M_>7qewXNz&p?hc-)U)Xi2ar4Y4t{Ba>M6ISylU+laE)6 zZ+PIFf^BI2^+s>gucq{KjNsbThJ~-2(2^!U+qwA!LWE=EiM1NQ2pG0`ZF&nf(-tZ* z1q|kADMDt=+}YU)L(iCq$-qgxOWlhL-hJ&g|2Nxdj&7fW%?;Q^w@#dA*^`e<&%n(Q zv_$sh(S=f}?2nA+NCK$To4rR-+HyzpI}Je1eE~RLH>{5H|6&08IJa3Pnq=5<=6cd((mQ|I#6Jhq93GJ)F zXSI)Jy`ASxyD}h0&%tpe;(0dlj|oT?h!J)V+;q$GT|@?9cY$aPMr^?XJ|h-T*Kwh! z?23K`G}jJQlll9SnqG4%vXMP8VF{5DYFEDn?bR$ML6tcucL7$RvoAUbe;B{<^An&^ z+g?|`q`zT>d@lC1>a*1NIXYOi;e0DxFh)huI~&LaN6-ybDyZz^mVmR?GQS1Be&>lg z5wjP{Y~WR+E5%&ZejCqvtuBtTx;%gzujFhd9Hpfio)`-E*#S4aK{xQ@@JyB7J+-%A zuA7bGO944;59TfEAf_lw-7D-Ojh?W>$!i*EFG_R2CbwVGaz{tXg=?9ENJ~{!6_Wv< zGMhq=QWdtwcnY_ooMCAfKWc z%;$7tQ_aKH>xAu?fycDGi(Zfz(YdxU9ujT zgfm^AJ=l?C^MZaN{H^kl6WRR!)4$e<>G53yt@w~d2E~j{P5Z+%xQzVA%zKsPb;7Q+ z!q^9$e$dU3^?ULsJLrNvaynFy5M&KcGC*g&nnZ&Bj4_q!V0SkNA0c$~#9`Gv>BgI% ze}rj(PMFAHS!cNMXfa*&HNWwWHBd>)LE*$(E?O*IJlLI3F;~TQd>3bAKlGblVP7B{ zwE6Ac8*CHhr*2ZW&}1tAcyL7q-V3NCxTDfuM;@q{3@fCyHs5FG^cw5rl%`egz?tOn342@4#tME z*Jy=7ByX?2j%@YWrH`ea!^@JgY>GZCdYDAOlJSFhy@=2A&_aG|z-F zotq_u5^n_v5W~(+b-0@@s6GuV`ZBq2gCMcw@ZXKXNHgr!$3!D$t}Q?)^xAxKA~8BF zua49X=G~G|aYn2M2mVMAbY6_FAOxUvv1Fajb7#e<A1PAGRWDa^ zdkXB12~I=~UJxJBZ)P&UeeInMf1Vi0R1GZ+9420hj8wzQN8hQ^Mz8dK*oJpqCWJ;%h;>oOiI=K{6L{-iq zW!^|wg*7+0dQ)d;c$oG0bV>eVefZE(S?I0?jktCNIwSq{T!p1HNpdU? z74c{o&tFy11Z&86N>g}%mp|kmS`Yd{^Vet^-o#uq(j>#btd0%Q$80C~);y60u z(rgOwoPGL$a;`@9;WQ!i3;m#@@vzf`EIHAzG^TOT`)q&YqPe>Irk=tKmU*p6zLcu} z(41VtD8-2z-w#WaCk0h|I%2i%K!3YgX(>7H;PWw@Cmm5*ZHCtBrIE3;05#(6P!H6?}T*oQ+-1N=k&?cfgvzA{B$Bo!lUe5%1mn-BO5Aynz?*Y^1owY zc~x4Sgr0btRXFjWX>_JsR(=9{8niA`p3p|uaRzp9HNpm$d)I`TJ=PCT?4~6E-O&7LnEEBpvmdvYw$x;_NX65jJUJe*z*&JqJ38XkH3N`4c%<>9h> zqIw|hIX)_y->dB`)@*;1;< zX+B=heN}vgxxo)^@YfZ&hMkfmul^71Y9bGjqj3l9*Ns60>#u5n3BwJ9Z~S5$xHY8j zj!=D)a49n`9DgD0&Nr2dOeGm-)VffwC_`&M>BrANzIK5#(?LN9<+TY6xZEeml3e4m z)zUPPFIe1gVl9FdNGG1ll}u88QLNth)tDh^XEoeTBLf@I{lr6Y1<%X=_ z57;j@gVmqz^kn({9J9LFI0Y_sg)^fbAeT*WVY=0~Eb$mssh|E{xvyab6b}#>0(Vc~L zRk<$kXGm;q6$M@QJ}CT>5l%UeXLaT{SzqmXx!2;Esl%!#RvP<`GvH{ZQ2=Ty*)g(VwJ)6Uq#lUc%jjRz^TQ=JFw#_OIty%mcp z=fqGv+@x&Qj+9>w0t`1AhCJA}FdcgSw8P-Ca=2=%+zuc#!K(85!1ww$ zmJw85c~>;bn0)K%X7v=4BiOw4>`OCUufX}4dloRVkpr&^oeOW)i?%OdJo=k_R4xc7 zu^FC{;Xyi6{Znj)X3y~+?x=ng$^XS&H?4f(0{sE;BRyo&U$r>!|8tuqOER@vL3K5BkVHwFuY((VOMM-i0z#F}`Ed6U7`iY%Kqd2FUF(5BII*j;>eR833Jtf;dy zNA!aU)A;F*NqKA1O*y*sN+YMf^$wPFc_#SEPd-HXU0N;%X(E~UhC@V{LR3UV8BnRN zGBW)BBCbC=NBaA%-(OJa5dnD-?5TKyeH~ihwR*qNht8{)J_+N7U9r+P$~RUU6v%?! z?WI=rQtP^fzL*u9J`tJ7=(`|GWi?Sxe9?p~M)IQj>)b-Y1q#u~W#;@MIBD*jf397Q zgEQ#c==4dzlpS+0c^9Mdj9@P63p#y-VdB->WB2El=NhS0(b!cprN4)vd!1)vkqzJ1 z2S)8qT*Kw7kBypvsutEGqZe5VB1GaEe^3sqB|BhDE|R`c?jlk+e30PsG5I%K4UDvc zf1hU_A<~H!jIHC8UieDk2?>lf4c6O(O{h)Rv5rfp{1chWnBt*Eg3i8a=XfLo2yfov9v(VCg*7MhEP-qb&}7V>K+>#R6TfGU3Eln$v6e zm+p_LrPFJG(0a=?&eNHCb<2Z8Lmj_2R$_+_u9+iFK$1YDG>@_9AW6yhU~alh#jrU^ zBW$z%ceIx&?Av!WG>F5=*|bj@0hH3<&%|TP{LFB*j_BTQNj!d>{KGL%LVKjC0IwZY zy%kj%H&owMu|pD_4GQZ(99AxUGqgE=1#1cJDTn` zUS;y9PVlIccDM7VlI?QU?wFLG)iBHT9wd=U#sqIgBQvJlT5r5n6*=DU?-4I-xaAYEKtC38T!NdpOdQD^}1t3Op$y*MPly;xdm02 z?6Z9$*t-3xo4!)$HA~lZ_rM?F`JL~*Pxa88dGe8`c1Qt-%ztuY2hG)4$MemyF?Pn< zMO3<(D#mT#fSu_DBgb!f|EJs^n?xK@o6ni;1<}7Rng&FeieH9$ZI;!L5CP@9DaF4=5q#F9h zCwwoc7wzcglHlwmov*|ovGDG!clzeq7^4twE(g7mOrKtq^k9RNm?i$FN&2LtN9N}a ztta!Fc8;jh{yl3{O)Yk<6cB7C!OqUrRlN^jGo<7Z48n_%D`(o)LSFBwu*JeeH+AAa zdbs*1XcFmU^}RGZTD^j#uE&bWY&(|%RrBQzJuI6Wbgx&n!(rYYJ(-OG1|o+Gt&8ot zhhBE*KAZ#|(a(z3veIlWjoTM%#El__p`3P#=`WX;$H|*c__*C^G(BiP#YPLO56RLZ zPxFE3LkVrR94NpZBSo*v!cz%5`7|dg#y=sBhL)AR1)J?hMN9w{xQu=L6i5>hP z(iEFmtn1hX&?LkGx=&=wS110)4;<#G{WCHbaN1mPlQ*_Q{WfFnGA5BB_|CkzC5R3{ z7u3L({1KOmDB)C(0?PSh9q%G`lo--eaUDYCvg8=^B|}Mukv>$q&OM+glRTmj3CJO~1 z(6+-R#zA`p+`!=lKFZk`Tlpi*=S>|bxT*smzuZe_6rg`d&H#W{zbxxGVYu_T8`h5^B9t#JT;4kmNuvUnq^7ISza>-*bf+@avU zp`qt#CBOp)mt`F*1zFlwR-6DTt83}OTfd#|7&iF;q{V$mf?5dp{@$8c=Kn^KD&s8* zQ1-jRRrdGxbd8LCe~6nsSaO0bY9WN#GFmKi&&CF%%aU|76oc%aNcqz5#rU zHI8En0N=E2$pG9MwvixS$yA#Bp&ilBZKe|!$?uE3>7bagh9p22d~wi(@z+cf=XsAu z4oaYc@QM>yiG=NUdhi`p;P*N0qP<~$DFYGI(IHGHH8r=uHSm~_HG)YTWTh1r73EY^ z>>R3i1LV7qFBSj-1gy$y$39{iQL zgrH<7xm4V4S=`*i!pywCg36(IbbSlxL7PHmM+U13llVWYKM%Z>3P^FZCYr=t)J4R_ zn5aMqzqB0I;PxT-e@mP^Cn**bT0Zg_>4@wpoqQI=2Sdrpj6(m>Kp7ZRMCe>3cTllw zmhK@8-vxviIg{@x{##)z;IL&tUf{`*zfB7kJirEyKwpg=@_(%pfz}HkaHvL56f=C9 zh`$_mvT#WLPbm<+oRiGL3n0`a_!MJ>B&~s6*iGZV3p?2qyEE1NXk;Gl4=-t!*kTOx znLJo(3K|jqewi+)^b;)^w;&1X7-I-;nIIb2r}ej)c0%Kv#+APKAK*S5{87IqF;IU! zaLxClE7fHS%c6MI4rY7@XWq^~Z2r)N+>&W(l6->FUBLAl0&_b~pR_#oH??Tv{jZlS zk-+>JA1(@)E5sM9fHhFgdhQs0-BMxy!$}q0u5X_qoN-K56JbaNut)CuQ$$@9Due-e zuS>Q{B#oPUiz`F&@b1VJJ5rZ-Fx37wTUcVe-v4U>y@X87j*i%6c6kFs33SUZ(+S^U z|H2pgM>}js&q-<^dR~-r_HiN$fMvkA9FC1gqWg90-roT<0tXuxx=T)c2&WOZk@Cb% z=tt&V=>v!c3>8P>dFM#i?jSUVr*<;s?)2CQooJ_7YS#XKXiS69x7yE=rOhv0QC<1? zrr@v?5kay}jC|w3%my9C4g{z5RfK;H?101_a1m!v8P>%u&4&AET2u`ib19^FbNpHO zYf>=larZ^D&C>kf8ptnzIMI8>F|Dcr(K^ymM#t{!lTf zhvBw~JN5;%ak^%Me6+?tuzrRE7lx!M3?o((F-Itb8U3SoJ`?^?BQg9*r#Pxc9w-J_ z%CS7bXbo&6&rRmdSjW3EX9eyOd|{~Op_+|gWBwU|30cAOl+8#7 z-2YHnZ%f4d!8)c1*@7+Rh-&Vr*??C}9H>l8exCk1KVOB7cf;E2{mVaF>z6~X^?m~+ zz9Z_q2!=Xw`{7LLQvRCa^2ifPQbsL$$+Ff2cF>X0(h;{`OZs(G^{7ViMA!d5rpT&* zovbkbKDg=v$YW7P>P=a!vow%JQ(VXA3TKn16klK(|jyDY}!>%&wsFu>LZJ0{@d(xM}c0VnAK=<1|2`wfT^K>-8J%Ckw8$T4T3m+ zgohl$`1CC1rjVEn`79ulwov9%)AJz-%T>Qlv*lrU$6!`(!?B#MY*vHNaTu=4WN!LS qY4ed?%u-FfR_%+@KN{zB_W}wZwtJBnx$^`9KI+QaN~H?sFa8gscHzwc literal 86789 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::contactsPhotoCheckbox, std_::move(updateCallback), PaintUserpicCallback(peer))) +, name(st::boxWideWidth) { +} + ContactsInner::ContactsInner(CreatingGroupType creating) : TWidget() , _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) , _newItemHeight(creating == CreatingGroupNone ? st::contactsNewItemHeight : 0) @@ -71,7 +80,7 @@ ContactsInner::ContactsInner(ChatData *chat, MembersFilter membersFilter) : TWid , _chat(chat) , _membersFilter(membersFilter) , _allAdmins(this, lang(lng_chat_all_members_admins), !_chat->adminsEnabled(), st::contactsAdminCheckbox) -, _aboutWidth(st::boxWideWidth - st::contactsPadding.left() - st::contactsPadding.right() - st::contactsCheckPosition.x() * 2 - st::contactsCheckIcon.pxWidth()) +, _aboutWidth(st::boxWideWidth - st::contactsPadding.left() - st::contactsPadding.right()) , _aboutAllAdmins(st::boxTextFont, lang(lng_chat_about_all_admins), _defaultOptions, _aboutWidth) , _aboutAdmins(st::boxTextFont, lang(lng_chat_about_admins), _defaultOptions, _aboutWidth) , _customList((membersFilter == MembersFilterRecent) ? std_::unique_ptr() : std_::make_unique(Dialogs::SortMode::Add)) @@ -149,7 +158,7 @@ void ContactsInner::init() { } void ContactsInner::initList() { - if (!_chat || _membersFilter != MembersFilterAdmins) return; + if (!usingMultiSelect()) return; QList admins, others; admins.reserve(_chat->admins.size() + 1); @@ -370,41 +379,37 @@ ContactsInner::ContactData *ContactsInner::contactData(Dialogs::Row *row) { PeerData *peer = row->history()->peer; ContactsData::const_iterator i = _contactsData.constFind(peer); if (i == _contactsData.cend()) { - _contactsData.insert(peer, data = new ContactData()); + data = usingMultiSelect() ? new ContactData(peer, [this, peer] { updateRowWithPeer(peer); }) : new ContactData(); + _contactsData.insert(peer, data); if (peer->isUser()) { if (_chat) { if (_membersFilter == MembersFilterRecent) { - data->inchat = _chat->participants.contains(peer->asUser()); - } else { - data->inchat = false; + data->disabledChecked = _chat->participants.contains(peer->asUser()); } } else if (_creating == CreatingGroupGroup) { - data->inchat = (peerToUser(peer->id) == MTP::authedId()); + data->disabledChecked = (peerToUser(peer->id) == MTP::authedId()); } else if (_channel) { - data->inchat = (peerToUser(peer->id) == MTP::authedId()) || _already.contains(peer->asUser()); - } else { - data->inchat = false; + data->disabledChecked = (peerToUser(peer->id) == MTP::authedId()) || _already.contains(peer->asUser()); } - } else { - data->inchat = false; } - data->onlineColor = false; - data->check = _checkedContacts.contains(peer); + if (usingMultiSelect() && _checkedContacts.contains(peer)) { + data->checkbox->setChecked(true, Ui::RoundImageCheckbox::SetStyle::Fast); + } data->name.setText(st::contactsNameFont, peer->name, _textNameOptions); if (peer->isUser()) { - data->online = App::onlineText(peer->asUser(), _time); - data->onlineColor = App::onlineColorUse(peer->asUser(), _time); + data->statusText = App::onlineText(peer->asUser(), _time); + data->statusHasOnlineColor = App::onlineColorUse(peer->asUser(), _time); } else if (peer->isChat()) { ChatData *chat = peer->asChat(); if (!chat->amIn()) { - data->online = lang(lng_chat_status_unaccessible); + data->statusText = lang(lng_chat_status_unaccessible); } else { - data->online = lng_chat_status_members(lt_count, chat->count); + data->statusText = lng_chat_status_members(lt_count, chat->count); } } else if (peer->isMegagroup()) { - data->online = lang(lng_group_status); + data->statusText = lang(lng_group_status); } else if (peer->isChannel()) { - data->online = lang(lng_channel_status); + data->statusText = lang(lng_channel_status); } } else { data = i.value(); @@ -417,49 +422,58 @@ ContactsInner::ContactData *ContactsInner::contactData(Dialogs::Row *row) { void ContactsInner::paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel) { UserData *user = peer->asUser(); - bool inverse = data->inchat || data->check; if (_chat && _membersFilter == MembersFilterAdmins) { - inverse = false; if (_allAdmins.checked() || peer->id == peerFromUser(_chat->creator) || _saving) { sel = false; } } else { - if (data->inchat || data->check || selectedCount() >= Global::MegagroupSizeMax()) { + if (data->disabledChecked || selectedCount() >= Global::MegagroupSizeMax()) { sel = false; } } - p.fillRect(0, 0, width(), _rowHeight, inverse ? st::contactsBgActive : (sel ? st::contactsBgOver : st::white)); - p.setPen(inverse ? st::white : st::black); - peer->paintUserpicLeft(p, st::contactsPhotoSize, st::contactsPadding.left(), st::contactsPadding.top(), width()); - int32 namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); - int32 iconw = (_chat || _creating != CreatingGroupNone) ? (st::contactsCheckPosition.x() * 2 + st::contactsCheckIcon.pxWidth()) : 0; - int32 namew = width() - namex - st::contactsPadding.right() - iconw; + auto paintDisabledCheck = data->disabledChecked; + if (_chat && _membersFilter == MembersFilterAdmins) { + if (peer->id == peerFromUser(_chat->creator) || _allAdmins.checked()) { + paintDisabledCheck = true; + } + } + + auto checkedRatio = 0.; + p.fillRect(0, 0, width(), _rowHeight, sel ? st::contactsBgOver : st::white); + if (paintDisabledCheck) { + paintDisabledCheckUserpic(p, peer, st::contactsPadding.left(), st::contactsPadding.top(), width()); + } else if (usingMultiSelect()) { + checkedRatio = data->checkbox->checkedAnimationRatio(); + data->checkbox->paint(p, st::contactsPadding.left(), st::contactsPadding.top(), width()); + } else { + peer->paintUserpicLeft(p, st::contactsPhotoSize, st::contactsPadding.left(), st::contactsPadding.top(), width()); + } + + int namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); + int namew = width() - namex - st::contactsPadding.right(); if (peer->isVerified()) { auto icon = &st::dialogsVerifiedIcon; namew -= icon->width(); icon->paint(p, namex + qMin(data->name.maxWidth(), namew), st::contactsPadding.top() + st::contactsNameTop, width()); } + if (checkedRatio > 0) { + if (checkedRatio < 1) { + p.setPen(style::interpolate(st::black, st::contactsNameCheckedFg, checkedRatio)); + } else { + p.setPen(st::contactsNameCheckedFg); + } + } else { + p.setPen(st::black); + } data->name.drawLeftElided(p, namex, st::contactsPadding.top() + st::contactsNameTop, namew, width()); - if (_chat || (_creating != CreatingGroupNone && (!_channel || _membersFilter != MembersFilterAdmins))) { - if (_chat && _membersFilter == MembersFilterAdmins) { - if (sel || data->check || peer->id == peerFromUser(_chat->creator) || _allAdmins.checked()) { - if (!data->check || peer->id == peerFromUser(_chat->creator) || _allAdmins.checked()) p.setOpacity(0.5); - p.drawSpriteRight(st::contactsPadding.right() + st::contactsCheckPosition.x(), st::contactsPadding.top() + st::contactsCheckPosition.y(), width(), st::contactsCheckIcon); - if (!data->check || peer->id == peerFromUser(_chat->creator) || _allAdmins.checked()) p.setOpacity(1); - } - } else if (sel || data->check) { - p.drawSpriteRight(st::contactsPadding.right() + st::contactsCheckPosition.x(), st::contactsPadding.top() + st::contactsCheckPosition.y(), width(), (data->check ? st::contactsCheckActiveIcon : st::contactsCheckIcon)); - } - } - - bool uname = (user || peer->isChannel()) && (data->online.at(0) == '@'); + bool uname = (user || peer->isChannel()) && (data->statusText.at(0) == '@'); p.setFont(st::contactsStatusFont->f); - if (uname && !data->inchat && !data->check && !_lastQuery.isEmpty() && peer->userName().startsWith(_lastQuery, Qt::CaseInsensitive)) { - int32 availw = width() - namex - st::contactsPadding.right() - iconw; + if (uname && !_lastQuery.isEmpty() && peer->userName().startsWith(_lastQuery, Qt::CaseInsensitive)) { + int availw = width() - namex - st::contactsPadding.right(); QString first = '@' + peer->userName().mid(0, _lastQuery.size()), second = peer->userName().mid(_lastQuery.size()); - int32 w = st::contactsStatusFont->width(first); + int w = st::contactsStatusFont->width(first); if (w >= availw || second.isEmpty()) { p.setPen(st::contactsStatusFgOnline); p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsStatusTop, width(), st::contactsStatusFont->elided(first, availw)); @@ -472,24 +486,57 @@ void ContactsInner::paintDialog(Painter &p, PeerData *peer, ContactData *data, b p.drawTextLeft(namex + w, st::contactsPadding.top() + st::contactsStatusTop, width() + w, second); } } else { - if (inverse) { - p.setPen(st::white); - } else if ((user && (uname || data->onlineColor)) || (peer->isChannel() && uname)) { + if ((user && (uname || data->statusHasOnlineColor)) || (peer->isChannel() && uname)) { p.setPen(st::contactsStatusFgOnline); } else { p.setPen(sel ? st::contactsStatusFgOver : st::contactsStatusFg); } - p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsStatusTop, width(), data->online); + p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsStatusTop, width(), data->statusText); } } +// Emulates Ui::RoundImageCheckbox::paint() in a checked state. +void ContactsInner::paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, int y, int outerWidth) const { + auto userpicRadius = st::contactsPhotoCheckbox.imageSmallRadius; + auto userpicShift = st::contactsPhotoCheckbox.imageRadius - userpicRadius; + auto userpicDiameter = st::contactsPhotoCheckbox.imageRadius * 2; + auto userpicLeft = x + userpicShift; + auto userpicTop = y + userpicShift; + auto userpicEllipse = rtlrect(x, y, userpicDiameter, userpicDiameter, outerWidth); + auto userpicBorderPen = st::contactsPhotoDisabledCheckFg->p; + userpicBorderPen.setWidth(st::contactsPhotoCheckbox.selectWidth); + + auto iconDiameter = 2 * st::contactsPhotoCheckbox.checkRadius; + auto iconLeft = x + userpicDiameter + st::contactsPhotoCheckbox.selectWidth - iconDiameter; + auto iconTop = y + userpicDiameter + st::contactsPhotoCheckbox.selectWidth - iconDiameter; + auto iconEllipse = rtlrect(iconLeft, iconTop, iconDiameter, iconDiameter, outerWidth); + auto iconBorderPen = st::contactsPhotoCheckbox.checkBorder->p; + iconBorderPen.setWidth(st::contactsPhotoCheckbox.selectWidth); + + peer->paintUserpicLeft(p, userpicRadius * 2, userpicLeft, userpicTop, width()); + + p.setRenderHint(QPainter::HighQualityAntialiasing, true); + + p.setPen(userpicBorderPen); + p.setBrush(Qt::NoBrush); + p.drawEllipse(userpicEllipse); + + p.setPen(iconBorderPen); + p.setBrush(st::contactsPhotoDisabledCheckFg); + p.drawEllipse(iconEllipse); + + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + + st::contactsPhotoCheckbox.checkIcon.paint(p, iconEllipse.topLeft(), outerWidth); +} + void ContactsInner::paintEvent(QPaintEvent *e) { QRect r(e->rect()); Painter p(this); p.setClipRect(r); _time = unixtime(); - p.fillRect(r, st::white->b); + p.fillRect(r, st::white); int32 yFrom = r.y(), yTo = r.y() + r.height(); if (_filter.isEmpty()) { @@ -500,8 +547,7 @@ void ContactsInner::paintEvent(QPaintEvent *e) { p.fillRect(0, _newItemHeight - st::contactsPadding.bottom() - st::lineWidth, width(), st::lineWidth, st::shadowColor); p.setPen(st::black); p.drawTextLeft(st::contactsPadding.left(), st::contactsNewItemTop, width(), lang(lng_chat_all_members_admins)); - int32 iconw = st::contactsCheckPosition.x() * 2 + st::contactsCheckIcon.pxWidth(); - int32 aboutw = width() - st::contactsPadding.left() - st::contactsPadding.right() - iconw; + int aboutw = width() - st::contactsPadding.left() - st::contactsPadding.right(); (_allAdmins.checked() ? _aboutAllAdmins : _aboutAdmins).draw(p, st::contactsPadding.left(), st::contactsNewItemHeight + st::contactsAboutTop, aboutw); } else { p.fillRect(0, 0, width(), st::contactsNewItemHeight, (_newItemSel ? st::contactsBgOver : st::white)->b); @@ -556,8 +602,7 @@ void ContactsInner::paintEvent(QPaintEvent *e) { p.fillRect(0, _newItemHeight - st::contactsPadding.bottom() - st::lineWidth, width(), st::lineWidth, st::shadowColor); p.setPen(st::black); p.drawTextLeft(st::contactsPadding.left(), st::contactsNewItemTop, width(), lang(lng_chat_all_members_admins)); - int32 iconw = st::contactsCheckPosition.x() * 2 + st::contactsCheckIcon.pxWidth(); - int32 aboutw = width() - st::contactsPadding.left() - st::contactsPadding.right() - iconw; + int aboutw = width() - st::contactsPadding.left() - st::contactsPadding.right(); (_allAdmins.checked() ? _aboutAllAdmins : _aboutAdmins).draw(p, st::contactsPadding.left(), st::contactsNewItemHeight + st::contactsAboutTop, aboutw); p.translate(0, _newItemHeight); } else if (cContactsReceived() && !_searching) { @@ -618,27 +663,72 @@ void ContactsInner::enterEvent(QEvent *e) { setMouseTracking(true); } -void ContactsInner::updateSelectedRow() { +int ContactsInner::getSelectedRowTop() const { if (_filter.isEmpty()) { - if (_newItemSel) { - update(0, 0, width(), st::contactsNewItemHeight); - } if (_sel) { - update(0, _newItemHeight + _sel->pos() * _rowHeight, width(), _rowHeight); - } - if (_byUsernameSel >= 0) { - update(0, _newItemHeight + _contacts->size() * _rowHeight + st::searchedBarHeight + _byUsernameSel * _rowHeight, width(), _rowHeight); + return _newItemHeight + (_sel->pos() * _rowHeight); + } else if (_byUsernameSel >= 0) { + return _newItemHeight + (_contacts->size() * _rowHeight) + st::searchedBarHeight + (_byUsernameSel * _rowHeight); } } else { if (_filteredSel >= 0) { - update(0, _filteredSel * _rowHeight, width(), _rowHeight); + return (_filteredSel * _rowHeight); + } else if (_byUsernameSel >= 0) { + return (_filtered.size() * _rowHeight + st::searchedBarHeight + _byUsernameSel * _rowHeight); } - if (_byUsernameSel >= 0) { - update(0, _filtered.size() * _rowHeight + st::searchedBarHeight + _byUsernameSel * _rowHeight, width(), _rowHeight); + } + return -1; +} + +void ContactsInner::updateSelectedRow() { + if (_filter.isEmpty() && _newItemSel) { + update(0, 0, width(), st::contactsNewItemHeight); + } else { + auto rowTop = getSelectedRowTop(); + if (rowTop >= 0) { + updateRowWithTop(rowTop); } } } +void ContactsInner::updateRowWithTop(int rowTop) { + update(0, rowTop, width(), _rowHeight); +} + +int ContactsInner::getRowTopWithPeer(PeerData *peer) const { + if (_filter.isEmpty()) { + for (auto i = _contacts->cbegin(), end = _contacts->cend(); i != end; ++i) { + if ((*i)->history()->peer == peer) { + return _newItemHeight + ((*i)->pos() * _rowHeight); + } + } + for (auto i = 0, count = _byUsername.size(); i != count; ++i) { + if (_byUsername[i] == peer) { + return _newItemHeight + (_contacts->size() * _rowHeight) + st::searchedBarHeight + (i * _rowHeight); + } + } + } else { + for (auto i = 0, count = _filtered.size(); i != count; ++i) { + if (_filtered[i]->history()->peer == peer) { + return (i * _rowHeight); + } + } + for (auto i = 0, count = _byUsernameFiltered.size(); i != count; ++i) { + if (_byUsernameFiltered[i] == peer) { + return (_contacts->size() * _rowHeight) + st::searchedBarHeight + (i * _rowHeight); + } + } + } + return -1; +} + +void ContactsInner::updateRowWithPeer(PeerData *peer) { + auto rowTop = getRowTopWithPeer(peer); + if (rowTop >= 0) { + updateRowWithTop(rowTop); + } +} + void ContactsInner::leaveEvent(QEvent *e) { _mouseSel = false; setMouseTracking(false); @@ -668,19 +758,19 @@ void ContactsInner::mousePressEvent(QMouseEvent *e) { void ContactsInner::chooseParticipant() { if (_saving) return; bool addingAdmin = (_channel && _membersFilter == MembersFilterAdmins); - if (!addingAdmin && (_chat || _creating != CreatingGroupNone)) { + if (!addingAdmin && usingMultiSelect()) { _time = unixtime(); if (_filter.isEmpty()) { if (_byUsernameSel >= 0 && _byUsernameSel < _byUsername.size()) { - if (d_byUsername[_byUsernameSel]->inchat) return; + if (d_byUsername[_byUsernameSel]->disabledChecked) return; changeCheckState(d_byUsername[_byUsernameSel], _byUsername[_byUsernameSel]); } else { - if (!_sel || contactData(_sel)->inchat) return; + if (!_sel || contactData(_sel)->disabledChecked) return; changeCheckState(_sel); } } else { if (_byUsernameSel >= 0 && _byUsernameSel < _byUsernameFiltered.size()) { - if (d_byUsernameFiltered[_byUsernameSel]->inchat) return; + if (d_byUsernameFiltered[_byUsernameSel]->disabledChecked) return; changeCheckState(d_byUsernameFiltered[_byUsernameSel], _byUsernameFiltered[_byUsernameSel]); ContactData *moving = d_byUsernameFiltered[_byUsernameSel]; @@ -703,7 +793,7 @@ void ContactsInner::chooseParticipant() { } } } else { - if (_filteredSel < 0 || _filteredSel >= _filtered.size() || contactData(_filtered[_filteredSel])->inchat) return; + if (_filteredSel < 0 || _filteredSel >= _filtered.size() || contactData(_filtered[_filteredSel])->disabledChecked) return; changeCheckState(_filtered[_filteredSel]); } emit selectAllQuery(); @@ -770,13 +860,15 @@ void ContactsInner::changeCheckState(Dialogs::Row *row) { } void ContactsInner::changeCheckState(ContactData *data, PeerData *peer) { + t_assert(usingMultiSelect()); + int32 cnt = _selCount; - if (data->check) { - data->check = false; + if (data->checkbox->checked()) { + data->checkbox->setChecked(false); _checkedContacts.remove(peer); --_selCount; } else if (selectedCount() < ((_channel && _channel->isMegagroup()) ? Global::MegagroupSizeMax() : Global::ChatSizeMax())) { - data->check = true; + data->checkbox->setChecked(true); _checkedContacts.insert(peer, true); ++_selCount; } else if (_channel && !_channel->isMegagroup()) { @@ -933,14 +1025,14 @@ void ContactsInner::updateFilter(QString filter) { } _filteredSel = -1; if (!_filtered.isEmpty()) { - for (_filteredSel = 0; (_filteredSel < _filtered.size()) && contactData(_filtered[_filteredSel])->inchat;) { + for (_filteredSel = 0; (_filteredSel < _filtered.size()) && contactData(_filtered[_filteredSel])->disabledChecked;) { ++_filteredSel; } if (_filteredSel == _filtered.size()) _filteredSel = -1; } _byUsernameSel = -1; if (_filteredSel < 0 && !_byUsernameFiltered.isEmpty()) { - for (_byUsernameSel = 0; (_byUsernameSel < _byUsernameFiltered.size()) && d_byUsernameFiltered[_byUsernameSel]->inchat;) { + for (_byUsernameSel = 0; (_byUsernameSel < _byUsernameFiltered.size()) && d_byUsernameFiltered[_byUsernameSel]->disabledChecked;) { ++_byUsernameSel; } if (_byUsernameSel == _byUsernameFiltered.size()) _byUsernameSel = -1; @@ -993,20 +1085,20 @@ void ContactsInner::peopleReceived(const QString &query, const QVector _byUsernameFiltered.reserve(already + people.size()); d_byUsernameFiltered.reserve(already + people.size()); for (QVector::const_iterator i = people.cbegin(), e = people.cend(); i != e; ++i) { - PeerId peerId = peerFromMTP(*i); - int32 j = 0; + auto peerId = peerFromMTP(*i); + int j = 0; for (; j < already; ++j) { if (_byUsernameFiltered[j]->id == peerId) break; } if (j == already) { - PeerData *p = App::peer(peerId); - if (!p) continue; + auto peer = App::peer(peerId); + if (!peer) continue; if (_channel || _chat || _creating != CreatingGroupNone) { - if (p->isUser()) { - if (p->asUser()->botInfo) { + if (peer->isUser()) { + if (peer->asUser()->botInfo) { if (_chat || _creating == CreatingGroupGroup) { // skip bot's that can't be invited to groups - if (p->asUser()->botInfo->cantJoinGroups) continue; + if (peer->asUser()->botInfo->cantJoinGroups) continue; } if (_channel) { if (!_channel->isMegagroup() && _membersFilter != MembersFilterAdmins) continue; @@ -1016,25 +1108,27 @@ void ContactsInner::peopleReceived(const QString &query, const QVector continue; // skip } } else if (sharingBotGame()) { - if (!p->canWrite()) { + if (!peer->canWrite()) { continue; } - if (auto channel = p->asChannel()) { + if (auto channel = peer->asChannel()) { if (channel->isBroadcast()) { continue; } } } - ContactData *d = new ContactData(); - _byUsernameDatas.push_back(d); - d->inchat = _chat ? _chat->participants.contains(p->asUser()) : ((_creating == CreatingGroupGroup || _channel) ? (p == App::self()) : false); - d->check = _checkedContacts.contains(p); - d->name.setText(st::contactsNameFont, p->name, _textNameOptions); - d->online = '@' + p->userName(); + auto data = usingMultiSelect() ? new ContactData(peer, [this, peer] { updateRowWithPeer(peer); }) : new ContactData(); + _byUsernameDatas.push_back(data); + data->disabledChecked = _chat ? _chat->participants.contains(peer->asUser()) : ((_creating == CreatingGroupGroup || _channel) ? (peer == App::self()) : false); + if (usingMultiSelect() && _checkedContacts.contains(peer)) { + data->checkbox->setChecked(true, Ui::RoundImageCheckbox::SetStyle::Fast); + } + data->name.setText(st::contactsNameFont, peer->name, _textNameOptions); + data->statusText = '@' + peer->userName(); - _byUsernameFiltered.push_back(p); - d_byUsernameFiltered.push_back(d); + _byUsernameFiltered.push_back(peer); + d_byUsernameFiltered.push_back(data); } } _searching = false; @@ -1160,33 +1254,33 @@ void ContactsInner::selectSkip(int32 dir) { _byUsernameSel = -1; } if (dir > 0) { - for (auto i = _contacts->cfind(_sel), end = _contacts->cend(); i != end && contactData(*i)->inchat; ++i) { + for (auto i = _contacts->cfind(_sel), end = _contacts->cend(); i != end && contactData(*i)->disabledChecked; ++i) { _sel = *i; } - if (_sel && contactData(_sel)->inchat) { + if (_sel && contactData(_sel)->disabledChecked) { _sel = nullptr; } if (!_sel) { if (!_byUsername.isEmpty()) { if (_byUsernameSel < 0) _byUsernameSel = 0; - for (; _byUsernameSel < _byUsername.size() && d_byUsername[_byUsernameSel]->inchat;) { + for (; _byUsernameSel < _byUsername.size() && d_byUsername[_byUsernameSel]->disabledChecked;) { ++_byUsernameSel; } if (_byUsernameSel == _byUsername.size()) _byUsernameSel = -1; } } } else { - while (_byUsernameSel >= 0 && d_byUsername[_byUsernameSel]->inchat) { + while (_byUsernameSel >= 0 && d_byUsername[_byUsernameSel]->disabledChecked) { --_byUsernameSel; } if (_byUsernameSel < 0) { if (!_contacts->isEmpty()) { if (!_newItemSel && !_sel) _sel = *(_contacts->cend() - 1); if (_sel) { - for (auto i = _contacts->cfind(_sel), b = _contacts->cbegin(); i != b && contactData(*i)->inchat; --i) { + for (auto i = _contacts->cfind(_sel), b = _contacts->cbegin(); i != b && contactData(*i)->disabledChecked; --i) { _sel = *i; } - if (contactData(_sel)->inchat) { + if (contactData(_sel)->disabledChecked) { _sel = nullptr; } } @@ -1215,27 +1309,27 @@ void ContactsInner::selectSkip(int32 dir) { _byUsernameSel = -1; } if (dir > 0) { - while (_filteredSel >= 0 && _filteredSel < _filtered.size() && contactData(_filtered[_filteredSel])->inchat) { + while (_filteredSel >= 0 && _filteredSel < _filtered.size() && contactData(_filtered[_filteredSel])->disabledChecked) { ++_filteredSel; } if (_filteredSel < 0 || _filteredSel >= _filtered.size()) { _filteredSel = -1; if (!_byUsernameFiltered.isEmpty()) { if (_byUsernameSel < 0) _byUsernameSel = 0; - for (; _byUsernameSel < _byUsernameFiltered.size() && d_byUsernameFiltered[_byUsernameSel]->inchat;) { + for (; _byUsernameSel < _byUsernameFiltered.size() && d_byUsernameFiltered[_byUsernameSel]->disabledChecked;) { ++_byUsernameSel; } if (_byUsernameSel == _byUsernameFiltered.size()) _byUsernameSel = -1; } } } else { - while (_byUsernameSel >= 0 && d_byUsernameFiltered[_byUsernameSel]->inchat) { + while (_byUsernameSel >= 0 && d_byUsernameFiltered[_byUsernameSel]->disabledChecked) { --_byUsernameSel; } if (_byUsernameSel < 0) { if (!_filtered.isEmpty()) { if (_filteredSel < 0) _filteredSel = _filtered.size() - 1; - for (; _filteredSel >= 0 && contactData(_filtered[_filteredSel])->inchat;) { + for (; _filteredSel >= 0 && contactData(_filtered[_filteredSel])->disabledChecked;) { --_filteredSel; } } @@ -1259,6 +1353,10 @@ void ContactsInner::selectSkipPage(int32 h, int32 dir) { QVector ContactsInner::selected() { QVector result; + if (!usingMultiSelect()) { + return result; + } + for_const (auto row, *_contacts) { if (_checkedContacts.contains(row->history()->peer)) { contactData(row); // fill _contactsData @@ -1266,12 +1364,12 @@ QVector ContactsInner::selected() { } result.reserve(_contactsData.size()); for (ContactsData::const_iterator i = _contactsData.cbegin(), e = _contactsData.cend(); i != e; ++i) { - if (i.value()->check && i.key()->isUser()) { + if (i.value()->checkbox->checked() && i.key()->isUser()) { result.push_back(i.key()->asUser()); } } for (int32 i = 0, l = _byUsername.size(); i < l; ++i) { - if (d_byUsername[i]->check && _byUsername[i]->isUser()) { + if (d_byUsername[i]->checkbox->checked() && _byUsername[i]->isUser()) { result.push_back(_byUsername[i]->asUser()); } } @@ -1280,6 +1378,10 @@ QVector ContactsInner::selected() { QVector ContactsInner::selectedInputs() { QVector result; + if (!usingMultiSelect()) { + return result; + } + for_const (auto row, *_contacts) { if (_checkedContacts.contains(row->history()->peer)) { contactData(row); // fill _contactsData @@ -1287,46 +1389,25 @@ QVector ContactsInner::selectedInputs() { } result.reserve(_contactsData.size()); for (ContactsData::const_iterator i = _contactsData.cbegin(), e = _contactsData.cend(); i != e; ++i) { - if (i.value()->check && i.key()->isUser()) { + if (i.value()->checkbox->checked() && i.key()->isUser()) { result.push_back(i.key()->asUser()->inputUser); } } for (int32 i = 0, l = _byUsername.size(); i < l; ++i) { - if (d_byUsername[i]->check && _byUsername[i]->isUser()) { + if (d_byUsername[i]->checkbox->checked() && _byUsername[i]->isUser()) { result.push_back(_byUsername[i]->asUser()->inputUser); } } return result; } -PeerData *ContactsInner::selectedUser() { - for_const (auto row, *_contacts) { - if (_checkedContacts.contains(row->history()->peer)) { - contactData(row); // fill _contactsData - } - } - for (ContactsData::const_iterator i = _contactsData.cbegin(), e = _contactsData.cend(); i != e; ++i) { - if (i.value()->check) { - return i.key(); - } - } - for (int32 i = 0, l = _byUsername.size(); i < l; ++i) { - if (d_byUsername[i]->check) { - return _byUsername[i]; - } - } - return 0; -} - ContactsBox::ContactsBox() : ItemListBox(st::contactsScroll) , _inner(CreatingGroupNone) , _filter(this, st::boxSearchField, lang(lng_participant_filter)) , _filterCancel(this, st::boxSearchCancel) , _next(this, lang(lng_create_group_next), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) -, _bottomShadow(0) -, _saveRequestId(0) { +, _topShadow(this) { init(); } @@ -1337,8 +1418,6 @@ ContactsBox::ContactsBox(const QString &name, const QImage &photo) : ItemListBox , _next(this, lang(lng_create_group_create), st::defaultBoxButton) , _cancel(this, lang(lng_create_group_back), st::cancelBoxButton) , _topShadow(this) -, _bottomShadow(0) -, _saveRequestId(0) , _creationName(name) , _creationPhoto(photo) { init(); @@ -1350,9 +1429,7 @@ ContactsBox::ContactsBox(ChannelData *channel) : ItemListBox(st::boxScroll) , _filterCancel(this, st::boxSearchCancel) , _next(this, lang(lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_create_group_skip), st::cancelBoxButton) -, _topShadow(this) -, _bottomShadow(0) -, _saveRequestId(0) { +, _topShadow(this) { init(); } @@ -1362,9 +1439,7 @@ ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const Membe , _filterCancel(this, st::boxSearchCancel) , _next(this, lang(lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) -, _bottomShadow(0) -, _saveRequestId(0) { +, _topShadow(this) { init(); } @@ -1374,9 +1449,7 @@ ContactsBox::ContactsBox(ChatData *chat, MembersFilter filter) : ItemListBox(st: , _filterCancel(this, st::boxSearchCancel) , _next(this, lang((filter == MembersFilterAdmins) ? lng_settings_save : lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) -, _bottomShadow(0) -, _saveRequestId(0) { +, _topShadow(this) { init(); } @@ -1386,9 +1459,7 @@ ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) , _filterCancel(this, st::boxSearchCancel) , _next(this, lang(lng_create_group_next), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) -, _bottomShadow(0) -, _saveRequestId(0) { +, _topShadow(this) { init(); } diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 646421224..6f81ccf4e 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -22,6 +22,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "abstractbox.h" #include "core/single_timer.h" +#include "ui/effects/round_image_checkbox.h" namespace Dialogs { class Row; @@ -51,7 +52,6 @@ public: void init(); void initList(); - void paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel); void updateFilter(QString filter = QString()); void selectSkip(int32 dir); @@ -59,7 +59,6 @@ public: QVector selected(); QVector selectedInputs(); - PeerData *selectedUser(); bool allAdmins() const { return _allAdmins.checked(); } @@ -120,13 +119,24 @@ protected: void resizeEvent(QResizeEvent *e) override; private: + void updateRowWithTop(int rowTop); + int getSelectedRowTop() const; void updateSelectedRow(); + int getRowTopWithPeer(PeerData *peer) const; + void updateRowWithPeer(PeerData *peer); void addAdminDone(const MTPUpdates &result, mtpRequestId req); bool addAdminFail(const RPCError &error, mtpRequestId req); + void paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel); + void paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, int y, int outerWidth) const; + template void addDialogsToList(FilterCallback callback); + bool usingMultiSelect() const { + return (_chat != nullptr) || (_creating != CreatingGroupNone && (!_channel || _membersFilter != MembersFilterAdmins)); + } + int32 _rowHeight; int _newItemHeight = 0; bool _newItemSel = false; @@ -161,11 +171,14 @@ private: int _selCount = 0; struct ContactData { + ContactData(); + ContactData(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback); + + std_::unique_ptr checkbox; Text name; - QString online; - bool onlineColor; - bool inchat; - bool check; + QString statusText; + bool statusHasOnlineColor = false; + bool disabledChecked = false; }; typedef QMap ContactsData; ContactsData _contactsData; @@ -239,7 +252,8 @@ private: BoxButton _next, _cancel; MembersFilter _membersFilter; - ScrollableBoxShadow _topShadow, *_bottomShadow; + ScrollableBoxShadow _topShadow; + ScrollableBoxShadow *_bottomShadow = nullptr; void peopleReceived(const MTPcontacts_Found &result, mtpRequestId req); bool peopleFailed(const RPCError &error, mtpRequestId req); @@ -255,7 +269,7 @@ private: typedef QMap PeopleQueries; PeopleQueries _peopleQueries; - int32 _saveRequestId; + mtpRequestId _saveRequestId = 0; // saving admins void saveAdminsDone(const MTPUpdates &result); @@ -419,3 +433,9 @@ private: SingleTimer _loadTimer; }; + +inline Ui::RoundImageCheckbox::PaintRoundImage PaintUserpicCallback(PeerData *peer) { + return [peer](Painter &p, int x, int y, int outerWidth, int size) { + peer->paintUserpicLeft(p, size, x, y, outerWidth); + }; +} diff --git a/Telegram/SourceFiles/boxes/sharebox.cpp b/Telegram/SourceFiles/boxes/sharebox.cpp index bdecfb495..15185e72f 100644 --- a/Telegram/SourceFiles/boxes/sharebox.cpp +++ b/Telegram/SourceFiles/boxes/sharebox.cpp @@ -33,16 +33,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "apiwrap.h" #include "ui/toast/toast.h" #include "history/history_media_types.h" - -namespace { - -Ui::RoundImageCheckbox::PaintRoundImage paintUserpicCallback(PeerData *peer) { - return [peer](Painter &p, int x, int y, int outerWidth, int size) { - peer->paintUserpicLeft(p, size, x, y, outerWidth); - }; -} - -} // namespace +#include "boxes/contactsbox.h" ShareBox::ShareBox(CopyCallback &©Callback, SubmitCallback &&submitCallback, FilterCallback &&filterCallback) : ItemListBox(st::boxScroll) , _copyCallback(std_::move(copyCallback)) @@ -485,7 +476,7 @@ void ShareInner::paintChat(Painter &p, Chat *chat, int index) { ShareInner::Chat::Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) : peer(peer) -, checkbox(st::sharePhotoCheckbox, std_::move(updateCallback), paintUserpicCallback(peer)) +, checkbox(st::sharePhotoCheckbox, std_::move(updateCallback), PaintUserpicCallback(peer)) , name(st::sharePhotoCheckbox.imageRadius * 2) { } @@ -604,14 +595,14 @@ void ShareInner::changeCheckState(Chat *chat) { row = _chatsIndexed->addToEnd(App::history(chat->peer)).value(0); } chat = getChat(row); - if (!chat->checkbox.selected()) { + if (!chat->checkbox.checked()) { _chatsIndexed->moveToTop(chat->peer); } emit filterCancel(); } - chat->checkbox.toggleSelected(); - if (chat->checkbox.selected()) { + chat->checkbox.setChecked(!chat->checkbox.checked()); + if (chat->checkbox.checked()) { _selected.insert(chat->peer); setActive(chatIndex(chat->peer)); } else { @@ -754,7 +745,7 @@ QVector ShareInner::selected() const { QVector result; result.reserve(_dataMap.size()); for_const (auto chat, _dataMap) { - if (chat->checkbox.selected()) { + if (chat->checkbox.checked()) { result.push_back(chat->peer); } } diff --git a/Telegram/SourceFiles/boxes/sharebox.h b/Telegram/SourceFiles/boxes/sharebox.h index 245285cdf..a463597b3 100644 --- a/Telegram/SourceFiles/boxes/sharebox.h +++ b/Telegram/SourceFiles/boxes/sharebox.h @@ -152,7 +152,6 @@ private: int displayedChatsCount() const; - static constexpr int kWideCacheScale = Ui::kWideRoundImageCheckboxScale; struct Chat { Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback); diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp index 000376c63..fbe75582d 100644 --- a/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp @@ -24,10 +24,12 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org namespace Ui { namespace { +static constexpr int kWideScale = 4; + void prepareCheckCaches(const style::RoundImageCheckbox *st, QPixmap &checkBgCache, QPixmap &checkFullCache) { auto size = st->checkRadius * 2; - auto wideSize = size * kWideRoundImageCheckboxScale; - QImage cache(wideSize * cIntRetinaFactor(), wideSize * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); + auto wideSize = size * kWideScale; + auto cache = QImage(wideSize * cIntRetinaFactor(), wideSize * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); cache.setDevicePixelRatio(cRetinaFactor()); { Painter p(&cache); @@ -42,7 +44,7 @@ void prepareCheckCaches(const style::RoundImageCheckbox *st, QPixmap &checkBgCac auto ellipse = QRect((wideSize - size) / 2, (wideSize - size) / 2, size, size); p.drawEllipse(ellipse); } - QImage cacheIcon = cache; + auto cacheIcon = cache; { Painter p(&cacheIcon); auto ellipse = QRect((wideSize - size) / 2, (wideSize - size) / 2, size, size); @@ -80,13 +82,13 @@ RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, Upda } void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { - auto selectionLevel = _selection.current(_selected ? 1. : 0.); + auto selectionLevel = _selection.current(_checked ? 1. : 0.); if (_selection.animating()) { p.setRenderHint(QPainter::SmoothPixmapTransform, true); - auto userpicRadius = qRound(kWideRoundImageCheckboxScale * (_st.imageRadius + (_st.imageSmallRadius - _st.imageRadius) * selectionLevel)); - auto userpicShift = kWideRoundImageCheckboxScale * _st.imageRadius - userpicRadius; - auto userpicLeft = x - (kWideRoundImageCheckboxScale - 1) * _st.imageRadius + userpicShift; - auto userpicTop = y - (kWideRoundImageCheckboxScale - 1) * _st.imageRadius + userpicShift; + auto userpicRadius = qRound(kWideScale * (_st.imageRadius + (_st.imageSmallRadius - _st.imageRadius) * selectionLevel)); + auto userpicShift = kWideScale * _st.imageRadius - userpicRadius; + auto userpicLeft = x - (kWideScale - 1) * _st.imageRadius + userpicShift; + auto userpicTop = y - (kWideScale - 1) * _st.imageRadius + userpicShift; auto to = QRect(userpicLeft, userpicTop, userpicRadius * 2, userpicRadius * 2); auto from = QRect(QPoint(0, 0), _wideCache.size()); p.drawPixmapLeft(to, outerWidth, _wideCache, from); @@ -95,7 +97,7 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { if (!_wideCache.isNull()) { _wideCache = QPixmap(); } - auto userpicRadius = _selected ? _st.imageSmallRadius : _st.imageRadius; + auto userpicRadius = _checked ? _st.imageSmallRadius : _st.imageRadius; auto userpicShift = _st.imageRadius - userpicRadius; auto userpicLeft = x + userpicShift; auto userpicTop = y + userpicShift; @@ -106,7 +108,7 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { p.setRenderHint(QPainter::HighQualityAntialiasing, true); p.setOpacity(snap(selectionLevel, 0., 1.)); p.setBrush(Qt::NoBrush); - QPen pen = _st.selectFg; + auto pen = _st.selectFg->p; pen.setWidth(_st.selectWidth); p.setPen(pen); p.drawEllipse(rtlrect(x, y, _st.imageRadius * 2, _st.imageRadius * 2, outerWidth)); @@ -119,10 +121,10 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { for (auto &icon : _icons) { auto fadeIn = icon.fadeIn.current(1.); auto fadeOut = icon.fadeOut.current(1.); - auto iconRadius = qRound(kWideRoundImageCheckboxScale * (_st.checkSmallRadius + fadeOut * (_st.checkRadius - _st.checkSmallRadius))); - auto iconShift = kWideRoundImageCheckboxScale * _st.checkRadius - iconRadius; - auto iconLeft = x + 2 * _st.imageRadius + _st.selectWidth - 2 * _st.checkRadius - (kWideRoundImageCheckboxScale - 1) * _st.checkRadius + iconShift; - auto iconTop = y + 2 * _st.imageRadius + _st.selectWidth - 2 * _st.checkRadius - (kWideRoundImageCheckboxScale - 1) * _st.checkRadius + iconShift; + auto iconRadius = qRound(kWideScale * (_st.checkSmallRadius + fadeOut * (_st.checkRadius - _st.checkSmallRadius))); + auto iconShift = kWideScale * _st.checkRadius - iconRadius; + auto iconLeft = x + 2 * _st.imageRadius + _st.selectWidth - 2 * _st.checkRadius - (kWideScale - 1) * _st.checkRadius + iconShift; + auto iconTop = y + 2 * _st.imageRadius + _st.selectWidth - 2 * _st.checkRadius - (kWideScale - 1) * _st.checkRadius + iconShift; auto to = QRect(iconLeft, iconTop, iconRadius * 2, iconRadius * 2); auto from = QRect(QPoint(0, 0), _wideCheckFullCache.size()); auto opacity = fadeIn * fadeOut; @@ -130,7 +132,7 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { if (fadeOut < 1.) { p.drawPixmapLeft(to, outerWidth, icon.wideCheckCache, from); } else { - auto divider = qRound((kWideRoundImageCheckboxScale - 2) * _st.checkRadius + fadeIn * 3 * _st.checkRadius); + auto divider = qRound((kWideScale - 2) * _st.checkRadius + fadeIn * 3 * _st.checkRadius); p.drawPixmapLeft(QRect(iconLeft, iconTop, divider, iconRadius * 2), outerWidth, _wideCheckFullCache, QRect(0, 0, divider * cIntRetinaFactor(), _wideCheckFullCache.height())); p.drawPixmapLeft(QRect(iconLeft + divider, iconTop, iconRadius * 2 - divider, iconRadius * 2), outerWidth, _wideCheckBgCache, QRect(divider * cIntRetinaFactor(), 0, _wideCheckBgCache.width() - divider * cIntRetinaFactor(), _wideCheckBgCache.height())); } @@ -139,25 +141,50 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { p.setOpacity(1.); } -void RoundImageCheckbox::toggleSelected() { - _selected = !_selected; - if (_selected) { +float64 RoundImageCheckbox::checkedAnimationRatio() const { + return snap(_selection.current(_checked ? 1. : 0.), 0., 1.); +} + +void RoundImageCheckbox::setChecked(bool checked, SetStyle speed) { + if (_checked == checked) { + if (speed != SetStyle::Animated) { + if (!_icons.isEmpty()) { + _icons.back().fadeIn.finish(); + _icons.back().fadeOut.finish(); + } + _selection.finish(); + } + return; + } + _checked = checked; + if (_checked) { _icons.push_back(Icon()); _icons.back().fadeIn.start(UpdateCallback(_updateCallback), 0, 1, _st.selectDuration); + if (speed != SetStyle::Animated) { + _icons.back().fadeIn.finish(); + } } else { - prepareWideCheckIconCache(&_icons.back()); _icons.back().fadeOut.start([this] { _updateCallback(); removeFadeOutedIcons(); // this call can destroy current lambda }, 1, 0, _st.selectDuration); + if (speed == SetStyle::Animated) { + prepareWideCheckIconCache(&_icons.back()); + } else { + _icons.back().fadeOut.finish(); + } + } + if (speed == SetStyle::Animated) { + prepareWideCache(); + _selection.start(UpdateCallback(_updateCallback), _checked ? 0 : 1, _checked ? 1 : 0, _st.selectDuration, anim_bumpy<125>); + } else { + _selection.finish(); } - prepareWideCache(); - _selection.start(UpdateCallback(_updateCallback), _selected ? 0 : 1, _selected ? 1 : 0, _st.selectDuration, anim_bumpy<125>); } void RoundImageCheckbox::removeFadeOutedIcons() { while (!_icons.empty() && !_icons.front().fadeIn.animating() && !_icons.front().fadeOut.animating()) { - if (_icons.size() > 1 || !_selected) { + if (_icons.size() > 1 || !_checked) { _icons.erase(_icons.begin()); } else { break; @@ -168,7 +195,7 @@ void RoundImageCheckbox::removeFadeOutedIcons() { void RoundImageCheckbox::prepareWideCache() { if (_wideCache.isNull()) { auto size = _st.imageRadius * 2; - auto wideSize = size * kWideRoundImageCheckboxScale; + auto wideSize = size * kWideScale; QImage cache(wideSize * cIntRetinaFactor(), wideSize * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); cache.setDevicePixelRatio(cRetinaFactor()); { @@ -190,8 +217,8 @@ void RoundImageCheckbox::prepareWideCheckIconCache(Icon *icon) { { Painter p(&wideCache); p.setCompositionMode(QPainter::CompositionMode_Source); - auto iconRadius = kWideRoundImageCheckboxScale * _st.checkRadius; - auto divider = qRound((kWideRoundImageCheckboxScale - 2) * _st.checkRadius + icon->fadeIn.current(1.) * (kWideRoundImageCheckboxScale - 1) * _st.checkRadius); + auto iconRadius = kWideScale * _st.checkRadius; + auto divider = qRound((kWideScale - 2) * _st.checkRadius + icon->fadeIn.current(1.) * (kWideScale - 1) * _st.checkRadius); p.drawPixmapLeft(QRect(0, 0, divider, iconRadius * 2), cacheWidth, _wideCheckFullCache, QRect(0, 0, divider * cIntRetinaFactor(), _wideCheckFullCache.height())); p.drawPixmapLeft(QRect(divider, 0, iconRadius * 2 - divider, iconRadius * 2), cacheWidth, _wideCheckBgCache, QRect(divider * cIntRetinaFactor(), 0, _wideCheckBgCache.width() - divider * cIntRetinaFactor(), _wideCheckBgCache.height())); } diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.h b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h index 3d4c5955e..972143625 100644 --- a/Telegram/SourceFiles/ui/effects/round_image_checkbox.h +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h @@ -24,7 +24,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org namespace Ui { -static constexpr int kWideRoundImageCheckboxScale = 4; class RoundImageCheckbox { public: using PaintRoundImage = base::lambda_unique; @@ -32,11 +31,16 @@ public: RoundImageCheckbox(const style::RoundImageCheckbox &st, UpdateCallback &&updateCallback, PaintRoundImage &&paintRoundImage); void paint(Painter &p, int x, int y, int outerWidth); + float64 checkedAnimationRatio() const; - void toggleSelected(); - bool selected() const { - return _selected; + bool checked() const { + return _checked; } + enum class SetStyle { + Animated, + Fast, + }; + void setChecked(bool checked, SetStyle speed = SetStyle::Animated); private: struct Icon { @@ -52,7 +56,7 @@ private: UpdateCallback _updateCallback; PaintRoundImage _paintRoundImage; - bool _selected = false; + bool _checked = false; QPixmap _wideCache; FloatAnimation _selection; std_::vector_of_moveable _icons; From e5a5273b3a9f46db38824b6d8b01fac08a0b4992 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 20 Oct 2016 19:32:15 +0300 Subject: [PATCH 03/10] Scrollable boxes reorganized: _scroll always owns _inner. Also some boxes moved to separate modules: MembersBox, StickersBox. --- Telegram/Resources/art/sprite.png | Bin 40270 -> 40118 bytes Telegram/Resources/art/sprite_200x.png | Bin 85777 -> 85439 bytes Telegram/Resources/basic.style | 42 - .../Resources/icons/box_search_cancel.png | Bin 0 -> 187 bytes .../Resources/icons/box_search_cancel@2x.png | Bin 0 -> 296 bytes Telegram/SourceFiles/boxes/abstractbox.cpp | 10 +- Telegram/SourceFiles/boxes/abstractbox.h | 3 +- Telegram/SourceFiles/boxes/backgroundbox.cpp | 78 +- Telegram/SourceFiles/boxes/backgroundbox.h | 40 +- Telegram/SourceFiles/boxes/boxes.style | 32 + Telegram/SourceFiles/boxes/contactsbox.cpp | 1656 ++++++----------- Telegram/SourceFiles/boxes/contactsbox.h | 417 ++--- Telegram/SourceFiles/boxes/members_box.cpp | 607 ++++++ Telegram/SourceFiles/boxes/members_box.h | 178 ++ Telegram/SourceFiles/boxes/sessionsbox.cpp | 398 ++-- Telegram/SourceFiles/boxes/sessionsbox.h | 100 +- Telegram/SourceFiles/boxes/sharebox.cpp | 71 +- Telegram/SourceFiles/boxes/sharebox.h | 24 +- Telegram/SourceFiles/boxes/stickers_box.cpp | 1254 +++++++++++++ Telegram/SourceFiles/boxes/stickers_box.h | 239 +++ Telegram/SourceFiles/boxes/stickersetbox.cpp | 1500 ++------------- Telegram/SourceFiles/boxes/stickersetbox.h | 293 +-- .../SourceFiles/codegen/style/parsed_file.cpp | 2 +- .../SourceFiles/profile/profile_cover.cpp | 4 +- .../profile/profile_members_widget.cpp | 4 +- .../profile/profile_settings_widget.cpp | 4 +- .../settings_chat_settings_widget.cpp | 2 +- Telegram/SourceFiles/stickers/emoji_pan.cpp | 1 + Telegram/SourceFiles/stickers/stickers.cpp | 2 +- Telegram/SourceFiles/ui/countryinput.cpp | 190 +- Telegram/SourceFiles/ui/countryinput.h | 77 +- .../SourceFiles/ui/widgets/filled_slider.h | 5 +- .../SourceFiles/ui/widgets/media_slider.h | 5 +- Telegram/gyp/Telegram.gyp | 4 + 34 files changed, 3676 insertions(+), 3566 deletions(-) create mode 100644 Telegram/Resources/icons/box_search_cancel.png create mode 100644 Telegram/Resources/icons/box_search_cancel@2x.png create mode 100644 Telegram/SourceFiles/boxes/members_box.cpp create mode 100644 Telegram/SourceFiles/boxes/members_box.h create mode 100644 Telegram/SourceFiles/boxes/stickers_box.cpp create mode 100644 Telegram/SourceFiles/boxes/stickers_box.h diff --git a/Telegram/Resources/art/sprite.png b/Telegram/Resources/art/sprite.png index c51595ddf239d09e8ef602dda9247a3f7a35d9ca..fb2205f25c5e60782bde38a2360e85983c42e40b 100644 GIT binary patch literal 40118 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 Set~^AqSmHr9}Eyvxw#x@a^%2qd#7i= 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 Iy4{oi2YD1u`v3p{ delta 66201 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 Y!$SyZ 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 diff --git a/Telegram/Resources/basic.style b/Telegram/Resources/basic.style index 7e75dd058..f2c34e362 100644 --- a/Telegram/Resources/basic.style +++ b/Telegram/Resources/basic.style @@ -343,48 +343,6 @@ boxScroll: flatScroll(solidScroll) { boxScrollSkip: 6px; boxScrollShadowBg: #00000012; -boxSearchField: InputField(defaultInputField) { - textMargins: margins(41px, 16px, 41px, 0px); - - placeholderFg: #999; - placeholderFgActive: #aaa; - placeholderMargins: margins(4px, 0px, 4px, 0px); - - border: 0px; - borderActive: 0px; - borderError: 0px; - - height: 48px; - - iconSprite: sprite(227px, 21px, 24px, 24px); - iconPosition: point(15px, 14px); - - font: normalFont; -} -boxSearchCancel: iconedButton { - color: white; - bgColor: white; - overBgColor: white; - font: font(fsize); - - opacity: 0.3; - overOpacity: 0.4; - - textPos: point(0px, 0px); - downTextPos: point(0px, 0px); - - duration: 150; - cursor: cursor(pointer); - - icon: sprite(133px, 108px, 12px, 12px); - iconPos: point(8px, 18px); - downIcon: sprite(133px, 108px, 12px, 12px); - downIconPos: point(8px, 18px); - - width: 41px; - height: 48px; -} - titleBg: #6389a8; titleHeight: 39px; titleIconPos: point(7px, 7px); diff --git a/Telegram/Resources/icons/box_search_cancel.png b/Telegram/Resources/icons/box_search_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa112a33b2e9cef41f273abc62eb07b4a1839b4 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a)4CQlc~5RHkYlP+?y8gj5qzuvy= zzucZ6AMIlK<9me-ofKa1om^E^uEb>Qe5vA0Psf3~7fWLqQl4?ll$^=w;G$5T{@&Ip zbk5B4+>>T3X#T+%w}OlB5&w$|j%WN;8NNysPd-?ce|Proi?)9k#;vHATWGZ-Z-cX7 m-C&U>J17(8A5T-G@yGywp}X-3=t literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/box_search_cancel@2x.png b/Telegram/Resources/icons/box_search_cancel@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..40d3def3d2c56edb57dc818be15c1add75a32652 GIT binary patch literal 296 zcmV+@0oVSCP)CU0sydW8>EyV#t0+joP&9uVc+-f zo-niILPYsU&C5CWy6=MV< us`fKmy!Tx`KwVn9@0000setWidget(inner); - _scroll->setFocusPolicy(Qt::NoFocus); - ScrollableBox::resizeEvent(nullptr); -} - -void ScrollableBox::initOwned(QWidget *inner, int bottomSkip, int topSkip) { +void ScrollableBox::init(ScrolledWidget *inner, int bottomSkip, int topSkip) { _bottomSkip = bottomSkip; _topSkip = topSkip; _scroll->setOwnedWidget(inner); diff --git a/Telegram/SourceFiles/boxes/abstractbox.h b/Telegram/SourceFiles/boxes/abstractbox.h index c8a7a7f2f..7368bcbc2 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.h +++ b/Telegram/SourceFiles/boxes/abstractbox.h @@ -105,8 +105,7 @@ public: ScrollableBox(const style::flatScroll &scroll, int w = st::boxWideWidth); protected: - void init(QWidget *inner, int bottomSkip = st::boxScrollSkip, int topSkip = st::boxTitleHeight); - void initOwned(QWidget *inner, int bottomSkip = st::boxScrollSkip, int topSkip = st::boxTitleHeight); + void init(ScrolledWidget *inner, int bottomSkip = st::boxScrollSkip, int topSkip = st::boxTitleHeight); void resizeEvent(QResizeEvent *e) override; diff --git a/Telegram/SourceFiles/boxes/backgroundbox.cpp b/Telegram/SourceFiles/boxes/backgroundbox.cpp index 9f2700dea..181ff3d49 100644 --- a/Telegram/SourceFiles/boxes/backgroundbox.cpp +++ b/Telegram/SourceFiles/boxes/backgroundbox.cpp @@ -27,11 +27,41 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "window/chat_background.h" #include "styles/style_overview.h" -BackgroundInner::BackgroundInner() : -_bgCount(0), _rows(0), _over(-1), _overDown(-1) { +BackgroundBox::BackgroundBox() : ItemListBox(st::backgroundScroll) +, _inner(this) { + init(_inner); + + connect(_inner, SIGNAL(backgroundChosen(int)), this, SLOT(onBackgroundChosen(int))); + + prepare(); +} + +void BackgroundBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + paintTitle(p, lang(lng_backgrounds_header)); +} + +void BackgroundBox::onBackgroundChosen(int index) { + if (index >= 0 && index < App::cServerBackgrounds().size()) { + const App::WallPaper &paper(App::cServerBackgrounds().at(index)); + if (App::main()) App::main()->setChatBackground(paper); + + using Update = Window::ChatBackgroundUpdate; + Window::chatBackground()->notify(Update(Update::Type::Start, !paper.id)); + } + onClose(); +} + +BackgroundBox::Inner::Inner(QWidget *parent) : ScrolledWidget(parent) +, _bgCount(0) +, _rows(0) +, _over(-1) +, _overDown(-1) { if (App::cServerBackgrounds().isEmpty()) { resize(BackgroundsInRow * (st::backgroundSize.width() + st::backgroundPadding) + st::backgroundPadding, 2 * (st::backgroundSize.height() + st::backgroundPadding) + st::backgroundPadding); - MTP::send(MTPaccount_GetWallPapers(), rpcDone(&BackgroundInner::gotWallpapers)); + MTP::send(MTPaccount_GetWallPapers(), rpcDone(&Inner::gotWallpapers)); } else { updateWallpapers(); } @@ -40,7 +70,7 @@ _bgCount(0), _rows(0), _over(-1), _overDown(-1) { setMouseTracking(true); } -void BackgroundInner::gotWallpapers(const MTPVector &result) { +void BackgroundBox::Inner::gotWallpapers(const MTPVector &result) { App::WallPapers wallpapers; wallpapers.push_back(App::WallPaper(0, ImagePtr(st::msgBG0), ImagePtr(st::msgBG0))); @@ -98,7 +128,7 @@ void BackgroundInner::gotWallpapers(const MTPVector &result) { updateWallpapers(); } -void BackgroundInner::updateWallpapers() { +void BackgroundBox::Inner::updateWallpapers() { _bgCount = App::cServerBackgrounds().size(); _rows = _bgCount / BackgroundsInRow; if (_bgCount % BackgroundsInRow) ++_rows; @@ -111,7 +141,7 @@ void BackgroundInner::updateWallpapers() { } } -void BackgroundInner::paintEvent(QPaintEvent *e) { +void BackgroundBox::Inner::paintEvent(QPaintEvent *e) { QRect r(e->rect()); Painter p(this); @@ -145,7 +175,7 @@ void BackgroundInner::paintEvent(QPaintEvent *e) { } } -void BackgroundInner::mouseMoveEvent(QMouseEvent *e) { +void BackgroundBox::Inner::mouseMoveEvent(QMouseEvent *e) { int x = e->pos().x(), y = e->pos().y(); int row = int((y - st::backgroundPadding) / (st::backgroundSize.height() + st::backgroundPadding)); if (y - row * (st::backgroundSize.height() + st::backgroundPadding) > st::backgroundPadding + st::backgroundSize.height()) row = _rows + 1; @@ -161,11 +191,11 @@ void BackgroundInner::mouseMoveEvent(QMouseEvent *e) { } } -void BackgroundInner::mousePressEvent(QMouseEvent *e) { +void BackgroundBox::Inner::mousePressEvent(QMouseEvent *e) { _overDown = _over; } -void BackgroundInner::mouseReleaseEvent(QMouseEvent *e) { +void BackgroundBox::Inner::mouseReleaseEvent(QMouseEvent *e) { if (_overDown == _over && _over >= 0) { emit backgroundChosen(_over); } else if (_over < 0) { @@ -173,33 +203,5 @@ void BackgroundInner::mouseReleaseEvent(QMouseEvent *e) { } } -void BackgroundInner::resizeEvent(QResizeEvent *e) { -} - -BackgroundBox::BackgroundBox() : ItemListBox(st::backgroundScroll) -, _inner() { - - init(&_inner); - - connect(&_inner, SIGNAL(backgroundChosen(int)), this, SLOT(onBackgroundChosen(int))); - - prepare(); -} - -void BackgroundBox::paintEvent(QPaintEvent *e) { - Painter p(this); - if (paint(p)) return; - - paintTitle(p, lang(lng_backgrounds_header)); -} - -void BackgroundBox::onBackgroundChosen(int index) { - if (index >= 0 && index < App::cServerBackgrounds().size()) { - const App::WallPaper &paper(App::cServerBackgrounds().at(index)); - if (App::main()) App::main()->setChatBackground(paper); - - using Update = Window::ChatBackgroundUpdate; - Window::chatBackground()->notify(Update(Update::Type::Start, !paper.id)); - } - onClose(); +void BackgroundBox::Inner::resizeEvent(QResizeEvent *e) { } diff --git a/Telegram/SourceFiles/boxes/backgroundbox.h b/Telegram/SourceFiles/boxes/backgroundbox.h index ebdcab053..798593658 100644 --- a/Telegram/SourceFiles/boxes/backgroundbox.h +++ b/Telegram/SourceFiles/boxes/backgroundbox.h @@ -23,11 +23,30 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "abstractbox.h" #include "core/lambda_wrap.h" -class BackgroundInner : public TWidget, public RPCSender, private base::Subscriber { +class BackgroundBox : public ItemListBox { Q_OBJECT public: - BackgroundInner(); + BackgroundBox(); + +public slots: + void onBackgroundChosen(int index); + +protected: + void paintEvent(QPaintEvent *e) override; + +private: + class Inner; + ChildWidget _inner; + +}; + +// This class is hold in header because it requires Qt preprocessing. +class BackgroundBox::Inner : public ScrolledWidget, public RPCSender, private base::Subscriber { + Q_OBJECT + +public: + Inner(QWidget *parent); signals: void backgroundChosen(int index); @@ -47,20 +66,3 @@ private: int32 _over, _overDown; }; - -class BackgroundBox : public ItemListBox { - Q_OBJECT - -public: - BackgroundBox(); - -public slots: - void onBackgroundChosen(int index); - -protected: - void paintEvent(QPaintEvent *e) override; - -private: - BackgroundInner _inner; - -}; diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 1a6e30fed..72c27d234 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -68,6 +68,38 @@ aboutRevokePublicLabel: flatLabel(labelDefFlat) { textFg: windowTextFg; } +boxSearchField: InputField(defaultInputField) { + textMargins: margins(41px, 16px, 41px, 0px); + + placeholderFg: #999; + placeholderFgActive: #aaa; + placeholderMargins: margins(4px, 0px, 4px, 0px); + + border: 0px; + borderActive: 0px; + borderError: 0px; + + height: 48px; + + iconSprite: sprite(227px, 21px, 24px, 24px); + iconPosition: point(15px, 14px); + + font: normalFont; +} +boxSearchCancel: IconButton { + width: 41px; + height: 48px; + + opacity: 0.3; + overOpacity: 0.4; + + icon: icon {{ "box_search_cancel", #000000 }}; + iconPosition: point(8px, 18px); + downIconPosition: point(8px, 18px); + + duration: 150; +} + contactsPhotoCheckbox: RoundImageCheckbox { imageRadius: 21px; imageSmallRadius: 18px; diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index ab1470576..41915c6a2 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -30,6 +30,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "mainwindow.h" #include "application.h" #include "ui/filedialog.h" +#include "ui/buttons/icon_button.h" #include "boxes/photocropbox.h" #include "boxes/confirmbox.h" #include "observer_peer.h" @@ -39,15 +40,481 @@ QString cantInviteError() { return lng_cant_invite_not_contact(lt_more_info, textcmdLink(qsl("https://telegram.me/spambot"), lang(lng_cant_more_info))); } -ContactsInner::ContactData::ContactData() : name(st::boxWideWidth) { +ContactsBox::ContactsBox() : ItemListBox(st::contactsScroll) +, _inner(this, CreatingGroupNone) +, _filter(this, st::boxSearchField, lang(lng_participant_filter)) +, _filterCancel(this, st::boxSearchCancel) +, _next(this, lang(lng_create_group_next), st::defaultBoxButton) +, _cancel(this, lang(lng_cancel), st::cancelBoxButton) +, _topShadow(this) { + init(); } -ContactsInner::ContactData::ContactData(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) +ContactsBox::ContactsBox(const QString &name, const QImage &photo) : ItemListBox(st::boxScroll) +, _inner(this, CreatingGroupGroup) +, _filter(this, st::boxSearchField, lang(lng_participant_filter)) +, _filterCancel(this, st::boxSearchCancel) +, _next(this, lang(lng_create_group_create), st::defaultBoxButton) +, _cancel(this, lang(lng_create_group_back), st::cancelBoxButton) +, _topShadow(this) +, _creationName(name) +, _creationPhoto(photo) { + init(); +} + +ContactsBox::ContactsBox(ChannelData *channel) : ItemListBox(st::boxScroll) +, _inner(this, channel, MembersFilter::Recent, MembersAlreadyIn()) +, _filter(this, st::boxSearchField, lang(lng_participant_filter)) +, _filterCancel(this, st::boxSearchCancel) +, _next(this, lang(lng_participant_invite), st::defaultBoxButton) +, _cancel(this, lang(lng_create_group_skip), st::cancelBoxButton) +, _topShadow(this) { + init(); +} + +ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const MembersAlreadyIn &already) : ItemListBox((filter == MembersFilter::Admins) ? st::contactsScroll : st::boxScroll) +, _inner(this, channel, filter, already) +, _filter(this, st::boxSearchField, lang(lng_participant_filter)) +, _filterCancel(this, st::boxSearchCancel) +, _next(this, lang(lng_participant_invite), st::defaultBoxButton) +, _cancel(this, lang(lng_cancel), st::cancelBoxButton) +, _topShadow(this) { + init(); +} + +ContactsBox::ContactsBox(ChatData *chat, MembersFilter filter) : ItemListBox(st::boxScroll) +, _inner(this, chat, filter) +, _filter(this, st::boxSearchField, lang(lng_participant_filter)) +, _filterCancel(this, st::boxSearchCancel) +, _next(this, lang((filter == MembersFilter::Admins) ? lng_settings_save : lng_participant_invite), st::defaultBoxButton) +, _cancel(this, lang(lng_cancel), st::cancelBoxButton) +, _topShadow(this) { + init(); +} + +ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) +, _inner(this, bot) +, _filter(this, st::boxSearchField, lang(lng_participant_filter)) +, _filterCancel(this, st::boxSearchCancel) +, _next(this, lang(lng_create_group_next), st::defaultBoxButton) +, _cancel(this, lang(lng_cancel), st::cancelBoxButton) +, _topShadow(this) { + init(); +} + +void ContactsBox::init() { + bool inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); + int32 topSkip = st::boxTitleHeight + _filter->height(); + int32 bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; + ItemListBox::init(_inner, bottomSkip, topSkip); + + connect(_inner, SIGNAL(chosenChanged()), this, SLOT(onChosenChanged())); + connect(_inner, SIGNAL(addRequested()), App::wnd(), SLOT(onShowAddContact())); + if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { + _next.hide(); + _cancel.hide(); + } else if (_inner->chat() && _inner->membersFilter() == MembersFilter::Admins) { + connect(&_next, SIGNAL(clicked()), this, SLOT(onSaveAdmins())); + _bottomShadow = new ScrollableBoxShadow(this); + } else if (_inner->chat() || _inner->channel()) { + connect(&_next, SIGNAL(clicked()), this, SLOT(onInvite())); + _bottomShadow = new ScrollableBoxShadow(this); + } else if (_inner->creating() != CreatingGroupNone) { + connect(&_next, SIGNAL(clicked()), this, SLOT(onCreate())); + _bottomShadow = new ScrollableBoxShadow(this); + } else { + _next.hide(); + _cancel.hide(); + } + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); + connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); + connect(_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); + connect(_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + connect(_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); + connect(_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); + connect(_inner, SIGNAL(selectAllQuery()), _filter, SLOT(selectAll())); + connect(_inner, SIGNAL(searchByUsername()), this, SLOT(onNeedSearchByUsername())); + connect(_inner, SIGNAL(adminAdded()), this, SIGNAL(adminAdded())); + + _filterCancel->setAttribute(Qt::WA_OpaquePaintEvent); + + _searchTimer.setSingleShot(true); + connect(&_searchTimer, SIGNAL(timeout()), this, SLOT(onSearchByUsername())); + + prepare(); +} + +bool ContactsBox::onSearchByUsername(bool searchCache) { + QString q = _filter->getLastText().trimmed(); + if (q.isEmpty()) { + if (_peopleRequest) { + _peopleRequest = 0; + } + return true; + } + if (q.size() >= MinUsernameLength) { + if (searchCache) { + PeopleCache::const_iterator i = _peopleCache.constFind(q); + if (i != _peopleCache.cend()) { + _peopleQuery = q; + _peopleRequest = 0; + peopleReceived(i.value(), 0); + return true; + } + } else if (_peopleQuery != q) { + _peopleQuery = q; + _peopleFull = false; + _peopleRequest = MTP::send(MTPcontacts_Search(MTP_string(_peopleQuery), MTP_int(SearchPeopleLimit)), rpcDone(&ContactsBox::peopleReceived), rpcFail(&ContactsBox::peopleFailed)); + _peopleQueries.insert(_peopleRequest, _peopleQuery); + } + } + return false; +} + +void ContactsBox::onNeedSearchByUsername() { + if (!onSearchByUsername(true)) { + _searchTimer.start(AutoSearchTimeout); + } +} + +void ContactsBox::peopleReceived(const MTPcontacts_Found &result, mtpRequestId req) { + QString q = _peopleQuery; + + PeopleQueries::iterator i = _peopleQueries.find(req); + if (i != _peopleQueries.cend()) { + q = i.value(); + _peopleCache[q] = result; + _peopleQueries.erase(i); + } + + if (_peopleRequest == req) { + switch (result.type()) { + case mtpc_contacts_found: { + App::feedUsers(result.c_contacts_found().vusers); + App::feedChats(result.c_contacts_found().vchats); + _inner->peopleReceived(q, result.c_contacts_found().vresults.c_vector().v); + } break; + } + + _peopleRequest = 0; + _inner->updateSel(); + onScroll(); + } +} + +bool ContactsBox::peopleFailed(const RPCError &error, mtpRequestId req) { + if (MTP::isDefaultHandledError(error)) return false; + + if (_peopleRequest == req) { + _peopleRequest = 0; + _peopleFull = true; + } + return true; +} + +void ContactsBox::showAll() { + _filter->show(); + if (_filter->getLastText().isEmpty()) { + _filterCancel->hide(); + } else { + _filterCancel->show(); + } + if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { + _next.hide(); + _cancel.hide(); + } else if (_inner->chat() || _inner->channel()) { + _next.show(); + _cancel.show(); + } else if (_inner->creating() != CreatingGroupNone) { + _next.show(); + _cancel.show(); + } else { + _next.hide(); + _cancel.hide(); + } + _topShadow.show(); + if (_bottomShadow) _bottomShadow->show(); + ItemListBox::showAll(); +} + +void ContactsBox::doSetInnerFocus() { + _filter->setFocus(); +} + +void ContactsBox::onSubmit() { + _inner->chooseParticipant(); +} + +void ContactsBox::keyPressEvent(QKeyEvent *e) { + if (_filter->hasFocus()) { + if (e->key() == Qt::Key_Down) { + _inner->selectSkip(1); + } else if (e->key() == Qt::Key_Up) { + _inner->selectSkip(-1); + } else if (e->key() == Qt::Key_PageDown) { + _inner->selectSkipPage(scrollArea()->height(), 1); + } else if (e->key() == Qt::Key_PageUp) { + _inner->selectSkipPage(scrollArea()->height(), -1); + } else { + ItemListBox::keyPressEvent(e); + } + } else { + ItemListBox::keyPressEvent(e); + } +} + +void ContactsBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + bool addingAdmin = _inner->channel() && _inner->membersFilter() == MembersFilter::Admins; + if (_inner->chat() && _inner->membersFilter() == MembersFilter::Admins) { + paintTitle(p, lang(lng_channel_admins)); + } else if (_inner->chat() || _inner->creating() != CreatingGroupNone) { + QString title(lang(addingAdmin ? lng_channel_add_admin : lng_profile_add_participant)); + QString additional((addingAdmin || (_inner->channel() && !_inner->channel()->isMegagroup())) ? QString() : QString("%1 / %2").arg(_inner->selectedCount()).arg(Global::MegagroupSizeMax())); + paintTitle(p, title, additional); + } else if (_inner->sharingBotGame()) { + paintTitle(p, lang(lng_bot_choose_chat)); + } else if (_inner->bot()) { + paintTitle(p, lang(lng_bot_choose_group)); + } else { + paintTitle(p, lang(lng_contacts_header)); + } +} + +void ContactsBox::resizeEvent(QResizeEvent *e) { + ItemListBox::resizeEvent(e); + _filter->resize(width(), _filter->height()); + _filter->moveToLeft(0, st::boxTitleHeight); + _filterCancel->moveToRight(0, st::boxTitleHeight); + _inner->resize(width(), _inner->height()); + _next.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _next.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _next.width() + st::boxButtonPadding.left(), _next.y()); + _topShadow.setGeometry(0, st::boxTitleHeight + _filter->height(), width(), st::lineWidth); + if (_bottomShadow) _bottomShadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _next.height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); +} + +void ContactsBox::closePressed() { + if (_inner->channel() && !_inner->hasAlreadyMembersInChannel()) { + Ui::showPeerHistory(_inner->channel(), ShowAtTheEndMsgId); + } +} + +void ContactsBox::onFilterCancel() { + _filter->setText(QString()); +} + +void ContactsBox::onFilterUpdate() { + scrollArea()->scrollToY(0); + if (_filter->getLastText().isEmpty()) { + _filterCancel->hide(); + } else { + _filterCancel->show(); + } + _inner->updateFilter(_filter->getLastText()); +} + +void ContactsBox::onChosenChanged() { + update(); +} + +void ContactsBox::onInvite() { + QVector users(_inner->selected()); + if (users.isEmpty()) { + _filter->setFocus(); + _filter->showError(); + return; + } + + App::main()->addParticipants(_inner->chat() ? (PeerData*)_inner->chat() : _inner->channel(), users); + if (_inner->chat()) { + Ui::hideLayer(); + Ui::showPeerHistory(_inner->chat(), ShowAtTheEndMsgId); + } else { + onClose(); + } +} + +void ContactsBox::onCreate() { + if (_saveRequestId) return; + + MTPVector users(MTP_vector(_inner->selectedInputs())); + const auto &v(users.c_vector().v); + if (v.isEmpty() || (v.size() == 1 && v.at(0).type() == mtpc_inputUserSelf)) { + _filter->setFocus(); + _filter->showError(); + return; + } + _saveRequestId = MTP::send(MTPmessages_CreateChat(MTP_vector(v), MTP_string(_creationName)), rpcDone(&ContactsBox::creationDone), rpcFail(&ContactsBox::creationFail)); +} + +void ContactsBox::onSaveAdmins() { + if (_saveRequestId) return; + + _inner->saving(true); + _saveRequestId = MTP::send(MTPmessages_ToggleChatAdmins(_inner->chat()->inputChat, MTP_bool(!_inner->allAdmins())), rpcDone(&ContactsBox::saveAdminsDone), rpcFail(&ContactsBox::saveAdminsFail)); +} + +void ContactsBox::saveAdminsDone(const MTPUpdates &result) { + App::main()->sentUpdatesReceived(result); + saveSelectedAdmins(); +} + +void ContactsBox::saveSelectedAdmins() { + if (_inner->allAdmins() && !_inner->chat()->participants.isEmpty()) { + onClose(); + } else { + _saveRequestId = MTP::send(MTPmessages_GetFullChat(_inner->chat()->inputChat), rpcDone(&ContactsBox::getAdminsDone), rpcFail(&ContactsBox::saveAdminsFail)); + } +} + +void ContactsBox::getAdminsDone(const MTPmessages_ChatFull &result) { + App::api()->processFullPeer(_inner->chat(), result); + if (_inner->allAdmins()) { + onClose(); + return; + } + ChatData::Admins curadmins = _inner->chat()->admins; + QVector newadmins = _inner->selected(), appoint; + if (!newadmins.isEmpty()) { + appoint.reserve(newadmins.size()); + for (int32 i = 0, l = newadmins.size(); i < l; ++i) { + ChatData::Admins::iterator c = curadmins.find(newadmins.at(i)); + if (c == curadmins.cend()) { + if (newadmins.at(i)->id != peerFromUser(_inner->chat()->creator)) { + appoint.push_back(newadmins.at(i)); + } + } else { + curadmins.erase(c); + } + } + } + _saveRequestId = 0; + + for_const (UserData *user, curadmins) { + MTP::send(MTPmessages_EditChatAdmin(_inner->chat()->inputChat, user->inputUser, MTP_boolFalse()), rpcDone(&ContactsBox::removeAdminDone, user), rpcFail(&ContactsBox::editAdminFail), 0, 10); + } + for_const (UserData *user, appoint) { + MTP::send(MTPmessages_EditChatAdmin(_inner->chat()->inputChat, user->inputUser, MTP_boolTrue()), rpcDone(&ContactsBox::setAdminDone, user), rpcFail(&ContactsBox::editAdminFail), 0, 10); + } + MTP::sendAnything(); + + _saveRequestId = curadmins.size() + appoint.size(); + if (!_saveRequestId) { + onClose(); + } +} + +void ContactsBox::setAdminDone(UserData *user, const MTPBool &result) { + if (mtpIsTrue(result)) { + if (_inner->chat()->noParticipantInfo()) { + App::api()->requestFullPeer(_inner->chat()); + } else { + _inner->chat()->admins.insert(user); + } + } + --_saveRequestId; + if (!_saveRequestId) { + emit App::main()->peerUpdated(_inner->chat()); + onClose(); + } +} + +void ContactsBox::removeAdminDone(UserData *user, const MTPBool &result) { + if (mtpIsTrue(result)) { + _inner->chat()->admins.remove(user); + } + --_saveRequestId; + if (!_saveRequestId) { + emit App::main()->peerUpdated(_inner->chat()); + onClose(); + } +} + +bool ContactsBox::saveAdminsFail(const RPCError &error) { + if (MTP::isDefaultHandledError(error)) return true; + _saveRequestId = 0; + _inner->saving(false); + if (error.type() == qstr("CHAT_NOT_MODIFIED")) { + saveSelectedAdmins(); + } + return false; +} + +bool ContactsBox::editAdminFail(const RPCError &error) { + if (MTP::isDefaultHandledError(error)) return true; + --_saveRequestId; + _inner->chat()->invalidateParticipants(); + if (!_saveRequestId) { + if (error.type() == qstr("USER_RESTRICTED")) { + Ui::showLayer(new InformBox(lang(lng_cant_do_this))); + return true; + } + onClose(); + } + return false; +} + +void ContactsBox::onScroll() { + _inner->loadProfilePhotos(scrollArea()->scrollTop()); +} + +void ContactsBox::creationDone(const MTPUpdates &updates) { + Ui::hideLayer(); + + App::main()->sentUpdatesReceived(updates); + const QVector *v = 0; + switch (updates.type()) { + case mtpc_updates: v = &updates.c_updates().vchats.c_vector().v; break; + case mtpc_updatesCombined: v = &updates.c_updatesCombined().vchats.c_vector().v; break; + default: LOG(("API Error: unexpected update cons %1 (ContactsBox::creationDone)").arg(updates.type())); break; + } + + PeerData *peer = 0; + if (v && !v->isEmpty() && v->front().type() == mtpc_chat) { + peer = App::chat(v->front().c_chat().vid.v); + if (peer) { + if (!_creationPhoto.isNull()) { + App::app()->uploadProfilePhoto(_creationPhoto, peer->id); + } + Ui::showPeerHistory(peer, ShowAtUnreadMsgId); + } + } else { + LOG(("API Error: chat not found in updates (ContactsBox::creationDone)")); + } +} + +bool ContactsBox::creationFail(const RPCError &error) { + if (MTP::isDefaultHandledError(error)) return false; + + _saveRequestId = 0; + if (error.type() == "NO_CHAT_TITLE") { + onClose(); + return true; + } else if (error.type() == "USERS_TOO_FEW") { + _filter->setFocus(); + _filter->showError(); + return true; + } else if (error.type() == "PEER_FLOOD") { + Ui::showLayer(new InformBox(cantInviteError()), KeepOtherLayers); + return true; + } else if (error.type() == qstr("USER_RESTRICTED")) { + Ui::showLayer(new InformBox(lang(lng_cant_do_this))); + return true; + } + return false; +} + +ContactsBox::Inner::ContactData::ContactData() : name(st::boxWideWidth) { +} + +ContactsBox::Inner::ContactData::ContactData(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) : checkbox(std_::make_unique(st::contactsPhotoCheckbox, std_::move(updateCallback), PaintUserpicCallback(peer))) , name(st::boxWideWidth) { } -ContactsInner::ContactsInner(CreatingGroupType creating) : TWidget() +ContactsBox::Inner::Inner(QWidget *parent, CreatingGroupType creating) : ScrolledWidget(parent) , _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) , _newItemHeight(creating == CreatingGroupNone ? st::contactsNewItemHeight : 0) , _creating(creating) @@ -57,7 +524,7 @@ ContactsInner::ContactsInner(CreatingGroupType creating) : TWidget() init(); } -ContactsInner::ContactsInner(ChannelData *channel, MembersFilter membersFilter, const MembersAlreadyIn &already) : TWidget() +ContactsBox::Inner::Inner(QWidget *parent, ChannelData *channel, MembersFilter membersFilter, const MembersAlreadyIn &already) : ScrolledWidget(parent) , _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) , _channel(channel) , _membersFilter(membersFilter) @@ -75,7 +542,7 @@ namespace { } } -ContactsInner::ContactsInner(ChatData *chat, MembersFilter membersFilter) : TWidget() +ContactsBox::Inner::Inner(QWidget *parent, ChatData *chat, MembersFilter membersFilter) : ScrolledWidget(parent) , _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) , _chat(chat) , _membersFilter(membersFilter) @@ -83,11 +550,11 @@ ContactsInner::ContactsInner(ChatData *chat, MembersFilter membersFilter) : TWid , _aboutWidth(st::boxWideWidth - st::contactsPadding.left() - st::contactsPadding.right()) , _aboutAllAdmins(st::boxTextFont, lang(lng_chat_about_all_admins), _defaultOptions, _aboutWidth) , _aboutAdmins(st::boxTextFont, lang(lng_chat_about_admins), _defaultOptions, _aboutWidth) -, _customList((membersFilter == MembersFilterRecent) ? std_::unique_ptr() : std_::make_unique(Dialogs::SortMode::Add)) -, _contacts((membersFilter == MembersFilterRecent) ? App::main()->contactsList() : _customList.get()) +, _customList((membersFilter == MembersFilter::Recent) ? std_::unique_ptr() : std_::make_unique(Dialogs::SortMode::Add)) +, _contacts((membersFilter == MembersFilter::Recent) ? App::main()->contactsList() : _customList.get()) , _addContactLnk(this, lang(lng_add_contact_button)) { initList(); - if (membersFilter == MembersFilterAdmins) { + if (membersFilter == MembersFilter::Admins) { _newItemHeight = st::contactsNewItemHeight + qMax(_aboutAllAdmins.countHeight(_aboutWidth), _aboutAdmins.countHeight(_aboutWidth)) + st::contactsAboutHeight; if (_contacts->isEmpty()) { App::api()->requestFullPeer(_chat); @@ -97,7 +564,7 @@ ContactsInner::ContactsInner(ChatData *chat, MembersFilter membersFilter) : TWid } template -void ContactsInner::addDialogsToList(FilterCallback callback) { +void ContactsBox::Inner::addDialogsToList(FilterCallback callback) { auto v = App::main()->dialogsList(); for_const (auto row, *v) { auto peer = row->history()->peer; @@ -107,7 +574,7 @@ void ContactsInner::addDialogsToList(FilterCallback callback) { } } -ContactsInner::ContactsInner(UserData *bot) : TWidget() +ContactsBox::Inner::Inner(QWidget *parent, UserData *bot) : ScrolledWidget(parent) , _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) , _bot(bot) , _allAdmins(this, lang(lng_chat_all_members_admins), false, st::contactsAdminCheckbox) @@ -137,7 +604,7 @@ ContactsInner::ContactsInner(UserData *bot) : TWidget() init(); } -void ContactsInner::init() { +void ContactsBox::Inner::init() { subscribe(FileDownload::ImageLoaded(), [this] { update(); }); connect(&_addContactLnk, SIGNAL(clicked()), App::wnd(), SLOT(onShowAddContact())); connect(&_allAdmins, SIGNAL(changed()), this, SLOT(onAllAdminsChanged())); @@ -157,7 +624,7 @@ void ContactsInner::init() { connect(App::main(), SIGNAL(peerPhotoChanged(PeerData*)), this, SLOT(peerUpdated(PeerData*))); } -void ContactsInner::initList() { +void ContactsBox::Inner::initList() { if (!usingMultiSelect()) return; QList admins, others; @@ -190,14 +657,14 @@ void ContactsInner::initList() { } } -void ContactsInner::onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars) { +void ContactsBox::Inner::onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars) { if (bot()) { _contacts->peerNameChanged(peer, oldNames, oldChars); } peerUpdated(peer); } -void ContactsInner::onAddBot() { +void ContactsBox::Inner::onAddBot() { if (auto &info = _bot->botInfo) { if (!info->shareGameShortName.isEmpty()) { MTPmessages_SendMedia::Flags sendFlags = 0; @@ -221,18 +688,18 @@ void ContactsInner::onAddBot() { Ui::showPeerHistory(_addToPeer, ShowAtUnreadMsgId); } -void ContactsInner::onAddAdmin() { +void ContactsBox::Inner::onAddAdmin() { if (_addAdminRequestId) return; - _addAdminRequestId = MTP::send(MTPchannels_EditAdmin(_channel->inputChannel, _addAdmin->inputUser, MTP_channelRoleEditor()), rpcDone(&ContactsInner::addAdminDone), rpcFail(&ContactsInner::addAdminFail)); + _addAdminRequestId = MTP::send(MTPchannels_EditAdmin(_channel->inputChannel, _addAdmin->inputUser, MTP_channelRoleEditor()), rpcDone(&Inner::addAdminDone), rpcFail(&Inner::addAdminFail)); } -void ContactsInner::onNoAddAdminBox(QObject *obj) { +void ContactsBox::Inner::onNoAddAdminBox(QObject *obj) { if (obj == _addAdminBox) { _addAdminBox = 0; } } -void ContactsInner::onAllAdminsChanged() { +void ContactsBox::Inner::onAllAdminsChanged() { if (_saving) { if (_allAdmins.checked() != _allAdminsChecked) { _allAdmins.setChecked(_allAdminsChecked); @@ -241,7 +708,7 @@ void ContactsInner::onAllAdminsChanged() { update(); } -void ContactsInner::addAdminDone(const MTPUpdates &result, mtpRequestId req) { +void ContactsBox::Inner::addAdminDone(const MTPUpdates &result, mtpRequestId req) { if (App::main()) App::main()->sentUpdatesReceived(result); if (req != _addAdminRequestId) return; @@ -266,7 +733,7 @@ void ContactsInner::addAdminDone(const MTPUpdates &result, mtpRequestId req) { emit adminAdded(); } -bool ContactsInner::addAdminFail(const RPCError &error, mtpRequestId req) { +bool ContactsBox::Inner::addAdminFail(const RPCError &error, mtpRequestId req) { if (MTP::isDefaultHandledError(error)) return false; if (req != _addAdminRequestId) return true; @@ -285,16 +752,16 @@ bool ContactsInner::addAdminFail(const RPCError &error, mtpRequestId req) { return true; } -void ContactsInner::saving(bool flag) { +void ContactsBox::Inner::saving(bool flag) { _saving = flag; _allAdminsChecked = _allAdmins.checked(); update(); } -void ContactsInner::peerUpdated(PeerData *peer) { +void ContactsBox::Inner::peerUpdated(PeerData *peer) { if (_chat && (!peer || peer == _chat)) { bool inited = false; - if (_membersFilter == MembersFilterAdmins && _contacts->isEmpty() && !_chat->participants.isEmpty()) { + if (_membersFilter == MembersFilter::Admins && _contacts->isEmpty() && !_chat->participants.isEmpty()) { initList(); inited = true; } @@ -342,7 +809,7 @@ void ContactsInner::peerUpdated(PeerData *peer) { } } -void ContactsInner::loadProfilePhotos(int32 yFrom) { +void ContactsBox::Inner::loadProfilePhotos(int32 yFrom) { int32 yTo = yFrom + (parentWidget() ? parentWidget()->height() : App::wnd()->height()) * 5; MTP::clearLoaderPriorities(); @@ -373,7 +840,7 @@ void ContactsInner::loadProfilePhotos(int32 yFrom) { } } -ContactsInner::ContactData *ContactsInner::contactData(Dialogs::Row *row) { +ContactsBox::Inner::ContactData *ContactsBox::Inner::contactData(Dialogs::Row *row) { ContactData *data = (ContactData*)row->attached; if (!data) { PeerData *peer = row->history()->peer; @@ -383,7 +850,7 @@ ContactsInner::ContactData *ContactsInner::contactData(Dialogs::Row *row) { _contactsData.insert(peer, data); if (peer->isUser()) { if (_chat) { - if (_membersFilter == MembersFilterRecent) { + if (_membersFilter == MembersFilter::Recent) { data->disabledChecked = _chat->participants.contains(peer->asUser()); } } else if (_creating == CreatingGroupGroup) { @@ -419,10 +886,10 @@ ContactsInner::ContactData *ContactsInner::contactData(Dialogs::Row *row) { return data; } -void ContactsInner::paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel) { +void ContactsBox::Inner::paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel) { UserData *user = peer->asUser(); - if (_chat && _membersFilter == MembersFilterAdmins) { + if (_chat && _membersFilter == MembersFilter::Admins) { if (_allAdmins.checked() || peer->id == peerFromUser(_chat->creator) || _saving) { sel = false; } @@ -433,7 +900,7 @@ void ContactsInner::paintDialog(Painter &p, PeerData *peer, ContactData *data, b } auto paintDisabledCheck = data->disabledChecked; - if (_chat && _membersFilter == MembersFilterAdmins) { + if (_chat && _membersFilter == MembersFilter::Admins) { if (peer->id == peerFromUser(_chat->creator) || _allAdmins.checked()) { paintDisabledCheck = true; } @@ -496,7 +963,7 @@ void ContactsInner::paintDialog(Painter &p, PeerData *peer, ContactData *data, b } // Emulates Ui::RoundImageCheckbox::paint() in a checked state. -void ContactsInner::paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, int y, int outerWidth) const { +void ContactsBox::Inner::paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, int y, int outerWidth) const { auto userpicRadius = st::contactsPhotoCheckbox.imageSmallRadius; auto userpicShift = st::contactsPhotoCheckbox.imageRadius - userpicRadius; auto userpicDiameter = st::contactsPhotoCheckbox.imageRadius * 2; @@ -530,7 +997,7 @@ void ContactsInner::paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, st::contactsPhotoCheckbox.checkIcon.paint(p, iconEllipse.topLeft(), outerWidth); } -void ContactsInner::paintEvent(QPaintEvent *e) { +void ContactsBox::Inner::paintEvent(QPaintEvent *e) { QRect r(e->rect()); Painter p(this); @@ -596,7 +1063,7 @@ void ContactsInner::paintEvent(QPaintEvent *e) { int32 skip = 0; if (bot()) { text = lang((cDialogsReceived() && !_searching) ? (sharingBotGame() ? lng_bot_no_chats : lng_bot_no_groups) : lng_contacts_loading); - } else if (_chat && _membersFilter == MembersFilterAdmins) { + } else if (_chat && _membersFilter == MembersFilter::Admins) { text = lang(lng_contacts_loading); p.fillRect(0, 0, width(), _newItemHeight - st::contactsPadding.bottom() - st::lineWidth, st::contactsAboutBg); p.fillRect(0, _newItemHeight - st::contactsPadding.bottom() - st::lineWidth, width(), st::lineWidth, st::shadowColor); @@ -622,7 +1089,7 @@ void ContactsInner::paintEvent(QPaintEvent *e) { QString text; if (bot()) { text = lang((cDialogsReceived() && !_searching) ? (sharingBotGame() ? lng_bot_chats_not_found : lng_bot_groups_not_found) : lng_contacts_loading); - } else if (_chat && _membersFilter == MembersFilterAdmins) { + } else if (_chat && _membersFilter == MembersFilter::Admins) { text = lang(_chat->participants.isEmpty() ? lng_contacts_loading : lng_contacts_not_found); } else { text = lang((cContactsReceived() && !_searching) ? lng_contacts_not_found : lng_contacts_loading); @@ -659,11 +1126,11 @@ void ContactsInner::paintEvent(QPaintEvent *e) { } } -void ContactsInner::enterEvent(QEvent *e) { +void ContactsBox::Inner::enterEvent(QEvent *e) { setMouseTracking(true); } -int ContactsInner::getSelectedRowTop() const { +int ContactsBox::Inner::getSelectedRowTop() const { if (_filter.isEmpty()) { if (_sel) { return _newItemHeight + (_sel->pos() * _rowHeight); @@ -680,7 +1147,7 @@ int ContactsInner::getSelectedRowTop() const { return -1; } -void ContactsInner::updateSelectedRow() { +void ContactsBox::Inner::updateSelectedRow() { if (_filter.isEmpty() && _newItemSel) { update(0, 0, width(), st::contactsNewItemHeight); } else { @@ -691,11 +1158,11 @@ void ContactsInner::updateSelectedRow() { } } -void ContactsInner::updateRowWithTop(int rowTop) { +void ContactsBox::Inner::updateRowWithTop(int rowTop) { update(0, rowTop, width(), _rowHeight); } -int ContactsInner::getRowTopWithPeer(PeerData *peer) const { +int ContactsBox::Inner::getRowTopWithPeer(PeerData *peer) const { if (_filter.isEmpty()) { for (auto i = _contacts->cbegin(), end = _contacts->cend(); i != end; ++i) { if ((*i)->history()->peer == peer) { @@ -722,14 +1189,14 @@ int ContactsInner::getRowTopWithPeer(PeerData *peer) const { return -1; } -void ContactsInner::updateRowWithPeer(PeerData *peer) { +void ContactsBox::Inner::updateRowWithPeer(PeerData *peer) { auto rowTop = getRowTopWithPeer(peer); if (rowTop >= 0) { updateRowWithTop(rowTop); } } -void ContactsInner::leaveEvent(QEvent *e) { +void ContactsBox::Inner::leaveEvent(QEvent *e) { _mouseSel = false; setMouseTracking(false); if (_newItemSel || _sel || _filteredSel >= 0 || _byUsernameSel >= 0) { @@ -740,13 +1207,13 @@ void ContactsInner::leaveEvent(QEvent *e) { } } -void ContactsInner::mouseMoveEvent(QMouseEvent *e) { +void ContactsBox::Inner::mouseMoveEvent(QMouseEvent *e) { _mouseSel = true; _lastMousePos = e->globalPos(); updateSel(); } -void ContactsInner::mousePressEvent(QMouseEvent *e) { +void ContactsBox::Inner::mousePressEvent(QMouseEvent *e) { _mouseSel = true; _lastMousePos = e->globalPos(); updateSel(); @@ -755,9 +1222,9 @@ void ContactsInner::mousePressEvent(QMouseEvent *e) { } } -void ContactsInner::chooseParticipant() { +void ContactsBox::Inner::chooseParticipant() { if (_saving) return; - bool addingAdmin = (_channel && _membersFilter == MembersFilterAdmins); + bool addingAdmin = (_channel && _membersFilter == MembersFilter::Admins); if (!addingAdmin && usingMultiSelect()) { _time = unixtime(); if (_filter.isEmpty()) { @@ -855,11 +1322,11 @@ void ContactsInner::chooseParticipant() { update(); } -void ContactsInner::changeCheckState(Dialogs::Row *row) { +void ContactsBox::Inner::changeCheckState(Dialogs::Row *row) { changeCheckState(contactData(row), row->history()->peer); } -void ContactsInner::changeCheckState(ContactData *data, PeerData *peer) { +void ContactsBox::Inner::changeCheckState(ContactData *data, PeerData *peer) { t_assert(usingMultiSelect()); int32 cnt = _selCount; @@ -879,7 +1346,7 @@ void ContactsInner::changeCheckState(ContactData *data, PeerData *peer) { if (cnt != _selCount) emit chosenChanged(); } -int32 ContactsInner::selectedCount() const { +int32 ContactsBox::Inner::selectedCount() const { int32 result = _selCount; if (_chat) { result += qMax(_chat->count, 1); @@ -891,7 +1358,7 @@ int32 ContactsInner::selectedCount() const { return result; } -void ContactsInner::updateSel() { +void ContactsBox::Inner::updateSel() { if (!_mouseSel) return; QPoint p(mapFromGlobal(_lastMousePos)); @@ -899,7 +1366,7 @@ void ContactsInner::updateSel() { if (_filter.isEmpty()) { bool newItemSel = false; if (_newItemHeight) { - if (in && (p.y() >= 0) && (p.y() < _newItemHeight) && !(_chat && _membersFilter == MembersFilterAdmins)) { + if (in && (p.y() >= 0) && (p.y() < _newItemHeight) && !(_chat && _membersFilter == MembersFilter::Admins)) { newItemSel = true; } p.setY(p.y() - _newItemHeight); @@ -927,7 +1394,7 @@ void ContactsInner::updateSel() { } } -void ContactsInner::updateFilter(QString filter) { +void ContactsBox::Inner::updateFilter(QString filter) { _lastQuery = filter.toLower().trimmed(); filter = textSearchKey(filter); @@ -1040,7 +1507,7 @@ void ContactsInner::updateFilter(QString filter) { _mouseSel = false; refresh(); - if ((!bot() || sharingBotGame()) && (!_chat || _membersFilter != MembersFilterAdmins)) { + if ((!bot() || sharingBotGame()) && (!_chat || _membersFilter != MembersFilter::Admins)) { _searching = true; emit searchByUsername(); } @@ -1050,7 +1517,7 @@ void ContactsInner::updateFilter(QString filter) { } } -void ContactsInner::onDialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow) { +void ContactsBox::Inner::onDialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow) { if (!_filter.isEmpty()) { for (FilteredDialogs::iterator i = _filtered.begin(), e = _filtered.end(); i != e;) { if (*i == oldRow) { // this row is shown in filtered and maybe is in contacts! @@ -1078,7 +1545,7 @@ void ContactsInner::onDialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newR resize(width(), newh); } -void ContactsInner::peopleReceived(const QString &query, const QVector &people) { +void ContactsBox::Inner::peopleReceived(const QString &query, const QVector &people) { _lastQuery = query.toLower().trimmed(); if (_lastQuery.at(0) == '@') _lastQuery = _lastQuery.mid(1); int32 already = _byUsernameFiltered.size(); @@ -1101,7 +1568,7 @@ void ContactsInner::peopleReceived(const QString &query, const QVector if (peer->asUser()->botInfo->cantJoinGroups) continue; } if (_channel) { - if (!_channel->isMegagroup() && _membersFilter != MembersFilterAdmins) continue; + if (!_channel->isMegagroup() && _membersFilter != MembersFilter::Admins) continue; } } } else { @@ -1135,9 +1602,9 @@ void ContactsInner::peopleReceived(const QString &query, const QVector refresh(); } -void ContactsInner::refresh() { +void ContactsBox::Inner::refresh() { if (_filter.isEmpty()) { - if (_chat && _membersFilter == MembersFilterAdmins) { + if (_chat && _membersFilter == MembersFilter::Admins) { if (_allAdmins.isHidden()) _allAdmins.show(); } else { if (!_allAdmins.isHidden()) _allAdmins.hide(); @@ -1145,7 +1612,7 @@ void ContactsInner::refresh() { if (!_contacts->isEmpty() || !_byUsername.isEmpty()) { if (!_addContactLnk.isHidden()) _addContactLnk.hide(); resize(width(), _newItemHeight + (_contacts->size() * _rowHeight) + (_byUsername.isEmpty() ? 0 : (st::searchedBarHeight + _byUsername.size() * _rowHeight))); - } else if (_chat && _membersFilter == MembersFilterAdmins) { + } else if (_chat && _membersFilter == MembersFilter::Admins) { if (!_addContactLnk.isHidden()) _addContactLnk.hide(); resize(width(), _newItemHeight + st::noContactsHeight); } else { @@ -1168,33 +1635,33 @@ void ContactsInner::refresh() { update(); } -ChatData *ContactsInner::chat() const { +ChatData *ContactsBox::Inner::chat() const { return _chat; } -ChannelData *ContactsInner::channel() const { +ChannelData *ContactsBox::Inner::channel() const { return _channel; } -MembersFilter ContactsInner::membersFilter() const { +MembersFilter ContactsBox::Inner::membersFilter() const { return _membersFilter; } -UserData *ContactsInner::bot() const { +UserData *ContactsBox::Inner::bot() const { return _bot; } -bool ContactsInner::sharingBotGame() const { +bool ContactsBox::Inner::sharingBotGame() const { return (_bot && _bot->botInfo) ? !_bot->botInfo->shareGameShortName.isEmpty() : false; } -CreatingGroupType ContactsInner::creating() const { +CreatingGroupType ContactsBox::Inner::creating() const { return _creating; } -ContactsInner::~ContactsInner() { - for (ContactsData::iterator i = _contactsData.begin(), e = _contactsData.end(); i != e; ++i) { - delete *i; +ContactsBox::Inner::~Inner() { + for (auto contactData : base::take(_contactsData)) { + delete contactData; } if (_bot) { if (auto &info = _bot->botInfo) { @@ -1204,12 +1671,12 @@ ContactsInner::~ContactsInner() { } } -void ContactsInner::resizeEvent(QResizeEvent *e) { +void ContactsBox::Inner::resizeEvent(QResizeEvent *e) { _addContactLnk.move((width() - _addContactLnk.width()) / 2, (st::noContactsHeight + st::noContactsFont->height) / 2); _allAdmins.moveToLeft(st::contactsPadding.left(), st::contactsNewItemTop); } -void ContactsInner::selectSkip(int32 dir) { +void ContactsBox::Inner::selectSkip(int32 dir) { _time = unixtime(); _mouseSel = false; if (_filter.isEmpty()) { @@ -1227,7 +1694,7 @@ void ContactsInner::selectSkip(int32 dir) { } cur += dir; if (cur <= 0) { - _newItemSel = (_chat && _membersFilter == MembersFilterAdmins) ? false : (_newItemHeight ? true : false); + _newItemSel = (_chat && _membersFilter == MembersFilter::Admins) ? false : (_newItemHeight ? true : false); _sel = (!_newItemHeight && !_contacts->isEmpty()) ? *_contacts->cbegin() : nullptr; _byUsernameSel = (!_newItemHeight && _contacts->isEmpty() && !_byUsername.isEmpty()) ? 0 : -1; } else if (cur >= _contacts->size() + (_newItemHeight ? 1 : 0)) { @@ -1345,13 +1812,13 @@ void ContactsInner::selectSkip(int32 dir) { update(); } -void ContactsInner::selectSkipPage(int32 h, int32 dir) { +void ContactsBox::Inner::selectSkipPage(int32 h, int32 dir) { int32 points = h / _rowHeight; if (!points) return; selectSkip(points * dir); } -QVector ContactsInner::selected() { +QVector ContactsBox::Inner::selected() { QVector result; if (!usingMultiSelect()) { return result; @@ -1376,7 +1843,7 @@ QVector ContactsInner::selected() { return result; } -QVector ContactsInner::selectedInputs() { +QVector ContactsBox::Inner::selectedInputs() { QVector result; if (!usingMultiSelect()) { return result; @@ -1400,1048 +1867,3 @@ QVector ContactsInner::selectedInputs() { } return result; } - -ContactsBox::ContactsBox() : ItemListBox(st::contactsScroll) -, _inner(CreatingGroupNone) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) -, _next(this, lang(lng_create_group_next), st::defaultBoxButton) -, _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) { - init(); -} - -ContactsBox::ContactsBox(const QString &name, const QImage &photo) : ItemListBox(st::boxScroll) -, _inner(CreatingGroupGroup) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) -, _next(this, lang(lng_create_group_create), st::defaultBoxButton) -, _cancel(this, lang(lng_create_group_back), st::cancelBoxButton) -, _topShadow(this) -, _creationName(name) -, _creationPhoto(photo) { - init(); -} - -ContactsBox::ContactsBox(ChannelData *channel) : ItemListBox(st::boxScroll) -, _inner(channel, MembersFilterRecent, MembersAlreadyIn()) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) -, _next(this, lang(lng_participant_invite), st::defaultBoxButton) -, _cancel(this, lang(lng_create_group_skip), st::cancelBoxButton) -, _topShadow(this) { - init(); -} - -ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const MembersAlreadyIn &already) : ItemListBox((filter == MembersFilterAdmins) ? st::contactsScroll : st::boxScroll) -, _inner(channel, filter, already) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) -, _next(this, lang(lng_participant_invite), st::defaultBoxButton) -, _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) { - init(); -} - -ContactsBox::ContactsBox(ChatData *chat, MembersFilter filter) : ItemListBox(st::boxScroll) -, _inner(chat, filter) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) -, _next(this, lang((filter == MembersFilterAdmins) ? lng_settings_save : lng_participant_invite), st::defaultBoxButton) -, _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) { - init(); -} - -ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) -, _inner(bot) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) -, _next(this, lang(lng_create_group_next), st::defaultBoxButton) -, _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _topShadow(this) { - init(); -} - -void ContactsBox::init() { - bool inviting = (_inner.creating() == CreatingGroupGroup) || (_inner.channel() && _inner.membersFilter() == MembersFilterRecent) || _inner.chat(); - int32 topSkip = st::boxTitleHeight + _filter.height(); - int32 bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; - ItemListBox::init(&_inner, bottomSkip, topSkip); - - connect(&_inner, SIGNAL(chosenChanged()), this, SLOT(onChosenChanged())); - connect(&_inner, SIGNAL(addRequested()), App::wnd(), SLOT(onShowAddContact())); - if (_inner.channel() && _inner.membersFilter() == MembersFilterAdmins) { - _next.hide(); - _cancel.hide(); - } else if (_inner.chat() && _inner.membersFilter() == MembersFilterAdmins) { - connect(&_next, SIGNAL(clicked()), this, SLOT(onSaveAdmins())); - _bottomShadow = new ScrollableBoxShadow(this); - } else if (_inner.chat() || _inner.channel()) { - connect(&_next, SIGNAL(clicked()), this, SLOT(onInvite())); - _bottomShadow = new ScrollableBoxShadow(this); - } else if (_inner.creating() != CreatingGroupNone) { - connect(&_next, SIGNAL(clicked()), this, SLOT(onCreate())); - _bottomShadow = new ScrollableBoxShadow(this); - } else { - _next.hide(); - _cancel.hide(); - } - connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); - connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); - connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); - connect(&_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); - connect(&_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); - connect(&_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); - connect(&_inner, SIGNAL(selectAllQuery()), &_filter, SLOT(selectAll())); - connect(&_inner, SIGNAL(searchByUsername()), this, SLOT(onNeedSearchByUsername())); - connect(&_inner, SIGNAL(adminAdded()), this, SIGNAL(adminAdded())); - - _filterCancel.setAttribute(Qt::WA_OpaquePaintEvent); - - _searchTimer.setSingleShot(true); - connect(&_searchTimer, SIGNAL(timeout()), this, SLOT(onSearchByUsername())); - - prepare(); -} - -bool ContactsBox::onSearchByUsername(bool searchCache) { - QString q = _filter.getLastText().trimmed(); - if (q.isEmpty()) { - if (_peopleRequest) { - _peopleRequest = 0; - } - return true; - } - if (q.size() >= MinUsernameLength) { - if (searchCache) { - PeopleCache::const_iterator i = _peopleCache.constFind(q); - if (i != _peopleCache.cend()) { - _peopleQuery = q; - _peopleRequest = 0; - peopleReceived(i.value(), 0); - return true; - } - } else if (_peopleQuery != q) { - _peopleQuery = q; - _peopleFull = false; - _peopleRequest = MTP::send(MTPcontacts_Search(MTP_string(_peopleQuery), MTP_int(SearchPeopleLimit)), rpcDone(&ContactsBox::peopleReceived), rpcFail(&ContactsBox::peopleFailed)); - _peopleQueries.insert(_peopleRequest, _peopleQuery); - } - } - return false; -} - -void ContactsBox::onNeedSearchByUsername() { - if (!onSearchByUsername(true)) { - _searchTimer.start(AutoSearchTimeout); - } -} - -void ContactsBox::peopleReceived(const MTPcontacts_Found &result, mtpRequestId req) { - QString q = _peopleQuery; - - PeopleQueries::iterator i = _peopleQueries.find(req); - if (i != _peopleQueries.cend()) { - q = i.value(); - _peopleCache[q] = result; - _peopleQueries.erase(i); - } - - if (_peopleRequest == req) { - switch (result.type()) { - case mtpc_contacts_found: { - App::feedUsers(result.c_contacts_found().vusers); - App::feedChats(result.c_contacts_found().vchats); - _inner.peopleReceived(q, result.c_contacts_found().vresults.c_vector().v); - } break; - } - - _peopleRequest = 0; - _inner.updateSel(); - onScroll(); - } -} - -bool ContactsBox::peopleFailed(const RPCError &error, mtpRequestId req) { - if (MTP::isDefaultHandledError(error)) return false; - - if (_peopleRequest == req) { - _peopleRequest = 0; - _peopleFull = true; - } - return true; -} - -void ContactsBox::showAll() { - _filter.show(); - if (_filter.getLastText().isEmpty()) { - _filterCancel.hide(); - } else { - _filterCancel.show(); - } - if (_inner.channel() && _inner.membersFilter() == MembersFilterAdmins) { - _next.hide(); - _cancel.hide(); - } else if (_inner.chat() || _inner.channel()) { - _next.show(); - _cancel.show(); - } else if (_inner.creating() != CreatingGroupNone) { - _next.show(); - _cancel.show(); - } else { - _next.hide(); - _cancel.hide(); - } - _topShadow.show(); - if (_bottomShadow) _bottomShadow->show(); - ItemListBox::showAll(); -} - -void ContactsBox::doSetInnerFocus() { - _filter.setFocus(); -} - -void ContactsBox::onSubmit() { - _inner.chooseParticipant(); -} - -void ContactsBox::keyPressEvent(QKeyEvent *e) { - if (_filter.hasFocus()) { - if (e->key() == Qt::Key_Down) { - _inner.selectSkip(1); - } else if (e->key() == Qt::Key_Up) { - _inner.selectSkip(-1); - } else if (e->key() == Qt::Key_PageDown) { - _inner.selectSkipPage(scrollArea()->height(), 1); - } else if (e->key() == Qt::Key_PageUp) { - _inner.selectSkipPage(scrollArea()->height(), -1); - } else { - ItemListBox::keyPressEvent(e); - } - } else { - ItemListBox::keyPressEvent(e); - } -} - -void ContactsBox::paintEvent(QPaintEvent *e) { - Painter p(this); - if (paint(p)) return; - - bool addingAdmin = _inner.channel() && _inner.membersFilter() == MembersFilterAdmins; - if (_inner.chat() && _inner.membersFilter() == MembersFilterAdmins) { - paintTitle(p, lang(lng_channel_admins)); - } else if (_inner.chat() || _inner.creating() != CreatingGroupNone) { - QString title(lang(addingAdmin ? lng_channel_add_admin : lng_profile_add_participant)); - QString additional((addingAdmin || (_inner.channel() && !_inner.channel()->isMegagroup())) ? QString() : QString("%1 / %2").arg(_inner.selectedCount()).arg(Global::MegagroupSizeMax())); - paintTitle(p, title, additional); - } else if (_inner.sharingBotGame()) { - paintTitle(p, lang(lng_bot_choose_chat)); - } else if (_inner.bot()) { - paintTitle(p, lang(lng_bot_choose_group)); - } else { - paintTitle(p, lang(lng_contacts_header)); - } -} - -void ContactsBox::resizeEvent(QResizeEvent *e) { - ItemListBox::resizeEvent(e); - _filter.resize(width(), _filter.height()); - _filter.moveToLeft(0, st::boxTitleHeight); - _filterCancel.moveToRight(0, st::boxTitleHeight); - _inner.resize(width(), _inner.height()); - _next.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _next.height()); - _cancel.moveToRight(st::boxButtonPadding.right() + _next.width() + st::boxButtonPadding.left(), _next.y()); - _topShadow.setGeometry(0, st::boxTitleHeight + _filter.height(), width(), st::lineWidth); - if (_bottomShadow) _bottomShadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _next.height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); -} - -void ContactsBox::closePressed() { - if (_inner.channel() && !_inner.hasAlreadyMembersInChannel()) { - Ui::showPeerHistory(_inner.channel(), ShowAtTheEndMsgId); - } -} - -void ContactsBox::onFilterCancel() { - _filter.setText(QString()); -} - -void ContactsBox::onFilterUpdate() { - scrollArea()->scrollToY(0); - if (_filter.getLastText().isEmpty()) { - _filterCancel.hide(); - } else { - _filterCancel.show(); - } - _inner.updateFilter(_filter.getLastText()); -} - -void ContactsBox::onChosenChanged() { - update(); -} - -void ContactsBox::onInvite() { - QVector users(_inner.selected()); - if (users.isEmpty()) { - _filter.setFocus(); - _filter.showError(); - return; - } - - App::main()->addParticipants(_inner.chat() ? (PeerData*)_inner.chat() : _inner.channel(), users); - if (_inner.chat()) { - Ui::hideLayer(); - Ui::showPeerHistory(_inner.chat(), ShowAtTheEndMsgId); - } else { - onClose(); - } -} - -void ContactsBox::onCreate() { - if (_saveRequestId) return; - - MTPVector users(MTP_vector(_inner.selectedInputs())); - const auto &v(users.c_vector().v); - if (v.isEmpty() || (v.size() == 1 && v.at(0).type() == mtpc_inputUserSelf)) { - _filter.setFocus(); - _filter.showError(); - return; - } - _saveRequestId = MTP::send(MTPmessages_CreateChat(MTP_vector(v), MTP_string(_creationName)), rpcDone(&ContactsBox::creationDone), rpcFail(&ContactsBox::creationFail)); -} - -void ContactsBox::onSaveAdmins() { - if (_saveRequestId) return; - - _inner.saving(true); - _saveRequestId = MTP::send(MTPmessages_ToggleChatAdmins(_inner.chat()->inputChat, MTP_bool(!_inner.allAdmins())), rpcDone(&ContactsBox::saveAdminsDone), rpcFail(&ContactsBox::saveAdminsFail)); -} - -void ContactsBox::saveAdminsDone(const MTPUpdates &result) { - App::main()->sentUpdatesReceived(result); - saveSelectedAdmins(); -} - -void ContactsBox::saveSelectedAdmins() { - if (_inner.allAdmins() && !_inner.chat()->participants.isEmpty()) { - onClose(); - } else { - _saveRequestId = MTP::send(MTPmessages_GetFullChat(_inner.chat()->inputChat), rpcDone(&ContactsBox::getAdminsDone), rpcFail(&ContactsBox::saveAdminsFail)); - } -} - -void ContactsBox::getAdminsDone(const MTPmessages_ChatFull &result) { - App::api()->processFullPeer(_inner.chat(), result); - if (_inner.allAdmins()) { - onClose(); - return; - } - ChatData::Admins curadmins = _inner.chat()->admins; - QVector newadmins = _inner.selected(), appoint; - if (!newadmins.isEmpty()) { - appoint.reserve(newadmins.size()); - for (int32 i = 0, l = newadmins.size(); i < l; ++i) { - ChatData::Admins::iterator c = curadmins.find(newadmins.at(i)); - if (c == curadmins.cend()) { - if (newadmins.at(i)->id != peerFromUser(_inner.chat()->creator)) { - appoint.push_back(newadmins.at(i)); - } - } else { - curadmins.erase(c); - } - } - } - _saveRequestId = 0; - - for_const (UserData *user, curadmins) { - MTP::send(MTPmessages_EditChatAdmin(_inner.chat()->inputChat, user->inputUser, MTP_boolFalse()), rpcDone(&ContactsBox::removeAdminDone, user), rpcFail(&ContactsBox::editAdminFail), 0, 10); - } - for_const (UserData *user, appoint) { - MTP::send(MTPmessages_EditChatAdmin(_inner.chat()->inputChat, user->inputUser, MTP_boolTrue()), rpcDone(&ContactsBox::setAdminDone, user), rpcFail(&ContactsBox::editAdminFail), 0, 10); - } - MTP::sendAnything(); - - _saveRequestId = curadmins.size() + appoint.size(); - if (!_saveRequestId) { - onClose(); - } -} - -void ContactsBox::setAdminDone(UserData *user, const MTPBool &result) { - if (mtpIsTrue(result)) { - if (_inner.chat()->noParticipantInfo()) { - App::api()->requestFullPeer(_inner.chat()); - } else { - _inner.chat()->admins.insert(user); - } - } - --_saveRequestId; - if (!_saveRequestId) { - emit App::main()->peerUpdated(_inner.chat()); - onClose(); - } -} - -void ContactsBox::removeAdminDone(UserData *user, const MTPBool &result) { - if (mtpIsTrue(result)) { - _inner.chat()->admins.remove(user); - } - --_saveRequestId; - if (!_saveRequestId) { - emit App::main()->peerUpdated(_inner.chat()); - onClose(); - } -} - -bool ContactsBox::saveAdminsFail(const RPCError &error) { - if (MTP::isDefaultHandledError(error)) return true; - _saveRequestId = 0; - _inner.saving(false); - if (error.type() == qstr("CHAT_NOT_MODIFIED")) { - saveSelectedAdmins(); - } - return false; -} - -bool ContactsBox::editAdminFail(const RPCError &error) { - if (MTP::isDefaultHandledError(error)) return true; - --_saveRequestId; - _inner.chat()->invalidateParticipants(); - if (!_saveRequestId) { - if (error.type() == qstr("USER_RESTRICTED")) { - Ui::showLayer(new InformBox(lang(lng_cant_do_this))); - return true; - } - onClose(); - } - return false; -} - -void ContactsBox::onScroll() { - _inner.loadProfilePhotos(scrollArea()->scrollTop()); -} - -void ContactsBox::creationDone(const MTPUpdates &updates) { - Ui::hideLayer(); - - App::main()->sentUpdatesReceived(updates); - const QVector *v = 0; - switch (updates.type()) { - case mtpc_updates: v = &updates.c_updates().vchats.c_vector().v; break; - case mtpc_updatesCombined: v = &updates.c_updatesCombined().vchats.c_vector().v; break; - default: LOG(("API Error: unexpected update cons %1 (ContactsBox::creationDone)").arg(updates.type())); break; - } - - PeerData *peer = 0; - if (v && !v->isEmpty() && v->front().type() == mtpc_chat) { - peer = App::chat(v->front().c_chat().vid.v); - if (peer) { - if (!_creationPhoto.isNull()) { - App::app()->uploadProfilePhoto(_creationPhoto, peer->id); - } - Ui::showPeerHistory(peer, ShowAtUnreadMsgId); - } - } else { - LOG(("API Error: chat not found in updates (ContactsBox::creationDone)")); - } -} - -bool ContactsBox::creationFail(const RPCError &error) { - if (MTP::isDefaultHandledError(error)) return false; - - _saveRequestId = 0; - if (error.type() == "NO_CHAT_TITLE") { - onClose(); - return true; - } else if (error.type() == "USERS_TOO_FEW") { - _filter.setFocus(); - _filter.showError(); - return true; - } else if (error.type() == "PEER_FLOOD") { - Ui::showLayer(new InformBox(cantInviteError()), KeepOtherLayers); - return true; - } else if (error.type() == qstr("USER_RESTRICTED")) { - Ui::showLayer(new InformBox(lang(lng_cant_do_this))); - return true; - } - return false; -} - -MembersInner::MembersInner(ChannelData *channel, MembersFilter filter) : TWidget() -, _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) -, _newItemHeight((channel->amCreator() && (channel->membersCount() < (channel->isMegagroup() ? Global::MegagroupSizeMax() : Global::ChatSizeMax()) || (!channel->isMegagroup() && !channel->isPublic()) || filter == MembersFilterAdmins)) ? st::contactsNewItemHeight : 0) -, _newItemSel(false) -, _channel(channel) -, _filter(filter) -, _kickText(lang(lng_profile_kick)) -, _time(0) -, _kickWidth(st::normalFont->width(_kickText)) -, _sel(-1) -, _kickSel(-1) -, _kickDown(-1) -, _mouseSel(false) -, _kickConfirm(0) -, _kickRequestId(0) -, _kickBox(0) -, _loading(true) -, _loadingRequestId(0) -, _aboutWidth(st::boxWideWidth - st::contactsPadding.left() - st::contactsPadding.right()) -, _about(_aboutWidth) -, _aboutHeight(0) { - subscribe(FileDownload::ImageLoaded(), [this] { update(); }); - - connect(App::main(), SIGNAL(peerNameChanged(PeerData*,const PeerData::Names&,const PeerData::NameFirstChars&)), this, SLOT(onPeerNameChanged(PeerData*, const PeerData::Names&, const PeerData::NameFirstChars&))); - connect(App::main(), SIGNAL(peerPhotoChanged(PeerData*)), this, SLOT(peerUpdated(PeerData*))); - - refresh(); - - load(); -} - -void MembersInner::load() { - if (!_loadingRequestId) { - _loadingRequestId = MTP::send(MTPchannels_GetParticipants(_channel->inputChannel, (_filter == MembersFilterRecent) ? MTP_channelParticipantsRecent() : MTP_channelParticipantsAdmins(), MTP_int(0), MTP_int(Global::ChatSizeMax())), rpcDone(&MembersInner::membersReceived), rpcFail(&MembersInner::membersFailed)); - } -} - -void MembersInner::paintEvent(QPaintEvent *e) { - QRect r(e->rect()); - Painter p(this); - - _time = unixtime(); - p.fillRect(r, st::white->b); - - int32 yFrom = r.y() - st::membersPadding.top(), yTo = r.y() + r.height() - st::membersPadding.top(); - p.translate(0, st::membersPadding.top()); - if (_rows.isEmpty()) { - p.setFont(st::noContactsFont->f); - p.setPen(st::noContactsColor->p); - p.drawText(QRect(0, 0, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); - } else { - if (_newItemHeight) { - p.fillRect(0, 0, width(), _newItemHeight, (_newItemSel ? st::contactsBgOver : st::white)->b); - p.drawSpriteLeft(st::contactsNewItemIconPosition.x(), st::contactsNewItemIconPosition.y(), width(), st::contactsNewItemIcon); - p.setFont(st::contactsNameFont); - p.setPen(st::contactsNewItemFg); - p.drawTextLeft(st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(), st::contactsNewItemTop, width(), lang(_filter == MembersFilterAdmins ? lng_channel_add_admins : lng_channel_add_members)); - - yFrom -= _newItemHeight; - yTo -= _newItemHeight; - p.translate(0, _newItemHeight); - } - int32 from = floorclamp(yFrom, _rowHeight, 0, _rows.size()); - int32 to = ceilclamp(yTo, _rowHeight, 0, _rows.size()); - p.translate(0, from * _rowHeight); - for (; from < to; ++from) { - bool sel = (from == _sel); - bool kickSel = (from == _kickSel && (_kickDown < 0 || from == _kickDown)); - bool kickDown = kickSel && (from == _kickDown); - paintDialog(p, _rows[from], data(from), sel, kickSel, kickDown); - p.translate(0, _rowHeight); - } - if (to == _rows.size() && _filter == MembersFilterRecent && (_rows.size() < _channel->membersCount() || _rows.size() >= Global::ChatSizeMax())) { - p.setPen(st::stickersReorderFg); - _about.draw(p, st::contactsPadding.left(), st::stickersReorderPadding.top(), _aboutWidth, style::al_center); - } - } -} - -void MembersInner::enterEvent(QEvent *e) { - setMouseTracking(true); -} - -void MembersInner::leaveEvent(QEvent *e) { - _mouseSel = false; - setMouseTracking(false); - if (_sel >= 0) { - clearSel(); - } -} - -void MembersInner::mouseMoveEvent(QMouseEvent *e) { - _mouseSel = true; - _lastMousePos = e->globalPos(); - updateSel(); -} - -void MembersInner::mousePressEvent(QMouseEvent *e) { - _mouseSel = true; - _lastMousePos = e->globalPos(); - updateSel(); - if (e->button() == Qt::LeftButton && _kickSel < 0) { - chooseParticipant(); - } - _kickDown = _kickSel; - update(); -} - -void MembersInner::mouseReleaseEvent(QMouseEvent *e) { - _mouseSel = true; - _lastMousePos = e->globalPos(); - updateSel(); - if (_kickDown >= 0 && _kickDown == _kickSel && !_kickRequestId) { - _kickConfirm = _rows.at(_kickSel); - if (_kickBox) _kickBox->deleteLater(); - _kickBox = new ConfirmBox((_filter == MembersFilterRecent ? (_channel->isMegagroup() ? lng_profile_sure_kick : lng_profile_sure_kick_channel) : lng_profile_sure_kick_admin)(lt_user, _kickConfirm->firstName)); - connect(_kickBox, SIGNAL(confirmed()), this, SLOT(onKickConfirm())); - connect(_kickBox, SIGNAL(destroyed(QObject*)), this, SLOT(onKickBoxDestroyed(QObject*))); - Ui::showLayer(_kickBox, KeepOtherLayers); - } - _kickDown = -1; -} - -void MembersInner::onKickBoxDestroyed(QObject *obj) { - if (_kickBox == obj) { - _kickBox = 0; - } -} - -void MembersInner::onKickConfirm() { - if (_filter == MembersFilterRecent) { - _kickRequestId = MTP::send(MTPchannels_KickFromChannel(_channel->inputChannel, _kickConfirm->inputUser, MTP_bool(true)), rpcDone(&MembersInner::kickDone), rpcFail(&MembersInner::kickFail)); - } else { - _kickRequestId = MTP::send(MTPchannels_EditAdmin(_channel->inputChannel, _kickConfirm->inputUser, MTP_channelRoleEmpty()), rpcDone(&MembersInner::kickAdminDone), rpcFail(&MembersInner::kickFail)); - } -} - -void MembersInner::paintDialog(Painter &p, PeerData *peer, MemberData *data, bool sel, bool kickSel, bool kickDown) { - UserData *user = peer->asUser(); - - p.fillRect(0, 0, width(), _rowHeight, (sel ? st::contactsBgOver : st::white)->b); - peer->paintUserpicLeft(p, st::contactsPhotoSize, st::contactsPadding.left(), st::contactsPadding.top(), width()); - - p.setPen(st::black); - - int32 namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); - int32 namew = width() - namex - st::contactsPadding.right() - (data->canKick ? (_kickWidth + st::contactsCheckPosition.x() * 2) : 0); - if (peer->isVerified()) { - auto icon = &st::dialogsVerifiedIcon; - namew -= icon->width(); - icon->paint(p, namex + qMin(data->name.maxWidth(), namew), st::contactsPadding.top() + st::contactsNameTop, width()); - } - data->name.drawLeftElided(p, namex, st::contactsPadding.top() + st::contactsNameTop, namew, width()); - - if (data->canKick) { - p.setFont((kickSel ? st::linkOverFont : st::linkFont)->f); - if (kickDown) { - p.setPen(st::btnDefLink.downColor->p); - } else { - p.setPen(st::btnDefLink.color->p); - } - p.drawTextRight(st::contactsPadding.right() + st::contactsCheckPosition.x(), st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, width(), _kickText, _kickWidth); - } - - p.setFont(st::contactsStatusFont->f); - p.setPen(data->onlineColor ? st::contactsStatusFgOnline : (sel ? st::contactsStatusFgOver : st::contactsStatusFg)); - p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsStatusTop, width(), data->online); -} - -void MembersInner::selectSkip(int32 dir) { - _time = unixtime(); - _mouseSel = false; - - int cur = -1; - if (_newItemHeight && _newItemSel) { - cur = 0; - } else if (_sel >= 0) { - cur = _sel + (_newItemHeight ? 1 : 0); - } - cur += dir; - if (cur <= 0) { - _newItemSel = _newItemHeight ? true : false; - _sel = (_newItemSel || _rows.isEmpty()) ? -1 : 0; - } else if (cur >= _rows.size() + (_newItemHeight ? 1 : 0)) { - _sel = -1; - } else { - _sel = cur - (_newItemHeight ? 1 : 0); - } - if (dir > 0) { - if (_sel < 0 || _sel >= _rows.size()) { - _sel = -1; - } - } else { - if (!_rows.isEmpty()) { - if (_sel < 0 && !_newItemSel) _sel = _rows.size() - 1; - } - } - if (_newItemSel) { - emit mustScrollTo(0, _newItemHeight); - } else if (_sel >= 0) { - emit mustScrollTo(_newItemHeight + _sel * _rowHeight, _newItemHeight + (_sel + 1) * _rowHeight); - } - - update(); -} - -void MembersInner::selectSkipPage(int32 h, int32 dir) { - int32 points = h / _rowHeight; - if (!points) return; - selectSkip(points * dir); -} - -void MembersInner::loadProfilePhotos(int32 yFrom) { - int32 yTo = yFrom + (parentWidget() ? parentWidget()->height() : App::wnd()->height()) * 5; - MTP::clearLoaderPriorities(); - - if (yTo < 0) return; - if (yFrom < 0) yFrom = 0; - - if (!_rows.isEmpty()) { - int32 from = (yFrom - _newItemHeight) / _rowHeight; - if (from < 0) from = 0; - if (from < _rows.size()) { - int32 to = ((yTo - _newItemHeight) / _rowHeight) + 1; - if (to > _rows.size()) to = _rows.size(); - - for (; from < to; ++from) { - _rows[from]->loadUserpic(); - } - } - } -} - -void MembersInner::chooseParticipant() { - if (_newItemSel) { - emit addRequested(); - return; - } - if (_sel < 0 || _sel >= _rows.size()) return; - if (PeerData *peer = _rows[_sel]) { - Ui::hideLayer(); - Ui::showPeerProfile(peer); - } -} - -void MembersInner::refresh() { - if (_rows.isEmpty()) { - resize(width(), st::membersPadding.top() + st::noContactsHeight + st::membersPadding.bottom()); - _aboutHeight = 0; - } else { - _about.setText(st::boxTextFont, lng_channel_only_last_shown(lt_count, _rows.size())); - _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); - if (_filter != MembersFilterRecent || (_rows.size() >= _channel->membersCount() && _rows.size() < Global::ChatSizeMax())) { - _aboutHeight = 0; - } - resize(width(), st::membersPadding.top() + _newItemHeight + _rows.size() * _rowHeight + st::membersPadding.bottom() + _aboutHeight); - } - update(); -} - -ChannelData *MembersInner::channel() const { - return _channel; -} - -MembersFilter MembersInner::filter() const { - return _filter; -} - -MembersAlreadyIn MembersInner::already() const { - MembersAlreadyIn result; - for_const (auto peer, _rows) { - if (peer->isUser()) { - result.insert(peer->asUser()); - } - } - return result; -} - -void MembersInner::clearSel() { - updateSelectedRow(); - _newItemSel = false; - _sel = _kickSel = _kickDown = -1; - _lastMousePos = QCursor::pos(); - updateSel(); -} - -MembersInner::MemberData *MembersInner::data(int32 index) { - if (MemberData *result = _datas.at(index)) { - return result; - } - MemberData *result = _datas[index] = new MemberData(); - result->name.setText(st::contactsNameFont, _rows[index]->name, _textNameOptions); - int32 t = unixtime(); - result->online = App::onlineText(_rows[index], t);// lng_mediaview_date_time(lt_date, _dates[index].date().toString(qsl("dd.MM.yy")), lt_time, _dates[index].time().toString(cTimeFormat())); - result->onlineColor = App::onlineColorUse(_rows[index], t); - if (_filter == MembersFilterRecent) { - result->canKick = (_channel->amCreator() || _channel->amEditor() || _channel->amModerator()) ? (_roles[index] == MemberRoleNone) : false; - } else if (_filter == MembersFilterAdmins) { - result->canKick = _channel->amCreator() ? (_roles[index] == MemberRoleEditor || _roles[index] == MemberRoleModerator) : false; - } else { - result->canKick = false; - } - return result; -} - -void MembersInner::clear() { - for (int32 i = 0, l = _datas.size(); i < l; ++i) { - delete _datas.at(i); - } - _datas.clear(); - _rows.clear(); - _dates.clear(); - _roles.clear(); - if (_kickBox) _kickBox->deleteLater(); - clearSel(); -} - -MembersInner::~MembersInner() { - clear(); -} - -void MembersInner::updateSel() { - if (!_mouseSel) return; - - QPoint p(mapFromGlobal(_lastMousePos)); - p.setY(p.y() - st::membersPadding.top()); - bool in = parentWidget()->rect().contains(parentWidget()->mapFromGlobal(_lastMousePos)); - bool newItemSel = (in && p.y() >= 0 && p.y() < _newItemHeight); - int32 newSel = (in && !newItemSel && p.y() >= _newItemHeight && p.y() < _newItemHeight + _rows.size() * _rowHeight) ? ((p.y() - _newItemHeight) / _rowHeight) : -1; - int32 newKickSel = newSel; - if (newSel >= 0 && (!data(newSel)->canKick || !QRect(width() - _kickWidth - st::contactsPadding.right() - st::contactsCheckPosition.x(), _newItemHeight + newSel * _rowHeight + st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, _kickWidth, st::normalFont->height).contains(p))) { - newKickSel = -1; - } - if (newSel != _sel || newKickSel != _kickSel || newItemSel != _newItemSel) { - updateSelectedRow(); - _newItemSel = newItemSel; - _sel = newSel; - _kickSel = newKickSel; - updateSelectedRow(); - setCursor(_kickSel >= 0 ? style::cur_pointer : style::cur_default); - } -} - -void MembersInner::peerUpdated(PeerData *peer) { - update(); -} - -void MembersInner::updateSelectedRow() { - if (_newItemSel) { - update(0, st::membersPadding.top(), width(), _newItemHeight); - } - if (_sel >= 0) { - update(0, st::membersPadding.top() + _newItemHeight + _sel * _rowHeight, width(), _rowHeight); - } -} - -void MembersInner::onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars) { - for (int32 i = 0, l = _rows.size(); i < l; ++i) { - if (_rows.at(i) == peer) { - if (_datas.at(i)) { - _datas.at(i)->name.setText(st::contactsNameFont, peer->name, _textNameOptions); - update(0, st::membersPadding.top() + i * _rowHeight, width(), _rowHeight); - } else { - break; - } - } - } -} - -void MembersInner::membersReceived(const MTPchannels_ChannelParticipants &result, mtpRequestId req) { - clear(); - _loadingRequestId = 0; - - if (result.type() == mtpc_channels_channelParticipants) { - const auto &d(result.c_channels_channelParticipants()); - const auto &v(d.vparticipants.c_vector().v); - _rows.reserve(v.size()); - _datas.reserve(v.size()); - _dates.reserve(v.size()); - _roles.reserve(v.size()); - - if (_filter == MembersFilterRecent && _channel->membersCount() < d.vcount.v) { - _channel->setMembersCount(d.vcount.v); - if (App::main()) emit App::main()->peerUpdated(_channel); - } else if (_filter == MembersFilterAdmins && _channel->adminsCount() < d.vcount.v) { - _channel->setAdminsCount(d.vcount.v); - if (App::main()) emit App::main()->peerUpdated(_channel); - } - App::feedUsers(d.vusers); - - for (QVector::const_iterator i = v.cbegin(), e = v.cend(); i != e; ++i) { - int32 userId = 0, addedTime = 0; - MemberRole role = MemberRoleNone; - switch (i->type()) { - case mtpc_channelParticipant: - userId = i->c_channelParticipant().vuser_id.v; - addedTime = i->c_channelParticipant().vdate.v; - break; - case mtpc_channelParticipantSelf: - role = MemberRoleSelf; - userId = i->c_channelParticipantSelf().vuser_id.v; - addedTime = i->c_channelParticipantSelf().vdate.v; - break; - case mtpc_channelParticipantModerator: - role = MemberRoleModerator; - userId = i->c_channelParticipantModerator().vuser_id.v; - addedTime = i->c_channelParticipantModerator().vdate.v; - break; - case mtpc_channelParticipantEditor: - role = MemberRoleEditor; - userId = i->c_channelParticipantEditor().vuser_id.v; - addedTime = i->c_channelParticipantEditor().vdate.v; - break; - case mtpc_channelParticipantKicked: - userId = i->c_channelParticipantKicked().vuser_id.v; - addedTime = i->c_channelParticipantKicked().vdate.v; - role = MemberRoleKicked; - break; - case mtpc_channelParticipantCreator: - userId = i->c_channelParticipantCreator().vuser_id.v; - addedTime = _channel->date; - role = MemberRoleCreator; - break; - } - if (UserData *user = App::userLoaded(userId)) { - _rows.push_back(user); - _dates.push_back(date(addedTime)); - _roles.push_back(role); - _datas.push_back(0); - } - } - - // update admins if we got all of them - if (_filter == MembersFilterAdmins && _channel->isMegagroup() && _rows.size() < Global::ChatSizeMax()) { - _channel->mgInfo->lastAdmins.clear(); - for (int32 i = 0, l = _rows.size(); i != l; ++i) { - if (_roles.at(i) == MemberRoleCreator || _roles.at(i) == MemberRoleEditor) { - _channel->mgInfo->lastAdmins.insert(_rows.at(i)); - } - } - - Notify::peerUpdatedDelayed(_channel, Notify::PeerUpdate::Flag::AdminsChanged); - } - } - if (_rows.isEmpty()) { - _rows.push_back(App::self()); - _dates.push_back(date(MTP_int(_channel->date))); - _roles.push_back(MemberRoleSelf); - _datas.push_back(0); - } - - clearSel(); - _loading = false; - refresh(); - - emit loaded(); -} - -bool MembersInner::membersFailed(const RPCError &error, mtpRequestId req) { - if (MTP::isDefaultHandledError(error)) return false; - - Ui::hideLayer(); - return true; -} - -void MembersInner::kickDone(const MTPUpdates &result, mtpRequestId req) { - App::main()->sentUpdatesReceived(result); - - if (_kickRequestId != req) return; - removeKicked(); - if (_kickBox) _kickBox->onClose(); -} - -void MembersInner::kickAdminDone(const MTPUpdates &result, mtpRequestId req) { - if (_kickRequestId != req) return; - if (App::main()) App::main()->sentUpdatesReceived(result); - removeKicked(); - if (_kickBox) _kickBox->onClose(); -} - -bool MembersInner::kickFail(const RPCError &error, mtpRequestId req) { - if (MTP::isDefaultHandledError(error)) return false; - - if (_kickBox) _kickBox->onClose(); - load(); - return true; -} - -void MembersInner::removeKicked() { - _kickRequestId = 0; - int32 index = _rows.indexOf(_kickConfirm); - if (index >= 0) { - _rows.removeAt(index); - delete _datas.at(index); - _datas.removeAt(index); - _dates.removeAt(index); - _roles.removeAt(index); - clearSel(); - if (_filter == MembersFilterRecent && _channel->membersCount() > 1) { - _channel->setMembersCount(_channel->membersCount() - 1); - if (App::main()) emit App::main()->peerUpdated(_channel); - } else if (_filter == MembersFilterAdmins && _channel->adminsCount() > 1) { - _channel->setAdminsCount(_channel->adminsCount() - 1); - if (App::main()) emit App::main()->peerUpdated(_channel); - } - refresh(); - } - _kickConfirm = 0; -} - -MembersBox::MembersBox(ChannelData *channel, MembersFilter filter) : ItemListBox(st::boxScroll) -, _inner(channel, filter) -, _addBox(0) { - ItemListBox::init(&_inner); - - connect(&_inner, SIGNAL(addRequested()), this, SLOT(onAdd())); - - connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); - connect(&_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); - connect(&_inner, SIGNAL(loaded()), this, SLOT(onLoaded())); - - connect(&_loadTimer, SIGNAL(timeout()), &_inner, SLOT(load())); - - prepare(); -} - -void MembersBox::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Down) { - _inner.selectSkip(1); - } else if (e->key() == Qt::Key_Up) { - _inner.selectSkip(-1); - } else if (e->key() == Qt::Key_PageDown) { - _inner.selectSkipPage(scrollArea()->height(), 1); - } else if (e->key() == Qt::Key_PageUp) { - _inner.selectSkipPage(scrollArea()->height(), -1); - } else { - ItemListBox::keyPressEvent(e); - } -} - -void MembersBox::paintEvent(QPaintEvent *e) { - Painter p(this); - if (paint(p)) return; - - QString title(lang(_inner.filter() == MembersFilterRecent ? lng_channel_members : lng_channel_admins)); - paintTitle(p, title); -} - -void MembersBox::resizeEvent(QResizeEvent *e) { - ItemListBox::resizeEvent(e); - _inner.resize(width(), _inner.height()); -} - -void MembersBox::onScroll() { - _inner.loadProfilePhotos(scrollArea()->scrollTop()); -} - -void MembersBox::onAdd() { - if (_inner.filter() == MembersFilterRecent && _inner.channel()->membersCount() >= (_inner.channel()->isMegagroup() ? Global::MegagroupSizeMax() : Global::ChatSizeMax())) { - Ui::showLayer(new MaxInviteBox(_inner.channel()->inviteLink()), KeepOtherLayers); - return; - } - ContactsBox *box = new ContactsBox(_inner.channel(), _inner.filter(), _inner.already()); - if (_inner.filter() == MembersFilterRecent) { - Ui::showLayer(box); - } else { - _addBox = box; - connect(_addBox, SIGNAL(adminAdded()), this, SLOT(onAdminAdded())); - Ui::showLayer(_addBox, KeepOtherLayers); - } -} - -void MembersBox::onAdminAdded() { - if (!_addBox) return; - _addBox->onClose(); - _addBox = 0; - _loadTimer.start(ReloadChannelMembersTimeout); -} diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 6f81ccf4e..4315a002d 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -23,186 +23,24 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "abstractbox.h" #include "core/single_timer.h" #include "ui/effects/round_image_checkbox.h" +#include "boxes/members_box.h" namespace Dialogs { class Row; class IndexedList; } // namespace Dialogs -enum MembersFilter { - MembersFilterRecent, - MembersFilterAdmins, -}; -using MembersAlreadyIn = OrderedSet; +namespace Ui { +class IconButton; +} // namespace Ui QString cantInviteError(); -class ConfirmBox; -class ContactsInner : public TWidget, public RPCSender, private base::Subscriber { - Q_OBJECT - -private: - struct ContactData; - -public: - ContactsInner(CreatingGroupType creating = CreatingGroupNone); - ContactsInner(ChannelData *channel, MembersFilter membersFilter, const MembersAlreadyIn &already); - ContactsInner(ChatData *chat, MembersFilter membersFilter); - ContactsInner(UserData *bot); - void init(); - void initList(); - - void updateFilter(QString filter = QString()); - - void selectSkip(int32 dir); - void selectSkipPage(int32 h, int32 dir); - - QVector selected(); - QVector selectedInputs(); - bool allAdmins() const { - return _allAdmins.checked(); - } - - void loadProfilePhotos(int32 yFrom); - void chooseParticipant(); - void changeCheckState(Dialogs::Row *row); - void changeCheckState(ContactData *data, PeerData *peer); - - void peopleReceived(const QString &query, const QVector &people); - - void refresh(); - - ChatData *chat() const; - ChannelData *channel() const; - MembersFilter membersFilter() const; - UserData *bot() const; - CreatingGroupType creating() const; - - bool sharingBotGame() const; - - int32 selectedCount() const; - bool hasAlreadyMembersInChannel() const { - return !_already.isEmpty(); - } - - void saving(bool flag); - - ~ContactsInner(); - -signals: - void mustScrollTo(int ymin, int ymax); - void selectAllQuery(); - void searchByUsername(); - void chosenChanged(); - void adminAdded(); - void addRequested(); - -public slots: - void onDialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow); - - void updateSel(); - void peerUpdated(PeerData *peer); - void onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars); - - void onAddBot(); - void onAddAdmin(); - void onNoAddAdminBox(QObject *obj); - - void onAllAdminsChanged(); - -protected: - void paintEvent(QPaintEvent *e) override; - void enterEvent(QEvent *e) override; - void leaveEvent(QEvent *e) override; - void mouseMoveEvent(QMouseEvent *e) override; - void mousePressEvent(QMouseEvent *e) override; - void resizeEvent(QResizeEvent *e) override; - -private: - void updateRowWithTop(int rowTop); - int getSelectedRowTop() const; - void updateSelectedRow(); - int getRowTopWithPeer(PeerData *peer) const; - void updateRowWithPeer(PeerData *peer); - void addAdminDone(const MTPUpdates &result, mtpRequestId req); - bool addAdminFail(const RPCError &error, mtpRequestId req); - - void paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel); - void paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, int y, int outerWidth) const; - - template - void addDialogsToList(FilterCallback callback); - - bool usingMultiSelect() const { - return (_chat != nullptr) || (_creating != CreatingGroupNone && (!_channel || _membersFilter != MembersFilterAdmins)); - } - - int32 _rowHeight; - int _newItemHeight = 0; - bool _newItemSel = false; - - ChatData *_chat = nullptr; - ChannelData *_channel = nullptr; - MembersFilter _membersFilter = MembersFilterRecent; - UserData *_bot = nullptr; - CreatingGroupType _creating = CreatingGroupNone; - MembersAlreadyIn _already; - - Checkbox _allAdmins; - int32 _aboutWidth; - Text _aboutAllAdmins, _aboutAdmins; - - PeerData *_addToPeer = nullptr; - UserData *_addAdmin = nullptr; - mtpRequestId _addAdminRequestId = 0; - ConfirmBox *_addAdminBox = nullptr; - - int32 _time; - - std_::unique_ptr _customList; - Dialogs::IndexedList *_contacts = nullptr; - Dialogs::Row *_sel = nullptr; - QString _filter; - typedef QVector FilteredDialogs; - FilteredDialogs _filtered; - int _filteredSel = -1; - bool _mouseSel = false; - - int _selCount = 0; - - struct ContactData { - ContactData(); - ContactData(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback); - - std_::unique_ptr checkbox; - Text name; - QString statusText; - bool statusHasOnlineColor = false; - bool disabledChecked = false; +inline Ui::RoundImageCheckbox::PaintRoundImage PaintUserpicCallback(PeerData *peer) { + return [peer](Painter &p, int x, int y, int outerWidth, int size) { + peer->paintUserpicLeft(p, size, x, y, outerWidth); }; - typedef QMap ContactsData; - ContactsData _contactsData; - typedef QMap CheckedContacts; - CheckedContacts _checkedContacts; - - ContactData *contactData(Dialogs::Row *row); - - bool _searching = false; - QString _lastQuery; - typedef QVector ByUsernameRows; - typedef QVector ByUsernameDatas; - ByUsernameRows _byUsername, _byUsernameFiltered; - ByUsernameDatas d_byUsername, d_byUsernameFiltered; // filtered is partly subset of d_byUsername, partly subset of _byUsernameDatas - ByUsernameDatas _byUsernameDatas; - int _byUsernameSel = -1; - - QPoint _lastMousePos; - LinkButton _addContactLnk; - - bool _saving = false; - bool _allAdminsChecked = false; - -}; +} class ContactsBox : public ItemListBox, public RPCSender { Q_OBJECT @@ -245,9 +83,10 @@ protected: private: void init(); - ContactsInner _inner; - InputField _filter; - IconedButton _filterCancel; + class Inner; + ChildWidget _inner; + ChildWidget _filter; + ChildWidget _filterCancel; BoxButton _next, _cancel; MembersFilter _membersFilter; @@ -289,50 +128,74 @@ private: }; -class MembersInner : public TWidget, public RPCSender, private base::Subscriber { +// This class is hold in header because it requires Qt preprocessing. +class ContactsBox::Inner : public ScrolledWidget, public RPCSender, private base::Subscriber { Q_OBJECT -private: - struct MemberData; - public: - MembersInner(ChannelData *channel, MembersFilter filter); + Inner(QWidget *parent, CreatingGroupType creating = CreatingGroupNone); + Inner(QWidget *parent, ChannelData *channel, MembersFilter membersFilter, const MembersAlreadyIn &already); + Inner(QWidget *parent, ChatData *chat, MembersFilter membersFilter); + Inner(QWidget *parent, UserData *bot); - void paintDialog(Painter &p, PeerData *peer, MemberData *data, bool sel, bool kickSel, bool kickDown); + void init(); + void initList(); + + void updateFilter(QString filter = QString()); void selectSkip(int32 dir); void selectSkipPage(int32 h, int32 dir); + QVector selected(); + QVector selectedInputs(); + bool allAdmins() const { + return _allAdmins.checked(); + } + void loadProfilePhotos(int32 yFrom); void chooseParticipant(); + void peopleReceived(const QString &query, const QVector &people); + void refresh(); + ChatData *chat() const; ChannelData *channel() const; - MembersFilter filter() const; + MembersFilter membersFilter() const; + UserData *bot() const; + CreatingGroupType creating() const; - bool isLoaded() const { - return !_loading; + bool sharingBotGame() const; + + int32 selectedCount() const; + bool hasAlreadyMembersInChannel() const { + return !_already.isEmpty(); } - void clearSel(); - MembersAlreadyIn already() const; + void saving(bool flag); - ~MembersInner(); + ~Inner(); signals: void mustScrollTo(int ymin, int ymax); + void selectAllQuery(); + void searchByUsername(); + void chosenChanged(); + void adminAdded(); void addRequested(); - void loaded(); public slots: - void load(); + void onDialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow); void updateSel(); void peerUpdated(PeerData *peer); void onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars); - void onKickConfirm(); - void onKickBoxDestroyed(QObject *obj); + + void onAddBot(); + void onAddAdmin(); + void onNoAddAdminBox(QObject *obj); + + void onAllAdminsChanged(); protected: void paintEvent(QPaintEvent *e) override; @@ -340,102 +203,94 @@ protected: void leaveEvent(QEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void mousePressEvent(QMouseEvent *e) override; - void mouseReleaseEvent(QMouseEvent *e) override; - -private: - void updateSelectedRow(); - MemberData *data(int32 index); - - void membersReceived(const MTPchannels_ChannelParticipants &result, mtpRequestId req); - bool membersFailed(const RPCError &error, mtpRequestId req); - - void kickDone(const MTPUpdates &result, mtpRequestId req); - void kickAdminDone(const MTPUpdates &result, mtpRequestId req); - bool kickFail(const RPCError &error, mtpRequestId req); - void removeKicked(); - - void clear(); - - int32 _rowHeight, _newItemHeight; - bool _newItemSel; - - ChannelData *_channel; - MembersFilter _filter; - - QString _kickText; - int32 _time, _kickWidth; - - int32 _sel, _kickSel, _kickDown; - bool _mouseSel; - - UserData *_kickConfirm; - mtpRequestId _kickRequestId; - - ConfirmBox *_kickBox; - - enum MemberRole { - MemberRoleNone, - MemberRoleSelf, - MemberRoleCreator, - MemberRoleEditor, - MemberRoleModerator, - MemberRoleKicked - }; - - struct MemberData { - Text name; - QString online; - bool onlineColor; - bool canKick; - }; - - bool _loading; - mtpRequestId _loadingRequestId; - typedef QVector MemberRows; - typedef QVector MemberDates; - typedef QVector MemberRoles; - typedef QVector MemberDatas; - MemberRows _rows; - MemberDates _dates; - MemberRoles _roles; - MemberDatas _datas; - - int32 _aboutWidth; - Text _about; - int32 _aboutHeight; - - QPoint _lastMousePos; - -}; - -class MembersBox : public ItemListBox { - Q_OBJECT - -public: - MembersBox(ChannelData *channel, MembersFilter filter); - -public slots: - void onScroll(); - - void onAdd(); - void onAdminAdded(); - -protected: - void keyPressEvent(QKeyEvent *e) override; - void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; private: - MembersInner _inner; + struct ContactData { + ContactData(); + ContactData(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback); - ContactsBox *_addBox; + std_::unique_ptr checkbox; + Text name; + QString statusText; + bool statusHasOnlineColor = false; + bool disabledChecked = false; + }; - SingleTimer _loadTimer; + void updateRowWithTop(int rowTop); + int getSelectedRowTop() const; + void updateSelectedRow(); + int getRowTopWithPeer(PeerData *peer) const; + void updateRowWithPeer(PeerData *peer); + void addAdminDone(const MTPUpdates &result, mtpRequestId req); + bool addAdminFail(const RPCError &error, mtpRequestId req); + + void paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel); + void paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, int y, int outerWidth) const; + + void changeCheckState(Dialogs::Row *row); + void changeCheckState(ContactData *data, PeerData *peer); + + template + void addDialogsToList(FilterCallback callback); + + bool usingMultiSelect() const { + return (_chat != nullptr) || (_creating != CreatingGroupNone && (!_channel || _membersFilter != MembersFilter::Admins)); + } + + int32 _rowHeight; + int _newItemHeight = 0; + bool _newItemSel = false; + + ChatData *_chat = nullptr; + ChannelData *_channel = nullptr; + MembersFilter _membersFilter = MembersFilter::Recent; + UserData *_bot = nullptr; + CreatingGroupType _creating = CreatingGroupNone; + MembersAlreadyIn _already; + + Checkbox _allAdmins; + int32 _aboutWidth; + Text _aboutAllAdmins, _aboutAdmins; + + PeerData *_addToPeer = nullptr; + UserData *_addAdmin = nullptr; + mtpRequestId _addAdminRequestId = 0; + ConfirmBox *_addAdminBox = nullptr; + + int32 _time; + + std_::unique_ptr _customList; + Dialogs::IndexedList *_contacts = nullptr; + Dialogs::Row *_sel = nullptr; + QString _filter; + typedef QVector FilteredDialogs; + FilteredDialogs _filtered; + int _filteredSel = -1; + bool _mouseSel = false; + + int _selCount = 0; + + typedef QMap ContactsData; + ContactsData _contactsData; + typedef QMap CheckedContacts; + CheckedContacts _checkedContacts; + + ContactData *contactData(Dialogs::Row *row); + + bool _searching = false; + QString _lastQuery; + typedef QVector ByUsernameRows; + typedef QVector ByUsernameDatas; + ByUsernameRows _byUsername, _byUsernameFiltered; + ByUsernameDatas d_byUsername, d_byUsernameFiltered; // filtered is partly subset of d_byUsername, partly subset of _byUsernameDatas + ByUsernameDatas _byUsernameDatas; + int _byUsernameSel = -1; + + QPoint _lastMousePos; + LinkButton _addContactLnk; + + bool _saving = false; + bool _allAdminsChecked = false; }; - -inline Ui::RoundImageCheckbox::PaintRoundImage PaintUserpicCallback(PeerData *peer) { - return [peer](Painter &p, int x, int y, int outerWidth, int size) { - peer->paintUserpicLeft(p, size, x, y, outerWidth); - }; -} diff --git a/Telegram/SourceFiles/boxes/members_box.cpp b/Telegram/SourceFiles/boxes/members_box.cpp new file mode 100644 index 000000000..a2c3c972c --- /dev/null +++ b/Telegram/SourceFiles/boxes/members_box.cpp @@ -0,0 +1,607 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" +#include "boxes/members_box.h" + +#include "styles/style_dialogs.h" +#include "lang.h" +#include "mainwidget.h" +#include "mainwindow.h" +#include "boxes/contactsbox.h" +#include "boxes/confirmbox.h" +#include "observer_peer.h" + +MembersBox::MembersBox(ChannelData *channel, MembersFilter filter) : ItemListBox(st::boxScroll) +, _inner(this, channel, filter) { + ItemListBox::init(_inner); + + connect(_inner, SIGNAL(addRequested()), this, SLOT(onAdd())); + + connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); + connect(_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); + + connect(&_loadTimer, SIGNAL(timeout()), _inner, SLOT(load())); + + prepare(); +} + +void MembersBox::keyPressEvent(QKeyEvent *e) { + if (e->key() == Qt::Key_Down) { + _inner->selectSkip(1); + } else if (e->key() == Qt::Key_Up) { + _inner->selectSkip(-1); + } else if (e->key() == Qt::Key_PageDown) { + _inner->selectSkipPage(scrollArea()->height(), 1); + } else if (e->key() == Qt::Key_PageUp) { + _inner->selectSkipPage(scrollArea()->height(), -1); + } else { + ItemListBox::keyPressEvent(e); + } +} + +void MembersBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + QString title(lang(_inner->filter() == MembersFilter::Recent ? lng_channel_members : lng_channel_admins)); + paintTitle(p, title); +} + +void MembersBox::resizeEvent(QResizeEvent *e) { + ItemListBox::resizeEvent(e); + _inner->resize(width(), _inner->height()); +} + +void MembersBox::onScroll() { + _inner->loadProfilePhotos(scrollArea()->scrollTop()); +} + +void MembersBox::onAdd() { + if (_inner->filter() == MembersFilter::Recent && _inner->channel()->membersCount() >= (_inner->channel()->isMegagroup() ? Global::MegagroupSizeMax() : Global::ChatSizeMax())) { + Ui::showLayer(new MaxInviteBox(_inner->channel()->inviteLink()), KeepOtherLayers); + return; + } + ContactsBox *box = new ContactsBox(_inner->channel(), _inner->filter(), _inner->already()); + if (_inner->filter() == MembersFilter::Recent) { + Ui::showLayer(box); + } else { + _addBox = box; + connect(_addBox, SIGNAL(adminAdded()), this, SLOT(onAdminAdded())); + Ui::showLayer(_addBox, KeepOtherLayers); + } +} + +void MembersBox::onAdminAdded() { + if (!_addBox) return; + _addBox->onClose(); + _addBox = 0; + _loadTimer.start(ReloadChannelMembersTimeout); +} + +MembersBox::Inner::Inner(QWidget *parent, ChannelData *channel, MembersFilter filter) : ScrolledWidget(parent) +, _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) +, _newItemHeight((channel->amCreator() && (channel->membersCount() < (channel->isMegagroup() ? Global::MegagroupSizeMax() : Global::ChatSizeMax()) || (!channel->isMegagroup() && !channel->isPublic()) || filter == MembersFilter::Admins)) ? st::contactsNewItemHeight : 0) +, _newItemSel(false) +, _channel(channel) +, _filter(filter) +, _kickText(lang(lng_profile_kick)) +, _time(0) +, _kickWidth(st::normalFont->width(_kickText)) +, _sel(-1) +, _kickSel(-1) +, _kickDown(-1) +, _mouseSel(false) +, _kickConfirm(0) +, _kickRequestId(0) +, _kickBox(0) +, _loading(true) +, _loadingRequestId(0) +, _aboutWidth(st::boxWideWidth - st::contactsPadding.left() - st::contactsPadding.right()) +, _about(_aboutWidth) +, _aboutHeight(0) { + subscribe(FileDownload::ImageLoaded(), [this] { update(); }); + + connect(App::main(), SIGNAL(peerNameChanged(PeerData*,const PeerData::Names&,const PeerData::NameFirstChars&)), this, SLOT(onPeerNameChanged(PeerData*, const PeerData::Names&, const PeerData::NameFirstChars&))); + connect(App::main(), SIGNAL(peerPhotoChanged(PeerData*)), this, SLOT(peerUpdated(PeerData*))); + + refresh(); + + load(); +} + +void MembersBox::Inner::load() { + if (!_loadingRequestId) { + _loadingRequestId = MTP::send(MTPchannels_GetParticipants(_channel->inputChannel, (_filter == MembersFilter::Recent) ? MTP_channelParticipantsRecent() : MTP_channelParticipantsAdmins(), MTP_int(0), MTP_int(Global::ChatSizeMax())), rpcDone(&Inner::membersReceived), rpcFail(&Inner::membersFailed)); + } +} + +void MembersBox::Inner::paintEvent(QPaintEvent *e) { + QRect r(e->rect()); + Painter p(this); + + _time = unixtime(); + p.fillRect(r, st::white->b); + + int32 yFrom = r.y() - st::membersPadding.top(), yTo = r.y() + r.height() - st::membersPadding.top(); + p.translate(0, st::membersPadding.top()); + if (_rows.isEmpty()) { + p.setFont(st::noContactsFont->f); + p.setPen(st::noContactsColor->p); + p.drawText(QRect(0, 0, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); + } else { + if (_newItemHeight) { + p.fillRect(0, 0, width(), _newItemHeight, (_newItemSel ? st::contactsBgOver : st::white)->b); + p.drawSpriteLeft(st::contactsNewItemIconPosition.x(), st::contactsNewItemIconPosition.y(), width(), st::contactsNewItemIcon); + p.setFont(st::contactsNameFont); + p.setPen(st::contactsNewItemFg); + p.drawTextLeft(st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(), st::contactsNewItemTop, width(), lang(_filter == MembersFilter::Admins ? lng_channel_add_admins : lng_channel_add_members)); + + yFrom -= _newItemHeight; + yTo -= _newItemHeight; + p.translate(0, _newItemHeight); + } + int32 from = floorclamp(yFrom, _rowHeight, 0, _rows.size()); + int32 to = ceilclamp(yTo, _rowHeight, 0, _rows.size()); + p.translate(0, from * _rowHeight); + for (; from < to; ++from) { + bool sel = (from == _sel); + bool kickSel = (from == _kickSel && (_kickDown < 0 || from == _kickDown)); + bool kickDown = kickSel && (from == _kickDown); + paintDialog(p, _rows[from], data(from), sel, kickSel, kickDown); + p.translate(0, _rowHeight); + } + if (to == _rows.size() && _filter == MembersFilter::Recent && (_rows.size() < _channel->membersCount() || _rows.size() >= Global::ChatSizeMax())) { + p.setPen(st::stickersReorderFg); + _about.draw(p, st::contactsPadding.left(), st::stickersReorderPadding.top(), _aboutWidth, style::al_center); + } + } +} + +void MembersBox::Inner::enterEvent(QEvent *e) { + setMouseTracking(true); +} + +void MembersBox::Inner::leaveEvent(QEvent *e) { + _mouseSel = false; + setMouseTracking(false); + if (_sel >= 0) { + clearSel(); + } +} + +void MembersBox::Inner::mouseMoveEvent(QMouseEvent *e) { + _mouseSel = true; + _lastMousePos = e->globalPos(); + updateSel(); +} + +void MembersBox::Inner::mousePressEvent(QMouseEvent *e) { + _mouseSel = true; + _lastMousePos = e->globalPos(); + updateSel(); + if (e->button() == Qt::LeftButton && _kickSel < 0) { + chooseParticipant(); + } + _kickDown = _kickSel; + update(); +} + +void MembersBox::Inner::mouseReleaseEvent(QMouseEvent *e) { + _mouseSel = true; + _lastMousePos = e->globalPos(); + updateSel(); + if (_kickDown >= 0 && _kickDown == _kickSel && !_kickRequestId) { + _kickConfirm = _rows.at(_kickSel); + if (_kickBox) _kickBox->deleteLater(); + _kickBox = new ConfirmBox((_filter == MembersFilter::Recent ? (_channel->isMegagroup() ? lng_profile_sure_kick : lng_profile_sure_kick_channel) : lng_profile_sure_kick_admin)(lt_user, _kickConfirm->firstName)); + connect(_kickBox, SIGNAL(confirmed()), this, SLOT(onKickConfirm())); + connect(_kickBox, SIGNAL(destroyed(QObject*)), this, SLOT(onKickBoxDestroyed(QObject*))); + Ui::showLayer(_kickBox, KeepOtherLayers); + } + _kickDown = -1; +} + +void MembersBox::Inner::onKickBoxDestroyed(QObject *obj) { + if (_kickBox == obj) { + _kickBox = 0; + } +} + +void MembersBox::Inner::onKickConfirm() { + if (_filter == MembersFilter::Recent) { + _kickRequestId = MTP::send(MTPchannels_KickFromChannel(_channel->inputChannel, _kickConfirm->inputUser, MTP_bool(true)), rpcDone(&Inner::kickDone), rpcFail(&Inner::kickFail)); + } else { + _kickRequestId = MTP::send(MTPchannels_EditAdmin(_channel->inputChannel, _kickConfirm->inputUser, MTP_channelRoleEmpty()), rpcDone(&Inner::kickAdminDone), rpcFail(&Inner::kickFail)); + } +} + +void MembersBox::Inner::paintDialog(Painter &p, PeerData *peer, MemberData *data, bool sel, bool kickSel, bool kickDown) { + UserData *user = peer->asUser(); + + p.fillRect(0, 0, width(), _rowHeight, (sel ? st::contactsBgOver : st::white)->b); + peer->paintUserpicLeft(p, st::contactsPhotoSize, st::contactsPadding.left(), st::contactsPadding.top(), width()); + + p.setPen(st::black); + + int32 namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); + int32 namew = width() - namex - st::contactsPadding.right() - (data->canKick ? (_kickWidth + st::contactsCheckPosition.x() * 2) : 0); + if (peer->isVerified()) { + auto icon = &st::dialogsVerifiedIcon; + namew -= icon->width(); + icon->paint(p, namex + qMin(data->name.maxWidth(), namew), st::contactsPadding.top() + st::contactsNameTop, width()); + } + data->name.drawLeftElided(p, namex, st::contactsPadding.top() + st::contactsNameTop, namew, width()); + + if (data->canKick) { + p.setFont((kickSel ? st::linkOverFont : st::linkFont)->f); + if (kickDown) { + p.setPen(st::btnDefLink.downColor->p); + } else { + p.setPen(st::btnDefLink.color->p); + } + p.drawTextRight(st::contactsPadding.right() + st::contactsCheckPosition.x(), st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, width(), _kickText, _kickWidth); + } + + p.setFont(st::contactsStatusFont->f); + p.setPen(data->onlineColor ? st::contactsStatusFgOnline : (sel ? st::contactsStatusFgOver : st::contactsStatusFg)); + p.drawTextLeft(namex, st::contactsPadding.top() + st::contactsStatusTop, width(), data->online); +} + +void MembersBox::Inner::selectSkip(int32 dir) { + _time = unixtime(); + _mouseSel = false; + + int cur = -1; + if (_newItemHeight && _newItemSel) { + cur = 0; + } else if (_sel >= 0) { + cur = _sel + (_newItemHeight ? 1 : 0); + } + cur += dir; + if (cur <= 0) { + _newItemSel = _newItemHeight ? true : false; + _sel = (_newItemSel || _rows.isEmpty()) ? -1 : 0; + } else if (cur >= _rows.size() + (_newItemHeight ? 1 : 0)) { + _sel = -1; + } else { + _sel = cur - (_newItemHeight ? 1 : 0); + } + if (dir > 0) { + if (_sel < 0 || _sel >= _rows.size()) { + _sel = -1; + } + } else { + if (!_rows.isEmpty()) { + if (_sel < 0 && !_newItemSel) _sel = _rows.size() - 1; + } + } + if (_newItemSel) { + emit mustScrollTo(0, _newItemHeight); + } else if (_sel >= 0) { + emit mustScrollTo(_newItemHeight + _sel * _rowHeight, _newItemHeight + (_sel + 1) * _rowHeight); + } + + update(); +} + +void MembersBox::Inner::selectSkipPage(int32 h, int32 dir) { + int32 points = h / _rowHeight; + if (!points) return; + selectSkip(points * dir); +} + +void MembersBox::Inner::loadProfilePhotos(int32 yFrom) { + int32 yTo = yFrom + (parentWidget() ? parentWidget()->height() : App::wnd()->height()) * 5; + MTP::clearLoaderPriorities(); + + if (yTo < 0) return; + if (yFrom < 0) yFrom = 0; + + if (!_rows.isEmpty()) { + int32 from = (yFrom - _newItemHeight) / _rowHeight; + if (from < 0) from = 0; + if (from < _rows.size()) { + int32 to = ((yTo - _newItemHeight) / _rowHeight) + 1; + if (to > _rows.size()) to = _rows.size(); + + for (; from < to; ++from) { + _rows[from]->loadUserpic(); + } + } + } +} + +void MembersBox::Inner::chooseParticipant() { + if (_newItemSel) { + emit addRequested(); + return; + } + if (_sel < 0 || _sel >= _rows.size()) return; + if (PeerData *peer = _rows[_sel]) { + Ui::hideLayer(); + Ui::showPeerProfile(peer); + } +} + +void MembersBox::Inner::refresh() { + if (_rows.isEmpty()) { + resize(width(), st::membersPadding.top() + st::noContactsHeight + st::membersPadding.bottom()); + _aboutHeight = 0; + } else { + _about.setText(st::boxTextFont, lng_channel_only_last_shown(lt_count, _rows.size())); + _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); + if (_filter != MembersFilter::Recent || (_rows.size() >= _channel->membersCount() && _rows.size() < Global::ChatSizeMax())) { + _aboutHeight = 0; + } + resize(width(), st::membersPadding.top() + _newItemHeight + _rows.size() * _rowHeight + st::membersPadding.bottom() + _aboutHeight); + } + update(); +} + +ChannelData *MembersBox::Inner::channel() const { + return _channel; +} + +MembersFilter MembersBox::Inner::filter() const { + return _filter; +} + +MembersAlreadyIn MembersBox::Inner::already() const { + MembersAlreadyIn result; + for_const (auto peer, _rows) { + if (peer->isUser()) { + result.insert(peer->asUser()); + } + } + return result; +} + +void MembersBox::Inner::clearSel() { + updateSelectedRow(); + _newItemSel = false; + _sel = _kickSel = _kickDown = -1; + _lastMousePos = QCursor::pos(); + updateSel(); +} + +MembersBox::Inner::MemberData *MembersBox::Inner::data(int32 index) { + if (MemberData *result = _datas.at(index)) { + return result; + } + MemberData *result = _datas[index] = new MemberData(); + result->name.setText(st::contactsNameFont, _rows[index]->name, _textNameOptions); + int32 t = unixtime(); + result->online = App::onlineText(_rows[index], t);// lng_mediaview_date_time(lt_date, _dates[index].date().toString(qsl("dd.MM.yy")), lt_time, _dates[index].time().toString(cTimeFormat())); + result->onlineColor = App::onlineColorUse(_rows[index], t); + if (_filter == MembersFilter::Recent) { + result->canKick = (_channel->amCreator() || _channel->amEditor() || _channel->amModerator()) ? (_roles[index] == MemberRole::None) : false; + } else if (_filter == MembersFilter::Admins) { + result->canKick = _channel->amCreator() ? (_roles[index] == MemberRole::Editor || _roles[index] == MemberRole::Moderator) : false; + } else { + result->canKick = false; + } + return result; +} + +void MembersBox::Inner::clear() { + for (int32 i = 0, l = _datas.size(); i < l; ++i) { + delete _datas.at(i); + } + _datas.clear(); + _rows.clear(); + _dates.clear(); + _roles.clear(); + if (_kickBox) _kickBox->deleteLater(); + clearSel(); +} + +MembersBox::Inner::~Inner() { + clear(); +} + +void MembersBox::Inner::updateSel() { + if (!_mouseSel) return; + + QPoint p(mapFromGlobal(_lastMousePos)); + p.setY(p.y() - st::membersPadding.top()); + bool in = parentWidget()->rect().contains(parentWidget()->mapFromGlobal(_lastMousePos)); + bool newItemSel = (in && p.y() >= 0 && p.y() < _newItemHeight); + int32 newSel = (in && !newItemSel && p.y() >= _newItemHeight && p.y() < _newItemHeight + _rows.size() * _rowHeight) ? ((p.y() - _newItemHeight) / _rowHeight) : -1; + int32 newKickSel = newSel; + if (newSel >= 0 && (!data(newSel)->canKick || !QRect(width() - _kickWidth - st::contactsPadding.right() - st::contactsCheckPosition.x(), _newItemHeight + newSel * _rowHeight + st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, _kickWidth, st::normalFont->height).contains(p))) { + newKickSel = -1; + } + if (newSel != _sel || newKickSel != _kickSel || newItemSel != _newItemSel) { + updateSelectedRow(); + _newItemSel = newItemSel; + _sel = newSel; + _kickSel = newKickSel; + updateSelectedRow(); + setCursor(_kickSel >= 0 ? style::cur_pointer : style::cur_default); + } +} + +void MembersBox::Inner::peerUpdated(PeerData *peer) { + update(); +} + +void MembersBox::Inner::updateSelectedRow() { + if (_newItemSel) { + update(0, st::membersPadding.top(), width(), _newItemHeight); + } + if (_sel >= 0) { + update(0, st::membersPadding.top() + _newItemHeight + _sel * _rowHeight, width(), _rowHeight); + } +} + +void MembersBox::Inner::onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars) { + for (int32 i = 0, l = _rows.size(); i < l; ++i) { + if (_rows.at(i) == peer) { + if (_datas.at(i)) { + _datas.at(i)->name.setText(st::contactsNameFont, peer->name, _textNameOptions); + update(0, st::membersPadding.top() + i * _rowHeight, width(), _rowHeight); + } else { + break; + } + } + } +} + +void MembersBox::Inner::membersReceived(const MTPchannels_ChannelParticipants &result, mtpRequestId req) { + clear(); + _loadingRequestId = 0; + + if (result.type() == mtpc_channels_channelParticipants) { + const auto &d(result.c_channels_channelParticipants()); + const auto &v(d.vparticipants.c_vector().v); + _rows.reserve(v.size()); + _datas.reserve(v.size()); + _dates.reserve(v.size()); + _roles.reserve(v.size()); + + if (_filter == MembersFilter::Recent && _channel->membersCount() < d.vcount.v) { + _channel->setMembersCount(d.vcount.v); + if (App::main()) emit App::main()->peerUpdated(_channel); + } else if (_filter == MembersFilter::Admins && _channel->adminsCount() < d.vcount.v) { + _channel->setAdminsCount(d.vcount.v); + if (App::main()) emit App::main()->peerUpdated(_channel); + } + App::feedUsers(d.vusers); + + for (QVector::const_iterator i = v.cbegin(), e = v.cend(); i != e; ++i) { + int32 userId = 0, addedTime = 0; + MemberRole role = MemberRole::None; + switch (i->type()) { + case mtpc_channelParticipant: + userId = i->c_channelParticipant().vuser_id.v; + addedTime = i->c_channelParticipant().vdate.v; + break; + case mtpc_channelParticipantSelf: + role = MemberRole::Self; + userId = i->c_channelParticipantSelf().vuser_id.v; + addedTime = i->c_channelParticipantSelf().vdate.v; + break; + case mtpc_channelParticipantModerator: + role = MemberRole::Moderator; + userId = i->c_channelParticipantModerator().vuser_id.v; + addedTime = i->c_channelParticipantModerator().vdate.v; + break; + case mtpc_channelParticipantEditor: + role = MemberRole::Editor; + userId = i->c_channelParticipantEditor().vuser_id.v; + addedTime = i->c_channelParticipantEditor().vdate.v; + break; + case mtpc_channelParticipantKicked: + userId = i->c_channelParticipantKicked().vuser_id.v; + addedTime = i->c_channelParticipantKicked().vdate.v; + role = MemberRole::Kicked; + break; + case mtpc_channelParticipantCreator: + userId = i->c_channelParticipantCreator().vuser_id.v; + addedTime = _channel->date; + role = MemberRole::Creator; + break; + } + if (UserData *user = App::userLoaded(userId)) { + _rows.push_back(user); + _dates.push_back(date(addedTime)); + _roles.push_back(role); + _datas.push_back(0); + } + } + + // update admins if we got all of them + if (_filter == MembersFilter::Admins && _channel->isMegagroup() && _rows.size() < Global::ChatSizeMax()) { + _channel->mgInfo->lastAdmins.clear(); + for (int32 i = 0, l = _rows.size(); i != l; ++i) { + if (_roles.at(i) == MemberRole::Creator || _roles.at(i) == MemberRole::Editor) { + _channel->mgInfo->lastAdmins.insert(_rows.at(i)); + } + } + + Notify::peerUpdatedDelayed(_channel, Notify::PeerUpdate::Flag::AdminsChanged); + } + } + if (_rows.isEmpty()) { + _rows.push_back(App::self()); + _dates.push_back(date(MTP_int(_channel->date))); + _roles.push_back(MemberRole::Self); + _datas.push_back(0); + } + + clearSel(); + _loading = false; + refresh(); + + emit loaded(); +} + +bool MembersBox::Inner::membersFailed(const RPCError &error, mtpRequestId req) { + if (MTP::isDefaultHandledError(error)) return false; + + Ui::hideLayer(); + return true; +} + +void MembersBox::Inner::kickDone(const MTPUpdates &result, mtpRequestId req) { + App::main()->sentUpdatesReceived(result); + + if (_kickRequestId != req) return; + removeKicked(); + if (_kickBox) _kickBox->onClose(); +} + +void MembersBox::Inner::kickAdminDone(const MTPUpdates &result, mtpRequestId req) { + if (_kickRequestId != req) return; + if (App::main()) App::main()->sentUpdatesReceived(result); + removeKicked(); + if (_kickBox) _kickBox->onClose(); +} + +bool MembersBox::Inner::kickFail(const RPCError &error, mtpRequestId req) { + if (MTP::isDefaultHandledError(error)) return false; + + if (_kickBox) _kickBox->onClose(); + load(); + return true; +} + +void MembersBox::Inner::removeKicked() { + _kickRequestId = 0; + int32 index = _rows.indexOf(_kickConfirm); + if (index >= 0) { + _rows.removeAt(index); + delete _datas.at(index); + _datas.removeAt(index); + _dates.removeAt(index); + _roles.removeAt(index); + clearSel(); + if (_filter == MembersFilter::Recent && _channel->membersCount() > 1) { + _channel->setMembersCount(_channel->membersCount() - 1); + if (App::main()) emit App::main()->peerUpdated(_channel); + } else if (_filter == MembersFilter::Admins && _channel->adminsCount() > 1) { + _channel->setAdminsCount(_channel->adminsCount() - 1); + if (App::main()) emit App::main()->peerUpdated(_channel); + } + refresh(); + } + _kickConfirm = 0; +} diff --git a/Telegram/SourceFiles/boxes/members_box.h b/Telegram/SourceFiles/boxes/members_box.h new file mode 100644 index 000000000..f93f7a7b2 --- /dev/null +++ b/Telegram/SourceFiles/boxes/members_box.h @@ -0,0 +1,178 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#pragma once + +#include "abstractbox.h" +#include "core/single_timer.h" +#include "ui/effects/round_image_checkbox.h" + +class ContactsBox; +class ConfirmBox; + +enum class MembersFilter { + Recent, + Admins, +}; +using MembersAlreadyIn = OrderedSet; + +class MembersBox : public ItemListBox { + Q_OBJECT + +public: + MembersBox(ChannelData *channel, MembersFilter filter); + +public slots: + void onScroll(); + + void onAdd(); + void onAdminAdded(); + +protected: + void keyPressEvent(QKeyEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void resizeEvent(QResizeEvent *e) override; + +private: + class Inner; + ChildWidget _inner; + + ContactsBox *_addBox = nullptr; + + SingleTimer _loadTimer; + +}; + +// This class is hold in header because it requires Qt preprocessing. +class MembersBox::Inner : public ScrolledWidget, public RPCSender, private base::Subscriber { + Q_OBJECT + +public: + Inner(QWidget *parent, ChannelData *channel, MembersFilter filter); + + void selectSkip(int32 dir); + void selectSkipPage(int32 h, int32 dir); + + void loadProfilePhotos(int32 yFrom); + void chooseParticipant(); + + void refresh(); + + ChannelData *channel() const; + MembersFilter filter() const; + + bool isLoaded() const { + return !_loading; + } + void clearSel(); + + MembersAlreadyIn already() const; + + ~Inner(); + +signals: + void mustScrollTo(int ymin, int ymax); + void addRequested(); + void loaded(); + +public slots: + void load(); + + void updateSel(); + void peerUpdated(PeerData *peer); + void onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars); + void onKickConfirm(); + void onKickBoxDestroyed(QObject *obj); + +protected: + void paintEvent(QPaintEvent *e) override; + void enterEvent(QEvent *e) override; + void leaveEvent(QEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + +private: + struct MemberData { + Text name; + QString online; + bool onlineColor; + bool canKick; + }; + + void updateSelectedRow(); + MemberData *data(int32 index); + + void paintDialog(Painter &p, PeerData *peer, MemberData *data, bool sel, bool kickSel, bool kickDown); + + void membersReceived(const MTPchannels_ChannelParticipants &result, mtpRequestId req); + bool membersFailed(const RPCError &error, mtpRequestId req); + + void kickDone(const MTPUpdates &result, mtpRequestId req); + void kickAdminDone(const MTPUpdates &result, mtpRequestId req); + bool kickFail(const RPCError &error, mtpRequestId req); + void removeKicked(); + + void clear(); + + int32 _rowHeight, _newItemHeight; + bool _newItemSel; + + ChannelData *_channel; + MembersFilter _filter; + + QString _kickText; + int32 _time, _kickWidth; + + int32 _sel, _kickSel, _kickDown; + bool _mouseSel; + + UserData *_kickConfirm; + mtpRequestId _kickRequestId; + + ConfirmBox *_kickBox; + + enum class MemberRole { + None, + Self, + Creator, + Editor, + Moderator, + Kicked + }; + + bool _loading; + mtpRequestId _loadingRequestId; + typedef QVector MemberRows; + typedef QVector MemberDates; + typedef QVector MemberRoles; + typedef QVector MemberDatas; + MemberRows _rows; + MemberDates _dates; + MemberRoles _roles; + MemberDatas _datas; + + int32 _aboutWidth; + Text _about; + int32 _aboutHeight; + + QPoint _lastMousePos; + +}; diff --git a/Telegram/SourceFiles/boxes/sessionsbox.cpp b/Telegram/SourceFiles/boxes/sessionsbox.cpp index b2fc879fa..52003f6ff 100644 --- a/Telegram/SourceFiles/boxes/sessionsbox.cpp +++ b/Telegram/SourceFiles/boxes/sessionsbox.cpp @@ -30,213 +30,23 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "countries.h" #include "confirmbox.h" -SessionsInner::SessionsInner(SessionsList *list, SessionData *current) : TWidget() -, _list(list) -, _current(current) -, _terminating(0) -, _terminateAll(this, lang(lng_sessions_terminate_all), st::redBoxLinkButton) -, _terminateBox(0) { - connect(&_terminateAll, SIGNAL(clicked()), this, SLOT(onTerminateAll())); - _terminateAll.hide(); - setAttribute(Qt::WA_OpaquePaintEvent); -} - -void SessionsInner::paintEvent(QPaintEvent *e) { - QRect r(e->rect()); - Painter p(this); - - p.fillRect(r, st::white->b); - int32 x = st::sessionPadding.left(), xact = st::sessionTerminateSkip + st::sessionTerminate.iconPos.x();// st::sessionTerminateSkip + st::sessionTerminate.width + st::sessionTerminateSkip; - int32 w = width(); - - if (_current->active.isEmpty() && _list->isEmpty()) { - p.setFont(st::noContactsFont->f); - p.setPen(st::noContactsColor->p); - p.drawText(QRect(0, 0, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); - return; - } - - if (r.y() <= st::sessionCurrentHeight) { - p.translate(0, st::sessionCurrentPadding.top()); - p.setFont(st::sessionNameFont->f); - p.setPen(st::black->p); - p.drawTextLeft(x, st::sessionPadding.top(), w, _current->name, _current->nameWidth); - - p.setFont(st::sessionActiveFont->f); - p.setPen(st::sessionActiveColor->p); - p.drawTextRight(x, st::sessionPadding.top(), w, _current->active, _current->activeWidth); - - p.setFont(st::sessionInfoFont->f); - p.setPen(st::black->p); - p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height, w, _current->info, _current->infoWidth); - p.setPen(st::sessionInfoColor->p); - p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height + st::sessionInfoFont->height, w, _current->ip, _current->ipWidth); - } - p.translate(0, st::sessionCurrentHeight - st::sessionCurrentPadding.top()); - if (_list->isEmpty()) { - p.setFont(st::sessionInfoFont->f); - p.setPen(st::sessionInfoColor->p); - p.drawText(QRect(st::sessionPadding.left(), 0, width() - st::sessionPadding.left() - st::sessionPadding.right(), st::noContactsHeight), lang(lng_sessions_other_desc), style::al_topleft); - return; - } - - p.setFont(st::linkFont->f); - int32 count = _list->size(); - int32 from = floorclamp(r.y() - st::sessionCurrentHeight, st::sessionHeight, 0, count); - int32 to = ceilclamp(r.y() + r.height() - st::sessionCurrentHeight, st::sessionHeight, 0, count); - p.translate(0, from * st::sessionHeight); - for (int32 i = from; i < to; ++i) { - const SessionData &auth(_list->at(i)); - - p.setFont(st::sessionNameFont->f); - p.setPen(st::black->p); - p.drawTextLeft(x, st::sessionPadding.top(), w, auth.name, auth.nameWidth); - - p.setFont(st::sessionActiveFont->f); - p.setPen(st::sessionActiveColor->p); - p.drawTextRight(xact, st::sessionPadding.top(), w, auth.active, auth.activeWidth); - - p.setFont(st::sessionInfoFont->f); - p.setPen(st::black->p); - p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height, w, auth.info, auth.infoWidth); - p.setPen(st::sessionInfoColor->p); - p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height + st::sessionInfoFont->height, w, auth.ip, auth.ipWidth); - - p.translate(0, st::sessionHeight); - } -} - -void SessionsInner::onTerminate() { - for (TerminateButtons::iterator i = _terminateButtons.begin(), e = _terminateButtons.end(); i != e; ++i) { - if (i.value()->getState() & Button::StateOver) { - _terminating = i.key(); - - if (_terminateBox) _terminateBox->deleteLater(); - _terminateBox = new ConfirmBox(lang(lng_settings_reset_one_sure), lang(lng_settings_reset_button), st::attentionBoxButton); - connect(_terminateBox, SIGNAL(confirmed()), this, SLOT(onTerminateSure())); - connect(_terminateBox, SIGNAL(destroyed(QObject*)), this, SLOT(onNoTerminateBox(QObject*))); - Ui::showLayer(_terminateBox, KeepOtherLayers); - } - } -} - -void SessionsInner::onTerminateSure() { - if (_terminateBox) { - _terminateBox->onClose(); - _terminateBox = 0; - } - MTP::send(MTPaccount_ResetAuthorization(MTP_long(_terminating)), rpcDone(&SessionsInner::terminateDone, _terminating), rpcFail(&SessionsInner::terminateFail, _terminating)); - TerminateButtons::iterator i = _terminateButtons.find(_terminating); - if (i != _terminateButtons.cend()) { - i.value()->clearState(); - i.value()->hide(); - } -} - -void SessionsInner::onTerminateAll() { - if (_terminateBox) _terminateBox->deleteLater(); - _terminateBox = new ConfirmBox(lang(lng_settings_reset_sure), lang(lng_settings_reset_button), st::attentionBoxButton); - connect(_terminateBox, SIGNAL(confirmed()), this, SLOT(onTerminateAllSure())); - connect(_terminateBox, SIGNAL(destroyed(QObject*)), this, SLOT(onNoTerminateBox(QObject*))); - Ui::showLayer(_terminateBox, KeepOtherLayers); -} - -void SessionsInner::onTerminateAllSure() { - if (_terminateBox) { - _terminateBox->onClose(); - _terminateBox = 0; - } - MTP::send(MTPauth_ResetAuthorizations(), rpcDone(&SessionsInner::terminateAllDone), rpcFail(&SessionsInner::terminateAllFail)); - emit terminateAll(); -} - -void SessionsInner::onNoTerminateBox(QObject *obj) { - if (obj == _terminateBox) _terminateBox = 0; -} - -void SessionsInner::terminateDone(uint64 hash, const MTPBool &result) { - for (int32 i = 0, l = _list->size(); i < l; ++i) { - if (_list->at(i).hash == hash) { - _list->removeAt(i); - break; - } - } - listUpdated(); - emit oneTerminated(); -} - -bool SessionsInner::terminateFail(uint64 hash, const RPCError &error) { - if (MTP::isDefaultHandledError(error)) return false; - - TerminateButtons::iterator i = _terminateButtons.find(hash); - if (i != _terminateButtons.end()) { - i.value()->show(); - return true; - } - return false; -} - -void SessionsInner::terminateAllDone(const MTPBool &result) { - emit allTerminated(); -} - -bool SessionsInner::terminateAllFail(const RPCError &error) { - if (MTP::isDefaultHandledError(error)) return false; - emit allTerminated(); - return true; -} - -void SessionsInner::resizeEvent(QResizeEvent *e) { - _terminateAll.moveToLeft(st::sessionPadding.left(), st::sessionCurrentPadding.top() + st::sessionHeight + st::sessionCurrentPadding.bottom()); -} - -void SessionsInner::listUpdated() { - if (_list->isEmpty()) { - _terminateAll.hide(); - } else { - _terminateAll.show(); - } - for (TerminateButtons::iterator i = _terminateButtons.begin(), e = _terminateButtons.end(); i != e; ++i) { - i.value()->move(0, -1); - } - for (int32 i = 0, l = _list->size(); i < l; ++i) { - TerminateButtons::iterator j = _terminateButtons.find(_list->at(i).hash); - if (j == _terminateButtons.cend()) { - j = _terminateButtons.insert(_list->at(i).hash, new IconedButton(this, st::sessionTerminate)); - connect(j.value(), SIGNAL(clicked()), this, SLOT(onTerminate())); - } - j.value()->moveToRight(st::sessionTerminateSkip, st::sessionCurrentHeight + i * st::sessionHeight + st::sessionTerminateTop, width()); - j.value()->show(); - } - for (TerminateButtons::iterator i = _terminateButtons.begin(); i != _terminateButtons.cend();) { - if (i.value()->y() >= 0) { - ++i; - } else { - delete i.value(); - i = _terminateButtons.erase(i); - } - } - resize(width(), _list->isEmpty() ? (st::sessionCurrentHeight + st::noContactsHeight) : (st::sessionCurrentHeight + _list->size() * st::sessionHeight)); - update(); -} - SessionsBox::SessionsBox() : ScrollableBox(st::sessionsScroll) , _loading(true) -, _inner(&_list, &_current) +, _inner(this, &_list, &_current) , _shadow(this) , _done(this, lang(lng_about_done), st::defaultBoxButton) , _shortPollRequest(0) { setMaxHeight(st::sessionsHeight); connect(&_done, SIGNAL(clicked()), this, SLOT(onClose())); - connect(&_inner, SIGNAL(oneTerminated()), this, SLOT(onOneTerminated())); - connect(&_inner, SIGNAL(allTerminated()), this, SLOT(onAllTerminated())); - connect(&_inner, SIGNAL(terminateAll()), this, SLOT(onTerminateAll())); + connect(_inner, SIGNAL(oneTerminated()), this, SLOT(onOneTerminated())); + connect(_inner, SIGNAL(allTerminated()), this, SLOT(onAllTerminated())); + connect(_inner, SIGNAL(terminateAll()), this, SLOT(onTerminateAll())); connect(App::wnd(), SIGNAL(newAuthorization()), this, SLOT(onNewAuthorization())); connect(&_shortPollTimer, SIGNAL(timeout()), this, SLOT(onShortPollAuthorizations())); - init(&_inner, st::boxButtonPadding.bottom() + _done.height() + st::boxButtonPadding.top(), st::boxTitleHeight); - _inner.resize(width(), st::noContactsHeight); + init(_inner, st::boxButtonPadding.bottom() + _done.height() + st::boxButtonPadding.top(), st::boxTitleHeight); + _inner->resize(width(), st::noContactsHeight); prepare(); @@ -291,7 +101,7 @@ void SessionsBox::gotAuthorizations(const MTPaccount_Authorizations &result) { for (int32 i = 0; i < l; ++i) { const auto &d(v.at(i).c_authorization()); - SessionData data; + Data data; data.hash = d.vhash.v; QString appName, appVer = qs(d.vapp_version), systemVer = qs(d.vsystem_version), deviceModel = qs(d.vdevice_model); @@ -383,7 +193,7 @@ void SessionsBox::gotAuthorizations(const MTPaccount_Authorizations &result) { } } } - _inner.listUpdated(); + _inner->listUpdated(); if (!_done.isHidden()) { showAll(); update(); @@ -430,4 +240,194 @@ void SessionsBox::onTerminateAll() { showAll(); update(); } -} \ No newline at end of file +} + +SessionsBox::Inner::Inner(QWidget *parent, SessionsBox::List *list, SessionsBox::Data *current) : ScrolledWidget(parent) +, _list(list) +, _current(current) +, _terminating(0) +, _terminateAll(this, lang(lng_sessions_terminate_all), st::redBoxLinkButton) +, _terminateBox(0) { + connect(&_terminateAll, SIGNAL(clicked()), this, SLOT(onTerminateAll())); + _terminateAll.hide(); + setAttribute(Qt::WA_OpaquePaintEvent); +} + +void SessionsBox::Inner::paintEvent(QPaintEvent *e) { + QRect r(e->rect()); + Painter p(this); + + p.fillRect(r, st::white->b); + int32 x = st::sessionPadding.left(), xact = st::sessionTerminateSkip + st::sessionTerminate.iconPos.x();// st::sessionTerminateSkip + st::sessionTerminate.width + st::sessionTerminateSkip; + int32 w = width(); + + if (_current->active.isEmpty() && _list->isEmpty()) { + p.setFont(st::noContactsFont->f); + p.setPen(st::noContactsColor->p); + p.drawText(QRect(0, 0, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); + return; + } + + if (r.y() <= st::sessionCurrentHeight) { + p.translate(0, st::sessionCurrentPadding.top()); + p.setFont(st::sessionNameFont->f); + p.setPen(st::black->p); + p.drawTextLeft(x, st::sessionPadding.top(), w, _current->name, _current->nameWidth); + + p.setFont(st::sessionActiveFont->f); + p.setPen(st::sessionActiveColor->p); + p.drawTextRight(x, st::sessionPadding.top(), w, _current->active, _current->activeWidth); + + p.setFont(st::sessionInfoFont->f); + p.setPen(st::black->p); + p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height, w, _current->info, _current->infoWidth); + p.setPen(st::sessionInfoColor->p); + p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height + st::sessionInfoFont->height, w, _current->ip, _current->ipWidth); + } + p.translate(0, st::sessionCurrentHeight - st::sessionCurrentPadding.top()); + if (_list->isEmpty()) { + p.setFont(st::sessionInfoFont->f); + p.setPen(st::sessionInfoColor->p); + p.drawText(QRect(st::sessionPadding.left(), 0, width() - st::sessionPadding.left() - st::sessionPadding.right(), st::noContactsHeight), lang(lng_sessions_other_desc), style::al_topleft); + return; + } + + p.setFont(st::linkFont->f); + int32 count = _list->size(); + int32 from = floorclamp(r.y() - st::sessionCurrentHeight, st::sessionHeight, 0, count); + int32 to = ceilclamp(r.y() + r.height() - st::sessionCurrentHeight, st::sessionHeight, 0, count); + p.translate(0, from * st::sessionHeight); + for (int32 i = from; i < to; ++i) { + const SessionsBox::Data &auth(_list->at(i)); + + p.setFont(st::sessionNameFont->f); + p.setPen(st::black->p); + p.drawTextLeft(x, st::sessionPadding.top(), w, auth.name, auth.nameWidth); + + p.setFont(st::sessionActiveFont->f); + p.setPen(st::sessionActiveColor->p); + p.drawTextRight(xact, st::sessionPadding.top(), w, auth.active, auth.activeWidth); + + p.setFont(st::sessionInfoFont->f); + p.setPen(st::black->p); + p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height, w, auth.info, auth.infoWidth); + p.setPen(st::sessionInfoColor->p); + p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height + st::sessionInfoFont->height, w, auth.ip, auth.ipWidth); + + p.translate(0, st::sessionHeight); + } +} + +void SessionsBox::Inner::onTerminate() { + for (TerminateButtons::iterator i = _terminateButtons.begin(), e = _terminateButtons.end(); i != e; ++i) { + if (i.value()->getState() & Button::StateOver) { + _terminating = i.key(); + + if (_terminateBox) _terminateBox->deleteLater(); + _terminateBox = new ConfirmBox(lang(lng_settings_reset_one_sure), lang(lng_settings_reset_button), st::attentionBoxButton); + connect(_terminateBox, SIGNAL(confirmed()), this, SLOT(onTerminateSure())); + connect(_terminateBox, SIGNAL(destroyed(QObject*)), this, SLOT(onNoTerminateBox(QObject*))); + Ui::showLayer(_terminateBox, KeepOtherLayers); + } + } +} + +void SessionsBox::Inner::onTerminateSure() { + if (_terminateBox) { + _terminateBox->onClose(); + _terminateBox = 0; + } + MTP::send(MTPaccount_ResetAuthorization(MTP_long(_terminating)), rpcDone(&Inner::terminateDone, _terminating), rpcFail(&Inner::terminateFail, _terminating)); + TerminateButtons::iterator i = _terminateButtons.find(_terminating); + if (i != _terminateButtons.cend()) { + i.value()->clearState(); + i.value()->hide(); + } +} + +void SessionsBox::Inner::onTerminateAll() { + if (_terminateBox) _terminateBox->deleteLater(); + _terminateBox = new ConfirmBox(lang(lng_settings_reset_sure), lang(lng_settings_reset_button), st::attentionBoxButton); + connect(_terminateBox, SIGNAL(confirmed()), this, SLOT(onTerminateAllSure())); + connect(_terminateBox, SIGNAL(destroyed(QObject*)), this, SLOT(onNoTerminateBox(QObject*))); + Ui::showLayer(_terminateBox, KeepOtherLayers); +} + +void SessionsBox::Inner::onTerminateAllSure() { + if (_terminateBox) { + _terminateBox->onClose(); + _terminateBox = 0; + } + MTP::send(MTPauth_ResetAuthorizations(), rpcDone(&Inner::terminateAllDone), rpcFail(&Inner::terminateAllFail)); + emit terminateAll(); +} + +void SessionsBox::Inner::onNoTerminateBox(QObject *obj) { + if (obj == _terminateBox) _terminateBox = 0; +} + +void SessionsBox::Inner::terminateDone(uint64 hash, const MTPBool &result) { + for (int32 i = 0, l = _list->size(); i < l; ++i) { + if (_list->at(i).hash == hash) { + _list->removeAt(i); + break; + } + } + listUpdated(); + emit oneTerminated(); +} + +bool SessionsBox::Inner::terminateFail(uint64 hash, const RPCError &error) { + if (MTP::isDefaultHandledError(error)) return false; + + TerminateButtons::iterator i = _terminateButtons.find(hash); + if (i != _terminateButtons.end()) { + i.value()->show(); + return true; + } + return false; +} + +void SessionsBox::Inner::terminateAllDone(const MTPBool &result) { + emit allTerminated(); +} + +bool SessionsBox::Inner::terminateAllFail(const RPCError &error) { + if (MTP::isDefaultHandledError(error)) return false; + emit allTerminated(); + return true; +} + +void SessionsBox::Inner::resizeEvent(QResizeEvent *e) { + _terminateAll.moveToLeft(st::sessionPadding.left(), st::sessionCurrentPadding.top() + st::sessionHeight + st::sessionCurrentPadding.bottom()); +} + +void SessionsBox::Inner::listUpdated() { + if (_list->isEmpty()) { + _terminateAll.hide(); + } else { + _terminateAll.show(); + } + for (TerminateButtons::iterator i = _terminateButtons.begin(), e = _terminateButtons.end(); i != e; ++i) { + i.value()->move(0, -1); + } + for (int32 i = 0, l = _list->size(); i < l; ++i) { + TerminateButtons::iterator j = _terminateButtons.find(_list->at(i).hash); + if (j == _terminateButtons.cend()) { + j = _terminateButtons.insert(_list->at(i).hash, new IconedButton(this, st::sessionTerminate)); + connect(j.value(), SIGNAL(clicked()), this, SLOT(onTerminate())); + } + j.value()->moveToRight(st::sessionTerminateSkip, st::sessionCurrentHeight + i * st::sessionHeight + st::sessionTerminateTop, width()); + j.value()->show(); + } + for (TerminateButtons::iterator i = _terminateButtons.begin(); i != _terminateButtons.cend();) { + if (i.value()->y() >= 0) { + ++i; + } else { + delete i.value(); + i = _terminateButtons.erase(i); + } + } + resize(width(), _list->isEmpty() ? (st::sessionCurrentHeight + st::noContactsHeight) : (st::sessionCurrentHeight + _list->size() * st::sessionHeight)); + update(); +} diff --git a/Telegram/SourceFiles/boxes/sessionsbox.h b/Telegram/SourceFiles/boxes/sessionsbox.h index 851bfa8fb..f591464f4 100644 --- a/Telegram/SourceFiles/boxes/sessionsbox.h +++ b/Telegram/SourceFiles/boxes/sessionsbox.h @@ -25,20 +25,58 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org class ConfirmBox; -struct SessionData { - uint64 hash; - - int32 activeTime; - int32 nameWidth, activeWidth, infoWidth, ipWidth; - QString name, active, info, ip; -}; -typedef QList SessionsList; - -class SessionsInner : public TWidget, public RPCSender { +class SessionsBox : public ScrollableBox, public RPCSender { Q_OBJECT public: - SessionsInner(SessionsList *list, SessionData *current); + SessionsBox(); + +public slots: + void onOneTerminated(); + void onAllTerminated(); + void onTerminateAll(); + void onShortPollAuthorizations(); + void onNewAuthorization(); + +protected: + void resizeEvent(QResizeEvent *e) override; + void paintEvent(QPaintEvent *e) override; + + void showAll() override; + +private: + struct Data { + uint64 hash; + + int32 activeTime; + int32 nameWidth, activeWidth, infoWidth, ipWidth; + QString name, active, info, ip; + }; + using List = QList; + + void gotAuthorizations(const MTPaccount_Authorizations &result); + + bool _loading; + + Data _current; + List _list; + + class Inner; + ChildWidget _inner; + ScrollableBoxShadow _shadow; + BoxButton _done; + + SingleTimer _shortPollTimer; + mtpRequestId _shortPollRequest; + +}; + +// This class is hold in header because it requires Qt preprocessing. +class SessionsBox::Inner : public ScrolledWidget, public RPCSender { + Q_OBJECT + +public: + Inner(QWidget *parent, SessionsBox::List *list, SessionsBox::Data *current); void listUpdated(); @@ -65,8 +103,8 @@ private: void terminateAllDone(const MTPBool &res); bool terminateAllFail(const RPCError &error); - SessionsList *_list; - SessionData *_current; + SessionsBox::List *_list; + SessionsBox::Data *_current; typedef QMap TerminateButtons; TerminateButtons _terminateButtons; @@ -76,39 +114,3 @@ private: ConfirmBox *_terminateBox; }; - -class SessionsBox : public ScrollableBox, public RPCSender { - Q_OBJECT - -public: - SessionsBox(); - -public slots: - void onOneTerminated(); - void onAllTerminated(); - void onTerminateAll(); - void onShortPollAuthorizations(); - void onNewAuthorization(); - -protected: - void resizeEvent(QResizeEvent *e) override; - void paintEvent(QPaintEvent *e) override; - - void showAll() override; - -private: - void gotAuthorizations(const MTPaccount_Authorizations &result); - - bool _loading; - - SessionData _current; - SessionsList _list; - - SessionsInner _inner; - ScrollableBoxShadow _shadow; - BoxButton _done; - - SingleTimer _shortPollTimer; - mtpRequestId _shortPollRequest; - -}; diff --git a/Telegram/SourceFiles/boxes/sharebox.cpp b/Telegram/SourceFiles/boxes/sharebox.cpp index 15185e72f..bc8135fda 100644 --- a/Telegram/SourceFiles/boxes/sharebox.cpp +++ b/Telegram/SourceFiles/boxes/sharebox.cpp @@ -32,6 +32,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "boxes/confirmbox.h" #include "apiwrap.h" #include "ui/toast/toast.h" +#include "ui/buttons/icon_button.h" #include "history/history_media_types.h" #include "boxes/contactsbox.h" @@ -241,9 +242,7 @@ void ShareBox::onScroll() { _inner->setVisibleTopBottom(scrollTop, scrollTop + scroll->height()); } -namespace internal { - -ShareInner::ShareInner(QWidget *parent, ShareBox::FilterCallback &&filterCallback) : ScrolledWidget(parent) +ShareBox::Inner::Inner(QWidget *parent, ShareBox::FilterCallback &&filterCallback) : ScrolledWidget(parent) , _filterCallback(std_::move(filterCallback)) , _chatsIndexed(std_::make_unique(Dialogs::SortMode::Add)) { _rowsTop = st::shareRowsTop; @@ -269,19 +268,19 @@ ShareInner::ShareInner(QWidget *parent, ShareBox::FilterCallback &&filterCallbac subscribe(FileDownload::ImageLoaded(), [this] { update(); }); } -void ShareInner::setVisibleTopBottom(int visibleTop, int visibleBottom) { +void ShareBox::Inner::setVisibleTopBottom(int visibleTop, int visibleBottom) { loadProfilePhotos(visibleTop); } -void ShareInner::activateSkipRow(int direction) { +void ShareBox::Inner::activateSkipRow(int direction) { activateSkipColumn(direction * _columnCount); } -int ShareInner::displayedChatsCount() const { +int ShareBox::Inner::displayedChatsCount() const { return _filter.isEmpty() ? _chatsIndexed->size() : (_filtered.size() + d_byUsernameFiltered.size()); } -void ShareInner::activateSkipColumn(int direction) { +void ShareBox::Inner::activateSkipColumn(int direction) { if (_active < 0) { if (direction > 0) { setActive(0); @@ -299,11 +298,11 @@ void ShareInner::activateSkipColumn(int direction) { setActive(active); } -void ShareInner::activateSkipPage(int pageHeight, int direction) { +void ShareBox::Inner::activateSkipPage(int pageHeight, int direction) { activateSkipRow(direction * (pageHeight / _rowHeight)); } -void ShareInner::notifyPeerUpdated(const Notify::PeerUpdate &update) { +void ShareBox::Inner::notifyPeerUpdated(const Notify::PeerUpdate &update) { if (update.flags & Notify::PeerUpdate::Flag::NameChanged) { _chatsIndexed->peerNameChanged(update.peer, update.oldNames, update.oldNameFirstChars); } @@ -311,7 +310,7 @@ void ShareInner::notifyPeerUpdated(const Notify::PeerUpdate &update) { updateChat(update.peer); } -void ShareInner::updateChat(PeerData *peer) { +void ShareBox::Inner::updateChat(PeerData *peer) { auto i = _dataMap.find(peer); if (i != _dataMap.cend()) { updateChatName(i.value(), peer); @@ -319,11 +318,11 @@ void ShareInner::updateChat(PeerData *peer) { } } -void ShareInner::updateChatName(Chat *chat, PeerData *peer) { +void ShareBox::Inner::updateChatName(Chat *chat, PeerData *peer) { chat->name.setText(st::shareNameFont, peer->name, _textNameOptions); } -void ShareInner::repaintChatAtIndex(int index) { +void ShareBox::Inner::repaintChatAtIndex(int index) { if (index < 0) return; auto row = index / _columnCount; @@ -331,7 +330,7 @@ void ShareInner::repaintChatAtIndex(int index) { update(rtlrect(_rowsLeft + qFloor(column * _rowWidthReal), row * _rowHeight, _rowWidth, _rowHeight, width())); } -ShareInner::Chat *ShareInner::getChatAtIndex(int index) { +ShareBox::Inner::Chat *ShareBox::Inner::getChatAtIndex(int index) { if (index < 0) return nullptr; auto row = ([this, index]() -> Dialogs::Row* { if (_filter.isEmpty()) return _chatsIndexed->rowAtY(index, 1); @@ -350,11 +349,11 @@ ShareInner::Chat *ShareInner::getChatAtIndex(int index) { return nullptr; } -void ShareInner::repaintChat(PeerData *peer) { +void ShareBox::Inner::repaintChat(PeerData *peer) { repaintChatAtIndex(chatIndex(peer)); } -int ShareInner::chatIndex(PeerData *peer) const { +int ShareBox::Inner::chatIndex(PeerData *peer) const { int index = 0; if (_filter.isEmpty()) { for_const (auto row, _chatsIndexed->all()) { @@ -380,7 +379,7 @@ int ShareInner::chatIndex(PeerData *peer) const { return -1; } -void ShareInner::loadProfilePhotos(int yFrom) { +void ShareBox::Inner::loadProfilePhotos(int yFrom) { if (yFrom < 0) { yFrom = 0; } @@ -419,7 +418,7 @@ void ShareInner::loadProfilePhotos(int yFrom) { } } -ShareInner::Chat *ShareInner::getChat(Dialogs::Row *row) { +ShareBox::Inner::Chat *ShareBox::Inner::getChat(Dialogs::Row *row) { auto data = static_cast(row->attached); if (!data) { auto peer = row->history()->peer; @@ -436,7 +435,7 @@ ShareInner::Chat *ShareInner::getChat(Dialogs::Row *row) { return data; } -void ShareInner::setActive(int active) { +void ShareBox::Inner::setActive(int active) { if (active != _active) { auto changeNameFg = [this](int index, style::color from, style::color to) { if (auto chat = getChatAtIndex(index)) { @@ -453,7 +452,7 @@ void ShareInner::setActive(int active) { emit mustScrollTo(y, y + _rowHeight); } -void ShareInner::paintChat(Painter &p, Chat *chat, int index) { +void ShareBox::Inner::paintChat(Painter &p, Chat *chat, int index) { auto x = _rowsLeft + qFloor((index % _columnCount) * _rowWidthReal); auto y = _rowsTop + (index / _columnCount) * _rowHeight; @@ -474,13 +473,13 @@ void ShareInner::paintChat(Painter &p, Chat *chat, int index) { chat->name.drawLeftElided(p, x + nameLeft, y + nameTop, nameWidth, outerWidth, 2, style::al_top, 0, -1, 0, true); } -ShareInner::Chat::Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) +ShareBox::Inner::Chat::Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) : peer(peer) , checkbox(st::sharePhotoCheckbox, std_::move(updateCallback), PaintUserpicCallback(peer)) , name(st::sharePhotoCheckbox.imageRadius * 2) { } -void ShareInner::paintEvent(QPaintEvent *e) { +void ShareBox::Inner::paintEvent(QPaintEvent *e) { Painter p(this); auto r = e->rect(); @@ -539,20 +538,20 @@ void ShareInner::paintEvent(QPaintEvent *e) { } } -void ShareInner::enterEvent(QEvent *e) { +void ShareBox::Inner::enterEvent(QEvent *e) { setMouseTracking(true); } -void ShareInner::leaveEvent(QEvent *e) { +void ShareBox::Inner::leaveEvent(QEvent *e) { setMouseTracking(false); } -void ShareInner::mouseMoveEvent(QMouseEvent *e) { +void ShareBox::Inner::mouseMoveEvent(QMouseEvent *e) { updateUpon(e->pos()); setCursor((_upon >= 0) ? style::cur_pointer : style::cur_default); } -void ShareInner::updateUpon(const QPoint &pos) { +void ShareBox::Inner::updateUpon(const QPoint &pos) { auto x = pos.x(), y = pos.y(); auto row = (y - _rowsTop) / _rowHeight; auto column = qFloor((x - _rowsLeft) / _rowWidthReal); @@ -567,18 +566,18 @@ void ShareInner::updateUpon(const QPoint &pos) { _upon = upon; } -void ShareInner::mousePressEvent(QMouseEvent *e) { +void ShareBox::Inner::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) { updateUpon(e->pos()); changeCheckState(getChatAtIndex(_upon)); } } -void ShareInner::onSelectActive() { +void ShareBox::Inner::onSelectActive() { changeCheckState(getChatAtIndex(_active > 0 ? _active : 0)); } -void ShareInner::resizeEvent(QResizeEvent *e) { +void ShareBox::Inner::resizeEvent(QResizeEvent *e) { _columnSkip = (width() - _columnCount * st::sharePhotoCheckbox.imageRadius * 2) / float64(_columnCount + 1); _rowWidthReal = st::sharePhotoCheckbox.imageRadius * 2 + _columnSkip; _rowsLeft = qFloor(_columnSkip / 2); @@ -586,7 +585,7 @@ void ShareInner::resizeEvent(QResizeEvent *e) { update(); } -void ShareInner::changeCheckState(Chat *chat) { +void ShareBox::Inner::changeCheckState(Chat *chat) { if (!chat) return; if (!_filter.isEmpty()) { @@ -611,11 +610,11 @@ void ShareInner::changeCheckState(Chat *chat) { emit selectedChanged(); } -bool ShareInner::hasSelected() const { +bool ShareBox::Inner::hasSelected() const { return _selected.size(); } -void ShareInner::updateFilter(QString filter) { +void ShareBox::Inner::updateFilter(QString filter) { _lastQuery = filter.toLower().trimmed(); filter = textSearchKey(filter); @@ -694,7 +693,7 @@ void ShareInner::updateFilter(QString filter) { } } -void ShareInner::peopleReceived(const QString &query, const QVector &people) { +void ShareBox::Inner::peopleReceived(const QString &query, const QVector &people) { _lastQuery = query.toLower().trimmed(); if (_lastQuery.at(0) == '@') _lastQuery = _lastQuery.mid(1); int32 already = _byUsernameFiltered.size(); @@ -724,7 +723,7 @@ void ShareInner::peopleReceived(const QString &query, const QVector &pe refresh(); } -void ShareInner::refresh() { +void ShareBox::Inner::refresh() { auto count = displayedChatsCount(); if (count) { auto rows = (count / _columnCount) + (count % _columnCount ? 1 : 0); @@ -735,13 +734,13 @@ void ShareInner::refresh() { update(); } -ShareInner::~ShareInner() { +ShareBox::Inner::~Inner() { for_const (auto chat, _dataMap) { delete chat; } } -QVector ShareInner::selected() const { +QVector ShareBox::Inner::selected() const { QVector result; result.reserve(_dataMap.size()); for_const (auto chat, _dataMap) { @@ -752,8 +751,6 @@ QVector ShareInner::selected() const { return result; } -} // namespace internal - QString appendShareGameScoreUrl(const QString &url, const FullMsgId &fullId) { auto shareHashData = QByteArray(0x10, Qt::Uninitialized); auto shareHashDataInts = reinterpret_cast(shareHashData.data()); diff --git a/Telegram/SourceFiles/boxes/sharebox.h b/Telegram/SourceFiles/boxes/sharebox.h index a463597b3..2e4252fc2 100644 --- a/Telegram/SourceFiles/boxes/sharebox.h +++ b/Telegram/SourceFiles/boxes/sharebox.h @@ -31,14 +31,14 @@ class Row; class IndexedList; } // namespace Dialogs -namespace internal { -class ShareInner; -} // namespace internal - namespace Notify { struct PeerUpdate; } // namespace Notify +namespace Ui { +class IconButton; +} // namespace Ui + QString appendShareGameScoreUrl(const QString &url, const FullMsgId &fullId); void shareGameScoreByHash(const QString &hash); @@ -82,9 +82,10 @@ private: CopyCallback _copyCallback; SubmitCallback _submitCallback; - ChildWidget _inner; + class Inner; + ChildWidget _inner; ChildWidget _filter; - ChildWidget _filterCancel; + ChildWidget _filterCancel; ChildWidget _copy; ChildWidget _share; @@ -108,13 +109,12 @@ private: }; -namespace internal { - -class ShareInner : public ScrolledWidget, public RPCSender, private base::Subscriber { +// This class is hold in header because it requires Qt preprocessing. +class ShareBox::Inner : public ScrolledWidget, public RPCSender, private base::Subscriber { Q_OBJECT public: - ShareInner(QWidget *parent, ShareBox::FilterCallback &&filterCallback); + Inner(QWidget *parent, ShareBox::FilterCallback &&filterCallback); QVector selected() const; bool hasSelected() const; @@ -127,7 +127,7 @@ public: void setVisibleTopBottom(int visibleTop, int visibleBottom) override; void updateFilter(QString filter = QString()); - ~ShareInner(); + ~Inner(); public slots: void onSelectActive(); @@ -208,5 +208,3 @@ private: ByUsernameDatas d_byUsernameFiltered; }; - -} // namespace internal diff --git a/Telegram/SourceFiles/boxes/stickers_box.cpp b/Telegram/SourceFiles/boxes/stickers_box.cpp new file mode 100644 index 000000000..907a5f9d8 --- /dev/null +++ b/Telegram/SourceFiles/boxes/stickers_box.cpp @@ -0,0 +1,1254 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" +#include "stickers_box.h" + +#include "lang.h" +#include "mainwidget.h" +#include "stickers/stickers.h" +#include "boxes/confirmbox.h" +#include "boxes/stickersetbox.h" +#include "apiwrap.h" +#include "localstorage.h" +#include "dialogs/dialogs_layout.h" +#include "styles/style_stickers.h" + +namespace { + +constexpr int kArchivedLimitFirstRequest = 10; +constexpr int kArchivedLimitPerPage = 30; + +} // namespace + +int32 stickerPacksCount(bool includeDisabledOfficial) { + int32 result = 0; + auto &order = Global::StickerSetsOrder(); + auto &sets = Global::StickerSets(); + for (int i = 0, l = order.size(); i < l; ++i) { + auto it = sets.constFind(order.at(i)); + if (it != sets.cend()) { + if (!(it->flags & MTPDstickerSet::Flag::f_archived) || ((it->flags & MTPDstickerSet::Flag::f_official) && includeDisabledOfficial)) { + ++result; + } + } + } + return result; +} + +StickersBox::StickersBox(Section section) : ItemListBox(st::boxScroll) +, _section(section) +, _inner(this, section) +, _aboutWidth(st::boxWideWidth - 2 * st::stickersReorderPadding.top()) +, _about(st::boxTextFont, lang((section == Section::Archived) ? lng_stickers_packs_archived : lng_stickers_reorder), _defaultOptions, _aboutWidth) { + setup(); +} + +StickersBox::StickersBox(const Stickers::Order &archivedIds) : ItemListBox(st::boxScroll) +, _section(Section::ArchivedPart) +, _inner(this, archivedIds) +, _aboutWidth(st::boxWideWidth - 2 * st::stickersReorderPadding.top()) +, _about(st::boxTextFont, lang(lng_stickers_packs_archived), _defaultOptions, _aboutWidth) { + setup(); +} + +void StickersBox::getArchivedDone(uint64 offsetId, const MTPmessages_ArchivedStickers &result) { + _archivedRequestId = 0; + if (result.type() != mtpc_messages_archivedStickers) { + return; + } + + auto &stickers = result.c_messages_archivedStickers(); + auto &archived = Global::RefArchivedStickerSetsOrder(); + if (offsetId) { + auto index = archived.indexOf(offsetId); + if (index >= 0) { + archived = archived.mid(0, index + 1); + } + } else { + archived.clear(); + } + + bool addedSet = false; + auto &v = stickers.vsets.c_vector().v; + for_const (auto &stickerSet, v) { + const MTPDstickerSet *setData = nullptr; + switch (stickerSet.type()) { + case mtpc_stickerSetCovered: { + auto &d = stickerSet.c_stickerSetCovered(); + if (d.vset.type() == mtpc_stickerSet) { + setData = &d.vset.c_stickerSet(); + } + } break; + case mtpc_stickerSetMultiCovered: { + auto &d = stickerSet.c_stickerSetMultiCovered(); + if (d.vset.type() == mtpc_stickerSet) { + setData = &d.vset.c_stickerSet(); + } + } break; + } + if (!setData) continue; + + if (auto set = Stickers::feedSet(*setData)) { + auto index = archived.indexOf(set->id); + if (archived.isEmpty() || index != archived.size() - 1) { + if (index < archived.size() - 1) { + archived.removeAt(index); + } + archived.push_back(set->id); + } + if (_section == Section::Archived) { + if (_inner->appendSet(*set)) { + addedSet = true; + if (set->stickers.isEmpty() || (set->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { + App::api()->scheduleStickerSetRequest(set->id, set->access); + } + } + } + } + } + if (_section == Section::Installed && !archived.isEmpty()) { + Local::writeArchivedStickers(); + rebuildList(); + } else if (_section == Section::Archived) { + if (addedSet) { + _inner->updateSize(); + setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); + _inner->setVisibleScrollbar((scrollArea()->scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); + App::api()->requestStickerSets(); + } else { + _allArchivedLoaded = v.isEmpty() || (offsetId != 0); + } + } + checkLoadMoreArchived(); +} + +void StickersBox::setup() { + if (_section == Section::Installed) { + Local::readArchivedStickers(); + if (Global::ArchivedStickerSetsOrder().isEmpty()) { + MTPmessages_GetArchivedStickers::Flags flags = 0; + _archivedRequestId = MTP::send(MTPmessages_GetArchivedStickers(MTP_flags(flags), MTP_long(0), MTP_int(kArchivedLimitFirstRequest)), rpcDone(&StickersBox::getArchivedDone, 0ULL)); + } + } else if (_section == Section::Archived) { + // Reload the archived list. + MTPmessages_GetArchivedStickers::Flags flags = 0; + _archivedRequestId = MTP::send(MTPmessages_GetArchivedStickers(MTP_flags(flags), MTP_long(0), MTP_int(kArchivedLimitFirstRequest)), rpcDone(&StickersBox::getArchivedDone, 0ULL)); + + auto &sets = Global::StickerSets(); + for_const (auto setId, Global::ArchivedStickerSetsOrder()) { + auto it = sets.constFind(setId); + if (it != sets.cend()) { + if (it->stickers.isEmpty() && (it->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { + App::api()->scheduleStickerSetRequest(setId, it->access); + } + } + } + App::api()->requestStickerSets(); + } + + int bottomSkip = st::boxPadding.bottom(); + if (_section == Section::Installed) { + _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); + _topShadow.create(this, st::contactsAboutShadow); + + _save.create(this, lang(lng_settings_save), st::defaultBoxButton); + connect(_save, SIGNAL(clicked()), this, SLOT(onSave())); + + _cancel.create(this, lang(lng_cancel), st::cancelBoxButton); + connect(_cancel, SIGNAL(clicked()), this, SLOT(onClose())); + + _bottomShadow.create(this); + bottomSkip = st::boxButtonPadding.top() + _save->height() + st::boxButtonPadding.bottom(); + } else if (_section == Section::ArchivedPart) { + _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); + _topShadow.create(this, st::contactsAboutShadow); + + _save.create(this, lang(lng_box_ok), st::defaultBoxButton); + connect(_save, SIGNAL(clicked()), this, SLOT(onClose())); + } else if (_section == Section::Archived) { + _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); + _topShadow.create(this, st::contactsAboutShadow); + } + ItemListBox::init(_inner, bottomSkip, st::boxTitleHeight + _aboutHeight); + setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); + + connect(App::main(), SIGNAL(stickersUpdated()), this, SLOT(onStickersUpdated())); + App::main()->updateStickers(); + + connect(_inner, SIGNAL(checkDraggingScroll(int)), this, SLOT(onCheckDraggingScroll(int))); + connect(_inner, SIGNAL(noDraggingScroll()), this, SLOT(onNoDraggingScroll())); + connect(&_scrollTimer, SIGNAL(timeout()), this, SLOT(onScrollTimer())); + connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); + _scrollTimer.setSingleShot(false); + + rebuildList(); + + prepare(); +} + +void StickersBox::onScroll() { + updateVisibleTopBottom(); + checkLoadMoreArchived(); +} + +void StickersBox::updateVisibleTopBottom() { + auto visibleTop = scrollArea()->scrollTop(); + auto visibleBottom = visibleTop + scrollArea()->height(); + _inner->setVisibleTopBottom(visibleTop, visibleBottom); +} + +void StickersBox::checkLoadMoreArchived() { + if (_section != Section::Archived) return; + + int scrollTop = scrollArea()->scrollTop(), scrollTopMax = scrollArea()->scrollTopMax(); + if (scrollTop + PreloadHeightsCount * scrollArea()->height() >= scrollTopMax) { + if (!_archivedRequestId && !_allArchivedLoaded) { + uint64 lastId = 0; + for (auto setId = Global::ArchivedStickerSetsOrder().cend(), e = Global::ArchivedStickerSetsOrder().cbegin(); setId != e;) { + --setId; + auto it = Global::StickerSets().constFind(*setId); + if (it != Global::StickerSets().cend()) { + if (it->flags & MTPDstickerSet::Flag::f_archived) { + lastId = it->id; + break; + } + } + } + MTPmessages_GetArchivedStickers::Flags flags = 0; + _archivedRequestId = MTP::send(MTPmessages_GetArchivedStickers(MTP_flags(flags), MTP_long(lastId), MTP_int(kArchivedLimitPerPage)), rpcDone(&StickersBox::getArchivedDone, lastId)); + } + } +} + +int32 StickersBox::countHeight() const { + int bottomSkip = st::boxPadding.bottom(); + if (_section == Section::Installed) { + bottomSkip = st::boxButtonPadding.top() + _save->height() + st::boxButtonPadding.bottom(); + } + return st::boxTitleHeight + _aboutHeight + _inner->height() + bottomSkip; +} + +void StickersBox::disenableDone(const MTPmessages_StickerSetInstallResult &result, mtpRequestId req) { + _disenableRequests.remove(req); + if (_disenableRequests.isEmpty()) { + saveOrder(); + } +} + +bool StickersBox::disenableFail(const RPCError &error, mtpRequestId req) { + if (MTP::isDefaultHandledError(error)) return false; + _disenableRequests.remove(req); + if (_disenableRequests.isEmpty()) { + saveOrder(); + } + return true; +} + +void StickersBox::saveOrder() { + auto order = _inner->getOrder(); + if (order.size() > 1) { + QVector mtpOrder; + mtpOrder.reserve(order.size()); + for (int i = 0, l = order.size(); i < l; ++i) { + mtpOrder.push_back(MTP_long(order.at(i))); + } + + MTPmessages_ReorderStickerSets::Flags flags = 0; + _reorderRequest = MTP::send(MTPmessages_ReorderStickerSets(MTP_flags(flags), MTP_vector(mtpOrder)), rpcDone(&StickersBox::reorderDone), rpcFail(&StickersBox::reorderFail)); + } else { + reorderDone(MTP_boolTrue()); + } +} + +void StickersBox::reorderDone(const MTPBool &result) { + _reorderRequest = 0; + onClose(); +} + +bool StickersBox::reorderFail(const RPCError &result) { + if (MTP::isDefaultHandledError(result)) return false; + _reorderRequest = 0; + Global::SetLastStickersUpdate(0); + App::main()->updateStickers(); + onClose(); + return true; +} + +void StickersBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + auto title = ([this]() { + if (_section == Section::Installed) { + return lang(lng_stickers_packs); + } else if (_section == Section::Featured) { + return lang(lng_stickers_featured); + } + return lang(lng_stickers_archived); + })(); + paintTitle(p, title); + p.translate(0, st::boxTitleHeight); + + if (_aboutHeight > 0) { + p.fillRect(0, 0, width(), _aboutHeight, st::contactsAboutBg); + p.setPen(st::stickersReorderFg); + _about.draw(p, st::stickersReorderPadding.top(), st::stickersReorderPadding.top(), _aboutWidth, style::al_center); + } +} + +void StickersBox::closePressed() { + if (!_disenableRequests.isEmpty()) { + for_const (auto requestId, _disenableRequests) { + MTP::cancel(requestId); + } + _disenableRequests.clear(); + Global::SetLastStickersUpdate(0); + App::main()->updateStickers(); + } else if (_reorderRequest) { + MTP::cancel(_reorderRequest); + _reorderRequest = 0; + Global::SetLastStickersUpdate(0); + App::main()->updateStickers(); + } +} + +StickersBox::~StickersBox() { + if (_section == Section::Archived) { + Local::writeArchivedStickers(); + } +} + +void StickersBox::resizeEvent(QResizeEvent *e) { + ItemListBox::resizeEvent(e); + _inner->resize(width(), _inner->height()); + _inner->setVisibleScrollbar((scrollArea()->scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); + updateVisibleTopBottom(); + if (_topShadow) { + _topShadow->setGeometry(0, st::boxTitleHeight + _aboutHeight, width(), st::lineWidth); + } + if (_save) { + _save->moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save->height()); + } + if (_cancel) { + _cancel->moveToRight(st::boxButtonPadding.right() + _save->width() + st::boxButtonPadding.left(), _save->y()); + _bottomShadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _save->height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); + } +} + +void StickersBox::onStickersUpdated() { + if (_section == Section::Installed || _section == Section::Featured) { + rebuildList(); + } else { + _inner->updateRows(); + } +} + +void StickersBox::rebuildList() { + _inner->rebuild(); + setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); + _inner->setVisibleScrollbar((scrollArea()->scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); +} + +void StickersBox::onCheckDraggingScroll(int localY) { + if (localY < scrollArea()->scrollTop()) { + _scrollDelta = localY - scrollArea()->scrollTop(); + } else if (localY >= scrollArea()->scrollTop() + scrollArea()->height()) { + _scrollDelta = localY - scrollArea()->scrollTop() - scrollArea()->height() + 1; + } else { + _scrollDelta = 0; + } + if (_scrollDelta) { + _scrollTimer.start(15); + } else { + _scrollTimer.stop(); + } +} + +void StickersBox::onNoDraggingScroll() { + _scrollTimer.stop(); +} + +void StickersBox::onScrollTimer() { + int32 d = (_scrollDelta > 0) ? qMin(_scrollDelta * 3 / 20 + 1, int32(MaxScrollSpeed)) : qMax(_scrollDelta * 3 / 20 - 1, -int32(MaxScrollSpeed)); + scrollArea()->scrollToY(scrollArea()->scrollTop() + d); +} + +void StickersBox::onSave() { + if (!_inner->savingStart()) { + return; + } + + bool writeRecent = false, writeArchived = false; + auto &recent = cGetRecentStickers(); + auto &sets = Global::RefStickerSets(); + + auto reorder = _inner->getOrder(), disabled = _inner->getDisabledSets(); + for (int32 i = 0, l = disabled.size(); i < l; ++i) { + auto it = sets.find(disabled.at(i)); + if (it != sets.cend()) { + for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { + if (it->stickers.indexOf(i->first) >= 0) { + i = recent.erase(i); + writeRecent = true; + } else { + ++i; + } + } + if (!(it->flags & MTPDstickerSet::Flag::f_archived)) { + MTPInputStickerSet setId = (it->id && it->access) ? MTP_inputStickerSetID(MTP_long(it->id), MTP_long(it->access)) : MTP_inputStickerSetShortName(MTP_string(it->shortName)); + if (it->flags & MTPDstickerSet::Flag::f_official) { + _disenableRequests.insert(MTP::send(MTPmessages_InstallStickerSet(setId, MTP_boolTrue()), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5)); + it->flags |= MTPDstickerSet::Flag::f_archived; + auto index = Global::RefArchivedStickerSetsOrder().indexOf(it->id); + if (index < 0) { + Global::RefArchivedStickerSetsOrder().push_front(it->id); + writeArchived = true; + } + } else { + _disenableRequests.insert(MTP::send(MTPmessages_UninstallStickerSet(setId), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5)); + int removeIndex = Global::StickerSetsOrder().indexOf(it->id); + if (removeIndex >= 0) Global::RefStickerSetsOrder().removeAt(removeIndex); + if (!(it->flags & MTPDstickerSet_ClientFlag::f_featured) && !(it->flags & MTPDstickerSet_ClientFlag::f_special)) { + sets.erase(it); + } else { + if (it->flags & MTPDstickerSet::Flag::f_archived) { + writeArchived = true; + } + it->flags &= ~(MTPDstickerSet::Flag::f_installed | MTPDstickerSet::Flag::f_archived); + } + } + } + } + } + + // Clear all installed flags, set only for sets from order. + for (auto &set : sets) { + if (!(set.flags & MTPDstickerSet::Flag::f_archived)) { + set.flags &= ~MTPDstickerSet::Flag::f_installed; + } + } + + auto &order(Global::RefStickerSetsOrder()); + order.clear(); + for (int i = 0, l = reorder.size(); i < l; ++i) { + auto it = sets.find(reorder.at(i)); + if (it != sets.cend()) { + if ((it->flags & MTPDstickerSet::Flag::f_archived) && !disabled.contains(it->id)) { + MTPInputStickerSet setId = (it->id && it->access) ? MTP_inputStickerSetID(MTP_long(it->id), MTP_long(it->access)) : MTP_inputStickerSetShortName(MTP_string(it->shortName)); + _disenableRequests.insert(MTP::send(MTPmessages_InstallStickerSet(setId, MTP_boolFalse()), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5)); + it->flags &= ~MTPDstickerSet::Flag::f_archived; + writeArchived = true; + } + order.push_back(reorder.at(i)); + it->flags |= MTPDstickerSet::Flag::f_installed; + } + } + for (auto it = sets.begin(); it != sets.cend();) { + if ((it->flags & MTPDstickerSet_ClientFlag::f_featured) + || (it->flags & MTPDstickerSet::Flag::f_installed) + || (it->flags & MTPDstickerSet::Flag::f_archived) + || (it->flags & MTPDstickerSet_ClientFlag::f_special)) { + ++it; + } else { + it = sets.erase(it); + } + } + + Local::writeInstalledStickers(); + if (writeRecent) Local::writeUserSettings(); + if (writeArchived) Local::writeArchivedStickers(); + emit App::main()->stickersUpdated(); + + if (_disenableRequests.isEmpty()) { + saveOrder(); + } else { + MTP::sendAnything(); + } +} + +void StickersBox::showAll() { + if (_topShadow) { + _topShadow->show(); + } + if (_save) { + _save->show(); + } + if (_cancel) { + _cancel->show(); + _bottomShadow->show(); + } + ItemListBox::showAll(); +} + +StickersBox::Inner::Inner(QWidget *parent, StickersBox::Section section) : ScrolledWidget(parent) +, _section(section) +, _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) +, _a_shifting(animation(this, &Inner::step_shifting)) +, _itemsTop(st::membersPadding.top()) +, _clearWidth(st::normalFont->width(lang(lng_stickers_clear_recent))) +, _removeWidth(st::normalFont->width(lang(lng_stickers_remove))) +, _returnWidth(st::normalFont->width(lang(lng_stickers_return))) +, _restoreWidth(st::normalFont->width(lang(lng_stickers_restore))) +, _aboveShadow(st::boxShadow) { + setup(); +} + +StickersBox::Inner::Inner(QWidget *parent, const Stickers::Order &archivedIds) : ScrolledWidget(parent) +, _section(StickersBox::Section::ArchivedPart) +, _archivedIds(archivedIds) +, _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) +, _a_shifting(animation(this, &Inner::step_shifting)) +, _itemsTop(st::membersPadding.top()) +, _clearWidth(st::normalFont->width(lang(lng_stickers_clear_recent))) +, _removeWidth(st::normalFont->width(lang(lng_stickers_remove))) +, _returnWidth(st::normalFont->width(lang(lng_stickers_return))) +, _restoreWidth(st::normalFont->width(lang(lng_stickers_restore))) +, _aboveShadow(st::boxShadow) { + setup(); +} + +void StickersBox::Inner::setup() { + subscribe(FileDownload::ImageLoaded(), [this] { update(); }); + setMouseTracking(true); +} + +void StickersBox::Inner::onImageLoaded() { + update(); + readVisibleSets(); +} + +void StickersBox::Inner::paintButton(Painter &p, int y, bool selected, const QString &text, int badgeCounter) const { + if (selected) { + p.fillRect(0, y, width(), _buttonHeight, st::contactsBgOver); + } + p.setFont(st::stickersFeaturedFont); + p.setPen(st::stickersFeaturedPen); + p.drawTextLeft(st::stickersFeaturedPosition.x(), y + st::stickersFeaturedPosition.y(), width(), text); + + if (badgeCounter) { + Dialogs::Layout::UnreadBadgeStyle unreadSt; + unreadSt.sizeId = Dialogs::Layout::UnreadBadgeInStickersBox; + unreadSt.size = st::stickersFeaturedBadgeSize; + int unreadRight = width() - (st::contactsPadding.right() + st::contactsCheckPosition.x()); + if (rtl()) unreadRight = width() - unreadRight; + int unreadTop = y + (_buttonHeight - st::stickersFeaturedBadgeSize) / 2; + Dialogs::Layout::paintUnreadCount(p, QString::number(badgeCounter), unreadRight, unreadTop, unreadSt); + } +} + +void StickersBox::Inner::paintEvent(QPaintEvent *e) { + QRect r(e->rect()); + Painter p(this); + + _a_shifting.step(); + + p.fillRect(r, st::white); + p.setClipRect(r); + + int y = st::membersPadding.top(); + if (_hasFeaturedButton) { + auto selected = (_selected == -2); + paintButton(p, y, selected, lang(lng_stickers_featured), Global::FeaturedStickerSetsUnreadCount()); + y += _buttonHeight; + } + if (_hasArchivedButton) { + auto selected = (_selected == -1); + paintButton(p, y, selected, lang(lng_stickers_archived), 0); + y += _buttonHeight; + } + + if (_rows.isEmpty()) { + p.setFont(st::noContactsFont); + p.setPen(st::noContactsColor); + p.drawText(QRect(0, y, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); + } else { + p.translate(0, _itemsTop); + + int32 yFrom = r.y() - _itemsTop, yTo = r.y() + r.height() - _itemsTop; + int32 from = floorclamp(yFrom - _rowHeight, _rowHeight, 0, _rows.size()); + int32 to = ceilclamp(yTo + _rowHeight, _rowHeight, 0, _rows.size()); + p.translate(0, from * _rowHeight); + for (int32 i = from; i < to; ++i) { + if (i != _above) { + paintRow(p, i); + } + p.translate(0, _rowHeight); + } + if (from <= _above && _above < to) { + p.translate(0, (_above - to) * _rowHeight); + paintRow(p, _above); + } + } +} + +void StickersBox::Inner::paintRow(Painter &p, int32 index) { + const StickerSetRow *s(_rows.at(index)); + + int32 xadd = 0, yadd = s->yadd.current(); + if (xadd || yadd) p.translate(xadd, yadd); + + if (_section == Section::Installed) { + bool removeSel = (index == _actionSel && (_actionDown < 0 || index == _actionDown)); + bool removeDown = removeSel && (index == _actionDown); + + p.setFont(removeSel ? st::linkOverFont : st::linkFont); + if (removeDown) { + p.setPen(st::btnDefLink.downColor); + } else { + p.setPen(st::btnDefLink.color); + } + int32 remWidth = s->recent ? _clearWidth : (s->disabled ? (s->official ? _restoreWidth : _returnWidth) : _removeWidth); + QString remText = lang(s->recent ? lng_stickers_clear_recent : (s->disabled ? (s->official ? lng_stickers_restore : lng_stickers_return) : lng_stickers_remove)); + p.drawTextRight(st::contactsPadding.right() + st::contactsCheckPosition.x(), st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, width(), remText, remWidth); + + if (index == _above) { + float64 current = _aboveShadowFadeOpacity.current(); + if (_started >= 0) { + float64 o = aboveShadowOpacity(); + if (o > current) { + _aboveShadowFadeOpacity = anim::fvalue(o, o); + current = o; + } + } + p.setOpacity(current); + QRect row(myrtlrect(_aboveShadow.getDimensions(st::boxShadowShift).left(), st::contactsPadding.top() / 2, width() - (st::contactsPadding.left() / 2) - _scrollbar - _aboveShadow.getDimensions(st::boxShadowShift).right(), _rowHeight - ((st::contactsPadding.top() + st::contactsPadding.bottom()) / 2))); + _aboveShadow.paint(p, row, st::boxShadowShift); + p.fillRect(row, st::white); + p.setOpacity(1); + } + } else if (s->installed && !s->disabled) { + int addw = st::stickersAddSize.width(); + int checkx = width() - (st::contactsPadding.right() + st::contactsCheckPosition.x() + (addw + st::stickersFeaturedInstalled.width()) / 2); + int checky = st::contactsPadding.top() + (st::contactsPhotoSize - st::stickersFeaturedInstalled.height()) / 2; + st::stickersFeaturedInstalled.paint(p, QPoint(checkx, checky), width()); + } else { + int addw = st::stickersAddSize.width(); + int addx = width() - st::contactsPadding.right() - st::contactsCheckPosition.x() - addw; + int addy = st::contactsPadding.top() + (st::contactsPhotoSize - st::stickersAddSize.height()) / 2; + QRect add(myrtlrect(addx, addy, addw, st::stickersAddSize.height())); + + auto textBg = (_actionSel == index) ? st::defaultActiveButton.textBgOver : st::defaultActiveButton.textBg; + App::roundRect(p, add, textBg, ImageRoundRadius::Small); + int iconx = addx + (st::stickersAddSize.width() - st::stickersAddIcon.width()) / 2; + int icony = addy + (st::stickersAddSize.height() - st::stickersAddIcon.height()) / 2; + icony += (_actionSel == index && _actionDown == index) ? (st::defaultActiveButton.downTextTop - st::defaultActiveButton.textTop) : 0; + st::stickersAddIcon.paint(p, QPoint(iconx, icony), width()); + } + + if (s->disabled && _section == Section::Installed) { + p.setOpacity(st::stickersRowDisabledOpacity); + } + if (s->sticker) { + s->sticker->thumb->load(); + QPixmap pix(s->sticker->thumb->pix(s->pixw, s->pixh)); + p.drawPixmapLeft(st::contactsPadding.left() + (st::contactsPhotoSize - s->pixw) / 2, st::contactsPadding.top() + (st::contactsPhotoSize - s->pixh) / 2, width(), pix); + } + + int namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); + int namey = st::contactsPadding.top() + st::contactsNameTop; + int statusx = namex; + int statusy = st::contactsPadding.top() + st::contactsStatusTop; + + p.setFont(st::contactsNameFont); + p.setPen(st::black); + p.drawTextLeft(namex, namey, width(), s->title, s->titleWidth); + + if (s->unread) { + p.setPen(Qt::NoPen); + p.setBrush(st::stickersFeaturedUnreadBg); + + p.setRenderHint(QPainter::HighQualityAntialiasing, true); + p.drawEllipse(rtlrect(namex + s->titleWidth + st::stickersFeaturedUnreadSkip, namey + st::stickersFeaturedUnreadTop, st::stickersFeaturedUnreadSize, st::stickersFeaturedUnreadSize, width())); + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + } + + p.setFont(st::contactsStatusFont); + p.setPen(st::contactsStatusFg); + p.drawTextLeft(statusx, statusy, width(), lng_stickers_count(lt_count, s->count)); + + p.setOpacity(1); + if (xadd || yadd) p.translate(-xadd, -yadd); +} + +void StickersBox::Inner::mousePressEvent(QMouseEvent *e) { + if (_saving) return; + if (_dragging >= 0) mouseReleaseEvent(e); + _mouse = e->globalPos(); + onUpdateSelected(); + + _pressed = _selected; + if (_actionSel >= 0) { + _actionDown = _actionSel; + update(0, _itemsTop + _actionSel * _rowHeight, width(), _rowHeight); + } else if (_selected >= 0 && _section == Section::Installed && !_rows.at(_selected)->recent) { + _above = _dragging = _started = _selected; + _dragStart = mapFromGlobal(_mouse); + } +} + +void StickersBox::Inner::mouseMoveEvent(QMouseEvent *e) { + if (_saving) return; + _mouse = e->globalPos(); + onUpdateSelected(); +} + +void StickersBox::Inner::onUpdateSelected() { + if (_saving) return; + QPoint local(mapFromGlobal(_mouse)); + if (_dragging >= 0) { + int32 shift = 0; + uint64 ms = getms(); + int firstSetIndex = 0; + if (_rows.at(firstSetIndex)->recent) { + ++firstSetIndex; + } + if (_dragStart.y() > local.y() && _dragging > 0) { + shift = -floorclamp(_dragStart.y() - local.y() + (_rowHeight / 2), _rowHeight, 0, _dragging - firstSetIndex); + for (int32 from = _dragging, to = _dragging + shift; from > to; --from) { + qSwap(_rows[from], _rows[from - 1]); + _rows.at(from)->yadd = anim::ivalue(_rows.at(from)->yadd.current() - _rowHeight, 0); + _animStartTimes[from] = ms; + } + } else if (_dragStart.y() < local.y() && _dragging + 1 < _rows.size()) { + shift = floorclamp(local.y() - _dragStart.y() + (_rowHeight / 2), _rowHeight, 0, _rows.size() - _dragging - 1); + for (int32 from = _dragging, to = _dragging + shift; from < to; ++from) { + qSwap(_rows[from], _rows[from + 1]); + _rows.at(from)->yadd = anim::ivalue(_rows.at(from)->yadd.current() + _rowHeight, 0); + _animStartTimes[from] = ms; + } + } + if (shift) { + _dragging += shift; + _above = _dragging; + _dragStart.setY(_dragStart.y() + shift * _rowHeight); + if (!_a_shifting.animating()) { + _a_shifting.start(); + } + } + _rows.at(_dragging)->yadd = anim::ivalue(local.y() - _dragStart.y(), local.y() - _dragStart.y()); + _animStartTimes[_dragging] = 0; + _a_shifting.step(getms(), true); + + emit checkDraggingScroll(local.y()); + } else { + bool in = rect().marginsRemoved(QMargins(0, _itemsTop, 0, st::membersPadding.bottom())).contains(local); + int selected = -2; + int actionSel = -1; + if (in) { + selected = floorclamp(local.y() - _itemsTop, _rowHeight, 0, _rows.size() - 1); + + if (_section == Section::Installed) { + int remw = _rows.at(selected)->recent ? _clearWidth : (_rows.at(selected)->disabled ? (_rows.at(selected)->official ? _restoreWidth : _returnWidth) : _removeWidth); + QRect rem(myrtlrect(width() - st::contactsPadding.right() - st::contactsCheckPosition.x() - remw, st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, remw, st::normalFont->height)); + actionSel = rem.contains(local.x(), local.y() - _itemsTop - selected * _rowHeight) ? selected : -1; + } else if (_rows.at(selected)->installed && !_rows.at(selected)->disabled) { + actionSel = -1; + } else { + int addw = st::stickersAddSize.width(); + int addx = width() - st::contactsPadding.right() - st::contactsCheckPosition.x() - addw; + int addy = st::contactsPadding.top() + (st::contactsPhotoSize - st::stickersAddSize.height()) / 2; + QRect add(myrtlrect(addx, addy, addw, st::stickersAddSize.height())); + actionSel = add.contains(local.x(), local.y() - _itemsTop - selected * _rowHeight) ? selected : -1; + } + } else if (_hasFeaturedButton && QRect(0, st::membersPadding.top(), width(), _buttonHeight).contains(local)) { + selected = -2; + } else if (_hasArchivedButton && QRect(0, st::membersPadding.top() + (_hasFeaturedButton ? _buttonHeight : 0), width(), _buttonHeight).contains(local)) { + selected = -1; + } else { + selected = -3; + } + if (_selected != selected) { + if (((_selected == -1) != (selected == -1)) || ((_selected == -2) != (selected == -2))) { + update(); + } + if (_section != Section::Installed && ((_selected >= 0 || _pressed >= 0) != (selected >= 0 || _pressed >= 0))) { + setCursor((selected >= 0 || _pressed >= 0) ? style::cur_pointer : style::cur_default); + } + _selected = selected; + } + setActionSel(actionSel); + emit noDraggingScroll(); + } +} + +void StickersBox::Inner::onClearRecent() { + if (_clearBox) { + _clearBox->onClose(); + } + + auto &sets = Global::RefStickerSets(); + bool removedCloud = (sets.remove(Stickers::CloudRecentSetId) != 0); + bool removedCustom = (sets.remove(Stickers::CustomSetId) != 0); + + auto &recent = cGetRecentStickers(); + if (!recent.isEmpty()) { + recent.clear(); + Local::writeUserSettings(); + } + + if (removedCustom) Local::writeInstalledStickers(); + if (removedCloud) Local::writeRecentStickers(); + emit App::main()->updateStickers(); + rebuild(); + + MTPmessages_ClearRecentStickers::Flags flags = 0; + MTP::send(MTPmessages_ClearRecentStickers(MTP_flags(flags))); +} + +void StickersBox::Inner::onClearBoxDestroyed(QObject *box) { + if (box == _clearBox) { + _clearBox = nullptr; + } +} + +float64 StickersBox::Inner::aboveShadowOpacity() const { + if (_above < 0) return 0; + + int32 dx = 0; + int32 dy = qAbs(_above * _rowHeight + _rows.at(_above)->yadd.current() - _started * _rowHeight); + return qMin((dx + dy) * 2. / _rowHeight, 1.); +} + +void StickersBox::Inner::mouseReleaseEvent(QMouseEvent *e) { + auto pressed = _pressed; + _pressed = -2; + + if (_section != Section::Installed && _selected < 0 && pressed >= 0) { + setCursor(style::cur_default); + } + + if (_saving) return; + + _mouse = e->globalPos(); + onUpdateSelected(); + if (_actionDown == _actionSel && _actionSel >= 0) { + if (_section == Section::Installed) { + if (_rows[_actionDown]->recent) { + _clearBox = new ConfirmBox(lang(lng_stickers_clear_recent_sure), lang(lng_stickers_clear_recent)); + connect(_clearBox, SIGNAL(confirmed()), this, SLOT(onClearRecent())); + connect(_clearBox, SIGNAL(destroyed(QObject*)), this, SLOT(onClearBoxDestroyed(QObject*))); + Ui::showLayer(_clearBox, KeepOtherLayers); + } else { + _rows[_actionDown]->disabled = !_rows[_actionDown]->disabled; + } + } else { + installSet(_rows[_actionDown]->id); + } + } else if (_dragging >= 0) { + QPoint local(mapFromGlobal(_mouse)); + _rows[_dragging]->yadd.start(0); + _aboveShadowFadeStart = _animStartTimes[_dragging] = getms(); + _aboveShadowFadeOpacity = anim::fvalue(aboveShadowOpacity(), 0); + if (!_a_shifting.animating()) { + _a_shifting.start(); + } + + _dragging = _started = -1; + } else if (pressed == _selected && _actionSel < 0 && _actionDown < 0) { + if (_selected == -2) { + _selected = -3; + Ui::showLayer(new StickersBox(Section::Featured), KeepOtherLayers); + } else if (_selected == -1) { + _selected = -3; + Ui::showLayer(new StickersBox(Section::Archived), KeepOtherLayers); + } else if (_selected >= 0 && _section != Section::Installed) { + auto &sets = Global::RefStickerSets(); + auto it = sets.find(_rows.at(pressed)->id); + if (it != sets.cend()) { + _selected = -3; + Ui::showLayer(new StickerSetBox(Stickers::inputSetId(*it)), KeepOtherLayers); + } + } + } + if (_actionDown >= 0) { + update(0, _itemsTop + _actionDown * _rowHeight, width(), _rowHeight); + _actionDown = -1; + } +} + +void StickersBox::Inner::leaveEvent(QEvent *e) { + _mouse = QPoint(-1, -1); + onUpdateSelected(); +} + +void StickersBox::Inner::installSet(uint64 setId) { + auto &sets = Global::RefStickerSets(); + auto it = sets.find(setId); + if (it == sets.cend()) { + rebuild(); + return; + } + + MTP::send(MTPmessages_InstallStickerSet(Stickers::inputSetId(*it), MTP_boolFalse()), rpcDone(&Inner::installDone), rpcFail(&Inner::installFail, setId)); + + Stickers::installLocally(setId); +} + +void StickersBox::Inner::installDone(const MTPmessages_StickerSetInstallResult &result) { + if (result.type() == mtpc_messages_stickerSetInstallResultArchive) { + Stickers::applyArchivedResult(result.c_messages_stickerSetInstallResultArchive()); + } +} + +bool StickersBox::Inner::installFail(uint64 setId, const RPCError &error) { + if (MTP::isDefaultHandledError(error)) return false; + + auto &sets = Global::RefStickerSets(); + auto it = sets.find(setId); + if (it == sets.cend()) { + rebuild(); + return true; + } + + Stickers::undoInstallLocally(setId); + return true; +} + +void StickersBox::Inner::step_shifting(uint64 ms, bool timer) { + bool animating = false; + int32 updateMin = -1, updateMax = 0; + for (int32 i = 0, l = _animStartTimes.size(); i < l; ++i) { + uint64 start = _animStartTimes.at(i); + if (start) { + if (updateMin < 0) updateMin = i; + updateMax = i; + if (start + st::stickersRowDuration > ms && ms >= start) { + _rows.at(i)->yadd.update(float64(ms - start) / st::stickersRowDuration, anim::sineInOut); + animating = true; + } else { + _rows.at(i)->yadd.finish(); + _animStartTimes[i] = 0; + } + } + } + if (_aboveShadowFadeStart) { + if (updateMin < 0 || updateMin > _above) updateMin = _above; + if (updateMax < _above) updateMin = _above; + if (_aboveShadowFadeStart + st::stickersRowDuration > ms && ms > _aboveShadowFadeStart) { + _aboveShadowFadeOpacity.update(float64(ms - _aboveShadowFadeStart) / st::stickersRowDuration, anim::sineInOut); + animating = true; + } else { + _aboveShadowFadeOpacity.finish(); + _aboveShadowFadeStart = 0; + } + } + if (timer) { + if (_dragging >= 0) { + if (updateMin < 0 || updateMin > _dragging) updateMin = _dragging; + if (updateMax < _dragging) updateMax = _dragging; + } + if (updateMin >= 0) { + update(0, _itemsTop + _rowHeight * (updateMin - 1), width(), _rowHeight * (updateMax - updateMin + 3)); + } + } + if (!animating) { + _above = _dragging; + _a_shifting.stop(); + } +} + +void StickersBox::Inner::clear() { + for (int32 i = 0, l = _rows.size(); i < l; ++i) { + delete _rows.at(i); + } + _rows.clear(); + _animStartTimes.clear(); + _aboveShadowFadeStart = 0; + _aboveShadowFadeOpacity = anim::fvalue(0, 0); + _a_shifting.stop(); + _above = _dragging = _started = -1; + _selected = -3; + _pressed = -3; + _actionDown = -1; + setActionSel(-1); + update(); +} + +void StickersBox::Inner::setActionSel(int32 actionSel) { + if (actionSel != _actionSel) { + if (_actionSel >= 0) update(0, _itemsTop + _actionSel * _rowHeight, width(), _rowHeight); + _actionSel = actionSel; + if (_actionSel >= 0) update(0, _itemsTop + _actionSel * _rowHeight, width(), _rowHeight); + if (_section == Section::Installed) { + setCursor((_actionSel >= 0 && (_actionDown < 0 || _actionDown == _actionSel)) ? style::cur_pointer : style::cur_default); + } + } +} + +void StickersBox::Inner::rebuild() { + _hasFeaturedButton = _hasArchivedButton = false; + _itemsTop = st::membersPadding.top(); + _buttonHeight = st::stickersFeaturedHeight; + if (_section == Section::Installed) { + if (!Global::FeaturedStickerSetsOrder().isEmpty()) { + _itemsTop += _buttonHeight; + _hasFeaturedButton = true; + } + if (!Global::ArchivedStickerSetsOrder().isEmpty()) { + _itemsTop += _buttonHeight; + _hasArchivedButton = true; + } + if (_itemsTop > st::membersPadding.top()) { + _itemsTop += st::membersPadding.top(); + } + } + + int maxNameWidth = countMaxNameWidth(); + + clear(); + auto &order = ([this]() -> const Stickers::Order & { + if (_section == Section::Installed) { + return Global::StickerSetsOrder(); + } else if (_section == Section::Featured) { + return Global::FeaturedStickerSetsOrder(); + } else if (_section == Section::Archived) { + return Global::ArchivedStickerSetsOrder(); + } + return _archivedIds; + })(); + _rows.reserve(order.size() + 1); + _animStartTimes.reserve(order.size() + 1); + + auto &sets = Global::StickerSets(); + if (_section == Section::Installed) { + auto cloudIt = sets.constFind(Stickers::CloudRecentSetId); + if (cloudIt != sets.cend() && !cloudIt->stickers.isEmpty()) { + rebuildAppendSet(cloudIt.value(), maxNameWidth); + } + } + for_const (auto setId, order) { + auto it = sets.constFind(setId); + if (it == sets.cend()) { + continue; + } + + rebuildAppendSet(it.value(), maxNameWidth); + + if (it->stickers.isEmpty() || (it->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { + App::api()->scheduleStickerSetRequest(it->id, it->access); + } + } + App::api()->requestStickerSets(); + updateSize(); +} + +void StickersBox::Inner::updateSize() { + resize(width(), _itemsTop + _rows.size() * _rowHeight + st::membersPadding.bottom()); +} + +void StickersBox::Inner::updateRows() { + int maxNameWidth = countMaxNameWidth(); + auto &sets = Global::StickerSets(); + for_const (auto row, _rows) { + auto it = sets.constFind(row->id); + if (it != sets.cend()) { + auto &set = it.value(); + if (!row->sticker) { + DocumentData *sticker = nullptr; + int pixw = 0, pixh = 0; + fillSetCover(set, &sticker, &pixw, &pixh); + if (sticker) { + row->sticker = sticker; + row->pixw = pixw; + row->pixh = pixh; + } + } + fillSetFlags(set, &row->recent, &row->installed, &row->official, &row->unread, &row->disabled); + if (_section == Section::Installed) { + row->disabled = false; + } + row->title = fillSetTitle(set, maxNameWidth, &row->titleWidth); + row->count = fillSetCount(set); + } + } + update(); +} + +bool StickersBox::Inner::appendSet(const Stickers::Set &set) { + for_const (auto row, _rows) { + if (row->id == set.id) { + return false; + } + } + rebuildAppendSet(set, countMaxNameWidth()); + return true; +} + +int StickersBox::Inner::countMaxNameWidth() const { + int namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); + int namew = st::boxWideWidth - namex - st::contactsPadding.right() - st::contactsCheckPosition.x(); + if (_section == Section::Installed) { + namew -= qMax(qMax(qMax(_returnWidth, _removeWidth), _restoreWidth), _clearWidth); + } else { + namew -= st::stickersAddIcon.width() - st::defaultActiveButton.width; + namew -= st::stickersFeaturedUnreadSize + st::stickersFeaturedUnreadSkip; + } + return namew; +} + +void StickersBox::Inner::rebuildAppendSet(const Stickers::Set &set, int maxNameWidth) { + bool recent = false, installed = false, official = false, unread = false, disabled = false; + fillSetFlags(set, &recent, &installed, &official, &unread, &disabled); + if (_section == Section::Installed && disabled) { + return; + } + + DocumentData *sticker = nullptr; + int pixw = 0, pixh = 0; + fillSetCover(set, &sticker, &pixw, &pixh); + + int titleWidth = 0; + QString title = fillSetTitle(set, maxNameWidth, &titleWidth); + int count = fillSetCount(set); + + _rows.push_back(new StickerSetRow(set.id, sticker, count, title, titleWidth, installed, official, unread, disabled, recent, pixw, pixh)); + _animStartTimes.push_back(0); +} + +void StickersBox::Inner::fillSetCover(const Stickers::Set &set, DocumentData **outSticker, int *outWidth, int *outHeight) const { + if (set.stickers.isEmpty()) { + *outSticker = nullptr; + *outWidth = *outHeight = 0; + return; + } + auto sticker = *outSticker = set.stickers.front(); + + auto pixw = sticker->thumb->width(); + auto pixh = sticker->thumb->height(); + if (pixw > st::contactsPhotoSize) { + if (pixw > pixh) { + pixh = (pixh * st::contactsPhotoSize) / pixw; + pixw = st::contactsPhotoSize; + } else { + pixw = (pixw * st::contactsPhotoSize) / pixh; + pixh = st::contactsPhotoSize; + } + } else if (pixh > st::contactsPhotoSize) { + pixw = (pixw * st::contactsPhotoSize) / pixh; + pixh = st::contactsPhotoSize; + } + *outWidth = pixw; + *outHeight = pixh; +} + +int StickersBox::Inner::fillSetCount(const Stickers::Set &set) const { + int result = set.stickers.isEmpty() ? set.count : set.stickers.size(), added = 0; + if (set.id == Stickers::CloudRecentSetId) { + auto customIt = Global::StickerSets().constFind(Stickers::CustomSetId); + if (customIt != Global::StickerSets().cend()) { + added = customIt->stickers.size(); + for_const (auto &sticker, cGetRecentStickers()) { + if (customIt->stickers.indexOf(sticker.first) < 0) { + ++added; + } + } + } else { + added = cGetRecentStickers().size(); + } + } + return result + added; +} + +QString StickersBox::Inner::fillSetTitle(const Stickers::Set &set, int maxNameWidth, int *outTitleWidth) const { + auto result = set.title; + int titleWidth = st::contactsNameFont->width(result); + if (titleWidth > maxNameWidth) { + result = st::contactsNameFont->elided(result, maxNameWidth); + titleWidth = st::contactsNameFont->width(result); + } + if (outTitleWidth) { + *outTitleWidth = titleWidth; + } + return result; +} + +void StickersBox::Inner::fillSetFlags(const Stickers::Set &set, bool *outRecent, bool *outInstalled, bool *outOfficial, bool *outUnread, bool *outDisabled) { + *outRecent = (set.id == Stickers::CloudRecentSetId); + *outInstalled = true; + *outOfficial = true; + *outUnread = false; + *outDisabled = false; + if (!*outRecent) { + *outInstalled = (set.flags & MTPDstickerSet::Flag::f_installed); + *outOfficial = (set.flags & MTPDstickerSet::Flag::f_official); + *outDisabled = (set.flags & MTPDstickerSet::Flag::f_archived); + if (_section == Section::Featured) { + *outUnread = (set.flags & MTPDstickerSet_ClientFlag::f_unread); + } + } +} + +Stickers::Order StickersBox::Inner::getOrder() const { + Stickers::Order result; + result.reserve(_rows.size()); + for (int32 i = 0, l = _rows.size(); i < l; ++i) { + if (_rows.at(i)->disabled || _rows.at(i)->recent) { + continue; + } + result.push_back(_rows.at(i)->id); + } + return result; +} + +Stickers::Order StickersBox::Inner::getDisabledSets() const { + Stickers::Order result; + result.reserve(_rows.size()); + for (int32 i = 0, l = _rows.size(); i < l; ++i) { + if (_rows.at(i)->disabled) { + result.push_back(_rows.at(i)->id); + } + } + return result; +} + +void StickersBox::Inner::setVisibleTopBottom(int visibleTop, int visibleBottom) { + if (_section == Section::Featured) { + _visibleTop = visibleTop; + _visibleBottom = visibleBottom; + readVisibleSets(); + } +} + +void StickersBox::Inner::readVisibleSets() { + auto itemsVisibleTop = _visibleTop - _itemsTop; + auto itemsVisibleBottom = _visibleBottom - _itemsTop; + int rowFrom = floorclamp(itemsVisibleTop, _rowHeight, 0, _rows.size()); + int rowTo = ceilclamp(itemsVisibleBottom, _rowHeight, 0, _rows.size()); + for (int i = rowFrom; i < rowTo; ++i) { + if (!_rows[i]->unread) { + continue; + } + if (i * _rowHeight < itemsVisibleTop || (i + 1) * _rowHeight > itemsVisibleBottom) { + continue; + } + if (!_rows[i]->sticker || _rows[i]->sticker->thumb->loaded() || _rows[i]->sticker->loaded()) { + Stickers::markFeaturedAsRead(_rows[i]->id); + } + } +} + +void StickersBox::Inner::setVisibleScrollbar(int32 width) { + _scrollbar = width; +} + +StickersBox::Inner::~Inner() { + clear(); +} diff --git a/Telegram/SourceFiles/boxes/stickers_box.h b/Telegram/SourceFiles/boxes/stickers_box.h new file mode 100644 index 000000000..3524a7db8 --- /dev/null +++ b/Telegram/SourceFiles/boxes/stickers_box.h @@ -0,0 +1,239 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#pragma once + +#include "abstractbox.h" + +class ConfirmBox; + +namespace Ui { +class PlainShadow; +} // namespace Ui + +class StickersBox : public ItemListBox, public RPCSender { + Q_OBJECT + +public: + enum class Section { + Installed, + Featured, + Archived, + ArchivedPart, + }; + StickersBox(Section section = Section::Installed); + StickersBox(const Stickers::Order &archivedIds); + + ~StickersBox(); + +public slots: + void onStickersUpdated(); + + void onCheckDraggingScroll(int localY); + void onNoDraggingScroll(); + void onScrollTimer(); + + void onSave(); + +private slots: + void onScroll(); + +protected: + void resizeEvent(QResizeEvent *e) override; + void paintEvent(QPaintEvent *e) override; + + void closePressed() override; + void showAll() override; + +private: + void setup(); + int32 countHeight() const; + void rebuildList(); + + void disenableDone(const MTPmessages_StickerSetInstallResult &result, mtpRequestId req); + bool disenableFail(const RPCError &error, mtpRequestId req); + void reorderDone(const MTPBool &result); + bool reorderFail(const RPCError &result); + void saveOrder(); + + void updateVisibleTopBottom(); + void checkLoadMoreArchived(); + void getArchivedDone(uint64 offsetId, const MTPmessages_ArchivedStickers &result); + + Section _section; + + class Inner; + ChildWidget _inner; + ChildWidget _save = { nullptr }; + ChildWidget _cancel = { nullptr }; + OrderedSet _disenableRequests; + mtpRequestId _reorderRequest = 0; + ChildWidget _topShadow = { nullptr }; + ChildWidget _bottomShadow = { nullptr }; + + QTimer _scrollTimer; + int32 _scrollDelta = 0; + + int _aboutWidth = 0; + Text _about; + int _aboutHeight = 0; + + mtpRequestId _archivedRequestId = 0; + bool _allArchivedLoaded = false; + +}; + +int32 stickerPacksCount(bool includeDisabledOfficial = false); + +// This class is hold in header because it requires Qt preprocessing. +class StickersBox::Inner : public ScrolledWidget, public RPCSender, private base::Subscriber { + Q_OBJECT + +public: + using Section = StickersBox::Section; + Inner(QWidget *parent, Section section); + Inner(QWidget *parent, const Stickers::Order &archivedIds); + + void rebuild(); + void updateSize(); + void updateRows(); // refresh only pack cover stickers + bool appendSet(const Stickers::Set &set); + bool savingStart() { + if (_saving) return false; + _saving = true; + return true; + } + + Stickers::Order getOrder() const; + Stickers::Order getDisabledSets() const; + + void setVisibleScrollbar(int32 width); + void setVisibleTopBottom(int visibleTop, int visibleBottom) override; + + ~Inner(); + +protected: + void paintEvent(QPaintEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + void leaveEvent(QEvent *e) override; + +signals: + void checkDraggingScroll(int localY); + void noDraggingScroll(); + +public slots: + void onUpdateSelected(); + void onClearRecent(); + void onClearBoxDestroyed(QObject *box); + +private slots: + void onImageLoaded(); + +private: + void setup(); + void paintButton(Painter &p, int y, bool selected, const QString &text, int badgeCounter) const; + + void step_shifting(uint64 ms, bool timer); + void paintRow(Painter &p, int32 index); + void clear(); + void setActionSel(int32 actionSel); + float64 aboveShadowOpacity() const; + + void readVisibleSets(); + + void installSet(uint64 setId); + void installDone(const MTPmessages_StickerSetInstallResult &result); + bool installFail(uint64 setId, const RPCError &error); + + Section _section; + Stickers::Order _archivedIds; + + int32 _rowHeight; + struct StickerSetRow { + StickerSetRow(uint64 id, DocumentData *sticker, int32 count, const QString &title, int titleWidth, bool installed, bool official, bool unread, bool disabled, bool recent, int32 pixw, int32 pixh) : id(id) + , sticker(sticker) + , count(count) + , title(title) + , titleWidth(titleWidth) + , installed(installed) + , official(official) + , unread(unread) + , disabled(disabled) + , recent(recent) + , pixw(pixw) + , pixh(pixh) + , yadd(0, 0) { + } + uint64 id; + DocumentData *sticker; + int32 count; + QString title; + int titleWidth; + bool installed, official, unread, disabled, recent; + int32 pixw, pixh; + anim::ivalue yadd; + }; + using StickerSetRows = QList; + + void rebuildAppendSet(const Stickers::Set &set, int maxNameWidth); + void fillSetCover(const Stickers::Set &set, DocumentData **outSticker, int *outWidth, int *outHeight) const; + int fillSetCount(const Stickers::Set &set) const; + QString fillSetTitle(const Stickers::Set &set, int maxNameWidth, int *outTitleWidth) const; + void fillSetFlags(const Stickers::Set &set, bool *outRecent, bool *outInstalled, bool *outOfficial, bool *outUnread, bool *outDisabled); + + int countMaxNameWidth() const; + + StickerSetRows _rows; + QList _animStartTimes; + uint64 _aboveShadowFadeStart = 0; + anim::fvalue _aboveShadowFadeOpacity = { 0., 0. }; + Animation _a_shifting; + + int _visibleTop = 0; + int _visibleBottom = 0; + int _itemsTop = 0; + + bool _saving = false; + + int _actionSel = -1; + int _actionDown = -1; + + int _clearWidth, _removeWidth, _returnWidth, _restoreWidth; + + ConfirmBox *_clearBox = nullptr; + + int _buttonHeight = 0; + bool _hasFeaturedButton = false; + bool _hasArchivedButton = false; + + QPoint _mouse; + int _selected = -3; // -2 - featured stickers button, -1 - archived stickers button + int _pressed = -2; + QPoint _dragStart; + int _started = -1; + int _dragging = -1; + int _above = -1; + + Ui::RectShadow _aboveShadow; + + int32 _scrollbar = 0; +}; diff --git a/Telegram/SourceFiles/boxes/stickersetbox.cpp b/Telegram/SourceFiles/boxes/stickersetbox.cpp index bbd97414c..3bf665a98 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.cpp +++ b/Telegram/SourceFiles/boxes/stickersetbox.cpp @@ -19,9 +19,9 @@ Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ #include "stdafx.h" -#include "lang.h" +#include "boxes/stickersetbox.h" -#include "stickersetbox.h" +#include "lang.h" #include "mainwidget.h" #include "mainwindow.h" #include "stickers/stickers.h" @@ -32,20 +32,128 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "styles/style_boxes.h" #include "styles/style_stickers.h" -namespace { +StickerSetBox::StickerSetBox(const MTPInputStickerSet &set) : ScrollableBox(st::stickersScroll) +, _inner(this, set) +, _shadow(this) +, _add(this, lang(lng_stickers_add_pack), st::defaultBoxButton) +, _share(this, lang(lng_stickers_share_pack), st::defaultBoxButton) +, _cancel(this, lang(lng_cancel), st::cancelBoxButton) +, _done(this, lang(lng_about_done), st::defaultBoxButton) { + setMaxHeight(st::stickersMaxHeight); + connect(App::main(), SIGNAL(stickersUpdated()), this, SLOT(onStickersUpdated())); -constexpr int kArchivedLimitFirstRequest = 10; -constexpr int kArchivedLimitPerPage = 30; + init(_inner, st::boxButtonPadding.bottom() + _cancel.height() + st::boxButtonPadding.top()); -} // namespace + connect(&_add, SIGNAL(clicked()), this, SLOT(onAddStickers())); + connect(&_share, SIGNAL(clicked()), this, SLOT(onShareStickers())); + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_done, SIGNAL(clicked()), this, SLOT(onClose())); -StickerSetInner::StickerSetInner(const MTPInputStickerSet &set) : ScrolledWidget() + connect(_inner, SIGNAL(updateButtons()), this, SLOT(onUpdateButtons())); + connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); + + connect(_inner, SIGNAL(installed(uint64)), this, SLOT(onInstalled(uint64))); + + onStickersUpdated(); + + onScroll(); + + prepare(); +} + +void StickerSetBox::onInstalled(uint64 setId) { + emit installed(setId); + onClose(); +} + +void StickerSetBox::onStickersUpdated() { + showAll(); +} + +void StickerSetBox::onAddStickers() { + _inner->install(); +} + +void StickerSetBox::onShareStickers() { + QString url = qsl("https://telegram.me/addstickers/") + _inner->shortName(); + QApplication::clipboard()->setText(url); + Ui::showLayer(new InformBox(lang(lng_stickers_copied))); +} + +void StickerSetBox::onUpdateButtons() { + if (!_cancel.isHidden() || !_done.isHidden()) { + showAll(); + } +} + +void StickerSetBox::onScroll() { + auto scroll = scrollArea(); + auto scrollTop = scroll->scrollTop(); + _inner->setVisibleTopBottom(scrollTop, scrollTop + scroll->height()); +} + +void StickerSetBox::showAll() { + ScrollableBox::showAll(); + int32 cnt = _inner->notInstalled(); + if (_inner->loaded()) { + _shadow.show(); + if (_inner->notInstalled()) { + _add.show(); + _cancel.show(); + _share.hide(); + _done.hide(); + } else if (_inner->official()) { + _add.hide(); + _share.hide(); + _cancel.hide(); + _done.show(); + } else { + _share.show(); + _cancel.show(); + _add.hide(); + _done.hide(); + } + } else { + _shadow.hide(); + _add.hide(); + _share.hide(); + _cancel.show(); + _done.hide(); + } + resizeEvent(0); + update(); +} + +void StickerSetBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + paintTitle(p, _inner->title()); +} + +void StickerSetBox::resizeEvent(QResizeEvent *e) { + ScrollableBox::resizeEvent(e); + _inner->resize(width(), _inner->height()); + _shadow.setGeometry(0, height() - st::boxButtonPadding.bottom() - _cancel.height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); + _add.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _add.height()); + _share.moveToRight(st::boxButtonPadding.right(), _add.y()); + _done.moveToRight(st::boxButtonPadding.right(), _add.y()); + if (_add.isHidden() && _share.isHidden()) { + _cancel.moveToRight(st::boxButtonPadding.right(), _add.y()); + } else if (_add.isHidden()) { + _cancel.moveToRight(st::boxButtonPadding.right() + _share.width() + st::boxButtonPadding.left(), _add.y()); + } else { + _cancel.moveToRight(st::boxButtonPadding.right() + _add.width() + st::boxButtonPadding.left(), _add.y()); + } +} + +StickerSetBox::Inner::Inner(QWidget *parent, const MTPInputStickerSet &set) : ScrolledWidget(parent) , _input(set) { switch (set.type()) { case mtpc_inputStickerSetID: _setId = set.c_inputStickerSetID().vid.v; _setAccess = set.c_inputStickerSetID().vaccess_hash.v; break; case mtpc_inputStickerSetShortName: _setShortName = qs(set.c_inputStickerSetShortName().vshort_name); break; } - MTP::send(MTPmessages_GetStickerSet(_input), rpcDone(&StickerSetInner::gotSet), rpcFail(&StickerSetInner::failedSet)); + MTP::send(MTPmessages_GetStickerSet(_input), rpcDone(&Inner::gotSet), rpcFail(&Inner::failedSet)); App::main()->updateStickers(); subscribe(FileDownload::ImageLoaded(), [this] { update(); }); @@ -56,7 +164,7 @@ StickerSetInner::StickerSetInner(const MTPInputStickerSet &set) : ScrolledWidget connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreview())); } -void StickerSetInner::gotSet(const MTPmessages_StickerSet &set) { +void StickerSetBox::Inner::gotSet(const MTPmessages_StickerSet &set) { _pack.clear(); _emoji.clear(); _packOvers.clear(); @@ -126,7 +234,7 @@ void StickerSetInner::gotSet(const MTPmessages_StickerSet &set) { emit updateButtons(); } -bool StickerSetInner::failedSet(const RPCError &error) { +bool StickerSetBox::Inner::failedSet(const RPCError &error) { if (MTP::isDefaultHandledError(error)) return false; _loaded = true; @@ -136,7 +244,7 @@ bool StickerSetInner::failedSet(const RPCError &error) { return true; } -void StickerSetInner::installDone(const MTPmessages_StickerSetInstallResult &result) { +void StickerSetBox::Inner::installDone(const MTPmessages_StickerSetInstallResult &result) { auto &sets = Global::RefStickerSets(); bool wasArchived = (_setFlags & MTPDstickerSet::Flag::f_archived); @@ -189,7 +297,7 @@ void StickerSetInner::installDone(const MTPmessages_StickerSetInstallResult &res emit installed(_setId); } -bool StickerSetInner::installFail(const RPCError &error) { +bool StickerSetBox::Inner::installFail(const RPCError &error) { if (MTP::isDefaultHandledError(error)) return false; Ui::showLayer(new InformBox(lang(lng_stickers_not_found))); @@ -197,14 +305,14 @@ bool StickerSetInner::installFail(const RPCError &error) { return true; } -void StickerSetInner::mousePressEvent(QMouseEvent *e) { +void StickerSetBox::Inner::mousePressEvent(QMouseEvent *e) { int index = stickerFromGlobalPos(e->globalPos()); if (index >= 0 && index < _pack.size()) { _previewTimer.start(QApplication::startDragTime()); } } -void StickerSetInner::mouseMoveEvent(QMouseEvent *e) { +void StickerSetBox::Inner::mouseMoveEvent(QMouseEvent *e) { updateSelected(); if (_previewShown >= 0) { int index = stickerFromGlobalPos(e->globalPos()); @@ -215,7 +323,7 @@ void StickerSetInner::mouseMoveEvent(QMouseEvent *e) { } } -void StickerSetInner::mouseReleaseEvent(QMouseEvent *e) { +void StickerSetBox::Inner::mouseReleaseEvent(QMouseEvent *e) { if (_previewShown >= 0) { _previewShown = -1; return; @@ -233,7 +341,7 @@ void StickerSetInner::mouseReleaseEvent(QMouseEvent *e) { } } -void StickerSetInner::updateSelected() { +void StickerSetBox::Inner::updateSelected() { auto index = stickerFromGlobalPos(QCursor::pos()); if (isMasksSet()) { index = -1; @@ -246,7 +354,7 @@ void StickerSetInner::updateSelected() { } } -void StickerSetInner::startOverAnimation(int index, float64 from, float64 to) { +void StickerSetBox::Inner::startOverAnimation(int index, float64 from, float64 to) { if (index >= 0 && index < _packOvers.size()) { _packOvers[index].start([this, index] { int row = index / StickerPanPerRow; @@ -258,7 +366,7 @@ void StickerSetInner::startOverAnimation(int index, float64 from, float64 to) { } } -void StickerSetInner::onPreview() { +void StickerSetBox::Inner::onPreview() { int index = stickerFromGlobalPos(QCursor::pos()); if (index >= 0 && index < _pack.size()) { _previewShown = index; @@ -266,7 +374,7 @@ void StickerSetInner::onPreview() { } } -int32 StickerSetInner::stickerFromGlobalPos(const QPoint &p) const { +int32 StickerSetBox::Inner::stickerFromGlobalPos(const QPoint &p) const { QPoint l(mapFromGlobal(p)); if (rtl()) l.setX(width() - l.x()); int32 row = (l.y() >= st::stickersPadding.top()) ? qFloor((l.y() - st::stickersPadding.top()) / st::stickersSize.height()) : -1; @@ -278,7 +386,7 @@ int32 StickerSetInner::stickerFromGlobalPos(const QPoint &p) const { return -1; } -void StickerSetInner::paintEvent(QPaintEvent *e) { +void StickerSetBox::Inner::paintEvent(QPaintEvent *e) { QRect r(e->rect()); Painter p(this); @@ -331,1376 +439,42 @@ void StickerSetInner::paintEvent(QPaintEvent *e) { } } -void StickerSetInner::setVisibleTopBottom(int visibleTop, int visibleBottom) { +void StickerSetBox::Inner::setVisibleTopBottom(int visibleTop, int visibleBottom) { _visibleTop = visibleTop; _visibleBottom = visibleBottom; } -bool StickerSetInner::loaded() const { +bool StickerSetBox::Inner::loaded() const { return _loaded && !_pack.isEmpty(); } -int32 StickerSetInner::notInstalled() const { +int32 StickerSetBox::Inner::notInstalled() const { if (!_loaded) return 0; auto it = Global::StickerSets().constFind(_setId); if (it == Global::StickerSets().cend() || !(it->flags & MTPDstickerSet::Flag::f_installed) || (it->flags & MTPDstickerSet::Flag::f_archived)) return _pack.size(); return 0; } -bool StickerSetInner::official() const { +bool StickerSetBox::Inner::official() const { return _loaded && _setShortName.isEmpty(); } -QString StickerSetInner::title() const { +QString StickerSetBox::Inner::title() const { return _loaded ? (_pack.isEmpty() ? lang(lng_attach_failed) : _title) : lang(lng_contacts_loading); } -QString StickerSetInner::shortName() const { +QString StickerSetBox::Inner::shortName() const { return _setShortName; } -void StickerSetInner::install() { +void StickerSetBox::Inner::install() { if (isMasksSet()) { Ui::showLayer(new InformBox(lang(lng_stickers_masks_pack)), KeepOtherLayers); return; } if (_installRequest) return; - _installRequest = MTP::send(MTPmessages_InstallStickerSet(_input, MTP_bool(false)), rpcDone(&StickerSetInner::installDone), rpcFail(&StickerSetInner::installFail)); + _installRequest = MTP::send(MTPmessages_InstallStickerSet(_input, MTP_bool(false)), rpcDone(&Inner::installDone), rpcFail(&Inner::installFail)); } -StickerSetInner::~StickerSetInner() { -} - -StickerSetBox::StickerSetBox(const MTPInputStickerSet &set) : ScrollableBox(st::stickersScroll) -, _inner(set) -, _shadow(this) -, _add(this, lang(lng_stickers_add_pack), st::defaultBoxButton) -, _share(this, lang(lng_stickers_share_pack), st::defaultBoxButton) -, _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, _done(this, lang(lng_about_done), st::defaultBoxButton) { - setMaxHeight(st::stickersMaxHeight); - connect(App::main(), SIGNAL(stickersUpdated()), this, SLOT(onStickersUpdated())); - - init(&_inner, st::boxButtonPadding.bottom() + _cancel.height() + st::boxButtonPadding.top()); - - connect(&_add, SIGNAL(clicked()), this, SLOT(onAddStickers())); - connect(&_share, SIGNAL(clicked()), this, SLOT(onShareStickers())); - connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); - connect(&_done, SIGNAL(clicked()), this, SLOT(onClose())); - - connect(&_inner, SIGNAL(updateButtons()), this, SLOT(onUpdateButtons())); - connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); - - connect(&_inner, SIGNAL(installed(uint64)), this, SLOT(onInstalled(uint64))); - - onStickersUpdated(); - - onScroll(); - - prepare(); -} - -void StickerSetBox::onInstalled(uint64 setId) { - emit installed(setId); - onClose(); -} - -void StickerSetBox::onStickersUpdated() { - showAll(); -} - -void StickerSetBox::onAddStickers() { - _inner.install(); -} - -void StickerSetBox::onShareStickers() { - QString url = qsl("https://telegram.me/addstickers/") + _inner.shortName(); - QApplication::clipboard()->setText(url); - Ui::showLayer(new InformBox(lang(lng_stickers_copied))); -} - -void StickerSetBox::onUpdateButtons() { - if (!_cancel.isHidden() || !_done.isHidden()) { - showAll(); - } -} - -void StickerSetBox::onScroll() { - auto scroll = scrollArea(); - auto scrollTop = scroll->scrollTop(); - _inner.setVisibleTopBottom(scrollTop, scrollTop + scroll->height()); -} - -void StickerSetBox::showAll() { - ScrollableBox::showAll(); - int32 cnt = _inner.notInstalled(); - if (_inner.loaded()) { - _shadow.show(); - if (_inner.notInstalled()) { - _add.show(); - _cancel.show(); - _share.hide(); - _done.hide(); - } else if (_inner.official()) { - _add.hide(); - _share.hide(); - _cancel.hide(); - _done.show(); - } else { - _share.show(); - _cancel.show(); - _add.hide(); - _done.hide(); - } - } else { - _shadow.hide(); - _add.hide(); - _share.hide(); - _cancel.show(); - _done.hide(); - } - resizeEvent(0); - update(); -} - -void StickerSetBox::paintEvent(QPaintEvent *e) { - Painter p(this); - if (paint(p)) return; - - paintTitle(p, _inner.title()); -} - -void StickerSetBox::resizeEvent(QResizeEvent *e) { - ScrollableBox::resizeEvent(e); - _inner.resize(width(), _inner.height()); - _shadow.setGeometry(0, height() - st::boxButtonPadding.bottom() - _cancel.height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); - _add.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _add.height()); - _share.moveToRight(st::boxButtonPadding.right(), _add.y()); - _done.moveToRight(st::boxButtonPadding.right(), _add.y()); - if (_add.isHidden() && _share.isHidden()) { - _cancel.moveToRight(st::boxButtonPadding.right(), _add.y()); - } else if (_add.isHidden()) { - _cancel.moveToRight(st::boxButtonPadding.right() + _share.width() + st::boxButtonPadding.left(), _add.y()); - } else { - _cancel.moveToRight(st::boxButtonPadding.right() + _add.width() + st::boxButtonPadding.left(), _add.y()); - } -} - -namespace internal { - -StickersInner::StickersInner(StickersBox::Section section) : ScrolledWidget() -, _section(section) -, _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) -, _a_shifting(animation(this, &StickersInner::step_shifting)) -, _itemsTop(st::membersPadding.top()) -, _clearWidth(st::normalFont->width(lang(lng_stickers_clear_recent))) -, _removeWidth(st::normalFont->width(lang(lng_stickers_remove))) -, _returnWidth(st::normalFont->width(lang(lng_stickers_return))) -, _restoreWidth(st::normalFont->width(lang(lng_stickers_restore))) -, _aboveShadow(st::boxShadow) { - setup(); -} - -StickersInner::StickersInner(const Stickers::Order &archivedIds) : ScrolledWidget() -, _section(StickersBox::Section::ArchivedPart) -, _archivedIds(archivedIds) -, _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) -, _a_shifting(animation(this, &StickersInner::step_shifting)) -, _itemsTop(st::membersPadding.top()) -, _clearWidth(st::normalFont->width(lang(lng_stickers_clear_recent))) -, _removeWidth(st::normalFont->width(lang(lng_stickers_remove))) -, _returnWidth(st::normalFont->width(lang(lng_stickers_return))) -, _restoreWidth(st::normalFont->width(lang(lng_stickers_restore))) -, _aboveShadow(st::boxShadow) { - setup(); -} - -void StickersInner::setup() { - subscribe(FileDownload::ImageLoaded(), [this] { update(); }); - setMouseTracking(true); -} - -void StickersInner::onImageLoaded() { - update(); - readVisibleSets(); -} - -void StickersInner::paintButton(Painter &p, int y, bool selected, const QString &text, int badgeCounter) const { - if (selected) { - p.fillRect(0, y, width(), _buttonHeight, st::contactsBgOver); - } - p.setFont(st::stickersFeaturedFont); - p.setPen(st::stickersFeaturedPen); - p.drawTextLeft(st::stickersFeaturedPosition.x(), y + st::stickersFeaturedPosition.y(), width(), text); - - if (badgeCounter) { - Dialogs::Layout::UnreadBadgeStyle unreadSt; - unreadSt.sizeId = Dialogs::Layout::UnreadBadgeInStickersBox; - unreadSt.size = st::stickersFeaturedBadgeSize; - int unreadRight = width() - (st::contactsPadding.right() + st::contactsCheckPosition.x()); - if (rtl()) unreadRight = width() - unreadRight; - int unreadTop = y + (_buttonHeight - st::stickersFeaturedBadgeSize) / 2; - Dialogs::Layout::paintUnreadCount(p, QString::number(badgeCounter), unreadRight, unreadTop, unreadSt); - } -} - -void StickersInner::paintEvent(QPaintEvent *e) { - QRect r(e->rect()); - Painter p(this); - - _a_shifting.step(); - - p.fillRect(r, st::white); - p.setClipRect(r); - - int y = st::membersPadding.top(); - if (_hasFeaturedButton) { - auto selected = (_selected == -2); - paintButton(p, y, selected, lang(lng_stickers_featured), Global::FeaturedStickerSetsUnreadCount()); - y += _buttonHeight; - } - if (_hasArchivedButton) { - auto selected = (_selected == -1); - paintButton(p, y, selected, lang(lng_stickers_archived), 0); - y += _buttonHeight; - } - - if (_rows.isEmpty()) { - p.setFont(st::noContactsFont); - p.setPen(st::noContactsColor); - p.drawText(QRect(0, y, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); - } else { - p.translate(0, _itemsTop); - - int32 yFrom = r.y() - _itemsTop, yTo = r.y() + r.height() - _itemsTop; - int32 from = floorclamp(yFrom - _rowHeight, _rowHeight, 0, _rows.size()); - int32 to = ceilclamp(yTo + _rowHeight, _rowHeight, 0, _rows.size()); - p.translate(0, from * _rowHeight); - for (int32 i = from; i < to; ++i) { - if (i != _above) { - paintRow(p, i); - } - p.translate(0, _rowHeight); - } - if (from <= _above && _above < to) { - p.translate(0, (_above - to) * _rowHeight); - paintRow(p, _above); - } - } -} - -void StickersInner::paintRow(Painter &p, int32 index) { - const StickerSetRow *s(_rows.at(index)); - - int32 xadd = 0, yadd = s->yadd.current(); - if (xadd || yadd) p.translate(xadd, yadd); - - if (_section == Section::Installed) { - bool removeSel = (index == _actionSel && (_actionDown < 0 || index == _actionDown)); - bool removeDown = removeSel && (index == _actionDown); - - p.setFont(removeSel ? st::linkOverFont : st::linkFont); - if (removeDown) { - p.setPen(st::btnDefLink.downColor); - } else { - p.setPen(st::btnDefLink.color); - } - int32 remWidth = s->recent ? _clearWidth : (s->disabled ? (s->official ? _restoreWidth : _returnWidth) : _removeWidth); - QString remText = lang(s->recent ? lng_stickers_clear_recent : (s->disabled ? (s->official ? lng_stickers_restore : lng_stickers_return) : lng_stickers_remove)); - p.drawTextRight(st::contactsPadding.right() + st::contactsCheckPosition.x(), st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, width(), remText, remWidth); - - if (index == _above) { - float64 current = _aboveShadowFadeOpacity.current(); - if (_started >= 0) { - float64 o = aboveShadowOpacity(); - if (o > current) { - _aboveShadowFadeOpacity = anim::fvalue(o, o); - current = o; - } - } - p.setOpacity(current); - QRect row(myrtlrect(_aboveShadow.getDimensions(st::boxShadowShift).left(), st::contactsPadding.top() / 2, width() - (st::contactsPadding.left() / 2) - _scrollbar - _aboveShadow.getDimensions(st::boxShadowShift).right(), _rowHeight - ((st::contactsPadding.top() + st::contactsPadding.bottom()) / 2))); - _aboveShadow.paint(p, row, st::boxShadowShift); - p.fillRect(row, st::white); - p.setOpacity(1); - } - } else if (s->installed && !s->disabled) { - int addw = st::stickersAddSize.width(); - int checkx = width() - (st::contactsPadding.right() + st::contactsCheckPosition.x() + (addw + st::stickersFeaturedInstalled.width()) / 2); - int checky = st::contactsPadding.top() + (st::contactsPhotoSize - st::stickersFeaturedInstalled.height()) / 2; - st::stickersFeaturedInstalled.paint(p, QPoint(checkx, checky), width()); - } else { - int addw = st::stickersAddSize.width(); - int addx = width() - st::contactsPadding.right() - st::contactsCheckPosition.x() - addw; - int addy = st::contactsPadding.top() + (st::contactsPhotoSize - st::stickersAddSize.height()) / 2; - QRect add(myrtlrect(addx, addy, addw, st::stickersAddSize.height())); - - auto textBg = (_actionSel == index) ? st::defaultActiveButton.textBgOver : st::defaultActiveButton.textBg; - App::roundRect(p, add, textBg, ImageRoundRadius::Small); - int iconx = addx + (st::stickersAddSize.width() - st::stickersAddIcon.width()) / 2; - int icony = addy + (st::stickersAddSize.height() - st::stickersAddIcon.height()) / 2; - icony += (_actionSel == index && _actionDown == index) ? (st::defaultActiveButton.downTextTop - st::defaultActiveButton.textTop) : 0; - st::stickersAddIcon.paint(p, QPoint(iconx, icony), width()); - } - - if (s->disabled && _section == Section::Installed) { - p.setOpacity(st::stickersRowDisabledOpacity); - } - if (s->sticker) { - s->sticker->thumb->load(); - QPixmap pix(s->sticker->thumb->pix(s->pixw, s->pixh)); - p.drawPixmapLeft(st::contactsPadding.left() + (st::contactsPhotoSize - s->pixw) / 2, st::contactsPadding.top() + (st::contactsPhotoSize - s->pixh) / 2, width(), pix); - } - - int namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); - int namey = st::contactsPadding.top() + st::contactsNameTop; - int statusx = namex; - int statusy = st::contactsPadding.top() + st::contactsStatusTop; - - p.setFont(st::contactsNameFont); - p.setPen(st::black); - p.drawTextLeft(namex, namey, width(), s->title, s->titleWidth); - - if (s->unread) { - p.setPen(Qt::NoPen); - p.setBrush(st::stickersFeaturedUnreadBg); - - p.setRenderHint(QPainter::HighQualityAntialiasing, true); - p.drawEllipse(rtlrect(namex + s->titleWidth + st::stickersFeaturedUnreadSkip, namey + st::stickersFeaturedUnreadTop, st::stickersFeaturedUnreadSize, st::stickersFeaturedUnreadSize, width())); - p.setRenderHint(QPainter::HighQualityAntialiasing, false); - } - - p.setFont(st::contactsStatusFont); - p.setPen(st::contactsStatusFg); - p.drawTextLeft(statusx, statusy, width(), lng_stickers_count(lt_count, s->count)); - - p.setOpacity(1); - if (xadd || yadd) p.translate(-xadd, -yadd); -} - -void StickersInner::mousePressEvent(QMouseEvent *e) { - if (_saving) return; - if (_dragging >= 0) mouseReleaseEvent(e); - _mouse = e->globalPos(); - onUpdateSelected(); - - _pressed = _selected; - if (_actionSel >= 0) { - _actionDown = _actionSel; - update(0, _itemsTop + _actionSel * _rowHeight, width(), _rowHeight); - } else if (_selected >= 0 && _section == Section::Installed && !_rows.at(_selected)->recent) { - _above = _dragging = _started = _selected; - _dragStart = mapFromGlobal(_mouse); - } -} - -void StickersInner::mouseMoveEvent(QMouseEvent *e) { - if (_saving) return; - _mouse = e->globalPos(); - onUpdateSelected(); -} - -void StickersInner::onUpdateSelected() { - if (_saving) return; - QPoint local(mapFromGlobal(_mouse)); - if (_dragging >= 0) { - int32 shift = 0; - uint64 ms = getms(); - int firstSetIndex = 0; - if (_rows.at(firstSetIndex)->recent) { - ++firstSetIndex; - } - if (_dragStart.y() > local.y() && _dragging > 0) { - shift = -floorclamp(_dragStart.y() - local.y() + (_rowHeight / 2), _rowHeight, 0, _dragging - firstSetIndex); - for (int32 from = _dragging, to = _dragging + shift; from > to; --from) { - qSwap(_rows[from], _rows[from - 1]); - _rows.at(from)->yadd = anim::ivalue(_rows.at(from)->yadd.current() - _rowHeight, 0); - _animStartTimes[from] = ms; - } - } else if (_dragStart.y() < local.y() && _dragging + 1 < _rows.size()) { - shift = floorclamp(local.y() - _dragStart.y() + (_rowHeight / 2), _rowHeight, 0, _rows.size() - _dragging - 1); - for (int32 from = _dragging, to = _dragging + shift; from < to; ++from) { - qSwap(_rows[from], _rows[from + 1]); - _rows.at(from)->yadd = anim::ivalue(_rows.at(from)->yadd.current() + _rowHeight, 0); - _animStartTimes[from] = ms; - } - } - if (shift) { - _dragging += shift; - _above = _dragging; - _dragStart.setY(_dragStart.y() + shift * _rowHeight); - if (!_a_shifting.animating()) { - _a_shifting.start(); - } - } - _rows.at(_dragging)->yadd = anim::ivalue(local.y() - _dragStart.y(), local.y() - _dragStart.y()); - _animStartTimes[_dragging] = 0; - _a_shifting.step(getms(), true); - - emit checkDraggingScroll(local.y()); - } else { - bool in = rect().marginsRemoved(QMargins(0, _itemsTop, 0, st::membersPadding.bottom())).contains(local); - int selected = -2; - int actionSel = -1; - if (in) { - selected = floorclamp(local.y() - _itemsTop, _rowHeight, 0, _rows.size() - 1); - - if (_section == Section::Installed) { - int remw = _rows.at(selected)->recent ? _clearWidth : (_rows.at(selected)->disabled ? (_rows.at(selected)->official ? _restoreWidth : _returnWidth) : _removeWidth); - QRect rem(myrtlrect(width() - st::contactsPadding.right() - st::contactsCheckPosition.x() - remw, st::contactsPadding.top() + (st::contactsPhotoSize - st::normalFont->height) / 2, remw, st::normalFont->height)); - actionSel = rem.contains(local.x(), local.y() - _itemsTop - selected * _rowHeight) ? selected : -1; - } else if (_rows.at(selected)->installed && !_rows.at(selected)->disabled) { - actionSel = -1; - } else { - int addw = st::stickersAddSize.width(); - int addx = width() - st::contactsPadding.right() - st::contactsCheckPosition.x() - addw; - int addy = st::contactsPadding.top() + (st::contactsPhotoSize - st::stickersAddSize.height()) / 2; - QRect add(myrtlrect(addx, addy, addw, st::stickersAddSize.height())); - actionSel = add.contains(local.x(), local.y() - _itemsTop - selected * _rowHeight) ? selected : -1; - } - } else if (_hasFeaturedButton && QRect(0, st::membersPadding.top(), width(), _buttonHeight).contains(local)) { - selected = -2; - } else if (_hasArchivedButton && QRect(0, st::membersPadding.top() + (_hasFeaturedButton ? _buttonHeight : 0), width(), _buttonHeight).contains(local)) { - selected = -1; - } else { - selected = -3; - } - if (_selected != selected) { - if (((_selected == -1) != (selected == -1)) || ((_selected == -2) != (selected == -2))) { - update(); - } - if (_section != Section::Installed && ((_selected >= 0 || _pressed >= 0) != (selected >= 0 || _pressed >= 0))) { - setCursor((selected >= 0 || _pressed >= 0) ? style::cur_pointer : style::cur_default); - } - _selected = selected; - } - setActionSel(actionSel); - emit noDraggingScroll(); - } -} - -void StickersInner::onClearRecent() { - if (_clearBox) { - _clearBox->onClose(); - } - - auto &sets = Global::RefStickerSets(); - bool removedCloud = (sets.remove(Stickers::CloudRecentSetId) != 0); - bool removedCustom = (sets.remove(Stickers::CustomSetId) != 0); - - auto &recent = cGetRecentStickers(); - if (!recent.isEmpty()) { - recent.clear(); - Local::writeUserSettings(); - } - - if (removedCustom) Local::writeInstalledStickers(); - if (removedCloud) Local::writeRecentStickers(); - emit App::main()->updateStickers(); - rebuild(); - - MTPmessages_ClearRecentStickers::Flags flags = 0; - MTP::send(MTPmessages_ClearRecentStickers(MTP_flags(flags))); -} - -void StickersInner::onClearBoxDestroyed(QObject *box) { - if (box == _clearBox) { - _clearBox = nullptr; - } -} - -float64 StickersInner::aboveShadowOpacity() const { - if (_above < 0) return 0; - - int32 dx = 0; - int32 dy = qAbs(_above * _rowHeight + _rows.at(_above)->yadd.current() - _started * _rowHeight); - return qMin((dx + dy) * 2. / _rowHeight, 1.); -} - -void StickersInner::mouseReleaseEvent(QMouseEvent *e) { - auto pressed = _pressed; - _pressed = -2; - - if (_section != Section::Installed && _selected < 0 && pressed >= 0) { - setCursor(style::cur_default); - } - - if (_saving) return; - - _mouse = e->globalPos(); - onUpdateSelected(); - if (_actionDown == _actionSel && _actionSel >= 0) { - if (_section == Section::Installed) { - if (_rows[_actionDown]->recent) { - _clearBox = new ConfirmBox(lang(lng_stickers_clear_recent_sure), lang(lng_stickers_clear_recent)); - connect(_clearBox, SIGNAL(confirmed()), this, SLOT(onClearRecent())); - connect(_clearBox, SIGNAL(destroyed(QObject*)), this, SLOT(onClearBoxDestroyed(QObject*))); - Ui::showLayer(_clearBox, KeepOtherLayers); - } else { - _rows[_actionDown]->disabled = !_rows[_actionDown]->disabled; - } - } else { - installSet(_rows[_actionDown]->id); - } - } else if (_dragging >= 0) { - QPoint local(mapFromGlobal(_mouse)); - _rows[_dragging]->yadd.start(0); - _aboveShadowFadeStart = _animStartTimes[_dragging] = getms(); - _aboveShadowFadeOpacity = anim::fvalue(aboveShadowOpacity(), 0); - if (!_a_shifting.animating()) { - _a_shifting.start(); - } - - _dragging = _started = -1; - } else if (pressed == _selected && _actionSel < 0 && _actionDown < 0) { - if (_selected == -2) { - _selected = -3; - Ui::showLayer(new StickersBox(Section::Featured), KeepOtherLayers); - } else if (_selected == -1) { - _selected = -3; - Ui::showLayer(new StickersBox(Section::Archived), KeepOtherLayers); - } else if (_selected >= 0 && _section != Section::Installed) { - auto &sets = Global::RefStickerSets(); - auto it = sets.find(_rows.at(pressed)->id); - if (it != sets.cend()) { - _selected = -3; - Ui::showLayer(new StickerSetBox(Stickers::inputSetId(*it)), KeepOtherLayers); - } - } - } - if (_actionDown >= 0) { - update(0, _itemsTop + _actionDown * _rowHeight, width(), _rowHeight); - _actionDown = -1; - } -} - -void StickersInner::leaveEvent(QEvent *e) { - _mouse = QPoint(-1, -1); - onUpdateSelected(); -} - -void StickersInner::installSet(uint64 setId) { - auto &sets = Global::RefStickerSets(); - auto it = sets.find(setId); - if (it == sets.cend()) { - rebuild(); - return; - } - - MTP::send(MTPmessages_InstallStickerSet(Stickers::inputSetId(*it), MTP_boolFalse()), rpcDone(&StickersInner::installDone), rpcFail(&StickersInner::installFail, setId)); - - Stickers::installLocally(setId); -} - -void StickersInner::installDone(const MTPmessages_StickerSetInstallResult &result) { - if (result.type() == mtpc_messages_stickerSetInstallResultArchive) { - Stickers::applyArchivedResult(result.c_messages_stickerSetInstallResultArchive()); - } -} - -bool StickersInner::installFail(uint64 setId, const RPCError &error) { - if (MTP::isDefaultHandledError(error)) return false; - - auto &sets = Global::RefStickerSets(); - auto it = sets.find(setId); - if (it == sets.cend()) { - rebuild(); - return true; - } - - Stickers::undoInstallLocally(setId); - return true; -} - -void StickersInner::step_shifting(uint64 ms, bool timer) { - bool animating = false; - int32 updateMin = -1, updateMax = 0; - for (int32 i = 0, l = _animStartTimes.size(); i < l; ++i) { - uint64 start = _animStartTimes.at(i); - if (start) { - if (updateMin < 0) updateMin = i; - updateMax = i; - if (start + st::stickersRowDuration > ms && ms >= start) { - _rows.at(i)->yadd.update(float64(ms - start) / st::stickersRowDuration, anim::sineInOut); - animating = true; - } else { - _rows.at(i)->yadd.finish(); - _animStartTimes[i] = 0; - } - } - } - if (_aboveShadowFadeStart) { - if (updateMin < 0 || updateMin > _above) updateMin = _above; - if (updateMax < _above) updateMin = _above; - if (_aboveShadowFadeStart + st::stickersRowDuration > ms && ms > _aboveShadowFadeStart) { - _aboveShadowFadeOpacity.update(float64(ms - _aboveShadowFadeStart) / st::stickersRowDuration, anim::sineInOut); - animating = true; - } else { - _aboveShadowFadeOpacity.finish(); - _aboveShadowFadeStart = 0; - } - } - if (timer) { - if (_dragging >= 0) { - if (updateMin < 0 || updateMin > _dragging) updateMin = _dragging; - if (updateMax < _dragging) updateMax = _dragging; - } - if (updateMin >= 0) { - update(0, _itemsTop + _rowHeight * (updateMin - 1), width(), _rowHeight * (updateMax - updateMin + 3)); - } - } - if (!animating) { - _above = _dragging; - _a_shifting.stop(); - } -} - -void StickersInner::clear() { - for (int32 i = 0, l = _rows.size(); i < l; ++i) { - delete _rows.at(i); - } - _rows.clear(); - _animStartTimes.clear(); - _aboveShadowFadeStart = 0; - _aboveShadowFadeOpacity = anim::fvalue(0, 0); - _a_shifting.stop(); - _above = _dragging = _started = -1; - _selected = -3; - _pressed = -3; - _actionDown = -1; - setActionSel(-1); - update(); -} - -void StickersInner::setActionSel(int32 actionSel) { - if (actionSel != _actionSel) { - if (_actionSel >= 0) update(0, _itemsTop + _actionSel * _rowHeight, width(), _rowHeight); - _actionSel = actionSel; - if (_actionSel >= 0) update(0, _itemsTop + _actionSel * _rowHeight, width(), _rowHeight); - if (_section == Section::Installed) { - setCursor((_actionSel >= 0 && (_actionDown < 0 || _actionDown == _actionSel)) ? style::cur_pointer : style::cur_default); - } - } -} - -void StickersInner::rebuild() { - _hasFeaturedButton = _hasArchivedButton = false; - _itemsTop = st::membersPadding.top(); - _buttonHeight = st::stickersFeaturedHeight; - if (_section == Section::Installed) { - if (!Global::FeaturedStickerSetsOrder().isEmpty()) { - _itemsTop += _buttonHeight; - _hasFeaturedButton = true; - } - if (!Global::ArchivedStickerSetsOrder().isEmpty()) { - _itemsTop += _buttonHeight; - _hasArchivedButton = true; - } - if (_itemsTop > st::membersPadding.top()) { - _itemsTop += st::membersPadding.top(); - } - } - - int maxNameWidth = countMaxNameWidth(); - - clear(); - auto &order = ([this]() -> const Stickers::Order & { - if (_section == Section::Installed) { - return Global::StickerSetsOrder(); - } else if (_section == Section::Featured) { - return Global::FeaturedStickerSetsOrder(); - } else if (_section == Section::Archived) { - return Global::ArchivedStickerSetsOrder(); - } - return _archivedIds; - })(); - _rows.reserve(order.size() + 1); - _animStartTimes.reserve(order.size() + 1); - - auto &sets = Global::StickerSets(); - if (_section == Section::Installed) { - auto cloudIt = sets.constFind(Stickers::CloudRecentSetId); - if (cloudIt != sets.cend() && !cloudIt->stickers.isEmpty()) { - rebuildAppendSet(cloudIt.value(), maxNameWidth); - } - } - for_const (auto setId, order) { - auto it = sets.constFind(setId); - if (it == sets.cend()) { - continue; - } - - rebuildAppendSet(it.value(), maxNameWidth); - - if (it->stickers.isEmpty() || (it->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { - App::api()->scheduleStickerSetRequest(it->id, it->access); - } - } - App::api()->requestStickerSets(); - updateSize(); -} - -void StickersInner::updateSize() { - resize(width(), _itemsTop + _rows.size() * _rowHeight + st::membersPadding.bottom()); -} - -void StickersInner::updateRows() { - int maxNameWidth = countMaxNameWidth(); - auto &sets = Global::StickerSets(); - for_const (auto row, _rows) { - auto it = sets.constFind(row->id); - if (it != sets.cend()) { - auto &set = it.value(); - if (!row->sticker) { - DocumentData *sticker = nullptr; - int pixw = 0, pixh = 0; - fillSetCover(set, &sticker, &pixw, &pixh); - if (sticker) { - row->sticker = sticker; - row->pixw = pixw; - row->pixh = pixh; - } - } - fillSetFlags(set, &row->recent, &row->installed, &row->official, &row->unread, &row->disabled); - if (_section == Section::Installed) { - row->disabled = false; - } - row->title = fillSetTitle(set, maxNameWidth, &row->titleWidth); - row->count = fillSetCount(set); - } - } - update(); -} - -bool StickersInner::appendSet(const Stickers::Set &set) { - for_const (auto row, _rows) { - if (row->id == set.id) { - return false; - } - } - rebuildAppendSet(set, countMaxNameWidth()); - return true; -} - -int StickersInner::countMaxNameWidth() const { - int namex = st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(); - int namew = st::boxWideWidth - namex - st::contactsPadding.right() - st::contactsCheckPosition.x(); - if (_section == Section::Installed) { - namew -= qMax(qMax(qMax(_returnWidth, _removeWidth), _restoreWidth), _clearWidth); - } else { - namew -= st::stickersAddIcon.width() - st::defaultActiveButton.width; - namew -= st::stickersFeaturedUnreadSize + st::stickersFeaturedUnreadSkip; - } - return namew; -} - -void StickersInner::rebuildAppendSet(const Stickers::Set &set, int maxNameWidth) { - bool recent = false, installed = false, official = false, unread = false, disabled = false; - fillSetFlags(set, &recent, &installed, &official, &unread, &disabled); - if (_section == Section::Installed && disabled) { - return; - } - - DocumentData *sticker = nullptr; - int pixw = 0, pixh = 0; - fillSetCover(set, &sticker, &pixw, &pixh); - - int titleWidth = 0; - QString title = fillSetTitle(set, maxNameWidth, &titleWidth); - int count = fillSetCount(set); - - _rows.push_back(new StickerSetRow(set.id, sticker, count, title, titleWidth, installed, official, unread, disabled, recent, pixw, pixh)); - _animStartTimes.push_back(0); -} - -void StickersInner::fillSetCover(const Stickers::Set &set, DocumentData **outSticker, int *outWidth, int *outHeight) const { - if (set.stickers.isEmpty()) { - *outSticker = nullptr; - *outWidth = *outHeight = 0; - return; - } - auto sticker = *outSticker = set.stickers.front(); - - auto pixw = sticker->thumb->width(); - auto pixh = sticker->thumb->height(); - if (pixw > st::contactsPhotoSize) { - if (pixw > pixh) { - pixh = (pixh * st::contactsPhotoSize) / pixw; - pixw = st::contactsPhotoSize; - } else { - pixw = (pixw * st::contactsPhotoSize) / pixh; - pixh = st::contactsPhotoSize; - } - } else if (pixh > st::contactsPhotoSize) { - pixw = (pixw * st::contactsPhotoSize) / pixh; - pixh = st::contactsPhotoSize; - } - *outWidth = pixw; - *outHeight = pixh; -} - -int StickersInner::fillSetCount(const Stickers::Set &set) const { - int result = set.stickers.isEmpty() ? set.count : set.stickers.size(), added = 0; - if (set.id == Stickers::CloudRecentSetId) { - auto customIt = Global::StickerSets().constFind(Stickers::CustomSetId); - if (customIt != Global::StickerSets().cend()) { - added = customIt->stickers.size(); - for_const (auto &sticker, cGetRecentStickers()) { - if (customIt->stickers.indexOf(sticker.first) < 0) { - ++added; - } - } - } else { - added = cGetRecentStickers().size(); - } - } - return result + added; -} - -QString StickersInner::fillSetTitle(const Stickers::Set &set, int maxNameWidth, int *outTitleWidth) const { - auto result = set.title; - int titleWidth = st::contactsNameFont->width(result); - if (titleWidth > maxNameWidth) { - result = st::contactsNameFont->elided(result, maxNameWidth); - titleWidth = st::contactsNameFont->width(result); - } - if (outTitleWidth) { - *outTitleWidth = titleWidth; - } - return result; -} - -void StickersInner::fillSetFlags(const Stickers::Set &set, bool *outRecent, bool *outInstalled, bool *outOfficial, bool *outUnread, bool *outDisabled) { - *outRecent = (set.id == Stickers::CloudRecentSetId); - *outInstalled = true; - *outOfficial = true; - *outUnread = false; - *outDisabled = false; - if (!*outRecent) { - *outInstalled = (set.flags & MTPDstickerSet::Flag::f_installed); - *outOfficial = (set.flags & MTPDstickerSet::Flag::f_official); - *outDisabled = (set.flags & MTPDstickerSet::Flag::f_archived); - if (_section == Section::Featured) { - *outUnread = (set.flags & MTPDstickerSet_ClientFlag::f_unread); - } - } -} - -Stickers::Order StickersInner::getOrder() const { - Stickers::Order result; - result.reserve(_rows.size()); - for (int32 i = 0, l = _rows.size(); i < l; ++i) { - if (_rows.at(i)->disabled || _rows.at(i)->recent) { - continue; - } - result.push_back(_rows.at(i)->id); - } - return result; -} - -Stickers::Order StickersInner::getDisabledSets() const { - Stickers::Order result; - result.reserve(_rows.size()); - for (int32 i = 0, l = _rows.size(); i < l; ++i) { - if (_rows.at(i)->disabled) { - result.push_back(_rows.at(i)->id); - } - } - return result; -} - -void StickersInner::setVisibleTopBottom(int visibleTop, int visibleBottom) { - if (_section == Section::Featured) { - _visibleTop = visibleTop; - _visibleBottom = visibleBottom; - readVisibleSets(); - } -} - -void StickersInner::readVisibleSets() { - auto itemsVisibleTop = _visibleTop - _itemsTop; - auto itemsVisibleBottom = _visibleBottom - _itemsTop; - int rowFrom = floorclamp(itemsVisibleTop, _rowHeight, 0, _rows.size()); - int rowTo = ceilclamp(itemsVisibleBottom, _rowHeight, 0, _rows.size()); - for (int i = rowFrom; i < rowTo; ++i) { - if (!_rows[i]->unread) { - continue; - } - if (i * _rowHeight < itemsVisibleTop || (i + 1) * _rowHeight > itemsVisibleBottom) { - continue; - } - if (!_rows[i]->sticker || _rows[i]->sticker->thumb->loaded() || _rows[i]->sticker->loaded()) { - Stickers::markFeaturedAsRead(_rows[i]->id); - } - } -} - -void StickersInner::setVisibleScrollbar(int32 width) { - _scrollbar = width; -} - -StickersInner::~StickersInner() { - clear(); -} - -} // namespace internal - -StickersBox::StickersBox(Section section) : ItemListBox(st::boxScroll) -, _section(section) -, _inner(section) -, _aboutWidth(st::boxWideWidth - 2 * st::stickersReorderPadding.top()) -, _about(st::boxTextFont, lang((section == Section::Archived) ? lng_stickers_packs_archived : lng_stickers_reorder), _defaultOptions, _aboutWidth) { - setup(); -} - -StickersBox::StickersBox(const Stickers::Order &archivedIds) : ItemListBox(st::boxScroll) -, _section(Section::ArchivedPart) -, _inner(archivedIds) -, _aboutWidth(st::boxWideWidth - 2 * st::stickersReorderPadding.top()) -, _about(st::boxTextFont, lang(lng_stickers_packs_archived), _defaultOptions, _aboutWidth) { - setup(); -} - -void StickersBox::getArchivedDone(uint64 offsetId, const MTPmessages_ArchivedStickers &result) { - _archivedRequestId = 0; - if (result.type() != mtpc_messages_archivedStickers) { - return; - } - - auto &stickers = result.c_messages_archivedStickers(); - auto &archived = Global::RefArchivedStickerSetsOrder(); - if (offsetId) { - auto index = archived.indexOf(offsetId); - if (index >= 0) { - archived = archived.mid(0, index + 1); - } - } else { - archived.clear(); - } - - bool addedSet = false; - auto &v = stickers.vsets.c_vector().v; - for_const (auto &stickerSet, v) { - const MTPDstickerSet *setData = nullptr; - switch (stickerSet.type()) { - case mtpc_stickerSetCovered: { - auto &d = stickerSet.c_stickerSetCovered(); - if (d.vset.type() == mtpc_stickerSet) { - setData = &d.vset.c_stickerSet(); - } - } break; - case mtpc_stickerSetMultiCovered: { - auto &d = stickerSet.c_stickerSetMultiCovered(); - if (d.vset.type() == mtpc_stickerSet) { - setData = &d.vset.c_stickerSet(); - } - } break; - } - if (!setData) continue; - - if (auto set = Stickers::feedSet(*setData)) { - auto index = archived.indexOf(set->id); - if (archived.isEmpty() || index != archived.size() - 1) { - if (index < archived.size() - 1) { - archived.removeAt(index); - } - archived.push_back(set->id); - } - if (_section == Section::Archived) { - if (_inner->appendSet(*set)) { - addedSet = true; - if (set->stickers.isEmpty() || (set->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { - App::api()->scheduleStickerSetRequest(set->id, set->access); - } - } - } - } - } - if (_section == Section::Installed && !archived.isEmpty()) { - Local::writeArchivedStickers(); - rebuildList(); - } else if (_section == Section::Archived) { - if (addedSet) { - _inner->updateSize(); - setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); - _inner->setVisibleScrollbar((scrollArea()->scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); - App::api()->requestStickerSets(); - } else { - _allArchivedLoaded = v.isEmpty() || (offsetId != 0); - } - } - checkLoadMoreArchived(); -} - -void StickersBox::setup() { - if (_section == Section::Installed) { - Local::readArchivedStickers(); - if (Global::ArchivedStickerSetsOrder().isEmpty()) { - MTPmessages_GetArchivedStickers::Flags flags = 0; - _archivedRequestId = MTP::send(MTPmessages_GetArchivedStickers(MTP_flags(flags), MTP_long(0), MTP_int(kArchivedLimitFirstRequest)), rpcDone(&StickersBox::getArchivedDone, 0ULL)); - } - } else if (_section == Section::Archived) { - // Reload the archived list. - MTPmessages_GetArchivedStickers::Flags flags = 0; - _archivedRequestId = MTP::send(MTPmessages_GetArchivedStickers(MTP_flags(flags), MTP_long(0), MTP_int(kArchivedLimitFirstRequest)), rpcDone(&StickersBox::getArchivedDone, 0ULL)); - - auto &sets = Global::StickerSets(); - for_const (auto setId, Global::ArchivedStickerSetsOrder()) { - auto it = sets.constFind(setId); - if (it != sets.cend()) { - if (it->stickers.isEmpty() && (it->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { - App::api()->scheduleStickerSetRequest(setId, it->access); - } - } - } - App::api()->requestStickerSets(); - } - - int bottomSkip = st::boxPadding.bottom(); - if (_section == Section::Installed) { - _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); - _topShadow.create(this, st::contactsAboutShadow); - - _save.create(this, lang(lng_settings_save), st::defaultBoxButton); - connect(_save, SIGNAL(clicked()), this, SLOT(onSave())); - - _cancel.create(this, lang(lng_cancel), st::cancelBoxButton); - connect(_cancel, SIGNAL(clicked()), this, SLOT(onClose())); - - _bottomShadow.create(this); - bottomSkip = st::boxButtonPadding.top() + _save->height() + st::boxButtonPadding.bottom(); - } else if (_section == Section::ArchivedPart) { - _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); - _topShadow.create(this, st::contactsAboutShadow); - - _save.create(this, lang(lng_box_ok), st::defaultBoxButton); - connect(_save, SIGNAL(clicked()), this, SLOT(onClose())); - } else if (_section == Section::Archived) { - _aboutHeight = st::stickersReorderPadding.top() + _about.countHeight(_aboutWidth) + st::stickersReorderPadding.bottom(); - _topShadow.create(this, st::contactsAboutShadow); - } - ItemListBox::init(_inner, bottomSkip, st::boxTitleHeight + _aboutHeight); - setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); - - connect(App::main(), SIGNAL(stickersUpdated()), this, SLOT(onStickersUpdated())); - App::main()->updateStickers(); - - connect(_inner, SIGNAL(checkDraggingScroll(int)), this, SLOT(onCheckDraggingScroll(int))); - connect(_inner, SIGNAL(noDraggingScroll()), this, SLOT(onNoDraggingScroll())); - connect(&_scrollTimer, SIGNAL(timeout()), this, SLOT(onScrollTimer())); - connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); - _scrollTimer.setSingleShot(false); - - rebuildList(); - - prepare(); -} - -void StickersBox::onScroll() { - updateVisibleTopBottom(); - checkLoadMoreArchived(); -} - -void StickersBox::updateVisibleTopBottom() { - auto visibleTop = scrollArea()->scrollTop(); - auto visibleBottom = visibleTop + scrollArea()->height(); - _inner->setVisibleTopBottom(visibleTop, visibleBottom); -} - -void StickersBox::checkLoadMoreArchived() { - if (_section != Section::Archived) return; - - int scrollTop = scrollArea()->scrollTop(), scrollTopMax = scrollArea()->scrollTopMax(); - if (scrollTop + PreloadHeightsCount * scrollArea()->height() >= scrollTopMax) { - if (!_archivedRequestId && !_allArchivedLoaded) { - uint64 lastId = 0; - for (auto setId = Global::ArchivedStickerSetsOrder().cend(), e = Global::ArchivedStickerSetsOrder().cbegin(); setId != e;) { - --setId; - auto it = Global::StickerSets().constFind(*setId); - if (it != Global::StickerSets().cend()) { - if (it->flags & MTPDstickerSet::Flag::f_archived) { - lastId = it->id; - break; - } - } - } - MTPmessages_GetArchivedStickers::Flags flags = 0; - _archivedRequestId = MTP::send(MTPmessages_GetArchivedStickers(MTP_flags(flags), MTP_long(lastId), MTP_int(kArchivedLimitPerPage)), rpcDone(&StickersBox::getArchivedDone, lastId)); - } - } -} - -int32 StickersBox::countHeight() const { - int bottomSkip = st::boxPadding.bottom(); - if (_section == Section::Installed) { - bottomSkip = st::boxButtonPadding.top() + _save->height() + st::boxButtonPadding.bottom(); - } - return st::boxTitleHeight + _aboutHeight + _inner->height() + bottomSkip; -} - -void StickersBox::disenableDone(const MTPmessages_StickerSetInstallResult &result, mtpRequestId req) { - _disenableRequests.remove(req); - if (_disenableRequests.isEmpty()) { - saveOrder(); - } -} - -bool StickersBox::disenableFail(const RPCError &error, mtpRequestId req) { - if (MTP::isDefaultHandledError(error)) return false; - _disenableRequests.remove(req); - if (_disenableRequests.isEmpty()) { - saveOrder(); - } - return true; -} - -void StickersBox::saveOrder() { - auto order = _inner->getOrder(); - if (order.size() > 1) { - QVector mtpOrder; - mtpOrder.reserve(order.size()); - for (int i = 0, l = order.size(); i < l; ++i) { - mtpOrder.push_back(MTP_long(order.at(i))); - } - - MTPmessages_ReorderStickerSets::Flags flags = 0; - _reorderRequest = MTP::send(MTPmessages_ReorderStickerSets(MTP_flags(flags), MTP_vector(mtpOrder)), rpcDone(&StickersBox::reorderDone), rpcFail(&StickersBox::reorderFail)); - } else { - reorderDone(MTP_boolTrue()); - } -} - -void StickersBox::reorderDone(const MTPBool &result) { - _reorderRequest = 0; - onClose(); -} - -bool StickersBox::reorderFail(const RPCError &result) { - if (MTP::isDefaultHandledError(result)) return false; - _reorderRequest = 0; - Global::SetLastStickersUpdate(0); - App::main()->updateStickers(); - onClose(); - return true; -} - -void StickersBox::paintEvent(QPaintEvent *e) { - Painter p(this); - if (paint(p)) return; - - auto title = ([this]() { - if (_section == Section::Installed) { - return lang(lng_stickers_packs); - } else if (_section == Section::Featured) { - return lang(lng_stickers_featured); - } - return lang(lng_stickers_archived); - })(); - paintTitle(p, title); - p.translate(0, st::boxTitleHeight); - - if (_aboutHeight > 0) { - p.fillRect(0, 0, width(), _aboutHeight, st::contactsAboutBg); - p.setPen(st::stickersReorderFg); - _about.draw(p, st::stickersReorderPadding.top(), st::stickersReorderPadding.top(), _aboutWidth, style::al_center); - } -} - -void StickersBox::closePressed() { - if (!_disenableRequests.isEmpty()) { - for_const (auto requestId, _disenableRequests) { - MTP::cancel(requestId); - } - _disenableRequests.clear(); - Global::SetLastStickersUpdate(0); - App::main()->updateStickers(); - } else if (_reorderRequest) { - MTP::cancel(_reorderRequest); - _reorderRequest = 0; - Global::SetLastStickersUpdate(0); - App::main()->updateStickers(); - } -} - -StickersBox::~StickersBox() { - if (_section == Section::Archived) { - Local::writeArchivedStickers(); - } -} - -void StickersBox::resizeEvent(QResizeEvent *e) { - ItemListBox::resizeEvent(e); - _inner->resize(width(), _inner->height()); - _inner->setVisibleScrollbar((scrollArea()->scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); - updateVisibleTopBottom(); - if (_topShadow) { - _topShadow->setGeometry(0, st::boxTitleHeight + _aboutHeight, width(), st::lineWidth); - } - if (_save) { - _save->moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save->height()); - } - if (_cancel) { - _cancel->moveToRight(st::boxButtonPadding.right() + _save->width() + st::boxButtonPadding.left(), _save->y()); - _bottomShadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _save->height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); - } -} - -void StickersBox::onStickersUpdated() { - if (_section == Section::Installed || _section == Section::Featured) { - rebuildList(); - } else { - _inner->updateRows(); - } -} - -void StickersBox::rebuildList() { - _inner->rebuild(); - setMaxHeight(snap(countHeight(), int32(st::sessionsHeight), int32(st::boxMaxListHeight))); - _inner->setVisibleScrollbar((scrollArea()->scrollTopMax() > 0) ? (st::boxScroll.width - st::boxScroll.deltax) : 0); -} - -void StickersBox::onCheckDraggingScroll(int localY) { - if (localY < scrollArea()->scrollTop()) { - _scrollDelta = localY - scrollArea()->scrollTop(); - } else if (localY >= scrollArea()->scrollTop() + scrollArea()->height()) { - _scrollDelta = localY - scrollArea()->scrollTop() - scrollArea()->height() + 1; - } else { - _scrollDelta = 0; - } - if (_scrollDelta) { - _scrollTimer.start(15); - } else { - _scrollTimer.stop(); - } -} - -void StickersBox::onNoDraggingScroll() { - _scrollTimer.stop(); -} - -void StickersBox::onScrollTimer() { - int32 d = (_scrollDelta > 0) ? qMin(_scrollDelta * 3 / 20 + 1, int32(MaxScrollSpeed)) : qMax(_scrollDelta * 3 / 20 - 1, -int32(MaxScrollSpeed)); - scrollArea()->scrollToY(scrollArea()->scrollTop() + d); -} - -void StickersBox::onSave() { - if (!_inner->savingStart()) { - return; - } - - bool writeRecent = false, writeArchived = false; - auto &recent = cGetRecentStickers(); - auto &sets = Global::RefStickerSets(); - - auto reorder = _inner->getOrder(), disabled = _inner->getDisabledSets(); - for (int32 i = 0, l = disabled.size(); i < l; ++i) { - auto it = sets.find(disabled.at(i)); - if (it != sets.cend()) { - for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { - if (it->stickers.indexOf(i->first) >= 0) { - i = recent.erase(i); - writeRecent = true; - } else { - ++i; - } - } - if (!(it->flags & MTPDstickerSet::Flag::f_archived)) { - MTPInputStickerSet setId = (it->id && it->access) ? MTP_inputStickerSetID(MTP_long(it->id), MTP_long(it->access)) : MTP_inputStickerSetShortName(MTP_string(it->shortName)); - if (it->flags & MTPDstickerSet::Flag::f_official) { - _disenableRequests.insert(MTP::send(MTPmessages_InstallStickerSet(setId, MTP_boolTrue()), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5)); - it->flags |= MTPDstickerSet::Flag::f_archived; - auto index = Global::RefArchivedStickerSetsOrder().indexOf(it->id); - if (index < 0) { - Global::RefArchivedStickerSetsOrder().push_front(it->id); - writeArchived = true; - } - } else { - _disenableRequests.insert(MTP::send(MTPmessages_UninstallStickerSet(setId), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5)); - int removeIndex = Global::StickerSetsOrder().indexOf(it->id); - if (removeIndex >= 0) Global::RefStickerSetsOrder().removeAt(removeIndex); - if (!(it->flags & MTPDstickerSet_ClientFlag::f_featured) && !(it->flags & MTPDstickerSet_ClientFlag::f_special)) { - sets.erase(it); - } else { - if (it->flags & MTPDstickerSet::Flag::f_archived) { - writeArchived = true; - } - it->flags &= ~(MTPDstickerSet::Flag::f_installed | MTPDstickerSet::Flag::f_archived); - } - } - } - } - } - - // Clear all installed flags, set only for sets from order. - for (auto &set : sets) { - if (!(set.flags & MTPDstickerSet::Flag::f_archived)) { - set.flags &= ~MTPDstickerSet::Flag::f_installed; - } - } - - auto &order(Global::RefStickerSetsOrder()); - order.clear(); - for (int i = 0, l = reorder.size(); i < l; ++i) { - auto it = sets.find(reorder.at(i)); - if (it != sets.cend()) { - if ((it->flags & MTPDstickerSet::Flag::f_archived) && !disabled.contains(it->id)) { - MTPInputStickerSet setId = (it->id && it->access) ? MTP_inputStickerSetID(MTP_long(it->id), MTP_long(it->access)) : MTP_inputStickerSetShortName(MTP_string(it->shortName)); - _disenableRequests.insert(MTP::send(MTPmessages_InstallStickerSet(setId, MTP_boolFalse()), rpcDone(&StickersBox::disenableDone), rpcFail(&StickersBox::disenableFail), 0, 5)); - it->flags &= ~MTPDstickerSet::Flag::f_archived; - writeArchived = true; - } - order.push_back(reorder.at(i)); - it->flags |= MTPDstickerSet::Flag::f_installed; - } - } - for (auto it = sets.begin(); it != sets.cend();) { - if ((it->flags & MTPDstickerSet_ClientFlag::f_featured) - || (it->flags & MTPDstickerSet::Flag::f_installed) - || (it->flags & MTPDstickerSet::Flag::f_archived) - || (it->flags & MTPDstickerSet_ClientFlag::f_special)) { - ++it; - } else { - it = sets.erase(it); - } - } - - Local::writeInstalledStickers(); - if (writeRecent) Local::writeUserSettings(); - if (writeArchived) Local::writeArchivedStickers(); - emit App::main()->stickersUpdated(); - - if (_disenableRequests.isEmpty()) { - saveOrder(); - } else { - MTP::sendAnything(); - } -} - -void StickersBox::showAll() { - if (_topShadow) { - _topShadow->show(); - } - if (_save) { - _save->show(); - } - if (_cancel) { - _cancel->show(); - _bottomShadow->show(); - } - ItemListBox::showAll(); -} - -int32 stickerPacksCount(bool includeDisabledOfficial) { - int32 result = 0; - auto &order = Global::StickerSetsOrder(); - auto &sets = Global::StickerSets(); - for (int i = 0, l = order.size(); i < l; ++i) { - auto it = sets.constFind(order.at(i)); - if (it != sets.cend()) { - if (!(it->flags & MTPDstickerSet::Flag::f_archived) || ((it->flags & MTPDstickerSet::Flag::f_official) && includeDisabledOfficial)) { - ++result; - } - } - } - return result; +StickerSetBox::Inner::~Inner() { } diff --git a/Telegram/SourceFiles/boxes/stickersetbox.h b/Telegram/SourceFiles/boxes/stickersetbox.h index 1f9cc7561..8252ab4ab 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.h +++ b/Telegram/SourceFiles/boxes/stickersetbox.h @@ -24,15 +24,52 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "core/vector_of_moveable.h" class ConfirmBox; + namespace Ui { class PlainShadow; } // namespace Ui -class StickerSetInner : public ScrolledWidget, public RPCSender, private base::Subscriber { +class StickerSetBox : public ScrollableBox, public RPCSender { Q_OBJECT public: - StickerSetInner(const MTPInputStickerSet &set); + StickerSetBox(const MTPInputStickerSet &set); + +public slots: + void onStickersUpdated(); + void onAddStickers(); + void onShareStickers(); + void onUpdateButtons(); + + void onScroll(); + +private slots: + void onInstalled(uint64 id); + +signals: + void installed(uint64 id); + +protected: + void paintEvent(QPaintEvent *e) override; + void resizeEvent(QResizeEvent *e) override; + + void showAll() override; + +private: + class Inner; + ChildWidget _inner; + ScrollableBoxShadow _shadow; + BoxButton _add, _share, _cancel, _done; + QString _title; + +}; + +// This class is hold in header because it requires Qt preprocessing. +class StickerSetBox::Inner : public ScrolledWidget, public RPCSender, private base::Subscriber { + Q_OBJECT + +public: + Inner(QWidget *parent, const MTPInputStickerSet &set); bool loaded() const; int32 notInstalled() const; @@ -43,7 +80,7 @@ public: void setVisibleTopBottom(int visibleTop, int visibleBottom) override; void install(); - ~StickerSetInner(); + ~Inner(); protected: void mousePressEvent(QMouseEvent *e) override; @@ -96,253 +133,3 @@ private: int _previewShown = -1; }; - -class StickerSetBox : public ScrollableBox, public RPCSender { - Q_OBJECT - -public: - StickerSetBox(const MTPInputStickerSet &set); - -public slots: - void onStickersUpdated(); - void onAddStickers(); - void onShareStickers(); - void onUpdateButtons(); - - void onScroll(); - -private slots: - void onInstalled(uint64 id); - -signals: - void installed(uint64 id); - -protected: - void paintEvent(QPaintEvent *e) override; - void resizeEvent(QResizeEvent *e) override; - - void showAll() override; - -private: - StickerSetInner _inner; - ScrollableBoxShadow _shadow; - BoxButton _add, _share, _cancel, _done; - QString _title; - -}; - -namespace internal { -class StickersInner; -} // namespace internal - -class StickersBox : public ItemListBox, public RPCSender { - Q_OBJECT - -public: - enum class Section { - Installed, - Featured, - Archived, - ArchivedPart, - }; - StickersBox(Section section = Section::Installed); - StickersBox(const Stickers::Order &archivedIds); - - ~StickersBox(); - -public slots: - void onStickersUpdated(); - - void onCheckDraggingScroll(int localY); - void onNoDraggingScroll(); - void onScrollTimer(); - - void onSave(); - -private slots: - void onScroll(); - -protected: - void resizeEvent(QResizeEvent *e) override; - void paintEvent(QPaintEvent *e) override; - - void closePressed() override; - void showAll() override; - -private: - void setup(); - int32 countHeight() const; - void rebuildList(); - - void disenableDone(const MTPmessages_StickerSetInstallResult &result, mtpRequestId req); - bool disenableFail(const RPCError &error, mtpRequestId req); - void reorderDone(const MTPBool &result); - bool reorderFail(const RPCError &result); - void saveOrder(); - - void updateVisibleTopBottom(); - void checkLoadMoreArchived(); - void getArchivedDone(uint64 offsetId, const MTPmessages_ArchivedStickers &result); - - Section _section; - - ChildWidget _inner; - ChildWidget _save = { nullptr }; - ChildWidget _cancel = { nullptr }; - OrderedSet _disenableRequests; - mtpRequestId _reorderRequest = 0; - ChildWidget _topShadow = { nullptr }; - ChildWidget _bottomShadow = { nullptr }; - - QTimer _scrollTimer; - int32 _scrollDelta = 0; - - int _aboutWidth = 0; - Text _about; - int _aboutHeight = 0; - - mtpRequestId _archivedRequestId = 0; - bool _allArchivedLoaded = false; - -}; - -int32 stickerPacksCount(bool includeDisabledOfficial = false); - -namespace internal { - -class StickersInner : public ScrolledWidget, public RPCSender, private base::Subscriber { - Q_OBJECT - -public: - using Section = StickersBox::Section; - StickersInner(Section section); - StickersInner(const Stickers::Order &archivedIds); - - void rebuild(); - void updateSize(); - void updateRows(); // refresh only pack cover stickers - bool appendSet(const Stickers::Set &set); - bool savingStart() { - if (_saving) return false; - _saving = true; - return true; - } - - Stickers::Order getOrder() const; - Stickers::Order getDisabledSets() const; - - void setVisibleScrollbar(int32 width); - void setVisibleTopBottom(int visibleTop, int visibleBottom) override; - - ~StickersInner(); - -protected: - void paintEvent(QPaintEvent *e) override; - void mousePressEvent(QMouseEvent *e) override; - void mouseMoveEvent(QMouseEvent *e) override; - void mouseReleaseEvent(QMouseEvent *e) override; - void leaveEvent(QEvent *e) override; - -signals: - void checkDraggingScroll(int localY); - void noDraggingScroll(); - -public slots: - void onUpdateSelected(); - void onClearRecent(); - void onClearBoxDestroyed(QObject *box); - -private slots: - void onImageLoaded(); - -private: - void setup(); - void paintButton(Painter &p, int y, bool selected, const QString &text, int badgeCounter) const; - - void step_shifting(uint64 ms, bool timer); - void paintRow(Painter &p, int32 index); - void clear(); - void setActionSel(int32 actionSel); - float64 aboveShadowOpacity() const; - - void readVisibleSets(); - - void installSet(uint64 setId); - void installDone(const MTPmessages_StickerSetInstallResult &result); - bool installFail(uint64 setId, const RPCError &error); - - Section _section; - Stickers::Order _archivedIds; - - int32 _rowHeight; - struct StickerSetRow { - StickerSetRow(uint64 id, DocumentData *sticker, int32 count, const QString &title, int titleWidth, bool installed, bool official, bool unread, bool disabled, bool recent, int32 pixw, int32 pixh) : id(id) - , sticker(sticker) - , count(count) - , title(title) - , titleWidth(titleWidth) - , installed(installed) - , official(official) - , unread(unread) - , disabled(disabled) - , recent(recent) - , pixw(pixw) - , pixh(pixh) - , yadd(0, 0) { - } - uint64 id; - DocumentData *sticker; - int32 count; - QString title; - int titleWidth; - bool installed, official, unread, disabled, recent; - int32 pixw, pixh; - anim::ivalue yadd; - }; - using StickerSetRows = QList; - - void rebuildAppendSet(const Stickers::Set &set, int maxNameWidth); - void fillSetCover(const Stickers::Set &set, DocumentData **outSticker, int *outWidth, int *outHeight) const; - int fillSetCount(const Stickers::Set &set) const; - QString fillSetTitle(const Stickers::Set &set, int maxNameWidth, int *outTitleWidth) const; - void fillSetFlags(const Stickers::Set &set, bool *outRecent, bool *outInstalled, bool *outOfficial, bool *outUnread, bool *outDisabled); - - int countMaxNameWidth() const; - - StickerSetRows _rows; - QList _animStartTimes; - uint64 _aboveShadowFadeStart = 0; - anim::fvalue _aboveShadowFadeOpacity = { 0., 0. }; - Animation _a_shifting; - - int _visibleTop = 0; - int _visibleBottom = 0; - int _itemsTop = 0; - - bool _saving = false; - - int _actionSel = -1; - int _actionDown = -1; - - int _clearWidth, _removeWidth, _returnWidth, _restoreWidth; - - ConfirmBox *_clearBox = nullptr; - - int _buttonHeight = 0; - bool _hasFeaturedButton = false; - bool _hasArchivedButton = false; - - QPoint _mouse; - int _selected = -3; // -2 - featured stickers button, -1 - archived stickers button - int _pressed = -2; - QPoint _dragStart; - int _started = -1; - int _dragging = -1; - int _above = -1; - - Ui::RectShadow _aboveShadow; - - int32 _scrollbar = 0; -}; - -} // namespace internal diff --git a/Telegram/SourceFiles/codegen/style/parsed_file.cpp b/Telegram/SourceFiles/codegen/style/parsed_file.cpp index f45ecebad..1f5ab35f9 100644 --- a/Telegram/SourceFiles/codegen/style/parsed_file.cpp +++ b/Telegram/SourceFiles/codegen/style/parsed_file.cpp @@ -243,7 +243,7 @@ structure::Variable ParsedFile::readVariable(const QString &name) { structure::Variable result = { composeFullName(name) }; if (auto value = readValue()) { result.value = value; - if (value.type().tag != structure::TypeTag::Struct) { + if (value.type().tag != structure::TypeTag::Struct || !value.copyOf().empty()) { assertNextToken(BasicType::Semicolon); } } diff --git a/Telegram/SourceFiles/profile/profile_cover.cpp b/Telegram/SourceFiles/profile/profile_cover.cpp index d9ac7434d..96dd3da7a 100644 --- a/Telegram/SourceFiles/profile/profile_cover.cpp +++ b/Telegram/SourceFiles/profile/profile_cover.cpp @@ -529,14 +529,14 @@ void CoverWidget::onAddMember() { if (_peerChat->count >= Global::ChatSizeMax() && _peerChat->amCreator()) { Ui::showLayer(new ConvertToSupergroupBox(_peerChat)); } else { - Ui::showLayer(new ContactsBox(_peerChat, MembersFilterRecent)); + Ui::showLayer(new ContactsBox(_peerChat, MembersFilter::Recent)); } } else if (_peerChannel && _peerChannel->mgInfo) { MembersAlreadyIn already; for_const (auto user, _peerChannel->mgInfo->lastParticipants) { already.insert(user); } - Ui::showLayer(new ContactsBox(_peerChannel, MembersFilterRecent, already)); + Ui::showLayer(new ContactsBox(_peerChannel, MembersFilter::Recent, already)); } } diff --git a/Telegram/SourceFiles/profile/profile_members_widget.cpp b/Telegram/SourceFiles/profile/profile_members_widget.cpp index 022f96772..2f9b1a6c8 100644 --- a/Telegram/SourceFiles/profile/profile_members_widget.cpp +++ b/Telegram/SourceFiles/profile/profile_members_widget.cpp @@ -700,13 +700,13 @@ int ChannelMembersWidget::resizeGetHeight(int newWidth) { void ChannelMembersWidget::onAdmins() { if (auto channel = peer()->asChannel()) { - Ui::showLayer(new MembersBox(channel, MembersFilterAdmins)); + Ui::showLayer(new MembersBox(channel, MembersFilter::Admins)); } } void ChannelMembersWidget::onMembers() { if (auto channel = peer()->asChannel()) { - Ui::showLayer(new MembersBox(channel, MembersFilterRecent)); + Ui::showLayer(new MembersBox(channel, MembersFilter::Recent)); } } diff --git a/Telegram/SourceFiles/profile/profile_settings_widget.cpp b/Telegram/SourceFiles/profile/profile_settings_widget.cpp index d94ec9868..4c6d254c8 100644 --- a/Telegram/SourceFiles/profile/profile_settings_widget.cpp +++ b/Telegram/SourceFiles/profile/profile_settings_widget.cpp @@ -164,9 +164,9 @@ void SettingsWidget::onNotificationsChange() { void SettingsWidget::onManageAdmins() { if (auto chat = peer()->asChat()) { - Ui::showLayer(new ContactsBox(chat, MembersFilterAdmins)); + Ui::showLayer(new ContactsBox(chat, MembersFilter::Admins)); } else if (auto channel = peer()->asChannel()) { - Ui::showLayer(new MembersBox(channel, MembersFilterAdmins)); + Ui::showLayer(new MembersBox(channel, MembersFilter::Admins)); } } diff --git a/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp b/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp index 53ae1053a..329da42a4 100644 --- a/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp @@ -29,7 +29,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "mainwindow.h" #include "boxes/emojibox.h" -#include "boxes/stickersetbox.h" +#include "boxes/stickers_box.h" #include "boxes/downloadpathbox.h" #include "boxes/connectionbox.h" #include "boxes/confirmbox.h" diff --git a/Telegram/SourceFiles/stickers/emoji_pan.cpp b/Telegram/SourceFiles/stickers/emoji_pan.cpp index a7f0e5563..74dca4181 100644 --- a/Telegram/SourceFiles/stickers/emoji_pan.cpp +++ b/Telegram/SourceFiles/stickers/emoji_pan.cpp @@ -24,6 +24,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "styles/style_stickers.h" #include "boxes/confirmbox.h" #include "boxes/stickersetbox.h" +#include "boxes/stickers_box.h" #include "inline_bots/inline_bot_result.h" #include "inline_bots/inline_bot_layout_item.h" #include "dialogs/dialogs_layout.h" diff --git a/Telegram/SourceFiles/stickers/stickers.cpp b/Telegram/SourceFiles/stickers/stickers.cpp index 266ede52d..0a47e900d 100644 --- a/Telegram/SourceFiles/stickers/stickers.cpp +++ b/Telegram/SourceFiles/stickers/stickers.cpp @@ -21,7 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "stdafx.h" #include "stickers.h" -#include "boxes/stickersetbox.h" +#include "boxes/stickers_box.h" #include "boxes/confirmbox.h" #include "lang.h" #include "apiwrap.h" diff --git a/Telegram/SourceFiles/ui/countryinput.cpp b/Telegram/SourceFiles/ui/countryinput.cpp index 40a2c0f16..a13c1712b 100644 --- a/Telegram/SourceFiles/ui/countryinput.cpp +++ b/Telegram/SourceFiles/ui/countryinput.cpp @@ -24,8 +24,10 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "lang.h" #include "application.h" #include "ui/scrollarea.h" +#include "ui/buttons/icon_button.h" #include "boxes/contactsbox.h" #include "countries.h" +#include "styles/style_boxes.h" namespace { @@ -192,7 +194,88 @@ void CountryInput::setText(const QString &newText) { _text = _st.font->elided(newText, width() - _st.textMrg.left() - _st.textMrg.right()); } -CountrySelectInner::CountrySelectInner() : TWidget() +CountrySelectBox::CountrySelectBox() : ItemListBox(st::countriesScroll, st::boxWidth) +, _inner(this) +, _filter(this, st::boxSearchField, lang(lng_country_ph)) +, _filterCancel(this, st::boxSearchCancel) +, _topShadow(this) { + ItemListBox::init(_inner, st::boxScrollSkip, st::boxTitleHeight + _filter->height()); + + connect(_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); + connect(_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + connect(_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); + connect(_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); + connect(_inner, SIGNAL(countryChosen(const QString&)), this, SIGNAL(countryChosen(const QString&))); + + _filterCancel->setAttribute(Qt::WA_OpaquePaintEvent); + + prepare(); +} + +void CountrySelectBox::onSubmit() { + _inner->chooseCountry(); +} + +void CountrySelectBox::keyPressEvent(QKeyEvent *e) { + if (e->key() == Qt::Key_Down) { + _inner->selectSkip(1); + } else if (e->key() == Qt::Key_Up) { + _inner->selectSkip(-1); + } else if (e->key() == Qt::Key_PageDown) { + _inner->selectSkipPage(scrollArea()->height(), 1); + } else if (e->key() == Qt::Key_PageUp) { + _inner->selectSkipPage(scrollArea()->height(), -1); + } else { + ItemListBox::keyPressEvent(e); + } +} + +void CountrySelectBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + paintTitle(p, lang(lng_country_select)); +} + +void CountrySelectBox::resizeEvent(QResizeEvent *e) { + ItemListBox::resizeEvent(e); + _filter->resize(width(), _filter->height()); + _filter->moveToLeft(0, st::boxTitleHeight); + _filterCancel->moveToRight(0, st::boxTitleHeight); + _inner->resize(width(), _inner->height()); + _topShadow.setGeometry(0, st::boxTitleHeight + _filter->height(), width(), st::lineWidth); +} + +void CountrySelectBox::showAll() { + _filter->show(); + if (_filter->getLastText().isEmpty()) { + _filterCancel->hide(); + } else { + _filterCancel->show(); + } + _topShadow.show(); + ItemListBox::showAll(); +} + +void CountrySelectBox::onFilterCancel() { + _filter->setText(QString()); +} + +void CountrySelectBox::onFilterUpdate() { + scrollArea()->scrollToY(0); + if (_filter->getLastText().isEmpty()) { + _filterCancel->hide(); + } else { + _filterCancel->show(); + } + _inner->updateFilter(_filter->getLastText()); +} + +void CountrySelectBox::doSetInnerFocus() { + _filter->setFocus(); +} + +CountrySelectBox::Inner::Inner(QWidget *parent) : ScrolledWidget(parent) , _rowHeight(st::countryRowHeight) , _sel(0) , _mouseSel(false) { @@ -239,7 +322,7 @@ CountrySelectInner::CountrySelectInner() : TWidget() updateFilter(); } -void CountrySelectInner::paintEvent(QPaintEvent *e) { +void CountrySelectBox::Inner::paintEvent(QPaintEvent *e) { Painter p(this); QRect r(e->rect()); p.setClipRect(r); @@ -283,11 +366,11 @@ void CountrySelectInner::paintEvent(QPaintEvent *e) { } } -void CountrySelectInner::enterEvent(QEvent *e) { +void CountrySelectBox::Inner::enterEvent(QEvent *e) { setMouseTracking(true); } -void CountrySelectInner::leaveEvent(QEvent *e) { +void CountrySelectBox::Inner::leaveEvent(QEvent *e) { _mouseSel = false; setMouseTracking(false); if (_sel >= 0) { @@ -296,13 +379,13 @@ void CountrySelectInner::leaveEvent(QEvent *e) { } } -void CountrySelectInner::mouseMoveEvent(QMouseEvent *e) { +void CountrySelectBox::Inner::mouseMoveEvent(QMouseEvent *e) { _mouseSel = true; _lastMousePos = e->globalPos(); updateSel(); } -void CountrySelectInner::mousePressEvent(QMouseEvent *e) { +void CountrySelectBox::Inner::mousePressEvent(QMouseEvent *e) { _mouseSel = true; _lastMousePos = e->globalPos(); updateSel(); @@ -311,7 +394,7 @@ void CountrySelectInner::mousePressEvent(QMouseEvent *e) { } } -void CountrySelectInner::updateFilter(QString filter) { +void CountrySelectBox::Inner::updateFilter(QString filter) { filter = textSearchKey(filter); QStringList f; @@ -366,7 +449,7 @@ void CountrySelectInner::updateFilter(QString filter) { } } -void CountrySelectInner::selectSkip(int32 dir) { +void CountrySelectBox::Inner::selectSkip(int32 dir) { _mouseSel = false; int cur = (_sel >= 0) ? _sel : -1; @@ -384,13 +467,13 @@ void CountrySelectInner::selectSkip(int32 dir) { update(); } -void CountrySelectInner::selectSkipPage(int32 h, int32 dir) { +void CountrySelectBox::Inner::selectSkipPage(int32 h, int32 dir) { int32 points = h / _rowHeight; if (!points) return; selectSkip(points * dir); } -void CountrySelectInner::chooseCountry() { +void CountrySelectBox::Inner::chooseCountry() { QString result; if (_filter.isEmpty()) { if (_sel >= 0 && _sel < countriesAll.size()) { @@ -404,11 +487,11 @@ void CountrySelectInner::chooseCountry() { emit countryChosen(result); } -void CountrySelectInner::refresh() { +void CountrySelectBox::Inner::refresh() { resize(width(), countriesNow->length() ? (countriesNow->length() * _rowHeight + st::countriesSkip) : st::noContactsHeight); } -void CountrySelectInner::updateSel() { +void CountrySelectBox::Inner::updateSel() { if (!_mouseSel) return; QPoint p(mapFromGlobal(_lastMousePos)); @@ -422,89 +505,8 @@ void CountrySelectInner::updateSel() { } } -void CountrySelectInner::updateSelectedRow() { +void CountrySelectBox::Inner::updateSelectedRow() { if (_sel >= 0) { update(0, st::countriesSkip + _sel * _rowHeight, width(), _rowHeight); } } - -CountrySelectBox::CountrySelectBox() : ItemListBox(st::countriesScroll, st::boxWidth) -, _inner() -, _filter(this, st::boxSearchField, lang(lng_country_ph)) -, _filterCancel(this, st::boxSearchCancel) -, _topShadow(this) { - ItemListBox::init(&_inner, st::boxScrollSkip, st::boxTitleHeight + _filter.height()); - - connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); - connect(&_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); - connect(&_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); - connect(&_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); - connect(&_inner, SIGNAL(countryChosen(const QString&)), this, SIGNAL(countryChosen(const QString&))); - - _filterCancel.setAttribute(Qt::WA_OpaquePaintEvent); - - prepare(); -} - -void CountrySelectBox::onSubmit() { - _inner.chooseCountry(); -} - -void CountrySelectBox::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Down) { - _inner.selectSkip(1); - } else if (e->key() == Qt::Key_Up) { - _inner.selectSkip(-1); - } else if (e->key() == Qt::Key_PageDown) { - _inner.selectSkipPage(scrollArea()->height(), 1); - } else if (e->key() == Qt::Key_PageUp) { - _inner.selectSkipPage(scrollArea()->height(), -1); - } else { - ItemListBox::keyPressEvent(e); - } -} - -void CountrySelectBox::paintEvent(QPaintEvent *e) { - Painter p(this); - if (paint(p)) return; - - paintTitle(p, lang(lng_country_select)); -} - -void CountrySelectBox::resizeEvent(QResizeEvent *e) { - ItemListBox::resizeEvent(e); - _filter.resize(width(), _filter.height()); - _filter.moveToLeft(0, st::boxTitleHeight); - _filterCancel.moveToRight(0, st::boxTitleHeight); - _inner.resize(width(), _inner.height()); - _topShadow.setGeometry(0, st::boxTitleHeight + _filter.height(), width(), st::lineWidth); -} - -void CountrySelectBox::showAll() { - _filter.show(); - if (_filter.getLastText().isEmpty()) { - _filterCancel.hide(); - } else { - _filterCancel.show(); - } - _topShadow.show(); - ItemListBox::showAll(); -} - -void CountrySelectBox::onFilterCancel() { - _filter.setText(QString()); -} - -void CountrySelectBox::onFilterUpdate() { - scrollArea()->scrollToY(0); - if (_filter.getLastText().isEmpty()) { - _filterCancel.hide(); - } else { - _filterCancel.show(); - } - _inner.updateFilter(_filter.getLastText()); -} - -void CountrySelectBox::doSetInnerFocus() { - _filter.setFocus(); -} diff --git a/Telegram/SourceFiles/ui/countryinput.h b/Telegram/SourceFiles/ui/countryinput.h index 8292f0187..971b192cb 100644 --- a/Telegram/SourceFiles/ui/countryinput.h +++ b/Telegram/SourceFiles/ui/countryinput.h @@ -29,6 +29,11 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org QString findValidCode(QString fullCode); class CountrySelect; +class InputField; + +namespace Ui { +class IconButton; +} // namespace Ui class CountryInput : public QWidget { Q_OBJECT @@ -63,11 +68,48 @@ private: }; -class CountrySelectInner : public TWidget { +namespace internal { +class CountrySelectInner; +} // namespace internal + +class CountrySelectBox : public ItemListBox { Q_OBJECT public: - CountrySelectInner(); + CountrySelectBox(); + +signals: + void countryChosen(const QString &iso); + +public slots: + void onFilterUpdate(); + void onFilterCancel(); + void onSubmit(); + +protected: + void keyPressEvent(QKeyEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void resizeEvent(QResizeEvent *e) override; + + void doSetInnerFocus() override; + void showAll() override; + +private: + class Inner; + ChildWidget _inner; + ChildWidget _filter; + ChildWidget _filterCancel; + + ScrollableBoxShadow _topShadow; + +}; + +// This class is hold in header because it requires Qt preprocessing. +class CountrySelectBox::Inner : public ScrolledWidget { + Q_OBJECT + +public: + Inner(QWidget *parent); void updateFilter(QString filter = QString()); @@ -104,34 +146,3 @@ private: QPoint _lastMousePos; }; - -class CountrySelectBox : public ItemListBox { - Q_OBJECT - -public: - CountrySelectBox(); - -signals: - void countryChosen(const QString &iso); - -public slots: - void onFilterUpdate(); - void onFilterCancel(); - void onSubmit(); - -protected: - void keyPressEvent(QKeyEvent *e) override; - void paintEvent(QPaintEvent *e) override; - void resizeEvent(QResizeEvent *e) override; - - void doSetInnerFocus() override; - void showAll() override; - -private: - CountrySelectInner _inner; - InputField _filter; - IconedButton _filterCancel; - - ScrollableBoxShadow _topShadow; - -}; diff --git a/Telegram/SourceFiles/ui/widgets/filled_slider.h b/Telegram/SourceFiles/ui/widgets/filled_slider.h index 7037b9544..87bb6e7ed 100644 --- a/Telegram/SourceFiles/ui/widgets/filled_slider.h +++ b/Telegram/SourceFiles/ui/widgets/filled_slider.h @@ -21,10 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "ui/widgets/continuous_slider.h" - -namespace style { -struct FilledSlider; -} // namespace style +#include "styles/style_widgets.h" namespace Ui { diff --git a/Telegram/SourceFiles/ui/widgets/media_slider.h b/Telegram/SourceFiles/ui/widgets/media_slider.h index 4bf1967d3..e01e29af5 100644 --- a/Telegram/SourceFiles/ui/widgets/media_slider.h +++ b/Telegram/SourceFiles/ui/widgets/media_slider.h @@ -21,10 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "ui/widgets/continuous_slider.h" - -namespace style { -struct MediaSlider; -} // namespace style +#include "styles/style_widgets.h" namespace Ui { diff --git a/Telegram/gyp/Telegram.gyp b/Telegram/gyp/Telegram.gyp index 3c86f2e6d..974e779ae 100644 --- a/Telegram/gyp/Telegram.gyp +++ b/Telegram/gyp/Telegram.gyp @@ -183,6 +183,8 @@ '<(src_loc)/boxes/languagebox.h', '<(src_loc)/boxes/localstoragebox.cpp', '<(src_loc)/boxes/localstoragebox.h', + '<(src_loc)/boxes/members_box.cpp', + '<(src_loc)/boxes/members_box.h', '<(src_loc)/boxes/notifications_box.cpp', '<(src_loc)/boxes/notifications_box.h', '<(src_loc)/boxes/passcodebox.cpp', @@ -199,6 +201,8 @@ '<(src_loc)/boxes/sharebox.h', '<(src_loc)/boxes/stickersetbox.cpp', '<(src_loc)/boxes/stickersetbox.h', + '<(src_loc)/boxes/stickers_box.cpp', + '<(src_loc)/boxes/stickers_box.h', '<(src_loc)/boxes/usernamebox.cpp', '<(src_loc)/boxes/usernamebox.h', '<(src_loc)/core/basic_types.h', From 3455344c62d2414e1d2ce8470b25eadcb6ce39b0 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 20 Oct 2016 22:48:35 +0300 Subject: [PATCH 04/10] Ui::MultiSelect control started: now it's just search field + cancel. --- Telegram/SourceFiles/boxes/abstractbox.cpp | 16 +- Telegram/SourceFiles/boxes/abstractbox.h | 5 +- Telegram/SourceFiles/boxes/boxes.style | 5 + Telegram/SourceFiles/boxes/contactsbox.cpp | 91 +++----- Telegram/SourceFiles/boxes/contactsbox.h | 9 +- .../SourceFiles/ui/widgets/multi_select.cpp | 198 ++++++++++++++++++ .../SourceFiles/ui/widgets/multi_select.h | 138 ++++++++++++ Telegram/SourceFiles/ui/widgets/widgets.style | 6 + Telegram/gyp/Telegram.gyp | 2 + 9 files changed, 403 insertions(+), 67 deletions(-) create mode 100644 Telegram/SourceFiles/ui/widgets/multi_select.cpp create mode 100644 Telegram/SourceFiles/ui/widgets/multi_select.h diff --git a/Telegram/SourceFiles/boxes/abstractbox.cpp b/Telegram/SourceFiles/boxes/abstractbox.cpp index e7378830a..4fcf2a68b 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.cpp +++ b/Telegram/SourceFiles/boxes/abstractbox.cpp @@ -201,7 +201,7 @@ ScrollableBox::ScrollableBox(const style::flatScroll &scroll, int32 w) : Abstrac } void ScrollableBox::resizeEvent(QResizeEvent *e) { - _scroll->setGeometry(0, _topSkip, width(), height() - _topSkip - _bottomSkip); + updateScrollGeometry(); AbstractBox::resizeEvent(e); } @@ -210,7 +210,19 @@ void ScrollableBox::init(ScrolledWidget *inner, int bottomSkip, int topSkip) { _topSkip = topSkip; _scroll->setOwnedWidget(inner); _scroll->setFocusPolicy(Qt::NoFocus); - ScrollableBox::resizeEvent(nullptr); + updateScrollGeometry(); +} + +void ScrollableBox::setScrollSkips(int bottomSkip, int topSkip) { + if (_topSkip != topSkip || _bottomSkip != bottomSkip) { + _topSkip = topSkip; + _bottomSkip = bottomSkip; + updateScrollGeometry(); + } +} + +void ScrollableBox::updateScrollGeometry() { + _scroll->setGeometry(0, _topSkip, width(), height() - _topSkip - _bottomSkip); } ItemListBox::ItemListBox(const style::flatScroll &scroll, int32 w) : ScrollableBox(scroll, w) { diff --git a/Telegram/SourceFiles/boxes/abstractbox.h b/Telegram/SourceFiles/boxes/abstractbox.h index 7368bcbc2..bd21001cc 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.h +++ b/Telegram/SourceFiles/boxes/abstractbox.h @@ -106,6 +106,7 @@ public: protected: void init(ScrolledWidget *inner, int bottomSkip = st::boxScrollSkip, int topSkip = st::boxTitleHeight); + void setScrollSkips(int bottomSkip = st::boxScrollSkip, int topSkip = st::boxTitleHeight); void resizeEvent(QResizeEvent *e) override; @@ -114,8 +115,10 @@ protected: } private: + void updateScrollGeometry(); + ChildWidget _scroll; - int32 _topSkip, _bottomSkip; + int _topSkip, _bottomSkip; }; diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 72c27d234..3bdfe8a83 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -100,6 +100,11 @@ boxSearchCancel: IconButton { duration: 150; } +contactsMultiSelect: MultiSelect { + field: boxSearchField; + cancel: boxSearchCancel; + maxHeight: 104px; +} contactsPhotoCheckbox: RoundImageCheckbox { imageRadius: 21px; imageSmallRadius: 18px; diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index 41915c6a2..ad98a8315 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -30,7 +30,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "mainwindow.h" #include "application.h" #include "ui/filedialog.h" -#include "ui/buttons/icon_button.h" +#include "ui/widgets/multi_select.h" #include "boxes/photocropbox.h" #include "boxes/confirmbox.h" #include "observer_peer.h" @@ -42,8 +42,7 @@ QString cantInviteError() { ContactsBox::ContactsBox() : ItemListBox(st::contactsScroll) , _inner(this, CreatingGroupNone) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) , _next(this, lang(lng_create_group_next), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -52,8 +51,7 @@ ContactsBox::ContactsBox() : ItemListBox(st::contactsScroll) ContactsBox::ContactsBox(const QString &name, const QImage &photo) : ItemListBox(st::boxScroll) , _inner(this, CreatingGroupGroup) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) , _next(this, lang(lng_create_group_create), st::defaultBoxButton) , _cancel(this, lang(lng_create_group_back), st::cancelBoxButton) , _topShadow(this) @@ -64,8 +62,7 @@ ContactsBox::ContactsBox(const QString &name, const QImage &photo) : ItemListBox ContactsBox::ContactsBox(ChannelData *channel) : ItemListBox(st::boxScroll) , _inner(this, channel, MembersFilter::Recent, MembersAlreadyIn()) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) , _next(this, lang(lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_create_group_skip), st::cancelBoxButton) , _topShadow(this) { @@ -74,8 +71,7 @@ ContactsBox::ContactsBox(ChannelData *channel) : ItemListBox(st::boxScroll) ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const MembersAlreadyIn &already) : ItemListBox((filter == MembersFilter::Admins) ? st::contactsScroll : st::boxScroll) , _inner(this, channel, filter, already) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) , _next(this, lang(lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -84,8 +80,7 @@ ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const Membe ContactsBox::ContactsBox(ChatData *chat, MembersFilter filter) : ItemListBox(st::boxScroll) , _inner(this, chat, filter) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) , _next(this, lang((filter == MembersFilter::Admins) ? lng_settings_save : lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -94,8 +89,7 @@ ContactsBox::ContactsBox(ChatData *chat, MembersFilter filter) : ItemListBox(st: ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) , _inner(this, bot) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) , _next(this, lang(lng_create_group_next), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -103,10 +97,7 @@ ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) } void ContactsBox::init() { - bool inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); - int32 topSkip = st::boxTitleHeight + _filter->height(); - int32 bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; - ItemListBox::init(_inner, bottomSkip, topSkip); + ItemListBox::init(_inner); connect(_inner, SIGNAL(chosenChanged()), this, SLOT(onChosenChanged())); connect(_inner, SIGNAL(addRequested()), App::wnd(), SLOT(onShowAddContact())); @@ -128,16 +119,12 @@ void ContactsBox::init() { } connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); - connect(_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); - connect(_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); - connect(_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); + _select->setQueryChangedCallback([this](const QString &query) { onFilterUpdate(query); }); + _select->setSubmittedCallback([this](bool) { onSubmit(); }); connect(_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); - connect(_inner, SIGNAL(selectAllQuery()), _filter, SLOT(selectAll())); connect(_inner, SIGNAL(searchByUsername()), this, SLOT(onNeedSearchByUsername())); connect(_inner, SIGNAL(adminAdded()), this, SIGNAL(adminAdded())); - _filterCancel->setAttribute(Qt::WA_OpaquePaintEvent); - _searchTimer.setSingleShot(true); connect(&_searchTimer, SIGNAL(timeout()), this, SLOT(onSearchByUsername())); @@ -145,7 +132,7 @@ void ContactsBox::init() { } bool ContactsBox::onSearchByUsername(bool searchCache) { - QString q = _filter->getLastText().trimmed(); + auto q = _select->getQuery(); if (q.isEmpty()) { if (_peopleRequest) { _peopleRequest = 0; @@ -213,12 +200,7 @@ bool ContactsBox::peopleFailed(const RPCError &error, mtpRequestId req) { } void ContactsBox::showAll() { - _filter->show(); - if (_filter->getLastText().isEmpty()) { - _filterCancel->hide(); - } else { - _filterCancel->show(); - } + _select->show(); if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { _next.hide(); _cancel.hide(); @@ -238,7 +220,7 @@ void ContactsBox::showAll() { } void ContactsBox::doSetInnerFocus() { - _filter->setFocus(); + _select->setInnerFocus(); } void ContactsBox::onSubmit() { @@ -246,7 +228,8 @@ void ContactsBox::onSubmit() { } void ContactsBox::keyPressEvent(QKeyEvent *e) { - if (_filter->hasFocus()) { + auto focused = focusWidget(); + if (_select == focused || _select->isAncestorOf(focusWidget())) { if (e->key() == Qt::Key_Down) { _inner->selectSkip(1); } else if (e->key() == Qt::Key_Up) { @@ -285,13 +268,19 @@ void ContactsBox::paintEvent(QPaintEvent *e) { void ContactsBox::resizeEvent(QResizeEvent *e) { ItemListBox::resizeEvent(e); - _filter->resize(width(), _filter->height()); - _filter->moveToLeft(0, st::boxTitleHeight); - _filterCancel->moveToRight(0, st::boxTitleHeight); + + _select->resizeToWidth(width()); + _select->moveToLeft(0, st::boxTitleHeight); + + auto inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); + auto topSkip = st::boxTitleHeight + _select->height(); + auto bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; + setScrollSkips(bottomSkip, topSkip); + _inner->resize(width(), _inner->height()); _next.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _next.height()); _cancel.moveToRight(st::boxButtonPadding.right() + _next.width() + st::boxButtonPadding.left(), _next.y()); - _topShadow.setGeometry(0, st::boxTitleHeight + _filter->height(), width(), st::lineWidth); + _topShadow.setGeometry(0, st::boxTitleHeight + _select->height(), width(), st::lineWidth); if (_bottomShadow) _bottomShadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _next.height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); } @@ -301,18 +290,9 @@ void ContactsBox::closePressed() { } } -void ContactsBox::onFilterCancel() { - _filter->setText(QString()); -} - -void ContactsBox::onFilterUpdate() { +void ContactsBox::onFilterUpdate(const QString &filter) { scrollArea()->scrollToY(0); - if (_filter->getLastText().isEmpty()) { - _filterCancel->hide(); - } else { - _filterCancel->show(); - } - _inner->updateFilter(_filter->getLastText()); + _inner->updateFilter(filter); } void ContactsBox::onChosenChanged() { @@ -322,8 +302,7 @@ void ContactsBox::onChosenChanged() { void ContactsBox::onInvite() { QVector users(_inner->selected()); if (users.isEmpty()) { - _filter->setFocus(); - _filter->showError(); + _select->setInnerFocus(); return; } @@ -339,14 +318,12 @@ void ContactsBox::onInvite() { void ContactsBox::onCreate() { if (_saveRequestId) return; - MTPVector users(MTP_vector(_inner->selectedInputs())); - const auto &v(users.c_vector().v); - if (v.isEmpty() || (v.size() == 1 && v.at(0).type() == mtpc_inputUserSelf)) { - _filter->setFocus(); - _filter->showError(); + auto users = _inner->selectedInputs(); + if (users.isEmpty() || (users.size() == 1 && users.at(0).type() == mtpc_inputUserSelf)) { + _select->setInnerFocus(); return; } - _saveRequestId = MTP::send(MTPmessages_CreateChat(MTP_vector(v), MTP_string(_creationName)), rpcDone(&ContactsBox::creationDone), rpcFail(&ContactsBox::creationFail)); + _saveRequestId = MTP::send(MTPmessages_CreateChat(MTP_vector(users), MTP_string(_creationName)), rpcDone(&ContactsBox::creationDone), rpcFail(&ContactsBox::creationFail)); } void ContactsBox::onSaveAdmins() { @@ -493,8 +470,7 @@ bool ContactsBox::creationFail(const RPCError &error) { onClose(); return true; } else if (error.type() == "USERS_TOO_FEW") { - _filter->setFocus(); - _filter->showError(); + _select->setInnerFocus(); return true; } else if (error.type() == "PEER_FLOOD") { Ui::showLayer(new InformBox(cantInviteError()), KeepOtherLayers); @@ -1263,7 +1239,6 @@ void ContactsBox::Inner::chooseParticipant() { if (_filteredSel < 0 || _filteredSel >= _filtered.size() || contactData(_filtered[_filteredSel])->disabledChecked) return; changeCheckState(_filtered[_filteredSel]); } - emit selectAllQuery(); } } else { PeerData *peer = 0; diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 4315a002d..8b1f519d5 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -31,7 +31,7 @@ class IndexedList; } // namespace Dialogs namespace Ui { -class IconButton; +class MultiSelect; } // namespace Ui QString cantInviteError(); @@ -57,8 +57,6 @@ signals: void adminAdded(); public slots: - void onFilterUpdate(); - void onFilterCancel(); void onChosenChanged(); void onScroll(); @@ -82,11 +80,11 @@ protected: private: void init(); + void onFilterUpdate(const QString &filter); class Inner; ChildWidget _inner; - ChildWidget _filter; - ChildWidget _filterCancel; + ChildWidget _select; BoxButton _next, _cancel; MembersFilter _membersFilter; @@ -178,7 +176,6 @@ public: signals: void mustScrollTo(int ymin, int ymax); - void selectAllQuery(); void searchByUsername(); void chosenChanged(); void adminAdded(); diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.cpp b/Telegram/SourceFiles/ui/widgets/multi_select.cpp new file mode 100644 index 000000000..ab0888da7 --- /dev/null +++ b/Telegram/SourceFiles/ui/widgets/multi_select.cpp @@ -0,0 +1,198 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" +#include "ui/widgets/multi_select.h" + +#include "styles/style_widgets.h" +#include "ui/buttons/icon_button.h" +#include "lang.h" + +namespace Ui { + +MultiSelect::MultiSelect(QWidget *parent, const style::MultiSelect &st, const QString &placeholder) : TWidget(parent) +, _st(st) +, _scroll(this, st::boxScroll) +, _inner(this, st, placeholder) { + _scroll->setOwnedWidget(_inner); + setAttribute(Qt::WA_OpaquePaintEvent); +} + +void MultiSelect::setQueryChangedCallback(base::lambda_unique callback) { + _inner->setQueryChangedCallback(std_::move(callback)); +} + +void MultiSelect::setSubmittedCallback(base::lambda_unique callback) { + _inner->setSubmittedCallback(std_::move(callback)); +} + +void MultiSelect::setInnerFocus() { + if (_inner->setInnerFocus()) { + _scroll->scrollToY(_scroll->scrollTopMax()); + } +} + +QString MultiSelect::getQuery() const { + return _inner->getQuery(); +} + +void MultiSelect::addItem(std_::unique_ptr item) { + _inner->addItem(std_::move(item)); +} + +int MultiSelect::resizeGetHeight(int newWidth) { + _inner->resizeToWidth(newWidth); + auto newHeight = qMin(_inner->height(), _st.maxHeight); + _scroll->resize(newWidth, newHeight); + return newHeight; +} + +void MultiSelect::resizeEvent(QResizeEvent *e) { + _scroll->moveToLeft(0, 0); +} + +MultiSelect::Item::Item(uint64 id, const QString &text, const style::color &color) +: _id(id) { +} + +void MultiSelect::Item::setText(const QString &text) { + +} + +void MultiSelect::Item::paint(Painter &p, int x, int y) { + +} + +MultiSelect::Inner::Inner(QWidget *parent, const style::MultiSelect &st, const QString &placeholder) : ScrolledWidget(parent) +, _st(st) +, _filter(this, _st.field, placeholder) +, _cancel(this, _st.cancel) { + connect(_filter, SIGNAL(changed()), this, SLOT(onQueryChanged())); + connect(_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmitted(bool))); + _cancel->hide(); + _cancel->setClickedCallback([this] { + _filter->setText(QString()); + _filter->setFocus(); + }); +} + +void MultiSelect::Inner::onQueryChanged() { + auto query = getQuery(); + _cancel->setVisible(!query.isEmpty()); + if (_queryChangedCallback) { + _queryChangedCallback(query); + } +} + +bool MultiSelect::Inner::setInnerFocus() { + if (!_filter->hasFocus()) { + _filter->setFocus(); + return true; + } + return false; +} + +QString MultiSelect::Inner::getQuery() const { + return _filter->getLastText().trimmed(); +} + +void MultiSelect::Inner::setQueryChangedCallback(base::lambda_unique callback) { + _queryChangedCallback = std_::move(callback); +} + +void MultiSelect::Inner::setSubmittedCallback(base::lambda_unique callback) { + _submittedCallback = std_::move(callback); +} + +int MultiSelect::Inner::resizeGetHeight(int newWidth) { + _filter->resizeToWidth(newWidth); + return _filter->height(); +} + +void MultiSelect::Inner::resizeEvent(QResizeEvent *e) { + _filter->moveToLeft(0, 0); + _cancel->moveToRight(0, 0); +} + +void MultiSelect::Inner::addItem(std_::unique_ptr item) { + _items.push_back(item.release()); + refreshItemsGeometry(nullptr); +} + +void MultiSelect::Inner::refreshItemsGeometry(Item *startingFromRowWithItem) { + int startingFromRow = 0; + int startingFromIndex = 0; + for (int row = 1, rowsCount = qMin(_rows.size(), 1); row != rowsCount; ++row) { + if (startingFromRowWithItem) { + if (_rows[row - 1].contains(startingFromRowWithItem)) { + break; + } + } + startingFromIndex += _rows[row - 1].size(); + ++startingFromRow; + } + while (_rows.size() > startingFromRow) { + _rows.pop_back(); + } + for (int i = startingFromIndex, count = _items.size(); i != count; ++i) { + Row row; + row.append(_items[i]); + _rows.append(row); + } +} + +void MultiSelect::Inner::setItemText(uint64 itemId, const QString &text) { + for (int i = 0, count = _items.size(); i != count; ++i) { + auto item = _items[i]; + if (item->id() == itemId) { + item->setText(text); + refreshItemsGeometry(item); + return; + } + } +} + +void MultiSelect::Inner::setItemRemovedCallback(base::lambda_unique callback) { + _itemRemovedCallback = std_::move(callback); +} + +void MultiSelect::Inner::removeItem(uint64 itemId) { + for (int i = 0, count = _items.size(); i != count; ++i) { + auto item = _items[i]; + if (item->id() == itemId) { + _items.removeAt(i); + refreshItemsGeometry(item); + delete item; + break; + } + } + if (_itemRemovedCallback) { + _itemRemovedCallback(itemId); + } +} + +MultiSelect::Inner::~Inner() { + base::take(_rows); + for (auto item : base::take(_items)) { + delete item; + } +} + +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.h b/Telegram/SourceFiles/ui/widgets/multi_select.h new file mode 100644 index 000000000..e44199d1e --- /dev/null +++ b/Telegram/SourceFiles/ui/widgets/multi_select.h @@ -0,0 +1,138 @@ +/* +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-2016 John Preston, https://desktop.telegram.org +*/ +#pragma once + +#include "styles/style_widgets.h" + +class InputField; + +namespace Ui { + +class IconButton; + +class MultiSelect : public TWidget { +public: + MultiSelect(QWidget *parent, const style::MultiSelect &st, const QString &placeholder = QString()); + + QString getQuery() const; + void setInnerFocus(); + + void setQueryChangedCallback(base::lambda_unique callback); + void setSubmittedCallback(base::lambda_unique callback); + + class Item; + void addItem(std_::unique_ptr item); + void setItemText(uint64 itemId, const QString &text); + + void setItemRemovedCallback(base::lambda_unique callback); + void removeItem(uint64 itemId); // Always calls the itemRemovedCallback(). + +protected: + int resizeGetHeight(int newWidth) override; + + void resizeEvent(QResizeEvent *e) override; + +private: + ChildWidget _scroll; + + class Inner; + ChildWidget _inner; + + const style::MultiSelect &_st; + +}; + +class MultiSelect::Item { +public: + Item(uint64 id, const QString &text, const style::color &color); + + uint64 id() const { + return _id; + } + void setText(const QString &text); + void paint(Painter &p, int x, int y); + + virtual ~Item() = default; + +protected: + virtual void paintImage(Painter &p, int x, int y, int outerWidth, int size) = 0; + +private: + uint64 _id; + +}; + +// This class is hold in header because it requires Qt preprocessing. +class MultiSelect::Inner : public ScrolledWidget { + Q_OBJECT + +public: + Inner(QWidget *parent, const style::MultiSelect &st, const QString &placeholder); + + QString getQuery() const; + bool setInnerFocus(); + + void setQueryChangedCallback(base::lambda_unique callback); + void setSubmittedCallback(base::lambda_unique callback); + + void addItem(std_::unique_ptr item); + void setItemText(uint64 itemId, const QString &text); + + void setItemRemovedCallback(base::lambda_unique callback); + void removeItem(uint64 itemId); // Always calls the itemRemovedCallback(). + + ~Inner(); + +protected: + int resizeGetHeight(int newWidth) override; + + void resizeEvent(QResizeEvent *e) override; + +private slots: + void onQueryChanged(); + void onSubmitted(bool ctrlShiftEnter) { + if (_submittedCallback) { + _submittedCallback(ctrlShiftEnter); + } + } + +private: + void refreshItemsGeometry(Item *startingFromItem); + + const style::MultiSelect &_st; + + using Row = QList; + using Rows = QList; + Rows _rows; + + using Items = QList; + Items _items; + + ChildWidget _filter; + ChildWidget _cancel; + + base::lambda_unique _queryChangedCallback; + base::lambda_unique _submittedCallback; + base::lambda_unique _itemRemovedCallback; + +}; + +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/widgets/widgets.style b/Telegram/SourceFiles/ui/widgets/widgets.style index 171a0089e..5db4677f0 100644 --- a/Telegram/SourceFiles/ui/widgets/widgets.style +++ b/Telegram/SourceFiles/ui/widgets/widgets.style @@ -67,6 +67,12 @@ RoundImageCheckbox { checkIcon: icon; } +MultiSelect { + field: InputField; + cancel: IconButton; + maxHeight: pixels; +} + widgetSlideDuration: 200; discreteSliderHeight: 39px; diff --git a/Telegram/gyp/Telegram.gyp b/Telegram/gyp/Telegram.gyp index 974e779ae..f6609c10f 100644 --- a/Telegram/gyp/Telegram.gyp +++ b/Telegram/gyp/Telegram.gyp @@ -493,6 +493,8 @@ '<(src_loc)/ui/widgets/label_simple.h', '<(src_loc)/ui/widgets/media_slider.cpp', '<(src_loc)/ui/widgets/media_slider.h', + '<(src_loc)/ui/widgets/multi_select.cpp', + '<(src_loc)/ui/widgets/multi_select.h', '<(src_loc)/ui/widgets/shadow.cpp', '<(src_loc)/ui/widgets/shadow.h', '<(src_loc)/ui/widgets/widget_slide_wrap.h', From 48332c0c6b64ed6869086011e41966ff44a5e17b Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 21 Oct 2016 15:28:26 +0300 Subject: [PATCH 05/10] Ui::MultiSelect control ready. --- Telegram/Resources/art/sprite.png | Bin 40118 -> 39727 bytes Telegram/Resources/art/sprite_200x.png | Bin 85439 -> 84452 bytes Telegram/Resources/basic.style | 13 +- Telegram/Resources/basic_types.style | 7 +- Telegram/Resources/icons/box_search_icon.png | Bin 0 -> 350 bytes .../Resources/icons/box_search_icon@2x.png | Bin 0 -> 707 bytes Telegram/SourceFiles/boxes/boxes.style | 48 +- Telegram/SourceFiles/boxes/contactsbox.cpp | 155 +++- Telegram/SourceFiles/boxes/contactsbox.h | 40 +- Telegram/SourceFiles/boxes/sharebox.cpp | 2 +- Telegram/SourceFiles/boxes/sharebox.h | 2 +- Telegram/SourceFiles/core/lambda_wrap.h | 4 + Telegram/SourceFiles/ui/animation.h | 23 +- .../ui/effects/round_image_checkbox.cpp | 25 +- .../ui/effects/round_image_checkbox.h | 5 +- Telegram/SourceFiles/ui/flatinput.cpp | 71 +- Telegram/SourceFiles/ui/flatinput.h | 16 +- .../SourceFiles/ui/style/style_core_icon.h | 3 + .../SourceFiles/ui/widgets/multi_select.cpp | 767 ++++++++++++++++-- .../SourceFiles/ui/widgets/multi_select.h | 145 ++-- Telegram/SourceFiles/ui/widgets/widgets.style | 30 +- 21 files changed, 1080 insertions(+), 276 deletions(-) create mode 100644 Telegram/Resources/icons/box_search_icon.png create mode 100644 Telegram/Resources/icons/box_search_icon@2x.png diff --git a/Telegram/Resources/art/sprite.png b/Telegram/Resources/art/sprite.png index fb2205f25c5e60782bde38a2360e85983c42e40b..8ff946cf267ca6d062241dcb7810f099deade512 100644 GIT binary patch literal 39727 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 literal 40118 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 D4g$nk diff --git a/Telegram/Resources/basic.style b/Telegram/Resources/basic.style index f2c34e362..a9fa919e9 100644 --- a/Telegram/Resources/basic.style +++ b/Telegram/Resources/basic.style @@ -193,6 +193,7 @@ defaultInputArea: InputArea { heightMax: 128px; } defaultInputField: InputField { + textBg: white; textFg: black; textMargins: margins(0px, 6px, 0px, 4px); textAlign: align(topleft); @@ -216,15 +217,6 @@ defaultInputField: InputField { height: 32px; } -dialogsSearchField: InputField(defaultInputField) { - textMargins: margins(34px, 7px, 34px, 7px); - - iconSprite: sprite(227px, 21px, 24px, 24px); - iconPosition: point(6px, 5px); - - width: 240px; - height: 34px; -} defaultCheckbox: Checkbox { textFg: black; textBg: white; @@ -746,12 +738,11 @@ dlgFilter: flatInput(inpDefGray) { bgColor: #f2f2f2; phColor: #949494; phFocusColor: #a4a4a4; - imgRect: sprite(227px, 21px, 24px, 24px); + icon: icon {{ "box_search_icon", #aaaaaa, point(10px, 9px) }}; width: 240px; height: 34px; textMrg: margins(34px, 2px, 34px, 4px); - imgPos: point(6px, 5px); } topBarHeight: 54px; diff --git a/Telegram/Resources/basic_types.style b/Telegram/Resources/basic_types.style index 73918d110..f3baf7e69 100644 --- a/Telegram/Resources/basic_types.style +++ b/Telegram/Resources/basic_types.style @@ -130,8 +130,7 @@ flatInput { font: font; cursor: cursor; - imgRect: sprite; - imgPos: point; + icon: icon; borderWidth: pixels; borderColor: color; @@ -394,6 +393,7 @@ InputArea { } InputField { + textBg: color; textFg: color; textMargins: margins; textAlign: align; @@ -418,9 +418,6 @@ InputField { width: pixels; height: pixels; - - iconSprite: sprite; - iconPosition: point; } PeerAvatarButton { diff --git a/Telegram/Resources/icons/box_search_icon.png b/Telegram/Resources/icons/box_search_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..04735260760a3bc5d9b99022d3d868882a5d59c7 GIT binary patch literal 350 zcmV-k0iphhP)9C=+{pqNh0sP%Cb}xMGY>BB9&z+@4b>FxxY6BilUI2DGWnBbAZAy zl$oh0igp1rQ=aFo!*}F)E;AFLuQv0ls_HVHs;Y?N7=Ranx~@snv{N8W(?$~i>%qGz zyxf6vj>%+#_a6BB4*J06dH8%jlVuq}5HKE(na}4)V!z+BTCKQTE)7ov$T=rTa?W)| w*n*FS)dx1W+l}FH$aFgGjIXU)Khrz)4TY@wg>IlGNB{r;07*qoM6N<$f;RA;vH$=8 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/box_search_icon@2x.png b/Telegram/Resources/icons/box_search_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2c66f86e536edb168c150881677aeb32b04d57 GIT binary patch literal 707 zcmV;!0zCbRP)S*txX<0KyF=T%t%I5CDh60RRAl!2l5X z?g@E^-EPNBCWEb33lFK+>tQ~hN3Yjwr5>O8!@~oO*APDCJ2!eo> zO68!@a5zLl2ogeYyWRepZ@1g%cDv65sMqUE(a~sxsZcKffju~-ZVA`MRZ-~`eu^JBmFxwUfpi@U|myy{oMlq%;)p70G7)ojh#-XHGoU% z?(UApyWP$jz{kf2jeS1fSpXi7hsLwn%o@O8FraZH5;+SX8jaGp*XuEJrdwz{9-B20 zOGB1rrWyJDe(R0s|0eSK`iinFa|0NLVb+dMH<7ouH(J0j3@-CrE=O~>+bt@J!Uq5V z7>~#C^YfDyB7|Tl6f(^bMG?#8GV|z<{6|g$sH(~U>{TolF&2xVBuUgX7!0DOX*iuu znYE2Z18p`NKY*&L%pv0t$SDVSIdiv}8OS4ly2&pL)X9&7Dps zomUhE^Z7g)hC#RLVzEF%2v)0Ao-NC7e&KOba~9wR=HCFRRO%My-vE*%(U0kh=Ikqw pBng|%<~7aHwx_t2u680irY{@T^!=co>}>!5002ovPDHLkV1f}EK==Rv literal 0 HcmV?d00001 diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 3bdfe8a83..47d4a5737 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -69,20 +69,19 @@ aboutRevokePublicLabel: flatLabel(labelDefFlat) { } boxSearchField: InputField(defaultInputField) { - textMargins: margins(41px, 16px, 41px, 0px); + textBg: transparent; + textMargins: margins(2px, 7px, 2px, 0px); placeholderFg: #999; placeholderFgActive: #aaa; - placeholderMargins: margins(4px, 0px, 4px, 0px); + placeholderMargins: margins(2px, 0px, 2px, 0px); + duration: 150; border: 0px; borderActive: 0px; borderError: 0px; - height: 48px; - - iconSprite: sprite(227px, 21px, 24px, 24px); - iconPosition: point(15px, 14px); + height: 32px; font: normalFont; } @@ -95,15 +94,46 @@ boxSearchCancel: IconButton { icon: icon {{ "box_search_cancel", #000000 }}; iconPosition: point(8px, 18px); - downIconPosition: point(8px, 18px); + downIconPosition: point(8px, 19px); duration: 150; } contactsMultiSelect: MultiSelect { - field: boxSearchField; - cancel: boxSearchCancel; + padding: margins(8px, 8px, 8px, 8px); maxHeight: 104px; + scroll: flatScroll(solidScroll) { + deltat: 3px; + deltab: 3px; + round: 1px; + width: 8px; + deltax: 3px; + hiding: 1000; + } + + item: MultiSelectItem { + padding: margins(6px, 7px, 12px, 0px); + maxWidth: 128px; + height: 32px; + font: normalFont; + textBg: contactsBgOver; + textFg: windowTextFg; + textActiveBg: titleBg; + textActiveFg: white; + deleteFg: white; + deleteLeft: 9px; + deleteStroke: 3px; + duration: 150; + minScale: 0.3; + } + itemSkip: 8px; + + field: boxSearchField; + fieldIcon: icon {{ "box_search_icon", #aaaaaa, point(11px, 9px) }}; + fieldIconSkip: 36px; + fieldCancel: boxSearchCancel; + fieldCancelSkip: 34px; + fieldMinWidth: 42px; } contactsPhotoCheckbox: RoundImageCheckbox { imageRadius: 21px; diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index ad98a8315..cbf186b8f 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -23,6 +23,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "dialogs/dialogs_indexed_list.h" #include "styles/style_dialogs.h" +#include "styles/style_history.h" #include "styles/style_boxes.h" #include "lang.h" #include "boxes/addcontactbox.h" @@ -97,10 +98,18 @@ ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) } void ContactsBox::init() { - ItemListBox::init(_inner); + _select->resizeToWidth(st::boxWideWidth); + + auto inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); + auto topSkip = st::boxTitleHeight + _select->height(); + auto bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; + ItemListBox::init(_inner, bottomSkip, topSkip); - connect(_inner, SIGNAL(chosenChanged()), this, SLOT(onChosenChanged())); connect(_inner, SIGNAL(addRequested()), App::wnd(), SLOT(onShowAddContact())); + _inner->setPeerSelectedChangedCallback([this](PeerData *peer, bool checked) { + onPeerSelectedChanged(peer, checked); + }); + if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { _next.hide(); _cancel.hide(); @@ -120,7 +129,14 @@ void ContactsBox::init() { connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); _select->setQueryChangedCallback([this](const QString &query) { onFilterUpdate(query); }); + _select->setItemRemovedCallback([this](uint64 itemId) { + if (auto peer = App::peerLoaded(itemId)) { + _inner->peerUnselected(peer); + update(); + } + }); _select->setSubmittedCallback([this](bool) { onSubmit(); }); + _select->setResizedCallback([this] { updateScrollSkips(); }); connect(_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); connect(_inner, SIGNAL(searchByUsername()), this, SLOT(onNeedSearchByUsername())); connect(_inner, SIGNAL(adminAdded()), this, SIGNAL(adminAdded())); @@ -184,7 +200,7 @@ void ContactsBox::peopleReceived(const MTPcontacts_Found &result, mtpRequestId r } _peopleRequest = 0; - _inner->updateSel(); + _inner->updateSelection(); onScroll(); } } @@ -266,21 +282,31 @@ void ContactsBox::paintEvent(QPaintEvent *e) { } } +void ContactsBox::updateScrollSkips() { + auto oldScrollHeight = scrollArea()->height(); + auto inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); + auto topSkip = st::boxTitleHeight + _select->height(); + auto bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; + setScrollSkips(bottomSkip, topSkip); + auto scrollHeightDelta = scrollArea()->height() - oldScrollHeight; + if (scrollHeightDelta) { + scrollArea()->scrollToY(scrollArea()->scrollTop() - scrollHeightDelta); + } + + _topShadow.setGeometry(0, st::boxTitleHeight + _select->height(), width(), st::lineWidth); +} + void ContactsBox::resizeEvent(QResizeEvent *e) { ItemListBox::resizeEvent(e); _select->resizeToWidth(width()); _select->moveToLeft(0, st::boxTitleHeight); - auto inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); - auto topSkip = st::boxTitleHeight + _select->height(); - auto bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; - setScrollSkips(bottomSkip, topSkip); + updateScrollSkips(); _inner->resize(width(), _inner->height()); _next.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _next.height()); _cancel.moveToRight(st::boxButtonPadding.right() + _next.width() + st::boxButtonPadding.left(), _next.y()); - _topShadow.setGeometry(0, st::boxTitleHeight + _select->height(), width(), st::lineWidth); if (_bottomShadow) _bottomShadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _next.height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); } @@ -295,7 +321,25 @@ void ContactsBox::onFilterUpdate(const QString &filter) { _inner->updateFilter(filter); } -void ContactsBox::onChosenChanged() { +void ContactsBox::onPeerSelectedChanged(PeerData *peer, bool checked) { + if (checked) { + auto getColor = [peer]() -> const style::color &{ + switch (peer->colorIndex) { + case 1: return st::historyPeer2UserpicFg; + case 2: return st::historyPeer3UserpicFg; + case 3: return st::historyPeer4UserpicFg; + case 4: return st::historyPeer5UserpicFg; + case 5: return st::historyPeer6UserpicFg; + case 6: return st::historyPeer7UserpicFg; + case 7: return st::historyPeer8UserpicFg; + default: return st::historyPeer1UserpicFg; + } + }; + _select->addItem(peer->id, peer->shortName(), getColor(), PaintUserpicCallback(peer)); + _select->clearQuery(); + } else { + _select->removeItem(peer->id); + } update(); } @@ -482,12 +526,8 @@ bool ContactsBox::creationFail(const RPCError &error) { return false; } -ContactsBox::Inner::ContactData::ContactData() : name(st::boxWideWidth) { -} - -ContactsBox::Inner::ContactData::ContactData(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) -: checkbox(std_::make_unique(st::contactsPhotoCheckbox, std_::move(updateCallback), PaintUserpicCallback(peer))) -, name(st::boxWideWidth) { +ContactsBox::Inner::ContactData::ContactData(PeerData *peer, base::lambda_wrap updateCallback) +: checkbox(std_::make_unique(st::contactsPhotoCheckbox, std_::move(updateCallback), PaintUserpicCallback(peer))) { } ContactsBox::Inner::Inner(QWidget *parent, CreatingGroupType creating) : ScrolledWidget(parent) @@ -613,7 +653,7 @@ void ContactsBox::Inner::initList() { if (i.key()->id == peerFromUser(_chat->creator)) continue; if (!_allAdmins.checked() && _chat->admins.contains(i.key())) { admins.push_back(i.key()); - _checkedContacts.insert(i.key(), true); + _checkedContacts.insert(i.key()); } else { others.push_back(i.key()); } @@ -1186,13 +1226,13 @@ void ContactsBox::Inner::leaveEvent(QEvent *e) { void ContactsBox::Inner::mouseMoveEvent(QMouseEvent *e) { _mouseSel = true; _lastMousePos = e->globalPos(); - updateSel(); + updateSelection(); } void ContactsBox::Inner::mousePressEvent(QMouseEvent *e) { _mouseSel = true; _lastMousePos = e->globalPos(); - updateSel(); + updateSelection(); if (e->button() == Qt::LeftButton) { chooseParticipant(); } @@ -1205,29 +1245,35 @@ void ContactsBox::Inner::chooseParticipant() { _time = unixtime(); if (_filter.isEmpty()) { if (_byUsernameSel >= 0 && _byUsernameSel < _byUsername.size()) { - if (d_byUsername[_byUsernameSel]->disabledChecked) return; - changeCheckState(d_byUsername[_byUsernameSel], _byUsername[_byUsernameSel]); - } else { - if (!_sel || contactData(_sel)->disabledChecked) return; + auto data = d_byUsername[_byUsernameSel]; + auto peer = _byUsername[_byUsernameSel]; + if (data->disabledChecked) return; + + changeCheckState(data, peer); + } else if (_sel) { + auto data = contactData(_sel); + auto peer = _sel->history()->peer; + if (data->disabledChecked) return; + changeCheckState(_sel); } } else { if (_byUsernameSel >= 0 && _byUsernameSel < _byUsernameFiltered.size()) { - if (d_byUsernameFiltered[_byUsernameSel]->disabledChecked) return; - changeCheckState(d_byUsernameFiltered[_byUsernameSel], _byUsernameFiltered[_byUsernameSel]); + auto data = d_byUsernameFiltered[_byUsernameSel]; + auto peer = _byUsernameFiltered[_byUsernameSel]; + if (data->disabledChecked) return; - ContactData *moving = d_byUsernameFiltered[_byUsernameSel]; - int32 i = 0, l = d_byUsername.size(); + int i = 0, l = d_byUsername.size(); for (; i < l; ++i) { - if (d_byUsername[i] == moving) { + if (d_byUsername[i] == data) { break; } } if (i == l) { - d_byUsername.push_back(moving); - _byUsername.push_back(_byUsernameFiltered[_byUsernameSel]); + d_byUsername.push_back(data); + _byUsername.push_back(peer); for (i = 0, l = _byUsernameDatas.size(); i < l;) { - if (_byUsernameDatas[i] == moving) { + if (_byUsernameDatas[i] == data) { _byUsernameDatas.removeAt(i); --l; } else { @@ -1235,9 +1281,14 @@ void ContactsBox::Inner::chooseParticipant() { } } } - } else { - if (_filteredSel < 0 || _filteredSel >= _filtered.size() || contactData(_filtered[_filteredSel])->disabledChecked) return; - changeCheckState(_filtered[_filteredSel]); + + changeCheckState(data, peer); + } else if (_filteredSel >= 0 && _filteredSel < _filtered.size()) { + auto data = contactData(_filtered[_filteredSel]); + auto peer = _filtered[_filteredSel]->history()->peer; + if (data->disabledChecked) return; + + changeCheckState(data, peer); } } } else { @@ -1304,25 +1355,43 @@ void ContactsBox::Inner::changeCheckState(Dialogs::Row *row) { void ContactsBox::Inner::changeCheckState(ContactData *data, PeerData *peer) { t_assert(usingMultiSelect()); - int32 cnt = _selCount; if (data->checkbox->checked()) { - data->checkbox->setChecked(false); - _checkedContacts.remove(peer); - --_selCount; + changePeerCheckState(data, peer, false); } else if (selectedCount() < ((_channel && _channel->isMegagroup()) ? Global::MegagroupSizeMax() : Global::ChatSizeMax())) { - data->checkbox->setChecked(true); - _checkedContacts.insert(peer, true); - ++_selCount; + changePeerCheckState(data, peer, true); } else if (_channel && !_channel->isMegagroup()) { Ui::showLayer(new MaxInviteBox(_channel->inviteLink()), KeepOtherLayers); } else if (!_channel && selectedCount() >= Global::ChatSizeMax() && selectedCount() < Global::MegagroupSizeMax()) { Ui::showLayer(new InformBox(lng_profile_add_more_after_upgrade(lt_count, Global::MegagroupSizeMax())), KeepOtherLayers); } - if (cnt != _selCount) emit chosenChanged(); +} + +void ContactsBox::Inner::peerUnselected(PeerData *peer) { + // If data is nullptr we simply won't do anything. + auto data = _contactsData.value(peer, nullptr); + changePeerCheckState(data, peer, false, ChangeStateWay::SkipCallback); +} + +void ContactsBox::Inner::setPeerSelectedChangedCallback(base::lambda_unique callback) { + _peerSelectedChangedCallback = std_::move(callback); +} + +void ContactsBox::Inner::changePeerCheckState(ContactData *data, PeerData *peer, bool checked, ChangeStateWay useCallback) { + if (data) { + data->checkbox->setChecked(checked); + } + if (checked) { + _checkedContacts.insert(peer); + } else { + _checkedContacts.remove(peer); + } + if (useCallback != ChangeStateWay::SkipCallback) { + _peerSelectedChangedCallback(peer, checked); + } } int32 ContactsBox::Inner::selectedCount() const { - int32 result = _selCount; + auto result = _checkedContacts.size(); if (_chat) { result += qMax(_chat->count, 1); } else if (_channel) { @@ -1333,7 +1402,7 @@ int32 ContactsBox::Inner::selectedCount() const { return result; } -void ContactsBox::Inner::updateSel() { +void ContactsBox::Inner::updateSelection() { if (!_mouseSel) return; QPoint p(mapFromGlobal(_lastMousePos)); diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 8b1f519d5..9685bdd20 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -56,8 +56,7 @@ public: signals: void adminAdded(); -public slots: - void onChosenChanged(); +private slots: void onScroll(); void onInvite(); @@ -80,7 +79,9 @@ protected: private: void init(); + void updateScrollSkips(); void onFilterUpdate(const QString &filter); + void onPeerSelectedChanged(PeerData *peer, bool checked); class Inner; ChildWidget _inner; @@ -136,10 +137,11 @@ public: Inner(QWidget *parent, ChatData *chat, MembersFilter membersFilter); Inner(QWidget *parent, UserData *bot); - void init(); - void initList(); + void setPeerSelectedChangedCallback(base::lambda_unique callback); + void peerUnselected(PeerData *peer); void updateFilter(QString filter = QString()); + void updateSelection(); void selectSkip(int32 dir); void selectSkipPage(int32 h, int32 dir); @@ -177,14 +179,12 @@ public: signals: void mustScrollTo(int ymin, int ymax); void searchByUsername(); - void chosenChanged(); void adminAdded(); void addRequested(); -public slots: +private slots: void onDialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow); - void updateSel(); void peerUpdated(PeerData *peer); void onPeerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars); @@ -204,8 +204,8 @@ protected: private: struct ContactData { - ContactData(); - ContactData(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback); + ContactData() = default; + ContactData(PeerData *peer, base::lambda_wrap updateCallback); std_::unique_ptr checkbox; Text name; @@ -214,6 +214,9 @@ private: bool disabledChecked = false; }; + void init(); + void initList(); + void updateRowWithTop(int rowTop); int getSelectedRowTop() const; void updateSelectedRow(); @@ -227,6 +230,11 @@ private: void changeCheckState(Dialogs::Row *row); void changeCheckState(ContactData *data, PeerData *peer); + enum class ChangeStateWay { + Default, + SkipCallback, + }; + void changePeerCheckState(ContactData *data, PeerData *peer, bool checked, ChangeStateWay useCallback = ChangeStateWay::Default); template void addDialogsToList(FilterCallback callback); @@ -235,6 +243,8 @@ private: return (_chat != nullptr) || (_creating != CreatingGroupNone && (!_channel || _membersFilter != MembersFilter::Admins)); } + base::lambda_unique _peerSelectedChangedCallback; + int32 _rowHeight; int _newItemHeight = 0; bool _newItemSel = false; @@ -261,24 +271,22 @@ private: Dialogs::IndexedList *_contacts = nullptr; Dialogs::Row *_sel = nullptr; QString _filter; - typedef QVector FilteredDialogs; + using FilteredDialogs = QVector; FilteredDialogs _filtered; int _filteredSel = -1; bool _mouseSel = false; - int _selCount = 0; - - typedef QMap ContactsData; + using ContactsData = QMap; ContactsData _contactsData; - typedef QMap CheckedContacts; + using CheckedContacts = OrderedSet; CheckedContacts _checkedContacts; ContactData *contactData(Dialogs::Row *row); bool _searching = false; QString _lastQuery; - typedef QVector ByUsernameRows; - typedef QVector ByUsernameDatas; + using ByUsernameRows = QVector; + using ByUsernameDatas = QVector; ByUsernameRows _byUsername, _byUsernameFiltered; ByUsernameDatas d_byUsername, d_byUsernameFiltered; // filtered is partly subset of d_byUsername, partly subset of _byUsernameDatas ByUsernameDatas _byUsernameDatas; diff --git a/Telegram/SourceFiles/boxes/sharebox.cpp b/Telegram/SourceFiles/boxes/sharebox.cpp index bc8135fda..ca2323138 100644 --- a/Telegram/SourceFiles/boxes/sharebox.cpp +++ b/Telegram/SourceFiles/boxes/sharebox.cpp @@ -473,7 +473,7 @@ void ShareBox::Inner::paintChat(Painter &p, Chat *chat, int index) { chat->name.drawLeftElided(p, x + nameLeft, y + nameTop, nameWidth, outerWidth, 2, style::al_top, 0, -1, 0, true); } -ShareBox::Inner::Chat::Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback) +ShareBox::Inner::Chat::Chat(PeerData *peer, base::lambda_wrap updateCallback) : peer(peer) , checkbox(st::sharePhotoCheckbox, std_::move(updateCallback), PaintUserpicCallback(peer)) , name(st::sharePhotoCheckbox.imageRadius * 2) { diff --git a/Telegram/SourceFiles/boxes/sharebox.h b/Telegram/SourceFiles/boxes/sharebox.h index 2e4252fc2..96da0fb1c 100644 --- a/Telegram/SourceFiles/boxes/sharebox.h +++ b/Telegram/SourceFiles/boxes/sharebox.h @@ -153,7 +153,7 @@ private: int displayedChatsCount() const; struct Chat { - Chat(PeerData *peer, Ui::RoundImageCheckbox::UpdateCallback &&updateCallback); + Chat(PeerData *peer, base::lambda_wrap updateCallback); PeerData *peer; Ui::RoundImageCheckbox checkbox; diff --git a/Telegram/SourceFiles/core/lambda_wrap.h b/Telegram/SourceFiles/core/lambda_wrap.h index fc0ce2224..f75ceb5ef 100644 --- a/Telegram/SourceFiles/core/lambda_wrap.h +++ b/Telegram/SourceFiles/core/lambda_wrap.h @@ -359,6 +359,10 @@ public: } } + lambda_wrap clone() const { + return *this; + } + template > lambda_wrap(const Lambda &other) : Parent(&internal::lambda_wrap_helper_copy::instance, typename Parent::Private()) { internal::lambda_wrap_helper_copy::construct_copy_lambda_method(this->storage_, &other); diff --git a/Telegram/SourceFiles/ui/animation.h b/Telegram/SourceFiles/ui/animation.h index 1018053f2..97d4f58a6 100644 --- a/Telegram/SourceFiles/ui/animation.h +++ b/Telegram/SourceFiles/ui/animation.h @@ -102,6 +102,22 @@ namespace anim { float64 easeInQuint(const float64 &delta, const float64 &dt); float64 easeOutQuint(const float64 &delta, const float64 &dt); + template + float64 bumpy(const float64 &delta, const float64 &dt) { + struct Bumpy { + Bumpy() + : bump(BumpRatioNumerator / float64(BumpRatioDenominator)) + , dt0(bump - sqrt(bump * (bump - 1.))) + , k(1 / (2 * dt0 - 1)) { + } + float64 bump; + float64 dt0; + float64 k; + }; + static Bumpy data; + return delta * (data.bump - data.k * (dt - data.dt0) * (dt - data.dt0)); + } + class fvalue { // float animated value public: using ValueType = float64; @@ -499,7 +515,7 @@ public: template void start(Lambda &&updateCallback, const ValueType &from, const ValueType &to, float64 duration, anim::transition transition = anim::linear) { if (!_data) { - _data = std_::make_unique(from, std_::move(updateCallback)); + _data = std_::make_unique(from, std_::forward(updateCallback)); } _data->value.start(to); _data->duration = duration; @@ -522,6 +538,11 @@ private: , a_animation(animation(this, &Data::step)) , updateCallback(std_::move(updateCallback)) { } + Data(const ValueType &from, const base::lambda_wrap &updateCallback) + : value(from, from) + , a_animation(animation(this, &Data::step)) + , updateCallback(base::lambda_wrap(updateCallback)) { + } void step(float64 ms, bool timer) { auto dt = (ms >= duration) ? 1. : (ms / duration); if (dt >= 1) { diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp index fbe75582d..de70ee3a7 100644 --- a/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp @@ -56,25 +56,9 @@ void prepareCheckCaches(const style::RoundImageCheckbox *st, QPixmap &checkBgCac checkFullCache.setDevicePixelRatio(cRetinaFactor()); } -struct AnimBumpy { - AnimBumpy(float64 bump) : bump(bump) - , dt0(bump - sqrt(bump * (bump - 1.))) - , k(1 / (2 * dt0 - 1)) { - } - float64 bump; - float64 dt0; - float64 k; -}; - -template -float64 anim_bumpy(const float64 &delta, const float64 &dt) { - static AnimBumpy data = { BumpRatioPercent / 100. }; - return delta * (data.bump - data.k * (dt - data.dt0) * (dt - data.dt0)); -} - } // namespace -RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, UpdateCallback &&updateCallback, PaintRoundImage &&paintRoundImage) +RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, base::lambda_wrap updateCallback, PaintRoundImage paintRoundImage) : _st(st) , _updateCallback(std_::move(updateCallback)) , _paintRoundImage(std_::move(paintRoundImage)) { @@ -84,13 +68,14 @@ RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, Upda void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { auto selectionLevel = _selection.current(_checked ? 1. : 0.); if (_selection.animating()) { - p.setRenderHint(QPainter::SmoothPixmapTransform, true); auto userpicRadius = qRound(kWideScale * (_st.imageRadius + (_st.imageSmallRadius - _st.imageRadius) * selectionLevel)); auto userpicShift = kWideScale * _st.imageRadius - userpicRadius; auto userpicLeft = x - (kWideScale - 1) * _st.imageRadius + userpicShift; auto userpicTop = y - (kWideScale - 1) * _st.imageRadius + userpicShift; auto to = QRect(userpicLeft, userpicTop, userpicRadius * 2, userpicRadius * 2); auto from = QRect(QPoint(0, 0), _wideCache.size()); + + p.setRenderHint(QPainter::SmoothPixmapTransform, true); p.drawPixmapLeft(to, outerWidth, _wideCache, from); p.setRenderHint(QPainter::SmoothPixmapTransform, false); } else { @@ -159,7 +144,7 @@ void RoundImageCheckbox::setChecked(bool checked, SetStyle speed) { _checked = checked; if (_checked) { _icons.push_back(Icon()); - _icons.back().fadeIn.start(UpdateCallback(_updateCallback), 0, 1, _st.selectDuration); + _icons.back().fadeIn.start(_updateCallback, 0, 1, _st.selectDuration); if (speed != SetStyle::Animated) { _icons.back().fadeIn.finish(); } @@ -176,7 +161,7 @@ void RoundImageCheckbox::setChecked(bool checked, SetStyle speed) { } if (speed == SetStyle::Animated) { prepareWideCache(); - _selection.start(UpdateCallback(_updateCallback), _checked ? 0 : 1, _checked ? 1 : 0, _st.selectDuration, anim_bumpy<125>); + _selection.start(_updateCallback, _checked ? 0 : 1, _checked ? 1 : 0, _st.selectDuration, anim::bumpy<125, 100>); } else { _selection.finish(); } diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.h b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h index 972143625..c94a3c78d 100644 --- a/Telegram/SourceFiles/ui/effects/round_image_checkbox.h +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h @@ -27,8 +27,7 @@ namespace Ui { class RoundImageCheckbox { public: using PaintRoundImage = base::lambda_unique; - using UpdateCallback = base::lambda_wrap; - RoundImageCheckbox(const style::RoundImageCheckbox &st, UpdateCallback &&updateCallback, PaintRoundImage &&paintRoundImage); + RoundImageCheckbox(const style::RoundImageCheckbox &st, base::lambda_wrap updateCallback, PaintRoundImage paintRoundImage); void paint(Painter &p, int x, int y, int outerWidth); float64 checkedAnimationRatio() const; @@ -53,7 +52,7 @@ private: void prepareWideCheckIconCache(Icon *icon); const style::RoundImageCheckbox &_st; - UpdateCallback _updateCallback; + base::lambda_wrap _updateCallback; PaintRoundImage _paintRoundImage; bool _checked = false; diff --git a/Telegram/SourceFiles/ui/flatinput.cpp b/Telegram/SourceFiles/ui/flatinput.cpp index cc63eb4fe..9cb1f3aa2 100644 --- a/Telegram/SourceFiles/ui/flatinput.cpp +++ b/Telegram/SourceFiles/ui/flatinput.cpp @@ -184,8 +184,8 @@ void FlatInput::paintEvent(QPaintEvent *e) { p.drawRoundedRect(QRectF(0, 0, width(), height()).marginsRemoved(QMarginsF(_st.borderWidth / 2., _st.borderWidth / 2., _st.borderWidth / 2., _st.borderWidth / 2.)), st::buttonRadius - (_st.borderWidth / 2.), st::buttonRadius - (_st.borderWidth / 2.)); p.setRenderHint(QPainter::HighQualityAntialiasing, false); - if (_st.imgRect.pxWidth()) { - p.drawSprite(_st.imgPos, _st.imgRect); + if (!_st.icon.empty()) { + _st.icon.paint(p, 0, 0, width()); } bool phDraw = _phVisible; @@ -683,10 +683,10 @@ void InputArea::checkContentHeight() { } } -InputArea::InputAreaInner::InputAreaInner(InputArea *parent) : QTextEdit(parent) { +InputArea::Inner::Inner(InputArea *parent) : QTextEdit(parent) { } -bool InputArea::InputAreaInner::viewportEvent(QEvent *e) { +bool InputArea::Inner::viewportEvent(QEvent *e) { if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchUpdate || e->type() == QEvent::TouchEnd || e->type() == QEvent::TouchCancel) { QTouchEvent *ev = static_cast(e); if (ev->device()->type() == QTouchDevice::TouchScreen) { @@ -790,7 +790,7 @@ void InputArea::contextMenuEvent(QContextMenuEvent *e) { _inner.contextMenuEvent(e); } -void InputArea::InputAreaInner::focusInEvent(QFocusEvent *e) { +void InputArea::Inner::focusInEvent(QFocusEvent *e) { f()->focusInInner(); QTextEdit::focusInEvent(e); emit f()->focused(); @@ -807,7 +807,7 @@ void InputArea::focusInInner() { } } -void InputArea::InputAreaInner::focusOutEvent(QFocusEvent *e) { +void InputArea::Inner::focusOutEvent(QFocusEvent *e) { f()->focusOutInner(); QTextEdit::focusOutEvent(e); emit f()->blurred(); @@ -943,7 +943,7 @@ void InputArea::insertEmoji(EmojiPtr emoji, QTextCursor c) { c.insertText(objectReplacement, imageFormat); } -QVariant InputArea::InputAreaInner::loadResource(int type, const QUrl &name) { +QVariant InputArea::Inner::loadResource(int type, const QUrl &name) { QString imageName = name.toDisplayString(); if (imageName.startsWith(qstr("emoji://e."))) { if (EmojiPtr emoji = emojiFromUrl(imageName)) { @@ -1193,7 +1193,7 @@ void InputArea::updatePlaceholder() { } } -QMimeData *InputArea::InputAreaInner::createMimeDataFromSelection() const { +QMimeData *InputArea::Inner::createMimeDataFromSelection() const { QMimeData *result = new QMimeData(); QTextCursor c(textCursor()); int32 start = c.selectionStart(), end = c.selectionEnd(); @@ -1211,7 +1211,7 @@ void InputArea::setCtrlEnterSubmit(CtrlEnterSubmit ctrlEnterSubmit) { _ctrlEnterSubmit = ctrlEnterSubmit; } -void InputArea::InputAreaInner::keyPressEvent(QKeyEvent *e) { +void InputArea::Inner::keyPressEvent(QKeyEvent *e) { bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); bool macmeta = (cPlatform() == dbipMac || cPlatform() == dbipMacOld) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier); @@ -1276,11 +1276,11 @@ void InputArea::InputAreaInner::keyPressEvent(QKeyEvent *e) { } } -void InputArea::InputAreaInner::paintEvent(QPaintEvent *e) { +void InputArea::Inner::paintEvent(QPaintEvent *e) { return QTextEdit::paintEvent(e); } -void InputArea::InputAreaInner::contextMenuEvent(QContextMenuEvent *e) { +void InputArea::Inner::contextMenuEvent(QContextMenuEvent *e) { if (QMenu *menu = createStandardContextMenu()) { (new PopupMenu(menu))->popup(e->globalPos()); } @@ -1338,7 +1338,9 @@ InputField::InputField(QWidget *parent, const style::InputField &st, const QStri _inner.setWordWrapMode(QTextOption::NoWrap); - setAttribute(Qt::WA_OpaquePaintEvent); + if (_st.textBg->c.alphaF() >= 1.) { + setAttribute(Qt::WA_OpaquePaintEvent); + } _inner.setFont(_st.font->f); _inner.setAlignment(_st.textAlign); @@ -1380,10 +1382,10 @@ void InputField::onTouchTimer() { _touchRightButton = true; } -InputField::InputFieldInner::InputFieldInner(InputField *parent) : QTextEdit(parent) { +InputField::Inner::Inner(InputField *parent) : QTextEdit(parent) { } -bool InputField::InputFieldInner::viewportEvent(QEvent *e) { +bool InputField::Inner::viewportEvent(QEvent *e) { if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchUpdate || e->type() == QEvent::TouchEnd || e->type() == QEvent::TouchCancel) { QTouchEvent *ev = static_cast(e); if (ev->device()->type() == QTouchDevice::TouchScreen) { @@ -1437,7 +1439,9 @@ void InputField::paintEvent(QPaintEvent *e) { Painter p(this); QRect r(rect().intersected(e->rect())); - p.fillRect(r, st::white->b); + if (_st.textBg->c.alphaF() > 0.) { + p.fillRect(r, _st.textBg); + } if (_st.border) { p.fillRect(0, height() - _st.border, width(), _st.border, _st.borderFg->b); } @@ -1446,9 +1450,6 @@ void InputField::paintEvent(QPaintEvent *e) { p.fillRect(0, height() - _st.borderActive, width(), _st.borderActive, a_borderFg.current()); p.setOpacity(1); } - if (_st.iconSprite.pxWidth()) { - p.drawSpriteLeft(_st.iconPosition, width(), _st.iconSprite); - } bool drawPlaceholder = _placeholderVisible; if (_a_placeholderShift.animating()) { @@ -1490,7 +1491,7 @@ void InputField::contextMenuEvent(QContextMenuEvent *e) { _inner.contextMenuEvent(e); } -void InputField::InputFieldInner::focusInEvent(QFocusEvent *e) { +void InputField::Inner::focusInEvent(QFocusEvent *e) { f()->focusInInner(); QTextEdit::focusInEvent(e); emit f()->focused(); @@ -1507,7 +1508,7 @@ void InputField::focusInInner() { } } -void InputField::InputFieldInner::focusOutEvent(QFocusEvent *e) { +void InputField::Inner::focusOutEvent(QFocusEvent *e) { f()->focusOutInner(); QTextEdit::focusOutEvent(e); emit f()->blurred(); @@ -1643,7 +1644,7 @@ void InputField::insertEmoji(EmojiPtr emoji, QTextCursor c) { c.insertText(objectReplacement, imageFormat); } -QVariant InputField::InputFieldInner::loadResource(int type, const QUrl &name) { +QVariant InputField::Inner::loadResource(int type, const QUrl &name) { QString imageName = name.toDisplayString(); if (imageName.startsWith(qstr("emoji://e."))) { if (EmojiPtr emoji = emojiFromUrl(imageName)) { @@ -1928,7 +1929,7 @@ void InputField::setPlaceholderHidden(bool forcePlaceholderHidden) { updatePlaceholder(); } -QMimeData *InputField::InputFieldInner::createMimeDataFromSelection() const { +QMimeData *InputField::Inner::createMimeDataFromSelection() const { QMimeData *result = new QMimeData(); QTextCursor c(textCursor()); int32 start = c.selectionStart(), end = c.selectionEnd(); @@ -1942,7 +1943,7 @@ void InputField::customUpDown(bool custom) { _customUpDown = custom; } -void InputField::InputFieldInner::keyPressEvent(QKeyEvent *e) { +void InputField::Inner::keyPressEvent(QKeyEvent *e) { bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); bool macmeta = (cPlatform() == dbipMac || cPlatform() == dbipMacOld) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier), ctrlGood = true; @@ -1979,36 +1980,41 @@ void InputField::InputFieldInner::keyPressEvent(QKeyEvent *e) { } #endif // Q_OS_MAC } else { - QTextCursor tc(textCursor()); + auto oldCursorPosition = textCursor().position(); if (enter && ctrl) { e->setModifiers(e->modifiers() & ~Qt::ControlModifier); } QTextEdit::keyPressEvent(e); - if (tc == textCursor()) { + auto currentCursor = textCursor(); + if (textCursor().position() == oldCursorPosition) { bool check = false; if (e->key() == Qt::Key_PageUp || e->key() == Qt::Key_Up) { - tc.movePosition(QTextCursor::Start, e->modifiers().testFlag(Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor); + oldCursorPosition = currentCursor.position(); + currentCursor.movePosition(QTextCursor::Start, e->modifiers().testFlag(Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor); check = true; } else if (e->key() == Qt::Key_PageDown || e->key() == Qt::Key_Down) { - tc.movePosition(QTextCursor::End, e->modifiers().testFlag(Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor); + oldCursorPosition = currentCursor.position(); + currentCursor.movePosition(QTextCursor::End, e->modifiers().testFlag(Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor); check = true; + } else if (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right || e->key() == Qt::Key_Backspace) { + e->ignore(); } if (check) { - if (tc == textCursor()) { + if (oldCursorPosition == currentCursor.position()) { e->ignore(); } else { - setTextCursor(tc); + setTextCursor(currentCursor); } } } } } -void InputField::InputFieldInner::paintEvent(QPaintEvent *e) { +void InputField::Inner::paintEvent(QPaintEvent *e) { return QTextEdit::paintEvent(e); } -void InputField::InputFieldInner::contextMenuEvent(QContextMenuEvent *e) { +void InputField::Inner::contextMenuEvent(QContextMenuEvent *e) { if (QMenu *menu = createStandardContextMenu()) { (new PopupMenu(menu))->popup(e->globalPos()); } @@ -2167,9 +2173,6 @@ void MaskedInputField::paintEvent(QPaintEvent *e) { p.fillRect(0, height() - _st.borderActive, width(), _st.borderActive, a_borderFg.current()); p.setOpacity(1); } - if (_st.iconSprite.pxWidth()) { - p.drawSpriteLeft(_st.iconPosition, width(), _st.iconSprite); - } p.setClipRect(r); paintPlaceholder(p); diff --git a/Telegram/SourceFiles/ui/flatinput.h b/Telegram/SourceFiles/ui/flatinput.h index 2535a019d..9b0ee960d 100644 --- a/Telegram/SourceFiles/ui/flatinput.h +++ b/Telegram/SourceFiles/ui/flatinput.h @@ -262,10 +262,9 @@ private: bool heightAutoupdated(); void checkContentHeight(); - friend class InputAreaInner; - class InputAreaInner : public QTextEdit { + class Inner : public QTextEdit { public: - InputAreaInner(InputArea *parent); + Inner(InputArea *parent); QVariant loadResource(int type, const QUrl &name) override; @@ -286,6 +285,7 @@ private: friend class InputArea; }; + friend class Inner; void focusInInner(); void focusOutInner(); @@ -294,7 +294,7 @@ private: void startBorderAnimation(); - InputAreaInner _inner; + Inner _inner; QString _oldtext; @@ -431,10 +431,9 @@ private: int32 _maxLength; bool _forcePlaceholderHidden = false; - friend class InputFieldInner; - class InputFieldInner : public QTextEdit { + class Inner : public QTextEdit { public: - InputFieldInner(InputField *parent); + Inner(InputField *parent); QVariant loadResource(int type, const QUrl &name) override; @@ -455,6 +454,7 @@ private: friend class InputField; }; + friend class Inner; void focusInInner(); void focusOutInner(); @@ -463,7 +463,7 @@ private: void startBorderAnimation(); - InputFieldInner _inner; + Inner _inner; QString _oldtext; diff --git a/Telegram/SourceFiles/ui/style/style_core_icon.h b/Telegram/SourceFiles/ui/style/style_core_icon.h index 822a491a9..7fb337a3f 100644 --- a/Telegram/SourceFiles/ui/style/style_core_icon.h +++ b/Telegram/SourceFiles/ui/style/style_core_icon.h @@ -105,6 +105,9 @@ public: return std_::make_unique(ColoredCopy { *this, colors }); } + bool empty() const { + return _parts.empty(); + } void paint(QPainter &p, const QPoint &pos, int outerw) const; void paint(QPainter &p, int x, int y, int outerw) const { paint(p, QPoint(x, y), outerw); diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.cpp b/Telegram/SourceFiles/ui/widgets/multi_select.cpp index ab0888da7..373ad7e92 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.cpp +++ b/Telegram/SourceFiles/ui/widgets/multi_select.cpp @@ -26,91 +26,476 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "lang.h" namespace Ui { +namespace { + +constexpr int kWideScale = 3; + +} // namespace + +class MultiSelect::Inner::Item { +public: + Item(const style::MultiSelectItem &st, uint64 id, const QString &text, const style::color &color, PaintRoundImage paintRoundImage); + + uint64 id() const { + return _id; + } + int getWidth() const { + return _width; + } + QRect rect() const { + return QRect(_x, _y, _width, _st.height); + } + bool isOverDelete() const { + return _overDelete; + } + void setActive(bool active) { + _active = active; + } + void setPosition(int x, int y, int outerWidth, int maxVisiblePadding); + QRect paintArea(int outerWidth) const; + + void setUpdateCallback(base::lambda_wrap updateCallback) { + _updateCallback = std_::move(updateCallback); + } + void setText(const QString &text); + void paint(Painter &p, int outerWidth, uint64 ms); + + void mouseMoveEvent(QPoint point); + void leaveEvent(); + + void showAnimated() { + setVisibleAnimated(true); + } + void hideAnimated() { + setVisibleAnimated(false); + } + bool hideFinished() const { + return (_hiding && !_visibility.animating()); + } + + +private: + void setOver(bool over); + void paintOnce(Painter &p, int x, int y, int outerWidth, uint64 ms); + void paintDeleteButton(Painter &p, int x, int y, int outerWidth, float64 overOpacity); + bool paintCached(Painter &p, int x, int y, int outerWidth); + void prepareCache(); + void setVisibleAnimated(bool visible); + + const style::MultiSelectItem &_st; + + uint64 _id; + struct SlideAnimation { + SlideAnimation(base::lambda_wrap updateCallback, int fromX, int toX, int y, float64 duration) + : fromX(fromX) + , toX(toX) + , y(y) { + x.start(std_::move(updateCallback), fromX, toX, duration); + } + IntAnimation x; + int fromX, toX; + int y; + }; + std_::vector_of_moveable _copies; + int _x = -1; + int _y = -1; + int _width = 0; + Text _text; + const style::color &_color; + bool _over = false; + QPixmap _cache; + FloatAnimation _visibility; + FloatAnimation _overOpacity; + bool _overDelete = false; + bool _active = false; + PaintRoundImage _paintRoundImage; + base::lambda_wrap _updateCallback; + bool _hiding = false; + +}; + +MultiSelect::Inner::Item::Item(const style::MultiSelectItem &st, uint64 id, const QString &text, const style::color &color, PaintRoundImage paintRoundImage) +: _st(st) +, _id(id) +, _color(color) +, _paintRoundImage(std_::move(paintRoundImage)) { + setText(text); +} + +void MultiSelect::Inner::Item::setText(const QString &text) { + _text.setText(_st.font, text, _textNameOptions); + _width = _st.height + _st.padding.left() + _text.maxWidth() + _st.padding.right(); + accumulate_min(_width, _st.maxWidth); +} + +void MultiSelect::Inner::Item::paint(Painter &p, int outerWidth, uint64 ms) { + if (!_cache.isNull() && !_visibility.animating(ms)) { + if (_hiding) { + return; + } else { + _cache = QPixmap(); + } + } + if (_copies.empty()) { + paintOnce(p, _x, _y, outerWidth, ms); + } else { + for (auto i = _copies.begin(), e = _copies.end(); i != e;) { + auto x = i->x.current(getms(), _x); + auto y = i->y; + auto animating = i->x.animating(); + if (animating || (y == _y)) { + paintOnce(p, x, y, outerWidth, ms); + } + if (animating) { + ++i; + } else { + i = _copies.erase(i); + e = _copies.end(); + } + } + } +} + +void MultiSelect::Inner::Item::paintOnce(Painter &p, int x, int y, int outerWidth, uint64 ms) { + if (!_cache.isNull()) { + paintCached(p, x, y, outerWidth); + return; + } + + auto radius = _st.height / 2; + auto inner = rtlrect(x + radius, y, _width - radius, _st.height, outerWidth); + + auto clipEnabled = p.hasClipping(); + auto clip = clipEnabled ? p.clipRegion() : QRegion(); + p.setRenderHint(QPainter::HighQualityAntialiasing); + p.setClipRect(inner); + + p.setPen(Qt::NoPen); + p.setBrush(_active ? _st.textActiveBg : _st.textBg); + p.drawRoundedRect(rtlrect(x, y, _width, _st.height, outerWidth), radius, radius); + + if (clipEnabled) { + p.setClipRegion(clip); + } else { + p.setClipping(false); + } + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + + auto overOpacity = _overOpacity.current(ms, _over ? 1. : 0.); + if (overOpacity < 1.) { + _paintRoundImage(p, x, y, outerWidth, _st.height); + } + if (overOpacity > 0.) { + paintDeleteButton(p, x, y, outerWidth, overOpacity); + } + + auto textLeft = _st.height + _st.padding.left(); + auto textWidth = _width - textLeft - _st.padding.right(); + p.setPen(_active ? _st.textActiveFg : _st.textFg); + _text.drawLeftElided(p, x + textLeft, y + _st.padding.top(), textWidth, outerWidth); +} + +void MultiSelect::Inner::Item::paintDeleteButton(Painter &p, int x, int y, int outerWidth, float64 overOpacity) { + p.setOpacity(overOpacity); + p.setRenderHint(QPainter::HighQualityAntialiasing); + p.setPen(Qt::NoPen); + p.setBrush(_color); + p.drawEllipse(rtlrect(x, y, _st.height, _st.height, outerWidth)); + + auto deleteScale = overOpacity + _st.minScale * (1. - overOpacity); + auto deleteSkip = deleteScale * _st.deleteLeft + (1. - deleteScale) * (_st.height / 2); + auto sqrt2 = sqrt(2.); + auto deleteLeft = rtlpoint(x + deleteSkip, 0, outerWidth).x() + 0.; + auto deleteTop = y + deleteSkip + 0.; + auto deleteWidth = _st.height - 2 * deleteSkip; + auto deleteHeight = _st.height - 2 * deleteSkip; + auto deleteStroke = _st.deleteStroke / sqrt2; + QPointF pathDelete[] = { + { deleteLeft, deleteTop + deleteStroke }, + { deleteLeft + deleteStroke, deleteTop }, + { deleteLeft + (deleteWidth / 2.), deleteTop + (deleteHeight / 2.) - deleteStroke }, + { deleteLeft + deleteWidth - deleteStroke, deleteTop }, + { deleteLeft + deleteWidth, deleteTop + deleteStroke }, + { deleteLeft + (deleteWidth / 2.) + deleteStroke, deleteTop + (deleteHeight / 2.) }, + { deleteLeft + deleteWidth, deleteTop + deleteHeight - deleteStroke }, + { deleteLeft + deleteWidth - deleteStroke, deleteTop + deleteHeight }, + { deleteLeft + (deleteWidth / 2.), deleteTop + (deleteHeight / 2.) + deleteStroke }, + { deleteLeft + deleteStroke, deleteTop + deleteHeight }, + { deleteLeft, deleteTop + deleteHeight - deleteStroke }, + { deleteLeft + (deleteWidth / 2.) - deleteStroke, deleteTop + (deleteHeight / 2.) }, + }; + if (overOpacity < 1.) { + auto alpha = -(overOpacity - 1.) * M_PI_2; + auto cosalpha = cos(alpha); + auto sinalpha = sin(alpha); + auto shiftx = deleteLeft + (deleteWidth / 2.); + auto shifty = deleteTop + (deleteHeight / 2.); + for (auto &point : pathDelete) { + auto x = point.x() - shiftx; + auto y = point.y() - shifty; + point.setX(shiftx + x * cosalpha - y * sinalpha); + point.setY(shifty + y * cosalpha + x * sinalpha); + } + } + QPainterPath path; + path.moveTo(pathDelete[0]); + for (int i = 1; i != base::array_size(pathDelete); ++i) { + path.lineTo(pathDelete[i]); + } + p.fillPath(path, _st.deleteFg); + + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + p.setOpacity(1.); +} + +bool MultiSelect::Inner::Item::paintCached(Painter &p, int x, int y, int outerWidth) { + auto opacity = _visibility.current(_hiding ? 0. : 1.); + auto scale = opacity + _st.minScale * (1. - opacity); + auto height = opacity * _cache.height() / _cache.devicePixelRatio(); + auto width = opacity * _cache.width() / _cache.devicePixelRatio(); + + p.setOpacity(opacity); + p.setRenderHint(QPainter::SmoothPixmapTransform, true); + p.drawPixmap(rtlrect(x + (_width - width) / 2., y + (_st.height - height) / 2., width, height, outerWidth), _cache); + p.setRenderHint(QPainter::SmoothPixmapTransform, false); + p.setOpacity(1.); + return true; +} + +void MultiSelect::Inner::Item::mouseMoveEvent(QPoint point) { + if (!_cache.isNull()) return; + _overDelete = QRect(0, 0, _st.height, _st.height).contains(point); + setOver(true); +} + +void MultiSelect::Inner::Item::leaveEvent() { + _overDelete = false; + setOver(false); +} + +void MultiSelect::Inner::Item::setPosition(int x, int y, int outerWidth, int maxVisiblePadding) { + if (_x >= 0 && _y >= 0 && (_x != x || _y != y)) { + // Make an animation if it is not the first setPosition(). + auto found = false; + auto leftHidden = -_width - maxVisiblePadding; + auto rightHidden = outerWidth + maxVisiblePadding; + for (auto i = _copies.begin(), e = _copies.end(); i != e;) { + if (i->x.animating()) { + if (i->y == y) { + i->x.start(_updateCallback, i->toX, x, _st.duration); + found = true; + } else { + i->x.start(_updateCallback, i->fromX, (i->toX > i->fromX) ? rightHidden : leftHidden, _st.duration); + } + ++i; + } else { + i = _copies.erase(i); + e = _copies.end(); + } + } + if (_copies.empty()) { + if (_y == y) { + auto copy = SlideAnimation(_updateCallback, _x, x, _y, _st.duration); + _copies.push_back(std_::move(copy)); + } else { + auto copyHiding = SlideAnimation(_updateCallback, _x, (y > _y) ? rightHidden : leftHidden, _y, _st.duration); + _copies.push_back(std_::move(copyHiding)); + auto copyShowing = SlideAnimation(_updateCallback, (y > _y) ? leftHidden : rightHidden, x, y, _st.duration); + _copies.push_back(std_::move(copyShowing)); + } + } else if (!found) { + auto copy = SlideAnimation(_updateCallback, (y > _y) ? leftHidden : rightHidden, x, y, _st.duration); + _copies.push_back(std_::move(copy)); + } + } + _x = x; + _y = y; +} + +QRect MultiSelect::Inner::Item::paintArea(int outerWidth) const { + if (_copies.empty()) { + return rect(); + } + auto yMin = 0, yMax = 0; + for_const (auto ©, _copies) { + accumulate_max(yMax, copy.y); + if (yMin) { + accumulate_min(yMin, copy.y); + } else { + yMin = copy.y; + } + } + return QRect(0, yMin, outerWidth, yMax - yMin + _st.height); +} + +void MultiSelect::Inner::Item::prepareCache() { + if (!_cache.isNull()) return; + + t_assert(!_visibility.animating()); + auto cacheWidth = _width * kWideScale * cIntRetinaFactor(); + auto cacheHeight = _st.height * kWideScale * cIntRetinaFactor(); + auto data = QImage(cacheWidth, cacheHeight, QImage::Format_ARGB32_Premultiplied); + data.fill(Qt::transparent); + data.setDevicePixelRatio(cRetinaFactor()); + { + Painter p(&data); + paintOnce(p, _width * (kWideScale - 1) / 2, _st.height * (kWideScale - 1) / 2, cacheWidth, getms()); + } + _cache = App::pixmapFromImageInPlace(std_::move(data)); +} + +void MultiSelect::Inner::Item::setVisibleAnimated(bool visible) { + _hiding = !visible; + prepareCache(); + auto from = visible ? 0. : 1.; + auto to = visible ? 1. : 0.; + auto transition = visible ? anim::bumpy<1125, 1000> : anim::linear; + _visibility.start(_updateCallback, from, to, _st.duration, transition); +} + +void MultiSelect::Inner::Item::setOver(bool over) { + if (over != _over) { + _over = over; + _overOpacity.start(_updateCallback, _over ? 0. : 1., _over ? 1. : 0., _st.duration); + } +} MultiSelect::MultiSelect(QWidget *parent, const style::MultiSelect &st, const QString &placeholder) : TWidget(parent) , _st(st) -, _scroll(this, st::boxScroll) -, _inner(this, st, placeholder) { +, _scroll(this, _st.scroll) +, _inner(this, st, placeholder, [this](int activeTop, int activeBottom) { scrollTo(activeTop, activeBottom); }) { _scroll->setOwnedWidget(_inner); + _scroll->installEventFilter(this); + _inner->setResizedCallback([this](int innerHeightDelta) { + auto newHeight = resizeGetHeight(width()); + if (innerHeightDelta > 0) { + _scroll->scrollToY(_scroll->scrollTop() + innerHeightDelta); + } + if (newHeight != height()) { + resize(width(), newHeight); + if (_resizedCallback) { + _resizedCallback(); + } + } + }); + _inner->setQueryChangedCallback([this](const QString &query) { + _scroll->scrollToY(_scroll->scrollTopMax()); + if (_queryChangedCallback) { + _queryChangedCallback(query); + } + }); + setAttribute(Qt::WA_OpaquePaintEvent); } +bool MultiSelect::eventFilter(QObject *o, QEvent *e) { + if (o == _scroll && e->type() == QEvent::KeyPress) { + e->ignore(); + return true; + } + return false; +} + +void MultiSelect::scrollTo(int activeTop, int activeBottom) { + auto scrollTop = _scroll->scrollTop(); + auto scrollHeight = _scroll->height(); + auto scrollBottom = scrollTop + scrollHeight; + if (scrollTop > activeTop) { + _scroll->scrollToY(activeTop); + } else if (scrollBottom < activeBottom) { + _scroll->scrollToY(activeBottom - scrollHeight); + } +} + void MultiSelect::setQueryChangedCallback(base::lambda_unique callback) { - _inner->setQueryChangedCallback(std_::move(callback)); + _queryChangedCallback = std_::move(callback); } void MultiSelect::setSubmittedCallback(base::lambda_unique callback) { _inner->setSubmittedCallback(std_::move(callback)); } +void MultiSelect::setResizedCallback(base::lambda_unique callback) { + _resizedCallback = std_::move(callback); +} + void MultiSelect::setInnerFocus() { if (_inner->setInnerFocus()) { _scroll->scrollToY(_scroll->scrollTopMax()); } } +void MultiSelect::clearQuery() { + _inner->clearQuery(); +} + QString MultiSelect::getQuery() const { return _inner->getQuery(); } -void MultiSelect::addItem(std_::unique_ptr item) { - _inner->addItem(std_::move(item)); +void MultiSelect::addItem(uint64 itemId, const QString &text, const style::color &color, PaintRoundImage paintRoundImage) { + _inner->addItem(std_::make_unique(_st.item, itemId, text, color, std_::move(paintRoundImage))); +} + +void MultiSelect::setItemRemovedCallback(base::lambda_unique callback) { + _inner->setItemRemovedCallback(std_::move(callback)); +} + +void MultiSelect::removeItem(uint64 itemId) { + _inner->removeItem(itemId); } int MultiSelect::resizeGetHeight(int newWidth) { - _inner->resizeToWidth(newWidth); + if (newWidth != _inner->width()) { + _inner->resizeToWidth(newWidth); + } auto newHeight = qMin(_inner->height(), _st.maxHeight); - _scroll->resize(newWidth, newHeight); + _scroll->setGeometryToLeft(0, 0, newWidth, newHeight); return newHeight; } -void MultiSelect::resizeEvent(QResizeEvent *e) { - _scroll->moveToLeft(0, 0); -} - -MultiSelect::Item::Item(uint64 id, const QString &text, const style::color &color) -: _id(id) { -} - -void MultiSelect::Item::setText(const QString &text) { - -} - -void MultiSelect::Item::paint(Painter &p, int x, int y) { - -} - -MultiSelect::Inner::Inner(QWidget *parent, const style::MultiSelect &st, const QString &placeholder) : ScrolledWidget(parent) +MultiSelect::Inner::Inner(QWidget *parent, const style::MultiSelect &st, const QString &placeholder, ScrollCallback callback) : ScrolledWidget(parent) , _st(st) -, _filter(this, _st.field, placeholder) -, _cancel(this, _st.cancel) { - connect(_filter, SIGNAL(changed()), this, SLOT(onQueryChanged())); - connect(_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmitted(bool))); +, _scrollCallback(std_::move(callback)) +, _field(this, _st.field, placeholder) +, _cancel(this, _st.fieldCancel) { + _field->customUpDown(true); + connect(_field, SIGNAL(focused()), this, SLOT(onFieldFocused())); + connect(_field, SIGNAL(changed()), this, SLOT(onQueryChanged())); + connect(_field, SIGNAL(submitted(bool)), this, SLOT(onSubmitted(bool))); _cancel->hide(); _cancel->setClickedCallback([this] { - _filter->setText(QString()); - _filter->setFocus(); + clearQuery(); + _field->setFocus(); }); + setMouseTracking(true); } void MultiSelect::Inner::onQueryChanged() { auto query = getQuery(); _cancel->setVisible(!query.isEmpty()); + updateFieldGeometry(); if (_queryChangedCallback) { _queryChangedCallback(query); } } +QString MultiSelect::Inner::getQuery() const { + return _field->getLastText().trimmed(); +} + bool MultiSelect::Inner::setInnerFocus() { - if (!_filter->hasFocus()) { - _filter->setFocus(); + if (_active >= 0) { + setFocus(); + } else if (!_field->hasFocus()) { + _field->setFocus(); return true; } return false; } -QString MultiSelect::Inner::getQuery() const { - return _filter->getLastText().trimmed(); +void MultiSelect::Inner::clearQuery() { + _field->setText(QString()); } void MultiSelect::Inner::setQueryChangedCallback(base::lambda_unique callback) { @@ -121,41 +506,275 @@ void MultiSelect::Inner::setSubmittedCallback(base::lambda_uniqueresizeToWidth(newWidth); - return _filter->height(); +void MultiSelect::Inner::updateFieldGeometry() { + auto fieldFinalWidth = _fieldWidth; + if (!_cancel->isHidden()) { + fieldFinalWidth -= _st.fieldCancelSkip; + } + _field->resizeToWidth(fieldFinalWidth); + _field->moveToLeft(_st.padding.left() + _fieldLeft, _st.padding.top() + _fieldTop); } -void MultiSelect::Inner::resizeEvent(QResizeEvent *e) { - _filter->moveToLeft(0, 0); - _cancel->moveToRight(0, 0); +void MultiSelect::Inner::updateHasAnyItems(bool hasAnyItems) { + _field->setPlaceholderHidden(hasAnyItems); + updateCursor(); + _iconOpacity.start([this] { + rtlupdate(_st.padding.left(), _st.padding.top(), _st.fieldIcon.width(), _st.fieldIcon.height()); + }, hasAnyItems ? 1. : 0., hasAnyItems ? 0. : 1., _st.item.duration); +} + +void MultiSelect::Inner::updateCursor() { + setCursor(_items.empty() ? style::cur_text : (_overDelete ? style::cur_pointer : style::cur_default)); +} + +void MultiSelect::Inner::setActiveItem(int active, ChangeActiveWay skipSetFocus) { + if (_active == active) return; + + if (_active >= 0) { + t_assert(_active < _items.size()); + _items[_active]->setActive(false); + } + _active = active; + if (_active >= 0) { + t_assert(_active < _items.size()); + _items[_active]->setActive(true); + } + if (skipSetFocus != ChangeActiveWay::SkipSetFocus) { + setInnerFocus(); + } + if (_scrollCallback) { + auto rect = (_active >= 0) ? _items[_active]->rect() : _field->geometry().translated(-_st.padding.left(), -_st.padding.top()); + _scrollCallback(rect.y(), rect.y() + rect.height() + _st.padding.top() + _st.padding.bottom()); + } + update(); +} + +void MultiSelect::Inner::setActiveItemPrevious() { + if (_active > 0) { + setActiveItem(_active - 1); + } else if (_active < 0 && !_items.empty()) { + setActiveItem(_items.size() - 1); + } +} + +void MultiSelect::Inner::setActiveItemNext() { + if (_active >= 0 && _active + 1 < _items.size()) { + setActiveItem(_active + 1); + } else { + setActiveItem(-1); + } +} + +int MultiSelect::Inner::resizeGetHeight(int newWidth) { + computeItemsGeometry(newWidth); + updateFieldGeometry(); + + auto cancelLeft = _fieldLeft + _fieldWidth + _st.padding.right() - _cancel->width(); + auto cancelTop = _fieldTop - _st.padding.top(); + _cancel->moveToLeft(_st.padding.left() + cancelLeft, _st.padding.top() + cancelTop); + + return _field->y() + _field->height() + _st.padding.bottom(); +} + +void MultiSelect::Inner::paintEvent(QPaintEvent *e) { + Painter p(this); + + auto paintRect = e->rect(); + p.fillRect(paintRect, st::windowBg); + + auto offset = QPoint(rtl() ? _st.padding.right() : _st.padding.left(), _st.padding.top()); + p.translate(offset); + paintRect.translate(-offset); + + auto ms = getms(); + auto outerWidth = width() - _st.padding.left() - _st.padding.right(); + auto iconOpacity = _iconOpacity.current(ms, _items.empty() ? 1. : 0.); + if (iconOpacity > 0.) { + p.setOpacity(iconOpacity); + _st.fieldIcon.paint(p, 0, 0, outerWidth); + p.setOpacity(1.); + } + + auto checkRect = myrtlrect(paintRect); + auto paintMargins = itemPaintMargins(); + for (auto i = _removingItems.begin(), e = _removingItems.end(); i != e;) { + auto item = *i; + auto itemRect = item->paintArea(outerWidth); + itemRect = itemRect.marginsAdded(paintMargins); + if (checkRect.intersects(itemRect)) { + item->paint(p, outerWidth, ms); + } + if (item->hideFinished()) { + i = _removingItems.erase(i); + e = _removingItems.end(); + } else { + ++i; + } + } + for_const (auto item, _items) { + auto itemRect = item->paintArea(outerWidth); + itemRect = itemRect.marginsAdded(paintMargins); + if (checkRect.y() + checkRect.height() <= itemRect.y()) { + break; + } else if (checkRect.intersects(itemRect)) { + item->paint(p, outerWidth, ms); + } + } +} + +QMargins MultiSelect::Inner::itemPaintMargins() const { + return { + qMax(_st.itemSkip, _st.padding.left()), + _st.itemSkip, + qMax(_st.itemSkip, _st.padding.right()), + _st.itemSkip, + }; +} + +void MultiSelect::Inner::leaveEvent(QEvent *e) { + clearSelection(); +} + +void MultiSelect::Inner::mouseMoveEvent(QMouseEvent *e) { + updateSelection(e->pos()); +} + +void MultiSelect::Inner::keyPressEvent(QKeyEvent *e) { + if (_active >= 0) { + t_assert(_active < _items.size()); + if (e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace) { + auto itemId = _items[_active]->id(); + setActiveItemNext(); + removeItem(itemId); + } else if (e->key() == Qt::Key_Left) { + setActiveItemPrevious(); + } else if (e->key() == Qt::Key_Right) { + setActiveItemNext(); + } else if (e->key() == Qt::Key_Escape) { + setActiveItem(-1); + } else { + e->ignore(); + } + } else if (e->key() == Qt::Key_Left || e->key() == Qt::Key_Backspace) { + setActiveItemPrevious(); + } else { + e->ignore(); + } +} + +void MultiSelect::Inner::onFieldFocused() { + setActiveItem(-1, ChangeActiveWay::SkipSetFocus); +} + +void MultiSelect::Inner::updateSelection(QPoint mousePosition) { + auto point = myrtlpoint(mousePosition) - QPoint(_st.padding.left(), _st.padding.right()); + auto selected = -1; + for (auto i = 0, size = _items.size(); i != size; ++i) { + auto itemRect = _items[i]->rect(); + if (itemRect.y() > point.y()) { + break; + } else if (itemRect.contains(point)) { + point -= itemRect.topLeft(); + selected = i; + break; + } + } + if (_selected != selected) { + if (_selected >= 0) { + t_assert(_selected < _items.size()); + _items[_selected]->leaveEvent(); + } + _selected = selected; + update(); + } + auto overDelete = false; + if (_selected >= 0) { + _items[_selected]->mouseMoveEvent(point); + overDelete = _items[_selected]->isOverDelete(); + } + if (_overDelete != overDelete) { + _overDelete = overDelete; + updateCursor(); + } +} + +void MultiSelect::Inner::mousePressEvent(QMouseEvent *e) { + if (_overDelete) { + t_assert(_selected >= 0); + t_assert(_selected < _items.size()); + removeItem(_items[_selected]->id()); + } else if (_selected >= 0) { + setActiveItem(_selected); + } else { + setInnerFocus(); + } } void MultiSelect::Inner::addItem(std_::unique_ptr item) { + auto wasEmpty = _items.empty(); + item->setUpdateCallback([this, item = item.get()] { + auto itemRect = item->paintArea(width() - _st.padding.left() - _st.padding.top()); + itemRect = itemRect.translated(_st.padding.left(), _st.padding.top()); + itemRect = itemRect.marginsAdded(itemPaintMargins()); + rtlupdate(itemRect); + }); _items.push_back(item.release()); - refreshItemsGeometry(nullptr); + updateItemsGeometry(); + if (wasEmpty) { + updateHasAnyItems(true); + } + _items.back()->showAnimated(); } -void MultiSelect::Inner::refreshItemsGeometry(Item *startingFromRowWithItem) { - int startingFromRow = 0; - int startingFromIndex = 0; - for (int row = 1, rowsCount = qMin(_rows.size(), 1); row != rowsCount; ++row) { - if (startingFromRowWithItem) { - if (_rows[row - 1].contains(startingFromRowWithItem)) { - break; - } +void MultiSelect::Inner::computeItemsGeometry(int newWidth) { + newWidth -= _st.padding.left() + _st.padding.right(); + + auto itemLeft = 0; + auto itemTop = 0; + auto widthLeft = newWidth; + auto maxVisiblePadding = qMax(_st.padding.left(), _st.padding.right()); + for_const (auto item, _items) { + auto itemWidth = item->getWidth(); + t_assert(itemWidth <= newWidth); + if (itemWidth > widthLeft) { + itemLeft = 0; + itemTop += _st.item.height + _st.itemSkip; + widthLeft = newWidth; } - startingFromIndex += _rows[row - 1].size(); - ++startingFromRow; + item->setPosition(itemLeft, itemTop, newWidth, maxVisiblePadding); + itemLeft += itemWidth + _st.itemSkip; + widthLeft -= itemWidth + _st.itemSkip; } - while (_rows.size() > startingFromRow) { - _rows.pop_back(); - } - for (int i = startingFromIndex, count = _items.size(); i != count; ++i) { - Row row; - row.append(_items[i]); - _rows.append(row); + + auto fieldMinWidth = _st.fieldMinWidth + _st.fieldCancelSkip; + t_assert(fieldMinWidth <= newWidth); + if (fieldMinWidth > widthLeft) { + _fieldLeft = 0; + _fieldTop = itemTop + _st.item.height + _st.itemSkip; + } else { + _fieldLeft = itemLeft + (_items.empty() ? _st.fieldIconSkip : 0); + _fieldTop = itemTop; } + _fieldWidth = newWidth - _fieldLeft; +} + +void MultiSelect::Inner::updateItemsGeometry() { + computeItemsGeometry(width()); + updateFieldGeometry(); + auto newHeight = resizeGetHeight(width()); + if (newHeight == _newHeight) return; + + _newHeight = newHeight; + _height.start([this] { + auto newHeight = _height.current(_newHeight); + if (auto heightDelta = newHeight - height()) { + resize(width(), newHeight); + if (_resizedCallback) { + _resizedCallback(heightDelta); + } + update(); + } + }, height(), _newHeight, _st.item.duration); } void MultiSelect::Inner::setItemText(uint64 itemId, const QString &text) { @@ -163,7 +782,7 @@ void MultiSelect::Inner::setItemText(uint64 itemId, const QString &text) { auto item = _items[i]; if (item->id() == itemId) { item->setText(text); - refreshItemsGeometry(item); + updateItemsGeometry(); return; } } @@ -173,26 +792,50 @@ void MultiSelect::Inner::setItemRemovedCallback(base::lambda_unique callback) { + _resizedCallback = std_::move(callback); +} + void MultiSelect::Inner::removeItem(uint64 itemId) { for (int i = 0, count = _items.size(); i != count; ++i) { auto item = _items[i]; if (item->id() == itemId) { + clearSelection(); _items.removeAt(i); - refreshItemsGeometry(item); - delete item; + if (_active == i) { + _active = -1; + } else if (_active > i) { + --_active; + } + _removingItems.insert(item); + item->hideAnimated(); + + updateItemsGeometry(); + if (_items.empty()) { + updateHasAnyItems(false); + } + auto point = QCursor::pos(); + if (auto parent = parentWidget()) { + if (parent->rect().contains(parent->mapFromGlobal(point))) { + updateSelection(mapFromGlobal(point)); + } + } break; } } if (_itemRemovedCallback) { _itemRemovedCallback(itemId); } + setInnerFocus(); } MultiSelect::Inner::~Inner() { - base::take(_rows); for (auto item : base::take(_items)) { delete item; } + for (auto item : base::take(_removingItems)) { + delete item; + } } } // namespace Ui diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.h b/Telegram/SourceFiles/ui/widgets/multi_select.h index e44199d1e..6226fc4fc 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.h +++ b/Telegram/SourceFiles/ui/widgets/multi_select.h @@ -34,6 +34,49 @@ public: QString getQuery() const; void setInnerFocus(); + void clearQuery(); + + void setQueryChangedCallback(base::lambda_unique callback); + void setSubmittedCallback(base::lambda_unique callback); + void setResizedCallback(base::lambda_unique callback); + + using PaintRoundImage = base::lambda_unique; + void addItem(uint64 itemId, const QString &text, const style::color &color, PaintRoundImage paintRoundImage); + void setItemText(uint64 itemId, const QString &text); + + void setItemRemovedCallback(base::lambda_unique callback); + void removeItem(uint64 itemId); + +protected: + int resizeGetHeight(int newWidth) override; + bool eventFilter(QObject *o, QEvent *e) override; + +private: + void scrollTo(int activeTop, int activeBottom); + + const style::MultiSelect &_st; + + ChildWidget _scroll; + + class Inner; + ChildWidget _inner; + + base::lambda_unique _resizedCallback; + base::lambda_unique _queryChangedCallback; + +}; + +// This class is hold in header because it requires Qt preprocessing. +class MultiSelect::Inner : public ScrolledWidget { + Q_OBJECT + +public: + using ScrollCallback = base::lambda_unique; + Inner(QWidget *parent, const style::MultiSelect &st, const QString &placeholder, ScrollCallback callback); + + QString getQuery() const; + bool setInnerFocus(); + void clearQuery(); void setQueryChangedCallback(base::lambda_unique callback); void setSubmittedCallback(base::lambda_unique callback); @@ -43,68 +86,20 @@ public: void setItemText(uint64 itemId, const QString &text); void setItemRemovedCallback(base::lambda_unique callback); - void removeItem(uint64 itemId); // Always calls the itemRemovedCallback(). + void removeItem(uint64 itemId); -protected: - int resizeGetHeight(int newWidth) override; - - void resizeEvent(QResizeEvent *e) override; - -private: - ChildWidget _scroll; - - class Inner; - ChildWidget _inner; - - const style::MultiSelect &_st; - -}; - -class MultiSelect::Item { -public: - Item(uint64 id, const QString &text, const style::color &color); - - uint64 id() const { - return _id; - } - void setText(const QString &text); - void paint(Painter &p, int x, int y); - - virtual ~Item() = default; - -protected: - virtual void paintImage(Painter &p, int x, int y, int outerWidth, int size) = 0; - -private: - uint64 _id; - -}; - -// This class is hold in header because it requires Qt preprocessing. -class MultiSelect::Inner : public ScrolledWidget { - Q_OBJECT - -public: - Inner(QWidget *parent, const style::MultiSelect &st, const QString &placeholder); - - QString getQuery() const; - bool setInnerFocus(); - - void setQueryChangedCallback(base::lambda_unique callback); - void setSubmittedCallback(base::lambda_unique callback); - - void addItem(std_::unique_ptr item); - void setItemText(uint64 itemId, const QString &text); - - void setItemRemovedCallback(base::lambda_unique callback); - void removeItem(uint64 itemId); // Always calls the itemRemovedCallback(). + void setResizedCallback(base::lambda_unique callback); ~Inner(); protected: int resizeGetHeight(int newWidth) override; - void resizeEvent(QResizeEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void leaveEvent(QEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void keyPressEvent(QKeyEvent *e) override; private slots: void onQueryChanged(); @@ -113,25 +108,55 @@ private slots: _submittedCallback(ctrlShiftEnter); } } + void onFieldFocused(); private: - void refreshItemsGeometry(Item *startingFromItem); + void computeItemsGeometry(int newWidth); + void updateItemsGeometry(); + void updateFieldGeometry(); + void updateHasAnyItems(bool hasAnyItems); + void updateSelection(QPoint mousePosition); + void clearSelection() { + updateSelection(QPoint(-1, -1)); + } + void updateCursor(); + enum class ChangeActiveWay { + Default, + SkipSetFocus, + }; + void setActiveItem(int active, ChangeActiveWay skipSetFocus = ChangeActiveWay::Default); + void setActiveItemPrevious(); + void setActiveItemNext(); + + QMargins itemPaintMargins() const; const style::MultiSelect &_st; + FloatAnimation _iconOpacity; - using Row = QList; - using Rows = QList; - Rows _rows; + ScrollCallback _scrollCallback; using Items = QList; Items _items; + using RemovingItems = OrderedSet; + RemovingItems _removingItems; - ChildWidget _filter; + int _selected = -1; + int _active = -1; + bool _overDelete = false; + + int _fieldLeft = 0; + int _fieldTop = 0; + int _fieldWidth = 0; + ChildWidget _field; ChildWidget _cancel; + int _newHeight = 0; + IntAnimation _height; + base::lambda_unique _queryChangedCallback; base::lambda_unique _submittedCallback; base::lambda_unique _itemRemovedCallback; + base::lambda_unique _resizedCallback; }; diff --git a/Telegram/SourceFiles/ui/widgets/widgets.style b/Telegram/SourceFiles/ui/widgets/widgets.style index 5db4677f0..8e34c14e4 100644 --- a/Telegram/SourceFiles/ui/widgets/widgets.style +++ b/Telegram/SourceFiles/ui/widgets/widgets.style @@ -67,10 +67,36 @@ RoundImageCheckbox { checkIcon: icon; } +MultiSelectItem { + padding: margins; + maxWidth: pixels; + height: pixels; + font: font; + textBg: color; + textFg: color; + textActiveBg: color; + textActiveFg: color; + deleteFg: color; + deleteLeft: pixels; + deleteStroke: pixels; + duration: int; + minScale: double; +} + MultiSelect { - field: InputField; - cancel: IconButton; + padding: margins; maxHeight: pixels; + scroll: flatScroll; + + item: MultiSelectItem; + itemSkip: pixels; + + field: InputField; + fieldIcon: icon; + fieldIconSkip: pixels; + fieldCancel: IconButton; + fieldCancelSkip: pixels; + fieldMinWidth: pixels; } widgetSlideDuration: 200; From 8bc4e3816be27db27c099cd58445d9d6bed5317a Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 22 Oct 2016 16:03:20 +0300 Subject: [PATCH 06/10] ShareBox and CountrySelect use Ui::MultiSelect as a search field. --- Telegram/SourceFiles/boxes/boxes.style | 65 +++++---- Telegram/SourceFiles/boxes/contactsbox.cpp | 131 ++++++++++++------ Telegram/SourceFiles/boxes/contactsbox.h | 10 +- Telegram/SourceFiles/boxes/sharebox.cpp | 131 ++++++++++++++---- Telegram/SourceFiles/boxes/sharebox.h | 27 ++-- Telegram/SourceFiles/core/lambda_wrap.h | 5 +- Telegram/SourceFiles/ui/countryinput.cpp | 52 +++---- Telegram/SourceFiles/ui/countryinput.h | 10 +- Telegram/SourceFiles/ui/flatinput.cpp | 11 +- Telegram/SourceFiles/ui/flatinput.h | 1 + .../SourceFiles/ui/widgets/multi_select.cpp | 38 +++-- .../SourceFiles/ui/widgets/multi_select.h | 10 +- .../ui/widgets/widget_slide_wrap.h | 2 +- Telegram/SourceFiles/ui/widgets/widgets.style | 2 +- 14 files changed, 317 insertions(+), 178 deletions(-) diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 47d4a5737..2ce8107c1 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -68,37 +68,6 @@ aboutRevokePublicLabel: flatLabel(labelDefFlat) { textFg: windowTextFg; } -boxSearchField: InputField(defaultInputField) { - textBg: transparent; - textMargins: margins(2px, 7px, 2px, 0px); - - placeholderFg: #999; - placeholderFgActive: #aaa; - placeholderMargins: margins(2px, 0px, 2px, 0px); - duration: 150; - - border: 0px; - borderActive: 0px; - borderError: 0px; - - height: 32px; - - font: normalFont; -} -boxSearchCancel: IconButton { - width: 41px; - height: 48px; - - opacity: 0.3; - overOpacity: 0.4; - - icon: icon {{ "box_search_cancel", #000000 }}; - iconPosition: point(8px, 18px); - downIconPosition: point(8px, 19px); - - duration: 150; -} - contactsMultiSelect: MultiSelect { padding: margins(8px, 8px, 8px, 8px); maxHeight: 104px; @@ -128,12 +97,40 @@ contactsMultiSelect: MultiSelect { } itemSkip: 8px; - field: boxSearchField; + field: InputField(defaultInputField) { + textBg: transparent; + textMargins: margins(2px, 7px, 2px, 0px); + + placeholderFg: #999; + placeholderFgActive: #aaa; + placeholderMargins: margins(2px, 0px, 2px, 0px); + + border: 0px; + borderActive: 0px; + borderError: 0px; + + height: 32px; + + font: normalFont; + } + fieldMinWidth: 42px; fieldIcon: icon {{ "box_search_icon", #aaaaaa, point(11px, 9px) }}; fieldIconSkip: 36px; - fieldCancel: boxSearchCancel; + + fieldCancel: IconButton { + width: 41px; + height: 48px; + + opacity: 0.3; + overOpacity: 0.4; + + icon: icon {{ "box_search_cancel", #000000 }}; + iconPosition: point(8px, 18px); + downIconPosition: point(8px, 19px); + + duration: 150; + } fieldCancelSkip: 34px; - fieldMinWidth: 42px; } contactsPhotoCheckbox: RoundImageCheckbox { imageRadius: 21px; diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index cbf186b8f..090bbf80c 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -32,6 +32,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "application.h" #include "ui/filedialog.h" #include "ui/widgets/multi_select.h" +#include "ui/widgets/widget_slide_wrap.h" #include "boxes/photocropbox.h" #include "boxes/confirmbox.h" #include "observer_peer.h" @@ -43,7 +44,7 @@ QString cantInviteError() { ContactsBox::ContactsBox() : ItemListBox(st::contactsScroll) , _inner(this, CreatingGroupNone) -, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) +, _select(this, new Ui::MultiSelect(this, st::contactsMultiSelect, lang(lng_participant_filter)), QMargins(0, 0, 0, 0), [this] { updateScrollSkips(); }) , _next(this, lang(lng_create_group_next), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -52,7 +53,7 @@ ContactsBox::ContactsBox() : ItemListBox(st::contactsScroll) ContactsBox::ContactsBox(const QString &name, const QImage &photo) : ItemListBox(st::boxScroll) , _inner(this, CreatingGroupGroup) -, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) +, _select(this, new Ui::MultiSelect(this, st::contactsMultiSelect, lang(lng_participant_filter)), QMargins(0, 0, 0, 0), [this] { updateScrollSkips(); }) , _next(this, lang(lng_create_group_create), st::defaultBoxButton) , _cancel(this, lang(lng_create_group_back), st::cancelBoxButton) , _topShadow(this) @@ -63,7 +64,7 @@ ContactsBox::ContactsBox(const QString &name, const QImage &photo) : ItemListBox ContactsBox::ContactsBox(ChannelData *channel) : ItemListBox(st::boxScroll) , _inner(this, channel, MembersFilter::Recent, MembersAlreadyIn()) -, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) +, _select(this, new Ui::MultiSelect(this, st::contactsMultiSelect, lang(lng_participant_filter)), QMargins(0, 0, 0, 0), [this] { updateScrollSkips(); }) , _next(this, lang(lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_create_group_skip), st::cancelBoxButton) , _topShadow(this) { @@ -72,7 +73,7 @@ ContactsBox::ContactsBox(ChannelData *channel) : ItemListBox(st::boxScroll) ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const MembersAlreadyIn &already) : ItemListBox((filter == MembersFilter::Admins) ? st::contactsScroll : st::boxScroll) , _inner(this, channel, filter, already) -, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) +, _select(this, new Ui::MultiSelect(this, st::contactsMultiSelect, lang(lng_participant_filter)), QMargins(0, 0, 0, 0), [this] { updateScrollSkips(); }) , _next(this, lang(lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -81,7 +82,7 @@ ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const Membe ContactsBox::ContactsBox(ChatData *chat, MembersFilter filter) : ItemListBox(st::boxScroll) , _inner(this, chat, filter) -, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) +, _select(this, new Ui::MultiSelect(this, st::contactsMultiSelect, lang(lng_participant_filter)), QMargins(0, 0, 0, 0), [this] { updateScrollSkips(); }) , _next(this, lang((filter == MembersFilter::Admins) ? lng_settings_save : lng_participant_invite), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -90,7 +91,7 @@ ContactsBox::ContactsBox(ChatData *chat, MembersFilter filter) : ItemListBox(st: ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) , _inner(this, bot) -, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) +, _select(this, new Ui::MultiSelect(this, st::contactsMultiSelect, lang(lng_participant_filter)), QMargins(0, 0, 0, 0), [this] { updateScrollSkips(); }) , _next(this, lang(lng_create_group_next), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) { @@ -101,7 +102,7 @@ void ContactsBox::init() { _select->resizeToWidth(st::boxWideWidth); auto inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); - auto topSkip = st::boxTitleHeight + _select->height(); + auto topSkip = getTopScrollSkip(); auto bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; ItemListBox::init(_inner, bottomSkip, topSkip); @@ -109,6 +110,20 @@ void ContactsBox::init() { _inner->setPeerSelectedChangedCallback([this](PeerData *peer, bool checked) { onPeerSelectedChanged(peer, checked); }); + for (auto i : _inner->selected()) { + addPeerToMultiSelect(i, true); + } + _inner->setAllAdminsChangedCallback([this] { + if (_inner->allAdmins()) { + _select->entity()->clearQuery(); + _select->slideUp(); + _inner->setFocus(); + } else { + _select->slideDown(); + _select->entity()->setInnerFocus(); + } + updateScrollSkips(); + }); if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { _next.hide(); @@ -128,15 +143,14 @@ void ContactsBox::init() { } connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); - _select->setQueryChangedCallback([this](const QString &query) { onFilterUpdate(query); }); - _select->setItemRemovedCallback([this](uint64 itemId) { + _select->entity()->setQueryChangedCallback([this](const QString &query) { onFilterUpdate(query); }); + _select->entity()->setItemRemovedCallback([this](uint64 itemId) { if (auto peer = App::peerLoaded(itemId)) { _inner->peerUnselected(peer); update(); } }); - _select->setSubmittedCallback([this](bool) { onSubmit(); }); - _select->setResizedCallback([this] { updateScrollSkips(); }); + _select->entity()->setSubmittedCallback([this](bool) { onSubmit(); }); connect(_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); connect(_inner, SIGNAL(searchByUsername()), this, SLOT(onNeedSearchByUsername())); connect(_inner, SIGNAL(adminAdded()), this, SIGNAL(adminAdded())); @@ -148,7 +162,7 @@ void ContactsBox::init() { } bool ContactsBox::onSearchByUsername(bool searchCache) { - auto q = _select->getQuery(); + auto q = _select->entity()->getQuery(); if (q.isEmpty()) { if (_peopleRequest) { _peopleRequest = 0; @@ -216,7 +230,11 @@ bool ContactsBox::peopleFailed(const RPCError &error, mtpRequestId req) { } void ContactsBox::showAll() { - _select->show(); + if (_inner->chat() && _inner->membersFilter() == MembersFilter::Admins && _inner->allAdmins()) { + _select->hideFast(); + } else { + _select->showFast(); + } if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { _next.hide(); _cancel.hide(); @@ -236,7 +254,11 @@ void ContactsBox::showAll() { } void ContactsBox::doSetInnerFocus() { - _select->setInnerFocus(); + if (_select->isHidden()) { + _inner->setFocus(); + } else { + _select->entity()->setInnerFocus(); + } } void ContactsBox::onSubmit() { @@ -282,10 +304,18 @@ void ContactsBox::paintEvent(QPaintEvent *e) { } } +int ContactsBox::getTopScrollSkip() const { + auto result = st::boxTitleHeight; + if (!_select->isHidden()) { + result += _select->height(); + } + return result; +} + void ContactsBox::updateScrollSkips() { auto oldScrollHeight = scrollArea()->height(); auto inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); - auto topSkip = st::boxTitleHeight + _select->height(); + auto topSkip = getTopScrollSkip(); auto bottomSkip = inviting ? (st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()) : st::boxScrollSkip; setScrollSkips(bottomSkip, topSkip); auto scrollHeightDelta = scrollArea()->height() - oldScrollHeight; @@ -293,7 +323,7 @@ void ContactsBox::updateScrollSkips() { scrollArea()->scrollToY(scrollArea()->scrollTop() - scrollHeightDelta); } - _topShadow.setGeometry(0, st::boxTitleHeight + _select->height(), width(), st::lineWidth); + _topShadow.setGeometry(0, topSkip, width(), st::lineWidth); } void ContactsBox::resizeEvent(QResizeEvent *e) { @@ -321,24 +351,30 @@ void ContactsBox::onFilterUpdate(const QString &filter) { _inner->updateFilter(filter); } +void ContactsBox::addPeerToMultiSelect(PeerData *peer, bool skipAnimation) { + auto getColor = [peer]() -> const style::color & { + switch (peer->colorIndex) { + case 1: return st::historyPeer2UserpicFg; + case 2: return st::historyPeer3UserpicFg; + case 3: return st::historyPeer4UserpicFg; + case 4: return st::historyPeer5UserpicFg; + case 5: return st::historyPeer6UserpicFg; + case 6: return st::historyPeer7UserpicFg; + case 7: return st::historyPeer8UserpicFg; + default: return st::historyPeer1UserpicFg; + } + }; + using AddItemWay = Ui::MultiSelect::AddItemWay; + auto addItemWay = skipAnimation ? AddItemWay::SkipAnimation : AddItemWay::Default; + _select->entity()->addItem(peer->id, peer->shortName(), getColor(), PaintUserpicCallback(peer), addItemWay); +} + void ContactsBox::onPeerSelectedChanged(PeerData *peer, bool checked) { if (checked) { - auto getColor = [peer]() -> const style::color &{ - switch (peer->colorIndex) { - case 1: return st::historyPeer2UserpicFg; - case 2: return st::historyPeer3UserpicFg; - case 3: return st::historyPeer4UserpicFg; - case 4: return st::historyPeer5UserpicFg; - case 5: return st::historyPeer6UserpicFg; - case 6: return st::historyPeer7UserpicFg; - case 7: return st::historyPeer8UserpicFg; - default: return st::historyPeer1UserpicFg; - } - }; - _select->addItem(peer->id, peer->shortName(), getColor(), PaintUserpicCallback(peer)); - _select->clearQuery(); + addPeerToMultiSelect(peer); + _select->entity()->clearQuery(); } else { - _select->removeItem(peer->id); + _select->entity()->removeItem(peer->id); } update(); } @@ -346,7 +382,7 @@ void ContactsBox::onPeerSelectedChanged(PeerData *peer, bool checked) { void ContactsBox::onInvite() { QVector users(_inner->selected()); if (users.isEmpty()) { - _select->setInnerFocus(); + _select->entity()->setInnerFocus(); return; } @@ -364,7 +400,7 @@ void ContactsBox::onCreate() { auto users = _inner->selectedInputs(); if (users.isEmpty() || (users.size() == 1 && users.at(0).type() == mtpc_inputUserSelf)) { - _select->setInnerFocus(); + _select->entity()->setInnerFocus(); return; } _saveRequestId = MTP::send(MTPmessages_CreateChat(MTP_vector(users), MTP_string(_creationName)), rpcDone(&ContactsBox::creationDone), rpcFail(&ContactsBox::creationFail)); @@ -514,7 +550,7 @@ bool ContactsBox::creationFail(const RPCError &error) { onClose(); return true; } else if (error.type() == "USERS_TOO_FEW") { - _select->setInnerFocus(); + _select->entity()->setInnerFocus(); return true; } else if (error.type() == "PEER_FLOOD") { Ui::showLayer(new InformBox(cantInviteError()), KeepOtherLayers); @@ -641,7 +677,7 @@ void ContactsBox::Inner::init() { } void ContactsBox::Inner::initList() { - if (!usingMultiSelect()) return; + if (!_chat || _membersFilter != MembersFilter::Admins) return; QList admins, others; admins.reserve(_chat->admins.size() + 1); @@ -653,7 +689,9 @@ void ContactsBox::Inner::initList() { if (i.key()->id == peerFromUser(_chat->creator)) continue; if (!_allAdmins.checked() && _chat->admins.contains(i.key())) { admins.push_back(i.key()); - _checkedContacts.insert(i.key()); + if (!_checkedContacts.contains(i.key())) { + _checkedContacts.insert(i.key()); + } } else { others.push_back(i.key()); } @@ -716,10 +754,10 @@ void ContactsBox::Inner::onNoAddAdminBox(QObject *obj) { } void ContactsBox::Inner::onAllAdminsChanged() { - if (_saving) { - if (_allAdmins.checked() != _allAdminsChecked) { - _allAdmins.setChecked(_allAdminsChecked); - } + if (_saving && _allAdmins.checked() != _allAdminsChecked) { + _allAdmins.setChecked(_allAdminsChecked); + } else if (_allAdminsChangedCallback) { + _allAdminsChangedCallback(); } update(); } @@ -1355,7 +1393,8 @@ void ContactsBox::Inner::changeCheckState(Dialogs::Row *row) { void ContactsBox::Inner::changeCheckState(ContactData *data, PeerData *peer) { t_assert(usingMultiSelect()); - if (data->checkbox->checked()) { + if (_chat && _membersFilter == MembersFilter::Admins && _allAdmins.checked()) { + } else if (data->checkbox->checked()) { changePeerCheckState(data, peer, false); } else if (selectedCount() < ((_channel && _channel->isMegagroup()) ? Global::MegagroupSizeMax() : Global::ChatSizeMax())) { changePeerCheckState(data, peer, true); @@ -1385,7 +1424,7 @@ void ContactsBox::Inner::changePeerCheckState(ContactData *data, PeerData *peer, } else { _checkedContacts.remove(peer); } - if (useCallback != ChangeStateWay::SkipCallback) { + if (useCallback != ChangeStateWay::SkipCallback && _peerSelectedChangedCallback) { _peerSelectedChangedCallback(peer, checked); } } @@ -1874,12 +1913,12 @@ QVector ContactsBox::Inner::selected() { } } result.reserve(_contactsData.size()); - for (ContactsData::const_iterator i = _contactsData.cbegin(), e = _contactsData.cend(); i != e; ++i) { + for (auto i = _contactsData.cbegin(), e = _contactsData.cend(); i != e; ++i) { if (i.value()->checkbox->checked() && i.key()->isUser()) { result.push_back(i.key()->asUser()); } } - for (int32 i = 0, l = _byUsername.size(); i < l; ++i) { + for (int i = 0, l = _byUsername.size(); i < l; ++i) { if (d_byUsername[i]->checkbox->checked() && _byUsername[i]->isUser()) { result.push_back(_byUsername[i]->asUser()); } @@ -1899,12 +1938,12 @@ QVector ContactsBox::Inner::selectedInputs() { } } result.reserve(_contactsData.size()); - for (ContactsData::const_iterator i = _contactsData.cbegin(), e = _contactsData.cend(); i != e; ++i) { + for (auto i = _contactsData.cbegin(), e = _contactsData.cend(); i != e; ++i) { if (i.value()->checkbox->checked() && i.key()->isUser()) { result.push_back(i.key()->asUser()->inputUser); } } - for (int32 i = 0, l = _byUsername.size(); i < l; ++i) { + for (int i = 0, l = _byUsername.size(); i < l; ++i) { if (d_byUsername[i]->checkbox->checked() && _byUsername[i]->isUser()) { result.push_back(_byUsername[i]->asUser()->inputUser); } diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 9685bdd20..b5dbdee5c 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -32,6 +32,8 @@ class IndexedList; namespace Ui { class MultiSelect; +template +class WidgetSlideWrap; } // namespace Ui QString cantInviteError(); @@ -79,13 +81,15 @@ protected: private: void init(); + int getTopScrollSkip() const; void updateScrollSkips(); void onFilterUpdate(const QString &filter); void onPeerSelectedChanged(PeerData *peer, bool checked); + void addPeerToMultiSelect(PeerData *peer, bool skipAnimation = false); class Inner; ChildWidget _inner; - ChildWidget _select; + ChildWidget> _select; BoxButton _next, _cancel; MembersFilter _membersFilter; @@ -151,6 +155,9 @@ public: bool allAdmins() const { return _allAdmins.checked(); } + void setAllAdminsChangedCallback(base::lambda_unique allAdminsChangedCallback) { + _allAdminsChangedCallback = std_::move(allAdminsChangedCallback); + } void loadProfilePhotos(int32 yFrom); void chooseParticipant(); @@ -259,6 +266,7 @@ private: Checkbox _allAdmins; int32 _aboutWidth; Text _aboutAllAdmins, _aboutAdmins; + base::lambda_unique _allAdminsChangedCallback; PeerData *_addToPeer = nullptr; UserData *_addAdmin = nullptr; diff --git a/Telegram/SourceFiles/boxes/sharebox.cpp b/Telegram/SourceFiles/boxes/sharebox.cpp index ca2323138..76c99e7a4 100644 --- a/Telegram/SourceFiles/boxes/sharebox.cpp +++ b/Telegram/SourceFiles/boxes/sharebox.cpp @@ -23,6 +23,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "dialogs/dialogs_indexed_list.h" #include "styles/style_boxes.h" +#include "styles/style_history.h" #include "observer_peer.h" #include "lang.h" #include "mainwindow.h" @@ -32,7 +33,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "boxes/confirmbox.h" #include "apiwrap.h" #include "ui/toast/toast.h" -#include "ui/buttons/icon_button.h" +#include "ui/widgets/multi_select.h" #include "history/history_media_types.h" #include "boxes/contactsbox.h" @@ -40,30 +41,37 @@ ShareBox::ShareBox(CopyCallback &©Callback, SubmitCallback &&submitCallback, , _copyCallback(std_::move(copyCallback)) , _submitCallback(std_::move(submitCallback)) , _inner(this, std_::move(filterCallback)) -, _filter(this, st::boxSearchField, lang(lng_participant_filter)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_participant_filter)) , _copy(this, lang(lng_share_copy_link), st::defaultBoxButton) , _share(this, lang(lng_share_confirm), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) , _topShadow(this) , _bottomShadow(this) { - int topSkip = st::boxTitleHeight + _filter->height(); - int bottomSkip = st::boxButtonPadding.top() + _share->height() + st::boxButtonPadding.bottom(); + _select->resizeToWidth(st::boxWideWidth); + + auto topSkip = getTopScrollSkip(); + auto bottomSkip = st::boxButtonPadding.top() + _share->height() + st::boxButtonPadding.bottom(); init(_inner, bottomSkip, topSkip); - connect(_inner, SIGNAL(selectedChanged()), this, SLOT(onSelectedChanged())); connect(_inner, SIGNAL(mustScrollTo(int,int)), this, SLOT(onMustScrollTo(int,int))); connect(_copy, SIGNAL(clicked()), this, SLOT(onCopyLink())); connect(_share, SIGNAL(clicked()), this, SLOT(onSubmit())); connect(_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(scrollArea(), SIGNAL(scrolled()), this, SLOT(onScroll())); - connect(_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); - connect(_filter, SIGNAL(submitted(bool)), _inner, SLOT(onSelectActive())); - connect(_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); - connect(_inner, SIGNAL(filterCancel()), this, SLOT(onFilterCancel())); + _select->setQueryChangedCallback([this](const QString &query) { onFilterUpdate(query); }); + _select->setItemRemovedCallback([this](uint64 itemId) { + if (auto peer = App::peerLoaded(itemId)) { + _inner->peerUnselected(peer); + onSelectedChanged(); + update(); + } + }); + _select->setResizedCallback([this] { updateScrollSkips(); }); + _select->setSubmittedCallback([this](bool) { _inner->onSelectActive(); }); connect(_inner, SIGNAL(searchByUsername()), this, SLOT(onNeedSearchByUsername())); - - _filterCancel->setAttribute(Qt::WA_OpaquePaintEvent); + _inner->setPeerSelectedChangedCallback([this](PeerData *peer, bool checked) { + onPeerSelectedChanged(peer, checked); + }); _searchTimer.setSingleShot(true); connect(&_searchTimer, SIGNAL(timeout()), this, SLOT(onSearchByUsername())); @@ -73,8 +81,29 @@ ShareBox::ShareBox(CopyCallback &©Callback, SubmitCallback &&submitCallback, prepare(); } +int ShareBox::getTopScrollSkip() const { + auto result = st::boxTitleHeight; + if (!_select->isHidden()) { + result += _select->height(); + } + return result; +} + +void ShareBox::updateScrollSkips() { + auto oldScrollHeight = scrollArea()->height(); + auto topSkip = getTopScrollSkip(); + auto bottomSkip = st::boxButtonPadding.top() + _share->height() + st::boxButtonPadding.bottom(); + setScrollSkips(bottomSkip, topSkip); + auto scrollHeightDelta = scrollArea()->height() - oldScrollHeight; + if (scrollHeightDelta) { + scrollArea()->scrollToY(scrollArea()->scrollTop() - scrollHeightDelta); + } + + _topShadow->setGeometry(0, topSkip, width(), st::lineWidth); +} + bool ShareBox::onSearchByUsername(bool searchCache) { - auto query = _filter->getLastText().trimmed(); + auto query = _select->getQuery(); if (query.isEmpty()) { if (_peopleRequest) { _peopleRequest = 0; @@ -142,7 +171,7 @@ bool ShareBox::peopleFailed(const RPCError &error, mtpRequestId requestId) { } void ShareBox::doSetInnerFocus() { - _filter->setFocus(); + _select->setInnerFocus(); } void ShareBox::paintEvent(QPaintEvent *e) { @@ -154,17 +183,21 @@ void ShareBox::paintEvent(QPaintEvent *e) { void ShareBox::resizeEvent(QResizeEvent *e) { ItemListBox::resizeEvent(e); - _filter->resize(width(), _filter->height()); - _filter->moveToLeft(0, st::boxTitleHeight); - _filterCancel->moveToRight(0, st::boxTitleHeight); + + _select->resizeToWidth(width()); + _select->moveToLeft(0, st::boxTitleHeight); + + updateScrollSkips(); + _inner->resizeToWidth(width()); moveButtons(); - _topShadow->setGeometry(0, st::boxTitleHeight + _filter->height(), width(), st::lineWidth); + _topShadow->setGeometry(0, getTopScrollSkip(), width(), st::lineWidth); _bottomShadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _share->height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); } void ShareBox::keyPressEvent(QKeyEvent *e) { - if (_filter->hasFocus()) { + auto focused = focusWidget(); + if (_select == focused || _select->isAncestorOf(focusWidget())) { if (e->key() == Qt::Key_Up) { _inner->activateSkipColumn(-1); } else if (e->key() == Qt::Key_Down) { @@ -194,13 +227,38 @@ void ShareBox::updateButtonsVisibility() { _cancel->setVisible(hasSelected); } -void ShareBox::onFilterCancel() { - _filter->setText(QString()); +void ShareBox::onFilterUpdate(const QString &query) { + scrollArea()->scrollToY(0); + _inner->updateFilter(query); } -void ShareBox::onFilterUpdate() { - _filterCancel->setVisible(!_filter->getLastText().isEmpty()); - _inner->updateFilter(_filter->getLastText()); +void ShareBox::addPeerToMultiSelect(PeerData *peer, bool skipAnimation) { + auto getColor = [peer]() -> const style::color & { + switch (peer->colorIndex) { + case 1: return st::historyPeer2UserpicFg; + case 2: return st::historyPeer3UserpicFg; + case 3: return st::historyPeer4UserpicFg; + case 4: return st::historyPeer5UserpicFg; + case 5: return st::historyPeer6UserpicFg; + case 6: return st::historyPeer7UserpicFg; + case 7: return st::historyPeer8UserpicFg; + default: return st::historyPeer1UserpicFg; + } + }; + using AddItemWay = Ui::MultiSelect::AddItemWay; + auto addItemWay = skipAnimation ? AddItemWay::SkipAnimation : AddItemWay::Default; + _select->addItem(peer->id, peer->shortName(), getColor(), PaintUserpicCallback(peer), addItemWay); +} + +void ShareBox::onPeerSelectedChanged(PeerData *peer, bool checked) { + if (checked) { + addPeerToMultiSelect(peer); + _select->clearQuery(); + } else { + _select->removeItem(peer->id); + } + onSelectedChanged(); + update(); } void ShareBox::onSubmit() { @@ -597,17 +655,34 @@ void ShareBox::Inner::changeCheckState(Chat *chat) { if (!chat->checkbox.checked()) { _chatsIndexed->moveToTop(chat->peer); } - emit filterCancel(); } - chat->checkbox.setChecked(!chat->checkbox.checked()); - if (chat->checkbox.checked()) { + changePeerCheckState(chat, !chat->checkbox.checked()); +} + +void ShareBox::Inner::peerUnselected(PeerData *peer) { + // If data is nullptr we simply won't do anything. + auto chat = _dataMap.value(peer, nullptr); + changePeerCheckState(chat, false, ChangeStateWay::SkipCallback); +} + +void ShareBox::Inner::setPeerSelectedChangedCallback(base::lambda_unique callback) { + _peerSelectedChangedCallback = std_::move(callback); +} + +void ShareBox::Inner::changePeerCheckState(Chat *chat, bool checked, ChangeStateWay useCallback) { + if (chat) { + chat->checkbox.setChecked(checked); + } + if (checked) { _selected.insert(chat->peer); setActive(chatIndex(chat->peer)); } else { _selected.remove(chat->peer); } - emit selectedChanged(); + if (useCallback != ChangeStateWay::SkipCallback && _peerSelectedChangedCallback) { + _peerSelectedChangedCallback(chat->peer, checked); + } } bool ShareBox::Inner::hasSelected() const { diff --git a/Telegram/SourceFiles/boxes/sharebox.h b/Telegram/SourceFiles/boxes/sharebox.h index 96da0fb1c..7629d608e 100644 --- a/Telegram/SourceFiles/boxes/sharebox.h +++ b/Telegram/SourceFiles/boxes/sharebox.h @@ -36,7 +36,7 @@ struct PeerUpdate; } // namespace Notify namespace Ui { -class IconButton; +class MultiSelect; } // namespace Ui QString appendShareGameScoreUrl(const QString &url, const FullMsgId &fullId); @@ -52,8 +52,6 @@ public: ShareBox(CopyCallback &©Callback, SubmitCallback &&submitCallback, FilterCallback &&filterCallback); private slots: - void onFilterUpdate(); - void onFilterCancel(); void onScroll(); bool onSearchByUsername(bool searchCache = false); @@ -61,7 +59,6 @@ private slots: void onSubmit(); void onCopyLink(); - void onSelectedChanged(); void onMustScrollTo(int top, int bottom); @@ -73,8 +70,15 @@ protected: void doSetInnerFocus() override; private: + void onFilterUpdate(const QString &query); + void onSelectedChanged(); void moveButtons(); void updateButtonsVisibility(); + int getTopScrollSkip() const; + void updateScrollSkips(); + + void addPeerToMultiSelect(PeerData *peer, bool skipAnimation = false); + void onPeerSelectedChanged(PeerData *peer, bool checked); void peopleReceived(const MTPcontacts_Found &result, mtpRequestId requestId); bool peopleFailed(const RPCError &error, mtpRequestId requestId); @@ -84,8 +88,7 @@ private: class Inner; ChildWidget _inner; - ChildWidget _filter; - ChildWidget _filterCancel; + ChildWidget _select; ChildWidget _copy; ChildWidget _share; @@ -116,6 +119,9 @@ class ShareBox::Inner : public ScrolledWidget, public RPCSender, private base::S public: Inner(QWidget *parent, ShareBox::FilterCallback &&filterCallback); + void setPeerSelectedChangedCallback(base::lambda_unique callback); + void peerUnselected(PeerData *peer); + QVector selected() const; bool hasSelected() const; @@ -134,9 +140,7 @@ public slots: signals: void mustScrollTo(int ymin, int ymax); - void filterCancel(); void searchByUsername(); - void selectedChanged(); protected: void paintEvent(QPaintEvent *e) override; @@ -170,6 +174,11 @@ private: void loadProfilePhotos(int yFrom); void changeCheckState(Chat *chat); + enum class ChangeStateWay { + Default, + SkipCallback, + }; + void changePeerCheckState(Chat *chat, bool checked, ChangeStateWay useCallback = ChangeStateWay::Default); Chat *getChat(Dialogs::Row *row); void setActive(int active); @@ -198,6 +207,8 @@ private: using SelectedChats = OrderedSet; SelectedChats _selected; + base::lambda_unique _peerSelectedChangedCallback; + ChatData *data(Dialogs::Row *row); bool _searching = false; diff --git a/Telegram/SourceFiles/core/lambda_wrap.h b/Telegram/SourceFiles/core/lambda_wrap.h index f75ceb5ef..3e211781d 100644 --- a/Telegram/SourceFiles/core/lambda_wrap.h +++ b/Telegram/SourceFiles/core/lambda_wrap.h @@ -60,7 +60,7 @@ struct lambda_wrap_helper_base { protected: static void bad_construct_copy(void *lambda, const void *source) { - throw std::exception(); + t_assert(!"base::lambda bad_construct_copy() called!"); } }; @@ -72,7 +72,8 @@ struct lambda_wrap_empty : public lambda_wrap_helper_base { static void construct_move_other_method(void *lambda, void *source) { } static Return call_method(const void *lambda, Args... args) { - throw std::exception(); + t_assert(!"base::lambda empty call_method() called!"); + return Return(); } static void destruct_method(const void *lambda) { } diff --git a/Telegram/SourceFiles/ui/countryinput.cpp b/Telegram/SourceFiles/ui/countryinput.cpp index a13c1712b..c4a390e9c 100644 --- a/Telegram/SourceFiles/ui/countryinput.cpp +++ b/Telegram/SourceFiles/ui/countryinput.cpp @@ -24,7 +24,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "lang.h" #include "application.h" #include "ui/scrollarea.h" -#include "ui/buttons/icon_button.h" +#include "ui/widgets/multi_select.h" #include "boxes/contactsbox.h" #include "countries.h" #include "styles/style_boxes.h" @@ -65,7 +65,8 @@ namespace { countriesFiltered.reserve(countriesCount); countriesNames.resize(countriesCount); } -} + +} // namespace const CountriesByCode &countriesByCode() { initCountries(); @@ -196,19 +197,17 @@ void CountryInput::setText(const QString &newText) { CountrySelectBox::CountrySelectBox() : ItemListBox(st::countriesScroll, st::boxWidth) , _inner(this) -, _filter(this, st::boxSearchField, lang(lng_country_ph)) -, _filterCancel(this, st::boxSearchCancel) +, _select(this, st::contactsMultiSelect, lang(lng_country_ph)) , _topShadow(this) { - ItemListBox::init(_inner, st::boxScrollSkip, st::boxTitleHeight + _filter->height()); + _select->resizeToWidth(st::boxWidth); - connect(_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); - connect(_filter, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); - connect(_filterCancel, SIGNAL(clicked()), this, SLOT(onFilterCancel())); + ItemListBox::init(_inner, st::boxScrollSkip, st::boxTitleHeight + _select->height()); + + _select->setQueryChangedCallback([this](const QString &query) { onFilterUpdate(query); }); + _select->setSubmittedCallback([this](bool) { onSubmit(); }); connect(_inner, SIGNAL(mustScrollTo(int, int)), scrollArea(), SLOT(scrollToY(int, int))); connect(_inner, SIGNAL(countryChosen(const QString&)), this, SIGNAL(countryChosen(const QString&))); - _filterCancel->setAttribute(Qt::WA_OpaquePaintEvent); - prepare(); } @@ -239,40 +238,27 @@ void CountrySelectBox::paintEvent(QPaintEvent *e) { void CountrySelectBox::resizeEvent(QResizeEvent *e) { ItemListBox::resizeEvent(e); - _filter->resize(width(), _filter->height()); - _filter->moveToLeft(0, st::boxTitleHeight); - _filterCancel->moveToRight(0, st::boxTitleHeight); - _inner->resize(width(), _inner->height()); - _topShadow.setGeometry(0, st::boxTitleHeight + _filter->height(), width(), st::lineWidth); + + _select->resizeToWidth(width()); + _select->moveToLeft(0, st::boxTitleHeight); + + _inner->resizeToWidth(width()); + _topShadow.setGeometry(0, st::boxTitleHeight + _select->height(), width(), st::lineWidth); } void CountrySelectBox::showAll() { - _filter->show(); - if (_filter->getLastText().isEmpty()) { - _filterCancel->hide(); - } else { - _filterCancel->show(); - } + _select->show(); _topShadow.show(); ItemListBox::showAll(); } -void CountrySelectBox::onFilterCancel() { - _filter->setText(QString()); -} - -void CountrySelectBox::onFilterUpdate() { +void CountrySelectBox::onFilterUpdate(const QString &query) { scrollArea()->scrollToY(0); - if (_filter->getLastText().isEmpty()) { - _filterCancel->hide(); - } else { - _filterCancel->show(); - } - _inner->updateFilter(_filter->getLastText()); + _inner->updateFilter(query); } void CountrySelectBox::doSetInnerFocus() { - _filter->setFocus(); + _select->setInnerFocus(); } CountrySelectBox::Inner::Inner(QWidget *parent) : ScrolledWidget(parent) diff --git a/Telegram/SourceFiles/ui/countryinput.h b/Telegram/SourceFiles/ui/countryinput.h index 971b192cb..fe3b217a9 100644 --- a/Telegram/SourceFiles/ui/countryinput.h +++ b/Telegram/SourceFiles/ui/countryinput.h @@ -29,10 +29,9 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org QString findValidCode(QString fullCode); class CountrySelect; -class InputField; namespace Ui { -class IconButton; +class MultiSelect; } // namespace Ui class CountryInput : public QWidget { @@ -82,8 +81,6 @@ signals: void countryChosen(const QString &iso); public slots: - void onFilterUpdate(); - void onFilterCancel(); void onSubmit(); protected: @@ -95,10 +92,11 @@ protected: void showAll() override; private: + void onFilterUpdate(const QString &query); + class Inner; ChildWidget _inner; - ChildWidget _filter; - ChildWidget _filterCancel; + ChildWidget _select; ScrollableBoxShadow _topShadow; diff --git a/Telegram/SourceFiles/ui/flatinput.cpp b/Telegram/SourceFiles/ui/flatinput.cpp index 9cb1f3aa2..7b5966b4d 100644 --- a/Telegram/SourceFiles/ui/flatinput.cpp +++ b/Telegram/SourceFiles/ui/flatinput.cpp @@ -1890,9 +1890,7 @@ void InputField::step_placeholderFg(float64 ms, bool timer) { void InputField::step_placeholderShift(float64 ms, bool timer) { float64 dt = ms / _st.duration; if (dt >= 1) { - _a_placeholderShift.stop(); - a_placeholderLeft.finish(); - a_placeholderOpacity.finish(); + finishPlaceholderAnimation(); } else { a_placeholderLeft.update(dt, anim::linear); a_placeholderOpacity.update(dt, anim::linear); @@ -1900,6 +1898,13 @@ void InputField::step_placeholderShift(float64 ms, bool timer) { if (timer) update(); } +void InputField::finishPlaceholderAnimation() { + _a_placeholderShift.stop(); + a_placeholderLeft.finish(); + a_placeholderOpacity.finish(); + update(); +} + void InputField::step_border(float64 ms, bool timer) { float64 dt = ms / _st.duration; if (dt >= 1) { diff --git a/Telegram/SourceFiles/ui/flatinput.h b/Telegram/SourceFiles/ui/flatinput.h index 9b0ee960d..f730be8f8 100644 --- a/Telegram/SourceFiles/ui/flatinput.h +++ b/Telegram/SourceFiles/ui/flatinput.h @@ -343,6 +343,7 @@ public: } void updatePlaceholder(); void setPlaceholderHidden(bool forcePlaceholderHidden); + void finishPlaceholderAnimation(); void step_placeholderFg(float64 ms, bool timer); void step_placeholderShift(float64 ms, bool timer); diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.cpp b/Telegram/SourceFiles/ui/widgets/multi_select.cpp index 373ad7e92..ef0336f7f 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.cpp +++ b/Telegram/SourceFiles/ui/widgets/multi_select.cpp @@ -433,8 +433,8 @@ QString MultiSelect::getQuery() const { return _inner->getQuery(); } -void MultiSelect::addItem(uint64 itemId, const QString &text, const style::color &color, PaintRoundImage paintRoundImage) { - _inner->addItem(std_::make_unique(_st.item, itemId, text, color, std_::move(paintRoundImage))); +void MultiSelect::addItem(uint64 itemId, const QString &text, const style::color &color, PaintRoundImage paintRoundImage, AddItemWay way) { + _inner->addItem(std_::make_unique(_st.item, itemId, text, color, std_::move(paintRoundImage)), way); } void MultiSelect::setItemRemovedCallback(base::lambda_unique callback) { @@ -710,7 +710,7 @@ void MultiSelect::Inner::mousePressEvent(QMouseEvent *e) { } } -void MultiSelect::Inner::addItem(std_::unique_ptr item) { +void MultiSelect::Inner::addItem(std_::unique_ptr item, AddItemWay way) { auto wasEmpty = _items.empty(); item->setUpdateCallback([this, item = item.get()] { auto itemRect = item->paintArea(width() - _st.padding.left() - _st.padding.top()); @@ -723,7 +723,12 @@ void MultiSelect::Inner::addItem(std_::unique_ptr item) { if (wasEmpty) { updateHasAnyItems(true); } - _items.back()->showAnimated(); + if (way != AddItemWay::SkipAnimation) { + _items.back()->showAnimated(); + } else { + _field->finishPlaceholderAnimation(); + finishHeightAnimation(); + } } void MultiSelect::Inner::computeItemsGeometry(int newWidth) { @@ -765,16 +770,23 @@ void MultiSelect::Inner::updateItemsGeometry() { if (newHeight == _newHeight) return; _newHeight = newHeight; - _height.start([this] { - auto newHeight = _height.current(_newHeight); - if (auto heightDelta = newHeight - height()) { - resize(width(), newHeight); - if (_resizedCallback) { - _resizedCallback(heightDelta); - } - update(); + _height.start([this] { updateHeightStep(); }, height(), _newHeight, _st.item.duration); +} + +void MultiSelect::Inner::updateHeightStep() { + auto newHeight = _height.current(_newHeight); + if (auto heightDelta = newHeight - height()) { + resize(width(), newHeight); + if (_resizedCallback) { + _resizedCallback(heightDelta); } - }, height(), _newHeight, _st.item.duration); + update(); + } +} + +void MultiSelect::Inner::finishHeightAnimation() { + _height.finish(); + updateHeightStep(); } void MultiSelect::Inner::setItemText(uint64 itemId, const QString &text) { diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.h b/Telegram/SourceFiles/ui/widgets/multi_select.h index 6226fc4fc..01854db33 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.h +++ b/Telegram/SourceFiles/ui/widgets/multi_select.h @@ -40,8 +40,12 @@ public: void setSubmittedCallback(base::lambda_unique callback); void setResizedCallback(base::lambda_unique callback); + enum class AddItemWay { + Default, + SkipAnimation, + }; using PaintRoundImage = base::lambda_unique; - void addItem(uint64 itemId, const QString &text, const style::color &color, PaintRoundImage paintRoundImage); + void addItem(uint64 itemId, const QString &text, const style::color &color, PaintRoundImage paintRoundImage, AddItemWay way = AddItemWay::Default); void setItemText(uint64 itemId, const QString &text); void setItemRemovedCallback(base::lambda_unique callback); @@ -82,7 +86,7 @@ public: void setSubmittedCallback(base::lambda_unique callback); class Item; - void addItem(std_::unique_ptr item); + void addItem(std_::unique_ptr item, AddItemWay way); void setItemText(uint64 itemId, const QString &text); void setItemRemovedCallback(base::lambda_unique callback); @@ -120,6 +124,8 @@ private: updateSelection(QPoint(-1, -1)); } void updateCursor(); + void updateHeightStep(); + void finishHeightAnimation(); enum class ChangeActiveWay { Default, SkipSetFocus, diff --git a/Telegram/SourceFiles/ui/widgets/widget_slide_wrap.h b/Telegram/SourceFiles/ui/widgets/widget_slide_wrap.h index 380e65209..4c8ebc0ec 100644 --- a/Telegram/SourceFiles/ui/widgets/widget_slide_wrap.h +++ b/Telegram/SourceFiles/ui/widgets/widget_slide_wrap.h @@ -30,7 +30,7 @@ public: using UpdateCallback = base::lambda_unique; WidgetSlideWrap(QWidget *parent, Widget *entity , style::margins entityPadding - , UpdateCallback &&updateCallback + , UpdateCallback updateCallback , int duration = st::widgetSlideDuration) : TWidget(parent) , _entity(entity) , _padding(entityPadding) diff --git a/Telegram/SourceFiles/ui/widgets/widgets.style b/Telegram/SourceFiles/ui/widgets/widgets.style index 8e34c14e4..d4ab8f7a1 100644 --- a/Telegram/SourceFiles/ui/widgets/widgets.style +++ b/Telegram/SourceFiles/ui/widgets/widgets.style @@ -92,11 +92,11 @@ MultiSelect { itemSkip: pixels; field: InputField; + fieldMinWidth: pixels; fieldIcon: icon; fieldIconSkip: pixels; fieldCancel: IconButton; fieldCancelSkip: pixels; - fieldMinWidth: pixels; } widgetSlideDuration: 200; From e1478359e6b94acfa5274f8fcdfa55d65f3b9ed8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 22 Oct 2016 20:05:19 +0300 Subject: [PATCH 07/10] Fixed build in Xcode. --- Telegram/SourceFiles/ui/animation.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/ui/animation.h b/Telegram/SourceFiles/ui/animation.h index 97d4f58a6..8e8657815 100644 --- a/Telegram/SourceFiles/ui/animation.h +++ b/Telegram/SourceFiles/ui/animation.h @@ -533,7 +533,8 @@ public: private: struct Data { - Data(const ValueType &from, Callback &&updateCallback) + template ::value>> + Data(const ValueType &from, Lambda &&updateCallback) : value(from, from) , a_animation(animation(this, &Data::step)) , updateCallback(std_::move(updateCallback)) { From c1d862d8de16b4780b7bdc8164026491de8dcb4e Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 22 Oct 2016 21:58:25 +0300 Subject: [PATCH 08/10] Some icons moved from sprite to separate files. --- Telegram/Resources/art/sprite.png | Bin 39727 -> 31260 bytes Telegram/Resources/art/sprite_200x.png | Bin 84452 -> 67570 bytes Telegram/Resources/basic.style | 23 ----------- .../Resources/icons/add_contact_phone.png | Bin 0 -> 380 bytes .../Resources/icons/add_contact_phone@2x.png | Bin 0 -> 708 bytes Telegram/Resources/icons/add_contact_user.png | Bin 0 -> 316 bytes .../Resources/icons/add_contact_user@2x.png | Bin 0 -> 579 bytes Telegram/Resources/icons/box_button_close.png | Bin 0 -> 151 bytes .../Resources/icons/box_button_close@2x.png | Bin 0 -> 283 bytes Telegram/Resources/icons/box_title_shadow.png | Bin 0 -> 85 bytes .../Resources/icons/box_title_shadow@2x.png | Bin 0 -> 105 bytes Telegram/Resources/icons/contacts_add.png | Bin 0 -> 316 bytes Telegram/Resources/icons/contacts_add@2x.png | Bin 0 -> 590 bytes .../Resources/icons/history_empty_dog.png | Bin 0 -> 2579 bytes .../Resources/icons/history_empty_dog@2x.png | Bin 0 -> 5051 bytes Telegram/Resources/icons/title_icon.png | Bin 0 -> 265 bytes Telegram/Resources/icons/title_icon@2x.png | Bin 0 -> 401 bytes Telegram/Resources/icons/title_icon_bg.png | Bin 0 -> 363 bytes Telegram/Resources/icons/title_icon_bg@2x.png | Bin 0 -> 701 bytes Telegram/SourceFiles/app.cpp | 36 +----------------- Telegram/SourceFiles/boxes/abstractbox.cpp | 28 ++++++-------- Telegram/SourceFiles/boxes/abstractbox.h | 14 +++---- Telegram/SourceFiles/boxes/addcontactbox.cpp | 4 +- Telegram/SourceFiles/boxes/boxes.style | 19 +++++++++ Telegram/SourceFiles/boxes/contactsbox.cpp | 3 +- Telegram/SourceFiles/boxes/members_box.cpp | 3 +- Telegram/SourceFiles/boxes/sharebox.cpp | 1 + Telegram/SourceFiles/history/history.style | 3 ++ .../history/history_service_layout.cpp | 10 +++++ .../history/history_service_layout.h | 2 + Telegram/SourceFiles/historywidget.cpp | 6 +-- Telegram/SourceFiles/layout.cpp | 5 --- Telegram/SourceFiles/layout.h | 1 - Telegram/SourceFiles/mainwindow.cpp | 2 +- .../SourceFiles/media/view/mediaview.style | 17 +++++++-- Telegram/SourceFiles/mediaview.cpp | 15 +++++++- Telegram/SourceFiles/mediaview.h | 2 + Telegram/SourceFiles/overview/overview.style | 1 + Telegram/SourceFiles/overviewwidget.cpp | 4 +- Telegram/SourceFiles/stickers/stickers.style | 2 + Telegram/SourceFiles/title.cpp | 15 +++++--- Telegram/SourceFiles/title.h | 1 + .../SourceFiles/ui/style/style_core_icon.cpp | 4 +- .../SourceFiles/ui/style/style_core_icon.h | 3 ++ .../SourceFiles/window/chat_background.cpp | 8 +--- Telegram/SourceFiles/window/chat_background.h | 4 +- Telegram/SourceFiles/window/window.style | 7 ++++ 47 files changed, 123 insertions(+), 120 deletions(-) create mode 100644 Telegram/Resources/icons/add_contact_phone.png create mode 100644 Telegram/Resources/icons/add_contact_phone@2x.png create mode 100644 Telegram/Resources/icons/add_contact_user.png create mode 100644 Telegram/Resources/icons/add_contact_user@2x.png create mode 100644 Telegram/Resources/icons/box_button_close.png create mode 100644 Telegram/Resources/icons/box_button_close@2x.png create mode 100644 Telegram/Resources/icons/box_title_shadow.png create mode 100644 Telegram/Resources/icons/box_title_shadow@2x.png create mode 100644 Telegram/Resources/icons/contacts_add.png create mode 100644 Telegram/Resources/icons/contacts_add@2x.png create mode 100644 Telegram/Resources/icons/history_empty_dog.png create mode 100644 Telegram/Resources/icons/history_empty_dog@2x.png create mode 100644 Telegram/Resources/icons/title_icon.png create mode 100644 Telegram/Resources/icons/title_icon@2x.png create mode 100644 Telegram/Resources/icons/title_icon_bg.png create mode 100644 Telegram/Resources/icons/title_icon_bg@2x.png diff --git a/Telegram/Resources/art/sprite.png b/Telegram/Resources/art/sprite.png index 8ff946cf267ca6d062241dcb7810f099deade512..def492ee161358355d4c818925f7459b1099abc8 100644 GIT binary patch literal 31260 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 literal 39727 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 diff --git a/Telegram/Resources/art/sprite_200x.png b/Telegram/Resources/art/sprite_200x.png index bdb2af1b9d8f57674ba5fa7438aff2080d96ed45..9098c1f0db63926716bd5ad95e92da6a127b9112 100644 GIT binary patch literal 67570 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 z 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 O0000GAdW>i zx7hWv*Sl9|va9RDelU>YB>CpdnKP3CKzJgQuNJr@wUB9=V2mLQLvYT)IY$r#V2r^q zj1NhX%+NHA`u#p#BS{isjFF~kQr~_Zax&xb_^QlXT-Qw_B_4b$Gw;C|yN{4*n$j{v zFUw~bhOm%uQFpst(a^t86a}45N9r9R^DqokWr&E#_kH0EWgyrXIp&S|+^Qm@yOt(kO< z@lkx=#`q|nPUx3RaIsiKyQn_5dF4Sx`DURd2%beNo_ta=K-WSq!osP%j!(`4J4u{K3y*vzu!-vb9 z84L#h9v!>g4!K-TYI}Yb+wB(ld>#PsM~LWakF-oC1K|jBvxq;Be+uj1Cy8tfV-orm>Ey6-aD#_y8|HZ zPOTLYp_K9n>Ah1*K}4vv;_is5A|l6q7kQ8Gx2hs$c6yLSM)AEN08fxr9C!hDk*oLz zkVPW#6A(qB@gZ=9Wa3j`g=EKR3e1q~Oj`mgBsz_MLGDjr3K8%{JHK~7s{Hoihs^>fp|8y_LZrVp=UOKa^b h#}+fAwRRj^egW=g9&exM6_o%0002ovPDHLkV1f#sdEfv5 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/box_title_shadow.png b/Telegram/Resources/icons/box_title_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..bba09b240d712d5e50cb65048156956e074db473 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr7!3HG#Z-iO_DH%@}#}JO0$pWIHf6pH{di3l3 j#+fsJ+A}jVAFgN6&|^t9xYPX&sE)zY)z4*}Q$iB}C%+dz literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/box_title_shadow@2x.png b/Telegram/Resources/icons/box_title_shadow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7d97eb59e7aaaa5ac8b018389343a449f9fcb6ae GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-R!3HER>*_fHDFaUz#}JO0v8OijG8l3&7_z6b zeY-C#5WnR2yOg^p&$QmY`ylM9ej3}Hj*8Fk><%7czqV9Jz11l99Z)ZWr>mdKI;Vst E0DcJ}v;Y7A literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/contacts_add.png b/Telegram/Resources/icons/contacts_add.png new file mode 100644 index 0000000000000000000000000000000000000000..98f770cc60fa3ad5e2d14176edf905c8f6cda015 GIT binary patch literal 316 zcmV-C0mJ@@P)6yCs+%9jEJXVYwb&kW1sti z0Jd$rT+}U?Nyin O0000JH1Mv^kfDlB%Qpq%mR(7IMh()+t z?7HiU$xOzVxR3V^1VXqoIk~wrcK`q|&ZX-*Qc96AhQ9Bk@B7FYLrN(ch7oHn$xAGd z5Q3Ca41xfo==FL?2zjqCAp~vPjugFTGMOYP%@3lK3d`PS`Ypn`u5-&Ej3jD01034z zHe@o~u%~o79jS3VBEQIWU8(FMA~ME=GxtbXobvl76yNtjRaL1>T(4Ikgb2m{a{P;; zC{N?${`DK-3a{5|>B+a-t@PM1xWdEXP*pdEC2wU z&u7^0_psS)V7XkvVzB_nabUOGB_jQFH5-P3rfDK$OnOB##?UlPp@aM*5wZV1Xf~TT zo6TO>c%Cz#&#~2N#o9t6g*8n>$8kPf^pWXwiltKNHQ{=_j;GTpaoHQ5=V7DKkQ3H4 z4L#3GP4>p+a*@k)zu!+?_Qqf^h%Kxf4hPKTa{Rp{0glHb#C^Ad_|U{tChW`*#;5Ca c-@-}r6AJc4d6~cMp#T5?07*qoM6N<$f)-m8cmMzZ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/history_empty_dog.png b/Telegram/Resources/icons/history_empty_dog.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6fef342192e3cfa22ac745907241bab7c30511 GIT binary patch literal 2579 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 Z;U}=~(_eMg1OPh;Y5b?HQl^9o`X7_dhlBtC literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/title_icon.png b/Telegram/Resources/icons/title_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..12772e6a3ae3111478ba0af28580d8f14f4f43b4 GIT binary patch literal 265 zcmV+k0rvihP)ST6a>&qB=Vf-mYNZuUUF7@Ndl&64$i^3W3$yv&XnB_`%Z7S}%Vk+c-}kYqDx&g<*Y+1u zRTYCEz@}-a%U{DV%rJC39`Sy^FDma6MbYpP$g;c&&}FyVeLCyMj@C$B*JB^miOF$4g3y2z8j+VA&0NRp)WAppQI44+6@ vmNaYWAfD%+5W(G<4*>wOEQ`9XQ?2<0Hp`?04t7E<00000NkvXXu0mjfYPPbN literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/title_icon_bg.png b/Telegram/Resources/icons/title_icon_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdf862916dd6905c371cfd96bed344a17dd5675 GIT binary patch literal 363 zcmV-x0hIoUP)L!ReYlGEt~ z*L7c`VHo0mzb^vE+-^7czCVwKVfYa?P2cxeuh-8gW9;J&e@AN#$8jF$`F#EpIOcdf zexpJNBj6a%^I*ksOeVA2?a10}Hb&9yc1x?i?_t}vF|=tKS^ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/title_icon_bg@2x.png b/Telegram/Resources/icons/title_icon_bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..33924433d23e67484eb4a4b2dbdf83e4b870bd22 GIT binary patch literal 701 zcmV;u0z&=q zzOOC&!7R(7uIm^CK`QQ6K@gy>>&UX~^PvpGV5if;Fbs18FAKvEJDmiK}jGpV9(#sG>sVYn5Jnz zLj^&=BuPj+F-Z~>1mSxqP1EQ&4r${l$8jzn4!>S>yIs<@t9rfOIkZ?TKJ>JCRY4G7 zu~wHg!<5lKU`M3Dw$?LYL{{X5Y8eoxwv+Tm~jYOz?5 zcBD3+&w+AXm$V}_*L8s!jYgy$sf|V>D3r@(+-x?aEk9PNRDkk*AKv+@+O`e8?*jk; zHX04me>-p1Xf)2(OylvGwCSqhaCp7A69j>@>#B<-^Y68@Wm%+cr!335J%C_Y7Cp}+ zZA8!WzMG$(k4{8U#3+i0A)_clQ53Tc$y8M(GTKR!1XWeNZ|tZj3dV8#*N|}>qoOGJ z2Dv=X<8rxtIdZvNBG2>rC(iIS?lDdCWk}OBPh*>hpnu+ElgZ?1z{zBC>!x`OdfX&Q z!hXM>>z5&lA{-0`C`r;?=L7&O9JTkxFbv4D43Z=P$8k`tR)OQVvtwM>h4p$3uIs{d jItAOdVY}VtIURfgG(+init(id, pixmapFromImageInPlace(std_::move(img)), pixmapFromImageInPlace(std_::move(dog))); + Window::chatBackground()->init(id, pixmapFromImageInPlace(std_::move(img))); memcpy(componentsScroll, components, sizeof(components)); memcpy(componentsPoint, components, sizeof(components)); diff --git a/Telegram/SourceFiles/boxes/abstractbox.cpp b/Telegram/SourceFiles/boxes/abstractbox.cpp index 4fcf2a68b..6df51ba70 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.cpp +++ b/Telegram/SourceFiles/boxes/abstractbox.cpp @@ -26,16 +26,17 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "abstractbox.h" #include "mainwidget.h" #include "mainwindow.h" +#include "styles/style_boxes.h" void BlueTitleShadow::paintEvent(QPaintEvent *e) { Painter p(this); QRect r(e->rect()); - p.drawPixmap(QRect(r.left(), 0, r.width(), height()), App::sprite(), st::boxBlueShadow.rect()); + st::boxBlueTitleShadow.fill(p, QRect(r.left(), 0, r.width(), height())); } BlueTitleClose::BlueTitleClose(QWidget *parent) : Button(parent) -, a_iconFg(st::boxBlueCloseBg->c) +, a_iconFg(st::boxBlueCloseFg->c) , _a_over(animation(this, &BlueTitleClose::step_over)) { resize(st::boxTitleHeight, st::boxTitleHeight); setCursor(style::cur_pointer); @@ -44,7 +45,7 @@ BlueTitleClose::BlueTitleClose(QWidget *parent) : Button(parent) void BlueTitleClose::onStateChange(int oldState, ButtonStateChangeSource source) { if ((oldState & StateOver) != (_state & StateOver)) { - a_iconFg.start(((_state & StateOver) ? st::white : st::boxBlueCloseBg)->c); + a_iconFg.start(((_state & StateOver) ? st::boxBlueCloseOverFg : st::boxBlueCloseFg)->c); _a_over.start(); } } @@ -57,28 +58,23 @@ void BlueTitleClose::step_over(float64 ms, bool timer) { } else { a_iconFg.update(dt, anim::linear); } - if (timer) update((st::boxTitleHeight - st::boxBlueCloseIcon.pxWidth()) / 2, (st::boxTitleHeight - st::boxBlueCloseIcon.pxHeight()) / 2, st::boxBlueCloseIcon.pxWidth(), st::boxBlueCloseIcon.pxHeight()); + if (timer) update((st::boxTitleHeight - st::boxBlueCloseIcon.width()) / 2, (st::boxTitleHeight - st::boxBlueCloseIcon.height()) / 2, st::boxBlueCloseIcon.width(), st::boxBlueCloseIcon.height()); } void BlueTitleClose::paintEvent(QPaintEvent *e) { Painter p(this); - QRect r(e->rect()), s((st::boxTitleHeight - st::boxBlueCloseIcon.pxWidth()) / 2, (st::boxTitleHeight - st::boxBlueCloseIcon.pxHeight()) / 2, st::boxBlueCloseIcon.pxWidth(), st::boxBlueCloseIcon.pxHeight()); + QRect r(e->rect()), s((st::boxTitleHeight - st::boxBlueCloseIcon.width()) / 2, (st::boxTitleHeight - st::boxBlueCloseIcon.height()) / 2, st::boxBlueCloseIcon.width(), st::boxBlueCloseIcon.height()); if (!s.contains(r)) { - p.fillRect(r, st::boxBlueTitleBg->b); + p.fillRect(r, st::boxBlueTitleBg); } if (s.intersects(r)) { p.fillRect(s.intersected(r), a_iconFg.current()); - p.drawSprite(s.topLeft(), st::boxBlueCloseIcon); + st::boxBlueCloseIcon.paint(p, s.topLeft(), width()); } } -AbstractBox::AbstractBox(int32 w) : LayerWidget() -, _maxHeight(0) -, _closed(false) -, _blueTitle(false) -, _blueClose(0) -, _blueShadow(0) { +AbstractBox::AbstractBox(int w) : LayerWidget() { setAttribute(Qt::WA_OpaquePaintEvent); resize(w, 0); } @@ -101,7 +97,7 @@ void AbstractBox::resizeEvent(QResizeEvent *e) { } if (_blueShadow) { _blueShadow->moveToLeft(0, st::boxTitleHeight); - _blueShadow->resize(width(), st::boxBlueShadow.pxHeight()); + _blueShadow->resize(width(), st::boxBlueTitleShadow.height()); } LayerWidget::resizeEvent(e); } @@ -165,8 +161,8 @@ void AbstractBox::resizeMaxHeight(int32 newWidth, int32 maxHeight) { } } -int32 AbstractBox::countHeight() const { - return qMin(_maxHeight, App::wnd()->height() - int32(2 * st::boxVerticalMargin)); +int AbstractBox::countHeight() const { + return qMin(_maxHeight, App::wnd()->height() - 2 * st::boxVerticalMargin); } void AbstractBox::onClose() { diff --git a/Telegram/SourceFiles/boxes/abstractbox.h b/Telegram/SourceFiles/boxes/abstractbox.h index bd21001cc..4c6e28b1a 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.h +++ b/Telegram/SourceFiles/boxes/abstractbox.h @@ -52,7 +52,7 @@ class AbstractBox : public LayerWidget, protected base::Subscriber { Q_OBJECT public: - AbstractBox(int32 w = st::boxWideWidth); + AbstractBox(int w = st::boxWideWidth); void parentResized() override; void showDone() override { showAll(); @@ -83,14 +83,14 @@ protected: } private: - int32 _maxHeight; - int32 countHeight() const; + int _maxHeight = 0; + int countHeight() const; - bool _closed; + bool _closed = false; - bool _blueTitle; - BlueTitleClose *_blueClose; - BlueTitleShadow *_blueShadow; + bool _blueTitle = false; + BlueTitleClose *_blueClose = nullptr; + BlueTitleShadow *_blueShadow = nullptr; }; diff --git a/Telegram/SourceFiles/boxes/addcontactbox.cpp b/Telegram/SourceFiles/boxes/addcontactbox.cpp index 5e561ff33..2ef31e477 100644 --- a/Telegram/SourceFiles/boxes/addcontactbox.cpp +++ b/Telegram/SourceFiles/boxes/addcontactbox.cpp @@ -109,8 +109,8 @@ void AddContactBox::paintEvent(QPaintEvent *e) { paintTitle(p, _boxTitle); if (_retry.isHidden()) { - p.drawSpriteLeft(st::boxPadding.left(), _first.y() + st::contactIconTop, width(), st::contactUserIcon); - p.drawSpriteLeft(st::boxPadding.left(), _phone.y() + st::contactIconTop, width(), st::contactPhoneIcon); + st::contactUserIcon.paint(p, st::boxPadding.left(), _first.y() + st::contactIconTop, width()); + st::contactPhoneIcon.paint(p, st::boxPadding.left(), _phone.y() + st::contactIconTop, width()); } else { p.setPen(st::black->p); p.setFont(st::boxTextFont->f); diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 2ce8107c1..dd6031904 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -21,6 +21,16 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org using "basic.style"; using "ui/widgets/widgets.style"; +boxBlueTitleBg: #6393b5; +boxBlueTitleAdditionalFg: #dae9f5; +boxBlueTitleAdditionalSkip: 12px; +boxBlueTitlePosition: point(23px, 18px); +boxBlueTitleShadow: icon {{ "box_title_shadow", windowShadowFg }}; +boxBlueCloseFg: #c8e1f0; +boxBlueCloseOverFg: #ffffff; +boxBlueCloseIcon: icon {{ "box_button_close", boxBlueTitleBg }}; +boxBlueCloseDuration: 150; + confirmInviteTitle: flatLabel(labelDefFlat) { font: font(16px semibold); align: align(center); @@ -68,6 +78,15 @@ aboutRevokePublicLabel: flatLabel(labelDefFlat) { textFg: windowTextFg; } +contactUserIcon: icon {{ "add_contact_user", #999999 }}; +contactPhoneIcon: icon {{ "add_contact_phone", #999999 }}; +contactIconTop: 10px; + +contactsNewItemHeight: 53px; +contactsNewItemIcon: icon {{ "contacts_add", #749fc2, point(29px, 19px) }}; +contactsNewItemTop: 18px; +contactsNewItemFg: #4b82af; + contactsMultiSelect: MultiSelect { padding: margins(8px, 8px, 8px, 8px); maxHeight: 104px; diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index 090bbf80c..1a7c2cb13 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -100,6 +100,7 @@ ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::contactsScroll) void ContactsBox::init() { _select->resizeToWidth(st::boxWideWidth); + myEnsureResized(_select); auto inviting = (_inner->creating() == CreatingGroupGroup) || (_inner->channel() && _inner->membersFilter() == MembersFilter::Recent) || _inner->chat(); auto topSkip = getTopScrollSkip(); @@ -1073,7 +1074,7 @@ void ContactsBox::Inner::paintEvent(QPaintEvent *e) { } else { p.fillRect(0, 0, width(), st::contactsNewItemHeight, (_newItemSel ? st::contactsBgOver : st::white)->b); p.setFont(st::contactsNameFont); - p.drawSpriteLeft(st::contactsNewItemIconPosition.x(), st::contactsNewItemIconPosition.y(), width(), st::contactsNewItemIcon); + st::contactsNewItemIcon.paint(p, 0, 0, width()); p.setPen(st::contactsNewItemFg); p.drawTextLeft(st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(), st::contactsNewItemTop, width(), lang(lng_add_contact_button)); } diff --git a/Telegram/SourceFiles/boxes/members_box.cpp b/Telegram/SourceFiles/boxes/members_box.cpp index a2c3c972c..8290a5bec 100644 --- a/Telegram/SourceFiles/boxes/members_box.cpp +++ b/Telegram/SourceFiles/boxes/members_box.cpp @@ -21,6 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "stdafx.h" #include "boxes/members_box.h" +#include "styles/style_boxes.h" #include "styles/style_dialogs.h" #include "lang.h" #include "mainwidget.h" @@ -149,7 +150,7 @@ void MembersBox::Inner::paintEvent(QPaintEvent *e) { } else { if (_newItemHeight) { p.fillRect(0, 0, width(), _newItemHeight, (_newItemSel ? st::contactsBgOver : st::white)->b); - p.drawSpriteLeft(st::contactsNewItemIconPosition.x(), st::contactsNewItemIconPosition.y(), width(), st::contactsNewItemIcon); + st::contactsNewItemIcon.paint(p, 0, 0, width()); p.setFont(st::contactsNameFont); p.setPen(st::contactsNewItemFg); p.drawTextLeft(st::contactsPadding.left() + st::contactsPhotoSize + st::contactsPadding.left(), st::contactsNewItemTop, width(), lang(_filter == MembersFilter::Admins ? lng_channel_add_admins : lng_channel_add_members)); diff --git a/Telegram/SourceFiles/boxes/sharebox.cpp b/Telegram/SourceFiles/boxes/sharebox.cpp index 76c99e7a4..10602c077 100644 --- a/Telegram/SourceFiles/boxes/sharebox.cpp +++ b/Telegram/SourceFiles/boxes/sharebox.cpp @@ -48,6 +48,7 @@ ShareBox::ShareBox(CopyCallback &©Callback, SubmitCallback &&submitCallback, , _topShadow(this) , _bottomShadow(this) { _select->resizeToWidth(st::boxWideWidth); + myEnsureResized(_select); auto topSkip = getTopScrollSkip(); auto bottomSkip = st::boxButtonPadding.top() + _share->height() + st::boxButtonPadding.bottom(); diff --git a/Telegram/SourceFiles/history/history.style b/Telegram/SourceFiles/history/history.style index d09ad184b..ae7d0e116 100644 --- a/Telegram/SourceFiles/history/history.style +++ b/Telegram/SourceFiles/history/history.style @@ -35,6 +35,9 @@ historyToDownPaddingTop: 10px; historyToDownBadgeFont: semiboldFont; historyToDownBadgeSize: 22px; +historyEmptyDog: icon {{ "history_empty_dog", #ffffff }}; +historyEmptySize: 128px; + membersInnerScroll: flatScroll(solidScroll) { deltat: 3px; deltab: 3px; diff --git a/Telegram/SourceFiles/history/history_service_layout.cpp b/Telegram/SourceFiles/history/history_service_layout.cpp index fa0db9f69..b69742070 100644 --- a/Telegram/SourceFiles/history/history_service_layout.cpp +++ b/Telegram/SourceFiles/history/history_service_layout.cpp @@ -334,6 +334,16 @@ QVector ServiceMessagePainter::countLineWidths(const Text &text, const QRec return lineWidths; } +void paintEmpty(Painter &p, int width, int height) { + auto position = QPoint((width - st::historyEmptySize) / 2, ((height - st::historyEmptySize) * 4) / 9); + p.setPen(Qt::NoPen); + p.setBrush(App::msgServiceBg()); + p.setRenderHint(QPainter::HighQualityAntialiasing); + p.drawEllipse(rtlrect(position.x(), position.y(), st::historyEmptySize, st::historyEmptySize, width)); + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + st::historyEmptyDog.paint(p, position.x() + (st::historyEmptySize - st::historyEmptyDog.width()) / 2, position.y() + (st::historyEmptySize - st::historyEmptyDog.height()) / 2, width); +} + void serviceColorsUpdated() { if (serviceMessageStyle) { for (auto &corner : serviceMessageStyle->corners) { diff --git a/Telegram/SourceFiles/history/history_service_layout.h b/Telegram/SourceFiles/history/history_service_layout.h index 4c9beee4d..faae5d450 100644 --- a/Telegram/SourceFiles/history/history_service_layout.h +++ b/Telegram/SourceFiles/history/history_service_layout.h @@ -48,6 +48,8 @@ private: }; +void paintEmpty(Painter &p, int width, int height); + void serviceColorsUpdated(); } // namespace HistoryLayout diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index a8917224e..e9a7beee6 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -376,8 +376,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { textstyleRestore(); } } else if (noHistoryDisplayed) { - QPoint dogPos((width() - st::msgDogImg.pxWidth()) / 2, ((height() - st::msgDogImg.pxHeight()) * 4) / 9); - p.drawPixmap(dogPos, Window::chatBackground()->dog()); + HistoryLayout::paintEmpty(p, width(), height()); } if (!noHistoryDisplayed) { adjustCurrent(r.top()); @@ -8776,8 +8775,7 @@ void HistoryWidget::paintEvent(QPaintEvent *e) { } if (_scroll.isHidden()) { p.setClipRect(_scroll.geometry()); - QPoint dogPos((width() - st::msgDogImg.pxWidth()) / 2, ((height() - _field.height() - 2 * st::sendPadding - st::msgDogImg.pxHeight()) * 4) / 9); - p.drawPixmap(dogPos, Window::chatBackground()->dog()); + HistoryLayout::paintEmpty(p, width(), height() - _field.height() - 2 * st::sendPadding); } } else { style::font font(st::msgServiceFont); diff --git a/Telegram/SourceFiles/layout.cpp b/Telegram/SourceFiles/layout.cpp index 4aa94953a..bcdcd1e2e 100644 --- a/Telegram/SourceFiles/layout.cpp +++ b/Telegram/SourceFiles/layout.cpp @@ -230,11 +230,6 @@ style::color documentSelectedColor(int32 colorIndex) { return colors[colorIndex & 3]; } -style::sprite documentCorner(int32 colorIndex) { - static style::sprite corners[] = { st::msgFileBlue, st::msgFileGreen, st::msgFileRed, st::msgFileYellow }; - return corners[colorIndex & 3]; -} - RoundCorners documentCorners(int32 colorIndex) { return RoundCorners(DocBlueCorners + (colorIndex & 3)); } diff --git a/Telegram/SourceFiles/layout.h b/Telegram/SourceFiles/layout.h index 385050401..bb5ff4307 100644 --- a/Telegram/SourceFiles/layout.h +++ b/Telegram/SourceFiles/layout.h @@ -86,7 +86,6 @@ style::color documentColor(int32 colorIndex); style::color documentDarkColor(int32 colorIndex); style::color documentOverColor(int32 colorIndex); style::color documentSelectedColor(int32 colorIndex); -style::sprite documentCorner(int32 colorIndex); RoundCorners documentCorners(int32 colorIndex); bool documentIsValidMediaFile(const QString &filepath); diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index e48dcbaeb..7ce562e00 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -715,7 +715,7 @@ HitTestType MainWindow::hitTest(const QPoint &p) const { } QRect MainWindow::iconRect() const { - return QRect(st::titleIconPos + title->geometry().topLeft(), st::titleIconImg.pxSize()); + return title->iconRect(); } bool MainWindow::eventFilter(QObject *obj, QEvent *e) { diff --git a/Telegram/SourceFiles/media/view/mediaview.style b/Telegram/SourceFiles/media/view/mediaview.style index e2888cc70..7f43918ef 100644 --- a/Telegram/SourceFiles/media/view/mediaview.style +++ b/Telegram/SourceFiles/media/view/mediaview.style @@ -85,19 +85,28 @@ mediaviewClose: icon {{ "mediaview_close", #ffffff }}; mediaviewSave: icon {{ "mediaview_download", #ffffff }}; mediaviewMore: icon {{ "mediaview_more", #ffffff }}; +mediaviewFileRedCornerFg: #d55959; +mediaviewFileYellowCornerFg: #e8a659; +mediaviewFileGreenCornerFg: #49a957; +mediaviewFileBlueCornerFg: #599dcf; + mediaviewFileRed: icon { { size(25px, 25px), #ffffff }, - { "mediaview_file_corner", #d55959 }, + { "mediaview_file_corner", mediaviewFileRedCornerFg }, }; mediaviewFileYellow: icon { { size(25px, 25px), #ffffff }, - { "mediaview_file_corner", #e8a659 }, + { "mediaview_file_corner", mediaviewFileYellowCornerFg }, }; mediaviewFileGreen: icon { { size(25px, 25px), #ffffff }, - { "mediaview_file_corner", #49a957 }, + { "mediaview_file_corner", mediaviewFileGreenCornerFg }, }; mediaviewFileBlue: icon { { size(25px, 25px), #ffffff }, - { "mediaview_file_corner", #599dcf }, + { "mediaview_file_corner", mediaviewFileBlueCornerFg }, }; + +mediaviewTransparentBg: #ffffff; +mediaviewTransparentFg: #cccccc; +mediaviewTransparentSize: 4px; diff --git a/Telegram/SourceFiles/mediaview.cpp b/Telegram/SourceFiles/mediaview.cpp index 82d603b4c..eb3c30909 100644 --- a/Telegram/SourceFiles/mediaview.cpp +++ b/Telegram/SourceFiles/mediaview.cpp @@ -103,7 +103,7 @@ MediaView::MediaView() : TWidget(App::wnd()) } }); - _transparentBrush = QBrush(App::sprite().copy(st::mvTransparentBrush.rect())); + generateTransparentBrush(); setWindowFlags(Qt::FramelessWindowHint | Qt::BypassWindowManagerHint | Qt::Tool | Qt::NoDropShadowWindowHint); moveToScreen(); @@ -2628,6 +2628,19 @@ void MediaView::loadBack() { } } +void MediaView::generateTransparentBrush() { + auto size = st::mediaviewTransparentSize * cIntRetinaFactor(); + auto transparent = QImage(2 * size, 2 * size, QImage::Format_ARGB32_Premultiplied); + transparent.fill(st::mediaviewTransparentBg->c); + { + Painter p(&transparent); + p.fillRect(rtlrect(0, size, size, size, 2 * size), st::mediaviewTransparentFg); + p.fillRect(rtlrect(size, 0, size, size, 2 * size), st::mediaviewTransparentFg); + } + transparent.setDevicePixelRatio(cRetinaFactor()); + _transparentBrush = QBrush(transparent); +} + MediaView::LastChatPhoto MediaView::computeLastOverviewChatPhoto() { LastChatPhoto emptyResult = { nullptr, nullptr }; auto lastPhotoInOverview = [&emptyResult](auto history, auto list) -> LastChatPhoto { diff --git a/Telegram/SourceFiles/mediaview.h b/Telegram/SourceFiles/mediaview.h index 320b86fb5..b86383165 100644 --- a/Telegram/SourceFiles/mediaview.h +++ b/Telegram/SourceFiles/mediaview.h @@ -136,6 +136,8 @@ private: void findCurrent(); void loadBack(); + void generateTransparentBrush(); + void updateCursor(); void setZoomLevel(int newZoom); diff --git a/Telegram/SourceFiles/overview/overview.style b/Telegram/SourceFiles/overview/overview.style index c010d0191..7250e6d15 100644 --- a/Telegram/SourceFiles/overview/overview.style +++ b/Telegram/SourceFiles/overview/overview.style @@ -20,6 +20,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ using "basic.style"; using "history/history.style"; +using "media/view/mediaview.style"; OverviewFileLayout { maxWidth: pixels; diff --git a/Telegram/SourceFiles/overviewwidget.cpp b/Telegram/SourceFiles/overviewwidget.cpp index b58b9a468..ff5f18a72 100644 --- a/Telegram/SourceFiles/overviewwidget.cpp +++ b/Telegram/SourceFiles/overviewwidget.cpp @@ -34,6 +34,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "application.h" #include "overview/overview_layout.h" #include "history/history_media_types.h" +#include "history/history_service_layout.h" #include "media/media_audio.h" // flick scroll taken from http://qt-project.org/doc/qt-4.8/demos-embedded-anomaly-src-flickcharm-cpp.html @@ -778,8 +779,7 @@ void OverviewInner::paintEvent(QPaintEvent *e) { Overview::Layout::PaintContext context(ms, _selMode); if (_history->overview[_type].isEmpty() && (!_migrated || !_history->overviewLoaded(_type) || _migrated->overview[_type].isEmpty())) { - QPoint dogPos((_width - st::msgDogImg.pxWidth()) / 2, ((height() - st::msgDogImg.pxHeight()) * 4) / 9); - p.drawPixmap(dogPos, Window::chatBackground()->dog()); + HistoryLayout::paintEmpty(p, _width, height()); return; } else if (_inSearch && _searchResults.isEmpty() && _searchFull && (!_migrated || _searchFullMigrated) && !_searchTimer.isActive()) { p.setFont(st::noContactsFont->f); diff --git a/Telegram/SourceFiles/stickers/stickers.style b/Telegram/SourceFiles/stickers/stickers.style index c215aadcf..c1a9168a1 100644 --- a/Telegram/SourceFiles/stickers/stickers.style +++ b/Telegram/SourceFiles/stickers/stickers.style @@ -20,6 +20,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ using "basic.style"; +using "boxes/boxes.style"; + featuredStickersHeader: 45px; featuredStickersSkip: 15px; diff --git a/Telegram/SourceFiles/title.cpp b/Telegram/SourceFiles/title.cpp index 0a34528a2..9722ac9d4 100644 --- a/Telegram/SourceFiles/title.cpp +++ b/Telegram/SourceFiles/title.cpp @@ -31,6 +31,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "media/player/media_player_title_button.h" #include "media/player/media_player_panel.h" #include "media/player/media_player_instance.h" +#include "styles/style_window.h" class TitleWidget::Hider : public TWidget { public: @@ -126,9 +127,9 @@ void TitleWidget::paintEvent(QPaintEvent *e) { auto chooseText = lang(inlineSwitchChoose ? lng_inline_switch_choose : lng_forward_choose); p.drawText(st::titleMenuOffset - st::titleTextButton.width / 2, st::titleTextButton.textTop + st::titleTextButton.font->ascent, chooseText); } - p.drawSprite(st::titleIconPos, st::titleIconImg); + st::titleIcon.paint(p, st::titleIconPosition, width()); if (Adaptive::OneColumn() && !_counter.isNull() && App::main()) { - p.drawPixmap(st::titleIconPos.x() + st::titleIconImg.pxWidth() - (_counter.width() / cIntRetinaFactor()), st::titleIconPos.y() + st::titleIconImg.pxHeight() - (_counter.height() / cIntRetinaFactor()), _counter); + p.drawPixmap(st::titleCounterPosition, _counter); } } @@ -335,11 +336,11 @@ void TitleWidget::updateCounter() { } _counter = App::pixmapFromImageInPlace(App::wnd()->iconWithCounter(size, counter, bg, false)); _counter.setDevicePixelRatio(cRetinaFactor()); - update(QRect(st::titleIconPos, st::titleIconImg.pxSize())); + update(QRect(st::titleCounterPosition, _counter.size() / cIntRetinaFactor())); } else { if (!_counter.isNull()) { + update(QRect(st::titleCounterPosition, _counter.size() / cIntRetinaFactor())); _counter = QPixmap(); - update(QRect(st::titleIconPos, st::titleIconImg.pxSize())); } } } @@ -395,7 +396,7 @@ HitTestType TitleWidget::hitTest(const QPoint &p) { int x(p.x()), y(p.y()), w(width()), h(height()); if (!Adaptive::OneColumn() && _hider && x >= App::main()->dlgsWidth()) return HitTestType::None; - if (x >= st::titleIconPos.x() && y >= st::titleIconPos.y() && x < st::titleIconPos.x() + st::titleIconImg.pxWidth() && y < st::titleIconPos.y() + st::titleIconImg.pxHeight()) { + if (x >= st::titleIconPosition.x() && y >= st::titleIconPosition.y() && x < st::titleIconPosition.x() + st::titleIcon.width() && y < st::titleIconPosition.y() + st::titleIcon.height()) { return HitTestType::Icon; } else if (false || (_player && _player->geometry().contains(p)) @@ -420,3 +421,7 @@ HitTestType TitleWidget::hitTest(const QPoint &p) { } return HitTestType::None; } + +QRect TitleWidget::iconRect() const { + return myrtlrect(QRect(st::titleIconPosition, st::titleIcon.size())); +} diff --git a/Telegram/SourceFiles/title.h b/Telegram/SourceFiles/title.h index 6cfd8edff..ea278669e 100644 --- a/Telegram/SourceFiles/title.h +++ b/Telegram/SourceFiles/title.h @@ -42,6 +42,7 @@ public: void maximizedChanged(bool maximized, bool force = false); HitTestType hitTest(const QPoint &p); + QRect iconRect() const; void setHideLevel(float64 level); diff --git a/Telegram/SourceFiles/ui/style/style_core_icon.cpp b/Telegram/SourceFiles/ui/style/style_core_icon.cpp index acad1c618..2df173ae9 100644 --- a/Telegram/SourceFiles/ui/style/style_core_icon.cpp +++ b/Telegram/SourceFiles/ui/style/style_core_icon.cpp @@ -134,7 +134,7 @@ void MonoIcon::ensureLoaded() const { if (size > sizeTag.size() && !memcmp(data, sizeTag.data(), sizeTag.size())) { size -= sizeTag.size(); data += sizeTag.size(); - QByteArray baForStream(reinterpret_cast(data), size); + auto baForStream = QByteArray::fromRawData(reinterpret_cast(data), size); QBuffer buffer(&baForStream); buffer.open(QIODevice::ReadOnly); @@ -207,7 +207,7 @@ int Icon::width() const { int Icon::height() const { if (_height < 0) { _height = 0; - for_const (const auto &part, _parts) { + for_const (auto &part, _parts) { accumulate_max(_height, part.offset().x() + part.height()); } } diff --git a/Telegram/SourceFiles/ui/style/style_core_icon.h b/Telegram/SourceFiles/ui/style/style_core_icon.h index 7fb337a3f..c4e6b73a7 100644 --- a/Telegram/SourceFiles/ui/style/style_core_icon.h +++ b/Telegram/SourceFiles/ui/style/style_core_icon.h @@ -118,6 +118,9 @@ public: void fill(QPainter &p, const QRect &rect) const; int width() const; int height() const; + QSize size() const { + return QSize(width(), height()); + } private: struct ColoredCopy { diff --git a/Telegram/SourceFiles/window/chat_background.cpp b/Telegram/SourceFiles/window/chat_background.cpp index 294e53471..315ac129f 100644 --- a/Telegram/SourceFiles/window/chat_background.cpp +++ b/Telegram/SourceFiles/window/chat_background.cpp @@ -41,10 +41,9 @@ void ChatBackground::initIfEmpty() { } } -void ChatBackground::init(int32 id, QPixmap &&image, QPixmap &&dog) { +void ChatBackground::init(int32 id, QPixmap &&image) { _id = id; _image = std_::move(image); - _dog = std_::move(dog); notify(ChatBackgroundUpdate(ChatBackgroundUpdate::Type::New, _tile)); } @@ -52,7 +51,6 @@ void ChatBackground::init(int32 id, QPixmap &&image, QPixmap &&dog) { void ChatBackground::reset() { _id = 0; _image = QPixmap(); - _dog = QPixmap(); _tile = false; notify(ChatBackgroundUpdate(ChatBackgroundUpdate::Type::New, _tile)); @@ -66,10 +64,6 @@ const QPixmap &ChatBackground::image() const { return _image; } -const QPixmap &ChatBackground::dog() const { - return _dog; -} - bool ChatBackground::tile() const { return _tile; } diff --git a/Telegram/SourceFiles/window/chat_background.h b/Telegram/SourceFiles/window/chat_background.h index 67a2bf72d..6840dbc2f 100644 --- a/Telegram/SourceFiles/window/chat_background.h +++ b/Telegram/SourceFiles/window/chat_background.h @@ -39,19 +39,17 @@ class ChatBackground : public base::Observable { public: bool empty() const; void initIfEmpty(); - void init(int32 id, QPixmap &&image, QPixmap &&dog); + void init(int32 id, QPixmap &&image); void reset(); int32 id() const; const QPixmap &image() const; - const QPixmap &dog() const; bool tile() const; void setTile(bool tile); private: int32 _id = 0; QPixmap _image; - QPixmap _dog; bool _tile = false; }; diff --git a/Telegram/SourceFiles/window/window.style b/Telegram/SourceFiles/window/window.style index 721d756c9..8722c4d3b 100644 --- a/Telegram/SourceFiles/window/window.style +++ b/Telegram/SourceFiles/window/window.style @@ -21,6 +21,13 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org using "basic.style"; +titleIconPosition: point(9px, 9px); +titleIcon: icon { + { "title_icon_bg", #49708f }, + { "title_icon", #ffffff, point(4px, 4px) } +}; +titleCounterPosition: point(17px, 17px); + notifyBg: white; notifyBorder: #f1f1f1; notifyBorderWidth: 1px; From 6d9173bca8afa241e958e74ab87e7f0428379f9d Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 22 Oct 2016 23:29:25 +0300 Subject: [PATCH 09/10] Version 0.10.17 alpha: new cute control for adding members to groups. --- Telegram/Resources/winrc/Telegram.rc | 8 ++++---- Telegram/Resources/winrc/Updater.rc | 8 ++++---- Telegram/SourceFiles/application.cpp | 4 ++-- Telegram/SourceFiles/core/version.h | 6 +++--- Telegram/build/version | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Telegram/Resources/winrc/Telegram.rc b/Telegram/Resources/winrc/Telegram.rc index a11b06469..ccab91948 100644 --- a/Telegram/Resources/winrc/Telegram.rc +++ b/Telegram/Resources/winrc/Telegram.rc @@ -34,8 +34,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,10,16,0 - PRODUCTVERSION 0,10,16,0 + FILEVERSION 0,10,17,0 + PRODUCTVERSION 0,10,17,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -51,10 +51,10 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Telegram Messenger LLP" - VALUE "FileVersion", "0.10.16.0" + VALUE "FileVersion", "0.10.17.0" VALUE "LegalCopyright", "Copyright (C) 2014-2016" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "0.10.16.0" + VALUE "ProductVersion", "0.10.17.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/Resources/winrc/Updater.rc b/Telegram/Resources/winrc/Updater.rc index 4c571a1b2..9544a3ea8 100644 --- a/Telegram/Resources/winrc/Updater.rc +++ b/Telegram/Resources/winrc/Updater.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,10,16,0 - PRODUCTVERSION 0,10,16,0 + FILEVERSION 0,10,17,0 + PRODUCTVERSION 0,10,17,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,10 +43,10 @@ BEGIN BEGIN VALUE "CompanyName", "Telegram Messenger LLP" VALUE "FileDescription", "Telegram Updater" - VALUE "FileVersion", "0.10.16.0" + VALUE "FileVersion", "0.10.17.0" VALUE "LegalCopyright", "Copyright (C) 2014-2016" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "0.10.16.0" + VALUE "ProductVersion", "0.10.17.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index 62f7eabf8..974dc0321 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -1086,8 +1086,8 @@ void AppClass::checkMapVersion() { if (Local::oldMapVersion() < AppVersion) { if (Local::oldMapVersion()) { QString versionFeatures; - if ((cAlphaVersion() || cBetaVersion()) && Local::oldMapVersion() < 10014) { - versionFeatures = langNewVersionText(); //QString::fromUtf8("\xe2\x80\x94 New audio player design\n\xe2\x80\x94 Moved to Qt library version 5.6.2\n\nWindows 10:\n\xe2\x80\x94 Respecting quiet hours for the notifications"); + if ((cAlphaVersion() || cBetaVersion()) && Local::oldMapVersion() < 10017) { + versionFeatures = QString::fromUtf8("\xe2\x80\x94 New cute control for adding members to your groups"); } else if (!(cAlphaVersion() || cBetaVersion()) && Local::oldMapVersion() < 10016) { versionFeatures = langNewVersionText(); } else { diff --git a/Telegram/SourceFiles/core/version.h b/Telegram/SourceFiles/core/version.h index e7e907b7d..06798f066 100644 --- a/Telegram/SourceFiles/core/version.h +++ b/Telegram/SourceFiles/core/version.h @@ -24,7 +24,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #define BETA_VERSION_MACRO (0ULL) -constexpr int AppVersion = 10016; -constexpr str_const AppVersionStr = "0.10.16"; -constexpr bool AppAlphaVersion = false; +constexpr int AppVersion = 10017; +constexpr str_const AppVersionStr = "0.10.17"; +constexpr bool AppAlphaVersion = true; constexpr uint64 AppBetaVersion = BETA_VERSION_MACRO; diff --git a/Telegram/build/version b/Telegram/build/version index ade31629a..513961b5e 100644 --- a/Telegram/build/version +++ b/Telegram/build/version @@ -1,6 +1,6 @@ -AppVersion 10016 +AppVersion 10017 AppVersionStrMajor 0.10 -AppVersionStrSmall 0.10.16 -AppVersionStr 0.10.16 -AlphaChannel 0 +AppVersionStrSmall 0.10.17 +AppVersionStr 0.10.17 +AlphaChannel 1 BetaVersion 0 From a774e9b712aa4909579b66661f1f01eee69f7e5f Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 24 Oct 2016 00:25:29 +0300 Subject: [PATCH 10/10] Closed beta 0.10.17.2: macOS animation improvements, multiselect design. --- Telegram/Resources/winrc/Telegram.rc | 8 +++--- Telegram/Resources/winrc/Updater.rc | 8 +++--- Telegram/SourceFiles/boxes/boxes.style | 6 ++--- Telegram/SourceFiles/boxes/contactsbox.cpp | 27 ++++++------------- Telegram/SourceFiles/boxes/contactsbox.h | 2 +- Telegram/SourceFiles/boxes/sharebox.cpp | 25 +++++------------ Telegram/SourceFiles/boxes/sharebox.h | 2 +- Telegram/SourceFiles/core/version.h | 4 +-- Telegram/SourceFiles/ui/animation.h | 16 +++++++---- .../ui/effects/round_image_checkbox.cpp | 15 ++++++----- .../ui/effects/round_image_checkbox.h | 2 +- Telegram/SourceFiles/ui/flatinput.cpp | 8 ++++++ .../SourceFiles/ui/widgets/multi_select.cpp | 7 +++-- Telegram/build/version | 4 +-- 14 files changed, 66 insertions(+), 68 deletions(-) diff --git a/Telegram/Resources/winrc/Telegram.rc b/Telegram/Resources/winrc/Telegram.rc index ccab91948..ca3820dc3 100644 --- a/Telegram/Resources/winrc/Telegram.rc +++ b/Telegram/Resources/winrc/Telegram.rc @@ -34,8 +34,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,10,17,0 - PRODUCTVERSION 0,10,17,0 + FILEVERSION 0,10,17,2 + PRODUCTVERSION 0,10,17,2 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -51,10 +51,10 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Telegram Messenger LLP" - VALUE "FileVersion", "0.10.17.0" + VALUE "FileVersion", "0.10.17.2" VALUE "LegalCopyright", "Copyright (C) 2014-2016" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "0.10.17.0" + VALUE "ProductVersion", "0.10.17.2" END END BLOCK "VarFileInfo" diff --git a/Telegram/Resources/winrc/Updater.rc b/Telegram/Resources/winrc/Updater.rc index 9544a3ea8..f959611a4 100644 --- a/Telegram/Resources/winrc/Updater.rc +++ b/Telegram/Resources/winrc/Updater.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,10,17,0 - PRODUCTVERSION 0,10,17,0 + FILEVERSION 0,10,17,2 + PRODUCTVERSION 0,10,17,2 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,10 +43,10 @@ BEGIN BEGIN VALUE "CompanyName", "Telegram Messenger LLP" VALUE "FileDescription", "Telegram Updater" - VALUE "FileVersion", "0.10.17.0" + VALUE "FileVersion", "0.10.17.2" VALUE "LegalCopyright", "Copyright (C) 2014-2016" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "0.10.17.0" + VALUE "ProductVersion", "0.10.17.2" END END BLOCK "VarFileInfo" diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index dd6031904..f50ed827e 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -106,11 +106,11 @@ contactsMultiSelect: MultiSelect { font: normalFont; textBg: contactsBgOver; textFg: windowTextFg; - textActiveBg: titleBg; + textActiveBg: windowActiveBg; textActiveFg: white; deleteFg: white; - deleteLeft: 9px; - deleteStroke: 3px; + deleteLeft: 10px; + deleteStroke: 2px; duration: 150; minScale: 0.3; } diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index 1a7c2cb13..dff590fce 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -353,21 +353,9 @@ void ContactsBox::onFilterUpdate(const QString &filter) { } void ContactsBox::addPeerToMultiSelect(PeerData *peer, bool skipAnimation) { - auto getColor = [peer]() -> const style::color & { - switch (peer->colorIndex) { - case 1: return st::historyPeer2UserpicFg; - case 2: return st::historyPeer3UserpicFg; - case 3: return st::historyPeer4UserpicFg; - case 4: return st::historyPeer5UserpicFg; - case 5: return st::historyPeer6UserpicFg; - case 6: return st::historyPeer7UserpicFg; - case 7: return st::historyPeer8UserpicFg; - default: return st::historyPeer1UserpicFg; - } - }; using AddItemWay = Ui::MultiSelect::AddItemWay; auto addItemWay = skipAnimation ? AddItemWay::SkipAnimation : AddItemWay::Default; - _select->entity()->addItem(peer->id, peer->shortName(), getColor(), PaintUserpicCallback(peer), addItemWay); + _select->entity()->addItem(peer->id, peer->shortName(), st::windowActiveBg, PaintUserpicCallback(peer), addItemWay); } void ContactsBox::onPeerSelectedChanged(PeerData *peer, bool checked) { @@ -941,7 +929,7 @@ ContactsBox::Inner::ContactData *ContactsBox::Inner::contactData(Dialogs::Row *r return data; } -void ContactsBox::Inner::paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel) { +void ContactsBox::Inner::paintDialog(Painter &p, uint64 ms, PeerData *peer, ContactData *data, bool sel) { UserData *user = peer->asUser(); if (_chat && _membersFilter == MembersFilter::Admins) { @@ -967,7 +955,7 @@ void ContactsBox::Inner::paintDialog(Painter &p, PeerData *peer, ContactData *da paintDisabledCheckUserpic(p, peer, st::contactsPadding.left(), st::contactsPadding.top(), width()); } else if (usingMultiSelect()) { checkedRatio = data->checkbox->checkedAnimationRatio(); - data->checkbox->paint(p, st::contactsPadding.left(), st::contactsPadding.top(), width()); + data->checkbox->paint(p, ms, st::contactsPadding.left(), st::contactsPadding.top(), width()); } else { peer->paintUserpicLeft(p, st::contactsPhotoSize, st::contactsPadding.left(), st::contactsPadding.top(), width()); } @@ -1060,6 +1048,7 @@ void ContactsBox::Inner::paintEvent(QPaintEvent *e) { _time = unixtime(); p.fillRect(r, st::white); + uint64 ms = getms(); int32 yFrom = r.y(), yTo = r.y() + r.height(); if (_filter.isEmpty()) { if (!_contacts->isEmpty() || !_byUsername.isEmpty()) { @@ -1089,7 +1078,7 @@ void ContactsBox::Inner::paintEvent(QPaintEvent *e) { if ((*i)->pos() * _rowHeight >= yTo) { break; } - paintDialog(p, (*i)->history()->peer, contactData(*i), (*i == _sel)); + paintDialog(p, ms, (*i)->history()->peer, contactData(*i), (*i == _sel)); p.translate(0, _rowHeight); } yFrom -= _contacts->size() * _rowHeight; @@ -1109,7 +1098,7 @@ void ContactsBox::Inner::paintEvent(QPaintEvent *e) { int32 to = ceilclamp(yTo, _rowHeight, 0, _byUsername.size()); p.translate(0, from * _rowHeight); for (; from < to; ++from) { - paintDialog(p, _byUsername[from], d_byUsername[from], (_byUsernameSel == from)); + paintDialog(p, ms, _byUsername[from], d_byUsername[from], (_byUsernameSel == from)); p.translate(0, _rowHeight); } } @@ -1156,7 +1145,7 @@ void ContactsBox::Inner::paintEvent(QPaintEvent *e) { int32 to = ceilclamp(yTo, _rowHeight, 0, _filtered.size()); p.translate(0, from * _rowHeight); for (; from < to; ++from) { - paintDialog(p, _filtered[from]->history()->peer, contactData(_filtered[from]), (_filteredSel == from)); + paintDialog(p, ms, _filtered[from]->history()->peer, contactData(_filtered[from]), (_filteredSel == from)); p.translate(0, _rowHeight); } } @@ -1173,7 +1162,7 @@ void ContactsBox::Inner::paintEvent(QPaintEvent *e) { int32 to = ceilclamp(yTo, _rowHeight, 0, _byUsernameFiltered.size()); p.translate(0, from * _rowHeight); for (; from < to; ++from) { - paintDialog(p, _byUsernameFiltered[from], d_byUsernameFiltered[from], (_byUsernameSel == from)); + paintDialog(p, ms, _byUsernameFiltered[from], d_byUsernameFiltered[from], (_byUsernameSel == from)); p.translate(0, _rowHeight); } } diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index b5dbdee5c..0db72c0dd 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -232,7 +232,7 @@ private: void addAdminDone(const MTPUpdates &result, mtpRequestId req); bool addAdminFail(const RPCError &error, mtpRequestId req); - void paintDialog(Painter &p, PeerData *peer, ContactData *data, bool sel); + void paintDialog(Painter &p, uint64 ms, PeerData *peer, ContactData *data, bool sel); void paintDisabledCheckUserpic(Painter &p, PeerData *peer, int x, int y, int outerWidth) const; void changeCheckState(Dialogs::Row *row); diff --git a/Telegram/SourceFiles/boxes/sharebox.cpp b/Telegram/SourceFiles/boxes/sharebox.cpp index 10602c077..a0054c2d2 100644 --- a/Telegram/SourceFiles/boxes/sharebox.cpp +++ b/Telegram/SourceFiles/boxes/sharebox.cpp @@ -234,21 +234,9 @@ void ShareBox::onFilterUpdate(const QString &query) { } void ShareBox::addPeerToMultiSelect(PeerData *peer, bool skipAnimation) { - auto getColor = [peer]() -> const style::color & { - switch (peer->colorIndex) { - case 1: return st::historyPeer2UserpicFg; - case 2: return st::historyPeer3UserpicFg; - case 3: return st::historyPeer4UserpicFg; - case 4: return st::historyPeer5UserpicFg; - case 5: return st::historyPeer6UserpicFg; - case 6: return st::historyPeer7UserpicFg; - case 7: return st::historyPeer8UserpicFg; - default: return st::historyPeer1UserpicFg; - } - }; using AddItemWay = Ui::MultiSelect::AddItemWay; auto addItemWay = skipAnimation ? AddItemWay::SkipAnimation : AddItemWay::Default; - _select->addItem(peer->id, peer->shortName(), getColor(), PaintUserpicCallback(peer), addItemWay); + _select->addItem(peer->id, peer->shortName(), st::windowActiveBg, PaintUserpicCallback(peer), addItemWay); } void ShareBox::onPeerSelectedChanged(PeerData *peer, bool checked) { @@ -511,14 +499,14 @@ void ShareBox::Inner::setActive(int active) { emit mustScrollTo(y, y + _rowHeight); } -void ShareBox::Inner::paintChat(Painter &p, Chat *chat, int index) { +void ShareBox::Inner::paintChat(Painter &p, uint64 ms, Chat *chat, int index) { auto x = _rowsLeft + qFloor((index % _columnCount) * _rowWidthReal); auto y = _rowsTop + (index / _columnCount) * _rowHeight; auto outerWidth = width(); auto photoLeft = (_rowWidth - (st::sharePhotoCheckbox.imageRadius * 2)) / 2; auto photoTop = st::sharePhotoTop; - chat->checkbox.paint(p, x + photoLeft, y + photoTop, outerWidth); + chat->checkbox.paint(p, ms, x + photoLeft, y + photoTop, outerWidth); if (chat->nameFg.animating()) { p.setPen(chat->nameFg.current()); @@ -541,6 +529,7 @@ ShareBox::Inner::Chat::Chat(PeerData *peer, base::lambda_wrap updateCall void ShareBox::Inner::paintEvent(QPaintEvent *e) { Painter p(this); + auto ms = getms(); auto r = e->rect(); p.setClipRect(r); p.fillRect(r, st::white); @@ -556,7 +545,7 @@ void ShareBox::Inner::paintEvent(QPaintEvent *e) { if (indexFrom >= indexTo) { break; } - paintChat(p, getChat(*i), indexFrom); + paintChat(p, ms, getChat(*i), indexFrom); ++indexFrom; } } else { @@ -577,7 +566,7 @@ void ShareBox::Inner::paintEvent(QPaintEvent *e) { if (indexFrom >= _filtered.size()) { break; } - paintChat(p, getChat(_filtered[indexFrom]), indexFrom); + paintChat(p, ms, getChat(_filtered[indexFrom]), indexFrom); ++indexFrom; } indexFrom -= filteredSize; @@ -589,7 +578,7 @@ void ShareBox::Inner::paintEvent(QPaintEvent *e) { if (indexFrom >= d_byUsernameFiltered.size()) { break; } - paintChat(p, d_byUsernameFiltered[indexFrom], filteredSize + indexFrom); + paintChat(p, ms, d_byUsernameFiltered[indexFrom], filteredSize + indexFrom); ++indexFrom; } } diff --git a/Telegram/SourceFiles/boxes/sharebox.h b/Telegram/SourceFiles/boxes/sharebox.h index 7629d608e..449c56242 100644 --- a/Telegram/SourceFiles/boxes/sharebox.h +++ b/Telegram/SourceFiles/boxes/sharebox.h @@ -164,7 +164,7 @@ private: Text name; ColorAnimation nameFg; }; - void paintChat(Painter &p, Chat *chat, int index); + void paintChat(Painter &p, uint64 ms, Chat *chat, int index); void updateChat(PeerData *peer); void updateChatName(Chat *chat, PeerData *peer); void repaintChat(PeerData *peer); diff --git a/Telegram/SourceFiles/core/version.h b/Telegram/SourceFiles/core/version.h index 06798f066..701e8ddc4 100644 --- a/Telegram/SourceFiles/core/version.h +++ b/Telegram/SourceFiles/core/version.h @@ -22,9 +22,9 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "core/utils.h" -#define BETA_VERSION_MACRO (0ULL) +#define BETA_VERSION_MACRO (10017002ULL) constexpr int AppVersion = 10017; constexpr str_const AppVersionStr = "0.10.17"; -constexpr bool AppAlphaVersion = true; +constexpr bool AppAlphaVersion = false; constexpr uint64 AppBetaVersion = BETA_VERSION_MACRO; diff --git a/Telegram/SourceFiles/ui/animation.h b/Telegram/SourceFiles/ui/animation.h index 8e8657815..8f2b7f427 100644 --- a/Telegram/SourceFiles/ui/animation.h +++ b/Telegram/SourceFiles/ui/animation.h @@ -484,6 +484,15 @@ public: using ValueType = typename AnimType::ValueType; using Callback = base::lambda_unique; + void step(uint64 ms) { + if (_data) { + _data->a_animation.step(ms); + if (_data && !_data->a_animation.animating()) { + _data.reset(); + } + } + } + bool animating() const { if (_data) { if (_data->a_animation.animating()) { @@ -494,11 +503,8 @@ public: return false; } bool animating(uint64 ms) { - if (animating()) { - _data->a_animation.step(ms); - return animating(); - } - return false; + step(ms); + return animating(); } ValueType current() const { diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp index de70ee3a7..f0fcb5456 100644 --- a/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.cpp @@ -65,7 +65,14 @@ RoundImageCheckbox::RoundImageCheckbox(const style::RoundImageCheckbox &st, base prepareCheckCaches(&_st, _wideCheckBgCache, _wideCheckFullCache); } -void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { +void RoundImageCheckbox::paint(Painter &p, uint64 ms, int x, int y, int outerWidth) { + _selection.step(ms); + for (auto &icon : _icons) { + icon.fadeIn.step(ms); + icon.fadeOut.step(ms); + } + removeFadeOutedIcons(); + auto selectionLevel = _selection.current(_checked ? 1. : 0.); if (_selection.animating()) { auto userpicRadius = qRound(kWideScale * (_st.imageRadius + (_st.imageSmallRadius - _st.imageRadius) * selectionLevel)); @@ -101,7 +108,6 @@ void RoundImageCheckbox::paint(Painter &p, int x, int y, int outerWidth) { p.setRenderHint(QPainter::HighQualityAntialiasing, false); } - removeFadeOutedIcons(); p.setRenderHint(QPainter::SmoothPixmapTransform, true); for (auto &icon : _icons) { auto fadeIn = icon.fadeIn.current(1.); @@ -149,10 +155,7 @@ void RoundImageCheckbox::setChecked(bool checked, SetStyle speed) { _icons.back().fadeIn.finish(); } } else { - _icons.back().fadeOut.start([this] { - _updateCallback(); - removeFadeOutedIcons(); // this call can destroy current lambda - }, 1, 0, _st.selectDuration); + _icons.back().fadeOut.start(_updateCallback, 1, 0, _st.selectDuration); if (speed == SetStyle::Animated) { prepareWideCheckIconCache(&_icons.back()); } else { diff --git a/Telegram/SourceFiles/ui/effects/round_image_checkbox.h b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h index c94a3c78d..3b9d0f79a 100644 --- a/Telegram/SourceFiles/ui/effects/round_image_checkbox.h +++ b/Telegram/SourceFiles/ui/effects/round_image_checkbox.h @@ -29,7 +29,7 @@ public: using PaintRoundImage = base::lambda_unique; RoundImageCheckbox(const style::RoundImageCheckbox &st, base::lambda_wrap updateCallback, PaintRoundImage paintRoundImage); - void paint(Painter &p, int x, int y, int outerWidth); + void paint(Painter &p, uint64 ms, int x, int y, int outerWidth); float64 checkedAnimationRatio() const; bool checked() const { diff --git a/Telegram/SourceFiles/ui/flatinput.cpp b/Telegram/SourceFiles/ui/flatinput.cpp index 7b5966b4d..5f835f9a8 100644 --- a/Telegram/SourceFiles/ui/flatinput.cpp +++ b/Telegram/SourceFiles/ui/flatinput.cpp @@ -1438,6 +1438,14 @@ void InputField::touchEvent(QTouchEvent *e) { void InputField::paintEvent(QPaintEvent *e) { Painter p(this); + auto ms = getms(); + if (_a_placeholderShift.animating()) { + _a_placeholderShift.step(ms); + } + if (_a_placeholderFg.animating()) { + _a_placeholderFg.step(ms); + } + QRect r(rect().intersected(e->rect())); if (_st.textBg->c.alphaF() > 0.) { p.fillRect(r, _st.textBg); diff --git a/Telegram/SourceFiles/ui/widgets/multi_select.cpp b/Telegram/SourceFiles/ui/widgets/multi_select.cpp index ef0336f7f..bef2de71b 100644 --- a/Telegram/SourceFiles/ui/widgets/multi_select.cpp +++ b/Telegram/SourceFiles/ui/widgets/multi_select.cpp @@ -579,6 +579,10 @@ int MultiSelect::Inner::resizeGetHeight(int newWidth) { void MultiSelect::Inner::paintEvent(QPaintEvent *e) { Painter p(this); + auto ms = getms(); + _height.step(ms); + _iconOpacity.step(ms); + auto paintRect = e->rect(); p.fillRect(paintRect, st::windowBg); @@ -586,9 +590,8 @@ void MultiSelect::Inner::paintEvent(QPaintEvent *e) { p.translate(offset); paintRect.translate(-offset); - auto ms = getms(); auto outerWidth = width() - _st.padding.left() - _st.padding.right(); - auto iconOpacity = _iconOpacity.current(ms, _items.empty() ? 1. : 0.); + auto iconOpacity = _iconOpacity.current(_items.empty() ? 1. : 0.); if (iconOpacity > 0.) { p.setOpacity(iconOpacity); _st.fieldIcon.paint(p, 0, 0, outerWidth); diff --git a/Telegram/build/version b/Telegram/build/version index 513961b5e..a586bce09 100644 --- a/Telegram/build/version +++ b/Telegram/build/version @@ -2,5 +2,5 @@ AppVersion 10017 AppVersionStrMajor 0.10 AppVersionStrSmall 0.10.17 AppVersionStr 0.10.17 -AlphaChannel 1 -BetaVersion 0 +AlphaChannel 0 +BetaVersion 10017002