Started video player UI in MediaView.

This commit is contained in:
John Preston 2016-07-11 21:05:46 +03:00
parent 41cd427834
commit 356b48bcca
35 changed files with 1407 additions and 41 deletions

View file

@ -449,3 +449,17 @@ OutlineButton {
font: font;
padding: margins;
}
IconButton {
width: pixels;
height: pixels;
opacity: double;
overOpacity: double;
icon: icon;
iconPosition: point;
downIconPosition: point;
duration: int;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

View file

@ -533,6 +533,12 @@ namespace Sandbox {
}
}
void removeEventFilter(QObject *filter) {
if (Application *a = application()) {
a->removeEventFilter(filter);
}
}
void execExternal(const QString &cmd) {
DEBUG_LOG(("Application Info: executing external command '%1'").arg(cmd));
if (cmd == "show") {

View file

@ -114,6 +114,7 @@ namespace Sandbox {
bool isSavingSession();
void installEventFilter(QObject *filter);
void removeEventFilter(QObject *filter);
void execExternal(const QString &cmd);

View file

@ -327,8 +327,11 @@ bool Generator::writeHeaderStyleNamespace() {
header_->stream() << "void init_" << baseName_ << "();\n\n";
header_->popNamespace();
}
bool wroteForwardDeclarations = writeStructsForwardDeclarations();
if (module_.hasStructs()) {
header_->newline();
if (!wroteForwardDeclarations) {
header_->newline();
}
if (!writeStructsDefinitions()) {
return false;
}
@ -338,6 +341,32 @@ bool Generator::writeHeaderStyleNamespace() {
return true;
}
bool Generator::writeStructsForwardDeclarations() {
bool hasNoExternalStructs = module_.enumVariables([this](const Variable &value) -> bool {
if (value.value.type().tag == structure::TypeTag::Struct) {
if (!module_.findStructInModule(value.value.type().name, module_)) {
return false;
}
}
return true;
});
if (hasNoExternalStructs) {
return false;
}
header_->newline();
bool result = module_.enumVariables([this](const Variable &value) -> bool {
if (value.value.type().tag == structure::TypeTag::Struct) {
if (!module_.findStructInModule(value.value.type().name, module_)) {
header_->stream() << "struct " << value.value.type().name.back() << ";\n";
}
}
return true;
});
header_->newline();
return result;
}
bool Generator::writeStructsDefinitions() {
if (!module_.hasStructs()) {
return true;

View file

@ -47,6 +47,7 @@ private:
QString valueAssignmentCode(structure::Value value) const;
bool writeHeaderStyleNamespace();
bool writeStructsForwardDeclarations();
bool writeStructsDefinitions();
bool writeRefsDeclarations();

View file

@ -94,6 +94,9 @@ public:
return !fullpath_.isEmpty();
}
const Struct *findStructInModule(const FullName &name, const Module &module) const;
const Variable *findVariableInModule(const FullName &name, const Module &module) const;
private:
QString fullpath_;
std::vector<std::unique_ptr<Module>> included_;
@ -102,9 +105,6 @@ private:
QMap<QString, int> structsByName_;
QMap<QString, int> variablesByName_;
const Struct *findStructInModule(const FullName &name, const Module &module) const;
const Variable *findVariableInModule(const FullName &name, const Module &module) const;
};
} // namespace structure

View file

@ -0,0 +1,116 @@
/*
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 "media/view/media_clip_controller.h"
#include "media/view/media_clip_playback.h"
#include "media/view/media_clip_volume_controller.h"
#include "styles/style_mediaview.h"
#include "ui/widgets/label_simple.h"
#include "ui/effects/fade_animation.h"
#include "ui/buttons/icon_button.h"
#include "media/media_audio.h"
namespace Media {
namespace Clip {
Controller::Controller(QWidget *parent) : TWidget(parent)
, _playPauseResume(this, st::mediaviewPlayButton)
, _playback(this)
, _volumeController(this)
, _fullScreenToggle(this, st::mediaviewFullScreenButton)
, _playedAlready(this, st::mediaviewPlayProgressLabel)
, _toPlayLeft(this, st::mediaviewPlayProgressLabel)
, _fadeAnimation(std_::make_unique<Ui::FadeAnimation>(this)) {
_fadeAnimation->show();
connect(_playPauseResume, SIGNAL(clicked()), this, SIGNAL(playPressed()));
connect(_fullScreenToggle, SIGNAL(clicked()), this, SIGNAL(toFullScreenPressed()));
connect(_playback, SIGNAL(seekProgress(int64)), this, SLOT(onSeekProgress(int64)));
connect(_playback, SIGNAL(seekFinished(int64)), this, SLOT(onSeekFinished(int64)));
connect(_volumeController, SIGNAL(volumeChanged(float64)), this, SIGNAL(volumeChanged(float64)));
}
void Controller::onSeekProgress(int64 position) {
_seekPosition = position;
emit seekProgress(position);
}
void Controller::onSeekFinished(int64 position) {
_seekPosition = -1;
emit seekFinished(position);
}
void Controller::showAnimated() {
_fadeAnimation->fadeIn(st::mvShowDuration);
}
void Controller::hideAnimated() {
_fadeAnimation->fadeOut(st::mvHideDuration);
}
void Controller::updatePlayback(const AudioPlaybackState &playbackState) {
bool showPause = (playbackState.state == AudioPlayerPlaying || playbackState.state == AudioPlayerResuming);
if (showPause != _showPause) {
disconnect(_playPauseResume, SIGNAL(clicked()), this, _showPause ? SIGNAL(pausePressed()) : SIGNAL(playPressed()));
_showPause = showPause;
connect(_playPauseResume, SIGNAL(clicked()), this, _showPause ? SIGNAL(pausePressed()) : SIGNAL(playPressed()));
_playPauseResume->setIcon(_showPause ? &st::mediaviewPauseIcon : nullptr);
}
_playback->updateState(playbackState);
}
void Controller::setInFullScreen(bool inFullScreen) {
_fullScreenToggle->setIcon(inFullScreen ? &st::mediaviewFullScreenOutIcon : nullptr);
disconnect(_fullScreenToggle, SIGNAL(clicked()), this, SIGNAL(toFullScreenPressed()));
disconnect(_fullScreenToggle, SIGNAL(clicked()), this, SIGNAL(fromFullScreenPressed()));
auto handler = inFullScreen ? SIGNAL(fromFullScreenPressed()) : SIGNAL(toFullScreenPressed());
connect(_fullScreenToggle, SIGNAL(clicked()), this, handler);
}
void Controller::resizeEvent(QResizeEvent *e) {
int playTop = (height() - _playPauseResume->height()) / 2;
_playPauseResume->moveToLeft(playTop, playTop);
_playedAlready->moveToLeft(playTop + _playPauseResume->width() + playTop, 0);
int fullScreenTop = (height() - _fullScreenToggle->height()) / 2;
_fullScreenToggle->moveToRight(fullScreenTop, fullScreenTop);
_toPlayLeft->moveToRight(fullScreenTop + _fullScreenToggle->width() + fullScreenTop, 0);
_volumeController->moveToRight(fullScreenTop + _fullScreenToggle->width() + fullScreenTop, (height() - _volumeController->height()) / 2);
_playback->resize(width() - playTop - _playPauseResume->width() - playTop - fullScreenTop - _volumeController->width() - fullScreenTop - _fullScreenToggle->width() - fullScreenTop, _volumeController->height());
_playback->moveToLeft(playTop + _playPauseResume->width() + playTop, (height() - _playback->height()) / 2);
}
void Controller::paintEvent(QPaintEvent *e) {
Painter p(this);
if (_fadeAnimation->paint(p)) {
return;
}
App::roundRect(p, rect(), st::medviewSaveMsg, MediaviewSaveCorners);
}
} // namespace Clip
} // namespace Media

View file

@ -0,0 +1,82 @@
/*
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 Ui {
class LabelSimple;
class FadeAnimation;
class IconButton;
} // namespace Ui
struct AudioPlaybackState;
namespace Media {
namespace Clip {
class Playback;
class VolumeController;
class Controller : public TWidget {
Q_OBJECT
public:
Controller(QWidget *parent);
void showAnimated();
void hideAnimated();
void updatePlayback(const AudioPlaybackState &playbackState);
void setInFullScreen(bool inFullScreen);
signals:
void playPressed();
void pausePressed();
void seekProgress(int64 position);
void seekFinished(int64 position);
void volumeChanged(float64 volume);
void toFullScreenPressed();
void fromFullScreenPressed();
private slots:
void onSeekProgress(int64 position);
void onSeekFinished(int64 position);
protected:
void resizeEvent(QResizeEvent *e) override;
void paintEvent(QPaintEvent *e) override;
private:
bool _showPause = false;
int64 _seekPosition = -1;
ChildWidget<Ui::IconButton> _playPauseResume;
ChildWidget<Playback> _playback;
ChildWidget<VolumeController> _volumeController;
ChildWidget<Ui::IconButton> _fullScreenToggle;
ChildWidget<Ui::LabelSimple> _playedAlready;
ChildWidget<Ui::LabelSimple> _toPlayLeft;
std_::unique_ptr<Ui::FadeAnimation> _fadeAnimation;
};
} // namespace Clip
} // namespace Media

View file

@ -0,0 +1,131 @@
/*
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 "media/view/media_clip_playback.h"
#include "styles/style_mediaview.h"
#include "media/media_audio.h"
namespace Media {
namespace Clip {
Playback::Playback(QWidget *parent) : TWidget(parent)
, _a_progress(animation(this, &Playback::step_progress)) {
setCursor(style::cur_pointer);
}
void Playback::updateState(const AudioPlaybackState &playbackState) {
qint64 position = 0, duration = playbackState.duration;
if (!(playbackState.state & AudioPlayerStoppedMask) && playbackState.state != AudioPlayerFinishing) {
position = playbackState.position;
} else if (playbackState.state == AudioPlayerStoppedAtEnd) {
position = playbackState.duration;
} else {
position = 0;
}
float64 progress = 0.;
if (duration) {
progress = duration ? snap(float64(position) / duration, 0., 1.) : 0.;
}
if (duration != _duration || position != _position) {
if (duration && _duration) {
a_progress.start(progress);
_a_progress.start();
} else {
a_progress = anim::fvalue(progress, progress);
_a_progress.stop();
}
_position = position;
_duration = duration;
}
}
void Playback::step_progress(float64 ms, bool timer) {
float64 dt = ms / (2 * AudioVoiceMsgUpdateView);
if (_duration && dt >= 1) {
_a_progress.stop();
a_progress.finish();
} else {
a_progress.update(qMin(dt, 1.), anim::linear);
}
if (timer) update();
}
void Playback::paintEvent(QPaintEvent *e) {
Painter p(this);
int radius = st::mediaviewPlaybackWidth / 2;
p.setPen(Qt::NoPen);
p.setRenderHint(QPainter::HighQualityAntialiasing);
auto over = _a_over.current(getms(), _over ? 1. : 0.);
int skip = (st::mediaviewSeekSize.width() / 2);
int length = (width() - st::mediaviewSeekSize.width());
float64 prg = _mouseDown ? _downProgress : a_progress.current();
int32 from = skip, mid = qRound(from + prg * length), end = from + length;
if (mid > from) {
p.setClipRect(0, 0, mid, height());
p.setOpacity(over * st::mediaviewActiveOpacity + (1. - over) * st::mediaviewInactiveOpacity);
p.setBrush(st::mediaviewPlaybackActive);
p.drawRoundedRect(0, (height() - st::mediaviewPlaybackWidth) / 2, mid + radius, st::mediaviewPlaybackWidth, radius, radius);
}
if (end > mid) {
p.setClipRect(mid, 0, width() - mid, height());
p.setOpacity(1.);
p.setBrush(st::mediaviewPlaybackInactive);
p.drawRoundedRect(mid - radius, (height() - st::mediaviewPlaybackWidth) / 2, width() - (mid - radius), st::mediaviewPlaybackWidth, radius, radius);
}
int x = mid - skip;
p.setClipRect(rect());
p.setOpacity(over * st::mediaviewActiveOpacity + (1. - over) * st::mediaviewInactiveOpacity);
p.setBrush(st::mediaviewPlaybackActive);
p.drawRoundedRect(x, (height() - st::mediaviewSeekSize.height()) / 2, st::mediaviewSeekSize.width(), st::mediaviewSeekSize.height(), st::mediaviewSeekSize.width() / 2, st::mediaviewSeekSize.width() / 2);
}
void Playback::mouseMoveEvent(QMouseEvent *e) {
}
void Playback::mousePressEvent(QMouseEvent *e) {
}
void Playback::mouseReleaseEvent(QMouseEvent *e) {
}
void Playback::enterEvent(QEvent *e) {
setOver(true);
}
void Playback::leaveEvent(QEvent *e) {
setOver(false);
}
void Playback::setOver(bool over) {
if (_over == over) return;
_over = over;
auto from = _over ? 0. : 1., to = _over ? 1. : 0.;
START_ANIMATION(_a_over, func(this, &Playback::updateCallback), from, to, st::mediaviewOverDuration, anim::linear);
}
} // namespace Clip
} // namespace Media

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
struct AudioPlaybackState;
namespace Media {
namespace Clip {
class Playback : public TWidget {
Q_OBJECT
public:
Playback(QWidget *parent);
void updateState(const AudioPlaybackState &playbackState);
signals:
void seekProgress(int64 position);
void seekFinished(int64 position);
protected:
void paintEvent(QPaintEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void enterEvent(QEvent *e) override;
void leaveEvent(QEvent *e) override;
private:
void step_progress(float64 ms, bool timer);
void updateCallback() {
update();
}
void setOver(bool over);
bool _over = false;
FloatAnimation _a_over;
int64 _position = 0;
int64 _duration = 0;
anim::fvalue a_progress = { 0., 0. };
Animation _a_progress;
bool _mouseDown = false;
float64 _downProgress = 0.;
};
} // namespace Clip
} // namespace Media

View file

@ -0,0 +1,85 @@
/*
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 "media/view/media_clip_volume_controller.h"
#include "styles/style_mediaview.h"
namespace Media {
namespace Clip {
VolumeController::VolumeController(QWidget *parent) : TWidget(parent) {
resize(st::mediaviewVolumeSize);
setCursor(style::cur_pointer);
}
void VolumeController::setVolume(float64 volume) {
_volume = volume;
update();
}
void VolumeController::paintEvent(QPaintEvent *e) {
Painter p(this);
int32 top = (height() - st::mediaviewVolumeIcon.height()) / 2;
int32 left = (width() - st::mediaviewVolumeIcon.width()) / 2;
int32 mid = left + qRound(st::mediaviewVolumeIcon.width() * _volume);
int32 right = left + st::mediaviewVolumeIcon.width();
if (mid > left) {
auto over = _a_over.current(getms(), _over ? 1. : 0.);
p.setOpacity(over * st::mediaviewActiveOpacity + (1. - over) * st::mediaviewInactiveOpacity);
p.setClipRect(rtlrect(left, top, mid - left, st::mediaviewVolumeIcon.height(), width()));
st::mediaviewVolumeOnIcon.paint(p, QPoint(left, top), width());
}
if (right > mid) {
p.setClipRect(rtlrect(mid, top, right - mid, st::mediaviewVolumeIcon.height(), width()));
st::mediaviewVolumeIcon.paint(p, QPoint(left, top), width());
}
}
void VolumeController::mouseMoveEvent(QMouseEvent *e) {
}
void VolumeController::mousePressEvent(QMouseEvent *e) {
}
void VolumeController::mouseReleaseEvent(QMouseEvent *e) {
}
void VolumeController::enterEvent(QEvent *e) {
setOver(true);
}
void VolumeController::leaveEvent(QEvent *e) {
setOver(false);
}
void VolumeController::setOver(bool over) {
if (_over == over) return;
_over = over;
auto from = _over ? 0. : 1., to = _over ? 1. : 0.;
START_ANIMATION(_a_over, func(this, &VolumeController::updateCallback), from, to, st::mediaviewOverDuration, anim::linear);
}
} // namespace Clip
} // namespace Media

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
*/
#pragma once
namespace Media {
namespace Clip {
class VolumeController : public TWidget {
Q_OBJECT
public:
VolumeController(QWidget *parent);
void setVolume(float64 volume);
signals:
void volumeChanged(float64 volume);
protected:
void paintEvent(QPaintEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void enterEvent(QEvent *e) override;
void leaveEvent(QEvent *e) override;
private:
void updateCallback() {
update();
}
void setOver(bool over);
float64 _volume = 0.;
bool _over = false;
FloatAnimation _a_over;
};
} // namespace Clip
} // namespace Media

View file

@ -0,0 +1,74 @@
/*
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";
using "ui/widgets/widgets.style";
mediaviewActiveOpacity: 1.;
mediaviewInactiveOpacity: 0.78;
mediaviewOverDuration: 150;
mediaviewControllerSize: size(600px, 50px);
mediaviewPlayProgressLabel: LabelSimple(defaultLabelSimple) {
textFg: #ffffffc7;
}
mediaviewPlayButton: IconButton {
width: 25px;
height: 24px;
opacity: mediaviewInactiveOpacity;
overOpacity: mediaviewActiveOpacity;
icon: icon {
{ "media_play", #ffffff, point(0px, 0px) },
};
iconPosition: point(3px, 1px);
downIconPosition: point(3px, 1px);
duration: mediaviewOverDuration;
}
mediaviewPauseIcon: icon {
{ "media_pause", #ffffff, point(1px, 1px) }
};
mediaviewFullScreenButton: IconButton(mediaviewPlayButton) {
icon: icon {
{ "media_fullscreen_to", #ffffff, point(0px, 0px) },
};
iconPosition: point(0px, 0px);
downIconPosition: point(0px, 0px);
}
mediaviewFullScreenOutIcon: icon {
{ "media_fullscreen_from", #ffffff, point(0px, 0px) },
};
mediaviewPlaybackActive: #ffffff;
mediaviewPlaybackInactive: #474747;
mediaviewPlaybackWidth: 3px;
mediaviewSeekSize: size(2px, 13px);
mediaviewVolumeSize: size(44px, 12px);
mediaviewVolumeIcon: icon {
{ "media_volume", mediaviewPlaybackInactive, point(0px, 0px) },
};
mediaviewVolumeOnIcon: icon {
{ "media_volume", mediaviewPlaybackActive, point(0px, 0px) },
};

View file

@ -27,6 +27,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "application.h"
#include "ui/filedialog.h"
#include "media/media_clip_reader.h"
#include "media/view/media_clip_controller.h"
#include "styles/style_mediaview.h"
namespace {
@ -228,8 +230,9 @@ bool MediaView::gifShown() const {
}
void MediaView::stopGif() {
delete _gif;
_gif = nullptr;
_clipController.destroy();
Sandbox::removeEventFilter(this);
}
void MediaView::documentUpdated(DocumentData *doc) {
@ -364,6 +367,7 @@ void MediaView::updateControls() {
} else {
_leftNavVisible = _rightNavVisible = false;
}
if (!_caption.isEmpty()) {
int32 skipw = qMax(_dateNav.left() + _dateNav.width(), _headerNav.left() + _headerNav.width());
int32 maxw = qMin(qMax(width() - 2 * skipw - st::mvCaptionPadding.left() - st::mvCaptionPadding.right() - 2 * st::mvCaptionMargin.width(), int(st::msgMinWidth)), _caption.maxWidth());
@ -372,6 +376,9 @@ void MediaView::updateControls() {
} else {
_captionRect = QRect();
}
if (_clipController) {
setClipControllerGeometry();
}
updateOver(mapFromGlobal(QCursor::pos()));
update();
}
@ -519,7 +526,6 @@ void MediaView::clearData() {
}
MediaView::~MediaView() {
deleteAndMark(_gif);
deleteAndMark(_menu);
}
@ -551,6 +557,9 @@ void MediaView::activateControls() {
a_cOpacity.start(1);
if (!_a_state.animating()) _a_state.start();
}
if (_clipController) {
_clipController->showAnimated();
}
}
void MediaView::onHideControls(bool force) {
@ -560,6 +569,9 @@ void MediaView::onHideControls(bool force) {
_controlsAnimStarted = getms();
a_cOpacity.start(0);
if (!_a_state.animating()) _a_state.start();
if (_clipController) {
_clipController->hideAnimated();
}
}
void MediaView::onDropdownHiding() {
@ -1072,24 +1084,11 @@ void MediaView::displayDocument(DocumentData *doc, HistoryItem *item) { // empty
} else {
_doc->automaticLoad(item);
const FileLocation &location(_doc->location(true));
if (!_doc->data().isEmpty() && (_doc->isAnimation() || _doc->isVideo())) {
if (!_gif) {
if (_doc->dimensions.width() && _doc->dimensions.height()) {
_current = _doc->thumb->pixNoCache(_doc->dimensions.width(), _doc->dimensions.height(), ImagePixSmooth | ImagePixBlurred, _doc->dimensions.width(), _doc->dimensions.height());
}
_gif = new Media::Clip::Reader(location, _doc->data(), func(this, &MediaView::clipCallback));
}
} else if (location.accessEnable()) {
if (_doc->isAnimation() || _doc->isVideo()) {
if (!_gif) {
if (_doc->dimensions.width() && _doc->dimensions.height()) {
_current = _doc->thumb->pixNoCache(_doc->dimensions.width(), _doc->dimensions.height(), ImagePixSmooth | ImagePixBlurred, _doc->dimensions.width(), _doc->dimensions.height());
}
auto mode = _doc->isVideo() ? Media::Clip::Reader::Mode::Video : Media::Clip::Reader::Mode::Gif;
_gif = new Media::Clip::Reader(location, _doc->data(), func(this, &MediaView::clipCallback), mode);
}
} else {
if (_doc->isAnimation() || _doc->isVideo()) {
initAnimation();
} else {
const FileLocation &location(_doc->location(true));
if (location.accessEnable()) {
if (QImageReader(location.name()).canRead()) {
_current = QPixmap::fromImage(App::readImage(location.name(), 0, false), Qt::ColorOnly);
}
@ -1202,6 +1201,94 @@ void MediaView::displayDocument(DocumentData *doc, HistoryItem *item) { // empty
}
}
void MediaView::initAnimation() {
t_assert(_doc != nullptr);
t_assert(_doc->isAnimation() || _doc->isVideo());
auto &location = _doc->location(true);
if (!_doc->data().isEmpty()) {
createClipReader();
} else if (location.accessEnable()) {
createClipReader();
location.accessDisable();
}
}
void MediaView::createClipReader() {
if (_gif) return;
t_assert(_doc != nullptr);
t_assert(_doc->isAnimation() || _doc->isVideo());
if (_doc->dimensions.width() && _doc->dimensions.height()) {
_current = _doc->thumb->pixNoCache(_doc->dimensions.width(), _doc->dimensions.height(), ImagePixSmooth | ImagePixBlurred, _doc->dimensions.width(), _doc->dimensions.height());
}
auto mode = _doc->isVideo() ? Media::Clip::Reader::Mode::Video : Media::Clip::Reader::Mode::Gif;
_gif = std_::make_unique<Media::Clip::Reader>(_doc->location(), _doc->data(), func(this, &MediaView::clipCallback), mode);
createClipController();
}
void MediaView::createClipController() {
if (!_doc->isVideo()) return;
_clipController.destroy();
_clipController = new Media::Clip::Controller(this);
setClipControllerGeometry();
_clipController->show();
connect(_clipController, SIGNAL(playPressed()), this, SLOT(onVideoPlay()));
connect(_clipController, SIGNAL(pausePressed()), this, SLOT(onVideoPause()));
connect(_clipController, SIGNAL(seekProgress(int64)), this, SLOT(onVideoSeekProgress(int64)));
connect(_clipController, SIGNAL(seekFinished(int64)), this, SLOT(onVideoSeekFinished(int64)));
connect(_clipController, SIGNAL(volumeChanged(float64)), this, SLOT(onVideoVolumeChanged(float64)));
connect(_clipController, SIGNAL(toFullScreenPressed()), this, SLOT(onVideoToFullScreen()));
connect(_clipController, SIGNAL(fromFullScreenPressed()), this, SLOT(onVideoFromFullScreen()));
Sandbox::removeEventFilter(this);
Sandbox::installEventFilter(this);
}
void MediaView::setClipControllerGeometry() {
t_assert(_clipController != nullptr);
int controllerBottom = _captionRect.isEmpty() ? height() : _captionRect.y();
_clipController->setGeometry(
(width() - _clipController->width()) / 2,
controllerBottom - _clipController->height() - st::mvCaptionPadding.bottom() - st::mvCaptionMargin.height(),
st::mediaviewControllerSize.width(),
st::mediaviewControllerSize.height());
myEnsureResized(_clipController);
}
void MediaView::onVideoPlay() {
}
void MediaView::onVideoPause() {
}
void MediaView::onVideoSeekProgress(int64 position) {
}
void MediaView::onVideoSeekFinished(int64 position) {
}
void MediaView::onVideoVolumeChanged(float64 volume) {
}
void MediaView::onVideoToFullScreen() {
}
void MediaView::onVideoFromFullScreen() {
}
void MediaView::paintEvent(QPaintEvent *e) {
QRect r(e->rect());
QRegion region(e->region());
@ -1833,9 +1920,6 @@ void MediaView::snapXY() {
}
void MediaView::mouseMoveEvent(QMouseEvent *e) {
bool moved = (e->pos() != _lastMouseMovePos);
_lastMouseMovePos = e->pos();
updateOver(e->pos());
if (_lastAction.x() >= 0 && (e->pos() - _lastAction).manhattanLength() >= st::mvDeltaFromLastAction) {
_lastAction = QPoint(-st::mvDeltaFromLastAction, -st::mvDeltaFromLastAction);
@ -1858,7 +1942,6 @@ void MediaView::mouseMoveEvent(QMouseEvent *e) {
update();
}
}
if (moved) activateControls();
}
void MediaView::updateOverRect(OverState state) {
@ -2105,6 +2188,18 @@ bool MediaView::event(QEvent *e) {
return QWidget::event(e);
}
bool MediaView::eventFilter(QObject *obj, QEvent *e) {
if (e->type() == QEvent::MouseMove && obj->isWidgetType()) {
if (isAncestorOf(static_cast<QWidget*>(obj))) {
auto mousePosition = mapFromGlobal(static_cast<QMouseEvent*>(e)->globalPos());
bool moved = (mousePosition != _lastMouseMovePos);
_lastMouseMovePos = mousePosition;
if (moved) activateControls();
}
}
return TWidget::eventFilter(obj, e);
}
void MediaView::hide() {
_controlsHideTimer.stop();
_controlsState = ControlsShown;

View file

@ -22,23 +22,18 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "dropdown.h"
namespace Media {
namespace Clip {
class Controller;
} // namespace Clip
} // namespace Media
class MediaView : public TWidget, public RPCSender, public ClickHandlerHost {
Q_OBJECT
public:
MediaView();
void paintEvent(QPaintEvent *e) override;
void keyPressEvent(QKeyEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void contextMenuEvent(QContextMenuEvent *e) override;
void touchEvent(QTouchEvent *e);
bool event(QEvent *e) override;
void hide();
void updateOver(QPoint mpos);
@ -106,12 +101,40 @@ public slots:
void updateImage();
protected:
void paintEvent(QPaintEvent *e) override;
void keyPressEvent(QKeyEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void contextMenuEvent(QContextMenuEvent *e) override;
void touchEvent(QTouchEvent *e);
bool event(QEvent *e) override;
bool eventFilter(QObject *obj, QEvent *e) override;
private slots:
void onVideoPlay();
void onVideoPause();
void onVideoSeekProgress(int64 position);
void onVideoSeekFinished(int64 position);
void onVideoVolumeChanged(float64 volume);
void onVideoToFullScreen();
void onVideoFromFullScreen();
private:
void displayPhoto(PhotoData *photo, HistoryItem *item);
void displayDocument(DocumentData *doc, HistoryItem *item);
void findCurrent();
void loadBack();
void createClipController();
void setClipControllerGeometry();
void initAnimation();
void createClipReader();
// Radial animation interface.
float64 radialProgress() const;
bool radialLoading() const;
@ -154,6 +177,8 @@ private:
QString _dateText;
QString _headerText;
ChildWidget<Media::Clip::Controller> _clipController = { nullptr };
Text _caption;
QRect _captionRect;
@ -168,7 +193,7 @@ private:
bool _pressed = false;
int32 _dragging = 0;
QPixmap _current;
Media::Clip::Reader *_gif = nullptr;
std_::unique_ptr<Media::Clip::Reader> _gif;
int32 _full = -1; // -1 - thumb, 0 - medium, 1 - full
bool fileShown() const;

View file

@ -486,7 +486,6 @@ using FloatAnimation = SimpleAnimation<anim::fvalue>;
using IntAnimation = SimpleAnimation<anim::ivalue>;
using ColorAnimation = SimpleAnimation<anim::cvalue>;
// Macro allows us to lazily create updateCallback.
#define ENSURE_ANIMATION(animation, updateCallback, from) \
if ((animation).isNull()) { \

View file

@ -0,0 +1,56 @@
/*
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/buttons/icon_button.h"
namespace Ui {
IconButton::IconButton(QWidget *parent, const style::IconButton &st) : Button(parent)
, _st(st) {
resize(_st.width, _st.height);
setCursor(style::cur_pointer);
}
void IconButton::setIcon(const style::icon *icon) {
_iconOverride = icon;
update();
}
void IconButton::paintEvent(QPaintEvent *e) {
Painter p(this);
auto over = _a_over.current(getms(), (_state & StateOver) ? 1. : 0.);
p.setOpacity(over * _st.overOpacity + (1. - over) * _st.opacity);
auto position = (_state & StateDown) ? _st.downIconPosition : _st.iconPosition;
(_iconOverride ? _iconOverride : &_st.icon)->paint(p, position, width());
}
void IconButton::onStateChanged(int oldState, ButtonStateChangeSource source) {
auto over = (_state & StateOver);
if (over != (oldState & StateOver)) {
auto from = over ? 0. : 1.;
auto to = over ? 1. : 0.;
START_ANIMATION(_a_over, func(this, &IconButton::updateCallback), from, to, _st.duration, anim::linear);
}
}
} // namespace Ui

View file

@ -0,0 +1,51 @@
/*
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/button.h"
namespace Ui {
class IconButton : public Button {
public:
IconButton(QWidget *parent, const style::IconButton &st);
// Pass nullptr to restore the default icon.
void setIcon(const style::icon *icon);
protected:
void paintEvent(QPaintEvent *e) override;
void onStateChanged(int oldState, ButtonStateChangeSource source) override;
private:
void updateCallback() {
update();
}
const style::IconButton &_st;
const style::icon *_iconOverride = nullptr;
FloatAnimation _a_over;
};
} // namespace Ui

View file

@ -0,0 +1,99 @@
/*
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/effects/fade_animation.h"
namespace Ui {
FadeAnimation::FadeAnimation(TWidget *widget) : _widget(widget) {
}
bool FadeAnimation::paint(Painter &p) {
if (_cache.isNull()) return false;
bool animating = _animation.animating(getms());
p.setOpacity(_animation.current(_visible ? 1. : 0.));
p.drawPixmap(0, 0, _cache);
if (!animating) {
stopAnimation();
}
return true;
}
void FadeAnimation::setFinishedCallback(FinishedCallback &&callback) {
_finishedCallback = std_::move(callback);
}
void FadeAnimation::show() {
_visible = true;
stopAnimation();
}
void FadeAnimation::hide() {
_visible = false;
stopAnimation();
}
void FadeAnimation::stopAnimation() {
_animation.finish();
if (!_cache.isNull()) {
_cache = QPixmap();
updateCallback();
_widget->showChildren();
_finishedCallback.call();
}
if (_visible == _widget->isHidden()) {
_widget->setVisible(_visible);
}
}
void FadeAnimation::fadeIn(int duration) {
if (_visible) return;
_visible = true;
startAnimation(duration);
}
void FadeAnimation::fadeOut(int duration) {
if (!_visible) return;
_visible = false;
startAnimation(duration);
}
void FadeAnimation::startAnimation(int duration) {
if (_cache.isNull()) {
_cache = myGrab(_widget);
_widget->hideChildren();
}
START_ANIMATION(_animation, func(this, &FadeAnimation::updateCallback), _visible ? 0. : 1., _visible ? 1. : 0., duration, anim::linear);
updateCallback();
if (_widget->isHidden()) {
_widget->show();
}
}
void FadeAnimation::updateCallback() {
_widget->update();
}
} // namespace Ui

View file

@ -0,0 +1,57 @@
/*
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
class TWidget;
namespace Ui {
class FadeAnimation {
public:
FadeAnimation(TWidget *widget);
bool paint(Painter &p);
using FinishedCallback = Function<void>;
void setFinishedCallback(FinishedCallback &&callback);
void show();
void hide();
void fadeIn(int duration);
void fadeOut(int duration);
private:
void startAnimation(int duration);
void stopAnimation();
void updateCallback();
TWidget *_widget;
FloatAnimation _animation;
QPixmap _cache;
bool _visible = false;
FinishedCallback _finishedCallback;
};
} // namespace Ui

View file

@ -0,0 +1,52 @@
/*
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/widgets/label_simple.h"
namespace Ui {
LabelSimple::LabelSimple(QWidget *parent, const style::LabelSimple &st, const QString &value) : TWidget(parent)
, _st(st) {
setText(value);
}
void LabelSimple::setText(const QString &value) {
_fullText = value;
_fullTextWidth = _st.font->width(_fullText);
if (!_st.maxWidth || _fullTextWidth <= _st.maxWidth) {
_text = _fullText;
_textWidth = _fullTextWidth;
} else {
_text = _st.font->elided(_fullText, _st.maxWidth);
_textWidth = _st.font->width(_text);
}
resize(_textWidth, _st.font->height);
}
void LabelSimple::paintEvent(QPaintEvent *e) {
Painter p(this);
p.setFont(_st.font);
p.setPen(_st.textFg);
p.drawTextLeft(0, 0, width(), _text, _textWidth);
}
} // namespace Ui

View file

@ -0,0 +1,48 @@
/*
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 "styles/style_widgets.h"
namespace Ui {
class LabelSimple : public TWidget {
public:
LabelSimple(QWidget *parent, const style::LabelSimple &st = st::defaultLabelSimple, const QString &value = QString());
// This method also resizes the label.
void setText(const QString &newText);
protected:
void paintEvent(QPaintEvent *e) override;
private:
QString _fullText;
int _fullTextWidth;
QString _text;
int _textWidth;
const style::LabelSimple &_st;
};
} // namespace Ui

View file

@ -0,0 +1,34 @@
/*
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";
LabelSimple {
font: font;
maxWidth: pixels;
textFg: color;
}
defaultLabelSimple: LabelSimple {
font: normalFont;
maxWidth: 0px;
textFg: windowTextFg;
}

View file

@ -375,10 +375,22 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_media_clip_controller.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_media_clip_playback.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_media_clip_reader.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_media_clip_volume_controller.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_overviewwidget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@ -713,10 +725,22 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_media_clip_controller.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_media_clip_playback.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_media_clip_reader.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_media_clip_volume_controller.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_overviewwidget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@ -1082,10 +1106,22 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_media_clip_controller.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_media_clip_playback.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_media_clip_reader.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_media_clip_volume_controller.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_overviewwidget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
@ -1211,8 +1247,10 @@
<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_mediaview.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_overview.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_profile.cpp" />
<ClCompile Include="GeneratedFiles\styles\style_widgets.cpp" />
<ClCompile Include="SourceFiles\apiwrap.cpp" />
<ClCompile Include="SourceFiles\app.cpp" />
<ClCompile Include="SourceFiles\application.cpp" />
@ -1282,6 +1320,9 @@
<ClCompile Include="SourceFiles\media\media_clip_implementation.cpp" />
<ClCompile Include="SourceFiles\media\media_clip_qtgif.cpp" />
<ClCompile Include="SourceFiles\media\media_clip_reader.cpp" />
<ClCompile Include="SourceFiles\media\view\media_clip_controller.cpp" />
<ClCompile Include="SourceFiles\media\view\media_clip_playback.cpp" />
<ClCompile Include="SourceFiles\media\view\media_clip_volume_controller.cpp" />
<ClCompile Include="SourceFiles\mtproto\auth_key.cpp" />
<ClCompile Include="SourceFiles\mtproto\connection.cpp" />
<ClCompile Include="SourceFiles\mtproto\connection_abstract.cpp" />
@ -1388,10 +1429,12 @@
<ClCompile Include="SourceFiles\ui\boxshadow.cpp" />
<ClCompile Include="SourceFiles\ui\button.cpp" />
<ClCompile Include="SourceFiles\ui\buttons\history_down_button.cpp" />
<ClCompile Include="SourceFiles\ui\buttons\icon_button.cpp" />
<ClCompile Include="SourceFiles\ui\buttons\left_outline_button.cpp" />
<ClCompile Include="SourceFiles\ui\buttons\peer_avatar_button.cpp" />
<ClCompile Include="SourceFiles\ui\buttons\round_button.cpp" />
<ClCompile Include="SourceFiles\ui\countryinput.cpp" />
<ClCompile Include="SourceFiles\ui\effects\fade_animation.cpp" />
<ClCompile Include="SourceFiles\ui\emoji_config.cpp" />
<ClCompile Include="SourceFiles\ui\filedialog.cpp" />
<ClCompile Include="SourceFiles\ui\flatbutton.cpp" />
@ -1416,6 +1459,7 @@
<ClCompile Include="SourceFiles\ui\toast\toast_widget.cpp" />
<ClCompile Include="SourceFiles\ui\twidget.cpp" />
<ClCompile Include="SourceFiles\mainwindow.cpp" />
<ClCompile Include="SourceFiles\ui\widgets\label_simple.cpp" />
<ClCompile Include="SourceFiles\window\main_window.cpp" />
<ClCompile Include="SourceFiles\window\section_widget.cpp" />
<ClCompile Include="SourceFiles\window\slide_animation.cpp" />
@ -1491,8 +1535,10 @@
<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_mediaview.h" />
<ClInclude Include="GeneratedFiles\styles\style_overview.h" />
<ClInclude Include="GeneratedFiles\styles\style_profile.h" />
<ClInclude Include="GeneratedFiles\styles\style_widgets.h" />
<ClInclude Include="Resources\winrc\resource.h" />
<CustomBuild Include="SourceFiles\boxes\report_box.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
@ -1588,6 +1634,48 @@
<ClInclude Include="SourceFiles\media\media_clip_ffmpeg.h" />
<ClInclude Include="SourceFiles\media\media_clip_implementation.h" />
<ClInclude Include="SourceFiles\media\media_clip_qtgif.h" />
<CustomBuild Include="SourceFiles\media\view\media_clip_controller.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing media_clip_controller.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/media/view/media_clip_controller.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 media_clip_controller.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/media/view/media_clip_controller.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 media_clip_controller.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/media/view/media_clip_controller.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\media\view\media_clip_playback.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing media_clip_playback.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/media/view/media_clip_playback.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 media_clip_playback.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/media/view/media_clip_playback.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 media_clip_playback.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/media/view/media_clip_playback.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\media\view\media_clip_volume_controller.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing media_clip_volume_controller.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/media/view/media_clip_volume_controller.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 media_clip_volume_controller.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/media/view/media_clip_volume_controller.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 media_clip_volume_controller.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/media/view/media_clip_volume_controller.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\mtproto\auth_key.h" />
<CustomBuild Include="SourceFiles\mtproto\connection.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
@ -1934,9 +2022,11 @@
<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/countryinput.h"</Command>
</CustomBuild>
<ClInclude Include="SourceFiles\ui\buttons\history_down_button.h" />
<ClInclude Include="SourceFiles\ui\buttons\icon_button.h" />
<ClInclude Include="SourceFiles\ui\buttons\left_outline_button.h" />
<ClInclude Include="SourceFiles\ui\buttons\peer_avatar_button.h" />
<ClInclude Include="SourceFiles\ui\buttons\round_button.h" />
<ClInclude Include="SourceFiles\ui\effects\fade_animation.h" />
<ClInclude Include="SourceFiles\ui\emoji_config.h" />
<ClInclude Include="SourceFiles\ui\filedialog.h" />
<CustomBuild Include="SourceFiles\ui\flatbutton.h">
@ -2119,6 +2209,7 @@
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/window/section_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\window\main_window.h" />
<CustomBuild Include="SourceFiles\ui\widgets\label_simple.h" />
<ClInclude Include="SourceFiles\window\section_memento.h" />
<ClInclude Include="SourceFiles\window\slide_animation.h" />
<ClInclude Include="ThirdParty\minizip\crypt.h" />
@ -2929,6 +3020,8 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</CodegenStyleItem>
<CodegenStyleItem Include="SourceFiles\media\view\mediaview.style" />
<CodegenStyleItem Include="SourceFiles\ui\widgets\widgets.style" />
<CustomBuild Include="Resources\basic.style">
<FileType>Document</FileType>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(SolutionDir)$(Platform)\codegen\$(Configuration)\codegen_style.exe" "-I.\Resources" "-I.\SourceFiles" "-o.\GeneratedFiles\styles" %(FullPath)</Command>

View file

@ -115,6 +115,15 @@
<Filter Include="SourceFiles\media">
<UniqueIdentifier>{a281888a-8b70-4e95-9b03-ebcb02837df4}</UniqueIdentifier>
</Filter>
<Filter Include="SourceFiles\ui\widgets">
<UniqueIdentifier>{1937d8d7-6dd1-4147-8afb-6f03daff4f0e}</UniqueIdentifier>
</Filter>
<Filter Include="SourceFiles\media\view">
<UniqueIdentifier>{59996402-fc66-481c-9a12-5619112c60a5}</UniqueIdentifier>
</Filter>
<Filter Include="SourceFiles\ui\effects">
<UniqueIdentifier>{4fdf499d-a1be-46ce-9f17-af007a72e915}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="SourceFiles\main.cpp">
@ -1389,6 +1398,57 @@
<ClCompile Include="SourceFiles\media\media_audio_loader.cpp">
<Filter>SourceFiles\media</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\ui\widgets\label_simple.cpp">
<Filter>SourceFiles\ui\widgets</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_media_clip_controller.cpp">
<Filter>GeneratedFiles\Deploy</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_media_clip_controller.cpp">
<Filter>GeneratedFiles\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_media_clip_controller.cpp">
<Filter>GeneratedFiles\Release</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\media\view\media_clip_controller.cpp">
<Filter>SourceFiles\media\view</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\styles\style_mediaview.cpp">
<Filter>GeneratedFiles\styles</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\styles\style_widgets.cpp">
<Filter>GeneratedFiles\styles</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\ui\effects\fade_animation.cpp">
<Filter>SourceFiles\ui\effects</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\ui\buttons\icon_button.cpp">
<Filter>SourceFiles\ui\buttons</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\media\view\media_clip_playback.cpp">
<Filter>SourceFiles\media\view</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_media_clip_playback.cpp">
<Filter>GeneratedFiles\Deploy</Filter>
</ClCompile>
<ClCompile Include="SourceFiles\media\view\media_clip_volume_controller.cpp">
<Filter>SourceFiles\media\view</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_media_clip_playback.cpp">
<Filter>GeneratedFiles\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_media_clip_playback.cpp">
<Filter>GeneratedFiles\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Deploy\moc_media_clip_volume_controller.cpp">
<Filter>GeneratedFiles\Deploy</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_media_clip_volume_controller.cpp">
<Filter>GeneratedFiles\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_media_clip_volume_controller.cpp">
<Filter>GeneratedFiles\Release</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="SourceFiles\stdafx.h">
@ -1658,6 +1718,18 @@
<ClInclude Include="SourceFiles\media\media_audio_ffmpeg_loader.h">
<Filter>SourceFiles\media</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\styles\style_mediaview.h">
<Filter>GeneratedFiles\styles</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\styles\style_widgets.h">
<Filter>GeneratedFiles\styles</Filter>
</ClInclude>
<ClInclude Include="SourceFiles\ui\effects\fade_animation.h">
<Filter>SourceFiles\ui\effects</Filter>
</ClInclude>
<ClInclude Include="SourceFiles\ui\buttons\icon_button.h">
<Filter>SourceFiles\ui\buttons</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="SourceFiles\application.h">
@ -1954,6 +2026,18 @@
<CustomBuild Include="SourceFiles\media\media_audio_loaders.h">
<Filter>SourceFiles\media</Filter>
</CustomBuild>
<CustomBuild Include="SourceFiles\ui\widgets\label_simple.h">
<Filter>SourceFiles\ui\widgets</Filter>
</CustomBuild>
<CustomBuild Include="SourceFiles\media\view\media_clip_controller.h">
<Filter>SourceFiles\media\view</Filter>
</CustomBuild>
<CustomBuild Include="SourceFiles\media\view\media_clip_playback.h">
<Filter>SourceFiles\media\view</Filter>
</CustomBuild>
<CustomBuild Include="SourceFiles\media\view\media_clip_volume_controller.h">
<Filter>SourceFiles\media\view</Filter>
</CustomBuild>
</ItemGroup>
<ItemGroup>
<None Include="Resources\langs\lang_it.strings">
@ -2035,6 +2119,12 @@
<CodegenStyleItem Include="SourceFiles\profile\profile.style">
<Filter>SourceFiles\profile</Filter>
</CodegenStyleItem>
<CodegenStyleItem Include="SourceFiles\ui\widgets\widgets.style">
<Filter>SourceFiles\ui\widgets</Filter>
</CodegenStyleItem>
<CodegenStyleItem Include="SourceFiles\media\view\mediaview.style">
<Filter>SourceFiles\media\view</Filter>
</CodegenStyleItem>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Resources\winrc\Telegram.rc">