Added few last used mute periods to mute menu.

This commit is contained in:
23rd 2022-04-02 01:02:34 +03:00
parent 511789d7af
commit 1a746b1ba3
9 changed files with 109 additions and 6 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -891,6 +891,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_mute_menu_unmute" = "Unmute";
"lng_mute_menu_duration_hours#one" = "Mute for {count} hour";
"lng_mute_menu_duration_hours#other" = "Mute for {count} hours";
"lng_mute_menu_duration_any" = "Mute for {duration}";
"lng_mute_menu_duration" = "Mute for...";
"lng_mute_menu_duration_forever" = "Mute forever";
"lng_mute_menu_duration_unmute" = "Unmute";

View file

@ -38,7 +38,9 @@ QByteArray SessionSettings::serialize() const {
size += _groupStickersSectionHidden.size() * sizeof(quint64);
size += _mediaLastPlaybackPosition.size() * 2 * sizeof(quint64);
size += Serialize::bytearraySize(autoDownload);
size += sizeof(qint32) + _hiddenPinnedMessages.size() * (sizeof(quint64) + sizeof(qint32));
size += sizeof(qint32)
+ _hiddenPinnedMessages.size() * (sizeof(quint64) + sizeof(qint32))
+ (_mutePeriods.size() * sizeof(quint64));
auto result = QByteArray();
result.reserve(size);
@ -72,6 +74,10 @@ QByteArray SessionSettings::serialize() const {
for (const auto &[key, value] : _hiddenPinnedMessages) {
stream << SerializePeerId(key) << qint64(value.bare);
}
stream << qint32(_mutePeriods.size());
for (const auto &period : _mutePeriods) {
stream << quint64(period);
}
}
return result;
}
@ -132,6 +138,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
qint32 dialogsFiltersEnabled = _dialogsFiltersEnabled ? 1 : 0;
qint32 supportAllSilent = _supportAllSilent ? 1 : 0;
qint32 photoEditorHintShowsCount = _photoEditorHintShowsCount;
std::vector<TimeId> mutePeriods;
stream >> versionTag;
if (versionTag == kVersionTag) {
@ -351,6 +358,17 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
}
}
}
if (!stream.atEnd()) {
auto count = qint32(0);
stream >> count;
if (stream.status() == QDataStream::Ok) {
for (auto i = 0; i != count; ++i) {
quint64 period;
stream >> period;
mutePeriods.emplace_back(period);
}
}
}
if (stream.status() != QDataStream::Ok) {
LOG(("App Error: "
"Bad data for SessionSettings::addFromSerialized()"));
@ -394,6 +412,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
_dialogsFiltersEnabled = (dialogsFiltersEnabled == 1);
_supportAllSilent = (supportAllSilent == 1);
_photoEditorHintShowsCount = std::move(photoEditorHintShowsCount);
_mutePeriods = std::move(mutePeriods);
if (version < 2) {
app.setLastSeenWarningSeen(appLastSeenWarningSeen == 1);
@ -542,4 +561,20 @@ void SessionSettings::incrementPhotoEditorHintShown() {
}
}
std::vector<TimeId> SessionSettings::mutePeriods() const {
return _mutePeriods;
}
void SessionSettings::addMutePeriod(TimeId period) {
if (_mutePeriods.empty()) {
_mutePeriods.push_back(period);
} else if (_mutePeriods.back() != period) {
if (_mutePeriods.back() < period) {
_mutePeriods = { _mutePeriods.back(), period };
} else {
_mutePeriods = { period, _mutePeriods.back() };
}
}
}
} // namespace Main

View file

@ -123,6 +123,9 @@ public:
[[nodiscard]] bool photoEditorHintShown() const;
void incrementPhotoEditorHintShown();
[[nodiscard]] std::vector<TimeId> mutePeriods() const;
void addMutePeriod(TimeId period);
private:
static constexpr auto kDefaultSupportChatsLimitSlice = 7 * 24 * 60 * 60;
static constexpr auto kPhotoEditorHintMaxShowsCount = 5;
@ -138,6 +141,7 @@ private:
base::flat_map<PeerId, MsgId> _hiddenPinnedMessages;
bool _dialogsFiltersEnabled = false;
int _photoEditorHintShowsCount = 0;
std::vector<TimeId> _mutePeriods;
Support::SwitchSettings _supportSwitch;
bool _supportFixChatsOrder = true;

View file

@ -7,19 +7,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "menu/menu_mute.h"
#include "data/notify/data_notify_settings.h"
#include "data/data_peer.h"
#include "data/data_session.h"
#include "data/notify/data_notify_settings.h"
#include "info/profile/info_profile_values.h"
#include "lang/lang_keys.h"
#include "main/main_session.h"
#include "main/main_session_settings.h"
#include "ui/boxes/choose_time.h"
#include "ui/boxes/time_picker_box.h"
#include "ui/effects/animation_value.h"
#include "ui/layers/generic_box.h"
#include "ui/text/format_values.h"
#include "ui/widgets/checkbox.h"
#include "ui/widgets/menu/menu_action.h"
#include "ui/widgets/popup_menu.h"
#include "ui/boxes/time_picker_box.h"
#include "styles/style_boxes.h"
#include "styles/style_info.h" // infoTopBarMenu
#include "styles/style_layers.h"
@ -31,6 +33,35 @@ namespace {
constexpr auto kMuteDurSecondsDefault = crl::time(8) * 3600;
class IconWithText final : public Ui::Menu::Action {
public:
using Ui::Menu::Action::Action;
void setData(const QString &text, const QPoint &iconPosition);
protected:
void paintEvent(QPaintEvent *e) override;
private:
QPoint _iconPosition;
QString _text;
};
void IconWithText::setData(const QString &text, const QPoint &iconPosition) {
_iconPosition = iconPosition;
_text = text;
}
void IconWithText::paintEvent(QPaintEvent *e) {
Ui::Menu::Action::paintEvent(e);
Painter p(this);
p.setFont(st::menuIconMuteForAnyTextFont);
p.setPen(st::menuIconColor);
p.drawText(_iconPosition, _text);
}
class MuteItem final : public Ui::Menu::Action {
public:
MuteItem(
@ -161,9 +192,10 @@ void PickMuteBox(not_null<Ui::GenericBox*> box, not_null<PeerData*> peer) {
const auto pickerCallback = TimePickerBox(box, seconds, phrases, 0);
box->addButton(tr::lng_mute_menu_mute(), [=] {
peer->owner().notifySettings().updateNotifySettings(
peer,
pickerCallback());
const auto muteFor = pickerCallback();
peer->owner().notifySettings().updateNotifySettings(peer, muteFor);
peer->session().settings().addMutePeriod(muteFor);
peer->session().saveSettings();
box->closeBox();
});
@ -210,6 +242,32 @@ void FillMuteMenu(
},
soundIsNone ? &st::menuIconSoundOn : &st::menuIconSoundOff);
const auto &st = menu->st().menu;
const auto iconTextPosition = st.itemIconPosition
+ st::menuIconMuteForAnyTextPosition;
for (const auto &muteFor : peer->session().settings().mutePeriods()) {
const auto callback = [=] {
peer->owner().notifySettings().updateNotifySettings(
peer,
muteFor);
};
auto item = base::make_unique_q<IconWithText>(
menu,
st,
Ui::Menu::CreateAction(
menu->menu().get(),
tr::lng_mute_menu_duration_any(
tr::now,
lt_duration,
Ui::FormatMuteFor(muteFor)),
callback),
&st::menuIconMuteForAny,
&st::menuIconMuteForAny);
item->setData(Ui::FormatMuteForTiny(muteFor), iconTextPosition);
menu->addAction(std::move(item));
}
menu->addAction(
tr::lng_mute_menu_duration(tr::now),
[=, show = args.show] { show->showBox(Box(PickMuteBox, peer)); },

View file

@ -36,6 +36,7 @@ constexpr auto kTTLDurSeconds3 = kTTLDurHours3 * 3600;
constexpr auto kTTLDurHours4 = crl::time(24 * 30);
constexpr auto kTTLDurSeconds4 = kTTLDurHours4 * 3600;
// See menu_mute.cpp.
class IconWithText final : public Ui::Menu::Action {
public:
using Ui::Menu::Action::Action;

View file

@ -108,6 +108,10 @@ menuIconTTLAny: icon {{ "menu/auto_delete_plain", menuIconColor }};
menuIconTTLAnyTextPosition: point(11px, 22px);
menuIconTTL: icon {{ "menu/auto_delete", menuIconColor }};
menuIconMuteForAny: icon {{ "menu/mute_for_plain", menuIconColor }};
menuIconMuteForAnyTextPosition: point(14px, 9px);
menuIconMuteForAnyTextFont: font(8px semibold);
mediaMenuIconStickers: icon {{ "menu/stickers", mediaviewMenuFg }};
mediaMenuIconCancel: icon {{ "menu/cancel", mediaviewMenuFg }};
mediaMenuIconShowInChat: icon {{ "menu/show_in_chat", mediaviewMenuFg }};