New profiles started. Function<> made by variadic templates.

This commit is contained in:
John Preston 2016-05-12 19:05:20 +03:00
parent fd7f618fd2
commit 3d073eddd6
29 changed files with 1185 additions and 341 deletions

View File

@ -55,10 +55,13 @@ wndMinWidth: 380px;
adaptiveNormalWidth: 640px;
adaptiveWideWidth: 1366px;
windowBg: #fff; // fallback for background: white
windowTextFg: #000; // fallback for text color: black
windowSubTextFg: #8a8a8a; // fallback for subtext color: gray
wndMinHeight: 480px;
wndDefWidth: 800px;
wndDefHeight: 600px;
wndBG: white;
wndShadow: sprite(209px, 46px, 19px, 19px);
wndShadowShift: 1px;
@ -1671,13 +1674,13 @@ confirmCompressedSkip: 10px;
profileMaxWidth: 410px;
profilePadding: margins(28px, 30px, 28px, 0px);
profilePhotoSize: 120px;
profileNameLeft: 21px;
profileNameTop: -1px;
profileNameFont: font(20px);
profileStatusLeft: 22px;
profileStatusTop: 31px;
profileStatusFont: font(fsize);
//profilePhotoSize: 120px;
//profileNameLeft: 21px;
//profileNameTop: -1px;
//profileNameFont: font(20px);
//profileStatusLeft: 22px;
//profileStatusTop: 31px;
//profileStatusFont: font(fsize);
profilePhoneLeft: 22px;
profilePhoneTop: 62px;
profilePhoneFont: font(16px);
@ -2458,7 +2461,7 @@ inlineResultsSkip: 3px;
inlineMediaHeight: 96px;
inlineThumbSize: 64px;
inlineThumbSkip: 10px;
inlineDescriptionFg: #8a8a8a;
inlineDescriptionFg: windowSubTextFg;
inlineRowMargin: 6px;
inlineRowBorder: 1px;
inlineRowBorderFg: #eaeaea;

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

View File

@ -911,15 +911,6 @@ private:
};
template <typename I>
inline void destroyImplementation(I *&ptr) {
if (ptr) {
ptr->destroy();
ptr = 0;
}
deleteAndMark(ptr);
}
class Composer;
typedef void(*ComponentConstruct)(void *location, Composer *composer);
typedef void(*ComponentDestruct)(void *location);
@ -1154,213 +1145,88 @@ public:
virtual R call(Args... args) const = 0;
virtual ~SharedCallback() {
}
typedef QSharedPointer<SharedCallback<R, Args...>> Ptr;
using Ptr = QSharedPointer<SharedCallback<R, Args...>>;
};
template <typename R>
template <typename R, typename... Args>
class FunctionImplementation {
public:
virtual R call() = 0;
virtual R call(Args... args) = 0;
virtual void destroy() { delete this; }
virtual ~FunctionImplementation() {}
};
template <typename R>
class NullFunctionImplementation : public FunctionImplementation<R> {
template <typename R, typename... Args>
class NullFunctionImplementation : public FunctionImplementation<R, Args...> {
public:
virtual R call() { return R(); }
virtual R call(Args... args) { return R(); }
virtual void destroy() {}
static NullFunctionImplementation<R> SharedInstance;
static NullFunctionImplementation<R, Args...> SharedInstance;
};
template <typename R>
NullFunctionImplementation<R> NullFunctionImplementation<R>::SharedInstance;
template <typename R>
class FunctionCreator {
public:
FunctionCreator(FunctionImplementation<R> *ptr) : _ptr(ptr) {}
FunctionCreator(const FunctionCreator<R> &other) : _ptr(other.create()) {}
FunctionImplementation<R> *create() const { return getPointerAndReset(_ptr); }
~FunctionCreator() { destroyImplementation(_ptr); }
private:
FunctionCreator<R> &operator=(const FunctionCreator<R> &other);
mutable FunctionImplementation<R> *_ptr;
};
template <typename R>
template <typename R, typename... Args>
NullFunctionImplementation<R, Args...> NullFunctionImplementation<R, Args...>::SharedInstance;
template <typename R, typename... Args>
class Function {
public:
typedef FunctionCreator<R> Creator;
static Creator Null() { return Creator(&NullFunctionImplementation<R>::SharedInstance); }
Function(const Creator &creator) : _implementation(creator.create()) {}
R call() { return _implementation->call(); }
~Function() { destroyImplementation(_implementation); }
Function() : _implementation(&NullFunctionImplementation<R, Args...>::SharedInstance) {}
Function(FunctionImplementation<R, Args...> *implementation) : _implementation(implementation) {}
Function(const Function<R, Args...> &other) = delete;
Function<R, Args...> &operator=(const Function<R, Args...> &other) = delete;
Function(Function<R, Args...> &&other) : _implementation(other._implementation) {
other._implementation = &NullFunctionImplementation<R, Args...>::SharedInstance;
}
Function<R, Args...> &operator=(Function<R, Args...> &&other) {
std::swap(_implementation, other._implementation);
return *this;
}
R call(Args... args) { return _implementation->call(args...); }
~Function() {
if (_implementation) {
_implementation->destroy();
_implementation = nullptr;
}
deleteAndMark(_implementation);
}
private:
Function(const Function<R> &other);
Function<R> &operator=(const Function<R> &other);
FunctionImplementation<R> *_implementation;
FunctionImplementation<R, Args...> *_implementation;
};
template <typename R>
class WrappedFunction : public FunctionImplementation<R> {
template <typename R, typename... Args>
class WrappedFunction : public FunctionImplementation<R, Args...> {
public:
typedef R(*Method)();
using Method = R(*)(Args... args);
WrappedFunction(Method method) : _method(method) {}
virtual R call() { return (*_method)(); }
virtual R call(Args... args) { return (*_method)(args...); }
private:
Method _method;
};
template <typename R>
inline FunctionCreator<R> func(R(*method)()) {
return FunctionCreator<R>(new WrappedFunction<R>(method));
template <typename R, typename... Args>
inline Function<R, Args...> func(R(*method)(Args... args)) {
return Function<R, Args...>(new WrappedFunction<R, Args...>(method));
}
template <typename O, typename I, typename R>
class ObjectFunction : public FunctionImplementation<R> {
template <typename O, typename I, typename R, typename... Args>
class ObjectFunction : public FunctionImplementation<R, Args...> {
public:
typedef R(I::*Method)();
using Method = R(I::*)(Args... args);
ObjectFunction(O *obj, Method method) : _obj(obj), _method(method) {}
virtual R call() { return (_obj->*_method)(); }
virtual R call(Args... args) { return (_obj->*_method)(args...); }
private:
O *_obj;
Method _method;
};
template <typename O, typename I, typename R>
inline FunctionCreator<R> func(O *obj, R(I::*method)()) {
return FunctionCreator<R>(new ObjectFunction<O, I, R>(obj, method));
}
template <typename R, typename A1>
class Function1Implementation {
public:
virtual R call(A1 a1) = 0;
virtual void destroy() { delete this; }
virtual ~Function1Implementation() {}
};
template <typename R, typename A1>
class NullFunction1Implementation : public Function1Implementation<R, A1> {
public:
virtual R call(A1 a1) { return R(); }
virtual void destroy() {}
static NullFunction1Implementation<R, A1> SharedInstance;
};
template <typename R, typename A1>
NullFunction1Implementation<R, A1> NullFunction1Implementation<R, A1>::SharedInstance;
template <typename R, typename A1>
class Function1Creator {
public:
Function1Creator(Function1Implementation<R, A1> *ptr) : _ptr(ptr) {}
Function1Creator(const Function1Creator<R, A1> &other) : _ptr(other.create()) {}
Function1Implementation<R, A1> *create() const { return getPointerAndReset(_ptr); }
~Function1Creator() { destroyImplementation(_ptr); }
private:
Function1Creator<R, A1> &operator=(const Function1Creator<R, A1> &other);
mutable Function1Implementation<R, A1> *_ptr;
};
template <typename R, typename A1>
class Function1 {
public:
typedef Function1Creator<R, A1> Creator;
static Creator Null() { return Creator(&NullFunction1Implementation<R, A1>::SharedInstance); }
Function1(const Creator &creator) : _implementation(creator.create()) {}
R call(A1 a1) { return _implementation->call(a1); }
~Function1() { _implementation->destroy(); }
private:
Function1(const Function1<R, A1> &other);
Function1<R, A1> &operator=(const Function1<R, A1> &other);
Function1Implementation<R, A1> *_implementation;
};
template <typename R, typename A1>
class WrappedFunction1 : public Function1Implementation<R, A1> {
public:
typedef R(*Method)(A1);
WrappedFunction1(Method method) : _method(method) {}
virtual R call(A1 a1) { return (*_method)(a1); }
private:
Method _method;
};
template <typename R, typename A1>
inline Function1Creator<R, A1> func(R(*method)(A1)) {
return Function1Creator<R, A1>(new WrappedFunction1<R, A1>(method));
}
template <typename O, typename I, typename R, typename A1>
class ObjectFunction1 : public Function1Implementation<R, A1> {
public:
typedef R(I::*Method)(A1);
ObjectFunction1(O *obj, Method method) : _obj(obj), _method(method) {}
virtual R call(A1 a1) { return (_obj->*_method)(a1); }
private:
O *_obj;
Method _method;
};
template <typename O, typename I, typename R, typename A1>
Function1Creator<R, A1> func(O *obj, R(I::*method)(A1)) {
return Function1Creator<R, A1>(new ObjectFunction1<O, I, R, A1>(obj, method));
}
template <typename R, typename A1, typename A2>
class Function2Implementation {
public:
virtual R call(A1 a1, A2 a2) = 0;
virtual void destroy() { delete this; }
virtual ~Function2Implementation() {}
};
template <typename R, typename A1, typename A2>
class NullFunction2Implementation : public Function2Implementation<R, A1, A2> {
public:
virtual R call(A1 a1, A2 a2) { return R(); }
virtual void destroy() {}
static NullFunction2Implementation<R, A1, A2> SharedInstance;
};
template <typename R, typename A1, typename A2>
NullFunction2Implementation<R, A1, A2> NullFunction2Implementation<R, A1, A2>::SharedInstance;
template <typename R, typename A1, typename A2>
class Function2Creator {
public:
Function2Creator(Function2Implementation<R, A1, A2> *ptr) : _ptr(ptr) {}
Function2Creator(const Function2Creator<R, A1, A2> &other) : _ptr(other.create()) {}
Function2Implementation<R, A1, A2> *create() const { return getPointerAndReset(_ptr); }
~Function2Creator() { destroyImplementation(_ptr); }
private:
Function2Creator<R, A1, A2> &operator=(const Function2Creator<R, A1, A2> &other);
mutable Function2Implementation<R, A1, A2> *_ptr;
};
template <typename R, typename A1, typename A2>
class Function2 {
public:
typedef Function2Creator<R, A1, A2> Creator;
static Creator Null() { return Creator(&NullFunction2Implementation<R, A1, A2>::SharedInstance); }
Function2(const Creator &creator) : _implementation(creator.create()) {}
R call(A1 a1, A2 a2) { return _implementation->call(a1, a2); }
~Function2() { destroyImplementation(_implementation); }
private:
Function2(const Function2<R, A1, A2> &other);
Function2<R, A1, A2> &operator=(const Function2<R, A1, A2> &other);
Function2Implementation<R, A1, A2> *_implementation;
};
template <typename R, typename A1, typename A2>
class WrappedFunction2 : public Function2Implementation<R, A1, A2> {
public:
typedef R(*Method)(A1, A2);
WrappedFunction2(Method method) : _method(method) {}
virtual R call(A1 a1, A2 a2) { return (*_method)(a1, a2); }
private:
Method _method;
};
template <typename R, typename A1, typename A2>
Function2Creator<R, A1, A2> func(R(*method)(A1, A2)) {
return Function2Creator<R, A1, A2>(new WrappedFunction2<R, A1, A2>(method));
}
template <typename O, typename I, typename R, typename A1, typename A2>
class ObjectFunction2 : public Function2Implementation<R, A1, A2> {
public:
typedef R(I::*Method)(A1, A2);
ObjectFunction2(O *obj, Method method) : _obj(obj), _method(method) {}
virtual R call(A1 a1, A2 a2) { return (_obj->*_method)(a1, a2); }
private:
O *_obj;
Method _method;
};
template <typename O, typename I, typename R, typename A1, typename A2>
Function2Creator<R, A1, A2> func(O *obj, R(I::*method)(A1, A2)) {
return Function2Creator<R, A1, A2>(new ObjectFunction2<O, I, R, A1, A2>(obj, method));
template <typename O, typename I, typename R, typename... Args>
inline Function<R, Args...> func(O *obj, R(I::*method)(Args...)) {
return Function<R, Args...>(new ObjectFunction<O, I, R, Args...>(obj, method));
}

View File

@ -269,6 +269,15 @@ bool hideWindowNoQuit() {
return false;
}
bool skipPaintEvent(QWidget *widget, QPaintEvent *event) {
if (auto w = App::wnd()) {
if (w->contentOverlapped(widget, event)) {
return true;
}
}
return false;
}
} // namespace Ui
namespace Notify {

View File

@ -88,6 +88,8 @@ PeerData *getPeerForMouseAction();
bool hideWindowNoQuit();
bool skipPaintEvent(QWidget *widget, QPaintEvent *event);
} // namespace Ui
enum ClipStopperType {

View File

@ -3204,14 +3204,14 @@ HistoryItem::~HistoryItem() {
}
}
RadialAnimation::RadialAnimation(AnimationCreator creator)
RadialAnimation::RadialAnimation(AnimationCallbacks &&callbacks)
: _firstStart(0)
, _lastStart(0)
, _lastTime(0)
, _opacity(0)
, a_arcEnd(0, 0)
, a_arcStart(0, FullArcLength)
, _animation(creator) {
, _animation(std_::move(callbacks)) {
}

View File

@ -1623,7 +1623,7 @@ protected:
class RadialAnimation {
public:
RadialAnimation(AnimationCreator creator);
RadialAnimation(AnimationCallbacks &&callbacks);
float64 opacity() const {
return _opacity;
@ -1857,9 +1857,9 @@ protected:
virtual bool dataLoaded() const = 0;
struct AnimationData {
AnimationData(AnimationCreator thumbOverCallbacks, AnimationCreator radialCallbacks) : a_thumbOver(0, 0)
, _a_thumbOver(thumbOverCallbacks)
, radial(radialCallbacks) {
AnimationData(AnimationCallbacks &&thumbOverCallbacks, AnimationCallbacks &&radialCallbacks) : a_thumbOver(0, 0)
, _a_thumbOver(std_::move(thumbOverCallbacks))
, radial(std_::move(radialCallbacks)) {
}
anim::fvalue a_thumbOver;
Animation _a_thumbOver;

View File

@ -107,9 +107,9 @@ private:
void clipCallback(ClipReaderNotification notification);
struct AnimationData {
AnimationData(AnimationCreator creator)
AnimationData(AnimationCallbacks &&callbacks)
: over(false)
, radial(creator) {
, radial(std_::move(callbacks)) {
}
bool over;
FloatAnimation _a_over;
@ -268,9 +268,9 @@ private:
}
struct AnimationData {
AnimationData(AnimationCreator thumbOverCallbacks, AnimationCreator radialCallbacks) : a_thumbOver(0, 0)
, _a_thumbOver(thumbOverCallbacks)
, radial(radialCallbacks) {
AnimationData(AnimationCallbacks &&thumbOverCallbacks, AnimationCallbacks &&radialCallbacks) : a_thumbOver(0, 0)
, _a_thumbOver(std_::move(thumbOverCallbacks))
, radial(std_::move(radialCallbacks)) {
}
anim::fvalue a_thumbOver;
Animation _a_thumbOver;

View File

@ -22,6 +22,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "mainwidget.h"
#include "ui/buttons/peer_avatar_button.h"
#include "profile/profile_widget.h"
#include "window/top_bar_widget.h"
#include "apiwrap.h"
#include "dialogswidget.h"
@ -377,7 +378,6 @@ void MainWidget::onFilesOrForwardDrop(const PeerId &peer, const QMimeData *data)
void MainWidget::rpcClear() {
_history->rpcClear();
_dialogs->rpcClear();
if (_profile) _profile->rpcClear();
if (_overview) _overview->rpcClear();
if (_api) _api->rpcClear();
RPCSender::rpcClear();
@ -523,14 +523,23 @@ void MainWidget::noHider(HistoryHider *destroyed) {
}
onHistoryShown(_history->history(), _history->msgId());
if (_profile || _overview || (_history->peer() && _history->peer()->id)) {
QPixmap animCache = grabInner(), animTopBarCache = grabTopBar();
QPixmap animCache, animTopBarCache;
if (_profile) {
if (Adaptive::OneColumn()) {
animCache = myGrab(this, QRect(0, _playerHeight, _dialogsWidth, height() - _playerHeight));
} else {
animCache = myGrab(this, QRect(_dialogsWidth, _playerHeight, width() - _dialogsWidth, height() - _playerHeight));
}
} else {
animCache = grabInner();
animTopBarCache = grabTopBar();
}
_dialogs->hide();
if (_overview) {
_overview->show();
_overview->animShow(animCache, animTopBarCache);
} else if (_profile) {
_profile->show();
_profile->animShow(animCache, animTopBarCache);
_profile->showAnimated(SlideDirection::FromRight, animCache);
} else {
_history->show();
_history->animShow(animCache, animTopBarCache);
@ -1187,11 +1196,11 @@ void MainWidget::readServerHistory(History *hist, bool force) {
MsgId upTo = hist->inboxRead(0);
if (hist->isChannel() && !hist->peer->asChannel()->amIn()) {
return; // no read request for channels that I didn't koin
return; // no read request for channels that I didn't join
}
ReadRequests::const_iterator i = _readRequests.constFind(hist->peer);
if (i == _readRequests.cend()) {
if (i == _readRequests.cend()) {
sendReadRequest(hist->peer, upTo);
} else {
ReadRequestsPending::iterator i = _readRequestsPending.find(hist->peer);
@ -1282,7 +1291,7 @@ void MainWidget::overviewPreloaded(PeerData *peer, const MTPmessages_Messages &r
}
void MainWidget::mediaOverviewUpdated(PeerData *peer, MediaOverviewType type) {
if (_profile) _profile->mediaOverviewUpdated(peer, type);
// if (_profile) _profile->mediaOverviewUpdated(peer, type); TODO
if (!_player->isHidden()) _player->mediaOverviewUpdated(peer, type);
if (_overview && (_overview->peer() == peer || _overview->peer()->migrateFrom() == peer)) {
_overview->mediaOverviewUpdated(peer, type);
@ -1386,9 +1395,9 @@ void MainWidget::loadMediaBack(PeerData *peer, MediaOverviewType type, bool many
}
void MainWidget::peerUsernameChanged(PeerData *peer) {
if (_profile && _profile->peer() == peer) {
_profile->peerUsernameChanged();
}
//if (_profile && _profile->peer() == peer) { TODO
// _profile->peerUsernameChanged();
//}
if (App::settings() && peer == App::self()) {
App::settings()->usernameChanged();
}
@ -1695,7 +1704,7 @@ void MainWidget::onParentResize(const QSize &newSize) {
void MainWidget::updateOnlineDisplay() {
if (this != App::main()) return;
_history->updateOnlineDisplay(_history->x(), width() - _history->x() - st::sysBtnDelta * 2 - st::sysCls.img.pxWidth() - st::sysRes.img.pxWidth() - st::sysMin.img.pxWidth());
if (_profile) _profile->updateOnlineDisplay();
// if (_profile) _profile->updateOnlineDisplay(); TODO
if (App::wnd()->settingsWidget()) App::wnd()->settingsWidget()->updateOnlineDisplay();
}
@ -1883,14 +1892,14 @@ void MainWidget::setInnerFocus() {
} else if (_overview) {
_overview->activate();
} else if (_profile) {
_profile->activate();
_profile->setInnerFocus();
} else {
dialogsActivate();
}
} else if (_overview) {
_overview->activate();
} else if (_profile) {
_profile->activate();
_profile->setInnerFocus();
} else {
_history->setInnerFocus();
}
@ -2055,9 +2064,7 @@ void MainWidget::ui_showPeerHistory(quint64 peerId, qint32 showAtMsgId, bool bac
if (_profile || _overview) {
if (_profile) {
_profile->hide();
_profile->clear();
_profile->deleteLater();
_profile->rpcClear();
_profile = nullptr;
}
if (_overview) {
@ -2117,7 +2124,7 @@ void MainWidget::ui_showPeerHistory(quint64 peerId, qint32 showAtMsgId, bool bac
PeerData *MainWidget::ui_getPeerForMouseAction() {
if (_profile) {
return _profile->ui_getPeerForMouseAction();
//return _profile->ui_getPeerForMouseAction(); TODO
}
return _history->ui_getPeerForMouseAction();
}
@ -2201,7 +2208,7 @@ void MainWidget::showMediaOverview(PeerData *peer, MediaOverviewType type, bool
if (_overview) {
_stack.push_back(new StackItemOverview(_overview->peer(), _overview->type(), _overview->lastWidth(), _overview->lastScrollTop()));
} else if (_profile) {
_stack.push_back(new StackItemProfile(_profile->peer(), _profile->lastScrollTop()));
// _stack.push_back(new StackItemProfile(_profile->peer(), _profile->lastScrollTop())); TODO
} else if (_history->peer()) {
dlgUpdated();
_peerInStack = _history->peer();
@ -2218,9 +2225,7 @@ void MainWidget::showMediaOverview(PeerData *peer, MediaOverviewType type, bool
}
if (_profile) {
_profile->hide();
_profile->clear();
_profile->deleteLater();
_profile->rpcClear();
_profile = nullptr;
}
_overview = new OverviewWidget(this, peer, type);
@ -2252,12 +2257,18 @@ void MainWidget::showPeerProfile(PeerData *peer, bool back, int32 lastScrollTop)
App::wnd()->hideSettings();
if (_profile && _profile->peer() == peer) return;
QPixmap animCache = grabInner(), animTopBarCache = grabTopBar();
QPixmap animCache;
if (Adaptive::OneColumn()) {
animCache = myGrab(this, QRect(0, _playerHeight, _dialogsWidth, height() - _playerHeight));
} else {
animCache = myGrab(this, QRect(_dialogsWidth, _playerHeight, width() - _dialogsWidth, height() - _playerHeight));
}
// QPixmap animCache = grabInner(), animTopBarCache = grabTopBar();
if (!back) {
if (_overview) {
_stack.push_back(new StackItemOverview(_overview->peer(), _overview->type(), _overview->lastWidth(), _overview->lastScrollTop()));
} else if (_profile) {
_stack.push_back(new StackItemProfile(_profile->peer(), _profile->lastScrollTop()));
// _stack.push_back(new StackItemProfile(_profile->peer(), _profile->lastScrollTop())); TODO
} else if (_history->peer()) {
dlgUpdated();
_peerInStack = _history->peer();
@ -2275,14 +2286,13 @@ void MainWidget::showPeerProfile(PeerData *peer, bool back, int32 lastScrollTop)
}
if (_profile) {
_profile->hide();
_profile->clear();
_profile->deleteLater();
_profile->rpcClear();
_profile = nullptr;
}
_profile = new ProfileWidget(this, peer);
_topBar->show();
_profile = new Profile::Widget(this, peer);
_topBar->hide();
resizeEvent(0);
_profile->animShow(animCache, animTopBarCache, back, lastScrollTop);
_profile->showAnimated(SlideDirection::FromRight, animCache);
_history->animStop();
if (back) clearBotStartToken(_history->peer());
_history->showHistory(0, 0);
@ -2526,7 +2536,9 @@ void MainWidget::showAll() {
_dialogs->show();
_history->hide();
}
if (!selectingPeer() && (_profile || _overview || _history->peer())) {
if (_profile) {
_topBar->hide();
} else if (!selectingPeer() && (_overview || _history->peer())) {
_topBar->show();
_dialogs->hide();
}
@ -2547,7 +2559,9 @@ void MainWidget::showAll() {
_history->show();
_history->resizeEvent(0);
}
if (_profile || _overview || _history->peer()) {
if (_profile) {
_topBar->hide();
} else if (_overview || _history->peer()) {
_topBar->show();
}
}
@ -2585,7 +2599,10 @@ void MainWidget::resizeEvent(QResizeEvent *e) {
}
}
_mediaType->moveToLeft(width() - _mediaType->width(), _playerHeight + st::topBarHeight);
if (_profile) _profile->setGeometry(_history->geometry());
if (_profile) {
QRect profileGeometry(_history->x(), _playerHeight, _history->width(), height() - _playerHeight);
_profile->setGeometryWithTopMoved(profileGeometry, _contentScrollAddToY);
}
if (_overview) _overview->setGeometry(_history->geometry());
_contentScrollAddToY = 0;
}
@ -2602,7 +2619,7 @@ void MainWidget::updateAdaptiveLayout() {
_topBar->updateAdaptiveLayout();
_history->updateAdaptiveLayout();
if (_overview) _overview->updateAdaptiveLayout();
if (_profile) _profile->updateAdaptiveLayout();
// if (_profile) _profile->updateAdaptiveLayout(); TODO
_player->updateAdaptiveLayout();
}
@ -2612,7 +2629,7 @@ bool MainWidget::needBackButton() {
void MainWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) {
if (_profile) {
_profile->paintTopBar(p, over, decreaseWidth);
// _profile->paintTopBar(p, over, decreaseWidth);
} else if (_overview) {
_overview->paintTopBar(p, over, decreaseWidth);
} else {
@ -2660,7 +2677,7 @@ PlayerWidget *MainWidget::player() {
void MainWidget::onTopBarClick() {
if (_profile) {
_profile->topBarClick();
// _profile->topBarClick();
} else if (_overview) {
_overview->topBarClick();
} else {
@ -2669,7 +2686,7 @@ void MainWidget::onTopBarClick() {
}
void MainWidget::onHistoryShown(History *history, MsgId atMsgId) {
if ((!Adaptive::OneColumn() || !selectingPeer()) && (_profile || _overview || history)) {
if ((!Adaptive::OneColumn() || !selectingPeer()) && (_overview || history)) {
_topBar->show();
} else {
_topBar->hide();
@ -3479,7 +3496,7 @@ void MainWidget::startFull(const MTPVector<MTPUser> &users) {
}
void MainWidget::applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNotifySettings &settings, History *h) {
PeerData *updatePeer = 0;
PeerData *updatePeer = nullptr;
switch (settings.type()) {
case mtpc_peerNotifySettingsEmpty:
switch (peer.type()) {
@ -3541,9 +3558,9 @@ void MainWidget::applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNoti
_history->updateNotifySettings();
}
_dialogs->updateNotifySettings(updatePeer);
if (_profile && _profile->peer() == updatePeer) {
_profile->updateNotifySettings();
}
//if (_profile && _profile->peer() == updatePeer) { TODO
// _profile->updateNotifySettings();
//}
}
}

View File

@ -35,6 +35,10 @@ namespace Window {
class TopBarWidget;
} // namespace Window
namespace Profile {
class Widget;
} // namespace Profile
class MainWindow;
class ApiWrap;
class ConfirmBox;
@ -550,7 +554,7 @@ private:
ChildWidget<DialogsWidget> _dialogs;
ChildWidget<HistoryWidget> _history;
ChildWidget<ProfileWidget> _profile = { nullptr };
ChildWidget<Profile::Widget> _profile = { nullptr };
ChildWidget<OverviewWidget> _overview = { nullptr };
ChildWidget<PlayerWidget> _player;
ChildWidget<Window::TopBarWidget> _topBar;

View File

@ -435,7 +435,7 @@ void MainWindow::init() {
connect(windowHandle(), SIGNAL(activeChanged()), this, SLOT(checkHistoryActivation()), Qt::QueuedConnection);
QPalette p(palette());
p.setColor(QPalette::Window, st::wndBG->c);
p.setColor(QPalette::Window, st::windowBg->c);
setPalette(p);
title = new TitleWidget(this);
@ -1420,6 +1420,7 @@ void MainWindow::notifySchedule(History *history, HistoryItem *item) {
} else if (cOtherOnline() >= t) {
delay = Global::NotifyDefaultDelay();
}
// LOG(("Is online: %1, otherOnline: %2, currentTime: %3, otherNotOld: %4, otherLaterThanMe: %5").arg(Logs::b(isOnline)).arg(cOtherOnline()).arg(t).arg(Logs::b(otherNotOld)).arg(Logs::b(otherLaterThanMe)));
uint64 when = ms + delay;
notifyWhenAlerts[history].insert(when, notifyByFrom);

View File

@ -0,0 +1,50 @@
/*
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";
profileBg: windowBg;
profileTopBarHeight: topBarHeight;
profileTopBarBackIconFg: #51b3e0;
profileTopBarBackIcon: icon {
{ "topbar_back_arrow", profileTopBarBackIconFg },
};
profileTopBarBackIconPosition: point(15px, 19px);
profileTopBarBackFont: font(14px);
profileTopBarBackFg: #1485c2;
profileTopBarBackPosition: point(32px, 17px);
profileMarginTop: 13px;
profilePhotoSize: 112px;
profilePhotoLeft: 35px;
profileNameLeft: 26px;
profileNameTop: 9px;
profileNameFont: font(16px);
profileNameFg: windowTextFg;
profileStatusLeft: 27px;
profileStatusTop: 35px;
profileStatusFont: normalFont;
profileStatusFg: windowSubTextFg;
profileMarginBottom: 30px;
profileSeparator: 10px;
profileBlocksTop: 7px;
profileBlockMarginTop: 21px;

View File

@ -0,0 +1,202 @@
/*
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 "profile/profile_cover.h"
#include "styles/style_profile.h"
#include "lang.h"
#include "apiwrap.h"
#include "mainwidget.h"
namespace Profile {
class BackButton final : public Button {
public:
BackButton(QWidget *parent) : Button(parent) {
setCursor(style::cur_pointer);
}
void resizeToWidth(int newWidth) {
resize(newWidth, st::profileTopBarHeight);
}
protected:
void paintEvent(QPaintEvent *e) {
Painter p(this);
st::profileTopBarBackIcon.paint(p, st::profileTopBarBackIconPosition, width());
p.setFont(st::profileTopBarBackFont);
p.setPen(st::profileTopBarBackFg);
p.drawTextLeft(st::profileTopBarBackPosition.x(), st::profileTopBarBackPosition.y(), width(), lang(lng_menu_back));
}
private:
};
class PhotoButton final : public Button {
public:
PhotoButton(QWidget *parent, PeerData *peer) : Button(parent), _peer(peer) {
resize(st::profilePhotoSize, st::profilePhotoSize);
}
protected:
void paintEvent(QPaintEvent *e) {
Painter p(this);
_peer->paintUserpic(p, st::profilePhotoSize, 0, 0);
}
private:
PeerData *_peer;
};
CoverWidget::CoverWidget(QWidget *parent, PeerData *peer) : TWidget(parent)
, _peer(peer)
, _peerUser(peer->asUser())
, _peerChat(peer->asChat())
, _peerChannel(peer->asChannel())
, _peerMegagroup(peer->isMegagroup() ? _peerChannel : nullptr)
, _backButton(this)
, _photoButton(this, peer) {
setAttribute(Qt::WA_OpaquePaintEvent);
_backButton->moveToLeft(0, 0);
connect(_backButton, SIGNAL(clicked()), this, SLOT(onBack()));
_nameText.setText(st::profileNameFont, App::peerName(_peer));
updateStatusText();
}
void CoverWidget::onBack() {
App::main()->showBackFromStack();
}
void CoverWidget::resizeToWidth(int newWidth) {
int newHeight = 0;
// Top bar
_backButton->resizeToWidth(newWidth);
newHeight += _backButton->height();
// Cover content
newHeight += st::profileMarginTop;
_photoButton->moveToLeft(st::profilePhotoLeft, newHeight);
int infoLeft = _photoButton->x() + _photoButton->width();
_namePosition = QPoint(infoLeft + st::profileNameLeft, _photoButton->y() + st::profileNameTop);
_statusPosition = QPoint(infoLeft + st::profileStatusLeft, _photoButton->y() + st::profileStatusTop);
newHeight += st::profilePhotoSize;
newHeight += st::profileMarginBottom;
newHeight += st::profileSeparator;
newHeight += st::profileBlocksTop;
resize(newWidth, newHeight);
update();
}
void CoverWidget::paintEvent(QPaintEvent *e) {
Painter p(this);
p.fillRect(e->rect(), st::white);
int availWidth = width() - _namePosition.x() - _photoButton->x();
p.setFont(st::profileNameFont);
p.setPen(st::profileNameFg);
_nameText.drawLeftElided(p, _namePosition.x(), _namePosition.y(), availWidth, width());
p.setFont(st::profileStatusFont);
p.setPen(st::profileStatusFg);
p.drawTextLeft(_statusPosition.x(), _statusPosition.y(), width(), _statusText);
}
void CoverWidget::updateStatusText() {
int currentTime = unixtime();
if (_peerUser) {
_statusText = App::onlineText(_peerUser, currentTime, true);
} else if (_peerChat && _peerChat->amIn()) {
if (_peerChat->noParticipantInfo()) {
App::api()->requestFullPeer(_peer);
if (_statusText.isEmpty()) {
_statusText = lng_chat_status_members(lt_count, _peerChat->count);
}
} else {
int onlineCount = 0;
bool onlyMe = true;
for (auto i = _peerChat->participants.cbegin(), e = _peerChat->participants.cend(); i != e; ++i) {
auto onlineTill = App::onlineForSort(i.key(), currentTime);
if (onlineTill > currentTime) {
++onlineCount;
}
}
if (onlineCount && !onlyMe) {
_statusText = lng_chat_status_members_online(lt_count, _peerChat->participants.size(), lt_count_online, onlineCount);
} else {
_statusText = lng_chat_status_members(lt_count, _peerChat->participants.size());
}
}
} else if (isUsingMegagroupOnlineCount()) {
int onlineCount = 0;
bool onlyMe = true;
for_const (auto &user, _peerMegagroup->mgInfo->lastParticipants) {
auto onlineTill = App::onlineForSort(user, currentTime);
if (onlineTill > currentTime) {
++onlineCount;
}
}
if (onlineCount && !onlyMe) {
_statusText = lng_chat_status_members_online(lt_count, _peerMegagroup->count, lt_count_online, onlineCount);
} else {
_statusText = lng_chat_status_members(lt_count, _peerMegagroup->count);
}
} else if (_peerChannel) {
if (_peerChannel->count > 0) {
_statusText = lng_chat_status_members(lt_count, _peerChannel->count);
} else {
_statusText = lang(_peerChannel->isMegagroup() ? lng_group_status : lng_channel_status);
}
} else {
_statusText = lang(lng_chat_status_unaccessible);
}
}
bool CoverWidget::isUsingMegagroupOnlineCount() const {
if (!_peerMegagroup || !_peerMegagroup->amIn()) {
return false;
}
if (_peerMegagroup->count <= 0 || _peerMegagroup->count > Global::ChatSizeMax()) {
return false;
}
if (_peerMegagroup->mgInfo->lastParticipants.isEmpty() || _peerMegagroup->lastParticipantsCountOutdated()) {
App::api()->requestLastParticipants(_peerMegagroup);
return false;
}
return true;
}
} // namespace Profile

View File

@ -0,0 +1,71 @@
/*
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 Profile {
class BackButton;
class PhotoButton;
class CoverWidget final : public TWidget {
Q_OBJECT
public:
CoverWidget(QWidget *parent, PeerData *peer);
// Count new height for width=newWidth and resize to it.
void resizeToWidth(int newWidth);
public slots:
void onBack();
protected:
void paintEvent(QPaintEvent *e) override;
private:
void updateStatusText();
bool isUsingMegagroupOnlineCount() const;
PeerData *_peer;
UserData *_peerUser;
ChatData *_peerChat;
ChannelData *_peerChannel;
ChannelData *_peerMegagroup;
// Top bar
ChildWidget<BackButton> _backButton;
QList<FlatButton*> _rightActions;
// Cover content
ChildWidget<PhotoButton> _photoButton;
QPoint _namePosition;
Text _nameText;
QPoint _statusPosition;
QString _statusText;
ChildWidget<BoxButton> _primaryButton = { nullptr };
ChildWidget<BoxButton> _secondaryButton = { nullptr };
};
} // namespace Profile

View File

@ -0,0 +1,59 @@
/*
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 "profile/profile_inner_widget.h"
#include "styles/style_profile.h"
#include "profile/profile_cover.h"
namespace Profile {
InnerWidget::InnerWidget(QWidget *parent, PeerData *peer) : TWidget(parent)
, _peer(peer)
, _cover(this, peer) {
}
void InnerWidget::resizeToWidth(int newWidth, int minHeight) {
int naturalHeight = resizeGetHeight(newWidth);
_addedHeight = qMax(minHeight - naturalHeight, 0);
resize(newWidth, naturalHeight + _addedHeight);
}
void InnerWidget::decreaseAdditionalHeight(int removeHeight) {
if (removeHeight > 0) {
resizeToWidth(width(), height() - removeHeight);
}
}
void InnerWidget::paintEvent(QPaintEvent *e) {
Painter p(this);
p.fillRect(e->rect(), st::white);
}
int InnerWidget::resizeGetHeight(int newWidth) {
_cover->resizeToWidth(newWidth);
int newHeight = _cover->height();
return newHeight;
}
} // namespace Profile

View File

@ -0,0 +1,64 @@
/*
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 Profile {
class CoverWidget;
class BlockWidget;
class InnerWidget final : public TWidget {
Q_OBJECT
public:
InnerWidget(QWidget *parent, PeerData *peer);
PeerData *peer() const {
return _peer;
}
// Count new height for width=newWidth and resize to it.
void resizeToWidth(int newWidth, int minHeight);
// Sometimes height of this widget is larger than it is required
// so that it is allowed to scroll down to the desired position.
// When resizing with scroll moving up the additional height may be decreased.
void decreaseAdditionalHeight(int removeHeight);
protected:
void paintEvent(QPaintEvent *e) override;
private:
// Resizes content and counts natural widget height for the desired width.
int resizeGetHeight(int newWidth);
PeerData *_peer;
// Height that we added to the natural height so that it is allowed
// to scroll down to the desired position.
int _addedHeight = 0;
ChildWidget<CoverWidget> _cover;
QList<BlockWidget*> _blocks;
};
} // namespace Profile

View File

@ -0,0 +1,119 @@
/*
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 "profile/profile_widget.h"
#include "profile/profile_inner_widget.h"
#include "mainwindow.h"
#include "application.h"
namespace Profile {
Widget::Widget(QWidget *parent, PeerData *peer) : TWidget(parent)
, _scroll(this, st::setScroll)
, _inner(this, peer)
, _sideShadow(this, st::shadowColor) {
_scroll->setWidget(_inner);
_scroll->move(0, 0);
_scroll->show();
_sideShadow->setVisible(!Adaptive::OneColumn());
connect(_scroll, SIGNAL(scrolled()), _inner, SLOT(updateSelected()));
connect(_scroll, SIGNAL(scrolled()), this, SLOT(onScroll()));
}
PeerData *Widget::peer() const {
return _inner->peer();
}
void Widget::setGeometryWithTopMoved(const QRect &newGeometry, int topDelta) {
_topDelta = topDelta;
bool willBeResized = (size() != newGeometry.size());
if (geometry() != newGeometry) {
setGeometry(newGeometry);
}
if (!willBeResized) {
resizeEvent(nullptr);
}
_topDelta = 0;
}
void Widget::showAnimated(SlideDirection direction, const QPixmap &oldContentCache) {
show();
_scroll->show();
_sideShadow->hide();
auto myContentCache = myGrab(this);
_scroll->hide();
_sideShadow->show();
_showAnimation = std_::make_unique<SlideAnimation>();
_showAnimation->setDirection(direction);
_showAnimation->setRepaintCallback(func(this, &Widget::repaintCallback));
_showAnimation->setFinishedCallback(func(this, &Widget::showFinished));
_showAnimation->setPixmaps(oldContentCache, myContentCache);
_showAnimation->start();
}
void Widget::setInnerFocus() {
_inner->setFocus();
}
void Widget::resizeEvent(QResizeEvent *e) {
int newScrollTop = _scroll->scrollTop() + _topDelta;
if (_scroll->size() != size()) {
_scroll->resize(size());
if (_inner->width() != width()) {
_inner->resizeToWidth(width(), _scroll->height());
}
}
if (!_scroll->isHidden()) {
if (_topDelta) {
_scroll->scrollToY(newScrollTop);
}
int notDisplayedAtBottom = _scroll->scrollTopMax() - _scroll->scrollTop();
if (notDisplayedAtBottom > 0) {
_inner->decreaseAdditionalHeight(notDisplayedAtBottom);
}
}
_sideShadow->resize(st::lineWidth, height());
_sideShadow->moveToLeft(0, 0);
}
void Widget::paintEvent(QPaintEvent *e) {
if (Ui::skipPaintEvent(this, e)) return;
if (_showAnimation) {
Painter p(this);
_showAnimation->paintContents(p, e->rect());
}
}
void Widget::showFinished() {
if (isHidden()) return;
App::app()->mtpUnpause();
_scroll->show();
setInnerFocus();
}
} // namespace Profile

View File

@ -0,0 +1,69 @@
/*
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
#include "ui/slide_animation.h"
class ScrollArea;
namespace Profile {
class InnerWidget;
class Widget final : public TWidget {
Q_OBJECT
public:
Widget(QWidget *parent, PeerData *peer);
PeerData *peer() const;
// When resizing the widget with top edge moved up or down and we
// want to add this top movement to the scroll position, so inner
// content will not move.
void setGeometryWithTopMoved(const QRect &newGeometry, int topDelta);
void showAnimated(SlideDirection direction, const QPixmap &oldContentCache);
void setInnerFocus();
protected:
void resizeEvent(QResizeEvent *e) override;
void paintEvent(QPaintEvent *e) override;
private:
// QWidget::update() method is overloaded and we need template deduction.
void repaintCallback() {
update();
}
void showFinished();
ChildWidget<ScrollArea> _scroll;
ChildWidget<InnerWidget> _inner;
ChildWidget<PlainShadow> _sideShadow;
std_::unique_ptr<SlideAnimation> _showAnimation;
// Saving here topDelta in resizeWithTopMoved() to get it passed to resizeEvent().
int _topDelta = 0;
};
} // namespace Profile

View File

@ -33,9 +33,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "apiwrap.h"
#include "window/top_bar_widget.h"
ProfileInner::ProfileInner(ProfileWidget *profile, ScrollArea *scroll, PeerData *peer) : TWidget(0)
ProfileInner::ProfileInner(ProfileWidget *profile, PeerData *peer) : TWidget(0)
, _profile(profile)
, _scroll(scroll)
, _peer(peer->migrateTo() ? peer->migrateTo() : peer)
, _peerUser(_peer->asUser())
, _peerChat(_peer->asChat())
@ -145,7 +144,7 @@ ProfileInner::ProfileInner(ProfileWidget *profile, ScrollArea *scroll, PeerData
}
// profile
_nameText.setText(st::profileNameFont, _nameCache, _textNameOptions);
// _nameText.setText(st::profileNameFont, _nameCache, _textNameOptions);
connect(&_uploadPhoto, SIGNAL(clicked()), this, SLOT(onUpdatePhoto()));
connect(&_addParticipant, SIGNAL(clicked()), this, SLOT(onAddParticipant()));
connect(&_sendMessage, SIGNAL(clicked()), this, SLOT(onSendMessage()));
@ -636,7 +635,7 @@ void ProfileInner::peerUpdated(PeerData *data) {
}
if (_peer->name != _nameCache) {
_nameCache = _peer->name;
_nameText.setText(st::profileNameFont, _nameCache, _textNameOptions);
// _nameText.setText(st::profileNameFont, _nameCache, _textNameOptions);
}
}
if (!_updateDelayed) {
@ -838,7 +837,7 @@ void ProfileInner::paintEvent(QPaintEvent *e) {
// profile
top += st::profilePadding.top();
if (_photoLink || _peerUser || (_peerChat && !_peerChat->canEdit()) || (_peerChannel && !_amCreator)) {
_peer->paintUserpic(p, st::profilePhotoSize, _left, top);
// _peer->paintUserpic(p, st::profilePhotoSize, _left, top);
} else {
if (a_photoOver.current() < 1) {
p.drawSprite(QPoint(_left, top), st::setPhotoImg);
@ -850,44 +849,44 @@ void ProfileInner::paintEvent(QPaintEvent *e) {
}
}
int32 namew = _width - st::profilePhotoSize - st::profileNameLeft;
// int32 namew = _width - st::profilePhotoSize - st::profileNameLeft;
p.setPen(st::black->p);
if (_peer->isVerified()) {
namew -= st::verifiedCheckProfile.pxWidth() + st::verifiedCheckProfilePos.x();
int32 cx = _left + st::profilePhotoSize + st::profileNameLeft + qMin(_nameText.maxWidth(), namew);
p.drawSprite(QPoint(cx, top + st::profileNameTop) + st::verifiedCheckProfilePos, st::verifiedCheckProfile);
//namew -= st::verifiedCheckProfile.pxWidth() + st::verifiedCheckProfilePos.x();
//int32 cx = _left + st::profilePhotoSize + st::profileNameLeft + qMin(_nameText.maxWidth(), namew);
//p.drawSprite(QPoint(cx, top + st::profileNameTop) + st::verifiedCheckProfilePos, st::verifiedCheckProfile);
}
_nameText.drawElided(p, _left + st::profilePhotoSize + st::profileNameLeft, top + st::profileNameTop, namew);
// _nameText.drawElided(p, _left + st::profilePhotoSize + st::profileNameLeft, top + st::profileNameTop, namew);
p.setFont(st::profileStatusFont->f);
//p.setFont(st::profileStatusFont->f);
int32 addbyname = 0;
if (_peerUser && !_peerUser->username.isEmpty()) {
addbyname = st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
p.setPen(st::black->p);
p.drawText(_left + st::profilePhotoSize + st::profileStatusLeft, top + st::profileStatusTop + st::linkFont->ascent, '@' + _peerUser->username);
//addbyname = st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
//p.setPen(st::black->p);
//p.drawText(_left + st::profilePhotoSize + st::profileStatusLeft, top + st::profileStatusTop + st::linkFont->ascent, '@' + _peerUser->username);
} else if (_peerChannel && (_peerChannel->isPublic() || _peerChannel->canEditUsername())) {
addbyname = st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
// addbyname = st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
}
if (!_peerChannel || !_peerChannel->canViewParticipants() || _peerChannel->isMegagroup()) {
p.setPen((_peerUser && App::onlineColorUse(_peerUser, l_time) ? st::profileOnlineColor : st::profileOfflineColor)->p);
p.drawText(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop + st::linkFont->ascent, _onlineText);
//p.setPen((_peerUser && App::onlineColorUse(_peerUser, l_time) ? st::profileOnlineColor : st::profileOfflineColor)->p);
//p.drawText(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop + st::linkFont->ascent, _onlineText);
}
if (!_cancelPhoto.isHidden()) {
p.setPen(st::profileOfflineColor->p);
p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, _cancelPhoto.y() + st::linkFont->ascent, lang(lng_settings_uploading_photo));
//p.setPen(st::profileOfflineColor->p);
//p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, _cancelPhoto.y() + st::linkFont->ascent, lang(lng_settings_uploading_photo));
}
if (!_errorText.isEmpty()) {
p.setFont(st::setErrFont->f);
p.setPen(st::setErrColor->p);
p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, _cancelPhoto.y() + st::profilePhoneFont->ascent, _errorText);
// p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, _cancelPhoto.y() + st::profilePhoneFont->ascent, _errorText);
}
if (!_phoneText.isEmpty()) {
p.setPen(st::black->p);
p.setFont(st::linkFont->f);
p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, top + addbyname + st::profilePhoneTop + st::profilePhoneFont->ascent, _phoneText);
// p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, top + addbyname + st::profilePhoneTop + st::profilePhoneFont->ascent, _phoneText);
}
top += st::profilePhotoSize;
// top += st::profilePhotoSize;
top += st::profileButtonTop;
if ((!_peerChat || _peerChat->canEdit()) && (!_peerChannel || _amCreator || (_peerChannel->canAddParticipants() && _peerChannel->isMegagroup()))) {
@ -1385,24 +1384,24 @@ void ProfileInner::resizeEvent(QResizeEvent *e) {
top += st::profilePadding.top();
int32 addbyname = 0;
if (_peerChannel && (_peerChannel->isPublic() || _peerChannel->canEditUsername())) {
_username.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + st::profileStatusTop);
addbyname = st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
//_username.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + st::profileStatusTop);
//addbyname = st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
}
_members.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop);
addbyname += st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
//_members.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop);
//addbyname += st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
if (!_admins.isHidden()) {
_admins.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop);
addbyname += st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
//_admins.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop);
//addbyname += st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
}
if ((_peerChat && _amCreator && _peerChat->canEdit()) || (_peerChannel && (_amCreator || _peerChannel->amEditor() || _peerChannel->amModerator()))) {
_cancelPhoto.move(_left + _width - _cancelPhoto.width(), top + st::profilePhotoSize - st::linkFont->height);
// _cancelPhoto.move(_left + _width - _cancelPhoto.width(), top + st::profilePhotoSize - st::linkFont->height);
} else {
_cancelPhoto.move(_left + _width - _cancelPhoto.width(), top + st::profilePhoneTop);
_botSettings.move(_left + st::profilePhotoSize + st::profilePhoneLeft, top + st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent) + st::profilePhoneTop);
// _botSettings.move(_left + st::profilePhotoSize + st::profilePhoneLeft, top + st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent) + st::profilePhoneTop);
_botHelp.move(_botSettings.x() + (_botSettings.isHidden() ? 0 : _botSettings.width() + st::profilePhoneLeft), _botSettings.y());
}
_pinnedMessage.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop);
top += st::profilePhotoSize;
//_pinnedMessage.move(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop);
//top += st::profilePhotoSize;
top += st::profileButtonTop;
@ -1514,22 +1513,22 @@ void ProfileInner::contextMenuEvent(QContextMenuEvent *e) {
_menu = 0;
}
if (!_phoneText.isEmpty() || _peerUser) {
QRect info(_left + st::profilePhotoSize + st::profilePhoneLeft, st::profilePadding.top(), _width - st::profilePhotoSize - st::profilePhoneLeft, st::profilePhotoSize);
if (info.contains(mapFromGlobal(e->globalPos()))) {
_menu = new PopupMenu();
if (_peerUser) {
_menu->addAction(lang(lng_profile_copy_fullname), this, SLOT(onCopyFullName()))->setEnabled(true);
}
if (!_phoneText.isEmpty()) {
_menu->addAction(lang(lng_profile_copy_phone), this, SLOT(onCopyPhone()))->setEnabled(true);
}
if (_peerUser && !_peerUser->username.isEmpty()) {
_menu->addAction(lang(lng_context_copy_mention), this, SLOT(onCopyUsername()))->setEnabled(true);
}
connect(_menu, SIGNAL(destroyed(QObject*)), this, SLOT(onMenuDestroy(QObject*)));
_menu->popup(e->globalPos());
e->accept();
}
// QRect info(_left + st::profilePhotoSize + st::profilePhoneLeft, st::profilePadding.top(), _width - st::profilePhotoSize - st::profilePhoneLeft, st::profilePhotoSize);
//if (info.contains(mapFromGlobal(e->globalPos()))) {
// _menu = new PopupMenu();
// if (_peerUser) {
// _menu->addAction(lang(lng_profile_copy_fullname), this, SLOT(onCopyFullName()))->setEnabled(true);
// }
// if (!_phoneText.isEmpty()) {
// _menu->addAction(lang(lng_profile_copy_phone), this, SLOT(onCopyPhone()))->setEnabled(true);
// }
// if (_peerUser && !_peerUser->username.isEmpty()) {
// _menu->addAction(lang(lng_context_copy_mention), this, SLOT(onCopyUsername()))->setEnabled(true);
// }
// connect(_menu, SIGNAL(destroyed(QObject*)), this, SLOT(onMenuDestroy(QObject*)));
// _menu->popup(e->globalPos());
// e->accept();
//}
}
}
@ -1863,7 +1862,7 @@ QString ProfileInner::overviewLinkText(int32 type, int32 count) {
ProfileWidget::ProfileWidget(QWidget *parent, PeerData *peer) : TWidget(parent)
, _scroll(this, st::setScroll)
, _inner(this, &_scroll, peer)
, _inner(this, peer)
, _a_show(animation(this, &ProfileWidget::step_show))
, _sideShadow(this, st::shadowColor)
, _topShadow(this, st::shadowColor)

View File

@ -26,7 +26,7 @@ class ProfileInner : public TWidget, public RPCSender, public ClickHandlerHost {
public:
ProfileInner(ProfileWidget *profile, ScrollArea *scroll, PeerData *peer);
ProfileInner(ProfileWidget *profile, PeerData *peer);
void start();
@ -147,7 +147,6 @@ private:
bool migrateFail(const RPCError &error);
ProfileWidget *_profile;
ScrollArea *_scroll;
PeerData *_peer;
UserData *_peerUser;

View File

@ -115,7 +115,7 @@ namespace anim {
void Animation::start() {
if (!_manager) return;
_cb.start();
_callbacks.start();
_manager->start(this);
_animating = true;
}
@ -237,8 +237,8 @@ QPixmap _prepareFrame(const ClipFrameRequest &request, const QImage &original, b
return QPixmap::fromImage(original, Qt::ColorOnly);
}
ClipReader::ClipReader(const FileLocation &location, const QByteArray &data, Callback::Creator cb)
: _cb(cb)
ClipReader::ClipReader(const FileLocation &location, const QByteArray &data, Callback &&callback)
: _callback(std_::move(callback))
, _state(ClipReading)
, _width(0)
, _height(0)
@ -334,7 +334,7 @@ void ClipReader::moveToNextWrite() const {
void ClipReader::callback(ClipReader *reader, int32 threadIndex, ClipReaderNotification notification) {
// check if reader is not deleted already
if (_clipManagers.size() > threadIndex && _clipManagers.at(threadIndex)->carries(reader)) {
reader->_cb.call(notification);
reader->_callback.call(notification);
}
}

View File

@ -203,39 +203,42 @@ public:
virtual void start() {}
virtual void step(Animation *a, uint64 ms, bool timer) = 0;
virtual ~AnimationImplementation() {}
};
class AnimationCreator {
public:
AnimationCreator(AnimationImplementation *ptr) : _ptr(ptr) {}
AnimationCreator(const AnimationCreator &other) : _ptr(other.create()) {}
AnimationImplementation *create() const { return getPointerAndReset(_ptr); }
~AnimationCreator() { deleteAndMark(_ptr); }
private:
AnimationCreator &operator=(const AnimationCreator &other) = delete;
mutable AnimationImplementation *_ptr;
};
class AnimationCallbacks {
public:
AnimationCallbacks(const AnimationCreator &creator) : _implementation(creator.create()) {}
AnimationCallbacks(AnimationImplementation *implementation) : _implementation(implementation) {}
AnimationCallbacks(const AnimationCallbacks &other) = delete;
AnimationCallbacks &operator=(const AnimationCallbacks &other) = delete;
AnimationCallbacks(AnimationCallbacks &&other) : _implementation(other._implementation) {
other._implementation = nullptr;
}
AnimationCallbacks &operator=(AnimationCallbacks &&other) {
std::swap(_implementation, other._implementation);
}
void start() { _implementation->start(); }
void step(Animation *a, uint64 ms, bool timer) { _implementation->step(a, ms, timer); }
~AnimationCallbacks() { deleteAndMark(_implementation); }
private:
AnimationCallbacks(const AnimationCallbacks &other);
AnimationCallbacks &operator=(const AnimationCallbacks &other) = delete;
AnimationImplementation *_implementation;
};
class Animation {
public:
Animation(AnimationCreator cb) : _cb(cb), _animating(false) {
Animation(AnimationCallbacks &&callbacks)
: _callbacks(std_::move(callbacks))
, _animating(false) {
}
void start();
void stop();
void step(uint64 ms, bool timer = false) {
_cb.step(this, ms, timer);
_callbacks.step(this, ms, timer);
}
void step() {
@ -251,7 +254,7 @@ public:
}
private:
AnimationCallbacks _cb;
AnimationCallbacks _callbacks;
bool _animating;
};
@ -279,8 +282,8 @@ private:
};
template <typename Type>
AnimationCreator animation(Type *obj, typename AnimationCallbacksRelative<Type>::Method method) {
return AnimationCreator(new AnimationCallbacksRelative<Type>(obj, method));
AnimationCallbacks animation(Type *obj, typename AnimationCallbacksRelative<Type>::Method method) {
return AnimationCallbacks(new AnimationCallbacksRelative<Type>(obj, method));
}
template <typename Type>
@ -301,8 +304,8 @@ private:
};
template <typename Type>
AnimationCreator animation(Type *obj, typename AnimationCallbacksAbsolute<Type>::Method method) {
return AnimationCreator(new AnimationCallbacksAbsolute<Type>(obj, method));
AnimationCallbacks animation(Type *obj, typename AnimationCallbacksAbsolute<Type>::Method method) {
return AnimationCallbacks(new AnimationCallbacksAbsolute<Type>(obj, method));
}
template <typename Type, typename Param>
@ -329,8 +332,8 @@ private:
};
template <typename Type, typename Param>
AnimationCreator animation(Param param, Type *obj, typename AnimationCallbacksRelativeWithParam<Type, Param>::Method method) {
return AnimationCreator(new AnimationCallbacksRelativeWithParam<Type, Param>(param, obj, method));
AnimationCallbacks animation(Param param, Type *obj, typename AnimationCallbacksRelativeWithParam<Type, Param>::Method method) {
return AnimationCallbacks(new AnimationCallbacksRelativeWithParam<Type, Param>(param, obj, method));
}
template <typename Type, typename Param>
@ -352,15 +355,15 @@ private:
};
template <typename Type, typename Param>
AnimationCreator animation(Param param, Type *obj, typename AnimationCallbacksAbsoluteWithParam<Type, Param>::Method method) {
return AnimationCreator(new AnimationCallbacksAbsoluteWithParam<Type, Param>(param, obj, method));
AnimationCallbacks animation(Param param, Type *obj, typename AnimationCallbacksAbsoluteWithParam<Type, Param>::Method method) {
return AnimationCallbacks(new AnimationCallbacksAbsoluteWithParam<Type, Param>(param, obj, method));
}
template <typename AnimType>
class SimpleAnimation {
public:
typedef Function<void> Callback;
using Callback = Function<void>;
SimpleAnimation() : _data(0) {
}
@ -385,9 +388,9 @@ public:
return animating(ms) ? current() : def;
}
void setup(const typename AnimType::Type &from, Callback::Creator update) {
void setup(const typename AnimType::Type &from, Callback &&update) {
if (!_data) {
_data = new Data(from, update, animation(this, &SimpleAnimation<AnimType>::step));
_data = new Data(from, std_::move(update), animation(this, &SimpleAnimation<AnimType>::step));
} else {
_data->a = AnimType(from, from);
}
@ -407,11 +410,11 @@ public:
}
private:
typedef struct _Data {
_Data(const typename AnimType::Type &from, Callback::Creator update, AnimationCreator acb)
struct Data {
Data(const typename AnimType::Type &from, Callback &&update, AnimationCallbacks &&acb)
: a(from, from)
, _a(acb)
, update(update)
, _a(std_::move(acb))
, update(std_::move(update))
, duration(0)
, transition(anim::linear) {
}
@ -420,7 +423,7 @@ private:
Callback update;
float64 duration;
anim::transition transition;
} Data;
};
Data *_data;
void step(float64 ms, bool timer) {
@ -506,9 +509,9 @@ class ClipReaderPrivate;
class ClipReader {
public:
typedef Function1<void, ClipReaderNotification> Callback;
using Callback = Function<void, ClipReaderNotification>;
ClipReader(const FileLocation &location, const QByteArray &data, Callback::Creator cb);
ClipReader(const FileLocation &location, const QByteArray &data, Callback &&callback);
static void callback(ClipReader *reader, int32 threadIndex, ClipReaderNotification notification); // reader can be deleted
void setAutoplay() {
@ -555,7 +558,7 @@ public:
private:
Callback _cb;
Callback _callback;
ClipState _state;

View File

@ -335,7 +335,7 @@ void EmojiButton::paintEvent(QPaintEvent *e) {
void EmojiButton::setLoading(bool loading) {
if (_loading != loading) {
EnsureAnimation(a_loading, _loading ? 1. : 0., func(this, &EmojiButton::update));
EnsureAnimation(a_loading, _loading ? 1. : 0., func(this, &EmojiButton::updateCallback));
a_loading.start(loading ? 1. : 0., st::emojiCircleDuration);
_loading = loading;
if (_loading) {

View File

@ -151,9 +151,12 @@ private:
void step_loading(uint64 ms, bool timer) {
if (timer) {
update();
updateCallback();
}
}
void updateCallback() {
update();
}
};

View File

@ -0,0 +1,97 @@
/*
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 "ui/slide_animation.h"
SlideAnimation::SlideAnimation()
: _animation(animation(this, &SlideAnimation::step)) {
}
void SlideAnimation::paintContents(Painter &p, const QRect &update) const {
_animation.step(getms());
if (a_progress.current() < 1) {
p.fillRect(update, st::white);
int retina = cIntRetinaFactor();
int underLeft = a_coordUnder.current();
int underWidth = _cacheUnder.width() / retina;
int underHeight = _cacheUnder.height() / retina;
QRect underDest(0, 0, underWidth + underLeft, underHeight);
QRect underSrc(-underLeft * retina, 0, (underWidth + underLeft) * retina, underHeight * retina);
p.setOpacity(1. - a_progress.current());
p.drawPixmap(underDest, _cacheUnder, underSrc);
p.setOpacity(a_progress.current());
}
p.drawPixmap(a_coordOver.current(), 0, _cacheOver);
}
void SlideAnimation::setDirection(SlideDirection direction) {
_direction = direction;
}
void SlideAnimation::setPixmaps(const QPixmap &oldContentCache, const QPixmap &newContentCache) {
_cacheUnder = oldContentCache;
_cacheOver = newContentCache;
}
void SlideAnimation::setRepaintCallback(RepaintCallback &&callback) {
_repaintCallback = std_::move(callback);
}
void SlideAnimation::setFinishedCallback(FinishedCallback &&callback) {
_finishedCallback = std_::move(callback);
}
void SlideAnimation::start() {
int width = _cacheUnder.width() / cIntRetinaFactor();
int delta = qFloor(st::slideShift * width);
a_progress = anim::fvalue(0, 1);
if (_direction == SlideDirection::FromLeft) {
std::swap(_cacheUnder, _cacheOver);
a_coordUnder = anim::ivalue(-delta, 0);
a_coordOver = anim::ivalue(0, delta);
} else {
a_coordUnder = anim::ivalue(0, -delta);
a_coordOver = anim::ivalue(delta, 0);
}
_animation.start();
}
void SlideAnimation::step(float64 ms, bool timer) {
float64 dt = ms / st::slideDuration;
if (dt >= 1) {
dt = 1;
if (timer) {
_animation.stop();
a_coordUnder.finish();
a_coordOver.finish();
_finishedCallback.call();
return;
}
}
a_coordUnder.update(dt, anim::linear);
a_coordOver.update(dt, anim::linear);
a_progress.update(dt, anim::linear);
if (timer) {
_repaintCallback.call();
}
}

View File

@ -0,0 +1,58 @@
/*
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
enum class SlideDirection {
FromRight,
FromLeft,
};
class SlideAnimation {
public:
SlideAnimation();
void paintContents(Painter &p, const QRect &update) const;
void setDirection(SlideDirection direction);
void setPixmaps(const QPixmap &oldContentCache, const QPixmap &newContentCache);
using RepaintCallback = Function<void>;
void setRepaintCallback(RepaintCallback &&callback);
using FinishedCallback = Function<void>;
void setFinishedCallback(FinishedCallback &&callback);
void start();
private:
void step(float64 ms, bool timer);
SlideDirection _direction = SlideDirection::FromRight;
mutable Animation _animation;
QPixmap _cacheUnder, _cacheOver;
anim::ivalue a_coordUnder, a_coordOver;
anim::fvalue a_progress;
RepaintCallback _repaintCallback;
FinishedCallback _finishedCallback;
};

View File

@ -386,6 +386,18 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_profile_cover.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_profile_inner_widget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_profile_widget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_pspecific_linux.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@ -673,6 +685,18 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_profile_cover.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_profile_inner_widget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_profile_widget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_pspecific_linux.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@ -986,6 +1010,18 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_profile_cover.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_profile_inner_widget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_profile_widget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_pspecific_linux.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
@ -1052,6 +1088,7 @@
<ClCompile Include="GeneratedFiles\styles\style_basic.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_basic_types.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_overview.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_profile.cpp" />
<ClCompile Include="SourceFiles\apiwrap.cpp" />
<ClCompile Include="SourceFiles\app.cpp" />
<ClCompile Include="SourceFiles\application.cpp" />
@ -1125,6 +1162,9 @@
<ClCompile Include="SourceFiles\passcodewidget.cpp" />
<ClCompile Include="SourceFiles\playerwidget.cpp" />
<ClCompile Include="SourceFiles\profilewidget.cpp" />
<ClCompile Include="SourceFiles\profile\profile_cover.cpp" />
<ClCompile Include="SourceFiles\profile\profile_inner_widget.cpp" />
<ClCompile Include="SourceFiles\profile\profile_widget.cpp" />
<ClCompile Include="SourceFiles\pspecific_linux.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
@ -1173,6 +1213,7 @@
<ClCompile Include="SourceFiles\ui\images.cpp" />
<ClCompile Include="SourceFiles\ui\popupmenu.cpp" />
<ClCompile Include="SourceFiles\ui\scrollarea.cpp" />
<ClCompile Include="SourceFiles\ui\slide_animation.cpp" />
<ClCompile Include="SourceFiles\ui\style\style_core.cpp" />
<ClCompile Include="SourceFiles\ui\style\style_core_color.cpp" />
<ClCompile Include="SourceFiles\ui\style\style_core_icon.cpp" />
@ -1257,6 +1298,7 @@
<ClInclude Include="GeneratedFiles\styles\style_basic.h" />
<ClInclude Include="GeneratedFiles\styles\style_basic_types.h" />
<ClInclude Include="GeneratedFiles\styles\style_overview.h" />
<ClInclude Include="GeneratedFiles\styles\style_profile.h" />
<ClInclude Include="Resources\winrc\resource.h" />
<ClInclude Include="SourceFiles\core\click_handler.h" />
<ClInclude Include="SourceFiles\core\click_handler_types.h" />
@ -1375,6 +1417,48 @@
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include" "-fstdafx.h" "-f../../SourceFiles/mtproto/session.h"</Command>
</CustomBuild>
<ClInclude Include="SourceFiles\overview\overview_layout.h" />
<CustomBuild Include="SourceFiles\profile\profile_widget.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing profile_widget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_widget.h" -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing profile_widget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_widget.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl_debug\Debug\include"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing profile_widget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_widget.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include"</Command>
</CustomBuild>
<CustomBuild Include="SourceFiles\profile\profile_inner_widget.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing profile_inner_widget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_inner_widget.h" -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing profile_inner_widget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_inner_widget.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl_debug\Debug\include"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing profile_inner_widget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_inner_widget.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include"</Command>
</CustomBuild>
<CustomBuild Include="SourceFiles\profile\profile_cover.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing profile_cover.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_cover.h" -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing profile_cover.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_cover.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl_debug\Debug\include"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing profile_cover.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/profile/profile_cover.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include"</Command>
</CustomBuild>
<ClInclude Include="SourceFiles\serialize\serialize_common.h" />
<ClInclude Include="SourceFiles\serialize\serialize_document.h" />
<ClInclude Include="SourceFiles\shortcuts.h" />
@ -1537,6 +1621,7 @@
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore\5.6.0\QtCore" "-I$(QTDIR)\include\QtGui\5.6.0\QtGui" "-I.\..\..\Libraries\breakpad\src" "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\minizip" "-I.\..\..\Libraries\openssl\Release\include" "-fstdafx.h" "-f../../SourceFiles/ui/twidget.h"</Command>
</CustomBuild>
<ClInclude Include="SourceFiles\ui\slide_animation.h" />
<ClInclude Include="SourceFiles\ui\style\style_core.h" />
<ClInclude Include="SourceFiles\ui\style\style_core_color.h" />
<ClInclude Include="SourceFiles\ui\style\style_core_font.h" />
@ -2391,6 +2476,7 @@
<CodegenStyleItem Include="Resources\basic.style" />
<CodegenStyleItem Include="Resources\basic_types.style" />
<CodegenStyleItem Include="SourceFiles\overview\overview.style" />
<CodegenStyleItem Include="SourceFiles\profile\profile.style" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Resources\winrc\Telegram.rc" />

View File

@ -91,6 +91,9 @@
<Filter Include="Resources\winrc">
<UniqueIdentifier>{6b33ddc0-a7e2-4961-81dc-e1b5de2e2c60}</UniqueIdentifier>
</Filter>
<Filter Include="SourceFiles\profile">
<UniqueIdentifier>{b761f2a4-0e8c-4e52-b179-7a3185c046c4}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="SourceFiles\main.cpp">
@ -1104,6 +1107,48 @@
<ClCompile Include="SourceFiles\ui\style\style_core_icon.cpp">
<Filter>SourceFiles\ui\style</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\profile\profile_widget.cpp">
<Filter>SourceFiles\profile</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_profile_widget.cpp">
<Filter>GeneratedFiles\Deploy</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_profile_widget.cpp">
<Filter>GeneratedFiles\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_profile_widget.cpp">
<Filter>GeneratedFiles\Release</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\ui\slide_animation.cpp">
<Filter>SourceFiles\ui</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_profile_inner_widget.cpp">
<Filter>GeneratedFiles\Deploy</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_profile_inner_widget.cpp">
<Filter>GeneratedFiles\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_profile_inner_widget.cpp">
<Filter>GeneratedFiles\Release</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\profile\profile_inner_widget.cpp">
<Filter>SourceFiles\profile</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\styles\style_profile.cpp">
<Filter>GeneratedFiles\styles</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\profile\profile_cover.cpp">
<Filter>SourceFiles\profile</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_profile_cover.cpp">
<Filter>GeneratedFiles\Deploy</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_profile_cover.cpp">
<Filter>GeneratedFiles\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_profile_cover.cpp">
<Filter>GeneratedFiles\Release</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="SourceFiles\stdafx.h">
@ -1277,6 +1322,12 @@
<ClInclude Include="Resources\winrc\resource.h">
<Filter>Resources\winrc</Filter>
</ClInclude>
<ClInclude Include="SourceFiles\ui\slide_animation.h">
<Filter>SourceFiles\ui</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\styles\style_profile.h">
<Filter>GeneratedFiles\styles</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="SourceFiles\application.h">
@ -1516,6 +1567,15 @@
<CustomBuild Include="Resources\langs\lang.strings">
<Filter>Resources\langs</Filter>
</CustomBuild>
<CustomBuild Include="SourceFiles\profile\profile_widget.h">
<Filter>SourceFiles\profile</Filter>
</CustomBuild>
<CustomBuild Include="SourceFiles\profile\profile_inner_widget.h">
<Filter>SourceFiles\profile</Filter>
</CustomBuild>
<CustomBuild Include="SourceFiles\profile\profile_cover.h">
<Filter>SourceFiles\profile</Filter>
</CustomBuild>
</ItemGroup>
<ItemGroup>
<None Include="Resources\langs\lang_it.strings">
@ -1585,6 +1645,9 @@
<CodegenStyleItem Include="SourceFiles\overview\overview.style">
<Filter>SourceFiles\overview</Filter>
</CodegenStyleItem>
<CodegenStyleItem Include="SourceFiles\profile\profile.style">
<Filter>SourceFiles\profile</Filter>
</CodegenStyleItem>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Resources\winrc\Telegram.rc">