mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2026-08-06 20:03:12 +00:00
118 lines
2.8 KiB
C++
118 lines
2.8 KiB
C++
/*
|
|
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/community/info_community_widget.h"
|
|
|
|
#include "boxes/peers/community_box.h"
|
|
#include "data/data_channel.h"
|
|
#include "info/profile/info_profile_values.h"
|
|
#include "info/info_controller.h"
|
|
#include "ui/wrap/vertical_layout.h"
|
|
#include "ui/ui_utility.h"
|
|
#include "styles/style_info.h"
|
|
|
|
namespace Info::Community {
|
|
|
|
class InnerWidget final : public Ui::VerticalLayout {
|
|
public:
|
|
InnerWidget(
|
|
QWidget *parent,
|
|
not_null<Controller*> controller,
|
|
not_null<PeerData*> peer);
|
|
|
|
[[nodiscard]] not_null<PeerData*> peer() const {
|
|
return _peer;
|
|
}
|
|
|
|
private:
|
|
const not_null<PeerData*> _peer;
|
|
|
|
};
|
|
|
|
InnerWidget::InnerWidget(
|
|
QWidget *parent,
|
|
not_null<Controller*> controller,
|
|
not_null<PeerData*> peer)
|
|
: Ui::VerticalLayout(parent)
|
|
, _peer(peer) {
|
|
if (const auto community = peer->asChannel()) {
|
|
SetupCommunityContent(this, controller, community, controller->uiShow());
|
|
}
|
|
}
|
|
|
|
Memento::Memento(not_null<PeerData*> peer)
|
|
: ContentMemento(peer, nullptr, nullptr, PeerId()) {
|
|
}
|
|
|
|
Section Memento::section() const {
|
|
return Section(Section::Type::Community);
|
|
}
|
|
|
|
object_ptr<ContentWidget> Memento::createWidget(
|
|
QWidget *parent,
|
|
not_null<Controller*> controller,
|
|
const QRect &geometry) {
|
|
auto result = object_ptr<Widget>(parent, controller, peer());
|
|
result->setInternalState(geometry, this);
|
|
return result;
|
|
}
|
|
|
|
Memento::~Memento() = default;
|
|
|
|
Widget::Widget(
|
|
QWidget *parent,
|
|
not_null<Controller*> controller,
|
|
not_null<PeerData*> peer)
|
|
: ContentWidget(parent, controller) {
|
|
_inner = setInnerWidget(object_ptr<InnerWidget>(this, controller, peer));
|
|
}
|
|
|
|
rpl::producer<QString> Widget::title() {
|
|
return Info::Profile::NameValue(peer());
|
|
}
|
|
|
|
not_null<PeerData*> Widget::peer() const {
|
|
return _inner->peer();
|
|
}
|
|
|
|
bool Widget::showInternal(not_null<ContentMemento*> memento) {
|
|
if (!controller()->validateMementoPeer(memento)) {
|
|
return false;
|
|
}
|
|
if (auto communityMemento = dynamic_cast<Memento*>(memento.get())) {
|
|
if (communityMemento->peer() == peer()) {
|
|
restoreState(communityMemento);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void Widget::setInternalState(
|
|
const QRect &geometry,
|
|
not_null<Memento*> memento) {
|
|
setGeometry(geometry);
|
|
Ui::SendPendingMoveResizeEvents(this);
|
|
restoreState(memento);
|
|
}
|
|
|
|
std::shared_ptr<ContentMemento> Widget::doCreateMemento() {
|
|
auto result = std::make_shared<Memento>(peer());
|
|
saveState(result.get());
|
|
return result;
|
|
}
|
|
|
|
void Widget::saveState(not_null<Memento*> memento) {
|
|
memento->setScrollTop(scrollTopSave());
|
|
}
|
|
|
|
void Widget::restoreState(not_null<Memento*> memento) {
|
|
scrollTopRestore(memento->scrollTop());
|
|
}
|
|
|
|
} // namespace Info::Community
|