tdesktop/Telegram/SourceFiles/mainwidget.h

688 lines
22 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
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/
#pragma once
2017-03-04 10:23:56 +00:00
#include "storage/localimageloader.h"
#include "history/history_common.h"
#include "core/single_timer.h"
#include "base/weak_unique_ptr.h"
2017-09-13 16:57:44 +00:00
#include "ui/rp_widget.h"
namespace Notify {
struct PeerUpdate;
} // namespace Notify
namespace Dialogs {
class Row;
} // namespace Dialogs
2016-09-17 19:28:33 +00:00
namespace Media {
namespace Player {
class Widget;
class VolumeWidget;
class Panel;
class Float;
2016-09-17 19:28:33 +00:00
} // namespace Player
} // namespace Media
namespace Ui {
class ResizeArea;
class PlainShadow;
class DropdownMenu;
template <typename Widget>
2017-09-13 16:57:44 +00:00
class SlideWrap;
} // namespace Ui
namespace Window {
class Controller;
class PlayerWrapWidget;
class TopBarWidget;
class SectionMemento;
class SectionWidget;
class AbstractSectionWidget;
struct SectionSlideParams;
struct SectionShow;
enum class Column;
} // namespace Window
namespace Calls {
class Call;
class TopBar;
} // namespace Calls
class MainWindow;
class ConfirmBox;
class DialogsWidget;
class HistoryWidget;
class OverviewWidget;
class HistoryHider;
class StackItem;
2014-08-15 11:19:32 +00:00
2016-02-25 16:19:54 +00:00
enum SilentNotifiesStatus {
SilentNotifiesDontChange,
SilentNotifiesSetSilent,
SilentNotifiesSetNotify,
};
enum NotifySettingStatus {
NotifySettingDontChange,
NotifySettingSetMuted,
NotifySettingSetNotify,
};
namespace InlineBots {
namespace Layout {
class ItemBase;
} // namespace Layout
} // namespace InlineBots
2017-09-13 16:57:44 +00:00
class MainWidget : public Ui::RpWidget, public RPCSender, private base::Subscriber {
Q_OBJECT
public:
using SectionShow = Window::SectionShow;
MainWidget(QWidget *parent, not_null<Window::Controller*> controller);
bool isMainSectionShown() const;
bool isThirdSectionShown() const;
// Temporary methods, while top bar was not done inside HistoryWidget / OverviewWidget.
2016-12-01 19:20:33 +00:00
bool paintTopBar(Painter &, int decreaseWidth, TimeMs ms);
QRect getMembersShowAreaGeometry() const;
void setMembersShowAreaActive(bool active);
int contentScrollAddToY() const;
2015-07-03 08:47:16 +00:00
void showAnimated(const QPixmap &bgAnimCache, bool back = false);
void start(const MTPUser *self = nullptr);
2015-05-19 15:46:45 +00:00
void openPeerByName(const QString &name, MsgId msgId = ShowAtUnreadMsgId, const QString &startToken = QString());
void joinGroupByHash(const QString &hash);
2015-05-19 15:46:45 +00:00
void stickersBox(const MTPInputStickerSet &set);
bool started();
void applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNotifySettings &settings, History *history = 0);
void updateNotifySetting(PeerData *peer, NotifySettingStatus notify, SilentNotifiesStatus silent = SilentNotifiesDontChange, int muteFor = 86400 * 365);
void incrementSticker(DocumentData *sticker);
void activate();
2015-09-21 20:57:42 +00:00
void createDialog(History *history);
void removeDialog(History *history);
void dlgUpdated();
void dlgUpdated(Dialogs::Mode list, Dialogs::Row *row);
void dlgUpdated(PeerData *peer, MsgId msgId);
void windowShown();
void sentUpdatesReceived(uint64 randomId, const MTPUpdates &updates);
void sentUpdatesReceived(const MTPUpdates &updates) {
return sentUpdatesReceived(0, updates);
}
bool deleteChannelFailed(const RPCError &error);
void inviteToChannelDone(ChannelData *channel, const MTPUpdates &updates);
void historyToDown(History *hist);
void dialogsToUp();
void newUnreadMsg(History *history, HistoryItem *item);
void markActiveHistoryAsRead();
void peerBefore(const PeerData *inPeer, MsgId inMsg, PeerData *&outPeer, MsgId &outMsg);
void peerAfter(const PeerData *inPeer, MsgId inMsg, PeerData *&outPeer, MsgId &outMsg);
PeerData *peer();
PeerData *activePeer();
MsgId activeMsgId();
int backgroundFromY() const;
2015-07-03 08:47:16 +00:00
PeerData *overviewPeer();
bool showMediaTypeSwitch() const;
void showSection(
Window::SectionMemento &&memento,
const SectionShow &params);
void updateColumnLayout();
void showMediaOverview(
PeerData *peer,
MediaOverviewType type,
bool back = false,
int32 lastScrollTop = -1);
bool stackIsEmpty() const;
void showBackFromStack(
const SectionShow &params);
void orderWidgets();
QRect historyRect() const;
QPixmap grabForShowAnimation(const Window::SectionSlideParams &params);
void checkMainSectionToLayer();
void onSendFileConfirm(const FileLoadResultPtr &file);
bool onSendSticker(DocumentData *sticker);
void destroyData();
void updateOnlineDisplayIn(int32 msecs);
bool isActive() const;
bool doWeReadServerHistory() const;
bool doWeReadMentions() const;
bool lastWasOnline() const;
2016-12-01 19:20:33 +00:00
TimeMs lastSetOnline() const;
void saveDraftToCloud();
void applyCloudDraft(History *history);
void writeDrafts(History *history);
int32 dlgsWidth() const;
void showForwardLayer(const SelectedItemSet &items);
void showSendPathsLayer();
void deleteLayer(int selectedCount = 0); // 0 - context item
void cancelUploadLayer();
void shareContactLayer(UserData *contact);
2015-10-18 12:49:34 +00:00
void shareUrlLayer(const QString &url, const QString &text);
void inlineSwitchLayer(const QString &botAndQuery);
void hiderLayer(object_ptr<HistoryHider> h);
void noHider(HistoryHider *destroyed);
bool setForwardDraft(PeerId peer, ForwardWhatMessages what);
bool setForwardDraft(PeerId peer, const SelectedItemSet &items);
2015-10-18 12:49:34 +00:00
bool onShareUrl(const PeerId &peer, const QString &url, const QString &text);
bool onInlineSwitchChosen(const PeerId &peer, const QString &botAndQuery);
void onShareContact(const PeerId &peer, UserData *contact);
bool onSendPaths(const PeerId &peer);
void onFilesOrForwardDrop(const PeerId &peer, const QMimeData *data);
bool selectingPeer(bool withConfirm = false) const;
bool selectingPeerForInlineSwitch();
void offerPeer(PeerId peer);
void dialogsActivate();
void deletePhotoLayer(PhotoData *photo);
DragState getDragState(const QMimeData *mime);
bool leaveChatFailed(PeerData *peer, const RPCError &e);
void deleteHistoryAfterLeave(PeerData *peer, const MTPUpdates &updates);
void deleteMessages(PeerData *peer, const QVector<MTPint> &ids, bool forEveryone);
void deletedContact(UserData *user, const MTPcontacts_Link &result);
2015-09-24 08:58:10 +00:00
void deleteConversation(PeerData *peer, bool deleteHistory = true);
void deleteAndExit(ChatData *chat);
void clearHistory(PeerData *peer);
void deleteAllFromUser(ChannelData *channel, UserData *from);
void addParticipants(PeerData *chatOrChannel, const std::vector<not_null<UserData*>> &users);
struct UserAndPeer {
UserData *user;
PeerData *peer;
};
bool addParticipantFail(UserAndPeer data, 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 confirmDeleteSelectedItems();
void clearSelectedItems();
Dialogs::IndexedList *contactsList();
Dialogs::IndexedList *dialogsList();
Dialogs::IndexedList *contactsNoDialogsList();
struct MessageToSend {
History *history = nullptr;
TextWithTags textWithTags;
MsgId replyTo = 0;
bool silent = false;
WebPageId webPageId = 0;
bool clearDraft = true;
};
void sendMessage(const MessageToSend &message);
void saveRecentHashtags(const QString &text);
void readServerHistory(History *history, ReadServerHistoryChecks checks = ReadServerHistoryChecks::OnlyIfUnread);
void unreadCountChanged(History *history);
TimeMs highlightStartTime(not_null<const HistoryItem*> item) const;
2016-04-14 19:24:42 +00:00
void sendBotCommand(PeerData *peer, UserData *bot, const QString &cmd, MsgId replyTo);
void hideSingleUseKeyboard(PeerData *peer, MsgId replyTo);
bool insertBotCommand(const QString &cmd);
void jumpToDate(not_null<PeerData*> peer, const QDate &date);
2015-09-21 20:57:42 +00:00
void searchMessages(const QString &query, PeerData *inPeer);
bool preloadOverview(PeerData *peer, MediaOverviewType type);
void itemEdited(HistoryItem *item);
2014-08-15 11:19:32 +00:00
void loadMediaBack(PeerData *peer, MediaOverviewType type, bool many = false);
void checkLastUpdate(bool afterSleep);
void insertCheckedServiceNotification(const TextWithEntities &message, const MTPMessageMedia &media, int32 date);
void serviceHistoryDone(const MTPmessages_Messages &msgs);
bool serviceHistoryFail(const RPCError &error);
bool isIdle() const;
2015-02-03 15:02:46 +00:00
QPixmap cachedBackground(const QRect &forRect, int &x, int &y);
void updateScrollColors();
void setChatBackground(const App::WallPaper &wp);
bool chatBackgroundLoading();
float64 chatBackgroundProgress() const;
2015-02-03 15:02:46 +00:00
void checkChatBackground();
ImagePtr newBackgroundThumb();
void messageDataReceived(ChannelData *channel, MsgId msgId);
void updateBotKeyboard(History *h);
void pushReplyReturn(HistoryItem *item);
void cancelForwarding(History *history);
void finishForwarding(History *history, bool silent); // send them
void mediaMarkRead(not_null<DocumentData*> data);
void mediaMarkRead(const HistoryItemsMap &items);
void mediaMarkRead(not_null<HistoryItem*> item);
2015-04-07 23:03:32 +00:00
void webPageUpdated(WebPageData *page);
void gameUpdated(GameData *game);
void updateMutedIn(int32 seconds);
2015-04-07 23:03:32 +00:00
void choosePeer(PeerId peerId, MsgId showAtMsgId); // does offerPeer or showPeerHistory
void clearBotStartToken(PeerData *peer);
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);
2015-09-16 13:04:08 +00:00
void ctrlEnterSubmitUpdated();
void setInnerFocus();
2015-09-21 20:57:42 +00:00
void scheduleViewIncrement(HistoryItem *item);
void gotRangeDifference(ChannelData *channel, const MTPupdates_ChannelDifference &diff);
void onSelfParticipantUpdated(ChannelData *channel);
// Mayde public for ApiWrap, while it is still here.
// Better would be for this to be moved to ApiWrap.
bool requestingDifference() const {
return _ptsWaiter.requesting();
}
2015-10-01 14:05:05 +00:00
bool contentOverlapped(const QRect &globalRect);
void documentLoadProgress(DocumentData *document);
void app_sendBotCallback(const HistoryMessageReplyMarkup::Button *button, const HistoryItem *msg, int row, int col);
void ui_showPeerHistory(
PeerId peer,
const SectionShow &params,
MsgId msgId);
PeerData *ui_getPeerForMouseAction();
void notify_botCommandsChanged(UserData *bot);
void notify_inlineBotRequesting(bool requesting);
void notify_replyMarkupUpdated(const HistoryItem *item);
void notify_inlineKeyboardMoved(const HistoryItem *item, int oldKeyboardTop, int newKeyboardTop);
bool notify_switchInlineBotButtonReceived(const QString &query, UserData *samePeerBot, MsgId samePeerReplyTo);
void notify_userIsBotChanged(UserData *bot);
void notify_userIsContactChanged(UserData *user, bool fromThisApp);
void notify_migrateUpdated(PeerData *peer);
void notify_historyMuteUpdated(History *history);
2015-12-07 13:05:00 +00:00
bool cmd_search();
bool cmd_next_chat();
bool cmd_previous_chat();
~MainWidget();
signals:
void dialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow);
void dialogsUpdated();
public slots:
void webPagesOrGamesUpdate();
2015-04-07 23:03:32 +00:00
void documentLoadProgress(FileLoader *loader);
void documentLoadFailed(FileLoader *loader, bool started);
void inlineResultLoadProgress(FileLoader *loader);
void inlineResultLoadFailed(FileLoader *loader, bool started);
void dialogsCancelled();
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();
2015-10-03 10:09:09 +00:00
void onHistoryShown(History *history, MsgId atMsgId);
void searchInPeer(PeerData *peer);
void onUpdateNotifySettings();
2015-02-03 15:02:46 +00:00
void onCacheBackground();
void onInviteImport();
void onUpdateMuted();
2015-09-21 20:57:42 +00:00
void onViewsIncrement();
2015-05-19 15:46:45 +00:00
protected:
void paintEvent(QPaintEvent *e) override;
void resizeEvent(QResizeEvent *e) override;
void keyPressEvent(QKeyEvent *e) override;
bool eventFilter(QObject *o, QEvent *e) override;
private:
struct Float {
template <typename ToggleCallback, typename DraggedCallback>
Float(QWidget *parent, HistoryItem *item, ToggleCallback callback, DraggedCallback dragged);
bool hiddenByWidget = false;
bool hiddenByHistory = false;
bool visible = false;
RectPart animationSide;
Animation visibleAnimation;
Window::Column column;
RectPart corner;
QPoint dragFrom;
Animation draggedAnimation;
bool hiddenByDrag = false;
object_ptr<Media::Player::Float> widget;
};
using ChannelGetDifferenceTime = QMap<ChannelData*, TimeMs>;
enum class ChannelDifferenceRequest {
Unknown,
PtsGapOrShortPoll,
AfterFail,
};
struct DeleteHistoryRequest {
PeerData *peer;
bool justClearHistory;
};
struct DeleteAllFromUserParams {
ChannelData *channel;
UserData *from;
};
void animationCallback();
void handleAdaptiveLayoutUpdate();
void updateWindowAdaptiveLayout();
void handleAudioUpdate(const AudioMsgId &audioId);
void updateMediaPlayerPosition();
void updateMediaPlaylistPosition(int x);
void updateControlsGeometry();
void updateDialogsWidthAnimated();
void updateThirdColumnToCurrentPeer(
PeerData *peer,
bool canWrite);
void createPlayer();
void switchToPanelPlayer();
void switchToFixedPlayer();
void closeBothPlayers();
void playerHeightUpdated();
void setCurrentCall(Calls::Call *call);
void createCallTopBar();
void destroyCallTopBar();
2017-09-13 16:57:44 +00:00
void callTopBarHeightUpdated(int callTopBarHeight);
2015-09-06 10:17:09 +00:00
void sendReadRequest(PeerData *peer, MsgId upTo);
void channelReadDone(PeerData *peer, const MTPBool &result);
void historyReadDone(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(
std::pair<not_null<History*>, MsgId> historyAndStartMsgId,
const MTPmessages_Messages &result,
mtpRequestId req);
void mediaOverviewUpdated(const Notify::PeerUpdate &update);
2014-08-15 11:19:32 +00:00
Window::SectionSlideParams prepareShowAnimation(
bool willHaveTopBarShadow);
void showNewSection(
Window::SectionMemento &&memento,
const SectionShow &params);
void dropMainSection(Window::SectionWidget *widget);
Window::SectionSlideParams prepareThirdSectionAnimation(Window::SectionWidget *section);
// All this methods use the prepareShowAnimation().
Window::SectionSlideParams prepareMainSectionAnimation(Window::SectionWidget *section);
Window::SectionSlideParams prepareHistoryAnimation(PeerId historyPeerId);
Window::SectionSlideParams prepareOverviewAnimation();
Window::SectionSlideParams prepareDialogsAnimation();
2017-07-18 15:15:02 +00:00
void startWithSelf(const MTPUserFull &user);
void saveSectionInStack();
void getChannelDifference(ChannelData *channel, ChannelDifferenceRequest from = ChannelDifferenceRequest::Unknown);
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 deleteHistoryPart(DeleteHistoryRequest request, const MTPmessages_AffectedHistory &result);
void deleteAllFromUserPart(DeleteAllFromUserParams params, const MTPmessages_AffectedHistory &result);
void updateReceived(const mtpPrime *from, const mtpPrime *end);
bool updateFail(const RPCError &e);
void usernameResolveDone(QPair<MsgId, QString> msgIdAndStartToken, const MTPcontacts_ResolvedPeer &result);
bool usernameResolveFail(QString name, const RPCError &error);
void inviteCheckDone(QString hash, const MTPChatInvite &invite);
bool inviteCheckFail(const RPCError &error);
void inviteImportDone(const MTPUpdates &result);
bool inviteImportFail(const RPCError &error);
int getMainSectionTop() const;
int getThirdSectionTop() const;
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);
void clearCachedBackground();
void checkCurrentFloatPlayer();
void toggleFloatPlayer(not_null<Float*> instance);
void checkFloatPlayerVisibility();
void updateFloatPlayerPosition(not_null<Float*> instance);
void removeFloatPlayer(not_null<Float*> instance);
Float *currentFloatPlayer() const {
return _playerFloats.empty() ? nullptr : _playerFloats.back().get();
}
Window::AbstractSectionWidget *getFloatPlayerSection(
Window::Column column) const;
void finishFloatPlayerDrag(
not_null<Float*> instance,
bool closed);
void updateFloatPlayerColumnCorner(QPoint center);
QPoint getFloatPlayerPosition(not_null<Float*> instance) const;
QPoint getFloatPlayerHiddenPosition(
QPoint position,
QSize size,
RectPart side) const;
RectPart getFloatPlayerSide(QPoint center) const;
bool ptsUpdateAndApply(int32 pts, int32 ptsCount, const MTPUpdates &updates);
bool ptsUpdateAndApply(int32 pts, int32 ptsCount, const MTPUpdate &update);
bool ptsUpdateAndApply(int32 pts, int32 ptsCount);
bool getDifferenceTimeChanged(ChannelData *channel, int32 ms, ChannelGetDifferenceTime &channelCurTime, TimeMs &curTime);
void viewsIncrementDone(QVector<MTPint> ids, const MTPVector<MTPint> &result, mtpRequestId req);
bool viewsIncrementFail(const RPCError &error, mtpRequestId req);
void refreshResizeAreas();
template <typename MoveCallback, typename FinishCallback>
void createResizeArea(
object_ptr<Ui::ResizeArea> &area,
MoveCallback &&moveCallback,
FinishCallback &&finishCallback);
void ensureFirstColumnResizeAreaCreated();
void ensureThirdColumnResizeAreaCreated();
not_null<Window::Controller*> _controller;
bool _started = false;
OrderedSet<WebPageId> _webPagesUpdated;
OrderedSet<GameId> _gamesUpdated;
QTimer _webPageOrGameUpdater;
SingleTimer _updateMutedTimer;
QString _inviteHash;
Animation _a_show;
bool _showBack = false;
2015-10-17 14:52:26 +00:00
QPixmap _cacheUnder, _cacheOver;
int _dialogsWidth;
Animation _a_dialogsWidth;
object_ptr<Ui::PlainShadow> _sideShadow;
object_ptr<Ui::PlainShadow> _thirdShadow = { nullptr };
object_ptr<Ui::ResizeArea> _firstColumnResizeArea = { nullptr };
object_ptr<Ui::ResizeArea> _thirdColumnResizeArea = { nullptr };
object_ptr<DialogsWidget> _dialogs;
object_ptr<HistoryWidget> _history;
object_ptr<Window::SectionWidget> _mainSection = { nullptr };
object_ptr<Window::SectionWidget> _thirdSection = { nullptr };
object_ptr<OverviewWidget> _overview = { nullptr };
base::weak_unique_ptr<Calls::Call> _currentCall;
2017-09-13 16:57:44 +00:00
object_ptr<Ui::SlideWrap<Calls::TopBar>> _callTopBar = { nullptr };
object_ptr<Window::PlayerWrapWidget> _player = { nullptr };
object_ptr<Media::Player::VolumeWidget> _playerVolume = { nullptr };
object_ptr<Media::Player::Panel> _playerPlaylist;
object_ptr<Media::Player::Panel> _playerPanel;
bool _playerUsingPanel = false;
std::vector<std::unique_ptr<Float>> _playerFloats;
QPointer<ConfirmBox> _forwardConfirm; // for single column layout
object_ptr<HistoryHider> _hider = { nullptr };
std::vector<std::unique_ptr<StackItem>> _stack;
PeerData *_peerInStack = nullptr;
MsgId _msgIdInStack = 0;
int _playerHeight = 0;
int _callTopBarHeight = 0;
int _contentScrollAddToY = 0;
2015-07-03 08:47:16 +00:00
int32 updDate = 0;
int32 updQts = -1;
int32 updSeq = 0;
SingleTimer noUpdatesTimer;
2015-09-13 08:41:27 +00:00
PtsWaiter _ptsWaiter;
ChannelGetDifferenceTime _channelGetDifferenceTimeByPts, _channelGetDifferenceTimeAfterFail;
2016-12-01 19:20:33 +00:00
TimeMs _getDifferenceTimeByPts = 0;
TimeMs _getDifferenceTimeAfterFail = 0;
2015-09-13 08:41:27 +00:00
SingleTimer _byPtsTimer;
QMap<int32, MTPUpdates> _bySeqUpdates;
SingleTimer _bySeqTimer;
SingleTimer _byMinChannelTimer;
mtpRequestId _onlineRequest = 0;
SingleTimer _onlineTimer, _onlineUpdater, _idleFinishTimer;
bool _lastWasOnline = false;
2016-12-01 19:20:33 +00:00
TimeMs _lastSetOnline = 0;
bool _isIdle = false;
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 = 1; // 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;
2016-12-01 19:20:33 +00:00
TimeMs _lastUpdateTime = 0;
bool _handlingChannelDifference = false;
2015-02-03 15:02:46 +00:00
QPixmap _cachedBackground;
QRect _cachedFor, _willCacheFor;
int _cachedX = 0;
int _cachedY = 0;
2015-02-03 15:02:46 +00:00
SingleTimer _cacheBackgroundTimer;
2015-09-21 20:57:42 +00:00
typedef QMap<ChannelData*, bool> UpdatedChannels;
UpdatedChannels _updatedChannels;
PhotoData *_deletingPhoto = nullptr;
2015-09-21 20:57:42 +00:00
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;
std::unique_ptr<App::WallPaper> _background;
2015-02-03 15:02:46 +00:00
bool _firstColumnResizing = false;
int _firstColumnResizingShift = 0;
};