Move some settings from global to Session.

This commit is contained in:
John Preston 2019-08-02 11:40:35 +01:00
parent 7e4c9f98a6
commit 93a52bb66e
30 changed files with 315 additions and 169 deletions

View File

@ -325,6 +325,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_replace_emojis" = "Replace emoji";
"lng_settings_suggest_emoji" = "Suggest emoji replacements";
"lng_settings_suggest_by_emoji" = "Suggest popular stickers by emoji";
"lng_settings_loop_stickers" = "Loop animated stickers";
"lng_settings_large_emoji" = "Large emoji";
"lng_settings_view_emojis" = "View list";
"lng_settings_send_enter" = "Send by Enter";
"lng_settings_send_ctrlenter" = "Send by Ctrl+Enter";
@ -395,7 +397,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_performance" = "Performance";
"lng_settings_enable_animations" = "Enable animations";
"lng_settings_autoplay_gifs" = "Autoplay GIFs";
"lng_settings_loop_stickers" = "Loop animated stickers";
"lng_backgrounds_header" = "Choose your new chat background";
"lng_theme_sure_keep" = "Keep this theme?";

View File

@ -419,10 +419,12 @@ void GroupInfoBox::prepare() {
_initialTitle);
_title->setMaxLength(kMaxGroupChannelTitle);
_title->setInstantReplaces(Ui::InstantReplaces::Default());
_title->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
_title->setInstantReplacesEnabled(
_navigation->session().settings().replaceEmojiValue());
Ui::Emoji::SuggestionsController::Init(
getDelegate()->outerContainer(),
_title);
_title,
&_navigation->session());
if (_type != Type::Group) {
_description.create(
@ -434,7 +436,7 @@ void GroupInfoBox::prepare() {
_description->setMaxLength(kMaxChannelDescription);
_description->setInstantReplaces(Ui::InstantReplaces::Default());
_description->setInstantReplacesEnabled(
Global::ReplaceEmojiValue());
_navigation->session().settings().replaceEmojiValue());
connect(_description, &Ui::InputField::resized, [=] { descriptionResized(); });
connect(_description, &Ui::InputField::submitted, [=] { submit(); });
@ -442,7 +444,8 @@ void GroupInfoBox::prepare() {
Ui::Emoji::SuggestionsController::Init(
getDelegate()->outerContainer(),
_description);
_description,
&_navigation->session());
}
connect(_title, &Ui::InputField::submitted, [=] { submitName(); });

View File

@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/shadow.h"
#include "ui/widgets/labels.h"
#include "ui/widgets/buttons.h"
#include "main/main_session.h"
#include "core/event_filter.h"
#include "chat_helpers/emoji_suggestions_widget.h"
#include "settings/settings_common.h"
@ -36,7 +37,8 @@ class Options {
public:
Options(
not_null<QWidget*> outer,
not_null<Ui::VerticalLayout*> container);
not_null<Ui::VerticalLayout*> container,
not_null<Main::Session*> session);
[[nodiscard]] bool isValid() const;
[[nodiscard]] rpl::producer<bool> isValidChanged() const;
@ -53,6 +55,7 @@ private:
static Option Create(
not_null<QWidget*> outer,
not_null<Ui::VerticalLayout*> container,
not_null<Main::Session*> session,
int position);
void toggleRemoveAlways(bool toggled);
@ -122,6 +125,7 @@ private:
not_null<QWidget*> _outer;
not_null<Ui::VerticalLayout*> _container;
const not_null<Main::Session*> _session;
int _position = 0;
std::vector<Option> _list;
std::set<Option, std::less<>> _destroyed;
@ -134,12 +138,18 @@ private:
void InitField(
not_null<QWidget*> container,
not_null<Ui::InputField*> field) {
not_null<Ui::InputField*> field,
not_null<Main::Session*> session) {
field->setInstantReplaces(Ui::InstantReplaces::Default());
field->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
field->setInstantReplacesEnabled(
session->settings().replaceEmojiValue());
auto options = Ui::Emoji::SuggestionsController::Options();
options.suggestExactFirstWord = false;
Ui::Emoji::SuggestionsController::Init(container, field, options);
Ui::Emoji::SuggestionsController::Init(
container,
field,
session,
options);
}
not_null<Ui::FlatLabel*> CreateWarningLabel(
@ -176,6 +186,7 @@ void FocusAtEnd(not_null<Ui::InputField*> field) {
Options::Option Options::Option::Create(
not_null<QWidget*> outer,
not_null<Ui::VerticalLayout*> container,
not_null<Main::Session*> session,
int position) {
auto result = Option();
const auto field = container->insert(
@ -187,7 +198,7 @@ Options::Option Options::Option::Create(
st::createPollOptionField,
Ui::InputField::Mode::NoNewlines,
tr::lng_polls_create_option_add())));
InitField(outer, field->entity());
InitField(outer, field->entity(), session);
field->entity()->setMaxLength(kOptionLimit + kErrorLimit);
result._field.reset(field);
@ -341,9 +352,11 @@ rpl::producer<Qt::MouseButton> Options::Option::removeClicks() const {
Options::Options(
not_null<QWidget*> outer,
not_null<Ui::VerticalLayout*> container)
not_null<Ui::VerticalLayout*> container,
not_null<Main::Session*> session)
: _outer(outer)
, _container(container)
, _session(session)
, _position(_container->count()) {
checkLastOption();
}
@ -488,6 +501,7 @@ void Options::addEmptyOption() {
_list.push_back(Option::Create(
_outer,
_container,
_session,
_position + _list.size() + _destroyed.size()));
const auto field = _list.back().field();
QObject::connect(field, &Ui::InputField::submitted, [=] {
@ -578,7 +592,8 @@ void Options::checkLastOption() {
} // namespace
CreatePollBox::CreatePollBox(QWidget*) {
CreatePollBox::CreatePollBox(QWidget*, not_null<Main::Session*> session)
: _session(session) {
}
rpl::producer<PollData> CreatePollBox::submitRequests() const {
@ -605,7 +620,7 @@ not_null<Ui::InputField*> CreatePollBox::setupQuestion(
Ui::InputField::Mode::MultiLine,
tr::lng_polls_create_question_placeholder()),
st::createPollFieldPadding);
InitField(getDelegate()->outerContainer(), question);
InitField(getDelegate()->outerContainer(), question, _session);
question->setMaxLength(kQuestionLimit + kErrorLimit);
const auto warning = CreateWarningLabel(
@ -648,7 +663,8 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
AddSubsectionTitle(container, tr::lng_polls_create_options());
const auto options = lifetime().make_state<Options>(
getDelegate()->outerContainer(),
container);
container,
_session);
auto limit = options->usedCount() | rpl::after_next([=](int count) {
setCloseByEscape(!count);
setCloseByOutsideClick(!count);

View File

@ -9,15 +9,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/abstract_box.h"
struct PollData;
namespace Ui {
class VerticalLayout;
} // namespace Ui
struct PollData;
namespace Main {
class Session;
} // namespace Main
class CreatePollBox : public BoxContent {
public:
CreatePollBox(QWidget*);
CreatePollBox(QWidget*, not_null<Main::Session*> session);
rpl::producer<PollData> submitRequests() const;
void submitFailed(const QString &error);
@ -32,6 +36,7 @@ private:
not_null<Ui::InputField*> setupQuestion(
not_null<Ui::VerticalLayout*> container);
const not_null<Main::Session*> _session;
Fn<void()> _setInnerFocus;
Fn<rpl::producer<bool>()> _dataIsValidValue;
rpl::event_stream<PollData> _submitRequests;

View File

@ -254,9 +254,11 @@ EditCaptionBox::EditCaptionBox(
_field->setMaxLength(Global::CaptionLengthMax());
_field->setSubmitSettings(Ui::InputField::SubmitSettings::Both);
_field->setInstantReplaces(Ui::InstantReplaces::Default());
_field->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
_field->setInstantReplacesEnabled(
_controller->session().settings().replaceEmojiValue());
_field->setMarkdownReplacesEnabled(rpl::single(true));
_field->setEditLinkCallback(DefaultEditLinkCallback(_field));
_field->setEditLinkCallback(
DefaultEditLinkCallback(&_controller->session(), _field));
auto r = object_ptr<Ui::SlideWrap<Ui::Checkbox>>(
this,
@ -627,7 +629,8 @@ void EditCaptionBox::prepare() {
});
Ui::Emoji::SuggestionsController::Init(
getDelegate()->outerContainer(),
_field);
_field,
&_controller->session());
setupEmojiPanel();

View File

@ -464,10 +464,11 @@ object_ptr<Ui::RpWidget> Controller::createTitleEdit() {
result->entity()->setMaxLength(kMaxGroupChannelTitle);
result->entity()->setInstantReplaces(Ui::InstantReplaces::Default());
result->entity()->setInstantReplacesEnabled(
Global::ReplaceEmojiValue());
_peer->session().settings().replaceEmojiValue());
Ui::Emoji::SuggestionsController::Init(
_wrap->window(),
result->entity());
result->entity(),
&_peer->session());
QObject::connect(
result->entity(),
@ -497,10 +498,11 @@ object_ptr<Ui::RpWidget> Controller::createDescriptionEdit() {
result->entity()->setMaxLength(kMaxChannelDescription);
result->entity()->setInstantReplaces(Ui::InstantReplaces::Default());
result->entity()->setInstantReplacesEnabled(
Global::ReplaceEmojiValue());
_peer->session().settings().replaceEmojiValue());
Ui::Emoji::SuggestionsController::Init(
_wrap->window(),
result->entity());
result->entity(),
&_peer->session());
QObject::connect(
result->entity(),

View File

@ -1652,12 +1652,15 @@ void SendFilesBox::setupCaption() {
Unexpected("action in MimeData hook.");
});
_caption->setInstantReplaces(Ui::InstantReplaces::Default());
_caption->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
_caption->setInstantReplacesEnabled(
_controller->session().settings().replaceEmojiValue());
_caption->setMarkdownReplacesEnabled(rpl::single(true));
_caption->setEditLinkCallback(DefaultEditLinkCallback(_caption));
_caption->setEditLinkCallback(
DefaultEditLinkCallback(&_controller->session(), _caption));
Ui::Emoji::SuggestionsController::Init(
getDelegate()->outerContainer(),
_caption);
_caption,
&_controller->session());
updateCaptionPlaceholder();
setupEmojiPanel();

View File

@ -199,9 +199,11 @@ void ShareBox::prepareCommentField() {
});
field->setInstantReplaces(Ui::InstantReplaces::Default());
field->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
field->setInstantReplacesEnabled(
_navigation->session().settings().replaceEmojiValue());
field->setMarkdownReplacesEnabled(rpl::single(true));
field->setEditLinkCallback(DefaultEditLinkCallback(field));
field->setEditLinkCallback(
DefaultEditLinkCallback(&_navigation->session(), field));
Ui::SendPendingMoveResizeEvents(_comment);
}
@ -266,7 +268,8 @@ void ShareBox::prepare() {
Ui::Emoji::SuggestionsController::Init(
getDelegate()->outerContainer(),
_comment->entity());
_comment->entity(),
&_navigation->session());
_select->raise();
}

View File

@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h"
#include "emoji_suggestions_data.h"
#include "emoji_suggestions_helper.h"
#include "window/window_session_controller.h"
#include "facades.h"
#include "styles/style_chat_helpers.h"
@ -822,7 +823,8 @@ void EmojiListWidget::setSelected(int newSelected) {
_selected = newSelected;
updateSelected();
if (_selected >= 0 && Global::SuggestEmoji()) {
if (_selected >= 0
&& controller()->session().settings().suggestEmoji()) {
Ui::Tooltip::Show(1000, this);
}

View File

@ -503,8 +503,10 @@ void SuggestionsWidget::leaveEventHook(QEvent *e) {
SuggestionsController::SuggestionsController(
not_null<QWidget*> outer,
not_null<QTextEdit*> field,
not_null<Main::Session*> session,
const Options &options)
: _field(field)
, _session(session)
, _showExactTimer([=] { showWithQuery(getEmojiQuery()); })
, _options(options) {
_container = base::make_unique_q<InnerDropdown>(
@ -557,11 +559,13 @@ SuggestionsController::SuggestionsController(
SuggestionsController *SuggestionsController::Init(
not_null<QWidget*> outer,
not_null<Ui::InputField*> field,
not_null<Main::Session*> session,
const Options &options) {
const auto result = Ui::CreateChild<SuggestionsController>(
field.get(),
outer,
field->rawTextEdit(),
session,
options);
result->setReplaceCallback([=](
int from,
@ -590,7 +594,8 @@ void SuggestionsController::setReplaceCallback(
}
void SuggestionsController::handleTextChange() {
if (Global::SuggestEmoji() && _field->textCursor().position() > 0) {
if (_session->settings().suggestEmoji()
&& _field->textCursor().position() > 0) {
Core::App().emojiKeywords().refresh();
}
@ -619,7 +624,7 @@ void SuggestionsController::showWithQuery(const QString &query) {
}
QString SuggestionsController::getEmojiQuery() {
if (!Global::SuggestEmoji()) {
if (!_session->settings().suggestEmoji()) {
return QString();
}

View File

@ -12,6 +12,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "base/unique_qptr.h"
#include "base/timer.h"
namespace Main {
class Session;
} // namespace Main
namespace Ui {
class InnerDropdown;
@ -106,6 +110,7 @@ public:
SuggestionsController(
not_null<QWidget*> outer,
not_null<QTextEdit*> field,
not_null<Main::Session*> session,
const Options &options);
void raise();
@ -117,6 +122,7 @@ public:
static SuggestionsController *Init(
not_null<QWidget*> outer,
not_null<Ui::InputField*> field,
not_null<Main::Session*> session,
const Options &options = Options());
private:
@ -137,6 +143,7 @@ private:
bool _ignoreCursorPositionChange = false;
bool _textChangeAfterKeyPress = false;
QPointer<QTextEdit> _field;
const not_null<Main::Session*> _session;
Fn<void(
int from,
int till,

View File

@ -25,8 +25,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "styles/style_widgets.h"
#include "styles/style_chat_helpers.h"
FieldAutocomplete::FieldAutocomplete(QWidget *parent)
FieldAutocomplete::FieldAutocomplete(
QWidget *parent,
not_null<Main::Session*> session)
: RpWidget(parent)
, _session(session)
, _scroll(this, st::mentionScroll) {
_scroll->setGeometry(rect());
@ -160,6 +163,7 @@ inline int indexOfInFirstN(const T &v, const U &elem, int last) {
internal::StickerRows FieldAutocomplete::getStickerSuggestions() {
const auto list = Stickers::GetListByEmoji(
_session,
_emoji,
_stickersSeed
);

View File

@ -21,6 +21,10 @@ class SinglePlayer;
class FrameRenderer;
} // namespace Lottie;
namespace Main {
class Session;
} // namespace Main
namespace internal {
struct StickerSuggestion {
@ -41,7 +45,7 @@ class FieldAutocomplete final : public Ui::RpWidget {
Q_OBJECT
public:
FieldAutocomplete(QWidget *parent);
FieldAutocomplete(QWidget *parent, not_null<Main::Session*> session);
~FieldAutocomplete();
bool clearFilteredBotCommands();
@ -104,6 +108,7 @@ private:
void recount(bool resetScroll = false);
internal::StickerRows getStickerSuggestions();
const not_null<Main::Session*> _session;
QPixmap _cache;
internal::MentionRows _mrows;
internal::HashtagRows _hrows;

View File

@ -63,6 +63,7 @@ class EditLinkBox : public BoxContent {
public:
EditLinkBox(
QWidget*,
not_null<Main::Session*> session,
const QString &text,
const QString &link,
Fn<void(QString, QString)> callback);
@ -73,6 +74,7 @@ protected:
void prepare() override;
private:
const not_null<Main::Session*> _session;
QString _startText;
QString _startLink;
Fn<void(QString, QString)> _callback;
@ -92,10 +94,12 @@ private:
EditLinkBox::EditLinkBox(
QWidget*,
not_null<Main::Session*> session,
const QString &text,
const QString &link,
Fn<void(QString, QString)> callback)
: _startText(text)
: _session(session)
, _startText(text)
, _startLink(link)
, _callback(std::move(callback)) {
Expects(_callback != nullptr);
@ -118,10 +122,12 @@ void EditLinkBox::prepare() {
_startText),
st::markdownLinkFieldPadding);
text->setInstantReplaces(Ui::InstantReplaces::Default());
text->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
text->setInstantReplacesEnabled(
_session->settings().replaceEmojiValue());
Ui::Emoji::SuggestionsController::Init(
getDelegate()->outerContainer(),
text);
text,
_session);
const auto url = content->add(
object_ptr<Ui::InputField>(
@ -340,6 +346,7 @@ Fn<bool(
QString text,
QString link,
EditLinkAction action)> DefaultEditLinkCallback(
not_null<Main::Session*> session,
not_null<Ui::InputField*> field) {
const auto weak = make_weak(field);
return [=](
@ -351,7 +358,7 @@ Fn<bool(
return Ui::InputField::IsValidMarkdownLink(link)
&& !IsMentionLink(link);
}
Ui::show(Box<EditLinkBox>(text, link, [=](
Ui::show(Box<EditLinkBox>(session, text, link, [=](
const QString &text,
const QString &link) {
if (const auto strong = weak.data()) {
@ -375,9 +382,11 @@ void InitMessageField(
field->customTab(true);
field->setInstantReplaces(Ui::InstantReplaces::Default());
field->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
field->setInstantReplacesEnabled(
controller->session().settings().replaceEmojiValue());
field->setMarkdownReplacesEnabled(rpl::single(true));
field->setEditLinkCallback(DefaultEditLinkCallback(field));
field->setEditLinkCallback(
DefaultEditLinkCallback(&controller->session(), field));
}
bool HasSendText(not_null<const Ui::InputField*> field) {

View File

@ -10,7 +10,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/input_fields.h"
#include "base/timer.h"
class HistoryWidget;
namespace Main {
class Session;
} // namespace Main
namespace Window {
class SessionController;
@ -33,6 +35,7 @@ Fn<bool(
QString text,
QString link,
Ui::InputField::EditLinkAction action)> DefaultEditLinkCallback(
not_null<Main::Session*> session,
not_null<Ui::InputField*> field);
void InitMessageField(
not_null<Window::SessionController*> controller,

View File

@ -708,6 +708,7 @@ void GifsReceived(const QVector<MTPDocument> &items, int32 hash) {
}
std::vector<not_null<DocumentData*>> GetListByEmoji(
not_null<Main::Session*> session,
not_null<EmojiPtr> emoji,
uint64 seed) {
const auto original = emoji->original();
@ -717,7 +718,7 @@ std::vector<not_null<DocumentData*>> GetListByEmoji(
TimeId date = 0;
};
auto result = std::vector<StickerWithDate>();
auto &sets = Auth().data().stickerSetsRef();
auto &sets = session->data().stickerSetsRef();
auto setsToRequest = base::flat_map<uint64, uint64>();
const auto add = [&](not_null<DocumentData*> document, TimeId date) {
@ -831,21 +832,21 @@ std::vector<not_null<DocumentData*>> GetListByEmoji(
};
addList(
Auth().data().stickerSetsOrder(),
session->data().stickerSetsOrder(),
MTPDstickerSet::Flag::f_archived);
//addList(
// Auth().data().featuredStickerSetsOrder(),
// session->data().featuredStickerSetsOrder(),
// MTPDstickerSet::Flag::f_installed_date);
if (!setsToRequest.empty()) {
for (const auto &[setId, accessHash] : setsToRequest) {
Auth().api().scheduleStickerSetRequest(setId, accessHash);
session->api().scheduleStickerSetRequest(setId, accessHash);
}
Auth().api().requestStickerSets();
session->api().requestStickerSets();
}
if (Global::SuggestStickersByEmoji()) {
const auto others = Auth().api().stickersByEmoji(original);
if (session->settings().suggestStickersByEmoji()) {
const auto others = session->api().stickersByEmoji(original);
if (!others) {
return {};
}

View File

@ -111,6 +111,7 @@ void FeaturedSetsReceived(
void GifsReceived(const QVector<MTPDocument> &items, int32 hash);
std::vector<not_null<DocumentData*>> GetListByEmoji(
not_null<Main::Session*> session,
not_null<EmojiPtr> emoji,
uint64 seed);
std::optional<std::vector<not_null<EmojiPtr>>> GetEmojiListFromSet(

View File

@ -411,10 +411,6 @@ struct Data {
QByteArray DownloadPathBookmark;
base::Observable<void> DownloadPathChanged;
bool ReplaceEmoji = true;
bool SuggestEmoji = true;
bool SuggestStickersByEmoji = true;
base::Observable<void> ReplaceEmojiChanged;
bool VoiceMsgPlaybackDoubled = false;
bool SoundNotify = true;
bool DesktopNotify = true;
@ -544,10 +540,6 @@ DefineVar(Global, QString, DownloadPath);
DefineVar(Global, QByteArray, DownloadPathBookmark);
DefineRefVar(Global, base::Observable<void>, DownloadPathChanged);
DefineVar(Global, bool, ReplaceEmoji);
DefineVar(Global, bool, SuggestEmoji);
DefineVar(Global, bool, SuggestStickersByEmoji);
DefineRefVar(Global, base::Observable<void>, ReplaceEmojiChanged);
DefineVar(Global, bool, VoiceMsgPlaybackDoubled);
DefineVar(Global, bool, SoundNotify);
DefineVar(Global, bool, DesktopNotify);
@ -580,14 +572,4 @@ DefineVar(Global, int, CallOutputVolume);
DefineVar(Global, int, CallInputVolume);
DefineVar(Global, bool, CallAudioDuckingEnabled);
rpl::producer<bool> ReplaceEmojiValue() {
return rpl::single(
Global::ReplaceEmoji()
) | rpl::then(base::ObservableViewer(
Global::RefReplaceEmojiChanged()
) | rpl::map([] {
return Global::ReplaceEmoji();
}));
}
} // namespace Global

View File

@ -265,10 +265,6 @@ DeclareVar(QString, DownloadPath);
DeclareVar(QByteArray, DownloadPathBookmark);
DeclareRefVar(base::Observable<void>, DownloadPathChanged);
DeclareVar(bool, ReplaceEmoji);
DeclareVar(bool, SuggestEmoji);
DeclareVar(bool, SuggestStickersByEmoji);
DeclareRefVar(base::Observable<void>, ReplaceEmojiChanged);
DeclareVar(bool, VoiceMsgPlaybackDoubled);
DeclareVar(bool, SoundNotify);
DeclareVar(bool, DesktopNotify);
@ -301,8 +297,6 @@ DeclareVar(int, CallOutputVolume);
DeclareVar(int, CallInputVolume);
DeclareVar(bool, CallAudioDuckingEnabled);
rpl::producer<bool> ReplaceEmojiValue();
} // namespace Global
namespace Adaptive {

View File

@ -258,7 +258,7 @@ HistoryWidget::HistoryWidget(
, _scroll(this, st::historyScroll, false)
, _historyDown(_scroll, st::historyToDown)
, _unreadMentions(_scroll, st::historyUnreadMentions)
, _fieldAutocomplete(this)
, _fieldAutocomplete(this, &session())
, _supportAutocomplete(session().supportMode()
? object_ptr<Support::Autocomplete>(this, &session())
: nullptr)
@ -407,7 +407,8 @@ HistoryWidget::HistoryWidget(
const auto suggestions = Ui::Emoji::SuggestionsController::Init(
this,
_field);
_field,
&controller->session());
_raiseEmojiSuggestions = [=] { suggestions->raise(); };
updateFieldSubmitSettings();

View File

@ -103,6 +103,10 @@ QByteArray Settings::serialize() const {
stream << qint32(_variables.skipArchiveInSearch.current() ? 1 : 0);
stream << qint32(_variables.autoplayGifs ? 1 : 0);
stream << qint32(_variables.loopAnimatedStickers ? 1 : 0);
stream << qint32(_variables.largeEmoji.current() ? 1 : 0);
stream << qint32(_variables.replaceEmoji.current() ? 1 : 0);
stream << qint32(_variables.suggestEmoji ? 1 : 0);
stream << qint32(_variables.suggestStickersByEmoji ? 1 : 0);
}
return result;
}
@ -145,6 +149,10 @@ void Settings::constructFromSerialized(const QByteArray &serialized) {
qint32 skipArchiveInSearch = _variables.skipArchiveInSearch.current() ? 1 : 0;
qint32 autoplayGifs = _variables.autoplayGifs ? 1 : 0;
qint32 loopAnimatedStickers = _variables.loopAnimatedStickers ? 1 : 0;
qint32 largeEmoji = _variables.largeEmoji.current() ? 1 : 0;
qint32 replaceEmoji = _variables.replaceEmoji.current() ? 1 : 0;
qint32 suggestEmoji = _variables.suggestEmoji ? 1 : 0;
qint32 suggestStickersByEmoji = _variables.suggestStickersByEmoji ? 1 : 0;
stream >> selectorTab;
stream >> lastSeenWarningSeen;
@ -239,6 +247,10 @@ void Settings::constructFromSerialized(const QByteArray &serialized) {
if (!stream.atEnd()) {
stream >> autoplayGifs;
stream >> loopAnimatedStickers;
stream >> largeEmoji;
stream >> replaceEmoji;
stream >> suggestEmoji;
stream >> suggestStickersByEmoji;
}
if (stream.status() != QDataStream::Ok) {
LOG(("App Error: "
@ -315,6 +327,10 @@ void Settings::constructFromSerialized(const QByteArray &serialized) {
_variables.skipArchiveInSearch = (skipArchiveInSearch == 1);
_variables.autoplayGifs = (autoplayGifs == 1);
_variables.loopAnimatedStickers = (loopAnimatedStickers == 1);
_variables.largeEmoji = (largeEmoji == 1);
_variables.replaceEmoji = (replaceEmoji == 1);
_variables.suggestEmoji = (suggestEmoji == 1);
_variables.suggestStickersByEmoji = (suggestStickersByEmoji == 1);
}
void Settings::setSupportChatsTimeSlice(int slice) {
@ -457,6 +473,34 @@ rpl::producer<bool> Settings::skipArchiveInSearchChanges() const {
return _variables.skipArchiveInSearch.changes();
}
void Settings::setLargeEmoji(bool value) {
_variables.largeEmoji = value;
}
bool Settings::largeEmoji() const {
return _variables.largeEmoji.current();
}
rpl::producer<bool> Settings::largeEmojiChanges() const {
return _variables.largeEmoji.changes();
}
void Settings::setReplaceEmoji(bool value) {
_variables.replaceEmoji = value;
}
bool Settings::replaceEmoji() const {
return _variables.replaceEmoji.current();
}
rpl::producer<bool> Settings::replaceEmojiValue() const {
return _variables.replaceEmoji.value();
}
rpl::producer<bool> Settings::replaceEmojiChanges() const {
return _variables.replaceEmoji.changes();
}
Session::Session(
not_null<Main::Account*> account,
const MTPUser &user)

View File

@ -69,83 +69,83 @@ public:
void moveFrom(Settings &&other) {
_variables = std::move(other._variables);
}
QByteArray serialize() const;
[[nodiscard]] QByteArray serialize() const;
void constructFromSerialized(const QByteArray &serialized);
void setLastSeenWarningSeen(bool lastSeenWarningSeen) {
_variables.lastSeenWarningSeen = lastSeenWarningSeen;
}
bool lastSeenWarningSeen() const {
[[nodiscard]] bool lastSeenWarningSeen() const {
return _variables.lastSeenWarningSeen;
}
void setSendFilesWay(SendFilesWay way) {
_variables.sendFilesWay = way;
}
SendFilesWay sendFilesWay() const {
[[nodiscard]] SendFilesWay sendFilesWay() const {
return _variables.sendFilesWay;
}
void setSendSubmitWay(Ui::InputSubmitSettings value) {
_variables.sendSubmitWay = value;
}
Ui::InputSubmitSettings sendSubmitWay() const {
[[nodiscard]] Ui::InputSubmitSettings sendSubmitWay() const {
return _variables.sendSubmitWay;
}
void setSupportSwitch(Support::SwitchSettings value) {
_variables.supportSwitch = value;
}
Support::SwitchSettings supportSwitch() const {
[[nodiscard]] Support::SwitchSettings supportSwitch() const {
return _variables.supportSwitch;
}
void setSupportFixChatsOrder(bool fix) {
_variables.supportFixChatsOrder = fix;
}
bool supportFixChatsOrder() const {
[[nodiscard]] bool supportFixChatsOrder() const {
return _variables.supportFixChatsOrder;
}
void setSupportTemplatesAutocomplete(bool enabled) {
_variables.supportTemplatesAutocomplete = enabled;
}
bool supportTemplatesAutocomplete() const {
[[nodiscard]] bool supportTemplatesAutocomplete() const {
return _variables.supportTemplatesAutocomplete;
}
void setSupportChatsTimeSlice(int slice);
int supportChatsTimeSlice() const;
rpl::producer<int> supportChatsTimeSliceValue() const;
[[nodiscard]] int supportChatsTimeSlice() const;
[[nodiscard]] rpl::producer<int> supportChatsTimeSliceValue() const;
void setSupportAllSearchResults(bool all);
bool supportAllSearchResults() const;
rpl::producer<bool> supportAllSearchResultsValue() const;
[[nodiscard]] bool supportAllSearchResults() const;
[[nodiscard]] rpl::producer<bool> supportAllSearchResultsValue() const;
ChatHelpers::SelectorTab selectorTab() const {
[[nodiscard]] ChatHelpers::SelectorTab selectorTab() const {
return _variables.selectorTab;
}
void setSelectorTab(ChatHelpers::SelectorTab tab) {
_variables.selectorTab = tab;
}
bool tabbedSelectorSectionEnabled() const {
[[nodiscard]] bool tabbedSelectorSectionEnabled() const {
return _variables.tabbedSelectorSectionEnabled;
}
void setTabbedSelectorSectionEnabled(bool enabled);
bool thirdSectionInfoEnabled() const {
[[nodiscard]] bool thirdSectionInfoEnabled() const {
return _variables.thirdSectionInfoEnabled;
}
void setThirdSectionInfoEnabled(bool enabled);
rpl::producer<bool> thirdSectionInfoEnabledValue() const;
int thirdSectionExtendedBy() const {
[[nodiscard]] rpl::producer<bool> thirdSectionInfoEnabledValue() const;
[[nodiscard]] int thirdSectionExtendedBy() const {
return _variables.thirdSectionExtendedBy;
}
void setThirdSectionExtendedBy(int savedValue) {
_variables.thirdSectionExtendedBy = savedValue;
}
bool tabbedReplacedWithInfo() const {
[[nodiscard]] bool tabbedReplacedWithInfo() const {
return _tabbedReplacedWithInfo;
}
void setTabbedReplacedWithInfo(bool enabled);
rpl::producer<bool> tabbedReplacedWithInfoValue() const;
[[nodiscard]] rpl::producer<bool> tabbedReplacedWithInfoValue() const;
void setSmallDialogsList(bool enabled) {
_variables.smallDialogsList = enabled;
}
bool smallDialogsList() const {
[[nodiscard]] bool smallDialogsList() const {
return _variables.smallDialogsList;
}
void setSoundOverride(const QString &key, const QString &path) {
@ -154,99 +154,118 @@ public:
void clearSoundOverrides() {
_variables.soundOverrides.clear();
}
QString getSoundPath(const QString &key) const;
[[nodiscard]] QString getSoundPath(const QString &key) const;
void setTabbedSelectorSectionTooltipShown(int shown) {
_variables.tabbedSelectorSectionTooltipShown = shown;
}
int tabbedSelectorSectionTooltipShown() const {
[[nodiscard]] int tabbedSelectorSectionTooltipShown() const {
return _variables.tabbedSelectorSectionTooltipShown;
}
void setFloatPlayerColumn(Window::Column column) {
_variables.floatPlayerColumn = column;
}
Window::Column floatPlayerColumn() const {
[[nodiscard]] Window::Column floatPlayerColumn() const {
return _variables.floatPlayerColumn;
}
void setFloatPlayerCorner(RectPart corner) {
_variables.floatPlayerCorner = corner;
}
RectPart floatPlayerCorner() const {
[[nodiscard]] RectPart floatPlayerCorner() const {
return _variables.floatPlayerCorner;
}
void setDialogsWidthRatio(float64 ratio);
float64 dialogsWidthRatio() const;
rpl::producer<float64> dialogsWidthRatioChanges() const;
[[nodiscard]] float64 dialogsWidthRatio() const;
[[nodiscard]] rpl::producer<float64> dialogsWidthRatioChanges() const;
void setThirdColumnWidth(int width);
int thirdColumnWidth() const;
rpl::producer<int> thirdColumnWidthChanges() const;
[[nodiscard]] int thirdColumnWidth() const;
[[nodiscard]] rpl::producer<int> thirdColumnWidthChanges() const;
void setGroupStickersSectionHidden(PeerId peerId) {
_variables.groupStickersSectionHidden.insert(peerId);
}
bool isGroupStickersSectionHidden(PeerId peerId) const {
[[nodiscard]] bool isGroupStickersSectionHidden(PeerId peerId) const {
return _variables.groupStickersSectionHidden.contains(peerId);
}
void removeGroupStickersSectionHidden(PeerId peerId) {
_variables.groupStickersSectionHidden.remove(peerId);
}
Data::AutoDownload::Full &autoDownload() {
[[nodiscard]] Data::AutoDownload::Full &autoDownload() {
return _variables.autoDownload;
}
const Data::AutoDownload::Full &autoDownload() const {
[[nodiscard]] const Data::AutoDownload::Full &autoDownload() const {
return _variables.autoDownload;
}
void setArchiveCollapsed(bool collapsed);
bool archiveCollapsed() const;
rpl::producer<bool> archiveCollapsedChanges() const;
[[nodiscard]] bool archiveCollapsed() const;
[[nodiscard]] rpl::producer<bool> archiveCollapsedChanges() const;
void setArchiveInMainMenu(bool inMainMenu);
bool archiveInMainMenu() const;
rpl::producer<bool> archiveInMainMenuChanges() const;
[[nodiscard]] bool archiveInMainMenu() const;
[[nodiscard]] rpl::producer<bool> archiveInMainMenuChanges() const;
void setNotifyAboutPinned(bool notify);
bool notifyAboutPinned() const;
rpl::producer<bool> notifyAboutPinnedChanges() const;
[[nodiscard]] bool notifyAboutPinned() const;
[[nodiscard]] rpl::producer<bool> notifyAboutPinnedChanges() const;
void setSkipArchiveInSearch(bool skip);
bool skipArchiveInSearch() const;
rpl::producer<bool> skipArchiveInSearchChanges() const;
[[nodiscard]] bool skipArchiveInSearch() const;
[[nodiscard]] rpl::producer<bool> skipArchiveInSearchChanges() const;
bool hadLegacyCallsPeerToPeerNobody() const {
[[nodiscard]] bool hadLegacyCallsPeerToPeerNobody() const {
return _variables.hadLegacyCallsPeerToPeerNobody;
}
bool includeMutedCounter() const {
[[nodiscard]] bool includeMutedCounter() const {
return _variables.includeMutedCounter;
}
void setIncludeMutedCounter(bool value) {
_variables.includeMutedCounter = value;
}
bool countUnreadMessages() const {
[[nodiscard]] bool countUnreadMessages() const {
return _variables.countUnreadMessages;
}
void setCountUnreadMessages(bool value) {
_variables.countUnreadMessages = value;
}
bool exeLaunchWarning() const {
[[nodiscard]] bool exeLaunchWarning() const {
return _variables.exeLaunchWarning;
}
void setExeLaunchWarning(bool warning) {
_variables.exeLaunchWarning = warning;
}
bool autoplayGifs() const {
[[nodiscard]] bool autoplayGifs() const {
return _variables.autoplayGifs;
}
void setAutoplayGifs(bool value) {
_variables.autoplayGifs = value;
}
bool loopAnimatedStickers() const {
[[nodiscard]] bool loopAnimatedStickers() const {
return _variables.loopAnimatedStickers;
}
void setLoopAnimatedStickers(bool value) {
_variables.loopAnimatedStickers = value;
}
void setLargeEmoji(bool value);
[[nodiscard]] bool largeEmoji() const;
[[nodiscard]] rpl::producer<bool> largeEmojiChanges() const;
void setReplaceEmoji(bool value);
[[nodiscard]] bool replaceEmoji() const;
[[nodiscard]] rpl::producer<bool> replaceEmojiValue() const;
[[nodiscard]] rpl::producer<bool> replaceEmojiChanges() const;
[[nodiscard]] bool suggestEmoji() const {
return _variables.suggestEmoji;
}
void setSuggestEmoji(bool value) {
_variables.suggestEmoji = value;
}
[[nodiscard]] bool suggestStickersByEmoji() const {
return _variables.suggestStickersByEmoji;
}
void setSuggestStickersByEmoji(bool value) {
_variables.suggestStickersByEmoji = value;
}
private:
struct Variables {
@ -283,6 +302,10 @@ private:
rpl::variable<bool> skipArchiveInSearch = false;
bool autoplayGifs = true;
bool loopAnimatedStickers = true;
rpl::variable<bool> largeEmoji = true;
rpl::variable<bool> replaceEmoji = true;
bool suggestEmoji = true;
bool suggestStickersByEmoji = true;
static constexpr auto kDefaultSupportChatsLimitSlice
= 7 * 24 * 60 * 60;

View File

@ -441,20 +441,6 @@ void SetupPerformance(
}
session->saveSettingsDelayed();
}, container->lifetime());
AddButton(
container,
tr::lng_settings_loop_stickers(),
st::settingsButton
)->toggleOn(
rpl::single(session->settings().loopAnimatedStickers())
)->toggledValue(
) | rpl::filter([=](bool enabled) {
return enabled != session->settings().loopAnimatedStickers();
}) | rpl::start_with_next([=](bool enabled) {
session->settings().setLoopAnimatedStickers(enabled);
session->saveSettingsDelayed();
}, container->lifetime());
}
void SetupSystemIntegration(

View File

@ -426,12 +426,16 @@ QString DownloadPathText() {
return QDir::toNativeSeparators(Global::DownloadPath());
}
void SetupStickersEmoji(not_null<Ui::VerticalLayout*> container) {
void SetupStickersEmoji(
not_null<Window::SessionController*> controller,
not_null<Ui::VerticalLayout*> container) {
AddDivider(container);
AddSkip(container);
AddSubsectionTitle(container, tr::lng_settings_stickers_emoji());
const auto session = &controller->session();
auto wrap = object_ptr<Ui::VerticalLayout>(container);
const auto inner = wrap.data();
container->add(object_ptr<Ui::OverrideMargins>(
@ -455,29 +459,45 @@ void SetupStickersEmoji(not_null<Ui::VerticalLayout*> container) {
std::move(handle),
inner->lifetime());
};
add(
tr::lng_settings_large_emoji(tr::now),
session->settings().largeEmoji(),
[=](bool checked) {
session->settings().setLargeEmoji(checked);
session->saveSettingsDelayed();
});
add(
tr::lng_settings_replace_emojis(tr::now),
Global::ReplaceEmoji(),
[](bool checked) {
Global::SetReplaceEmoji(checked);
Global::RefReplaceEmojiChanged().notify();
Local::writeUserSettings();
session->settings().replaceEmoji(),
[=](bool checked) {
session->settings().setReplaceEmoji(checked);
session->saveSettingsDelayed();
});
add(
tr::lng_settings_suggest_emoji(tr::now),
Global::SuggestEmoji(),
[](bool checked) {
Global::SetSuggestEmoji(checked);
Local::writeUserSettings();
session->settings().suggestEmoji(),
[=](bool checked) {
session->settings().setSuggestEmoji(checked);
session->saveSettingsDelayed();
});
add(
tr::lng_settings_suggest_by_emoji(tr::now),
Global::SuggestStickersByEmoji(),
[](bool checked) {
Global::SetSuggestStickersByEmoji(checked);
Local::writeUserSettings();
session->settings().suggestStickersByEmoji(),
[=](bool checked) {
session->settings().setSuggestStickersByEmoji(checked);
session->saveSettingsDelayed();
});
add(
tr::lng_settings_loop_stickers(tr::now),
session->settings().loopAnimatedStickers(),
[=](bool checked) {
session->settings().setLoopAnimatedStickers(checked);
session->saveSettingsDelayed();
});
AddButton(
@ -1069,7 +1089,7 @@ void Chat::setupContent(not_null<Window::SessionController*> controller) {
SetupThemeOptions(content);
SetupChatBackground(controller, content);
SetupStickersEmoji(content);
SetupStickersEmoji(controller, content);
SetupMessages(controller, content);
Ui::ResizeFitChild(this, content);

View File

@ -388,8 +388,12 @@ BioManager SetupBio(
});
QObject::connect(bio, &Ui::InputField::changed, updated);
bio->setInstantReplaces(Ui::InstantReplaces::Default());
bio->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
Ui::Emoji::SuggestionsController::Init(container->window(), bio);
bio->setInstantReplacesEnabled(
self->session().settings().replaceEmojiValue());
Ui::Emoji::SuggestionsController::Init(
container->window(),
bio,
&self->session());
updated();
container->add(

View File

@ -550,7 +550,7 @@ enum {
// 0x10 reserved
dbiDefaultAttach = 0x11,
dbiCatsAndDogs = 0x12,
dbiReplaceEmoji = 0x13,
dbiReplaceEmojiOld = 0x13,
dbiAskDownloadPath = 0x14,
dbiDownloadPathOld = 0x15,
dbiScaleOld = 0x16,
@ -602,8 +602,8 @@ enum {
dbiLangPackKey = 0x4e,
dbiConnectionType = 0x4f,
dbiStickersFavedLimit = 0x50,
dbiSuggestStickersByEmoji = 0x51,
dbiSuggestEmoji = 0x52,
dbiSuggestStickersByEmojiOld = 0x51,
dbiSuggestEmojiOld = 0x52,
dbiTxtDomainStringOld = 0x53,
dbiThemeKey = 0x54,
dbiTileBackground = 0x55,
@ -1590,28 +1590,28 @@ bool _readSetting(quint32 blockId, QDataStream &stream, int version, ReadSetting
Global::RefLocalPasscodeChanged().notify();
} break;
case dbiReplaceEmoji: {
case dbiReplaceEmojiOld: {
qint32 v;
stream >> v;
if (!_checkStreamStatus(stream)) return false;
Global::SetReplaceEmoji(v == 1);
GetStoredSessionSettings().setReplaceEmoji(v == 1);
} break;
case dbiSuggestEmoji: {
case dbiSuggestEmojiOld: {
qint32 v;
stream >> v;
if (!_checkStreamStatus(stream)) return false;
Global::SetSuggestEmoji(v == 1);
GetStoredSessionSettings().setSuggestEmoji(v == 1);
} break;
case dbiSuggestStickersByEmoji: {
case dbiSuggestStickersByEmojiOld: {
qint32 v;
stream >> v;
if (!_checkStreamStatus(stream)) return false;
Global::SetSuggestStickersByEmoji(v == 1);
GetStoredSessionSettings().setSuggestStickersByEmoji(v == 1);
} break;
case dbiDefaultAttach: {
@ -2071,9 +2071,6 @@ void _writeUserSettings() {
<< qint32(Window::Theme::Background()->tileNight() ? 1 : 0);
data.stream << quint32(dbiAdaptiveForWide) << qint32(Global::AdaptiveForWide() ? 1 : 0);
data.stream << quint32(dbiAutoLock) << qint32(Global::AutoLock());
data.stream << quint32(dbiReplaceEmoji) << qint32(Global::ReplaceEmoji() ? 1 : 0);
data.stream << quint32(dbiSuggestEmoji) << qint32(Global::SuggestEmoji() ? 1 : 0);
data.stream << quint32(dbiSuggestStickersByEmoji) << qint32(Global::SuggestStickersByEmoji() ? 1 : 0);
data.stream << quint32(dbiSoundNotify) << qint32(Global::SoundNotify());
data.stream << quint32(dbiDesktopNotify) << qint32(Global::DesktopNotify());
data.stream << quint32(dbiNotifyView) << qint32(Global::NotifyView());

View File

@ -30,6 +30,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "apiwrap.h"
#include "styles/style_boxes.h"
namespace Main {
class Session;
} // namespace Main
namespace Support {
namespace {
@ -41,6 +45,7 @@ class EditInfoBox : public BoxContent {
public:
EditInfoBox(
QWidget*,
not_null<Main::Session*> session,
const TextWithTags &text,
Fn<void(TextWithTags, Fn<void(bool success)>)> submit);
@ -49,6 +54,7 @@ protected:
void setInnerFocus() override;
private:
not_null<Main::Session*> _session;
object_ptr<Ui::InputField> _field = { nullptr };
Fn<void(TextWithTags, Fn<void(bool success)>)> _submit;
@ -56,9 +62,11 @@ private:
EditInfoBox::EditInfoBox(
QWidget*,
not_null<Main::Session*> session,
const TextWithTags &text,
Fn<void(TextWithTags, Fn<void(bool success)>)> submit)
: _field(
: _session(session)
, _field(
this,
st::supportInfoField,
Ui::InputField::Mode::MultiLine,
@ -68,9 +76,10 @@ EditInfoBox::EditInfoBox(
_field->setMaxLength(kMaxSupportInfoLength);
_field->setSubmitSettings(Ui::InputField::SubmitSettings::Both);
_field->setInstantReplaces(Ui::InstantReplaces::Default());
_field->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
_field->setInstantReplacesEnabled(
session->settings().replaceEmojiValue());
_field->setMarkdownReplacesEnabled(rpl::single(true));
_field->setEditLinkCallback(DefaultEditLinkCallback(_field));
_field->setEditLinkCallback(DefaultEditLinkCallback(session, _field));
}
void EditInfoBox::prepare() {
@ -93,7 +102,8 @@ void EditInfoBox::prepare() {
connect(_field, &Ui::InputField::cancelled, [=] { closeBox(); });
Ui::Emoji::SuggestionsController::Init(
getDelegate()->outerContainer(),
_field);
_field,
_session);
auto cursor = _field->textCursor();
cursor.movePosition(QTextCursor::End);
@ -503,7 +513,9 @@ void Helper::showEditInfoBox(not_null<UserData*> user) {
ConvertTextTagsToEntities(result.tags)
}, done);
};
Ui::show(Box<EditInfoBox>(editData, save), LayerOption::KeepOther);
Ui::show(
Box<EditInfoBox>(&user->session(), editData, save),
LayerOption::KeepOther);
}
void Helper::saveInfo(

View File

@ -800,7 +800,8 @@ void Notification::showReplyField() {
_replyArea->setMaxLength(MaxMessageSize);
_replyArea->setSubmitSettings(Ui::InputField::SubmitSettings::Both);
_replyArea->setInstantReplaces(Ui::InstantReplaces::Default());
_replyArea->setInstantReplacesEnabled(Global::ReplaceEmojiValue());
_replyArea->setInstantReplacesEnabled(
_item->history()->session().settings().replaceEmojiValue());
_replyArea->setMarkdownReplacesEnabled(rpl::single(true));
// Catch mouse press event to activate the window.

View File

@ -167,7 +167,16 @@ protected:
class Notification : public Widget {
public:
Notification(Manager *manager, History *history, PeerData *peer, PeerData *author, HistoryItem *item, int forwardedCount, QPoint startPosition, int shift, Direction shiftDirection);
Notification(
Manager *manager,
History *history,
PeerData *peer,
PeerData *author,
HistoryItem *item,
int forwardedCount,
QPoint startPosition,
int shift,
Direction shiftDirection);
void startHiding();
void stopHiding();

View File

@ -698,7 +698,7 @@ void PeerMenuShareContactBox(
}
void PeerMenuCreatePoll(not_null<PeerData*> peer) {
const auto box = Ui::show(Box<CreatePollBox>());
const auto box = Ui::show(Box<CreatePollBox>(&peer->session()));
const auto lock = box->lifetime().make_state<bool>(false);
box->submitRequests(
) | rpl::start_with_next([=](const PollData &result) {