autoload settings box added, working for voice messages and gifs (photos TODO)

This commit is contained in:
John Preston 2015-12-24 00:19:57 +03:00
parent b94533fcb2
commit 7c7d517b34
16 changed files with 300 additions and 62 deletions

View File

@ -576,6 +576,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
"lng_media_video" = "Video file"; "lng_media_video" = "Video file";
"lng_media_audio" = "Voice message"; "lng_media_audio" = "Voice message";
"lng_media_auto_settings" = "Automatic media download settings";
"lng_media_auto_photo" = "Automatic photo download";
"lng_media_auto_audio" = "Automatic audio download";
"lng_media_auto_gif" = "Automatic GIF download";
"lng_media_auto_private_chats" = "Private chats";
"lng_media_auto_groups" = "Groups and channels";
"lng_emoji_category0" = "Frequently used"; "lng_emoji_category0" = "Frequently used";
"lng_emoji_category1" = "People"; "lng_emoji_category1" = "People";
"lng_emoji_category2" = "Nature"; "lng_emoji_category2" = "Nature";

View File

@ -27,17 +27,17 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
#include "mainwidget.h" #include "mainwidget.h"
#include "window.h" #include "window.h"
ConnectionBox::ConnectionBox() : AbstractBox(st::boxWidth), ConnectionBox::ConnectionBox() : AbstractBox(st::boxWidth)
_hostInput(this, st::connectionHostInputField, lang(lng_connection_host_ph), cConnectionProxy().host), , _hostInput(this, st::connectionHostInputField, lang(lng_connection_host_ph), cConnectionProxy().host)
_portInput(this, st::connectionPortInputField, lang(lng_connection_port_ph), QString::number(cConnectionProxy().port)), , _portInput(this, st::connectionPortInputField, lang(lng_connection_port_ph), QString::number(cConnectionProxy().port))
_userInput(this, st::connectionUserInputField, lang(lng_connection_user_ph), cConnectionProxy().user), , _userInput(this, st::connectionUserInputField, lang(lng_connection_user_ph), cConnectionProxy().user)
_passwordInput(this, st::connectionPasswordInputField, lang(lng_connection_password_ph), cConnectionProxy().password), , _passwordInput(this, st::connectionPasswordInputField, lang(lng_connection_password_ph), cConnectionProxy().password)
_autoRadio(this, qsl("conn_type"), dbictAuto, lang(lng_connection_auto_rb), (cConnectionType() == dbictAuto)), , _autoRadio(this, qsl("conn_type"), dbictAuto, lang(lng_connection_auto_rb), (cConnectionType() == dbictAuto))
_httpProxyRadio(this, qsl("conn_type"), dbictHttpProxy, lang(lng_connection_http_proxy_rb), (cConnectionType() == dbictHttpProxy)), , _httpProxyRadio(this, qsl("conn_type"), dbictHttpProxy, lang(lng_connection_http_proxy_rb), (cConnectionType() == dbictHttpProxy))
_tcpProxyRadio(this, qsl("conn_type"), dbictTcpProxy, lang(lng_connection_tcp_proxy_rb), (cConnectionType() == dbictTcpProxy)), , _tcpProxyRadio(this, qsl("conn_type"), dbictTcpProxy, lang(lng_connection_tcp_proxy_rb), (cConnectionType() == dbictTcpProxy))
_tryIPv6(this, lang(lng_connection_try_ipv6), cTryIPv6()), , _tryIPv6(this, lang(lng_connection_try_ipv6), cTryIPv6())
_save(this, lang(lng_connection_save), st::defaultBoxButton), , _save(this, lang(lng_connection_save), st::defaultBoxButton)
_cancel(this, lang(lng_cancel), st::cancelBoxButton) { , _cancel(this, lang(lng_cancel), st::cancelBoxButton) {
connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); connect(&_save, SIGNAL(clicked()), this, SLOT(onSave()));
connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose()));
@ -218,3 +218,79 @@ void ConnectionBox::onSave() {
emit closed(); emit closed();
} }
} }
AutoDownloadBox::AutoDownloadBox() : AbstractBox(st::boxWidth)
, _photoPrivate(this, lang(lng_media_auto_private_chats), !(cAutoDownloadPhoto() & dbiadNoPrivate))
, _photoGroups(this, lang(lng_media_auto_groups), !(cAutoDownloadPhoto() & dbiadNoGroups))
, _audioPrivate(this, lang(lng_media_auto_private_chats), !(cAutoDownloadAudio() & dbiadNoPrivate))
, _audioGroups(this, lang(lng_media_auto_groups), !(cAutoDownloadAudio() & dbiadNoGroups))
, _gifPrivate(this, lang(lng_media_auto_private_chats), !(cAutoDownloadGif() & dbiadNoPrivate))
, _gifGroups(this, lang(lng_media_auto_groups), !(cAutoDownloadGif() & dbiadNoGroups))
, _sectionHeight(st::boxTitleHeight + 2 * (st::defaultCheckbox.height + st::setLittleSkip))
, _save(this, lang(lng_connection_save), st::defaultBoxButton)
, _cancel(this, lang(lng_cancel), st::cancelBoxButton) {
setMaxHeight(3 * _sectionHeight + st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom());
connect(&_save, SIGNAL(clicked()), this, SLOT(onSave()));
connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose()));
prepare();
}
void AutoDownloadBox::hideAll() {
_photoPrivate.hide();
_photoGroups.hide();
_audioPrivate.hide();
_audioGroups.hide();
_gifPrivate.hide();
_gifGroups.hide();
_save.hide();
_cancel.hide();
}
void AutoDownloadBox::showAll() {
_photoPrivate.show();
_photoGroups.show();
_audioPrivate.show();
_audioGroups.show();
_gifPrivate.show();
_gifGroups.show();
_save.show();
_cancel.show();
}
void AutoDownloadBox::paintEvent(QPaintEvent *e) {
Painter p(this);
if (paint(p)) return;
p.setPen(st::black);
p.setFont(st::semiboldFont);
p.drawTextLeft(st::boxTitlePosition.x(), st::boxTitlePosition.y(), width(), lang(lng_media_auto_photo));
p.drawTextLeft(st::boxTitlePosition.x(), _sectionHeight + st::boxTitlePosition.y(), width(), lang(lng_media_auto_audio));
p.drawTextLeft(st::boxTitlePosition.x(), 2 * _sectionHeight + st::boxTitlePosition.y(), width(), lang(lng_media_auto_gif));
}
void AutoDownloadBox::resizeEvent(QResizeEvent *e) {
_photoPrivate.moveToLeft(st::boxTitlePosition.x(), st::boxTitleHeight + st::setLittleSkip);
_photoGroups.moveToLeft(st::boxTitlePosition.x(), _photoPrivate.y() + _photoPrivate.height() + st::setLittleSkip);
_audioPrivate.moveToLeft(st::boxTitlePosition.x(), _sectionHeight + st::boxTitleHeight + st::setLittleSkip);
_audioGroups.moveToLeft(st::boxTitlePosition.x(), _audioPrivate.y() + _audioPrivate.height() + st::setLittleSkip);
_gifPrivate.moveToLeft(st::boxTitlePosition.x(), 2 * _sectionHeight + st::boxTitleHeight + st::setLittleSkip);
_gifGroups.moveToLeft(st::boxTitlePosition.x(), _gifPrivate.y() + _gifPrivate.height() + st::setLittleSkip);
_save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height());
_cancel.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y());
}
void AutoDownloadBox::onSave() {
cSetAutoDownloadPhoto((_photoPrivate.checked() ? 0 : dbiadNoPrivate) | (_photoGroups.checked() ? 0 : dbiadNoGroups));
cSetAutoDownloadAudio((_audioPrivate.checked() ? 0 : dbiadNoPrivate) | (_audioGroups.checked() ? 0 : dbiadNoGroups));
cSetAutoDownloadGif((_gifPrivate.checked() ? 0 : dbiadNoPrivate) | (_gifGroups.checked() ? 0 : dbiadNoGroups));
Local::writeUserSettings();
onClose();
}

View File

@ -54,3 +54,32 @@ private:
BoxButton _save, _cancel; BoxButton _save, _cancel;
}; };
class AutoDownloadBox : public AbstractBox {
Q_OBJECT
public:
AutoDownloadBox();
void paintEvent(QPaintEvent *e);
void resizeEvent(QResizeEvent *e);
public slots:
void onSave();
protected:
void hideAll();
void showAll();
private:
Checkbox _photoPrivate, _photoGroups;
Checkbox _audioPrivate, _audioGroups;
Checkbox _gifPrivate, _gifGroups;
int32 _sectionHeight;
BoxButton _save, _cancel;
};

View File

@ -154,9 +154,8 @@ namespace Notify {
if (HistoryMedia *media = item->getMedia()) { if (HistoryMedia *media = item->getMedia()) {
media->stopInline(item); media->stopInline(item);
if (DocumentData *document = media->getDocument()) { // forget data from memory if (DocumentData *document = media->getDocument()) { // forget data from memory
if (!document->data.isEmpty()) { if (!document->data.isEmpty() && document->prepareAutoLoader(item)) {
document->data.clear(); document->data.clear();
document->prepareAutoLoader();
} }
} }
stopped = true; stopped = true;

View File

@ -3741,19 +3741,21 @@ ImagePtr HistoryVideo::replyPreview() {
HistoryAudio::HistoryAudio(const MTPDaudio &audio) : HistoryFileMedia() HistoryAudio::HistoryAudio(const MTPDaudio &audio) : HistoryFileMedia()
, _data(App::feedAudio(audio)) { , _data(App::feedAudio(audio)) {
setLinks(new AudioOpenLink(_data), new AudioSaveLink(_data), new AudioCancelLink(_data)); setLinks(new AudioOpenLink(_data), new AudioOpenLink(_data), new AudioCancelLink(_data));
setStatusSize(FileStatusSizeReady); setStatusSize(FileStatusSizeReady);
} }
HistoryAudio::HistoryAudio(const HistoryAudio &other) : HistoryFileMedia() HistoryAudio::HistoryAudio(const HistoryAudio &other) : HistoryFileMedia()
, _data(other._data) { , _data(other._data) {
setLinks(new AudioOpenLink(_data), new AudioSaveLink(_data), new AudioCancelLink(_data)); setLinks(new AudioOpenLink(_data), new AudioOpenLink(_data), new AudioCancelLink(_data));
setStatusSize(other._statusSize); setStatusSize(other._statusSize);
} }
void HistoryAudio::initDimensions(const HistoryItem *parent) { void HistoryAudio::initDimensions(const HistoryItem *parent) {
_data->prepareAutoLoader(parent);
_maxw = st::msgFileMinWidth; _maxw = st::msgFileMinWidth;
int32 tleft = 0, tright = 0; int32 tleft = 0, tright = 0;
@ -3974,6 +3976,8 @@ HistoryDocument::HistoryDocument(const HistoryDocument &other) : HistoryFileMedi
} }
void HistoryDocument::initDimensions(const HistoryItem *parent) { void HistoryDocument::initDimensions(const HistoryItem *parent) {
_data->prepareAutoLoader(parent);
_maxw = st::msgFileMinWidth; _maxw = st::msgFileMinWidth;
int32 tleft = 0, tright = 0; int32 tleft = 0, tright = 0;
@ -4291,6 +4295,8 @@ HistoryGif::HistoryGif(const HistoryGif &other) : HistoryFileMedia()
} }
void HistoryGif::initDimensions(const HistoryItem *parent) { void HistoryGif::initDimensions(const HistoryItem *parent) {
_data->prepareAutoLoader(parent);
bool bubble = parent->hasBubble(); bool bubble = parent->hasBubble();
int32 tw = 0, th = 0; int32 tw = 0, th = 0;
if (_gif && _gif->state() == ClipError) { if (_gif && _gif->state() == ClipError) {
@ -4614,6 +4620,8 @@ HistorySticker::HistorySticker(DocumentData *document) : HistoryMedia()
} }
void HistorySticker::initDimensions(const HistoryItem *parent) { void HistorySticker::initDimensions(const HistoryItem *parent) {
_data->prepareAutoLoader(parent);
_pixw = _data->dimensions.width(); _pixw = _data->dimensions.width();
_pixh = _data->dimensions.height(); _pixh = _data->dimensions.height();
if (_pixw > st::maxStickerSize) { if (_pixw > st::maxStickerSize) {

View File

@ -536,7 +536,9 @@ void LayoutOverviewVideo::updateStatusText() const {
LayoutOverviewAudio::LayoutOverviewAudio(AudioData *audio, HistoryItem *parent) : LayoutAbstractFileItem(parent) LayoutOverviewAudio::LayoutOverviewAudio(AudioData *audio, HistoryItem *parent) : LayoutAbstractFileItem(parent)
, _data(audio) { , _data(audio) {
setLinks(new AudioOpenLink(_data), new AudioSaveLink(_data), new AudioCancelLink(_data)); _data->prepareAutoLoader(_parent);
setLinks(new AudioOpenLink(_data), new AudioOpenLink(_data), new AudioCancelLink(_data));
updateName(); updateName();
QString d = textcmdLink(1, textRichPrepare(langDateTime(date(_data->date)))); QString d = textcmdLink(1, textRichPrepare(langDateTime(date(_data->date))));
TextParseOptions opts = { TextParseRichText, 0, 0, Qt::LayoutDirectionAuto }; TextParseOptions opts = { TextParseRichText, 0, 0, Qt::LayoutDirectionAuto };
@ -705,7 +707,7 @@ bool LayoutOverviewAudio::updateStatusText() const {
} }
return showPause; return showPause;
} }
LayoutOverviewDocument::LayoutOverviewDocument(DocumentData *document, HistoryItem *parent) : LayoutAbstractFileItem(parent) LayoutOverviewDocument::LayoutOverviewDocument(DocumentData *document, HistoryItem *parent) : LayoutAbstractFileItem(parent)
, _data(document) , _data(document)
, _msgl(new MessageLink(parent)) , _msgl(new MessageLink(parent))
@ -715,6 +717,8 @@ LayoutOverviewDocument::LayoutOverviewDocument(DocumentData *document, HistoryIt
, _namew(st::semiboldFont->width(_name)) , _namew(st::semiboldFont->width(_name))
, _datew(st::normalFont->width(_date)) , _datew(st::normalFont->width(_date))
, _colorIndex(documentColorIndex(_data, _ext)) { , _colorIndex(documentColorIndex(_data, _ext)) {
_data->prepareAutoLoader(_parent);
setLinks(new DocumentOpenLink(_data), new DocumentSaveLink(_data), new DocumentCancelLink(_data)); setLinks(new DocumentOpenLink(_data), new DocumentSaveLink(_data), new DocumentCancelLink(_data));
setStatusSize(FileStatusSizeReady, _data->size, _data->song() ? _data->song()->duration : -1, 0); setStatusSize(FileStatusSizeReady, _data->size, _data->song() ? _data->song()->duration : -1, 0);

View File

@ -329,6 +329,45 @@ namespace {
} }
}; };
bool fileExists(const QString &name, int options = UserPath | SafePath) {
if (options & UserPath) {
if (!_userWorking()) return false;
} else {
if (!_working()) return false;
}
// detect order of read attempts
QString toTry[2];
toTry[0] = ((options & UserPath) ? _userBasePath : _basePath) + name + '0';
if (options & SafePath) {
QFileInfo toTry0(toTry[0]);
if (toTry0.exists()) {
toTry[1] = ((options & UserPath) ? _userBasePath : _basePath) + name + '1';
QFileInfo toTry1(toTry[1]);
if (toTry1.exists()) {
QDateTime mod0 = toTry0.lastModified(), mod1 = toTry1.lastModified();
if (mod0 < mod1) {
qSwap(toTry[0], toTry[1]);
}
} else {
toTry[1] = QString();
}
} else {
toTry[0][toTry[0].size() - 1] = '1';
}
}
for (int32 i = 0; i < 2; ++i) {
QString fname(toTry[i]);
if (fname.isEmpty()) break;
if (QFileInfo(fname).exists()) return true;
}
return false;
}
bool fileExists(const FileKey &fkey, int options = UserPath | SafePath) {
return fileExists(toFilePart(fkey), options);
}
bool readFile(FileReadDescriptor &result, const QString &name, int options = UserPath | SafePath) { bool readFile(FileReadDescriptor &result, const QString &name, int options = UserPath | SafePath) {
if (options & UserPath) { if (options & UserPath) {
if (!_userWorking()) return false; if (!_userWorking()) return false;
@ -824,6 +863,16 @@ namespace {
cSetSoundNotify(v == 1); cSetSoundNotify(v == 1);
} break; } break;
case dbiAutoDownload: {
qint32 photo, audio, gif;
stream >> photo >> audio >> gif;
if (!_checkStreamStatus(stream)) return false;
cSetAutoDownloadPhoto(photo);
cSetAutoDownloadAudio(audio);
cSetAutoDownloadGif(gif);
} break;
case dbiIncludeMuted: { case dbiIncludeMuted: {
qint32 v; qint32 v;
stream >> v; stream >> v;
@ -1395,6 +1444,7 @@ namespace {
size += sizeof(quint32) + sizeof(qint32) + cEmojiVariants().size() * (sizeof(uint32) + sizeof(uint64)); size += sizeof(quint32) + sizeof(qint32) + cEmojiVariants().size() * (sizeof(uint32) + sizeof(uint64));
size += sizeof(quint32) + sizeof(qint32) + (cRecentStickersPreload().isEmpty() ? cGetRecentStickers().size() : cRecentStickersPreload().size()) * (sizeof(uint64) + sizeof(ushort)); size += sizeof(quint32) + sizeof(qint32) + (cRecentStickersPreload().isEmpty() ? cGetRecentStickers().size() : cRecentStickersPreload().size()) * (sizeof(uint64) + sizeof(ushort));
size += sizeof(quint32) + _stringSize(cDialogLastPath()); size += sizeof(quint32) + _stringSize(cDialogLastPath());
size += sizeof(quint32) + 3 * sizeof(qint32);
EncryptedDescriptor data(size); EncryptedDescriptor data(size);
data.stream << quint32(dbiSendKey) << qint32(cCtrlEnter() ? dbiskCtrlEnter : dbiskEnter); data.stream << quint32(dbiSendKey) << qint32(cCtrlEnter() ? dbiskCtrlEnter : dbiskEnter);
@ -1412,6 +1462,7 @@ namespace {
data.stream << quint32(dbiCompressPastedImage) << qint32(cCompressPastedImage()); data.stream << quint32(dbiCompressPastedImage) << qint32(cCompressPastedImage());
data.stream << quint32(dbiDialogLastPath) << cDialogLastPath(); data.stream << quint32(dbiDialogLastPath) << cDialogLastPath();
data.stream << quint32(dbiSongVolume) << qint32(qRound(cSongVolume() * 1e6)); data.stream << quint32(dbiSongVolume) << qint32(qRound(cSongVolume() * 1e6));
data.stream << quint32(dbiAutoDownload) << qint32(cAutoDownloadPhoto()) << qint32(cAutoDownloadAudio()) << qint32(cAutoDownloadGif());
{ {
RecentEmojisPreload v(cRecentEmojisPreload()); RecentEmojisPreload v(cRecentEmojisPreload());
@ -2418,8 +2469,11 @@ namespace Local {
return _localLoader->addTask(new ImageLoadTask(j->first, location, loader)); return _localLoader->addTask(new ImageLoadTask(j->first, location, loader));
} }
bool willImageLoad(const StorageKey &location) { bool willImageLoad(const StorageKey &location, bool check) {
return (_imagesMap.constFind(location) != _imagesMap.cend()); StorageMap::const_iterator j = _imagesMap.constFind(location);
if (j == _imagesMap.cend()) return false;
if (check && !fileExists(j->first, UserPath)) return false;
return true;
} }
int32 hasImages() { int32 hasImages() {
@ -2481,8 +2535,11 @@ namespace Local {
return _localLoader->addTask(new StickerImageLoadTask(j->first, location, loader)); return _localLoader->addTask(new StickerImageLoadTask(j->first, location, loader));
} }
bool willStickerImageLoad(const StorageKey &location) { bool willStickerImageLoad(const StorageKey &location, bool check) {
return (_stickerImagesMap.constFind(location) != _stickerImagesMap.cend()); StorageMap::const_iterator j = _stickerImagesMap.constFind(location);
if (j == _stickerImagesMap.cend()) return false;
if (check && !fileExists(j->first, UserPath)) return false;
return true;
} }
int32 hasStickers() { int32 hasStickers() {
@ -2544,8 +2601,11 @@ namespace Local {
return _localLoader->addTask(new AudioLoadTask(j->first, location, loader)); return _localLoader->addTask(new AudioLoadTask(j->first, location, loader));
} }
bool willAudioLoad(const StorageKey &location) { bool willAudioLoad(const StorageKey &location, bool check) {
return (_audiosMap.constFind(location) != _audiosMap.cend()); StorageMap::const_iterator j = _audiosMap.constFind(location);
if (j == _audiosMap.cend()) return false;
if (check && !fileExists(j->first, UserPath)) return false;
return true;
} }
int32 hasAudios() { int32 hasAudios() {

View File

@ -124,19 +124,19 @@ namespace Local {
void writeImage(const StorageKey &location, const ImagePtr &img); void writeImage(const StorageKey &location, const ImagePtr &img);
void writeImage(const StorageKey &location, const StorageImageSaved &jpeg, bool overwrite = true); void writeImage(const StorageKey &location, const StorageImageSaved &jpeg, bool overwrite = true);
TaskId startImageLoad(const StorageKey &location, mtpFileLoader *loader); TaskId startImageLoad(const StorageKey &location, mtpFileLoader *loader);
bool willImageLoad(const StorageKey &location); bool willImageLoad(const StorageKey &location, bool check = false);
int32 hasImages(); int32 hasImages();
qint64 storageImagesSize(); qint64 storageImagesSize();
void writeStickerImage(const StorageKey &location, const QByteArray &data, bool overwrite = true); void writeStickerImage(const StorageKey &location, const QByteArray &data, bool overwrite = true);
TaskId startStickerImageLoad(const StorageKey &location, mtpFileLoader *loader); TaskId startStickerImageLoad(const StorageKey &location, mtpFileLoader *loader);
bool willStickerImageLoad(const StorageKey &location); bool willStickerImageLoad(const StorageKey &location, bool check = false);
int32 hasStickers(); int32 hasStickers();
qint64 storageStickersSize(); qint64 storageStickersSize();
void writeAudio(const StorageKey &location, const QByteArray &data, bool overwrite = true); void writeAudio(const StorageKey &location, const QByteArray &data, bool overwrite = true);
TaskId startAudioLoad(const StorageKey &location, mtpFileLoader *loader); TaskId startAudioLoad(const StorageKey &location, mtpFileLoader *loader);
bool willAudioLoad(const StorageKey &location); bool willAudioLoad(const StorageKey &location, bool check = false);
int32 hasAudios(); int32 hasAudios();
qint64 storageAudiosSize(); qint64 storageAudiosSize();

View File

@ -615,15 +615,10 @@ void MediaView::onSaveAs() {
} }
void MediaView::onDocClick() { void MediaView::onDocClick() {
QString fname = _doc->already(true); if (_doc->loader && _doc->loader->started()) {
if (fname.isEmpty()) { onSaveCancel();
if (_doc->loader) {
onSaveCancel();
} else {
onDownload();
}
} else { } else {
psOpenFile(fname); DocumentOpenLink::doOpen(_doc);
} }
} }
@ -1585,9 +1580,8 @@ void MediaView::preloadData(int32 delta) {
case MediaTypeSticker: case MediaTypeSticker:
DocumentData *doc = media->getDocument(); DocumentData *doc = media->getDocument();
doc->forget(); doc->forget();
if (!doc->data.isEmpty()) { if (!doc->data.isEmpty() && doc->prepareAutoLoader(item)) {
doc->data.clear(); doc->data.clear();
doc->prepareAutoLoader();
} }
break; break;
} }

View File

@ -171,6 +171,10 @@ SavedPeersByTime gSavedPeersByTime;
ReportSpamStatuses gReportSpamStatuses; ReportSpamStatuses gReportSpamStatuses;
int32 gAutoDownloadPhoto = 0; // all auto download
int32 gAutoDownloadAudio = 0;
int32 gAutoDownloadGif = 0;
void settingsParseArgs(int argc, char *argv[]) { void settingsParseArgs(int argc, char *argv[]) {
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
gIsElCapitan = (QSysInfo::macVersion() >= QSysInfo::MV_10_11); gIsElCapitan = (QSysInfo::macVersion() >= QSysInfo::MV_10_11);

View File

@ -327,4 +327,13 @@ DeclareRefSetting(SavedPeersByTime, SavedPeersByTime);
typedef QMap<uint64, DBIPeerReportSpamStatus> ReportSpamStatuses; typedef QMap<uint64, DBIPeerReportSpamStatus> ReportSpamStatuses;
DeclareRefSetting(ReportSpamStatuses, ReportSpamStatuses); DeclareRefSetting(ReportSpamStatuses, ReportSpamStatuses);
enum DBIAutoDownloadFlags {
dbiadNoPrivate = 0x01,
dbiadNoGroups = 0x02,
};
DeclareSetting(int32, AutoDownloadPhoto);
DeclareSetting(int32, AutoDownloadAudio);
DeclareSetting(int32, AutoDownloadGif);
void settingsParseArgs(int argc, char *argv[]); void settingsParseArgs(int argc, char *argv[]);

View File

@ -168,12 +168,14 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : TWidget(parent)
, _dontAskDownloadPath(this, lang(lng_download_path_dont_ask), !cAskDownloadPath()) , _dontAskDownloadPath(this, lang(lng_download_path_dont_ask), !cAskDownloadPath())
, _downloadPathWidth(st::linkFont->width(lang(lng_download_path_label)) + st::linkFont->spacew) , _downloadPathWidth(st::linkFont->width(lang(lng_download_path_label)) + st::linkFont->spacew)
, _downloadPathEdit(this, cDownloadPath().isEmpty() ? lang(lng_download_path_default) : ((cDownloadPath() == qsl("tmp")) ? lang(lng_download_path_temp) : st::linkFont->elided(QDir::toNativeSeparators(cDownloadPath()), st::setWidth - st::setVersionLeft - _downloadPathWidth))) , _downloadPathEdit(this, cDownloadPath().isEmpty() ? lang(lng_download_path_default) : ((cDownloadPath() == qsl("tmp")) ? lang(lng_download_path_temp) : st::linkFont->elided(QDir::toNativeSeparators(cDownloadPath()), st::setWidth - st::cbDefFlat.textLeft - _downloadPathWidth)))
, _downloadPathClear(this, lang(lng_download_path_clear)) , _downloadPathClear(this, lang(lng_download_path_clear))
, _tempDirClearingWidth(st::linkFont->width(lang(lng_download_path_clearing))) , _tempDirClearingWidth(st::linkFont->width(lang(lng_download_path_clearing)))
, _tempDirClearedWidth(st::linkFont->width(lang(lng_download_path_cleared))) , _tempDirClearedWidth(st::linkFont->width(lang(lng_download_path_cleared)))
, _tempDirClearFailedWidth(st::linkFont->width(lang(lng_download_path_clear_failed))) , _tempDirClearFailedWidth(st::linkFont->width(lang(lng_download_path_clear_failed)))
, _autoDownload(this, lang(lng_media_auto_settings))
// chat background // chat background
, _backFromGallery(this, lang(lng_settings_bg_from_gallery)) , _backFromGallery(this, lang(lng_settings_bg_from_gallery))
, _backFromFile(this, lang(lng_settings_bg_from_file)) , _backFromFile(this, lang(lng_settings_bg_from_file))
@ -290,6 +292,7 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : TWidget(parent)
} }
connect(App::wnd(), SIGNAL(tempDirCleared(int)), this, SLOT(onTempDirCleared(int))); connect(App::wnd(), SIGNAL(tempDirCleared(int)), this, SLOT(onTempDirCleared(int)));
connect(App::wnd(), SIGNAL(tempDirClearFailed(int)), this, SLOT(onTempDirClearFailed(int))); connect(App::wnd(), SIGNAL(tempDirClearFailed(int)), this, SLOT(onTempDirClearFailed(int)));
connect(&_autoDownload, SIGNAL(clicked()), this, SLOT(onAutoDownload()));
// chat background // chat background
if (!cChatBackground()) App::initBackground(); if (!cChatBackground()) App::initBackground();
@ -471,8 +474,8 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
} else { } else {
textToDraw = _curVersionText; textToDraw = _curVersionText;
} }
p.setFont(st::linkFont->f); p.setFont(st::linkFont);
p.setPen(st::setVersionColor->p); p.setPen(st::setVersionColor);
p.drawText(_left + st::setVersionLeft, top + st::setVersionTop + st::linkFont->ascent, textToDraw); p.drawText(_left + st::setVersionLeft, top + st::setVersionTop + st::linkFont->ascent, textToDraw);
top += st::setVersionHeight; top += st::setVersionHeight;
#endif #endif
@ -532,7 +535,7 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
top += st::setLittleSkip; top += st::setLittleSkip;
p.setFont(st::linkFont->f); p.setFont(st::linkFont->f);
p.setPen(st::black->p); p.setPen(st::black->p);
p.drawText(_left + st::setVersionLeft, top + st::linkFont->ascent, lang(lng_download_path_label)); p.drawText(_left + st::cbDefFlat.textLeft, top + st::linkFont->ascent, lang(lng_download_path_label));
if (cDownloadPath() == qsl("tmp")) { if (cDownloadPath() == qsl("tmp")) {
QString clearText; QString clearText;
int32 clearWidth = 0; int32 clearWidth = 0;
@ -547,7 +550,8 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
} }
top += _downloadPathEdit.height(); top += _downloadPathEdit.height();
} }
top += st::setSectionSkip; top += st::setLittleSkip;
top += _autoDownload.height();
// chat background // chat background
p.setFont(st::setHeaderFont->f); p.setFont(st::setHeaderFont->f);
@ -721,13 +725,14 @@ void SettingsInner::resizeEvent(QResizeEvent *e) {
_dontAskDownloadPath.move(_left, top); top += _dontAskDownloadPath.height(); _dontAskDownloadPath.move(_left, top); top += _dontAskDownloadPath.height();
if (!cAskDownloadPath()) { if (!cAskDownloadPath()) {
top += st::setLittleSkip; top += st::setLittleSkip;
_downloadPathEdit.move(_left + st::setVersionLeft + _downloadPathWidth, top); _downloadPathEdit.move(_left + st::cbDefFlat.textLeft + _downloadPathWidth, top);
if (cDownloadPath() == qsl("tmp")) { if (cDownloadPath() == qsl("tmp")) {
_downloadPathClear.move(_left + st::setWidth - _downloadPathClear.width(), top); _downloadPathClear.move(_left + st::setWidth - _downloadPathClear.width(), top);
} }
top += _downloadPathEdit.height(); top += _downloadPathEdit.height();
} }
top += st::setSectionSkip; top += st::setLittleSkip;
_autoDownload.move(_left + st::cbDefFlat.textLeft, top); top += _autoDownload.height();
// chat background // chat background
top += st::setHeaderSkip; top += st::setHeaderSkip;
@ -1061,7 +1066,7 @@ void SettingsInner::showAll() {
_downloadPathClear.hide(); _downloadPathClear.hide();
} }
} }
_autoDownload.show();
} else { } else {
_replaceEmojis.hide(); _replaceEmojis.hide();
_viewEmojis.hide(); _viewEmojis.hide();
@ -1071,6 +1076,7 @@ void SettingsInner::showAll() {
_dontAskDownloadPath.hide(); _dontAskDownloadPath.hide();
_downloadPathEdit.hide(); _downloadPathEdit.hide();
_downloadPathClear.hide(); _downloadPathClear.hide();
_autoDownload.hide();
} }
// chat background // chat background
@ -1689,6 +1695,10 @@ void SettingsInner::onTempDirClearFailed(int task) {
update(); update();
} }
void SettingsInner::onAutoDownload() {
Ui::showLayer(new AutoDownloadBox());
}
#ifndef TDESKTOP_DISABLE_AUTOUPDATE #ifndef TDESKTOP_DISABLE_AUTOUPDATE
void SettingsInner::setUpdatingState(UpdatingState state, bool force) { void SettingsInner::setUpdatingState(UpdatingState state, bool force) {
if (_updatingState != state || force) { if (_updatingState != state || force) {

View File

@ -151,6 +151,8 @@ public slots:
void onTempDirCleared(int task); void onTempDirCleared(int task);
void onTempDirClearFailed(int task); void onTempDirClearFailed(int task);
void onAutoDownload();
void onBackFromGallery(); void onBackFromGallery();
void onBackFromFile(); void onBackFromFile();
void onTileBackground(); void onTileBackground();
@ -258,6 +260,7 @@ private:
TempDirCleared = 4, TempDirCleared = 4,
}; };
TempDirClearState _tempDirClearState; TempDirClearState _tempDirClearState;
LinkButton _autoDownload;
// chat background // chat background
QPixmap _background; QPixmap _background;

View File

@ -775,10 +775,14 @@ void AudioOpenLink::onClick(Qt::MouseButton button) const {
if (data->status != FileReady) return; if (data->status != FileReady) return;
if (data->loader && !data->loader->started()) { if (data->prepareAutoLoader(App::hoveredLinkItem(), true)) {
data->openOnSave = 1; data->openOnSave = 1;
data->openOnSaveMsgId = App::hoveredLinkItem() ? App::hoveredLinkItem()->fullId() : (App::contextItem() ? App::contextItem()->fullId() : FullMsgId()); data->openOnSaveMsgId = App::hoveredLinkItem() ? App::hoveredLinkItem()->fullId() : (App::contextItem() ? App::contextItem()->fullId() : FullMsgId());
data->save(QString()); if (!data->loader->started()) {
data->save(QString());
} else {
data->loader->start();
}
return; return;
} }
@ -851,9 +855,23 @@ bool StickerData::setInstalled() const {
AudioData::AudioData(const AudioId &id, const uint64 &access, int32 date, const QString &mime, int32 duration, int32 dc, int32 size) : AudioData::AudioData(const AudioId &id, const uint64 &access, int32 date, const QString &mime, int32 duration, int32 dc, int32 size) :
id(id), access(access), date(date), mime(mime), duration(duration), dc(dc), size(size), status(FileReady), uploadOffset(0), openOnSave(0), loader(0) { id(id), access(access), date(date), mime(mime), duration(duration), dc(dc), size(size), status(FileReady), uploadOffset(0), openOnSave(0), loader(0) {
_location = Local::readFileLocation(mediaKey(AudioFileLocation, dc, id)); _location = Local::readFileLocation(mediaKey(AudioFileLocation, dc, id));
if (!loaded() && size < AudioVoiceMsgInMemory) { }
loader = new mtpFileLoader(dc, id, access, AudioFileLocation, QString(), size, true);
bool AudioData::prepareAutoLoader(const HistoryItem *item, bool force) {
if (!loader && !loaded(true) && size < AudioVoiceMsgInMemory) {
bool load = force;
if (!force) {
if (item->history()->peer->isUser()) {
load = !(cAutoDownloadAudio() & dbiadNoPrivate);
} else {
load = !(cAutoDownloadAudio() & dbiadNoGroups);
}
}
if (load || Local::willAudioLoad(mediaKey(AudioFileLocation, dc, id), true)) {
loader = new mtpFileLoader(dc, id, access, AudioFileLocation, QString(), size, true);
}
} }
return loader;
} }
void AudioData::save(const QString &toFile) { void AudioData::save(const QString &toFile) {
@ -932,10 +950,14 @@ void DocumentOpenLink::doOpen(DocumentData *data, int32 openOnSave) {
if (data->status != FileReady) return; if (data->status != FileReady) return;
if (data->loader && !data->loader->started()) { if (data->prepareAutoLoader(App::hoveredLinkItem(), true)) {
data->openOnSave = openOnSave; data->openOnSave = openOnSave;
data->openOnSaveMsgId = App::hoveredLinkItem() ? App::hoveredLinkItem()->fullId() : (App::contextItem() ? App::contextItem()->fullId() : FullMsgId()); data->openOnSaveMsgId = App::hoveredLinkItem() ? App::hoveredLinkItem()->fullId() : (App::contextItem() ? App::contextItem()->fullId() : FullMsgId());
data->save(QString()); if (!data->loader->started()) {
data->save(QString());
} else {
data->loader->start();
}
return; return;
} }
@ -1103,29 +1125,40 @@ void DocumentData::setattributes(const QVector<MTPDocumentAttribute> &attributes
case mtpc_documentAttributeFilename: name = qs(attributes[i].c_documentAttributeFilename().vfile_name); break; case mtpc_documentAttributeFilename: name = qs(attributes[i].c_documentAttributeFilename().vfile_name); break;
} }
} }
prepareAutoLoader();
}
void DocumentData::prepareAutoLoader() {
if (type == StickerDocument) { if (type == StickerDocument) {
if (dimensions.width() <= 0 || dimensions.height() <= 0 || dimensions.width() > StickerMaxSize || dimensions.height() > StickerMaxSize || size > StickerInMemory) { if (dimensions.width() <= 0 || dimensions.height() <= 0 || dimensions.width() > StickerMaxSize || dimensions.height() > StickerMaxSize || size > StickerInMemory) {
type = FileDocument; type = FileDocument;
delete _additional; delete _additional;
_additional = 0; _additional = 0;
} else if (!loader && !loaded(true)) {
loader = new mtpFileLoader(dc, id, access, DocumentFileLocation, QString(), size, true);
}
} else if (isAnimation()) {
if (size <= AnimationInMemory && !loader && !loaded(true)) {
loader = new mtpFileLoader(dc, id, access, DocumentFileLocation, QString(), size, true);
} }
} }
} }
bool DocumentData::prepareAutoLoader(const HistoryItem *item, bool force) {
if (!loader && !loaded(true)) {
if (type == StickerDocument) {
loader = new mtpFileLoader(dc, id, access, DocumentFileLocation, QString(), size, true);
} else if (isAnimation() && item && size <= AnimationInMemory) {
bool load = force;
if (!load) {
if (item->history()->peer->isUser()) {
load = !(cAutoDownloadGif() & dbiadNoPrivate);
} else {
load = !(cAutoDownloadGif() & dbiadNoGroups);
}
}
if (load || Local::willStickerImageLoad(mediaKey(DocumentFileLocation, dc, id), true)) {
loader = new mtpFileLoader(dc, id, access, DocumentFileLocation, QString(), size, true);
}
}
}
return loader;
}
void DocumentData::save(const QString &toFile) { void DocumentData::save(const QString &toFile) {
if (loader && loader->fileName().isEmpty()) { if (loader && loader->fileName().isEmpty()) {
loader->setFileName(toFile); loader->setFileName(toFile);
} else { } else if (!loader || !toFile.isEmpty()) {
cancel(true); cancel(true);
loader = new mtpFileLoader(dc, id, access, DocumentFileLocation, toFile, size, (type == StickerDocument)); loader = new mtpFileLoader(dc, id, access, DocumentFileLocation, toFile, size, (type == StickerDocument));
} }

View File

@ -903,6 +903,7 @@ struct AudioData {
void forget() { void forget() {
} }
bool prepareAutoLoader(const HistoryItem *item, bool force = false);
void save(const QString &toFile); void save(const QString &toFile);
void cancel(bool beforeDownload = false) { void cancel(bool beforeDownload = false) {
@ -1147,7 +1148,7 @@ struct DocumentData {
bool loadingStarted() { bool loadingStarted() {
return loader && loader->started(); return loader && loader->started();
} }
void prepareAutoLoader(); bool prepareAutoLoader(const HistoryItem *item, bool force = false);
StickerData *sticker() { StickerData *sticker() {
return (type == StickerDocument) ? static_cast<StickerData*>(_additional) : 0; return (type == StickerDocument) ? static_cast<StickerData*>(_additional) : 0;
} }

View File

@ -288,6 +288,7 @@ enum DataBlockId {
dbiIncludeMuted = 0x31, dbiIncludeMuted = 0x31,
dbiMaxMegaGroupCount = 0x32, dbiMaxMegaGroupCount = 0x32,
dbiDownloadPath = 0x33, dbiDownloadPath = 0x33,
dbiAutoDownload = 0x34,
dbiEncryptedWithSalt = 333, dbiEncryptedWithSalt = 333,
dbiEncrypted = 444, dbiEncrypted = 444,