Added ability to show photo from Controller for sections.
This commit is contained in:
		
							parent
							
								
									7885be4a94
								
							
						
					
					
						commit
						eefa7263b5
					
				
					 16 changed files with 91 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -478,8 +478,20 @@ PhotoClickHandler::PhotoClickHandler(
 | 
			
		|||
, _peer(peer) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PhotoOpenClickHandler::PhotoOpenClickHandler(
 | 
			
		||||
	not_null<PhotoData*> photo,
 | 
			
		||||
	Fn<void()> &&callback)
 | 
			
		||||
: PhotoClickHandler(photo)
 | 
			
		||||
, _handler(std::move(callback)) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PhotoOpenClickHandler::onClickImpl() const {
 | 
			
		||||
	Core::App().showPhoto(this);
 | 
			
		||||
	if (_handler) {
 | 
			
		||||
		_handler();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PhotoOpenClickHandlerOld::onClickImpl() const {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PhotoSaveClickHandler::onClickImpl() const {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -197,6 +197,18 @@ private:
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
class PhotoOpenClickHandler : public PhotoClickHandler {
 | 
			
		||||
public:
 | 
			
		||||
	PhotoOpenClickHandler(not_null<PhotoData*> photo, Fn<void()> &&callback);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	void onClickImpl() const override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	Fn<void()> _handler;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PhotoOpenClickHandlerOld : public PhotoClickHandler {
 | 
			
		||||
public:
 | 
			
		||||
	using PhotoClickHandler::PhotoClickHandler;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -602,6 +602,12 @@ void InnerWidget::elementShowPollResults(
 | 
			
		|||
	FullMsgId context) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void InnerWidget::elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context) {
 | 
			
		||||
	_controller->openPhoto(photo, context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void InnerWidget::elementShowTooltip(
 | 
			
		||||
	const TextWithEntities &text,
 | 
			
		||||
	Fn<void()> hiddenCallback) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,6 +108,9 @@ public:
 | 
			
		|||
	void elementShowPollResults(
 | 
			
		||||
		not_null<PollData*> poll,
 | 
			
		||||
		FullMsgId context) override;
 | 
			
		||||
	void elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context) override;
 | 
			
		||||
	void elementShowTooltip(
 | 
			
		||||
		const TextWithEntities &text,
 | 
			
		||||
		Fn<void()> hiddenCallback) override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2567,6 +2567,12 @@ void HistoryInner::elementShowPollResults(
 | 
			
		|||
	_controller->showPollResults(poll, context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HistoryInner::elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context) {
 | 
			
		||||
	_controller->openPhoto(photo, context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HistoryInner::elementShowTooltip(
 | 
			
		||||
		const TextWithEntities &text,
 | 
			
		||||
		Fn<void()> hiddenCallback) {
 | 
			
		||||
| 
						 | 
				
			
			@ -3445,6 +3451,13 @@ not_null<HistoryView::ElementDelegate*> HistoryInner::ElementDelegate() {
 | 
			
		|||
				Instance->elementShowPollResults(poll, context);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		void elementOpenPhoto(
 | 
			
		||||
				not_null<PhotoData*> photo,
 | 
			
		||||
				FullMsgId context) override {
 | 
			
		||||
			if (Instance) {
 | 
			
		||||
				Instance->elementOpenPhoto(photo, context);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		void elementShowTooltip(
 | 
			
		||||
				const TextWithEntities &text,
 | 
			
		||||
				Fn<void()> hiddenCallback) override {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,6 +88,9 @@ public:
 | 
			
		|||
	void elementShowPollResults(
 | 
			
		||||
		not_null<PollData*> poll,
 | 
			
		||||
		FullMsgId context);
 | 
			
		||||
	void elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context);
 | 
			
		||||
	void elementShowTooltip(
 | 
			
		||||
		const TextWithEntities &text,
 | 
			
		||||
		Fn<void()> hiddenCallback);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,6 +107,11 @@ void SimpleElementDelegate::elementShowPollResults(
 | 
			
		|||
	FullMsgId context) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SimpleElementDelegate::elementOpenPhoto(
 | 
			
		||||
	not_null<PhotoData*> photo,
 | 
			
		||||
	FullMsgId context) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SimpleElementDelegate::elementShowTooltip(
 | 
			
		||||
	const TextWithEntities &text,
 | 
			
		||||
	Fn<void()> hiddenCallback) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,9 @@ public:
 | 
			
		|||
	virtual void elementShowPollResults(
 | 
			
		||||
		not_null<PollData*> poll,
 | 
			
		||||
		FullMsgId context) = 0;
 | 
			
		||||
	virtual void elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context) = 0;
 | 
			
		||||
	virtual void elementShowTooltip(
 | 
			
		||||
		const TextWithEntities &text,
 | 
			
		||||
		Fn<void()> hiddenCallback) = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -97,6 +100,9 @@ public:
 | 
			
		|||
	void elementShowPollResults(
 | 
			
		||||
		not_null<PollData*> poll,
 | 
			
		||||
		FullMsgId context) override;
 | 
			
		||||
	void elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context) override;
 | 
			
		||||
	void elementShowTooltip(
 | 
			
		||||
		const TextWithEntities &text,
 | 
			
		||||
		Fn<void()> hiddenCallback) override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1300,6 +1300,12 @@ void ListWidget::elementShowPollResults(
 | 
			
		|||
	_controller->showPollResults(poll, context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ListWidget::elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context) {
 | 
			
		||||
	_controller->openPhoto(photo, context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ListWidget::elementShowTooltip(
 | 
			
		||||
	const TextWithEntities &text,
 | 
			
		||||
	Fn<void()> hiddenCallback) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -234,6 +234,9 @@ public:
 | 
			
		|||
	void elementShowPollResults(
 | 
			
		||||
		not_null<PollData*> poll,
 | 
			
		||||
		FullMsgId context) override;
 | 
			
		||||
	void elementOpenPhoto(
 | 
			
		||||
		not_null<PhotoData*> photo,
 | 
			
		||||
		FullMsgId context) override;
 | 
			
		||||
	void elementShowTooltip(
 | 
			
		||||
		const TextWithEntities &text,
 | 
			
		||||
		Fn<void()> hiddenCallback) override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ void File::clickHandlerPressedChanged(
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void File::setLinks(
 | 
			
		||||
		FileClickHandlerPtr &&openl,
 | 
			
		||||
		ClickHandlerPtr &&openl,
 | 
			
		||||
		FileClickHandlerPtr &&savel,
 | 
			
		||||
		FileClickHandlerPtr &&cancell) {
 | 
			
		||||
	_openl = std::move(openl);
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,6 @@ void File::setLinks(
 | 
			
		|||
 | 
			
		||||
void File::refreshParentId(not_null<HistoryItem*> realParent) {
 | 
			
		||||
	const auto contextId = realParent->fullId();
 | 
			
		||||
	_openl->setMessageId(contextId);
 | 
			
		||||
	_savel->setMessageId(contextId);
 | 
			
		||||
	_cancell->setMessageId(contextId);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
			
		|||
 | 
			
		||||
namespace HistoryView {
 | 
			
		||||
 | 
			
		||||
class File : public Media {
 | 
			
		||||
class File : public Media, public base::has_weak_ptr {
 | 
			
		||||
public:
 | 
			
		||||
	File(
 | 
			
		||||
		not_null<Element*> parent,
 | 
			
		||||
| 
						 | 
				
			
			@ -44,10 +44,11 @@ protected:
 | 
			
		|||
	using FileClickHandlerPtr = std::shared_ptr<FileClickHandler>;
 | 
			
		||||
 | 
			
		||||
	not_null<HistoryItem*> _realParent;
 | 
			
		||||
	FileClickHandlerPtr _openl, _savel, _cancell;
 | 
			
		||||
	ClickHandlerPtr _openl;
 | 
			
		||||
	FileClickHandlerPtr _savel, _cancell;
 | 
			
		||||
 | 
			
		||||
	void setLinks(
 | 
			
		||||
		FileClickHandlerPtr &&openl,
 | 
			
		||||
		ClickHandlerPtr &&openl,
 | 
			
		||||
		FileClickHandlerPtr &&savel,
 | 
			
		||||
		FileClickHandlerPtr &&cancell);
 | 
			
		||||
	void setDocumentLinks(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,7 +86,9 @@ Photo::~Photo() {
 | 
			
		|||
 | 
			
		||||
void Photo::create(FullMsgId contextId, PeerData *chat) {
 | 
			
		||||
	setLinks(
 | 
			
		||||
		std::make_shared<PhotoOpenClickHandler>(_data, contextId, chat),
 | 
			
		||||
		std::make_shared<PhotoOpenClickHandler>(_data, crl::guard(this, [=] {
 | 
			
		||||
			showPhoto();
 | 
			
		||||
		})),
 | 
			
		||||
		std::make_shared<PhotoSaveClickHandler>(_data, contextId, chat),
 | 
			
		||||
		std::make_shared<PhotoCancelClickHandler>(_data, contextId, chat));
 | 
			
		||||
	if ((_dataMedia = _data->activeMediaView())) {
 | 
			
		||||
| 
						 | 
				
			
			@ -771,7 +773,7 @@ void Photo::playAnimation(bool autoplay) {
 | 
			
		|||
	if (_streamed && autoplay) {
 | 
			
		||||
		return;
 | 
			
		||||
	} else if (_streamed && videoAutoplayEnabled()) {
 | 
			
		||||
		Core::App().showPhoto(_data, _parent->data());
 | 
			
		||||
		showPhoto();
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (_streamed) {
 | 
			
		||||
| 
						 | 
				
			
			@ -844,4 +846,10 @@ void Photo::parentTextUpdated() {
 | 
			
		|||
	history()->owner().requestViewResize(_parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Photo::showPhoto() {
 | 
			
		||||
	_parent->delegate()->elementOpenPhoto(
 | 
			
		||||
		_data,
 | 
			
		||||
		_parent->data()->fullId());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace HistoryView
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,6 +102,8 @@ protected:
 | 
			
		|||
private:
 | 
			
		||||
	struct Streamed;
 | 
			
		||||
 | 
			
		||||
	void showPhoto();
 | 
			
		||||
 | 
			
		||||
	void create(FullMsgId contextId, PeerData *chat = nullptr);
 | 
			
		||||
 | 
			
		||||
	void playAnimation(bool autoplay) override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -272,7 +272,7 @@ Photo::Photo(
 | 
			
		|||
	not_null<PhotoData*> photo)
 | 
			
		||||
: ItemBase(delegate, parent)
 | 
			
		||||
, _data(photo)
 | 
			
		||||
, _link(std::make_shared<PhotoOpenClickHandler>(photo, parent->fullId())) {
 | 
			
		||||
, _link(std::make_shared<PhotoOpenClickHandlerOld>(photo, parent->fullId())) {
 | 
			
		||||
	if (_data->inlineThumbnailBytes().isEmpty()
 | 
			
		||||
		&& (_data->hasExact(Data::PhotoSize::Small)
 | 
			
		||||
			|| _data->hasExact(Data::PhotoSize::Thumbnail))) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1461,7 +1461,7 @@ Link::Link(
 | 
			
		|||
			} else if (_page->type == WebPageType::Photo
 | 
			
		||||
				|| _page->siteName == qstr("Twitter")
 | 
			
		||||
				|| _page->siteName == qstr("Facebook")) {
 | 
			
		||||
				_photol = std::make_shared<PhotoOpenClickHandler>(
 | 
			
		||||
				_photol = std::make_shared<PhotoOpenClickHandlerOld>(
 | 
			
		||||
					_page->photo,
 | 
			
		||||
					parent->fullId());
 | 
			
		||||
			} else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -293,8 +293,8 @@ void UserpicButton::openPeerPhoto() {
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	const auto photo = _peer->owner().photo(id);
 | 
			
		||||
	if (photo->date) {
 | 
			
		||||
		Core::App().showPhoto(photo, _peer);
 | 
			
		||||
	if (photo->date && _controller) {
 | 
			
		||||
		_controller->openPhoto(photo, _peer);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue