tdesktop/Telegram/SourceFiles/mainwidget.h

650 lines
20 KiB
C
Raw Normal View History

/*
This file is part of Telegram Desktop,
the official desktop version of Telegram messaging app, see https://telegram.org
Telegram Desktop is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
It is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
2015-10-03 13:16:42 +00:00
In addition, as a special exception, the copyright holders give permission
to link the code of portions of this program with the OpenSSL library.
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
2015-10-03 13:16:42 +00:00
Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
*/
#pragma once
#include "dialogswidget.h"
#include "historywidget.h"
#include "profilewidget.h"
2014-08-15 11:19:32 +00:00
#include "overviewwidget.h"
2015-07-03 08:47:16 +00:00
#include "playerwidget.h"
#include "apiwrap.h"
class Window;
struct DialogRow;
class MainWidget;
class ConfirmBox;
2015-12-08 12:33:37 +00:00
class TopBarWidget : public TWidget {
Q_OBJECT
public:
TopBarWidget(MainWidget *w);
void enterEvent(QEvent *e);
void enterFromChildEvent(QEvent *e);
void leaveEvent(QEvent *e);
void leaveToChildEvent(QEvent *e);
void paintEvent(QPaintEvent *e);
void mousePressEvent(QMouseEvent *e);
void resizeEvent(QResizeEvent *e);
2015-12-08 12:33:37 +00:00
void step_appearance(float64 ms, bool timer);
void enableShadow(bool enable = true);
2014-06-14 19:32:11 +00:00
void startAnim();
void stopAnim();
void showAll();
void showSelected(uint32 selCount, bool canDelete = false);
2015-10-17 14:52:26 +00:00
void updateWideMode();
FlatButton *mediaTypeButton();
2015-10-17 14:52:26 +00:00
void grabStart() {
_sideShadow.hide();
}
void grabFinish() {
_sideShadow.setVisible(cWideMode());
}
public slots:
void onForwardSelection();
void onDeleteSelection();
void onClearSelection();
void onInfoClicked();
void onAddContact();
void onEdit();
void onDeleteContact();
void onDeleteContactSure();
void onDeleteAndExit();
void onDeleteAndExitSure();
signals:
void clicked();
private:
MainWidget *main();
anim::fvalue a_over;
2015-12-08 12:33:37 +00:00
Animation _a_appearance;
2015-09-06 10:17:09 +00:00
PeerData *_selPeer;
uint32 _selCount;
bool _canDelete;
QString _selStr;
int32 _selStrLeft, _selStrWidth;
2014-06-14 19:32:11 +00:00
bool _animating;
FlatButton _clearSelection;
FlatButton _forward, _delete;
int32 _selectionButtonsWidth, _forwardDeleteWidth;
FlatButton _info;
FlatButton _edit, _leaveGroup, _addContact, _deleteContact;
FlatButton _mediaType;
PlainShadow _sideShadow;
};
2014-08-15 11:19:32 +00:00
enum StackItemType {
HistoryStackItem,
ProfileStackItem,
OverviewStackItem,
};
class StackItem {
public:
StackItem(PeerData *peer) : peer(peer) {
}
virtual StackItemType type() const = 0;
virtual ~StackItem() {
}
PeerData *peer;
};
class StackItemHistory : public StackItem {
public:
StackItemHistory(PeerData *peer, MsgId msgId, QList<MsgId> replyReturns) : StackItem(peer),
msgId(msgId), replyReturns(replyReturns) {
2014-08-15 11:19:32 +00:00
}
StackItemType type() const {
return HistoryStackItem;
}
MsgId msgId;
QList<MsgId> replyReturns;
2014-08-15 11:19:32 +00:00
};
class StackItemProfile : public StackItem {
public:
2015-09-06 10:17:09 +00:00
StackItemProfile(PeerData *peer, int32 lastScrollTop) : StackItem(peer), lastScrollTop(lastScrollTop) {
2014-08-15 11:19:32 +00:00
}
StackItemType type() const {
return ProfileStackItem;
}
int32 lastScrollTop;
};
class StackItemOverview : public StackItem {
public:
StackItemOverview(PeerData *peer, MediaOverviewType mediaType, int32 lastWidth, int32 lastScrollTop) : StackItem(peer), mediaType(mediaType), lastWidth(lastWidth), lastScrollTop(lastScrollTop) {
}
StackItemType type() const {
return OverviewStackItem;
}
MediaOverviewType mediaType;
int32 lastWidth, lastScrollTop;
};
class StackItems : public QVector<StackItem*> {
public:
bool contains(PeerData *peer) const {
for (int32 i = 0, l = size(); i < l; ++i) {
if (at(i)->peer == peer) {
return true;
}
}
return false;
}
void clear() {
for (int32 i = 0, l = size(); i < l; ++i) {
delete at(i);
}
QVector<StackItem*>::clear();
}
~StackItems() {
clear();
}
};
2015-12-07 13:05:00 +00:00
class StickerPreviewWidget;
2015-10-17 14:52:26 +00:00
class MainWidget : public TWidget, public RPCSender {
Q_OBJECT
public:
MainWidget(Window *window);
void paintEvent(QPaintEvent *e);
void resizeEvent(QResizeEvent *e);
void keyPressEvent(QKeyEvent *e);
void updateWideMode();
bool needBackButton();
void paintTopBar(QPainter &p, float64 over, int32 decreaseWidth);
TopBarWidget *topBar();
2015-07-03 08:47:16 +00:00
PlayerWidget *player();
int32 contentScrollAddToY() const;
void animShow(const QPixmap &bgAnimCache, bool back = false);
2015-12-08 12:33:37 +00:00
void step_show(float64 ms, bool timer);
2015-10-17 14:52:26 +00:00
void animStop_show();
void start(const MTPUser &user);
2015-05-19 15:46:45 +00:00
void openLocalUrl(const QString &str);
2015-09-06 10:17:09 +00:00
void openPeerByName(const QString &name, bool toProfile = false, const QString &startToken = QString());
void joinGroupByHash(const QString &hash);
2015-05-19 15:46:45 +00:00
void stickersBox(const MTPInputStickerSet &set);
void startFull(const MTPVector<MTPUser> &users);
bool started();
void applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNotifySettings &settings, History *history = 0);
void gotNotifySetting(MTPInputNotifyPeer peer, const MTPPeerNotifySettings &settings);
2015-04-04 20:01:34 +00:00
bool failNotifySetting(MTPInputNotifyPeer peer, const RPCError &error);
void updateNotifySetting(PeerData *peer, bool enabled);
void incrementSticker(DocumentData *sticker);
void activate();
2015-09-21 20:57:42 +00:00
void createDialog(History *history);
void removeDialog(History *history);
2015-10-14 11:51:37 +00:00
void dlgUpdated(DialogRow *row = 0);
2015-10-03 10:09:09 +00:00
void dlgUpdated(History *row, MsgId msgId);
void windowShown();
void sentUpdatesReceived(uint64 randomId, const MTPUpdates &updates);
void sentUpdatesReceived(const MTPUpdates &updates) {
return sentUpdatesReceived(0, updates);
}
void inviteToChannelDone(ChannelData *channel, const MTPUpdates &updates);
void historyToDown(History *hist);
void dialogsToUp();
void newUnreadMsg(History *history, HistoryItem *item);
void historyWasRead();
2015-06-17 19:43:03 +00:00
void historyCleared(History *history);
void peerBefore(const PeerData *inPeer, MsgId inMsg, PeerData *&outPeer, MsgId &outMsg);
void peerAfter(const PeerData *inPeer, MsgId inMsg, PeerData *&outPeer, MsgId &outMsg);
PeerData *historyPeer();
PeerData *peer();
PeerData *activePeer();
MsgId activeMsgId();
PeerData *profilePeer();
2015-07-03 08:47:16 +00:00
PeerData *overviewPeer();
bool mediaTypeSwitch();
2015-09-06 10:17:09 +00:00
void showPeerProfile(PeerData *peer, bool back = false, int32 lastScrollTop = -1);
void showMediaOverview(PeerData *peer, MediaOverviewType type, bool back = false, int32 lastScrollTop = -1);
2014-08-15 11:19:32 +00:00
void showBackFromStack();
void orderWidgets();
QRect historyRect() const;
void onSendFileConfirm(const FileLoadResultPtr &file, bool ctrlShiftEnter);
void onSendFileCancel(const FileLoadResultPtr &file);
void onShareContactConfirm(const QString &phone, const QString &fname, const QString &lname, MsgId replyTo, bool ctrlShiftEnter);
void onShareContactCancel();
void destroyData();
void updateOnlineDisplayIn(int32 msecs);
bool isActive() const;
bool historyIsActive() const;
bool lastWasOnline() const;
uint64 lastSetOnline() const;
int32 dlgsWidth() const;
void forwardLayer(int32 forwardSelected = 0); // -1 - send paths
void deleteLayer(int32 selectedCount = -1); // -1 - context item, else selected, -2 - cancel upload
void shareContactLayer(UserData *contact);
2015-10-18 12:49:34 +00:00
void shareUrlLayer(const QString &url, const QString &text);
void hiderLayer(HistoryHider *h);
void noHider(HistoryHider *destroyed);
bool onForward(const PeerId &peer, ForwardWhatMessages what);
2015-10-18 12:49:34 +00:00
bool onShareUrl(const PeerId &peer, const QString &url, const QString &text);
void onShareContact(const PeerId &peer, UserData *contact);
void onSendPaths(const PeerId &peer);
void onFilesOrForwardDrop(const PeerId &peer, const QMimeData *data);
2015-04-04 20:01:34 +00:00
bool selectingPeer(bool withConfirm = false);
void offerPeer(PeerId peer);
void dialogsActivate();
DragState getDragState(const QMimeData *mime);
bool leaveChatFailed(PeerData *peer, const RPCError &e);
void deleteHistoryAfterLeave(PeerData *peer, const MTPUpdates &updates);
void deleteHistoryPart(PeerData *peer, const MTPmessages_AffectedHistory &result);
void deleteMessages(PeerData *peer, const QVector<MTPint> &ids);
void deletedContact(UserData *user, const MTPcontacts_Link &result);
2015-09-24 08:58:10 +00:00
void deleteConversation(PeerData *peer, bool deleteHistory = true);
void clearHistory(PeerData *peer);
2015-09-16 13:04:08 +00:00
void addParticipants(PeerData *chatOrChannel, const QVector<UserData*> &users);
bool addParticipantFail(UserData *user, const RPCError &e);
2015-11-02 22:33:57 +00:00
bool addParticipantsFail(ChannelData *channel, const RPCError &e); // for multi invite in channels
void kickParticipant(ChatData *chat, UserData *user);
bool kickParticipantFail(ChatData *chat, const RPCError &e);
void checkPeerHistory(PeerData *peer);
void checkedHistory(PeerData *peer, const MTPmessages_Messages &result);
2015-09-09 07:46:31 +00:00
bool sendMessageFail(const RPCError &error);
void forwardSelectedItems();
void deleteSelectedItems();
void clearSelectedItems();
DialogsIndexed &contactsList();
DialogsIndexed &dialogsList();
void sendMessage(History *hist, const QString &text, MsgId replyTo, bool broadcast, WebPageId webPageId = 0);
void saveRecentHashtags(const QString &text);
void readServerHistory(History *history, bool force = true);
uint64 animActiveTimeStart(const HistoryItem *msg) const;
void stopAnimActive();
void sendBotCommand(const QString &cmd, MsgId msgId);
2015-06-17 19:43:03 +00:00
void insertBotCommand(const QString &cmd);
2015-09-21 20:57:42 +00:00
void searchMessages(const QString &query, PeerData *inPeer);
bool preloadOverview(PeerData *peer, MediaOverviewType type);
2014-08-15 11:19:32 +00:00
void preloadOverviews(PeerData *peer);
2015-07-03 08:47:16 +00:00
void mediaOverviewUpdated(PeerData *peer, MediaOverviewType type);
void changingMsgId(HistoryItem *row, MsgId newId);
void itemRemoved(HistoryItem *item);
2014-08-15 11:19:32 +00:00
void loadMediaBack(PeerData *peer, MediaOverviewType type, bool many = false);
2014-10-22 18:39:03 +00:00
void peerUsernameChanged(PeerData *peer);
void checkLastUpdate(bool afterSleep);
void showAddContact();
void showNewGroup();
void serviceNotification(const QString &msg, const MTPMessageMedia &media);
void serviceHistoryDone(const MTPmessages_Messages &msgs);
bool serviceHistoryFail(const RPCError &error);
bool isIdle() const;
2015-02-03 15:02:46 +00:00
void clearCachedBackground();
QPixmap cachedBackground(const QRect &forRect, int &x, int &y);
void backgroundParams(const QRect &forRect, QRect &to, QRect &from) const;
void updateScrollColors();
void setChatBackground(const App::WallPaper &wp);
bool chatBackgroundLoading();
void checkChatBackground();
ImagePtr newBackgroundThumb();
ApiWrap *api();
void updateReplyTo();
void updateBotKeyboard(History *h);
void pushReplyReturn(HistoryItem *item);
bool hasForwardingItems();
void fillForwardingInfo(Text *&from, Text *&text, bool &serviceColor, ImagePtr &preview);
void updateForwardingTexts();
void cancelForwarding();
2015-09-21 20:57:42 +00:00
void finishForwarding(History *hist, bool broadcast); // send them
void audioMarkRead(AudioData *data);
void videoMarkRead(VideoData *data);
void mediaMarkRead(const HistoryItemsMap &items);
2015-04-07 23:03:32 +00:00
void webPageUpdated(WebPageData *page);
void updateMutedIn(int32 seconds);
2015-04-07 23:03:32 +00:00
2015-05-19 15:46:45 +00:00
void updateStickers();
void choosePeer(PeerId peerId, MsgId showAtMsgId); // does offerPeer or showPeerHistory
void clearBotStartToken(PeerData *peer);
void contactsReceived();
2015-09-13 08:41:27 +00:00
void ptsWaiterStartTimerFor(ChannelData *channel, int32 ms); // ms <= 0 - stop timer
2015-09-21 20:57:42 +00:00
void feedUpdates(const MTPUpdates &updates, uint64 randomId = 0);
2015-09-13 08:41:27 +00:00
void feedUpdate(const MTPUpdate &update);
void updateAfterDrag();
2015-09-13 08:41:27 +00:00
2015-09-16 13:04:08 +00:00
void ctrlEnterSubmitUpdated();
void setInnerFocus();
2015-09-21 20:57:42 +00:00
void scheduleViewIncrement(HistoryItem *item);
2015-09-19 09:13:21 +00:00
HistoryItem *atTopImportantMsg(int32 &bottomUnderScrollTop) const;
2015-09-21 20:57:42 +00:00
void gotRangeDifference(ChannelData *channel, const MTPupdates_ChannelDifference &diff);
void onSelfParticipantUpdated(ChannelData *channel);
2015-10-01 14:05:05 +00:00
bool contentOverlapped(const QRect &globalRect);
2015-10-17 14:52:26 +00:00
QPixmap grabTopBar();
QPixmap grabInner();
2015-12-07 13:05:00 +00:00
void ui_showStickerPreview(DocumentData *sticker);
void ui_hideStickerPreview();
void ui_redrawHistoryItem(const HistoryItem *item);
2015-12-13 11:36:08 +00:00
void ui_showPeerHistory(quint64 peer, qint32 msgId, bool back);
void notify_botCommandsChanged(UserData *bot);
void notify_userIsBotChanged(UserData *bot);
void notify_userIsContactChanged(UserData *user, bool fromThisApp);
void notify_migrateUpdated(PeerData *peer);
void notify_historyItemResized(const HistoryItem *row, bool scrollToIt);
void notify_historyItemLayoutChanged(const HistoryItem *item);
2015-12-07 13:05:00 +00:00
~MainWidget();
signals:
void peerUpdated(PeerData *peer);
void peerNameChanged(PeerData *peer, const PeerData::Names &oldNames, const PeerData::NameFirstChars &oldChars);
void peerPhotoChanged(PeerData *peer);
void dialogRowReplaced(DialogRow *oldRow, DialogRow *newRow);
void dialogsUpdated();
2015-05-19 15:46:45 +00:00
void stickersUpdated();
public slots:
2015-04-07 23:03:32 +00:00
void webPagesUpdate();
void videoLoadProgress(mtpFileLoader *loader);
void videoLoadFailed(mtpFileLoader *loader, bool started);
void videoLoadRetry();
void audioLoadProgress(mtpFileLoader *loader);
void audioLoadFailed(mtpFileLoader *loader, bool started);
void audioLoadRetry();
void audioPlayProgress(const AudioMsgId &audioId);
void documentLoadProgress(mtpFileLoader *loader);
void documentLoadFailed(mtpFileLoader *loader, bool started);
void documentLoadRetry();
void documentPlayProgress(const SongMsgId &songId);
2015-07-03 08:47:16 +00:00
void hidePlayer();
void dialogsCancelled();
void onParentResize(const QSize &newSize);
void getDifference();
2015-09-13 08:41:27 +00:00
void onGetDifferenceTimeByPts();
void onGetDifferenceTimeAfterFail();
void mtpPing();
void updateOnline(bool gotOtherOffline = false);
void checkIdleFinish();
void updateOnlineDisplay();
void onTopBarClick();
2015-10-03 10:09:09 +00:00
void onHistoryShown(History *history, MsgId atMsgId);
void searchInPeer(PeerData *peer);
void onUpdateNotifySettings();
void onPhotosSelect();
void onVideosSelect();
void onSongsSelect();
void onDocumentsSelect();
void onAudiosSelect();
void onLinksSelect();
void onForwardCancel(QObject *obj = 0);
2015-02-03 15:02:46 +00:00
void onCacheBackground();
void onInviteImport();
void onUpdateMuted();
2015-05-19 15:46:45 +00:00
void onStickersInstalled(uint64 setId);
2015-09-21 20:57:42 +00:00
void onFullPeerUpdated(PeerData *peer);
void onViewsIncrement();
2015-09-25 07:47:32 +00:00
void onActiveChannelUpdateFull();
2015-05-19 15:46:45 +00:00
void onDownloadPathSettings();
void ui_showPeerHistoryAsync(quint64 peerId, qint32 showAtMsgId);
private:
2015-09-06 10:17:09 +00:00
void sendReadRequest(PeerData *peer, MsgId upTo);
void channelWasRead(PeerData *peer, const MTPBool &result);
2015-10-29 19:10:49 +00:00
void historyWasRead(PeerData *peer, const MTPmessages_AffectedMessages &result);
2015-09-06 10:17:09 +00:00
bool readRequestFail(PeerData *peer, const RPCError &error);
void readRequestDone(PeerData *peer);
void messagesAffected(PeerData *peer, const MTPmessages_AffectedMessages &result);
void overviewLoaded(History *history, const MTPmessages_Messages &result, mtpRequestId req);
2014-08-15 11:19:32 +00:00
bool _started;
uint64 failedObjId;
QString failedFileName;
void loadFailed(mtpFileLoader *loader, bool started, const char *retrySlot);
SelectedItemSet _toForward;
Text _toForwardFrom, _toForwardText;
int32 _toForwardNameVersion;
2015-04-07 23:03:32 +00:00
QMap<WebPageId, bool> _webPagesUpdated;
QTimer _webPageUpdater;
SingleTimer _updateMutedTimer;
2015-09-13 08:41:27 +00:00
enum GetChannelDifferenceFrom {
GetChannelDifferenceFromUnknown,
GetChannelDifferenceFromPtsGap,
GetChannelDifferenceFromFail,
};
void getChannelDifference(ChannelData *channel, GetChannelDifferenceFrom from = GetChannelDifferenceFromUnknown);
void gotDifference(const MTPupdates_Difference &diff);
bool failDifference(const RPCError &e);
void feedDifference(const MTPVector<MTPUser> &users, const MTPVector<MTPChat> &chats, const MTPVector<MTPMessage> &msgs, const MTPVector<MTPUpdate> &other);
void gotState(const MTPupdates_State &state);
void updSetState(int32 pts, int32 date, int32 qts, int32 seq);
2015-09-13 08:41:27 +00:00
void gotChannelDifference(ChannelData *channel, const MTPupdates_ChannelDifference &diff);
bool failChannelDifference(ChannelData *channel, const RPCError &err);
void failDifferenceStartTimerFor(ChannelData *channel);
2015-09-21 20:57:42 +00:00
void feedUpdateVector(const MTPVector<MTPUpdate> &updates, bool skipMessageIds = false);
void feedMessageIds(const MTPVector<MTPUpdate> &updates);
void updateReceived(const mtpPrime *from, const mtpPrime *end);
bool updateFail(const RPCError &e);
2015-09-06 10:17:09 +00:00
void usernameResolveDone(QPair<bool, QString> toProfileStartToken, const MTPcontacts_ResolvedPeer &result);
bool usernameResolveFail(QString name, const RPCError &error);
void inviteCheckDone(QString hash, const MTPChatInvite &invite);
bool inviteCheckFail(const RPCError &error);
QString _inviteHash;
void inviteImportDone(const MTPUpdates &result);
bool inviteImportFail(const RPCError &error);
void hideAll();
void showAll();
2014-08-15 11:19:32 +00:00
void overviewPreloaded(PeerData *data, const MTPmessages_Messages &result, mtpRequestId req);
bool overviewFailed(PeerData *data, const RPCError &error, mtpRequestId req);
2015-10-17 14:52:26 +00:00
Animation _a_show;
QPixmap _cacheUnder, _cacheOver;
anim::ivalue a_coordUnder, a_coordOver;
anim::fvalue a_shadow;
int32 _dialogsWidth;
DialogsWidget dialogs;
HistoryWidget history;
ProfileWidget *profile;
2014-08-15 11:19:32 +00:00
OverviewWidget *overview;
2015-07-03 08:47:16 +00:00
PlayerWidget _player;
TopBarWidget _topBar;
ConfirmBox *_forwardConfirm; // for narrow mode
HistoryHider *_hider;
2014-08-15 11:19:32 +00:00
StackItems _stack;
PeerData *_peerInStack;
MsgId _msgIdInStack;
2015-12-07 13:05:00 +00:00
StickerPreviewWidget *_stickerPreview;
2015-07-03 08:47:16 +00:00
int32 _playerHeight;
int32 _contentScrollAddToY;
Dropdown _mediaType;
int32 _mediaTypeMask;
2015-09-13 08:41:27 +00:00
int32 updDate, updQts, updSeq;
SingleTimer noUpdatesTimer;
2015-09-13 08:41:27 +00:00
bool ptsUpdated(int32 pts, int32 ptsCount);
bool ptsUpdated(int32 pts, int32 ptsCount, const MTPUpdates &updates);
bool ptsUpdated(int32 pts, int32 ptsCount, const MTPUpdate &update);
2015-09-20 09:54:22 +00:00
void ptsApplySkippedUpdates();
2015-09-13 08:41:27 +00:00
PtsWaiter _ptsWaiter;
typedef QMap<ChannelData*, uint64> ChannelGetDifferenceTime;
ChannelGetDifferenceTime _channelGetDifferenceTimeByPts, _channelGetDifferenceTimeAfterFail;
uint64 _getDifferenceTimeByPts, _getDifferenceTimeAfterFail;
bool getDifferenceTimeChanged(ChannelData *channel, int32 ms, ChannelGetDifferenceTime &channelCurTime, uint64 &curTime);
SingleTimer _byPtsTimer;
QMap<int32, MTPUpdates> _bySeqUpdates;
SingleTimer _bySeqTimer;
mtpRequestId _onlineRequest;
SingleTimer _onlineTimer, _onlineUpdater, _idleFinishTimer;
bool _lastWasOnline;
uint64 _lastSetOnline;
bool _isIdle;
QSet<PeerData*> updateNotifySettingPeers;
SingleTimer updateNotifySettingTimer;
2015-09-16 21:15:13 +00:00
typedef QMap<PeerData*, QPair<mtpRequestId, MsgId> > ReadRequests;
ReadRequests _readRequests;
2015-09-06 10:17:09 +00:00
typedef QMap<PeerData*, MsgId> ReadRequestsPending;
ReadRequestsPending _readRequestsPending;
2014-08-15 11:19:32 +00:00
typedef QMap<PeerData*, mtpRequestId> OverviewsPreload;
OverviewsPreload _overviewPreload[OverviewCount], _overviewLoad[OverviewCount];
int32 _failDifferenceTimeout; // growing timeout for getDifference calls, if it fails
2015-09-13 08:41:27 +00:00
typedef QMap<ChannelData*, int32> ChannelFailDifferenceTimeout;
ChannelFailDifferenceTimeout _channelFailDifferenceTimeout; // growing timeout for getChannelDifference calls, if it fails
SingleTimer _failDifferenceTimer;
uint64 _lastUpdateTime;
2015-09-21 20:57:42 +00:00
bool _handlingChannelDifference;
2015-02-03 15:02:46 +00:00
QPixmap _cachedBackground;
QRect _cachedFor, _willCacheFor;
int _cachedX, _cachedY;
SingleTimer _cacheBackgroundTimer;
2015-09-21 20:57:42 +00:00
typedef QMap<ChannelData*, bool> UpdatedChannels;
UpdatedChannels _updatedChannels;
typedef QMap<MsgId, bool> ViewsIncrementMap;
typedef QMap<PeerData*, ViewsIncrementMap> ViewsIncrement;
ViewsIncrement _viewsIncremented, _viewsToIncrement;
typedef QMap<PeerData*, mtpRequestId> ViewsIncrementRequests;
ViewsIncrementRequests _viewsIncrementRequests;
typedef QMap<mtpRequestId, PeerData*> ViewsIncrementByRequest;
ViewsIncrementByRequest _viewsIncrementByRequest;
SingleTimer _viewsIncrementTimer;
void viewsIncrementDone(QVector<MTPint> ids, const MTPVector<MTPint> &result, mtpRequestId req);
bool viewsIncrementFail(const RPCError &error, mtpRequestId req);
2015-02-03 15:02:46 +00:00
App::WallPaper *_background;
ApiWrap *_api;
};