2014-05-30 08:53:19 +00:00
|
|
|
/*
|
|
|
|
This file is part of Telegram Desktop,
|
2018-01-03 10:23:14 +00:00
|
|
|
the official desktop application for the Telegram messaging service.
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2018-01-03 10:23:14 +00:00
|
|
|
For license and copyright information please follow this link:
|
|
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
2014-05-30 08:53:19 +00:00
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
|
2016-10-05 16:56:27 +00:00
|
|
|
#include "core/single_timer.h"
|
2017-11-30 17:33:27 +00:00
|
|
|
#include "base/weak_ptr.h"
|
2017-09-13 16:57:44 +00:00
|
|
|
#include "ui/rp_widget.h"
|
2016-04-12 21:31:28 +00:00
|
|
|
|
2017-12-18 15:44:50 +00:00
|
|
|
struct HistoryMessageMarkupButton;
|
|
|
|
class MainWindow;
|
|
|
|
class ConfirmBox;
|
|
|
|
class DialogsWidget;
|
|
|
|
class HistoryWidget;
|
|
|
|
class HistoryHider;
|
|
|
|
class StackItem;
|
2017-12-19 16:57:42 +00:00
|
|
|
struct FileLoadResult;
|
2017-12-18 15:44:50 +00:00
|
|
|
|
2017-01-01 16:45:20 +00:00
|
|
|
namespace Notify {
|
|
|
|
struct PeerUpdate;
|
|
|
|
} // namespace Notify
|
|
|
|
|
2016-04-12 21:31:28 +00:00
|
|
|
namespace Dialogs {
|
2018-01-04 17:15:04 +00:00
|
|
|
struct RowDescriptor;
|
2016-04-12 21:31:28 +00:00
|
|
|
class Row;
|
2018-01-13 12:45:11 +00:00
|
|
|
class Key;
|
|
|
|
class IndexedList;
|
2016-04-12 21:31:28 +00:00
|
|
|
} // namespace Dialogs
|
|
|
|
|
2016-09-17 19:28:33 +00:00
|
|
|
namespace Media {
|
|
|
|
namespace Player {
|
|
|
|
class Widget;
|
2016-10-12 19:34:25 +00:00
|
|
|
class VolumeWidget;
|
|
|
|
class Panel;
|
2017-05-22 15:25:49 +00:00
|
|
|
class Float;
|
2016-09-17 19:28:33 +00:00
|
|
|
} // namespace Player
|
|
|
|
} // namespace Media
|
|
|
|
|
2016-04-12 21:31:28 +00:00
|
|
|
namespace Ui {
|
2017-11-12 15:41:00 +00:00
|
|
|
class ResizeArea;
|
2016-10-12 19:34:25 +00:00
|
|
|
class PlainShadow;
|
2016-10-26 16:43:13 +00:00
|
|
|
class DropdownMenu;
|
2017-04-25 20:36:04 +00:00
|
|
|
template <typename Widget>
|
2017-09-13 16:57:44 +00:00
|
|
|
class SlideWrap;
|
2016-04-12 21:31:28 +00:00
|
|
|
} // namespace Ui
|
|
|
|
|
|
|
|
namespace Window {
|
2017-03-27 12:24:38 +00:00
|
|
|
class Controller;
|
2016-10-12 19:34:25 +00:00
|
|
|
class PlayerWrapWidget;
|
2016-05-19 12:03:51 +00:00
|
|
|
class SectionMemento;
|
|
|
|
class SectionWidget;
|
2017-05-24 10:04:29 +00:00
|
|
|
class AbstractSectionWidget;
|
2018-05-07 17:44:33 +00:00
|
|
|
class ConnectingWidget;
|
2016-05-19 12:03:51 +00:00
|
|
|
struct SectionSlideParams;
|
2017-10-03 13:05:58 +00:00
|
|
|
struct SectionShow;
|
2017-05-24 10:04:29 +00:00
|
|
|
enum class Column;
|
2016-04-12 21:31:28 +00:00
|
|
|
} // namespace Window
|
|
|
|
|
2017-04-25 20:36:04 +00:00
|
|
|
namespace Calls {
|
|
|
|
class Call;
|
|
|
|
class TopBar;
|
|
|
|
} // namespace Calls
|
|
|
|
|
2016-04-04 21:09:46 +00:00
|
|
|
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 {
|
2014-05-30 08:53:19 +00:00
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
2017-10-03 13:05:58 +00:00
|
|
|
using SectionShow = Window::SectionShow;
|
|
|
|
|
2017-08-17 08:31:24 +00:00
|
|
|
MainWidget(QWidget *parent, not_null<Window::Controller*> controller);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2017-09-16 16:53:41 +00:00
|
|
|
bool isMainSectionShown() const;
|
|
|
|
bool isThirdSectionShown() const;
|
2014-12-12 16:27:03 +00:00
|
|
|
|
2016-04-08 09:20:10 +00:00
|
|
|
int contentScrollAddToY() const;
|
2015-07-03 08:47:16 +00:00
|
|
|
|
2016-12-05 11:01:08 +00:00
|
|
|
void showAnimated(const QPixmap &bgAnimCache, bool back = false);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2017-03-04 19:36:59 +00:00
|
|
|
void start(const MTPUser *self = nullptr);
|
2015-05-19 15:46:45 +00:00
|
|
|
|
2016-02-17 16:37:21 +00:00
|
|
|
void openPeerByName(const QString &name, MsgId msgId = ShowAtUnreadMsgId, const QString &startToken = QString());
|
2015-04-30 13:53:36 +00:00
|
|
|
void joinGroupByHash(const QString &hash);
|
2015-05-19 15:46:45 +00:00
|
|
|
void stickersBox(const MTPInputStickerSet &set);
|
|
|
|
|
2014-12-12 16:27:03 +00:00
|
|
|
bool started();
|
2017-12-04 17:46:03 +00:00
|
|
|
void applyNotifySetting(
|
|
|
|
const MTPNotifyPeer ¬ifyPeer,
|
|
|
|
const MTPPeerNotifySettings &settings,
|
|
|
|
History *history = 0);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2017-12-04 17:46:03 +00:00
|
|
|
void updateNotifySettings(
|
|
|
|
not_null<PeerData*> peer,
|
|
|
|
Data::NotifySettings::MuteChange mute,
|
|
|
|
Data::NotifySettings::SilentPostsChange silent
|
|
|
|
= Data::NotifySettings::SilentPostsChange::Ignore,
|
|
|
|
int muteForSeconds = 86400 * 365);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2015-01-02 14:55:24 +00:00
|
|
|
void incrementSticker(DocumentData *sticker);
|
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
void activate();
|
|
|
|
|
2018-01-05 15:57:18 +00:00
|
|
|
void createDialog(Dialogs::Key key);
|
|
|
|
void removeDialog(Dialogs::Key key);
|
2018-01-22 17:39:20 +00:00
|
|
|
void repaintDialogRow(Dialogs::Mode list, not_null<Dialogs::Row*> row);
|
|
|
|
void repaintDialogRow(not_null<History*> history, MsgId messageId);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
void windowShown();
|
|
|
|
|
2015-08-30 14:57:21 +00:00
|
|
|
void sentUpdatesReceived(uint64 randomId, const MTPUpdates &updates);
|
|
|
|
void sentUpdatesReceived(const MTPUpdates &updates) {
|
|
|
|
return sentUpdatesReceived(0, updates);
|
|
|
|
}
|
2016-03-23 16:50:40 +00:00
|
|
|
bool deleteChannelFailed(const RPCError &error);
|
2017-12-03 16:43:42 +00:00
|
|
|
void inviteToChannelDone(
|
|
|
|
not_null<ChannelData*> channel,
|
|
|
|
const MTPUpdates &updates);
|
2014-05-30 08:53:19 +00:00
|
|
|
void historyToDown(History *hist);
|
|
|
|
void dialogsToUp();
|
2018-02-23 23:46:35 +00:00
|
|
|
void newUnreadMsg(
|
|
|
|
not_null<History*> history,
|
|
|
|
not_null<HistoryItem*> item);
|
2016-06-03 12:45:33 +00:00
|
|
|
void markActiveHistoryAsRead();
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2018-01-04 17:15:04 +00:00
|
|
|
Dialogs::RowDescriptor chatListEntryBefore(
|
|
|
|
const Dialogs::RowDescriptor &which) const;
|
|
|
|
Dialogs::RowDescriptor chatListEntryAfter(
|
|
|
|
const Dialogs::RowDescriptor &which) const;
|
2015-07-17 19:17:37 +00:00
|
|
|
|
2018-01-04 17:15:04 +00:00
|
|
|
PeerData *peer();
|
2015-07-17 19:17:37 +00:00
|
|
|
|
2017-03-27 12:24:38 +00:00
|
|
|
int backgroundFromY() const;
|
2017-09-16 16:53:41 +00:00
|
|
|
void showSection(
|
|
|
|
Window::SectionMemento &&memento,
|
2017-10-03 13:05:58 +00:00
|
|
|
const SectionShow ¶ms);
|
2017-09-16 16:53:41 +00:00
|
|
|
void updateColumnLayout();
|
2016-07-05 14:48:36 +00:00
|
|
|
bool stackIsEmpty() const;
|
2017-09-20 10:23:57 +00:00
|
|
|
void showBackFromStack(
|
2017-10-03 13:05:58 +00:00
|
|
|
const SectionShow ¶ms);
|
2015-07-17 19:17:37 +00:00
|
|
|
void orderWidgets();
|
2014-05-30 08:53:19 +00:00
|
|
|
QRect historyRect() const;
|
2016-05-19 12:03:51 +00:00
|
|
|
QPixmap grabForShowAnimation(const Window::SectionSlideParams ¶ms);
|
2017-09-16 16:53:41 +00:00
|
|
|
void checkMainSectionToLayer();
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2017-12-19 16:57:42 +00:00
|
|
|
void onSendFileConfirm(const std::shared_ptr<FileLoadResult> &file);
|
2016-09-11 08:38:14 +00:00
|
|
|
bool onSendSticker(DocumentData *sticker);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
void destroyData();
|
|
|
|
void updateOnlineDisplayIn(int32 msecs);
|
|
|
|
|
|
|
|
bool isActive() const;
|
2016-06-03 12:45:33 +00:00
|
|
|
bool doWeReadServerHistory() const;
|
2017-08-11 07:16:07 +00:00
|
|
|
bool doWeReadMentions() const;
|
2015-01-26 13:04:41 +00:00
|
|
|
bool lastWasOnline() const;
|
2016-12-01 19:20:33 +00:00
|
|
|
TimeMs lastSetOnline() const;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2016-06-03 18:24:27 +00:00
|
|
|
void saveDraftToCloud();
|
|
|
|
void applyCloudDraft(History *history);
|
2016-06-09 14:31:10 +00:00
|
|
|
void writeDrafts(History *history);
|
2016-06-03 18:24:27 +00:00
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
int32 dlgsWidth() const;
|
|
|
|
|
2017-12-06 10:13:38 +00:00
|
|
|
void showForwardLayer(MessageIdsList &&items);
|
2017-07-11 10:23:15 +00:00
|
|
|
void showSendPathsLayer();
|
2018-01-11 13:07:29 +00:00
|
|
|
void deleteLayer(FullMsgId itemId);
|
|
|
|
void cancelUploadLayer(not_null<HistoryItem*> item);
|
2015-10-18 12:49:34 +00:00
|
|
|
void shareUrlLayer(const QString &url, const QString &text);
|
2016-04-08 14:16:52 +00:00
|
|
|
void inlineSwitchLayer(const QString &botAndQuery);
|
2016-12-13 17:07:56 +00:00
|
|
|
void hiderLayer(object_ptr<HistoryHider> h);
|
2014-05-30 08:53:19 +00:00
|
|
|
void noHider(HistoryHider *destroyed);
|
2017-12-06 10:13:38 +00:00
|
|
|
bool setForwardDraft(PeerId peer, MessageIdsList &&items);
|
2017-11-30 17:45:36 +00:00
|
|
|
bool shareUrl(
|
|
|
|
not_null<PeerData*> peer,
|
|
|
|
const QString &url,
|
|
|
|
const QString &text);
|
2017-12-30 08:15:42 +00:00
|
|
|
void replyToItem(not_null<HistoryItem*> item);
|
2016-04-08 14:16:52 +00:00
|
|
|
bool onInlineSwitchChosen(const PeerId &peer, const QString &botAndQuery);
|
2016-11-28 15:45:07 +00:00
|
|
|
bool onSendPaths(const PeerId &peer);
|
2015-06-27 13:02:00 +00:00
|
|
|
void onFilesOrForwardDrop(const PeerId &peer, const QMimeData *data);
|
2017-05-24 12:07:58 +00:00
|
|
|
bool selectingPeer(bool withConfirm = false) const;
|
2016-04-08 14:16:52 +00:00
|
|
|
bool selectingPeerForInlineSwitch();
|
2014-05-30 08:53:19 +00:00
|
|
|
void offerPeer(PeerId peer);
|
|
|
|
void dialogsActivate();
|
|
|
|
|
2016-06-14 16:26:41 +00:00
|
|
|
void deletePhotoLayer(PhotoData *photo);
|
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
bool leaveChatFailed(PeerData *peer, const RPCError &e);
|
2015-08-04 15:01:47 +00:00
|
|
|
void deleteHistoryAfterLeave(PeerData *peer, const MTPUpdates &updates);
|
2017-12-07 13:02:24 +00:00
|
|
|
void deleteMessages(
|
|
|
|
not_null<PeerData*> peer,
|
|
|
|
const QVector<MTPint> &ids,
|
|
|
|
bool forEveryone);
|
2014-05-30 08:53:19 +00:00
|
|
|
void deletedContact(UserData *user, const MTPcontacts_Link &result);
|
2018-01-22 16:42:25 +00:00
|
|
|
void deleteConversation(
|
|
|
|
not_null<PeerData*> peer,
|
|
|
|
bool deleteHistory = true);
|
2016-06-01 20:05:37 +00:00
|
|
|
void deleteAndExit(ChatData *chat);
|
2016-03-13 15:45:00 +00:00
|
|
|
void deleteAllFromUser(ChannelData *channel, UserData *from);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2017-12-03 16:43:42 +00:00
|
|
|
void addParticipants(
|
|
|
|
not_null<PeerData*> chatOrChannel,
|
|
|
|
const std::vector<not_null<UserData*>> &users);
|
2017-01-01 16:45:20 +00:00
|
|
|
struct UserAndPeer {
|
|
|
|
UserData *user;
|
|
|
|
PeerData *peer;
|
|
|
|
};
|
|
|
|
bool addParticipantFail(UserAndPeer data, const RPCError &e);
|
2017-12-03 16:43:42 +00:00
|
|
|
bool addParticipantsFail(
|
|
|
|
not_null<ChannelData*> channel,
|
|
|
|
const RPCError &e); // for multi invite in channels
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2015-09-09 07:46:31 +00:00
|
|
|
bool sendMessageFail(const RPCError &error);
|
2015-01-05 20:17:33 +00:00
|
|
|
|
2016-04-09 18:45:55 +00:00
|
|
|
Dialogs::IndexedList *contactsList();
|
|
|
|
Dialogs::IndexedList *dialogsList();
|
2017-03-14 14:16:03 +00:00
|
|
|
Dialogs::IndexedList *contactsNoDialogsList();
|
2015-12-31 15:27:21 +00:00
|
|
|
|
2016-04-30 17:04:14 +00:00
|
|
|
struct MessageToSend {
|
2017-12-07 13:02:24 +00:00
|
|
|
MessageToSend(not_null<History*> history) : history(history) {
|
|
|
|
}
|
|
|
|
|
|
|
|
not_null<History*> history;
|
2016-05-05 16:04:17 +00:00
|
|
|
TextWithTags textWithTags;
|
2016-04-30 17:04:14 +00:00
|
|
|
MsgId replyTo = 0;
|
|
|
|
WebPageId webPageId = 0;
|
2016-06-03 18:24:27 +00:00
|
|
|
bool clearDraft = true;
|
2016-04-30 17:04:14 +00:00
|
|
|
};
|
|
|
|
void sendMessage(const MessageToSend &message);
|
2015-03-24 10:00:27 +00:00
|
|
|
void saveRecentHashtags(const QString &text);
|
2015-12-31 15:27:21 +00:00
|
|
|
|
2018-01-21 19:21:08 +00:00
|
|
|
void unreadCountChanged(not_null<History*> history);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2018-03-08 21:21:27 +00:00
|
|
|
// While HistoryInner is not HistoryView::ListWidget.
|
2017-08-25 15:17:46 +00:00
|
|
|
TimeMs highlightStartTime(not_null<const HistoryItem*> item) const;
|
2018-03-08 21:21:27 +00:00
|
|
|
bool historyInSelectionMode() const;
|
2014-07-04 11:12:54 +00:00
|
|
|
|
2016-04-14 19:24:42 +00:00
|
|
|
void sendBotCommand(PeerData *peer, UserData *bot, const QString &cmd, MsgId replyTo);
|
2016-11-20 12:54:07 +00:00
|
|
|
void hideSingleUseKeyboard(PeerData *peer, MsgId replyTo);
|
2017-03-27 18:11:51 +00:00
|
|
|
bool insertBotCommand(const QString &cmd);
|
2015-06-10 15:54:24 +00:00
|
|
|
|
2018-02-14 19:38:01 +00:00
|
|
|
void searchMessages(const QString &query, Dialogs::Key inChat);
|
2018-01-19 17:10:58 +00:00
|
|
|
void itemEdited(not_null<HistoryItem*> item);
|
2014-08-15 11:19:32 +00:00
|
|
|
|
2014-11-12 20:30:26 +00:00
|
|
|
void checkLastUpdate(bool afterSleep);
|
|
|
|
|
2017-06-30 11:30:11 +00:00
|
|
|
void insertCheckedServiceNotification(const TextWithEntities &message, const MTPMessageMedia &media, int32 date);
|
2014-12-12 16:27:03 +00:00
|
|
|
void serviceHistoryDone(const MTPmessages_Messages &msgs);
|
|
|
|
bool serviceHistoryFail(const RPCError &error);
|
|
|
|
|
2015-01-26 13:04:41 +00:00
|
|
|
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();
|
2016-06-22 13:39:54 +00:00
|
|
|
float64 chatBackgroundProgress() const;
|
2015-02-03 15:02:46 +00:00
|
|
|
void checkChatBackground();
|
|
|
|
ImagePtr newBackgroundThumb();
|
2015-03-19 09:18:19 +00:00
|
|
|
|
2016-03-10 10:15:21 +00:00
|
|
|
void messageDataReceived(ChannelData *channel, MsgId msgId);
|
2015-11-24 16:19:18 +00:00
|
|
|
void updateBotKeyboard(History *h);
|
2015-03-24 10:00:27 +00:00
|
|
|
|
2018-01-11 13:07:29 +00:00
|
|
|
void pushReplyReturn(not_null<HistoryItem*> item);
|
2015-12-31 15:27:21 +00:00
|
|
|
|
2017-12-08 11:52:12 +00:00
|
|
|
void cancelForwarding(not_null<History*> history);
|
|
|
|
void finishForwarding(not_null<History*> history);
|
2015-03-24 10:00:27 +00:00
|
|
|
|
2017-12-04 17:46:03 +00:00
|
|
|
void updateMutedIn(TimeMs delay);
|
2015-04-07 23:03:32 +00:00
|
|
|
|
2018-01-07 12:04:34 +00:00
|
|
|
// Does offerPeer or showPeerHistory.
|
|
|
|
void choosePeer(PeerId peerId, MsgId showAtMsgId);
|
2015-07-17 19:17:37 +00:00
|
|
|
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
|
|
|
|
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 onSelfParticipantUpdated(ChannelData *channel);
|
2018-01-31 17:10:29 +00:00
|
|
|
void feedChannelDifference(const MTPDupdates_channelDifference &data);
|
2015-09-21 20:57:42 +00:00
|
|
|
|
2017-07-14 11:54:47 +00:00
|
|
|
// 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);
|
|
|
|
|
2017-11-21 16:38:17 +00:00
|
|
|
bool ptsUpdateAndApply(int32 pts, int32 ptsCount, const MTPUpdates &updates);
|
|
|
|
bool ptsUpdateAndApply(int32 pts, int32 ptsCount, const MTPUpdate &update);
|
|
|
|
bool ptsUpdateAndApply(int32 pts, int32 ptsCount);
|
|
|
|
|
2016-09-23 16:04:26 +00:00
|
|
|
void documentLoadProgress(DocumentData *document);
|
|
|
|
|
2018-01-22 17:39:20 +00:00
|
|
|
void searchInChat(Dialogs::Key chat);
|
|
|
|
|
2017-12-18 15:44:50 +00:00
|
|
|
void app_sendBotCallback(
|
|
|
|
not_null<const HistoryMessageMarkupButton*> button,
|
|
|
|
not_null<const HistoryItem*> msg,
|
|
|
|
int row,
|
|
|
|
int column);
|
2016-04-06 17:02:22 +00:00
|
|
|
|
2017-09-20 10:23:57 +00:00
|
|
|
void ui_showPeerHistory(
|
|
|
|
PeerId peer,
|
2017-10-03 13:05:58 +00:00
|
|
|
const SectionShow ¶ms,
|
|
|
|
MsgId msgId);
|
2016-03-29 17:17:00 +00:00
|
|
|
PeerData *ui_getPeerForMouseAction();
|
2015-12-13 11:17:15 +00:00
|
|
|
|
|
|
|
void notify_botCommandsChanged(UserData *bot);
|
2016-01-01 09:58:05 +00:00
|
|
|
void notify_inlineBotRequesting(bool requesting);
|
2016-04-01 15:32:26 +00:00
|
|
|
void notify_replyMarkupUpdated(const HistoryItem *item);
|
2016-04-08 09:20:10 +00:00
|
|
|
void notify_inlineKeyboardMoved(const HistoryItem *item, int oldKeyboardTop, int newKeyboardTop);
|
2016-08-12 16:28:10 +00:00
|
|
|
bool notify_switchInlineBotButtonReceived(const QString &query, UserData *samePeerBot, MsgId samePeerReplyTo);
|
2015-12-13 11:17:15 +00:00
|
|
|
void notify_userIsBotChanged(UserData *bot);
|
|
|
|
void notify_migrateUpdated(PeerData *peer);
|
2016-04-11 10:59:01 +00:00
|
|
|
void notify_historyMuteUpdated(History *history);
|
2015-12-07 13:05:00 +00:00
|
|
|
|
2016-07-14 11:20:46 +00:00
|
|
|
bool cmd_search();
|
|
|
|
bool cmd_next_chat();
|
|
|
|
bool cmd_previous_chat();
|
2016-02-27 19:39:51 +00:00
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
~MainWidget();
|
|
|
|
|
|
|
|
signals:
|
2016-04-09 18:45:55 +00:00
|
|
|
void dialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow);
|
2014-05-30 08:53:19 +00:00
|
|
|
void dialogsUpdated();
|
|
|
|
|
|
|
|
public slots:
|
2015-12-30 19:09:20 +00:00
|
|
|
void documentLoadProgress(FileLoader *loader);
|
|
|
|
void documentLoadFailed(FileLoader *loader, bool started);
|
2015-12-31 05:34:43 +00:00
|
|
|
void inlineResultLoadProgress(FileLoader *loader);
|
|
|
|
void inlineResultLoadFailed(FileLoader *loader, bool started);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
void dialogsCancelled();
|
|
|
|
|
|
|
|
void getDifference();
|
2015-09-13 08:41:27 +00:00
|
|
|
void onGetDifferenceTimeByPts();
|
|
|
|
void onGetDifferenceTimeAfterFail();
|
2015-04-16 14:59:42 +00:00
|
|
|
void mtpPing();
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2015-01-26 13:04:41 +00:00
|
|
|
void updateOnline(bool gotOtherOffline = false);
|
|
|
|
void checkIdleFinish();
|
2014-05-30 08:53:19 +00:00
|
|
|
|
|
|
|
void onUpdateNotifySettings();
|
|
|
|
|
2015-02-03 15:02:46 +00:00
|
|
|
void onCacheBackground();
|
|
|
|
|
2015-04-30 13:53:36 +00:00
|
|
|
void onInviteImport();
|
|
|
|
|
|
|
|
void onUpdateMuted();
|
|
|
|
|
2015-09-21 20:57:42 +00:00
|
|
|
void onViewsIncrement();
|
2015-05-19 15:46:45 +00:00
|
|
|
|
2016-09-23 16:04:26 +00:00
|
|
|
protected:
|
|
|
|
void paintEvent(QPaintEvent *e) override;
|
|
|
|
void resizeEvent(QResizeEvent *e) override;
|
|
|
|
void keyPressEvent(QKeyEvent *e) override;
|
2017-01-14 18:50:16 +00:00
|
|
|
bool eventFilter(QObject *o, QEvent *e) override;
|
2016-09-23 16:04:26 +00:00
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
private:
|
2017-05-22 15:25:49 +00:00
|
|
|
struct Float {
|
2017-05-23 18:00:57 +00:00
|
|
|
template <typename ToggleCallback, typename DraggedCallback>
|
2018-01-21 14:49:42 +00:00
|
|
|
Float(
|
|
|
|
QWidget *parent,
|
|
|
|
not_null<Window::Controller*> controller,
|
|
|
|
not_null<HistoryItem*> item,
|
|
|
|
ToggleCallback toggle,
|
|
|
|
DraggedCallback dragged);
|
2017-05-22 15:25:49 +00:00
|
|
|
|
2017-05-23 14:04:59 +00:00
|
|
|
bool hiddenByWidget = false;
|
|
|
|
bool hiddenByHistory = false;
|
2017-05-22 15:25:49 +00:00
|
|
|
bool visible = false;
|
2017-05-24 12:07:58 +00:00
|
|
|
RectPart animationSide;
|
2017-05-22 15:25:49 +00:00
|
|
|
Animation visibleAnimation;
|
2017-05-24 10:04:29 +00:00
|
|
|
Window::Column column;
|
2017-05-24 12:07:58 +00:00
|
|
|
RectPart corner;
|
2017-05-23 18:00:57 +00:00
|
|
|
QPoint dragFrom;
|
|
|
|
Animation draggedAnimation;
|
2017-05-24 12:07:58 +00:00
|
|
|
bool hiddenByDrag = false;
|
2017-05-22 15:25:49 +00:00
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2016-12-05 11:01:08 +00:00
|
|
|
void animationCallback();
|
2017-01-14 18:50:16 +00:00
|
|
|
void handleAdaptiveLayoutUpdate();
|
|
|
|
void updateWindowAdaptiveLayout();
|
2016-09-23 16:04:26 +00:00
|
|
|
void handleAudioUpdate(const AudioMsgId &audioId);
|
|
|
|
void updateMediaPlayerPosition();
|
2016-10-14 17:10:15 +00:00
|
|
|
void updateMediaPlaylistPosition(int x);
|
2016-10-12 19:34:25 +00:00
|
|
|
void updateControlsGeometry();
|
2017-01-14 18:50:16 +00:00
|
|
|
void updateDialogsWidthAnimated();
|
2018-01-22 16:42:25 +00:00
|
|
|
void updateThirdColumnToCurrentChat(
|
|
|
|
Dialogs::Key key,
|
2017-09-20 18:40:23 +00:00
|
|
|
bool canWrite);
|
2017-11-28 20:01:00 +00:00
|
|
|
[[nodiscard]] bool saveThirdSectionToStackBack() const;
|
2018-01-22 16:42:25 +00:00
|
|
|
[[nodiscard]] auto thirdSectionForCurrentMainSection(Dialogs::Key key)
|
|
|
|
-> std::unique_ptr<Window::SectionMemento>;
|
2018-01-04 09:21:06 +00:00
|
|
|
void userIsContactUpdated(not_null<UserData*> user);
|
2016-10-12 19:34:25 +00:00
|
|
|
|
2018-05-07 17:44:33 +00:00
|
|
|
void setupConnectingWidget();
|
2016-10-12 19:34:25 +00:00
|
|
|
void createPlayer();
|
|
|
|
void switchToPanelPlayer();
|
|
|
|
void switchToFixedPlayer();
|
2016-10-18 15:19:13 +00:00
|
|
|
void closeBothPlayers();
|
2016-10-12 19:34:25 +00:00
|
|
|
void playerHeightUpdated();
|
2016-08-27 04:49:18 +00:00
|
|
|
|
2017-04-25 20:36:04 +00:00
|
|
|
void setCurrentCall(Calls::Call *call);
|
|
|
|
void createCallTopBar();
|
|
|
|
void destroyCallTopBar();
|
2017-09-13 16:57:44 +00:00
|
|
|
void callTopBarHeightUpdated(int callTopBarHeight);
|
2017-04-25 20:36:04 +00:00
|
|
|
|
2017-12-07 13:02:24 +00:00
|
|
|
void messagesAffected(
|
|
|
|
not_null<PeerData*> peer,
|
|
|
|
const MTPmessages_AffectedMessages &result);
|
2014-08-15 11:19:32 +00:00
|
|
|
|
2017-09-16 16:53:41 +00:00
|
|
|
Window::SectionSlideParams prepareShowAnimation(
|
|
|
|
bool willHaveTopBarShadow);
|
|
|
|
void showNewSection(
|
|
|
|
Window::SectionMemento &&memento,
|
2017-10-03 13:05:58 +00:00
|
|
|
const SectionShow ¶ms);
|
2017-09-16 16:53:41 +00:00
|
|
|
void dropMainSection(Window::SectionWidget *widget);
|
|
|
|
|
|
|
|
Window::SectionSlideParams prepareThirdSectionAnimation(Window::SectionWidget *section);
|
2016-05-19 12:03:51 +00:00
|
|
|
|
|
|
|
// All this methods use the prepareShowAnimation().
|
2017-09-16 16:53:41 +00:00
|
|
|
Window::SectionSlideParams prepareMainSectionAnimation(Window::SectionWidget *section);
|
2016-05-19 12:03:51 +00:00
|
|
|
Window::SectionSlideParams prepareHistoryAnimation(PeerId historyPeerId);
|
|
|
|
Window::SectionSlideParams prepareDialogsAnimation();
|
|
|
|
|
2017-07-18 15:15:02 +00:00
|
|
|
void startWithSelf(const MTPUserFull &user);
|
2017-03-04 19:36:59 +00:00
|
|
|
|
2016-07-05 14:48:36 +00:00
|
|
|
void saveSectionInStack();
|
|
|
|
|
2016-10-23 21:03:10 +00:00
|
|
|
void getChannelDifference(ChannelData *channel, ChannelDifferenceRequest from = ChannelDifferenceRequest::Unknown);
|
2014-05-30 08:53:19 +00:00
|
|
|
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);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2018-01-18 09:53:49 +00:00
|
|
|
void feedUpdateVector(
|
|
|
|
const MTPVector<MTPUpdate> &updates,
|
|
|
|
bool skipMessageIds = false);
|
|
|
|
// Doesn't call sendHistoryChangeNotifications itself.
|
2014-05-30 08:53:19 +00:00
|
|
|
void feedMessageIds(const MTPVector<MTPUpdate> &updates);
|
2018-01-18 09:53:49 +00:00
|
|
|
// Doesn't call sendHistoryChangeNotifications itself.
|
|
|
|
void feedUpdate(const MTPUpdate &update);
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2016-06-03 12:45:33 +00:00
|
|
|
void deleteHistoryPart(DeleteHistoryRequest request, const MTPmessages_AffectedHistory &result);
|
2016-03-13 15:45:00 +00:00
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
void updateReceived(const mtpPrime *from, const mtpPrime *end);
|
|
|
|
bool updateFail(const RPCError &e);
|
|
|
|
|
2016-02-17 16:37:21 +00:00
|
|
|
void usernameResolveDone(QPair<MsgId, QString> msgIdAndStartToken, const MTPcontacts_ResolvedPeer &result);
|
2014-12-05 13:44:27 +00:00
|
|
|
bool usernameResolveFail(QString name, const RPCError &error);
|
2014-12-03 13:10:32 +00:00
|
|
|
|
2015-04-30 13:53:36 +00:00
|
|
|
void inviteCheckDone(QString hash, const MTPChatInvite &invite);
|
|
|
|
bool inviteCheckFail(const RPCError &error);
|
|
|
|
void inviteImportDone(const MTPUpdates &result);
|
|
|
|
bool inviteImportFail(const RPCError &error);
|
|
|
|
|
2017-09-16 16:53:41 +00:00
|
|
|
int getMainSectionTop() const;
|
|
|
|
int getThirdSectionTop() const;
|
2017-04-25 20:36:04 +00:00
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
void hideAll();
|
|
|
|
void showAll();
|
|
|
|
|
2016-08-27 04:49:18 +00:00
|
|
|
void clearCachedBackground();
|
2017-05-22 15:25:49 +00:00
|
|
|
void checkCurrentFloatPlayer();
|
2018-01-21 14:49:42 +00:00
|
|
|
void createFloatPlayer(not_null<HistoryItem*> item);
|
2017-08-17 08:31:24 +00:00
|
|
|
void toggleFloatPlayer(not_null<Float*> instance);
|
2017-05-23 14:04:59 +00:00
|
|
|
void checkFloatPlayerVisibility();
|
2017-08-17 08:31:24 +00:00
|
|
|
void updateFloatPlayerPosition(not_null<Float*> instance);
|
|
|
|
void removeFloatPlayer(not_null<Float*> instance);
|
2017-05-22 15:25:49 +00:00
|
|
|
Float *currentFloatPlayer() const {
|
|
|
|
return _playerFloats.empty() ? nullptr : _playerFloats.back().get();
|
|
|
|
}
|
2017-09-16 16:53:41 +00:00
|
|
|
Window::AbstractSectionWidget *getFloatPlayerSection(
|
|
|
|
Window::Column column) const;
|
|
|
|
void finishFloatPlayerDrag(
|
|
|
|
not_null<Float*> instance,
|
|
|
|
bool closed);
|
2017-05-23 18:00:57 +00:00
|
|
|
void updateFloatPlayerColumnCorner(QPoint center);
|
2017-08-17 08:31:24 +00:00
|
|
|
QPoint getFloatPlayerPosition(not_null<Float*> instance) const;
|
2017-09-16 16:53:41 +00:00
|
|
|
QPoint getFloatPlayerHiddenPosition(
|
|
|
|
QPoint position,
|
|
|
|
QSize size,
|
|
|
|
RectPart side) const;
|
2017-05-24 12:07:58 +00:00
|
|
|
RectPart getFloatPlayerSide(QPoint center) const;
|
2017-05-22 15:25:49 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
|
2017-11-12 15:41:00 +00:00
|
|
|
void refreshResizeAreas();
|
|
|
|
template <typename MoveCallback, typename FinishCallback>
|
|
|
|
void createResizeArea(
|
|
|
|
object_ptr<Ui::ResizeArea> &area,
|
|
|
|
MoveCallback &&moveCallback,
|
|
|
|
FinishCallback &&finishCallback);
|
|
|
|
void ensureFirstColumnResizeAreaCreated();
|
|
|
|
void ensureThirdColumnResizeAreaCreated();
|
|
|
|
|
2017-12-04 17:46:03 +00:00
|
|
|
void updateNotifySettingsLocal(
|
|
|
|
not_null<PeerData*> peer,
|
|
|
|
History *history = nullptr);
|
|
|
|
|
2017-08-17 08:31:24 +00:00
|
|
|
not_null<Window::Controller*> _controller;
|
2017-05-22 15:25:49 +00:00
|
|
|
bool _started = false;
|
|
|
|
|
|
|
|
SingleTimer _updateMutedTimer;
|
|
|
|
|
|
|
|
QString _inviteHash;
|
2016-08-27 04:49:18 +00:00
|
|
|
|
2016-12-07 13:32:25 +00:00
|
|
|
Animation _a_show;
|
2016-12-05 11:01:08 +00:00
|
|
|
bool _showBack = false;
|
2015-10-17 14:52:26 +00:00
|
|
|
QPixmap _cacheUnder, _cacheOver;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2017-11-12 16:50:58 +00:00
|
|
|
int _dialogsWidth = 0;
|
|
|
|
int _thirdColumnWidth = 0;
|
2017-01-14 18:50:16 +00:00
|
|
|
Animation _a_dialogsWidth;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2016-12-13 17:07:56 +00:00
|
|
|
object_ptr<Ui::PlainShadow> _sideShadow;
|
2017-09-16 16:53:41 +00:00
|
|
|
object_ptr<Ui::PlainShadow> _thirdShadow = { nullptr };
|
2017-11-12 15:41:00 +00:00
|
|
|
object_ptr<Ui::ResizeArea> _firstColumnResizeArea = { nullptr };
|
|
|
|
object_ptr<Ui::ResizeArea> _thirdColumnResizeArea = { nullptr };
|
2016-12-13 17:07:56 +00:00
|
|
|
object_ptr<DialogsWidget> _dialogs;
|
|
|
|
object_ptr<HistoryWidget> _history;
|
2017-09-16 16:53:41 +00:00
|
|
|
object_ptr<Window::SectionWidget> _mainSection = { nullptr };
|
2017-04-07 18:10:49 +00:00
|
|
|
object_ptr<Window::SectionWidget> _thirdSection = { nullptr };
|
2017-11-28 20:01:00 +00:00
|
|
|
std::unique_ptr<Window::SectionMemento> _thirdSectionFromStack;
|
2018-05-07 17:44:33 +00:00
|
|
|
base::unique_qptr<Window::ConnectingWidget> _connecting;
|
2016-12-13 17:07:56 +00:00
|
|
|
|
2017-11-30 17:33:27 +00:00
|
|
|
base::weak_ptr<Calls::Call> _currentCall;
|
2017-09-13 16:57:44 +00:00
|
|
|
object_ptr<Ui::SlideWrap<Calls::TopBar>> _callTopBar = { nullptr };
|
2017-04-25 20:36:04 +00:00
|
|
|
|
2016-12-13 17:07:56 +00:00
|
|
|
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;
|
2016-10-14 17:10:15 +00:00
|
|
|
bool _playerUsingPanel = false;
|
2017-05-22 15:25:49 +00:00
|
|
|
std::vector<std::unique_ptr<Float>> _playerFloats;
|
2016-10-14 17:10:15 +00:00
|
|
|
|
2016-12-13 17:07:56 +00:00
|
|
|
QPointer<ConfirmBox> _forwardConfirm; // for single column layout
|
|
|
|
object_ptr<HistoryHider> _hider = { nullptr };
|
2017-02-21 13:45:56 +00:00
|
|
|
std::vector<std::unique_ptr<StackItem>> _stack;
|
2015-12-07 10:06:59 +00:00
|
|
|
|
2016-04-08 09:20:10 +00:00
|
|
|
int _playerHeight = 0;
|
2017-04-25 20:36:04 +00:00
|
|
|
int _callTopBarHeight = 0;
|
2016-04-08 09:20:10 +00:00
|
|
|
int _contentScrollAddToY = 0;
|
2015-07-03 08:47:16 +00:00
|
|
|
|
2016-04-08 09:20:10 +00:00
|
|
|
int32 updDate = 0;
|
|
|
|
int32 updQts = -1;
|
|
|
|
int32 updSeq = 0;
|
2014-11-12 20:30:26 +00:00
|
|
|
SingleTimer noUpdatesTimer;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
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;
|
|
|
|
|
2016-03-11 15:01:32 +00:00
|
|
|
SingleTimer _byMinChannelTimer;
|
|
|
|
|
2016-04-08 09:20:10 +00:00
|
|
|
mtpRequestId _onlineRequest = 0;
|
2017-11-13 08:05:56 +00:00
|
|
|
SingleTimer _onlineTimer, _idleFinishTimer;
|
2016-04-08 09:20:10 +00:00
|
|
|
bool _lastWasOnline = false;
|
2016-12-01 19:20:33 +00:00
|
|
|
TimeMs _lastSetOnline = 0;
|
2016-04-08 09:20:10 +00:00
|
|
|
bool _isIdle = false;
|
2014-05-30 08:53:19 +00:00
|
|
|
|
2017-12-04 17:46:03 +00:00
|
|
|
base::flat_set<not_null<PeerData*>> updateNotifySettingPeers;
|
2014-11-12 20:30:26 +00:00
|
|
|
SingleTimer updateNotifySettingTimer;
|
2015-12-31 15:27:21 +00:00
|
|
|
|
2016-04-08 09:20:10 +00:00
|
|
|
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
|
2014-11-12 20:30:26 +00:00
|
|
|
SingleTimer _failDifferenceTimer;
|
|
|
|
|
2016-12-01 19:20:33 +00:00
|
|
|
TimeMs _lastUpdateTime = 0;
|
2016-04-08 09:20:10 +00:00
|
|
|
bool _handlingChannelDifference = false;
|
2015-02-03 15:02:46 +00:00
|
|
|
|
|
|
|
QPixmap _cachedBackground;
|
|
|
|
QRect _cachedFor, _willCacheFor;
|
2016-04-08 09:20:10 +00:00
|
|
|
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;
|
|
|
|
|
2016-06-14 16:26:41 +00:00
|
|
|
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;
|
|
|
|
|
2017-02-21 13:45:56 +00:00
|
|
|
std::unique_ptr<App::WallPaper> _background;
|
2015-02-03 15:02:46 +00:00
|
|
|
|
2017-11-12 15:41:00 +00:00
|
|
|
bool _firstColumnResizing = false;
|
|
|
|
int _firstColumnResizingShift = 0;
|
2017-01-14 18:50:16 +00:00
|
|
|
|
2014-05-30 08:53:19 +00:00
|
|
|
};
|