Section dummies for new Settings.

This commit is contained in:
John Preston 2018-09-05 22:05:49 +03:00
parent 4f16ad6757
commit f0d092f126
34 changed files with 823 additions and 18 deletions

View File

@ -2127,6 +2127,7 @@ void UpdateApplication() {
cSetLastUpdateCheck(0);
Core::UpdateChecker().start();
if (const auto window = App::wnd()) {
// #TODO settings
auto settings = Box<OldSettings::Widget>();
const auto weak = make_weak(settings.data());
window->showSpecialLayer(std::move(settings), anim::type::normal);

View File

@ -160,10 +160,6 @@ void ContentWidget::setScrollTopSkip(int scrollTopSkip) {
_scrollTopSkip = scrollTopSkip;
}
rpl::producer<Section> ContentWidget::sectionRequest() const {
return rpl::never<Section>();
}
rpl::producer<int> ContentWidget::scrollHeightValue() const {
return _scroll->heightValue();
}
@ -253,4 +249,18 @@ void ContentWidget::refreshSearchField(bool shown) {
}
}
Key ContentMemento::key() const {
if (const auto peerId = this->peerId()) {
return Key(App::peer(peerId));
} else if (const auto feed = this->feed()) {
return Key(feed);
} else {
return Settings::Tag{ settingsSelf() };
}
}
ContentMemento::ContentMemento(Settings::Tag settings)
: _settingsSelf(settings.self.get()) {
}
} // namespace Info

View File

@ -28,6 +28,9 @@ class Feed;
} // namespace Data
namespace Info {
namespace Settings {
struct Tag;
} // namespace Settings
class ContentMemento;
class Controller;
@ -42,7 +45,6 @@ public:
not_null<ContentMemento*> memento) = 0;
std::unique_ptr<ContentMemento> createMemento();
virtual rpl::producer<Section> sectionRequest() const;
virtual void setIsStackBottom(bool isStackBottom) {
}
@ -119,9 +121,9 @@ public:
: _peerId(peerId)
, _migratedPeerId(migratedPeerId) {
}
explicit ContentMemento(not_null<Data::Feed*> feed)
: _feed(feed) {
explicit ContentMemento(not_null<Data::Feed*> feed) : _feed(feed) {
}
explicit ContentMemento(Settings::Tag settings);
virtual object_ptr<ContentWidget> createWidget(
QWidget *parent,
@ -137,6 +139,10 @@ public:
Data::Feed *feed() const {
return _feed;
}
UserData *settingsSelf() const {
return _settingsSelf;
}
Key key() const;
virtual Section section() const = 0;
@ -171,6 +177,7 @@ private:
const PeerId _peerId = 0;
const PeerId _migratedPeerId = 0;
Data::Feed * const _feed = nullptr;
UserData * const _settingsSelf = nullptr;
int _scrollTop = 0;
QString _searchFieldQuery;
bool _searchEnabledByContent = false;

View File

@ -38,6 +38,9 @@ Key::Key(not_null<PeerData*> peer) : _value(peer) {
Key::Key(not_null<Data::Feed*> feed) : _value(feed) {
}
Key::Key(Settings::Tag settings) : _value(settings) {
}
PeerData *Key::peer() const {
if (const auto peer = base::get_if<not_null<PeerData*>>(&_value)) {
return *peer;
@ -52,6 +55,13 @@ Data::Feed *Key::feed() const {
return nullptr;
}
UserData *Key::settingsSelf() const {
if (const auto tag = base::get_if<Settings::Tag>(&_value)) {
return tag->self;
}
return nullptr;
}
rpl::producer<SparseIdsMergedSlice> AbstractController::mediaSource(
SparseIdsMergedSlice::UniversalMsgId aroundId,
int limitBefore,
@ -88,9 +98,7 @@ Controller::Controller(
not_null<ContentMemento*> memento)
: AbstractController(window)
, _widget(widget)
, _key(memento->peerId()
? Key(App::peer(memento->peerId()))
: Key(memento->feed()))
, _key(memento->key())
, _migrated(memento->migratedPeerId()
? App::peer(memento->migratedPeerId())
: nullptr)
@ -135,7 +143,8 @@ bool Controller::validateMementoPeer(
not_null<ContentMemento*> memento) const {
return memento->peerId() == peerId()
&& memento->migratedPeerId() == migratedPeerId()
&& memento->feed() == feed();
&& memento->feed() == feed()
&& memento->settingsSelf() == settingsSelf();
}
void Controller::setSection(not_null<ContentMemento*> memento) {

View File

@ -10,23 +10,39 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include <rpl/variable.h>
#include "data/data_search_controller.h"
#include "window/window_controller.h"
#include "settings/settings_common.h"
namespace Ui {
class SearchFieldController;
} // namespace Ui
namespace Info {
namespace Settings {
struct Tag {
explicit Tag(not_null<UserData*> self) : self(self) {
}
not_null<UserData*> self;
};
} // namespace Settings
class Key {
public:
Key(not_null<PeerData*> peer);
Key(not_null<Data::Feed*> feed);
Key(Settings::Tag settings);
PeerData *peer() const;
Data::Feed *feed() const;
UserData *settingsSelf() const;
private:
base::variant<not_null<PeerData*>, not_null<Data::Feed*>> _value;
base::variant<
not_null<PeerData*>,
not_null<Data::Feed*>,
Settings::Tag> _value;
};
@ -43,28 +59,41 @@ public:
CommonGroups,
Members,
Channels,
Settings,
};
using SettingsType = ::Settings::Type;
using MediaType = Storage::SharedMediaType;
Section(Type type) : _type(type) {
Expects(type != Type::Media);
Expects(type != Type::Media && type != Type::Settings);
}
Section(MediaType mediaType)
: _type(Type::Media)
, _mediaType(mediaType) {
}
Section(SettingsType settingsType)
: _type(Type::Settings)
, _settingsType(settingsType) {
}
Type type() const {
return _type;
}
MediaType mediaType() const {
Expects(_type == Type::Media);
return _mediaType;
}
SettingsType settingsType() const {
Expects(_type == Type::Settings);
return _settingsType;
}
private:
Type _type;
Storage::SharedMediaType _mediaType;
MediaType _mediaType = MediaType();
SettingsType _settingsType = SettingsType();
};
@ -93,6 +122,9 @@ public:
Data::Feed *feed() const {
return key().feed();
}
UserData *settingsSelf() const {
return key().settingsSelf();
}
virtual void setSearchEnabledByContent(bool enabled) {
}

View File

@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "info/channels/info_channels_widget.h"
#include "info/common_groups/info_common_groups_widget.h"
#include "info/feed/info_feed_profile_widget.h"
#include "info/settings/info_settings_widget.h"
#include "info/info_section_widget.h"
#include "info/info_layer_widget.h"
#include "info/info_controller.h"
@ -32,6 +33,10 @@ Memento::Memento(not_null<Data::Feed*> feed, Section section)
: Memento(DefaultStack(feed, section)) {
}
Memento::Memento(Settings::Tag settings, Section section)
: Memento(DefaultStack(settings, section)) {
}
Memento::Memento(std::vector<std::unique_ptr<ContentMemento>> stack)
: _stack(std::move(stack)) {
}
@ -52,6 +57,16 @@ std::vector<std::unique_ptr<ContentMemento>> Memento::DefaultStack(
return result;
}
std::vector<std::unique_ptr<ContentMemento>> Memento::DefaultStack(
Settings::Tag settings,
Section section) {
auto result = std::vector<std::unique_ptr<ContentMemento>>();
result.push_back(std::make_unique<Settings::Memento>(
settings.self,
section.settingsType()));
return result;
}
Section Memento::DefaultSection(Dialogs::Key key) {
if (const auto peer = key.peer()) {
if (peer->isSelf()) {

View File

@ -26,16 +26,20 @@ struct ScrollToRequest;
} // namespace Ui
namespace Info {
namespace Settings {
struct Tag;
} // namespace Settings
class ContentMemento;
class WrapWidget;
class Memento final : public Window::SectionMemento {
public:
Memento(PeerId peerId);
explicit Memento(PeerId peerId);
Memento(PeerId peerId, Section section);
Memento(not_null<Data::Feed*> feed, Section section);
Memento(std::vector<std::unique_ptr<ContentMemento>> stack);
Memento(Settings::Tag settings, Section section);
explicit Memento(std::vector<std::unique_ptr<ContentMemento>> stack);
object_ptr<Window::SectionWidget> createWidget(
QWidget *parent,
@ -54,6 +58,7 @@ public:
not_null<ContentMemento*> content() {
Expects(!_stack.empty());
return _stack.back().get();
}
@ -69,6 +74,9 @@ private:
static std::vector<std::unique_ptr<ContentMemento>> DefaultStack(
not_null<Data::Feed*> feed,
Section section);
static std::vector<std::unique_ptr<ContentMemento>> DefaultStack(
Settings::Tag settings,
Section section);
static std::unique_ptr<ContentMemento> DefaultContent(
not_null<Data::Feed*> feed,
Section section);

View File

@ -587,6 +587,22 @@ rpl::producer<QString> TitleValue(
case Section::Type::Channels:
return lng_info_feed_channels;
case Section::Type::Settings:
switch (section.settingsType()) {
case Section::SettingsType::Main:
return lng_menu_settings;
case Section::SettingsType::Information:
return lng_settings_section_info;
case Section::SettingsType::Notifications:
return lng_settings_section_notify;
case Section::SettingsType::PrivacySecurity:
return lng_settings_section_privacy;
case Section::SettingsType::General:
return lng_settings_section_general;
case Section::SettingsType::Chat:
return lng_settings_section_chat_settings;
}
Unexpected("Bad settings type in Info::TitleValue()");
}
Unexpected("Bad section type in Info::TitleValue()");
}());

View File

@ -200,6 +200,8 @@ Dialogs::RowDescriptor WrapWidget::activeChat() const {
return Dialogs::RowDescriptor(App::history(peer), FullMsgId());
} else if (const auto feed = key().feed()) {
return Dialogs::RowDescriptor(feed, FullMsgId());
} else if (key().settingsSelf()) {
return Dialogs::RowDescriptor();
}
Unexpected("Owner in WrapWidget::activeChat().");
}
@ -512,6 +514,10 @@ void WrapWidget::showProfileMenu() {
feed,
addAction,
Window::PeerMenuSource::Profile);
} else if (const auto self = key().settingsSelf()) {
// #TODO settings top menu
_topBarMenu = nullptr;
return;
} else {
_topBarMenu = nullptr;
return;

View File

@ -97,7 +97,7 @@ bool Widget::showInternal(not_null<ContentMemento*> memento) {
if (!controller()->validateMementoPeer(memento)) {
return false;
}
if (auto mediaMemento = dynamic_cast<Memento*>(memento.get())) {
if (const auto mediaMemento = dynamic_cast<Memento*>(memento.get())) {
if (_inner->showInternal(mediaMemento)) {
return true;
}

View File

@ -0,0 +1,91 @@
/*
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 "info/settings/info_settings_widget.h"
#include "info/info_memento.h"
#include "settings/settings_common.h"
namespace Info {
namespace Settings {
Memento::Memento(not_null<UserData*> self, Type type)
: ContentMemento(Tag{ self })
, _type(type) {
}
Section Memento::section() const {
return Section(_type);
}
object_ptr<ContentWidget> Memento::createWidget(
QWidget *parent,
not_null<Controller*> controller,
const QRect &geometry) {
auto result = object_ptr<Widget>(
parent,
controller);
result->setInternalState(geometry, this);
return std::move(result);
}
Memento::~Memento() = default;
Widget::Widget(
QWidget *parent,
not_null<Controller*> controller)
: ContentWidget(parent, controller)
, _self(controller->key().settingsSelf())
, _type(controller->section().settingsType()) {
const auto inner = setInnerWidget(
::Settings::CreateSection(_type, this, _self));
inner->sectionShowOther(
) | rpl::start_with_next([=](Type type) {
this->controller()->showSettings(type);
}, inner->lifetime());
}
not_null<UserData*> Widget::self() const {
return _self;
}
bool Widget::showInternal(not_null<ContentMemento*> memento) {
//if (const auto myMemento = dynamic_cast<Memento*>(memento.get())) {
// Assert(myMemento->self() == self());
// if (_inner->showInternal(myMemento)) {
// return true;
// }
//}
return false;
}
void Widget::setInternalState(
const QRect &geometry,
not_null<Memento*> memento) {
setGeometry(geometry);
Ui::SendPendingMoveResizeEvents(this);
restoreState(memento);
}
std::unique_ptr<ContentMemento> Widget::doCreateMemento() {
auto result = std::make_unique<Memento>(self(), _type);
saveState(result.get());
return std::move(result);
}
void Widget::saveState(not_null<Memento*> memento) {
memento->setScrollTop(scrollTopSave());
}
void Widget::restoreState(not_null<Memento*> memento) {
const auto scrollTop = memento->scrollTop();
scrollTopRestore(memento->scrollTop());
}
} // namespace Settings
} // namespace Info

View File

@ -0,0 +1,74 @@
/*
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
*/
#pragma once
#include "info/info_content_widget.h"
#include "info/info_controller.h"
namespace Info {
namespace Settings {
using Type = Section::SettingsType;
struct Tag;
class InnerWidget;
class Memento final : public ContentMemento {
public:
Memento(not_null<UserData*> self, Type type);
object_ptr<ContentWidget> createWidget(
QWidget *parent,
not_null<Controller*> controller,
const QRect &geometry) override;
Section section() const override;
Type type() const {
return _type;
}
not_null<UserData*> self() const {
return settingsSelf();
}
~Memento();
private:
Type _type = Type();
};
class Widget final : public ContentWidget {
public:
Widget(
QWidget *parent,
not_null<Controller*> controller);
not_null<UserData*> self() const;
bool showInternal(
not_null<ContentMemento*> memento) override;
void setInternalState(
const QRect &geometry,
not_null<Memento*> memento);
private:
void saveState(not_null<Memento*> memento);
void restoreState(not_null<Memento*> memento);
std::unique_ptr<ContentMemento> doCreateMemento() override;
not_null<UserData*> _self;
Type _type = Type();
};
} // namespace Settings
} // namespace Info

View File

@ -302,7 +302,12 @@ void MainWindow::setupMain(const MTPUser *self) {
void MainWindow::showSettings() {
if (isHidden()) showFromTray();
controller()->showSpecialLayer(Box<OldSettings::Widget>());
if (const auto controller = this->controller()) {
controller->showSettings();
} else {
// #TODO settings
showSpecialLayer(Box<OldSettings::Widget>(), anim::type::normal);
}
}
void MainWindow::showSpecialLayer(

View File

@ -0,0 +1,12 @@
/*
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
*/
using "basic.style";
using "ui/widgets/widgets.style";
using "info/info.style";
settingsSectionButton: infoProfileButton;

View File

@ -0,0 +1,32 @@
/*
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 "settings/settings_chat.h"
#include "settings/settings_common.h"
#include "boxes/abstract_box.h"
#include "ui/wrap/vertical_layout.h"
#include "lang/lang_keys.h"
#include "styles/style_settings.h"
namespace Settings {
Chat::Chat(QWidget *parent, not_null<UserData*> self)
: Section(parent)
, _self(self) {
setupContent();
}
void Chat::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
content->add(object_ptr<BoxContentDivider>(content));
Ui::ResizeFitChild(this, content);
}
} // namespace Settings

View File

@ -0,0 +1,25 @@
/*
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
*/
#pragma once
#include "settings/settings_common.h"
namespace Settings {
class Chat : public Section {
public:
Chat(QWidget *parent, not_null<UserData*> self);
private:
void setupContent();
not_null<UserData*> _self;
};
} // namespace Settings

View File

@ -0,0 +1,40 @@
/*
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 "settings/settings_common.h"
#include "settings/settings_chat.h"
#include "settings/settings_general.h"
#include "settings/settings_information.h"
#include "settings/settings_main.h"
#include "settings/settings_notifications.h"
#include "settings/settings_privacy_security.h"
namespace Settings {
object_ptr<Section> CreateSection(
Type type,
not_null<QWidget*> parent,
UserData *self) {
switch (type) {
case Type::Main:
return object_ptr<::Settings::Main>(parent, self);
case Type::Information:
return object_ptr<::Settings::Information>(parent, self);
case Type::Notifications:
return object_ptr<::Settings::Notifications>(parent, self);
case Type::PrivacySecurity:
return object_ptr<::Settings::PrivacySecurity>(parent, self);
case Type::General:
return object_ptr<::Settings::General>(parent, self);
case Type::Chat:
return object_ptr<::Settings::Chat>(parent, self);
}
Unexpected("Settings section type in Widget::createInnerWidget.");
}
} // namespace Settings

View File

@ -0,0 +1,46 @@
/*
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
*/
#pragma once
#include "ui/rp_widget.h"
namespace Info {
namespace Profile {
class Button;
} // namespace Profile
} // namespace Info
namespace Settings {
enum class Type {
Main,
Information,
Notifications,
PrivacySecurity,
General,
Chat,
};
using Button = Info::Profile::Button;
class Section : public Ui::RpWidget {
public:
using RpWidget::RpWidget;
virtual rpl::producer<Type> sectionShowOther() {
return rpl::never<Type>();
}
};
object_ptr<Section> CreateSection(
Type type,
not_null<QWidget*> parent,
UserData *self = nullptr);
} // namespace Settings

View File

@ -0,0 +1,32 @@
/*
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 "settings/settings_general.h"
#include "settings/settings_common.h"
#include "boxes/abstract_box.h"
#include "ui/wrap/vertical_layout.h"
#include "lang/lang_keys.h"
#include "styles/style_settings.h"
namespace Settings {
General::General(QWidget *parent, UserData *self)
: Section(parent)
, _self(self) {
setupContent();
}
void General::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
content->add(object_ptr<BoxContentDivider>(content));
Ui::ResizeFitChild(this, content);
}
} // namespace Settings

View File

@ -0,0 +1,25 @@
/*
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
*/
#pragma once
#include "settings/settings_common.h"
namespace Settings {
class General : public Section {
public:
explicit General(QWidget *parent, UserData *self = nullptr);
private:
void setupContent();
UserData *_self = nullptr;
};
} // namespace Settings

View File

@ -0,0 +1,32 @@
/*
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 "settings/settings_information.h"
#include "settings/settings_common.h"
#include "boxes/abstract_box.h"
#include "ui/wrap/vertical_layout.h"
#include "lang/lang_keys.h"
#include "styles/style_settings.h"
namespace Settings {
Information::Information(QWidget *parent, not_null<UserData*> self)
: Section(parent)
, _self(self) {
setupContent();
}
void Information::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
content->add(object_ptr<BoxContentDivider>(content));
Ui::ResizeFitChild(this, content);
}
} // namespace Settings

View File

@ -0,0 +1,25 @@
/*
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
*/
#pragma once
#include "settings/settings_common.h"
namespace Settings {
class Information : public Section {
public:
Information(QWidget *parent, not_null<UserData*> self);
private:
void setupContent();
not_null<UserData*> _self;
};
} // namespace Settings

View File

@ -0,0 +1,52 @@
/*
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 "settings/settings_main.h"
#include "settings/settings_common.h"
#include "boxes/abstract_box.h"
#include "ui/wrap/vertical_layout.h"
#include "info/profile/info_profile_button.h"
#include "lang/lang_keys.h"
#include "styles/style_settings.h"
namespace Settings {
Main::Main(QWidget *parent, not_null<UserData*> self)
: Section(parent)
, _self(self) {
setupContent();
}
void Main::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
content->add(object_ptr<BoxContentDivider>(content));
const auto addSection = [&](LangKey label, Type type) {
content->add(object_ptr<Button>(
content,
Lang::Viewer(label),
st::settingsSectionButton)
)->addClickHandler([=] {
_showOther.fire_copy(type);
});
};
addSection(lng_settings_section_info, Type::Information);
addSection(lng_settings_section_notify, Type::Notifications);
addSection(lng_settings_section_privacy, Type::PrivacySecurity);
addSection(lng_settings_section_general, Type::General);
addSection(lng_settings_section_chat_settings, Type::Chat);
Ui::ResizeFitChild(this, content);
}
rpl::producer<Type> Main::sectionShowOther() {
return _showOther.events();
}
} // namespace Settings

View File

@ -0,0 +1,28 @@
/*
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
*/
#pragma once
#include "settings/settings_common.h"
namespace Settings {
class Main : public Section {
public:
Main(QWidget *parent, not_null<UserData*> self);
rpl::producer<Type> sectionShowOther() override;
private:
void setupContent();
not_null<UserData*> _self;
rpl::event_stream<Type> _showOther;
};
} // namespace Settings

View File

@ -0,0 +1,32 @@
/*
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 "settings/settings_notifications.h"
#include "settings/settings_common.h"
#include "boxes/abstract_box.h"
#include "ui/wrap/vertical_layout.h"
#include "lang/lang_keys.h"
#include "styles/style_settings.h"
namespace Settings {
Notifications::Notifications(QWidget *parent, not_null<UserData*> self)
: Section(parent)
, _self(self) {
setupContent();
}
void Notifications::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
content->add(object_ptr<BoxContentDivider>(content));
Ui::ResizeFitChild(this, content);
}
} // namespace Settings

View File

@ -0,0 +1,25 @@
/*
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
*/
#pragma once
#include "settings/settings_common.h"
namespace Settings {
class Notifications : public Section {
public:
Notifications(QWidget *parent, not_null<UserData*> self);
private:
void setupContent();
not_null<UserData*> _self;
};
} // namespace Settings

View File

@ -0,0 +1,32 @@
/*
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 "settings/settings_privacy_security.h"
#include "settings/settings_common.h"
#include "boxes/abstract_box.h"
#include "ui/wrap/vertical_layout.h"
#include "lang/lang_keys.h"
#include "styles/style_settings.h"
namespace Settings {
PrivacySecurity::PrivacySecurity(QWidget *parent, not_null<UserData*> self)
: Section(parent)
, _self(self) {
setupContent();
}
void PrivacySecurity::setupContent() {
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
content->add(object_ptr<BoxContentDivider>(content));
Ui::ResizeFitChild(this, content);
}
} // namespace Settings

View File

@ -0,0 +1,25 @@
/*
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
*/
#pragma once
#include "settings/settings_common.h"
namespace Settings {
class PrivacySecurity : public Section {
public:
PrivacySecurity(QWidget *parent, not_null<UserData*> self);
private:
void setupContent();
not_null<UserData*> _self;
};
} // namespace Settings

View File

@ -9,6 +9,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Ui {
void ResizeFitChild(
not_null<RpWidget*> parent,
not_null<RpWidget*> child) {
parent->widthValue(
) | rpl::start_with_next([=](int width) {
child->resizeToWidth(width);
}, child->lifetime());
child->heightValue(
) | rpl::start_with_next([=](int height) {
parent->resize(parent->width(), height);
}, child->lifetime());
}
rpl::producer<QRect> RpWidgetMethods::geometryValue() const {
auto &stream = eventStreams().geometry;
return stream.events_starting_with_copy(callGetGeometry());

View File

@ -31,6 +31,8 @@ private:
} // namespace details
class RpWidget;
template <typename Widget, typename ...Args>
inline base::unique_qptr<Widget> CreateObject(Args &&...args) {
return base::make_unique_q<Widget>(
@ -50,6 +52,10 @@ inline void DestroyChild(QWidget *child) {
delete child;
}
void ResizeFitChild(
not_null<RpWidget*> parent,
not_null<RpWidget*> child);
template <typename Value>
inline void AttachAsChild(not_null<QObject*> parent, Value &&value) {
using PlainValue = std::decay_t<Value>;

View File

@ -8,7 +8,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/window_controller.h"
#include "window/main_window.h"
#include "old_settings/settings_widget.h"
#include "info/info_memento.h"
#include "info/info_controller.h"
#include "history/history.h"
#include "history/history_item.h"
#include "history/view/history_view_element.h"
@ -473,6 +475,26 @@ void Navigation::showPeerInfo(
showPeerInfo(history->peer->id, params);
}
void Navigation::showSettings(
Settings::Type type,
const SectionShow &params) {
const auto self = App::self();
if (!self) {
// #TODO settings
App::wnd()->showSpecialLayer(
Box<OldSettings::Widget>(),
params.animated);
return;
}
showSection(
Info::Memento(Info::Settings::Tag{ self }, Info::Section(type)),
params);
}
void Navigation::showSettings(const SectionShow &params) {
showSettings(Settings::Type::Main, params);
}
void Controller::showSection(
SectionMemento &&memento,
const SectionShow &params) {

View File

@ -15,6 +15,10 @@ class MainWidget;
class HistoryMessage;
class HistoryService;
namespace Settings {
enum class Type;
} // namespace Settings
namespace Media {
namespace Player {
class RoundController;
@ -114,6 +118,11 @@ public:
not_null<History*> history,
const SectionShow &params = SectionShow());
void showSettings(
Settings::Type type,
const SectionShow &params = SectionShow());
void showSettings(const SectionShow &params = SectionShow());
virtual ~Navigation() = default;
};

View File

@ -37,6 +37,7 @@
'<(src_loc)/passport/passport.style',
'<(src_loc)/profile/profile.style',
'<(src_loc)/old_settings/old_settings.style',
'<(src_loc)/settings/settings.style',
'<(src_loc)/chat_helpers/chat_helpers.style',
'<(src_loc)/ui/widgets/widgets.style',
'<(src_loc)/window/window.style',

View File

@ -315,6 +315,8 @@
<(src_loc)/info/profile/info_profile_values.h
<(src_loc)/info/profile/info_profile_widget.cpp
<(src_loc)/info/profile/info_profile_widget.h
<(src_loc)/info/settings/info_settings_widget.cpp
<(src_loc)/info/settings/info_settings_widget.h
<(src_loc)/inline_bots/inline_bot_layout_internal.cpp
<(src_loc)/inline_bots/inline_bot_layout_internal.h
<(src_loc)/inline_bots/inline_bot_layout_item.cpp
@ -562,6 +564,20 @@
<(src_loc)/old_settings/settings_scale_widget.h
<(src_loc)/old_settings/settings_widget.cpp
<(src_loc)/old_settings/settings_widget.h
<(src_loc)/settings/settings_chat.cpp
<(src_loc)/settings/settings_chat.h
<(src_loc)/settings/settings_common.cpp
<(src_loc)/settings/settings_common.h
<(src_loc)/settings/settings_general.cpp
<(src_loc)/settings/settings_general.h
<(src_loc)/settings/settings_information.cpp
<(src_loc)/settings/settings_information.h
<(src_loc)/settings/settings_main.cpp
<(src_loc)/settings/settings_main.h
<(src_loc)/settings/settings_notifications.cpp
<(src_loc)/settings/settings_notifications.h
<(src_loc)/settings/settings_privacy_security.cpp
<(src_loc)/settings/settings_privacy_security.h
<(src_loc)/storage/file_download.cpp
<(src_loc)/storage/file_download.h
<(src_loc)/storage/file_upload.cpp