Added initial ability to change swipe dialog action from chat settings.

This commit is contained in:
23rd 2025-03-16 22:28:26 +03:00
parent e28d29f276
commit b95035e7a2
6 changed files with 85 additions and 4 deletions

View file

@ -1180,6 +1180,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_restart_now" = "Restart"; "lng_settings_restart_now" = "Restart";
"lng_settings_restart_later" = "Later"; "lng_settings_restart_later" = "Later";
"lng_settings_swipe_subsection" = "Chat list swipe gesture";
"lng_settings_swipe_mute" = "Mute"; "lng_settings_swipe_mute" = "Mute";
"lng_settings_swipe_unmute" = "Unmute"; "lng_settings_swipe_unmute" = "Unmute";
"lng_settings_swipe_pin" = "Pin"; "lng_settings_swipe_pin" = "Pin";

View file

@ -240,7 +240,7 @@ QByteArray Settings::serialize() const {
+ Serialize::stringSize(_customFontFamily) + Serialize::stringSize(_customFontFamily)
+ sizeof(qint32) * 3 + sizeof(qint32) * 3
+ Serialize::bytearraySize(_tonsiteStorageToken) + Serialize::bytearraySize(_tonsiteStorageToken)
+ sizeof(qint32) * 7; + sizeof(qint32) * 8;
auto result = QByteArray(); auto result = QByteArray();
result.reserve(size); result.reserve(size);
@ -401,7 +401,8 @@ QByteArray Settings::serialize() const {
<< qint32(_recordVideoMessages ? 1 : 0) << qint32(_recordVideoMessages ? 1 : 0)
<< SerializeVideoQuality(_videoQuality) << SerializeVideoQuality(_videoQuality)
<< qint32(_ivZoom.current()) << qint32(_ivZoom.current())
<< qint32(_systemDarkModeEnabled.current() ? 1 : 0); << qint32(_systemDarkModeEnabled.current() ? 1 : 0)
<< qint32(_swipeDialogAction);
} }
Ensures(result.size() == size); Ensures(result.size() == size);
@ -530,6 +531,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
qint32 recordVideoMessages = _recordVideoMessages ? 1 : 0; qint32 recordVideoMessages = _recordVideoMessages ? 1 : 0;
quint32 videoQuality = SerializeVideoQuality(_videoQuality); quint32 videoQuality = SerializeVideoQuality(_videoQuality);
quint32 chatFiltersHorizontal = _chatFiltersHorizontal.current() ? 1 : 0; quint32 chatFiltersHorizontal = _chatFiltersHorizontal.current() ? 1 : 0;
quint32 swipeDialogAction = quint32(_swipeDialogAction);
stream >> themesAccentColors; stream >> themesAccentColors;
if (!stream.atEnd()) { if (!stream.atEnd()) {
@ -858,6 +860,9 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
if (!stream.atEnd()) { if (!stream.atEnd()) {
stream >> systemDarkModeEnabled; stream >> systemDarkModeEnabled;
} }
if (!stream.atEnd()) {
stream >> swipeDialogAction;
}
if (stream.status() != QDataStream::Ok) { if (stream.status() != QDataStream::Ok) {
LOG(("App Error: " LOG(("App Error: "
"Bad data for Core::Settings::constructFromSerialized()")); "Bad data for Core::Settings::constructFromSerialized()"));
@ -1079,6 +1084,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) {
_recordVideoMessages = (recordVideoMessages == 1); _recordVideoMessages = (recordVideoMessages == 1);
_videoQuality = DeserializeVideoQuality(videoQuality); _videoQuality = DeserializeVideoQuality(videoQuality);
_chatFiltersHorizontal = (chatFiltersHorizontal == 1); _chatFiltersHorizontal = (chatFiltersHorizontal == 1);
_swipeDialogAction = Dialogs::Ui::SwipeDialogAction(swipeDialogAction);
} }
QString Settings::getSoundPath(const QString &key) const { QString Settings::getSoundPath(const QString &key) const {
@ -1470,6 +1476,7 @@ void Settings::resetOnLastLogout() {
_recordVideoMessages = false; _recordVideoMessages = false;
_videoQuality = {}; _videoQuality = {};
_chatFiltersHorizontal = false; _chatFiltersHorizontal = false;
_swipeDialogAction = Dialogs::Ui::SwipeDialogAction::Disabled;
_recentEmojiPreload.clear(); _recentEmojiPreload.clear();
_recentEmoji.clear(); _recentEmoji.clear();
@ -1657,4 +1664,12 @@ void Settings::setChatFiltersHorizontal(bool value) {
_chatFiltersHorizontal = value; _chatFiltersHorizontal = value;
} }
Dialogs::Ui::SwipeDialogAction Settings::swipeDialogAction() const {
return _swipeDialogAction;
}
void Settings::setSwipeDialogAction(Dialogs::Ui::SwipeDialogAction action) {
_swipeDialogAction = action;
}
} // namespace Core } // namespace Core

View file

@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/core_settings_proxy.h" #include "core/core_settings_proxy.h"
#include "media/media_common.h" #include "media/media_common.h"
#include "dialogs/ui/dialogs_swipe_context.h"
#include "window/themes/window_themes_embedded.h" #include "window/themes/window_themes_embedded.h"
#include "ui/chat/attach/attach_send_files_way.h" #include "ui/chat/attach/attach_send_files_way.h"
#include "base/flags.h" #include "base/flags.h"
@ -946,6 +947,9 @@ public:
[[nodiscard]] static PlaybackSpeed DeserializePlaybackSpeed( [[nodiscard]] static PlaybackSpeed DeserializePlaybackSpeed(
qint32 speed); qint32 speed);
[[nodiscard]] Dialogs::Ui::SwipeDialogAction swipeDialogAction() const;
void setSwipeDialogAction(Dialogs::Ui::SwipeDialogAction);
void resetOnLastLogout(); void resetOnLastLogout();
private: private:
@ -1086,6 +1090,9 @@ private:
bool _recordVideoMessages = false; bool _recordVideoMessages = false;
Dialogs::Ui::SwipeDialogAction _swipeDialogAction
= Dialogs::Ui::SwipeDialogAction::Disabled;
QByteArray _photoEditorBrush; QByteArray _photoEditorBrush;
}; };

View file

@ -728,7 +728,8 @@ void Widget::setupSwipeBack() {
const auto isRightToLeft = direction == Qt::RightToLeft; const auto isRightToLeft = direction == Qt::RightToLeft;
if (!isRightToLeft && _inner) { if (!isRightToLeft && _inner) {
if (const auto key = _inner->calcSwipeKey(top)) { if (const auto key = _inner->calcSwipeKey(top)) {
const auto action = Dialogs::Ui::SwipeDialogAction::Mute; const auto action
= Core::App().settings().swipeDialogAction();
_inner->prepareSwipeAction(key, action); _inner->prepareSwipeAction(key, action);
return Ui::Controls::SwipeHandlerFinishData{ return Ui::Controls::SwipeHandlerFinishData{
.callback = [=, session = &session()] { .callback = [=, session = &session()] {

View file

@ -928,7 +928,7 @@ void PaintRow(
style::al_bottom); style::al_bottom);
} }
p.translate(0, topTranslation); p.translate(0, topTranslation);
p.setClipRegion(QRegion()); p.setClipping(false);
} }
} }

View file

@ -1273,6 +1273,62 @@ void SetupChatBackground(
}, adaptive->lifetime()); }, adaptive->lifetime());
} }
void SetupChatListSwipe(
not_null<Window::SessionController*> controller,
not_null<Ui::VerticalLayout*> container) {
Ui::AddDivider(container);
Ui::AddSkip(container);
Ui::AddSubsectionTitle(container, tr::lng_settings_swipe_subsection());
using Type = Dialogs::Ui::SwipeDialogAction;
const auto group = std::make_shared<Ui::RadioenumGroup<Type>>(
Core::App().settings().swipeDialogAction());
container->add(
object_ptr<Ui::SettingsButton>(
container,
group->value() | rpl::map([](Type value) {
return ((value == Dialogs::Ui::SwipeDialogAction::Mute)
? tr::lng_settings_swipe_mute
: (value == Dialogs::Ui::SwipeDialogAction::Pin)
? tr::lng_settings_swipe_pin
: (value == Dialogs::Ui::SwipeDialogAction::Read)
? tr::lng_settings_swipe_read
: (value == Dialogs::Ui::SwipeDialogAction::Archive)
? tr::lng_settings_swipe_archive
: tr::lng_settings_swipe_disabled)();
}) | rpl::flatten_latest(),
st::settingsButtonNoIcon)
)->setClickedCallback([=] {
controller->uiShow()->showBox(Box([=](not_null<Ui::GenericBox*> box) {
box->setTitle(tr::lng_settings_swipe_subsection());
const auto addRadio = [&](Type value, tr::phrase<> phrase) {
box->verticalLayout()->add(
object_ptr<Ui::Radioenum<Type>>(
box->verticalLayout(),
group,
value,
phrase(tr::now),
st::settingsSendType),
st::settingsSendTypePadding);
};
addRadio(Type::Mute, tr::lng_settings_swipe_mute);
addRadio(Type::Pin, tr::lng_settings_swipe_pin);
addRadio(Type::Read, tr::lng_settings_swipe_read);
addRadio(Type::Archive, tr::lng_settings_swipe_archive);
addRadio(Type::Delete, tr::lng_settings_swipe_delete);
addRadio(Type::Disabled, tr::lng_settings_swipe_disabled);
box->addButton(tr::lng_settings_save(), [=] {
Core::App().settings().setSwipeDialogAction(
group->current());
Core::App().saveSettingsDelayed();
box->closeBox();
});
box->addButton(tr::lng_cancel(), [=] { box->closeBox(); });
}));
});
Ui::AddSkip(container);
}
void SetupDefaultThemes( void SetupDefaultThemes(
not_null<Window::Controller*> window, not_null<Window::Controller*> window,
not_null<Ui::VerticalLayout*> container) { not_null<Ui::VerticalLayout*> container) {
@ -1803,6 +1859,7 @@ void Chat::setupContent(not_null<Window::SessionController*> controller) {
SetupThemeSettings(controller, content); SetupThemeSettings(controller, content);
SetupCloudThemes(controller, content); SetupCloudThemes(controller, content);
SetupChatBackground(controller, content); SetupChatBackground(controller, content);
SetupChatListSwipe(controller, content);
SetupStickersEmoji(controller, content); SetupStickersEmoji(controller, content);
SetupMessages(controller, content); SetupMessages(controller, content);
Ui::AddDivider(content); Ui::AddDivider(content);