init
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
This commit is contained in:
167
Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h
Normal file
167
Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h
Normal file
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
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 "layout/layout_item_base.h"
|
||||
#include "ui/text/text.h"
|
||||
|
||||
class Image;
|
||||
|
||||
namespace Ui {
|
||||
class PathShiftGradient;
|
||||
} // namespace Ui
|
||||
|
||||
namespace InlineBots {
|
||||
|
||||
class Result;
|
||||
|
||||
namespace Layout {
|
||||
|
||||
class ItemBase;
|
||||
|
||||
class PaintContext : public PaintContextBase {
|
||||
public:
|
||||
PaintContext(crl::time ms, bool selecting, bool paused, bool lastRow)
|
||||
: PaintContextBase(ms, selecting)
|
||||
, paused(paused)
|
||||
, lastRow(lastRow) {
|
||||
}
|
||||
bool paused, lastRow;
|
||||
Ui::PathShiftGradient *pathGradient = nullptr;
|
||||
|
||||
};
|
||||
|
||||
// this type used as a flag, we dynamic_cast<> to it
|
||||
class SendClickHandler : public ClickHandler {
|
||||
public:
|
||||
void onClick(ClickContext context) const override {
|
||||
}
|
||||
};
|
||||
|
||||
class OpenFileClickHandler : public ClickHandler {
|
||||
public:
|
||||
void onClick(ClickContext context) const override {
|
||||
}
|
||||
};
|
||||
|
||||
class Context {
|
||||
public:
|
||||
virtual void inlineItemLayoutChanged(const ItemBase *layout) = 0;
|
||||
virtual bool inlineItemVisible(const ItemBase *item) = 0;
|
||||
virtual void inlineItemRepaint(const ItemBase *item) = 0;
|
||||
virtual Data::FileOrigin inlineItemFileOrigin() = 0;
|
||||
};
|
||||
|
||||
class ItemBase : public LayoutItemBase {
|
||||
public:
|
||||
ItemBase(not_null<Context*> context, std::shared_ptr<Result> result)
|
||||
: _result(result)
|
||||
, _context(context) {
|
||||
}
|
||||
ItemBase(not_null<Context*> context, not_null<DocumentData*> document)
|
||||
: _document(document)
|
||||
, _context(context) {
|
||||
}
|
||||
// Not used anywhere currently.
|
||||
//ItemBase(not_null<Context*> context, PhotoData *photo) : _photo(photo), _context(context) {
|
||||
//}
|
||||
|
||||
virtual void paint(Painter &p, const QRect &clip, const PaintContext *context) const = 0;
|
||||
|
||||
virtual bool isFullLine() const {
|
||||
return true;
|
||||
}
|
||||
virtual bool hasRightSkip() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::shared_ptr<Result> getResult() const;
|
||||
DocumentData *getDocument() const;
|
||||
PhotoData *getPhoto() const;
|
||||
|
||||
// Get document or photo (possibly from InlineBots::Result) for
|
||||
// showing sticker / GIF / photo preview by long mouse press.
|
||||
DocumentData *getPreviewDocument() const;
|
||||
PhotoData *getPreviewPhoto() const;
|
||||
|
||||
virtual void preload() const;
|
||||
virtual void unloadHeavyPart() {
|
||||
_thumbnail = nullptr;
|
||||
}
|
||||
|
||||
void update() const;
|
||||
void layoutChanged();
|
||||
|
||||
// ClickHandlerHost interface
|
||||
void clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) override {
|
||||
update();
|
||||
}
|
||||
void clickHandlerPressedChanged(const ClickHandlerPtr &p, bool pressed) override {
|
||||
update();
|
||||
}
|
||||
|
||||
virtual QRect innerContentRect() const {
|
||||
// Only stickers are supported for now.
|
||||
Unexpected("Unsupported type to get a rect of inner content.");
|
||||
}
|
||||
|
||||
static std::unique_ptr<ItemBase> createLayout(
|
||||
not_null<Context*> context,
|
||||
std::shared_ptr<Result> result,
|
||||
bool forceThumb);
|
||||
static std::unique_ptr<ItemBase> createLayoutGif(
|
||||
not_null<Context*> context,
|
||||
not_null<DocumentData*> document);
|
||||
|
||||
protected:
|
||||
DocumentData *getResultDocument() const;
|
||||
PhotoData *getResultPhoto() const;
|
||||
bool hasResultThumb() const;
|
||||
QImage *getResultThumb(Data::FileOrigin origin) const;
|
||||
QPixmap getResultContactAvatar(int width, int height) const;
|
||||
int getResultDuration() const;
|
||||
QString getResultUrl() const;
|
||||
ClickHandlerPtr getResultUrlHandler() const;
|
||||
ClickHandlerPtr getResultPreviewHandler() const;
|
||||
QString getResultThumbLetter() const;
|
||||
|
||||
not_null<Context*> context() const {
|
||||
return _context;
|
||||
}
|
||||
Data::FileOrigin fileOrigin() const;
|
||||
|
||||
std::shared_ptr<Result> _result;
|
||||
DocumentData *_document = nullptr;
|
||||
PhotoData *_photo = nullptr;
|
||||
|
||||
ClickHandlerPtr _send = ClickHandlerPtr{ new SendClickHandler() };
|
||||
ClickHandlerPtr _open = ClickHandlerPtr{ new OpenFileClickHandler() };
|
||||
|
||||
private:
|
||||
not_null<Context*> _context;
|
||||
mutable std::shared_ptr<QImage> _thumbnail;
|
||||
|
||||
};
|
||||
|
||||
using DocumentItems = std::map<
|
||||
not_null<const DocumentData*>,
|
||||
base::flat_set<not_null<ItemBase*>>>;
|
||||
const DocumentItems *documentItems();
|
||||
|
||||
namespace internal {
|
||||
|
||||
void regDocumentItem(
|
||||
not_null<const DocumentData*> document,
|
||||
not_null<ItemBase*> item);
|
||||
void unregDocumentItem(
|
||||
not_null<const DocumentData*> document,
|
||||
not_null<ItemBase*> item);
|
||||
|
||||
} // namespace internal
|
||||
} // namespace Layout
|
||||
} // namespace InlineBots
|
||||
Reference in New Issue
Block a user