tdesktop/Telegram/SourceFiles/history/media/history_media_poll.h

131 lines
3.0 KiB
C
Raw Normal View History

2018-12-18 13:56:38 +00:00
/*
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 "history/media/history_media.h"
2018-12-19 11:20:04 +00:00
struct PollAnswer;
2018-12-18 13:56:38 +00:00
class HistoryPoll : public HistoryMedia {
public:
HistoryPoll(
not_null<Element*> parent,
not_null<PollData*> poll);
void draw(Painter &p, const QRect &r, TextSelection selection, crl::time ms) const override;
2018-12-18 13:56:38 +00:00
TextState textState(QPoint point, StateRequest request) const override;
bool toggleSelectionByHandlerClick(const ClickHandlerPtr &p) const override {
return true;
}
bool dragItemByHandler(const ClickHandlerPtr &p) const override {
return true;
}
bool needsBubble() const override {
return true;
}
bool customInfoLayout() const override {
return false;
}
2018-12-24 10:03:13 +00:00
void clickHandlerPressedChanged(
const ClickHandlerPtr &handler,
bool pressed) override;
2018-12-19 11:20:04 +00:00
~HistoryPoll();
2018-12-18 13:56:38 +00:00
private:
2018-12-22 19:32:04 +00:00
struct AnswerAnimation;
struct AnswersAnimation;
struct SendingAnimation;
struct Answer;
2018-12-18 13:56:38 +00:00
QSize countOptimalSize() override;
QSize countCurrentSize(int newWidth) override;
bool canVote() const;
2018-12-24 10:03:13 +00:00
[[nodiscard]] int countAnswerTop(
const Answer &answer,
int innerWidth) const;
[[nodiscard]] int countAnswerHeight(
const Answer &answer,
int innerWidth) const;
2018-12-19 11:20:04 +00:00
[[nodiscard]] ClickHandlerPtr createAnswerClickHandler(
const Answer &answer) const;
2018-12-18 13:56:38 +00:00
void updateTexts();
2018-12-22 10:23:22 +00:00
void updateAnswers();
void updateVotes();
void updateTotalVotes();
void updateAnswerVotes();
2018-12-19 11:20:04 +00:00
void updateAnswerVotesFromOriginal(
Answer &answer,
2018-12-19 11:20:04 +00:00
const PollAnswer &original,
int percent,
int maxVotes);
void checkSendingAnimation() const;
2018-12-19 11:20:04 +00:00
int paintAnswer(
Painter &p,
const Answer &answer,
const AnswerAnimation *animation,
2018-12-19 11:20:04 +00:00
int left,
int top,
int width,
int outerWidth,
2019-04-02 09:13:30 +00:00
TextSelection selection) const;
void paintRadio(
Painter &p,
const Answer &answer,
int left,
int top,
TextSelection selection) const;
void paintPercent(
Painter &p,
const QString &percent,
int percentWidth,
int left,
int top,
int outerWidth,
TextSelection selection) const;
void paintFilling(
Painter &p,
float64 filling,
int left,
int top,
int width,
int height,
TextSelection selection) const;
bool checkAnimationStart() const;
bool answerVotesChanged() const;
void saveStateInAnimation() const;
2018-12-22 19:32:04 +00:00
void startAnswersAnimation() const;
void resetAnswersAnimation() const;
void radialAnimationCallback() const;
2018-12-18 13:56:38 +00:00
2018-12-24 10:03:13 +00:00
void toggleRipple(Answer &answer, bool pressed);
2018-12-18 13:56:38 +00:00
not_null<PollData*> _poll;
int _pollVersion = 0;
int _totalVotes = 0;
bool _voted = false;
2018-12-19 11:20:04 +00:00
bool _closed = false;
2018-12-18 13:56:38 +00:00
2019-06-12 13:26:04 +00:00
Ui::Text::String _question;
Ui::Text::String _subtitle;
2018-12-18 13:56:38 +00:00
std::vector<Answer> _answers;
2019-06-12 13:26:04 +00:00
Ui::Text::String _totalVotesLabel;
2018-12-18 13:56:38 +00:00
mutable std::unique_ptr<AnswersAnimation> _answersAnimation;
2018-12-22 19:32:04 +00:00
mutable std::unique_ptr<SendingAnimation> _sendingAnimation;
2018-12-24 10:03:13 +00:00
mutable QPoint _lastLinkPoint;
2018-12-18 13:56:38 +00:00
};