| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- /*
- This file is part of Telegram Desktop,
- the official desktop application for the Telegram messaging service.
- For license and copyright information please follow this link:
- https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
- */
- #include "dialogs/dialogs_quick_action.h"
- #include "dialogs/ui/dialogs_quick_action_context.h"
- #include "apiwrap.h"
- #include "data/data_histories.h"
- #include "data/data_peer.h"
- #include "data/data_session.h"
- #include "dialogs/dialogs_entry.h"
- #include "history/history.h"
- #include "lang/lang_instance.h"
- #include "lang/lang_keys.h"
- #include "lottie/lottie_icon.h"
- #include "main/main_session.h"
- #include "menu/menu_mute.h"
- #include "window/window_peer_menu.h"
- #include "window/window_session_controller.h"
- #include "styles/style_dialogs.h"
- namespace Dialogs {
- namespace {
- const style::font &SwipeActionFont(
- Dialogs::Ui::QuickDialogActionLabel action,
- int availableWidth) {
- struct Entry final {
- Dialogs::Ui::QuickDialogActionLabel action;
- QString langId;
- style::font font;
- };
- static auto Fonts = std::vector<Entry>();
- for (auto &entry : Fonts) {
- if (entry.action == action) {
- if (entry.langId == Lang::GetInstance().id()) {
- return entry.font;
- }
- }
- }
- constexpr auto kNormalFontSize = 13;
- constexpr auto kMinFontSize = 5;
- for (auto i = kNormalFontSize; i >= kMinFontSize; --i) {
- auto font = style::font(
- style::ConvertScale(i, style::Scale()),
- st::semiboldFont->flags(),
- st::semiboldFont->family());
- if (font->width(ResolveQuickDialogLabel(action)) <= availableWidth
- || i == kMinFontSize) {
- Fonts.emplace_back(Entry{
- .action = action,
- .langId = Lang::GetInstance().id(),
- .font = std::move(font),
- });
- return Fonts.back().font;
- }
- }
- Unexpected("SwipeActionFont: can't find font.");
- }
- } // namespace
- void PerformQuickDialogAction(
- not_null<Window::SessionController*> controller,
- not_null<PeerData*> peer,
- Ui::QuickDialogAction action,
- FilterId filterId) {
- const auto history = peer->owner().history(peer);
- if (action == Dialogs::Ui::QuickDialogAction::Mute) {
- const auto isMuted = rpl::variable<bool>(
- MuteMenu::ThreadDescriptor(history).isMutedValue()).current();
- MuteMenu::ThreadDescriptor(history).updateMutePeriod(isMuted
- ? 0
- : std::numeric_limits<TimeId>::max());
- } else if (action == Dialogs::Ui::QuickDialogAction::Pin) {
- const auto entry = (Dialogs::Entry*)(history);
- Window::TogglePinnedThread(controller, entry, filterId);
- } else if (action == Dialogs::Ui::QuickDialogAction::Read) {
- if (Window::IsUnreadThread(history)) {
- Window::MarkAsReadThread(history);
- } else if (history) {
- peer->owner().histories().changeDialogUnreadMark(history, true);
- }
- } else if (action == Dialogs::Ui::QuickDialogAction::Archive) {
- history->session().api().toggleHistoryArchived(
- history,
- !Window::IsArchived(history),
- [] {});
- } else if (action == Dialogs::Ui::QuickDialogAction::Delete) {
- Window::DeleteAndLeaveHandler(controller, peer)();
- }
- }
- QString ResolveQuickDialogLottieIconName(
- not_null<PeerData*> peer,
- Ui::QuickDialogAction action,
- FilterId filterId) {
- if (action == Dialogs::Ui::QuickDialogAction::Mute) {
- const auto history = peer->owner().history(peer);
- const auto isMuted = rpl::variable<bool>(
- MuteMenu::ThreadDescriptor(history).isMutedValue()).current();
- return isMuted ? u"swipe_unmute"_q : u"swipe_mute"_q;
- } else if (action == Dialogs::Ui::QuickDialogAction::Pin) {
- const auto history = peer->owner().history(peer);
- const auto entry = (Dialogs::Entry*)(history);
- return entry->isPinnedDialog(filterId)
- ? u"swipe_unpin"_q
- : u"swipe_pin"_q;
- } else if (action == Dialogs::Ui::QuickDialogAction::Read) {
- const auto history = peer->owner().history(peer);
- return Window::IsUnreadThread(history)
- ? u"swipe_read"_q
- : u"swipe_unread"_q;
- } else if (action == Dialogs::Ui::QuickDialogAction::Archive) {
- const auto history = peer->owner().history(peer);
- return Window::IsArchived(history)
- ? u"swipe_unarchive"_q
- : u"swipe_archive"_q;
- } else if (action == Dialogs::Ui::QuickDialogAction::Delete) {
- return u"swipe_delete"_q;
- }
- return u"swipe_disabled"_q;
- }
- Ui::QuickDialogActionLabel ResolveQuickDialogLabel(
- not_null<History*> history,
- Ui::QuickDialogAction action,
- FilterId filterId) {
- if (action == Dialogs::Ui::QuickDialogAction::Mute) {
- const auto isMuted = rpl::variable<bool>(
- MuteMenu::ThreadDescriptor(history).isMutedValue()).current();
- return isMuted
- ? Ui::QuickDialogActionLabel::Unmute
- : Ui::QuickDialogActionLabel::Mute;
- } else if (action == Dialogs::Ui::QuickDialogAction::Pin) {
- const auto entry = (Dialogs::Entry*)(history);
- return entry->isPinnedDialog(filterId)
- ? Ui::QuickDialogActionLabel::Unpin
- : Ui::QuickDialogActionLabel::Pin;
- } else if (action == Dialogs::Ui::QuickDialogAction::Read) {
- return Window::IsUnreadThread(history)
- ? Ui::QuickDialogActionLabel::Read
- : Ui::QuickDialogActionLabel::Unread;
- } else if (action == Dialogs::Ui::QuickDialogAction::Archive) {
- return Window::IsArchived(history)
- ? Ui::QuickDialogActionLabel::Unarchive
- : Ui::QuickDialogActionLabel::Archive;
- } else if (action == Dialogs::Ui::QuickDialogAction::Delete) {
- return Ui::QuickDialogActionLabel::Delete;
- }
- return Ui::QuickDialogActionLabel::Disabled;
- }
- QString ResolveQuickDialogLabel(Ui::QuickDialogActionLabel action) {
- switch (action) {
- case Ui::QuickDialogActionLabel::Mute:
- return tr::lng_settings_quick_dialog_action_mute(tr::now);
- case Ui::QuickDialogActionLabel::Unmute:
- return tr::lng_settings_quick_dialog_action_unmute(tr::now);
- case Ui::QuickDialogActionLabel::Pin:
- return tr::lng_settings_quick_dialog_action_pin(tr::now);
- case Ui::QuickDialogActionLabel::Unpin:
- return tr::lng_settings_quick_dialog_action_unpin(tr::now);
- case Ui::QuickDialogActionLabel::Read:
- return tr::lng_settings_quick_dialog_action_read(tr::now);
- case Ui::QuickDialogActionLabel::Unread:
- return tr::lng_settings_quick_dialog_action_unread(tr::now);
- case Ui::QuickDialogActionLabel::Archive:
- return tr::lng_settings_quick_dialog_action_archive(tr::now);
- case Ui::QuickDialogActionLabel::Unarchive:
- return tr::lng_settings_quick_dialog_action_unarchive(tr::now);
- case Ui::QuickDialogActionLabel::Delete:
- return tr::lng_settings_quick_dialog_action_delete(tr::now);
- default:
- return tr::lng_settings_quick_dialog_action_disabled(tr::now);
- };
- }
- const style::color &ResolveQuickActionBg(
- Ui::QuickDialogActionLabel action) {
- switch (action) {
- case Ui::QuickDialogActionLabel::Delete:
- return st::attentionButtonFg;
- case Ui::QuickDialogActionLabel::Disabled:
- return st::windowSubTextFgOver;
- case Ui::QuickDialogActionLabel::Mute:
- case Ui::QuickDialogActionLabel::Unmute:
- case Ui::QuickDialogActionLabel::Pin:
- case Ui::QuickDialogActionLabel::Unpin:
- case Ui::QuickDialogActionLabel::Read:
- case Ui::QuickDialogActionLabel::Unread:
- case Ui::QuickDialogActionLabel::Archive:
- case Ui::QuickDialogActionLabel::Unarchive:
- default:
- return st::windowBgActive;
- };
- }
- const style::color &ResolveQuickActionBgActive(
- Ui::QuickDialogActionLabel action) {
- return st::windowSubTextFgOver;
- }
- void DrawQuickAction(
- QPainter &p,
- const QRect &rect,
- not_null<Lottie::Icon*> icon,
- Ui::QuickDialogActionLabel label) {
- const auto iconSize = st::dialogsQuickActionSize;
- const auto innerHeight = iconSize * 2;
- const auto top = (rect.height() - innerHeight) / 2;
- icon->paint(p, rect.x() + (rect.width() - iconSize) / 2, top);
- p.setPen(st::premiumButtonFg);
- p.setBrush(Qt::NoBrush);
- const auto availableWidth = rect.width();
- p.setFont(SwipeActionFont(label, availableWidth));
- p.drawText(
- QRect(rect.x(), top, availableWidth, innerHeight),
- ResolveQuickDialogLabel(label),
- style::al_bottom);
- }
- } // namespace Dialogs
|