Cloud stored drafts started.

This commit is contained in:
John Preston 2016-05-31 12:46:31 +03:00
parent 7f353d9b1a
commit 916068447a
18 changed files with 230 additions and 93 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 B

View File

@ -300,5 +300,3 @@ namespace App {
DeclareSetting(WallPapers, ServerBackgrounds);
};
#include "facades.h"

View File

@ -0,0 +1,33 @@
/*
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.
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-2016 John Preston, https://desktop.telegram.org
*/
#include "stdafx.h"
#include "data/drafts.h"
namespace Data {
namespace {
} // namespace
void applyPeerCloudDraft(PeerId peerId, const MTPDdraftMessage &draft) {
}
} // namespace Data

View File

@ -0,0 +1,27 @@
/*
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.
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-2016 John Preston, https://desktop.telegram.org
*/
#pragma once
namespace Data {
void applyPeerCloudDraft(PeerId peerId, const MTPDdraftMessage &draft);
} // namespace Data

View File

@ -0,0 +1,25 @@
/*
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.
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-2016 John Preston, https://desktop.telegram.org
*/
using "basic.style";
dialogsDraft: icon {
{ "dialogs_draft", #ffffff, point(5px, 5px) },
};

View File

@ -22,6 +22,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "dialogs/dialogs_layout.h"
#include "dialogs/dialogs_list.h"
#include "styles/style_dialogs.h"
#include "localstorage.h"
#include "lang.h"
namespace Dialogs {
@ -162,7 +164,7 @@ void paintUnreadCount(Painter &p, const QString &text, int top, int w, bool acti
accumulate_max(unreadRectWidth, unreadRectHeight);
int unreadRectLeft = w - st::dlgPaddingHor - unreadRectWidth;
int unreadRectTop =top;
int unreadRectTop = top;
if (outAvailableWidth) {
*outAvailableWidth -= unreadRectWidth + st::dlgUnreadPaddingHor;
}
@ -188,9 +190,20 @@ void RowPainter::paint(Painter &p, const Row *row, int w, bool active, bool sele
}
int availableWidth = namewidth;
int texttop = st::dlgPaddingVer + st::dlgFont->height + st::dlgSep;
if (unread) {
bool hasDraftIcon = active ? false : Local::hasDraft(history->peer->id);
if (unread || hasDraftIcon) {
QString counter;
bool mutedCounter = false;
bool showUnreadCounter = unread && (!hasDraftIcon || !history->mute());
if (showUnreadCounter) {
counter = QString::number(unread);
mutedCounter = history->mute();
}
int unreadTop = texttop + st::dlgHistFont->ascent - st::dlgUnreadFont->ascent - st::dlgUnreadTop;
paintUnreadCount(p, QString::number(unread), unreadTop, w, active, history->mute(), &availableWidth);
paintUnreadCount(p, counter, unreadTop, w, active, mutedCounter, &availableWidth);
if (!showUnreadCounter) {
st::dialogsDraft.paint(p, QPoint(w - st::dlgPaddingHor - st::dlgUnreadHeight, unreadTop), w);
}
}
if (history->typing.isEmpty() && history->sendActions.isEmpty()) {
item->drawInDialog(p, QRect(nameleft, texttop, availableWidth, st::dlgFont->height), active, history->textCachedFor, history->lastItemTextCache);

View File

@ -23,6 +23,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "dialogs/dialogs_indexed_list.h"
#include "dialogs/dialogs_layout.h"
#include "data/drafts.h"
#include "lang.h"
#include "application.h"
#include "mainwindow.h"
@ -977,42 +978,47 @@ void DialogsInner::itemRemoved(HistoryItem *item) {
void DialogsInner::dialogsReceived(const QVector<MTPDialog> &added) {
for_const (auto &dialog, added) {
History *history = nullptr;
switch (dialog.type()) {
case mtpc_dialog: {
auto &d(dialog.c_dialog());
history = App::historyFromDialog(peerFromMTP(d.vpeer), d.vunread_count.v, d.vread_inbox_max_id.v, d.vread_outbox_max_id.v);
if (auto channel = history->peer->asChannel()) {
if (d.has_pts()) {
channel->ptsReceived(d.vpts.v);
}
if (!channel->amCreator()) {
if (auto topMsg = App::histItemById(channel, d.vtop_message.v)) {
if (topMsg->date <= date(channel->date) && App::api()) {
App::api()->requestSelfParticipant(channel);
}
if (dialog.type() != mtpc_dialog) {
continue;
}
auto &d = dialog.c_dialog();
auto peerId = peerFromMTP(d.vpeer);
if (!peerId) {
continue;
}
auto history = App::historyFromDialog(peerId, d.vunread_count.v, d.vread_inbox_max_id.v, d.vread_outbox_max_id.v);
auto peer = history->peer;
if (auto channel = peer->asChannel()) {
if (d.has_pts()) {
channel->ptsReceived(d.vpts.v);
}
if (!channel->amCreator()) {
if (auto topMsg = App::histItemById(channel, d.vtop_message.v)) {
if (topMsg->date <= date(channel->date) && App::api()) {
App::api()->requestSelfParticipant(channel);
}
}
}
if (App::main()) {
App::main()->applyNotifySetting(MTP_notifyPeer(d.vpeer), d.vnotify_settings, history);
}
} break;
}
App::main()->applyNotifySetting(MTP_notifyPeer(d.vpeer), d.vnotify_settings, history);
if (!history->lastMsgDate.isNull()) {
addSavedPeersAfter(history->lastMsgDate);
}
contactsNoDialogs->del(peer);
if (peer->migrateFrom()) {
removeDialog(App::historyLoaded(peer->migrateFrom()->id));
} else if (peer->migrateTo() && peer->migrateTo()->amIn()) {
removeDialog(history);
}
if (history) {
if (!history->lastMsgDate.isNull()) {
addSavedPeersAfter(history->lastMsgDate);
}
contactsNoDialogs->del(history->peer);
if (history->peer->migrateFrom()) {
removeDialog(App::historyLoaded(history->peer->migrateFrom()->id));
} else if (history->peer->migrateTo() && history->peer->migrateTo()->amIn()) {
removeDialog(history);
}
if (d.has_draft() && d.vdraft.type() == mtpc_draftMessage) {
auto &draft = d.vdraft.c_draftMessage();
Data::applyPeerCloudDraft(peerId, draft);
}
}
Notify::unreadCounterUpdated();
if (!_sel && !shownDialogs()->isEmpty()) {
_sel = *shownDialogs()->cbegin();
@ -1914,46 +1920,28 @@ void DialogsWidget::notify_historyMuteUpdated(History *history) {
}
void DialogsWidget::unreadCountsReceived(const QVector<MTPDialog> &dialogs) {
for_const (auto &dialog, dialogs) {
switch (dialog.type()) {
case mtpc_dialog: {
auto &d(dialog.c_dialog());
if (auto h = App::historyLoaded(peerFromMTP(d.vpeer))) {
if (h->peer->isChannel() && d.has_pts()) {
h->peer->asChannel()->ptsReceived(d.vpts.v);
}
App::main()->applyNotifySetting(MTP_notifyPeer(d.vpeer), d.vnotify_settings, h);
if (d.vunread_count.v >= h->unreadCount()) {
h->setUnreadCount(d.vunread_count.v);
h->inboxReadBefore = d.vread_inbox_max_id.v + 1;
}
accumulate_max(h->outboxReadBefore, d.vread_outbox_max_id.v + 1);
}
} break;
}
}
}
void DialogsWidget::dialogsReceived(const MTPmessages_Dialogs &dialogs, mtpRequestId req) {
if (_dialogsRequest != req) return;
const QVector<MTPDialog> *v = 0;
const QVector<MTPMessage> *m = 0;
const QVector<MTPDialog> *dialogsList = 0;
const QVector<MTPMessage> *messagesList = 0;
switch (dialogs.type()) {
case mtpc_messages_dialogs: {
const auto &data(dialogs.c_messages_dialogs());
App::feedUsers(data.vusers);
App::feedChats(data.vchats);
m = &data.vmessages.c_vector().v;
v = &data.vdialogs.c_vector().v;
messagesList = &data.vmessages.c_vector().v;
dialogsList = &data.vdialogs.c_vector().v;
_dialogsFull = true;
} break;
case mtpc_messages_dialogsSlice: {
const auto &data(dialogs.c_messages_dialogsSlice());
App::feedUsers(data.vusers);
App::feedChats(data.vchats);
m = &data.vmessages.c_vector().v;
v = &data.vdialogs.c_vector().v;
messagesList = &data.vmessages.c_vector().v;
dialogsList = &data.vdialogs.c_vector().v;
} break;
}
@ -1961,36 +1949,33 @@ void DialogsWidget::dialogsReceived(const MTPmessages_Dialogs &dialogs, mtpReque
_contactsRequest = MTP::send(MTPcontacts_GetContacts(MTP_string("")), rpcDone(&DialogsWidget::contactsReceived), rpcFail(&DialogsWidget::contactsFailed));
}
if (m) {
App::feedMsgs(*m, NewMessageLast);
if (messagesList) {
App::feedMsgs(*messagesList, NewMessageLast);
}
if (v) {
unreadCountsReceived(*v);
_inner.dialogsReceived(*v);
if (dialogsList) {
unreadCountsReceived(*dialogsList);
_inner.dialogsReceived(*dialogsList);
onListScroll();
int32 lastDate = 0;
TimeId lastDate = 0;
PeerId lastPeer = 0;
MsgId lastMsgId = 0;
for (int32 i = v->size(); i > 0;) {
PeerId peer = 0;
MsgId msgId = 0;
const auto &d(v->at(--i));
switch (d.type()) {
case mtpc_dialog:
msgId = d.c_dialog().vtop_message.v;
peer = peerFromMTP(d.c_dialog().vpeer);
break;
for (int i = dialogsList->size(); i > 0;) {
auto &dialog = dialogsList->at(--i);
if (dialog.type() != mtpc_dialog) {
continue;
}
if (peer) {
if (auto peer = peerFromMTP(dialog.c_dialog().vpeer)) {
if (!lastPeer) lastPeer = peer;
if (msgId) {
if (auto msgId = dialog.c_dialog().vtop_message.v) {
if (!lastMsgId) lastMsgId = msgId;
for (int32 j = m->size(); j > 0;) {
const auto &d(m->at(--j));
if (idFromMessage(d) == msgId && peerFromMessage(d) == peer) {
int32 date = dateFromMessage(d);
if (date) lastDate = date;
for (int j = messagesList->size(); j > 0;) {
auto &message = messagesList->at(--j);
if (idFromMessage(message) == msgId && peerFromMessage(message) == peer) {
if (auto date = dateFromMessage(message)) {
lastDate = date;
}
break;
}
}

View File

@ -474,10 +474,18 @@ History *Histories::find(const PeerId &peerId) {
History *Histories::findOrInsert(const PeerId &peerId, int32 unreadCount, int32 maxInboxRead, int32 maxOutboxRead) {
auto i = map.constFind(peerId);
if (i == map.cend()) {
i = map.insert(peerId, peerIsChannel(peerId) ? static_cast<History*>(new ChannelHistory(peerId)) : (new History(peerId)));
i.value()->setUnreadCount(unreadCount);
i.value()->inboxReadBefore = maxInboxRead + 1;
i.value()->outboxReadBefore = maxOutboxRead + 1;
auto history = peerIsChannel(peerId) ? static_cast<History*>(new ChannelHistory(peerId)) : (new History(peerId));
i = map.insert(peerId, history);
history->setUnreadCount(unreadCount);
history->inboxReadBefore = maxInboxRead + 1;
history->outboxReadBefore = maxOutboxRead + 1;
} else {
auto history = i.value();
if (unreadCount >= history->unreadCount()) {
history->setUnreadCount(unreadCount);
history->inboxReadBefore = maxInboxRead + 1;
}
accumulate_max(history->outboxReadBefore, maxOutboxRead + 1);
}
return i.value();
}

View File

@ -2439,7 +2439,11 @@ namespace Local {
}
bool hasDraftCursors(const PeerId &peer) {
return (_draftCursorsMap.constFind(peer) != _draftCursorsMap.cend());
return _draftCursorsMap.contains(peer);
}
bool hasDraft(const PeerId &peer) {
return _draftsMap.contains(peer);
}
void writeFileLocation(MediaKey location, const FileLocation &local) {

View File

@ -120,6 +120,7 @@ namespace Local {
void readDraftsWithCursors(History *h);
void writeDraftCursors(const PeerId &peer, const MessageCursor &msgCursor, const MessageCursor &editCursor);
bool hasDraftCursors(const PeerId &peer);
bool hasDraft(const PeerId &peer);
void writeFileLocation(MediaKey location, const FileLocation &local);
FileLocation readFileLocation(MediaKey location, bool check = true);

View File

@ -23,6 +23,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "ui/buttons/peer_avatar_button.h"
#include "window/top_bar_widget.h"
#include "data/drafts.h"
#include "apiwrap.h"
#include "dialogswidget.h"
#include "historywidget.h"
@ -4554,9 +4555,23 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
App::main()->updateStickers();
} break;
////// Cloud saved GIFs
case mtpc_updateSavedGifs: {
cSetLastSavedGifsUpdate(0);
App::main()->updateStickers();
} break;
////// Cloud drafts
case mtpc_updateDraftMessage: {
auto &peerDraft = update.c_updateDraftMessage();
auto peerId = peerFromMTP(peerDraft.vpeer);
auto &draftMessage = peerDraft.vdraft;
if (draftMessage.type() == mtpc_draftMessage) {
auto &draft = draftMessage.c_draftMessage();
Data::applyPeerCloudDraft(peerId, draft);
}
} break;
}
}

View File

@ -693,7 +693,7 @@ contacts.topPeersNotModified#de266ef5 = contacts.TopPeers;
contacts.topPeers#70b772a8 categories:Vector<TopPeerCategoryPeers> chats:Vector<Chat> users:Vector<User> = contacts.TopPeers;
draftMessageEmpty#ba4baec5 = DraftMessage;
draftMessage#2a280746 flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector<MessageEntity> = DraftMessage;
draftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector<MessageEntity> date:int = DraftMessage;
---functions---

View File

@ -5731,6 +5731,7 @@ void _serialize_draftMessage(MTPStringLogger &to, int32 stage, int32 lev, Types
case 2: to.add(" reply_to_msg_id: "); ++stages.back(); if (flag & MTPDdraftMessage::Flag::f_reply_to_msg_id) { types.push_back(mtpc_int+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 0 IN FIELD flags ]"); } break;
case 3: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
case 4: to.add(" entities: "); ++stages.back(); if (flag & MTPDdraftMessage::Flag::f_entities) { types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break;
case 5: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break;
default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break;
}
}

View File

@ -499,7 +499,7 @@ enum {
mtpc_contacts_topPeersNotModified = 0xde266ef5,
mtpc_contacts_topPeers = 0x70b772a8,
mtpc_draftMessageEmpty = 0xba4baec5,
mtpc_draftMessage = 0x2a280746,
mtpc_draftMessage = 0xfd8e711f,
mtpc_invokeAfterMsg = 0xcb9f372d,
mtpc_invokeAfterMsgs = 0x3dc4b4f0,
mtpc_initConnection = 0x69796de9,
@ -14388,13 +14388,14 @@ public:
MTPDdraftMessage() {
}
MTPDdraftMessage(const MTPflags<MTPDdraftMessage::Flags> &_flags, MTPint _reply_to_msg_id, const MTPstring &_message, const MTPVector<MTPMessageEntity> &_entities) : vflags(_flags), vreply_to_msg_id(_reply_to_msg_id), vmessage(_message), ventities(_entities) {
MTPDdraftMessage(const MTPflags<MTPDdraftMessage::Flags> &_flags, MTPint _reply_to_msg_id, const MTPstring &_message, const MTPVector<MTPMessageEntity> &_entities, MTPint _date) : vflags(_flags), vreply_to_msg_id(_reply_to_msg_id), vmessage(_message), ventities(_entities), vdate(_date) {
}
MTPflags<MTPDdraftMessage::Flags> vflags;
MTPint vreply_to_msg_id;
MTPstring vmessage;
MTPVector<MTPMessageEntity> ventities;
MTPint vdate;
};
// RPC methods
@ -23552,8 +23553,8 @@ public:
inline static MTPdraftMessage new_draftMessageEmpty() {
return MTPdraftMessage(mtpc_draftMessageEmpty);
}
inline static MTPdraftMessage new_draftMessage(const MTPflags<MTPDdraftMessage::Flags> &_flags, MTPint _reply_to_msg_id, const MTPstring &_message, const MTPVector<MTPMessageEntity> &_entities) {
return MTPdraftMessage(new MTPDdraftMessage(_flags, _reply_to_msg_id, _message, _entities));
inline static MTPdraftMessage new_draftMessage(const MTPflags<MTPDdraftMessage::Flags> &_flags, MTPint _reply_to_msg_id, const MTPstring &_message, const MTPVector<MTPMessageEntity> &_entities, MTPint _date) {
return MTPdraftMessage(new MTPDdraftMessage(_flags, _reply_to_msg_id, _message, _entities, _date));
}
};
@ -34814,7 +34815,7 @@ inline uint32 MTPdraftMessage::innerLength() const {
switch (_type) {
case mtpc_draftMessage: {
const MTPDdraftMessage &v(c_draftMessage());
return v.vflags.innerLength() + (v.has_reply_to_msg_id() ? v.vreply_to_msg_id.innerLength() : 0) + v.vmessage.innerLength() + (v.has_entities() ? v.ventities.innerLength() : 0);
return v.vflags.innerLength() + (v.has_reply_to_msg_id() ? v.vreply_to_msg_id.innerLength() : 0) + v.vmessage.innerLength() + (v.has_entities() ? v.ventities.innerLength() : 0) + v.vdate.innerLength();
}
}
return 0;
@ -34834,6 +34835,7 @@ inline void MTPdraftMessage::read(const mtpPrime *&from, const mtpPrime *end, mt
if (v.has_reply_to_msg_id()) { v.vreply_to_msg_id.read(from, end); } else { v.vreply_to_msg_id = MTPint(); }
v.vmessage.read(from, end);
if (v.has_entities()) { v.ventities.read(from, end); } else { v.ventities = MTPVector<MTPMessageEntity>(); }
v.vdate.read(from, end);
} break;
default: throw mtpErrorUnexpected(cons, "MTPdraftMessage");
}
@ -34846,6 +34848,7 @@ inline void MTPdraftMessage::write(mtpBuffer &to) const {
if (v.has_reply_to_msg_id()) v.vreply_to_msg_id.write(to);
v.vmessage.write(to);
if (v.has_entities()) v.ventities.write(to);
v.vdate.write(to);
} break;
}
}
@ -34862,8 +34865,8 @@ inline MTPdraftMessage MTP_draftMessageEmpty() {
return MTP::internal::TypeCreator::new_draftMessageEmpty();
}
Q_DECLARE_OPERATORS_FOR_FLAGS(MTPDdraftMessage::Flags)
inline MTPdraftMessage MTP_draftMessage(const MTPflags<MTPDdraftMessage::Flags> &_flags, MTPint _reply_to_msg_id, const MTPstring &_message, const MTPVector<MTPMessageEntity> &_entities) {
return MTP::internal::TypeCreator::new_draftMessage(_flags, _reply_to_msg_id, _message, _entities);
inline MTPdraftMessage MTP_draftMessage(const MTPflags<MTPDdraftMessage::Flags> &_flags, MTPint _reply_to_msg_id, const MTPstring &_message, const MTPVector<MTPMessageEntity> &_entities, MTPint _date) {
return MTP::internal::TypeCreator::new_draftMessage(_flags, _reply_to_msg_id, _message, _entities, _date);
}
inline MTPDmessage::Flags mtpCastFlags(MTPDmessageService::Flags flags) { return MTPDmessage::Flags(QFlag(flags)); }
inline MTPDmessage::Flags mtpCastFlags(MTPflags<MTPDmessageService::Flags> flags) { return mtpCastFlags(flags.v); }

View File

@ -71,5 +71,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "ui/flatlabel.h"
#include "app.h"
#include "facades.h"
#endif // __cplusplus

View File

@ -1075,6 +1075,7 @@
</ClCompile>
<ClCompile Include="GeneratedFiles\styles\style_basic.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_basic_types.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_dialogs.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_history.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_overview.cpp" />
<ClCompile Include="SourceFiles\apiwrap.cpp" />
@ -1102,6 +1103,7 @@
<ClCompile Include="SourceFiles\core\basic_types.cpp" />
<ClCompile Include="SourceFiles\core\click_handler.cpp" />
<ClCompile Include="SourceFiles\core\click_handler_types.cpp" />
<ClCompile Include="SourceFiles\data\drafts.cpp" />
<ClCompile Include="SourceFiles\dialogswidget.cpp" />
<ClCompile Include="SourceFiles\dialogs\dialogs_indexed_list.cpp" />
<ClCompile Include="SourceFiles\dialogs\dialogs_layout.cpp" />
@ -1283,12 +1285,14 @@
<ClInclude Include="GeneratedFiles\numbers.h" />
<ClInclude Include="GeneratedFiles\styles\style_basic.h" />
<ClInclude Include="GeneratedFiles\styles\style_basic_types.h" />
<ClInclude Include="GeneratedFiles\styles\style_dialogs.h" />
<ClInclude Include="GeneratedFiles\styles\style_history.h" />
<ClInclude Include="GeneratedFiles\styles\style_overview.h" />
<ClInclude Include="Resources\winrc\resource.h" />
<ClInclude Include="SourceFiles\core\click_handler.h" />
<ClInclude Include="SourceFiles\core\click_handler_types.h" />
<ClInclude Include="SourceFiles\core\version.h" />
<ClInclude Include="SourceFiles\data\drafts.h" />
<ClInclude Include="SourceFiles\dialogs\dialogs_common.h" />
<ClInclude Include="SourceFiles\dialogs\dialogs_indexed_list.h" />
<ClInclude Include="SourceFiles\dialogs\dialogs_layout.h" />
@ -2457,6 +2461,7 @@
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling style %(Identity)...</Message>
</CustomBuild>
<CodegenStyleItem Include="Resources\basic_types.style" />
<CodegenStyleItem Include="SourceFiles\dialogs\dialogs.style" />
<CodegenStyleItem Include="SourceFiles\history\history.style" />
<CodegenStyleItem Include="SourceFiles\overview\overview.style" />
</ItemGroup>

View File

@ -91,6 +91,9 @@
<Filter Include="Resources\winrc">
<UniqueIdentifier>{6b33ddc0-a7e2-4961-81dc-e1b5de2e2c60}</UniqueIdentifier>
</Filter>
<Filter Include="SourceFiles\data">
<UniqueIdentifier>{606a297a-0b85-4df9-a6bc-39de5beed362}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="SourceFiles\main.cpp">
@ -1131,6 +1134,12 @@
<ClCompile Include="GeneratedFiles\Release\moc_history_down_button.cpp">
<Filter>GeneratedFiles\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\styles\style_dialogs.cpp">
<Filter>GeneratedFiles\styles</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\data\drafts.cpp">
<Filter>SourceFiles\data</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="SourceFiles\stdafx.h">
@ -1307,6 +1316,12 @@
<ClInclude Include="GeneratedFiles\styles\style_history.h">
<Filter>GeneratedFiles\styles</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\styles\style_dialogs.h">
<Filter>GeneratedFiles\styles</Filter>
</ClInclude>
<ClInclude Include="SourceFiles\data\drafts.h">
<Filter>SourceFiles\data</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="SourceFiles\application.h">
@ -1624,6 +1639,9 @@
<CodegenStyleItem Include="SourceFiles\history\history.style">
<Filter>SourceFiles\history</Filter>
</CodegenStyleItem>
<CodegenStyleItem Include="SourceFiles\dialogs\dialogs.style">
<Filter>SourceFiles\dialogs</Filter>
</CodegenStyleItem>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Resources\winrc\Telegram.rc">