From fdab38617845707a8be7f7e38cae4bf68348e7a9 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 26 Aug 2016 22:49:18 -0600 Subject: [PATCH] Most of the new Settings are done. Left: auto update, privacy and security, local storage box + some minor things, like design fixes, codes like loadlang and clearing of the local storage (box) and temp download folder. --- Telegram/SourceFiles/app.cpp | 154 +++++---- Telegram/SourceFiles/application.cpp | 7 +- Telegram/SourceFiles/boxes/backgroundbox.cpp | 9 +- Telegram/SourceFiles/boxes/backgroundbox.h | 6 - Telegram/SourceFiles/boxes/connectionbox.cpp | 38 ++- .../SourceFiles/boxes/downloadpathbox.cpp | 33 +- Telegram/SourceFiles/boxes/downloadpathbox.h | 15 - Telegram/SourceFiles/core/basic_types.h | 6 +- Telegram/SourceFiles/core/observer.h | 103 +++--- Telegram/SourceFiles/dialogs/dialogs.style | 4 + Telegram/SourceFiles/facades.cpp | 51 ++- Telegram/SourceFiles/facades.h | 55 +++- Telegram/SourceFiles/history.cpp | 10 +- Telegram/SourceFiles/history.h | 12 +- Telegram/SourceFiles/historywidget.cpp | 15 +- Telegram/SourceFiles/historywidget.h | 3 +- Telegram/SourceFiles/intro/introwidget.cpp | 3 - Telegram/SourceFiles/intro/introwidget.h | 2 - Telegram/SourceFiles/layerwidget.cpp | 3 - Telegram/SourceFiles/layerwidget.h | 2 - Telegram/SourceFiles/localstorage.cpp | 80 ++--- Telegram/SourceFiles/mainwidget.cpp | 26 +- Telegram/SourceFiles/mainwidget.h | 8 +- Telegram/SourceFiles/mainwindow.cpp | 89 +++-- Telegram/SourceFiles/mainwindow.h | 3 +- Telegram/SourceFiles/mediaview.cpp | 8 +- Telegram/SourceFiles/mtproto/connection.cpp | 10 +- .../mtproto/connection_abstract.cpp | 4 +- Telegram/SourceFiles/overviewwidget.cpp | 3 +- .../platform/mac/main_window_mac.mm | 10 +- .../platform/win/main_window_win.cpp | 12 +- .../SourceFiles/profile/profile_widget.cpp | 1 + Telegram/SourceFiles/profile/profile_widget.h | 4 +- Telegram/SourceFiles/settings.cpp | 22 -- Telegram/SourceFiles/settings.h | 20 +- Telegram/SourceFiles/settings/settings.style | 19 ++ .../settings/settings_advanced_widget.cpp | 23 ++ .../settings/settings_advanced_widget.h | 3 + .../settings/settings_background_widget.cpp | 228 ++++++++++++- .../settings/settings_background_widget.h | 61 +++- .../settings/settings_block_widget.cpp | 2 +- .../settings/settings_block_widget.h | 2 +- .../settings_chat_settings_widget.cpp | 30 +- .../settings/settings_chat_settings_widget.h | 1 + .../SourceFiles/settings/settings_cover.cpp | 23 +- .../SourceFiles/settings/settings_cover.h | 2 + .../settings/settings_general_widget.cpp | 5 +- .../settings/settings_inner_widget.cpp | 28 +- .../settings/settings_inner_widget.h | 6 +- .../settings_notifications_widget.cpp | 118 ++++--- .../settings/settings_notifications_widget.h | 4 +- .../SourceFiles/settings/settings_widget.cpp | 13 + .../SourceFiles/settings/settings_widget.h | 7 + Telegram/SourceFiles/settingswidget.cpp | 304 +++++++++--------- Telegram/SourceFiles/settingswidget.h | 1 - Telegram/SourceFiles/stdafx.h | 1 - Telegram/SourceFiles/structs.cpp | 10 +- Telegram/SourceFiles/title.cpp | 2 + Telegram/SourceFiles/title.h | 4 +- .../SourceFiles/window/chat_background.cpp | 90 ++++++ Telegram/SourceFiles/window/chat_background.h | 61 ++++ Telegram/SourceFiles/window/section_widget.h | 5 +- .../SourceFiles/window/top_bar_widget.cpp | 2 + Telegram/SourceFiles/window/top_bar_widget.h | 6 +- Telegram/gyp/Telegram.gyp | 3 + Telegram/gyp/settings_win.gypi | 20 +- 66 files changed, 1259 insertions(+), 656 deletions(-) create mode 100644 Telegram/SourceFiles/window/chat_background.cpp create mode 100644 Telegram/SourceFiles/window/chat_background.h diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index b48496d1e..90e864638 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -39,6 +39,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "apiwrap.h" #include "numbers.h" #include "observer_peer.h" +#include "window/chat_background.h" namespace { App::LaunchState _launchState = App::Launched; @@ -501,7 +502,7 @@ namespace { } if (d.is_self() && ::self != data) { ::self = data; - if (App::wnd()) App::wnd()->updateGlobalMenu(); + Global::RefSelfChanged().notify(); } } @@ -2034,8 +2035,8 @@ namespace { ::gifItems.clear(); lastPhotos.clear(); lastPhotosMap.clear(); - ::self = 0; - if (App::wnd()) App::wnd()->updateGlobalMenu(); + ::self = nullptr; + Global::RefSelfChanged().notify(true); } void historyRegDependency(HistoryItem *dependent, HistoryItem *dependency) { @@ -2323,7 +2324,7 @@ namespace { } void playSound() { - if (cSoundNotify() && !psSkipAudioNotify()) audioPlayNotify(); + if (Global::SoundNotify() && !psSkipAudioNotify()) audioPlayNotify(); } void checkImageCacheSize() { @@ -2584,11 +2585,11 @@ namespace { #ifndef TDESKTOP_DISABLE_NETWORK_PROXY QNetworkProxy getHttpProxySettings() { - const ConnectionProxy *proxy = 0; + const ProxyData *proxy = nullptr; if (Global::started()) { - proxy = (cConnectionType() == dbictHttpProxy) ? (&cConnectionProxy()) : 0; + proxy = (Global::ConnectionType() == dbictHttpProxy) ? (&Global::ConnectionProxy()) : nullptr; } else { - proxy = Sandbox::PreLaunchProxy().host.isEmpty() ? 0 : (&Sandbox::PreLaunchProxy()); + proxy = Sandbox::PreLaunchProxy().host.isEmpty() ? nullptr : (&Sandbox::PreLaunchProxy()); } if (proxy) { return QNetworkProxy(QNetworkProxy::HttpProxy, proxy->host, proxy->port, proxy->user, proxy->password); @@ -2599,8 +2600,8 @@ namespace { void setProxySettings(QTcpSocket &socket) { #ifndef TDESKTOP_DISABLE_NETWORK_PROXY - if (cConnectionType() == dbictTcpProxy) { - const ConnectionProxy &p(cConnectionProxy()); + if (Global::ConnectionType() == dbictTcpProxy) { + auto &p = Global::ConnectionProxy(); socket.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, p.host, p.port, p.user, p.password)); } else { socket.setProxy(QNetworkProxy(QNetworkProxy::NoProxy)); @@ -2673,50 +2674,43 @@ namespace { uint64 components[3] = { 0 }, componentsScroll[3] = { 0 }, componentsPoint[3] = { 0 }; int size = 0; - { - QImage img(p); - bool remove = false; - if (p.isNull()) { - if (id == DefaultChatBackground) { - img.load(st::msgBG); - } else { - img.load(st::msgBG0); - if (cRetina()) { - img = img.scaledToWidth(img.width() * 2, Qt::SmoothTransformation); - } else if (cScale() != dbisOne) { - img = img.scaledToWidth(convertScale(img.width()), Qt::SmoothTransformation); - } - id = 0; + + QImage img(p); + bool remove = false; + if (p.isNull()) { + if (id == DefaultChatBackground) { + img.load(st::msgBG); + } else { + img.load(st::msgBG0); + if (cRetina()) { + img = img.scaledToWidth(img.width() * 2, Qt::SmoothTransformation); + } else if (cScale() != dbisOne) { + img = img.scaledToWidth(convertScale(img.width()), Qt::SmoothTransformation); } - remove = true; + id = 0; } - if (img.format() != QImage::Format_ARGB32 && img.format() != QImage::Format_ARGB32_Premultiplied && img.format() != QImage::Format_RGB32) { - img = img.convertToFormat(QImage::Format_RGB32); - } - img.setDevicePixelRatio(cRetinaFactor()); - - if (!nowrite) { - Local::writeBackground(id, remove ? QImage() : img); - } - - int w = img.width(), h = img.height(); - size = w * h; - const uchar *pix = img.constBits(); - if (pix) { - for (int32 i = 0, l = size * 4; i < l; i += 4) { - components[2] += pix[i + 0]; - components[1] += pix[i + 1]; - components[0] += pix[i + 2]; - } - } - - delete cChatBackground(); - cSetChatBackground(new QPixmap(pixmapFromImageInPlace(std_::move(img)))); - cSetChatBackgroundId(id); - - if (App::main()) App::main()->clearCachedBackground(); - + remove = true; } + if (img.format() != QImage::Format_ARGB32 && img.format() != QImage::Format_ARGB32_Premultiplied && img.format() != QImage::Format_RGB32) { + img = img.convertToFormat(QImage::Format_RGB32); + } + img.setDevicePixelRatio(cRetinaFactor()); + + if (!nowrite) { + Local::writeBackground(id, remove ? QImage() : img); + } + + int w = img.width(), h = img.height(); + size = w * h; + const uchar *pix = img.constBits(); + if (pix) { + for (int32 i = 0, l = size * 4; i < l; i += 4) { + components[2] += pix[i + 0]; + components[1] += pix[i + 1]; + components[0] += pix[i + 2]; + } + } + if (size) { for (int32 i = 0; i < 3; ++i) components[i] /= size; } @@ -2733,44 +2727,42 @@ namespace { uint64 max = qMax(1ULL, components[maxtomin[0]]), mid = qMax(1ULL, components[maxtomin[1]]), min = qMax(1ULL, components[maxtomin[2]]); - { - QImage dog = App::sprite().toImage().copy(st::msgDogImg.rect()); - QImage::Format f = dog.format(); - if (f != QImage::Format_ARGB32 && f != QImage::Format_ARGB32_Premultiplied) { - dog = dog.convertToFormat(QImage::Format_ARGB32_Premultiplied); - } - uchar *dogBits = dog.bits(); - if (max != min) { - float64 coef = float64(mid - min) / float64(max - min); - for (int i = 0, s = dog.width() * dog.height() * 4; i < s; i += 4) { - int dogmaxtomin[3] = { i, i + 1, i + 2 }; + QImage dog = App::sprite().toImage().copy(st::msgDogImg.rect()); + QImage::Format f = dog.format(); + if (f != QImage::Format_ARGB32 && f != QImage::Format_ARGB32_Premultiplied) { + dog = dog.convertToFormat(QImage::Format_ARGB32_Premultiplied); + } + uchar *dogBits = dog.bits(); + if (max != min) { + float64 coef = float64(mid - min) / float64(max - min); + for (int i = 0, s = dog.width() * dog.height() * 4; i < s; i += 4) { + int dogmaxtomin[3] = { i, i + 1, i + 2 }; + if (dogBits[dogmaxtomin[0]] < dogBits[dogmaxtomin[1]]) { + qSwap(dogmaxtomin[0], dogmaxtomin[1]); + } + if (dogBits[dogmaxtomin[1]] < dogBits[dogmaxtomin[2]]) { + qSwap(dogmaxtomin[1], dogmaxtomin[2]); if (dogBits[dogmaxtomin[0]] < dogBits[dogmaxtomin[1]]) { qSwap(dogmaxtomin[0], dogmaxtomin[1]); } - if (dogBits[dogmaxtomin[1]] < dogBits[dogmaxtomin[2]]) { - qSwap(dogmaxtomin[1], dogmaxtomin[2]); - if (dogBits[dogmaxtomin[0]] < dogBits[dogmaxtomin[1]]) { - qSwap(dogmaxtomin[0], dogmaxtomin[1]); - } - } - uchar result[3]; - result[maxtomin[0]] = dogBits[dogmaxtomin[0]]; - result[maxtomin[2]] = dogBits[dogmaxtomin[2]]; - result[maxtomin[1]] = uchar(qRound(result[maxtomin[2]] + (result[maxtomin[0]] - result[maxtomin[2]]) * coef)); - dogBits[i] = result[2]; - dogBits[i + 1] = result[1]; - dogBits[i + 2] = result[0]; - } - } else { - for (int i = 0, s = dog.width() * dog.height() * 4; i < s; i += 4) { - uchar b = dogBits[i], g = dogBits[i + 1], r = dogBits[i + 2]; - dogBits[i] = dogBits[i + 1] = dogBits[i + 2] = (r + r + b + g + g + g) / 6; } + uchar result[3]; + result[maxtomin[0]] = dogBits[dogmaxtomin[0]]; + result[maxtomin[2]] = dogBits[dogmaxtomin[2]]; + result[maxtomin[1]] = uchar(qRound(result[maxtomin[2]] + (result[maxtomin[0]] - result[maxtomin[2]]) * coef)); + dogBits[i] = result[2]; + dogBits[i + 1] = result[1]; + dogBits[i + 2] = result[0]; + } + } else { + for (int i = 0, s = dog.width() * dog.height() * 4; i < s; i += 4) { + uchar b = dogBits[i], g = dogBits[i + 1], r = dogBits[i + 2]; + dogBits[i] = dogBits[i + 1] = dogBits[i + 2] = (r + r + b + g + g + g) / 6; } - delete cChatDogImage(); - cSetChatDogImage(new QPixmap(pixmapFromImageInPlace(std_::move(dog)))); } + Window::chatBackground()->init(id, pixmapFromImageInPlace(std_::move(img)), pixmapFromImageInPlace(std_::move(dog))); + memcpy(componentsScroll, components, sizeof(components)); memcpy(componentsPoint, components, sizeof(components)); diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index f899532f7..61d2fc6c9 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -34,6 +34,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "core/observer.h" #include "observer_peer.h" #include "core/observer.h" +#include "window/chat_background.h" namespace { void mtpStateChanged(int32 dc, int32 state) { @@ -1090,11 +1091,7 @@ AppClass::~AppClass() { deleteAndMark(_uploader); deleteAndMark(_translator); - delete cChatBackground(); - cSetChatBackground(0); - - delete cChatDogImage(); - cSetChatDogImage(0); + Window::chatBackground()->reset(); style::stopManager(); diff --git a/Telegram/SourceFiles/boxes/backgroundbox.cpp b/Telegram/SourceFiles/boxes/backgroundbox.cpp index c8e3b93ed..06bf8b873 100644 --- a/Telegram/SourceFiles/boxes/backgroundbox.cpp +++ b/Telegram/SourceFiles/boxes/backgroundbox.cpp @@ -25,6 +25,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "mainwindow.h" #include "settingswidget.h" +#include "window/chat_background.h" #include "styles/style_overview.h" BackgroundInner::BackgroundInner() : @@ -130,7 +131,7 @@ void BackgroundInner::paintEvent(QPaintEvent *e) { const QPixmap &pix(paper.thumb->pix(st::backgroundSize.width(), st::backgroundSize.height())); p.drawPixmap(x, y, pix); - if (paper.id == cChatBackgroundId()) { + if (paper.id == Window::chatBackground()->id()) { int checkPosX = x + st::backgroundSize.width() - st::overviewPhotoChecked.width(); int checkPosY = y + st::backgroundSize.height() - st::overviewPhotoChecked.height(); st::overviewPhotoChecked.paint(p, QPoint(checkPosX, checkPosY), width()); @@ -196,9 +197,9 @@ void BackgroundBox::onBackgroundChosen(int index) { if (index >= 0 && index < App::cServerBackgrounds().size()) { const App::WallPaper &paper(App::cServerBackgrounds().at(index)); if (App::main()) App::main()->setChatBackground(paper); - if (_updateCallback) { - _updateCallback(!paper.id); - } + + using Update = Window::ChatBackgroundUpdate; + Window::chatBackground()->notify(Update(Update::Type::Start, !paper.id)); } onClose(); } diff --git a/Telegram/SourceFiles/boxes/backgroundbox.h b/Telegram/SourceFiles/boxes/backgroundbox.h index 466e32d66..66866f165 100644 --- a/Telegram/SourceFiles/boxes/backgroundbox.h +++ b/Telegram/SourceFiles/boxes/backgroundbox.h @@ -54,11 +54,6 @@ class BackgroundBox : public ItemListBox { public: BackgroundBox(); - // When background is chosen this callback is called with "bool isTiled" arg. - void setUpdateCallback(base::lambda_unique &&updateCallback) { - _updateCallback = std::move(updateCallback); - } - public slots: void onBackgroundChosen(int index); @@ -67,6 +62,5 @@ protected: private: BackgroundInner _inner; - base::lambda_unique _updateCallback; }; diff --git a/Telegram/SourceFiles/boxes/connectionbox.cpp b/Telegram/SourceFiles/boxes/connectionbox.cpp index aab70ac03..8075d8b57 100644 --- a/Telegram/SourceFiles/boxes/connectionbox.cpp +++ b/Telegram/SourceFiles/boxes/connectionbox.cpp @@ -28,14 +28,14 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "mainwindow.h" ConnectionBox::ConnectionBox() : AbstractBox(st::boxWidth) -, _hostInput(this, st::connectionHostInputField, lang(lng_connection_host_ph), cConnectionProxy().host) -, _portInput(this, st::connectionPortInputField, lang(lng_connection_port_ph), QString::number(cConnectionProxy().port)) -, _userInput(this, st::connectionUserInputField, lang(lng_connection_user_ph), cConnectionProxy().user) -, _passwordInput(this, st::connectionPasswordInputField, lang(lng_connection_password_ph), cConnectionProxy().password) -, _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)) -, _tcpProxyRadio(this, qsl("conn_type"), dbictTcpProxy, lang(lng_connection_tcp_proxy_rb), (cConnectionType() == dbictTcpProxy)) -, _tryIPv6(this, lang(lng_connection_try_ipv6), cTryIPv6(), st::defaultBoxCheckbox) +, _hostInput(this, st::connectionHostInputField, lang(lng_connection_host_ph), Global::ConnectionProxy().host) +, _portInput(this, st::connectionPortInputField, lang(lng_connection_port_ph), QString::number(Global::ConnectionProxy().port)) +, _userInput(this, st::connectionUserInputField, lang(lng_connection_user_ph), Global::ConnectionProxy().user) +, _passwordInput(this, st::connectionPasswordInputField, lang(lng_connection_password_ph), Global::ConnectionProxy().password) +, _autoRadio(this, qsl("conn_type"), dbictAuto, lang(lng_connection_auto_rb), (Global::ConnectionType() == dbictAuto)) +, _httpProxyRadio(this, qsl("conn_type"), dbictHttpProxy, lang(lng_connection_http_proxy_rb), (Global::ConnectionType() == dbictHttpProxy)) +, _tcpProxyRadio(this, qsl("conn_type"), dbictTcpProxy, lang(lng_connection_tcp_proxy_rb), (Global::ConnectionType() == dbictTcpProxy)) +, _tryIPv6(this, lang(lng_connection_try_ipv6), Global::TryIPv6(), st::defaultBoxCheckbox) , _save(this, lang(lng_connection_save), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) { @@ -167,7 +167,7 @@ void ConnectionBox::onSubmit() { void ConnectionBox::onSave() { if (_httpProxyRadio.checked() || _tcpProxyRadio.checked()) { - ConnectionProxy p; + ProxyData p; p.host = _hostInput.getLastText().trimmed(); p.user = _userInput.getLastText().trimmed(); p.password = _passwordInput.getLastText().trimmed(); @@ -180,28 +180,32 @@ void ConnectionBox::onSave() { return; } if (_httpProxyRadio.checked()) { - cSetConnectionType(dbictHttpProxy); + Global::SetConnectionType(dbictHttpProxy); } else { - cSetConnectionType(dbictTcpProxy); + Global::SetConnectionType(dbictTcpProxy); } - cSetConnectionProxy(p); + Global::SetConnectionProxy(p); } else { - cSetConnectionType(dbictAuto); - cSetConnectionProxy(ConnectionProxy()); + Global::SetConnectionType(dbictAuto); + Global::SetConnectionProxy(ProxyData()); #ifndef TDESKTOP_DISABLE_NETWORK_PROXY QNetworkProxyFactory::setUseSystemConfiguration(false); QNetworkProxyFactory::setUseSystemConfiguration(true); #endif } - if (cPlatform() == dbipWindows && cTryIPv6() != _tryIPv6.checked()) { - cSetTryIPv6(_tryIPv6.checked()); + if (cPlatform() == dbipWindows && Global::TryIPv6() != _tryIPv6.checked()) { + Global::SetTryIPv6(_tryIPv6.checked()); Local::writeSettings(); + Global::RefConnectionTypeChanged().notify(); + cSetRestarting(true); cSetRestartingToSettings(true); App::quit(); } else { - cSetTryIPv6(_tryIPv6.checked()); + Global::SetTryIPv6(_tryIPv6.checked()); Local::writeSettings(); + Global::RefConnectionTypeChanged().notify(); + MTP::restart(); reinitImageLinkManager(); reinitWebLoadManager(); diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.cpp b/Telegram/SourceFiles/boxes/downloadpathbox.cpp index b5131ff4d..980263537 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.cpp +++ b/Telegram/SourceFiles/boxes/downloadpathbox.cpp @@ -27,28 +27,9 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "ui/filedialog.h" #include "pspecific.h" -namespace internal { -namespace { - -void StartCallback() { -} - -void FinishCallback() { -} - -Notify::SimpleObservedEventRegistrator creator(StartCallback, FinishCallback); - -} // namespace - -Notify::ConnectionId plainRegisterObserver(DownloadPathUpdateHandler &&handler) { - return creator.registerObserver(std_::forward(handler)); -} - -} // namespace interanl - DownloadPathBox::DownloadPathBox() : AbstractBox() -, _path(cDownloadPath()) -, _pathBookmark(cDownloadPathBookmark()) +, _path(Global::DownloadPath()) +, _pathBookmark(Global::DownloadPathBookmark()) , _default(this, qsl("dir_type"), 0, lang(lng_download_path_default_radio), _path.isEmpty()) , _temp(this, qsl("dir_type"), 1, lang(lng_download_path_temp_radio), _path == qsl("tmp")) , _dir(this, qsl("dir_type"), 2, lang(lng_download_path_dir_radio), !_path.isEmpty() && _path != qsl("tmp")) @@ -135,8 +116,8 @@ void DownloadPathBox::onChange() { void DownloadPathBox::onEditPath() { filedialogInit(); QString path, lastPath = cDialogLastPath(); - if (!cDownloadPath().isEmpty() && cDownloadPath() != qstr("tmp")) { - cSetDialogLastPath(cDownloadPath().left(cDownloadPath().size() - (cDownloadPath().endsWith('/') ? 1 : 0))); + if (!Global::DownloadPath().isEmpty() && Global::DownloadPath() != qstr("tmp")) { + cSetDialogLastPath(Global::DownloadPath().left(Global::DownloadPath().size() - (Global::DownloadPath().endsWith('/') ? 1 : 0))); } if (filedialogGetDir(path, lang(lng_download_path_choose))) { if (!path.isEmpty()) { @@ -149,10 +130,10 @@ void DownloadPathBox::onEditPath() { } void DownloadPathBox::onSave() { - cSetDownloadPath(_default.checked() ? QString() : (_temp.checked() ? qsl("tmp") : _path)); - cSetDownloadPathBookmark((_default.checked() || _temp.checked()) ? QByteArray() : _pathBookmark); + Global::SetDownloadPath(_default.checked() ? QString() : (_temp.checked() ? qsl("tmp") : _path)); + Global::SetDownloadPathBookmark((_default.checked() || _temp.checked()) ? QByteArray() : _pathBookmark); Local::writeUserSettings(); - internal::creator.notify(DownloadPathUpdate()); + Global::RefDownloadPathChanged().notify(); onClose(); } diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.h b/Telegram/SourceFiles/boxes/downloadpathbox.h index f6077d709..7c4f26a3b 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.h +++ b/Telegram/SourceFiles/boxes/downloadpathbox.h @@ -23,21 +23,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "abstractbox.h" #include "core/observer.h" -// Just a notification that cDownloadPath() has changed. -struct DownloadPathUpdate { -}; - -namespace internal { -using DownloadPathUpdateHandler = Function; -Notify::ConnectionId plainRegisterObserver(DownloadPathUpdateHandler &&handler); -} // namespace internal - -template -void registerDownloadPathObserver(ObserverType *observer, void (ObserverType::*handler)(const DownloadPathUpdate &)) { - auto connection = internal::plainRegisterObserver(func(observer, handler)); - Notify::observerRegistered(observer, connection); -} - class DownloadPathBox : public AbstractBox { Q_OBJECT diff --git a/Telegram/SourceFiles/core/basic_types.h b/Telegram/SourceFiles/core/basic_types.h index 8bb5d3efb..e89b6255e 100644 --- a/Telegram/SourceFiles/core/basic_types.h +++ b/Telegram/SourceFiles/core/basic_types.h @@ -747,11 +747,9 @@ enum DBIDefaultAttach { dbidaPhoto = 1, }; -struct ConnectionProxy { - ConnectionProxy() : port(0) { - } +struct ProxyData { QString host; - uint32 port; + uint32 port = 0; QString user, password; }; diff --git a/Telegram/SourceFiles/core/observer.h b/Telegram/SourceFiles/core/observer.h index 02fc10bac..f7fc81c22 100644 --- a/Telegram/SourceFiles/core/observer.h +++ b/Telegram/SourceFiles/core/observer.h @@ -331,12 +331,10 @@ public: using Handler = typename CommonObservableData::Handler; Subscription subscribe(Handler &&handler) { - if (_data) { - _data->append(std_::forward(handler)); - } else { - _data = MakeShared>(this, std_::forward(handler)); + if (!_data) { + _data = MakeShared>(this); } - return _data->last(); + return _data->append(std_::forward(handler)); } private: @@ -352,9 +350,9 @@ private: template class Observable : public internal::CommonObservable { public: - void notify(EventType &&event) { + void notify(EventType &&event, bool sync = false) { if (_data) { - _data->notify(std_::move(event)); + _data->notify(std_::move(event), sync); } } @@ -367,20 +365,18 @@ class CommonObservableData : public BaseObservableData { public: using Handler = SubscriptionHandler; - CommonObservableData(CommonObservable *observable, Handler &&handler) : _observable(observable) - , _begin(new Node(observable->_data, std_::forward(handler))) - , _end(_begin) { + CommonObservableData(CommonObservable *observable) : _observable(observable) { } - void append(Handler &&handler) { + Subscription append(Handler &&handler) { auto node = new Node(_observable->_data, std_::forward(handler)); - - _end->next = node; - node->prev = _end; - _end = node; - } - - Subscription last() { + if (_begin) { + _end->next = node; + node->prev = _end; + _end = node; + } else { + _begin = _end = node; + } return { _end, &CommonObservableData::destroyNode }; } @@ -435,15 +431,15 @@ private: } } while (_current); - if (!_begin) { + if (empty()) { _observable->_data.reset(); } } CommonObservable *_observable = nullptr; - Node *_begin; + Node *_begin = nullptr; Node *_current = nullptr; - Node *_end; + Node *_end = nullptr; ObservableCallHandlers _callHandlers; friend class ObservableData; @@ -455,16 +451,24 @@ class ObservableData : public CommonObservableData { public: using CommonObservableData::CommonObservableData; - void notify(EventType &&event) { - if (!_callHandlers) { - _callHandlers = [this]() { - callHandlers(); - }; + void notify(EventType &&event, bool sync) { + if (_handling) { + sync = false; } - if (_events.empty()) { - RegisterPendingObservable(&_callHandlers); + if (sync) { + _events.push_back(std_::move(event)); + callHandlers(); + } else { + if (!_callHandlers) { + _callHandlers = [this]() { + callHandlers(); + }; + } + if (_events.empty()) { + RegisterPendingObservable(&_callHandlers); + } + _events.push_back(std_::move(event)); } - _events.push_back(std_::move(event)); } ~ObservableData() { @@ -473,16 +477,19 @@ public: private: void callHandlers() { + _handling = true; auto events = createAndSwap(_events); for (auto &event : events) { notifyEnumerate([this, &event]() { _current->handler(event); }); } + _handling = false; UnregisterActiveObservable(&_callHandlers); } std_::vector_of_moveable _events; + bool _handling = false; }; @@ -491,16 +498,24 @@ class ObservableData : public CommonObservableData { public: using CommonObservableData::CommonObservableData; - void notify() { - if (!_callHandlers) { - _callHandlers = [this]() { - callHandlers(); - }; + void notify(bool sync) { + if (_handling) { + sync = false; } - if (!_eventsCount) { - RegisterPendingObservable(&_callHandlers); + if (sync) { + ++_eventsCount; + callHandlers(); + } else { + if (!_callHandlers) { + _callHandlers = [this]() { + callHandlers(); + }; + } + if (!_eventsCount) { + RegisterPendingObservable(&_callHandlers); + } + ++_eventsCount; } - ++_eventsCount; } ~ObservableData() { @@ -509,16 +524,19 @@ public: private: void callHandlers() { + _handling = true; auto eventsCount = createAndSwap(_eventsCount); for (int i = 0; i != eventsCount; ++i) { notifyEnumerate([this]() { _current->handler(); }); } + _handling = false; UnregisterActiveObservable(&_callHandlers); } int _eventsCount = 0; + bool _handling = false; }; @@ -527,9 +545,9 @@ private: template <> class Observable : public internal::CommonObservable { public: - void notify() { + void notify(bool sync = false) { if (_data) { - _data->notify(); + _data->notify(sync); } } @@ -553,6 +571,13 @@ protected: _subscriptions[index].destroy(); } + ~Subscriber() { + auto subscriptions = createAndSwap(_subscriptions); + for (auto &subscription : subscriptions) { + subscription.destroy(); + } + } + private: std_::vector_of_moveable _subscriptions; diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index ce4681df0..f48a92755 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -107,3 +107,7 @@ dialogsNewChatButton: RoundButton { textBg: transparent; textBgOver: transparent; } + +settingsEditIcon: icon { + { "dialogs_new_chat", #b7b7b7, point(3px, 9px) } +}; diff --git a/Telegram/SourceFiles/facades.cpp b/Telegram/SourceFiles/facades.cpp index a4294ff16..235bb231b 100644 --- a/Telegram/SourceFiles/facades.cpp +++ b/Telegram/SourceFiles/facades.cpp @@ -30,6 +30,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "boxes/confirmbox.h" #include "layerwidget.h" #include "lang.h" +#include "core/observer.h" Q_DECLARE_METATYPE(ClickHandlerPtr); Q_DECLARE_METATYPE(Qt::MouseButton); @@ -407,7 +408,7 @@ struct Data { int32 LangSystem = languageDefault; QByteArray LastCrashDump; - ConnectionProxy PreLaunchProxy; + ProxyData PreLaunchProxy; }; } // namespace internal @@ -525,7 +526,7 @@ uint64 UserTag() { DefineReadOnlyVar(Sandbox, QString, LangSystemISO); DefineReadOnlyVar(Sandbox, int32, LangSystem); DefineVar(Sandbox, QByteArray, LastCrashDump); -DefineVar(Sandbox, ConnectionProxy, PreLaunchProxy); +DefineVar(Sandbox, ProxyData, PreLaunchProxy); } // namespace Sandbox @@ -581,6 +582,8 @@ struct Data { Adaptive::Layout AdaptiveLayout = Adaptive::NormalLayout; bool AdaptiveForWide = true; + base::Observable AdaptiveChanged; + bool DialogsModeEnabled = false; Dialogs::Mode DialogsMode = Dialogs::Mode::All; bool ModerateModeEnabled = false; @@ -626,6 +629,27 @@ struct Data { MTP::DcOptions DcOptions; CircleMasksMap CircleMasks; + + base::Observable SelfChanged; + + bool AskDownloadPath = false; + QString DownloadPath; + QByteArray DownloadPathBookmark; + base::Observable DownloadPathChanged; + + bool SoundNotify = true; + bool DesktopNotify = true; + bool RestoreSoundNotifyFromTray = false; + bool IncludeMuted = true; + DBINotifyView NotifyView = dbinvShowPreview; + bool WindowsNotifications = true; + bool CustomNotifies = (cPlatform() == dbipMac) ? false : true; + base::Observable NotifySettingsChanged; + + DBIConnectionType ConnectionType = dbictAuto; + bool TryIPv6 = (cPlatform() == dbipWindows) ? false : true; + ProxyData ConnectionProxy; + base::Observable ConnectionTypeChanged; }; } // namespace internal @@ -659,6 +683,8 @@ DefineRefVar(Global, SingleDelayedCall, HandleObservables); DefineVar(Global, Adaptive::Layout, AdaptiveLayout); DefineVar(Global, bool, AdaptiveForWide); +DefineRefVar(Global, base::Observable, AdaptiveChanged); + DefineVar(Global, bool, DialogsModeEnabled); DefineVar(Global, Dialogs::Mode, DialogsMode); DefineVar(Global, bool, ModerateModeEnabled); @@ -705,4 +731,25 @@ DefineVar(Global, MTP::DcOptions, DcOptions); DefineRefVar(Global, CircleMasksMap, CircleMasks); +DefineRefVar(Global, base::Observable, SelfChanged); + +DefineVar(Global, bool, AskDownloadPath); +DefineVar(Global, QString, DownloadPath); +DefineVar(Global, QByteArray, DownloadPathBookmark); +DefineRefVar(Global, base::Observable, DownloadPathChanged); + +DefineVar(Global, bool, SoundNotify); +DefineVar(Global, bool, DesktopNotify); +DefineVar(Global, bool, RestoreSoundNotifyFromTray); +DefineVar(Global, bool, IncludeMuted); +DefineVar(Global, DBINotifyView, NotifyView); +DefineVar(Global, bool, WindowsNotifications); +DefineVar(Global, bool, CustomNotifies); +DefineRefVar(Global, base::Observable, NotifySettingsChanged); + +DefineVar(Global, DBIConnectionType, ConnectionType); +DefineVar(Global, bool, TryIPv6); +DefineVar(Global, ProxyData, ConnectionProxy); +DefineRefVar(Global, base::Observable, ConnectionTypeChanged); + } // namespace Global diff --git a/Telegram/SourceFiles/facades.h b/Telegram/SourceFiles/facades.h index 2fdd64591..d398736f1 100644 --- a/Telegram/SourceFiles/facades.h +++ b/Telegram/SourceFiles/facades.h @@ -21,6 +21,16 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once class LayerWidget; +namespace base { +template +class Observable; +} // namespace base +namespace InlineBots { +namespace Layout { +class ItemBase; +} // namespace Layout +} // namespace InlineBots + namespace App { @@ -42,14 +52,6 @@ void logOutDelayed(); } // namespace App -namespace InlineBots { -namespace Layout { - -class ItemBase; - -} // namespace Layout -} // namespace InlineBots - namespace Ui { void showMediaPreview(DocumentData *document); @@ -142,6 +144,14 @@ void historyMuteUpdated(History *history); void handlePendingHistoryUpdate(); void unreadCounterUpdated(); +enum class ChangeType { + SoundEnabled, + IncludeMuted, + DesktopEnabled, + ViewParams, + UseNative, +}; + } // namespace Notify #define DeclareReadOnlyVar(Type, Name) const Type &Name(); @@ -163,7 +173,7 @@ uint64 UserTag(); DeclareReadOnlyVar(QString, LangSystemISO); DeclareReadOnlyVar(int32, LangSystem); DeclareVar(QByteArray, LastCrashDump); -DeclareVar(ConnectionProxy, PreLaunchProxy); +DeclareVar(ProxyData, PreLaunchProxy); } // namespace Sandbox @@ -234,6 +244,8 @@ DeclareRefVar(SingleDelayedCall, HandleObservables); DeclareVar(Adaptive::Layout, AdaptiveLayout); DeclareVar(bool, AdaptiveForWide); +DeclareRefVar(base::Observable, AdaptiveChanged); + DeclareVar(bool, DialogsModeEnabled); DeclareVar(Dialogs::Mode, DialogsMode); DeclareVar(bool, ModerateModeEnabled); @@ -283,10 +295,35 @@ DeclareVar(MTP::DcOptions, DcOptions); typedef QMap CircleMasksMap; DeclareRefVar(CircleMasksMap, CircleMasks); +DeclareRefVar(base::Observable, SelfChanged); + +DeclareVar(bool, AskDownloadPath); +DeclareVar(QString, DownloadPath); +DeclareVar(QByteArray, DownloadPathBookmark); +DeclareRefVar(base::Observable, DownloadPathChanged); + +DeclareVar(bool, SoundNotify); +DeclareVar(bool, DesktopNotify); +DeclareVar(bool, RestoreSoundNotifyFromTray); +DeclareVar(bool, IncludeMuted); +DeclareVar(DBINotifyView, NotifyView); +DeclareVar(bool, WindowsNotifications); +DeclareVar(bool, CustomNotifies); +DeclareRefVar(base::Observable, NotifySettingsChanged); + +DeclareVar(DBIConnectionType, ConnectionType); +DeclareVar(bool, TryIPv6); +DeclareVar(ProxyData, ConnectionProxy); +DeclareRefVar(base::Observable, ConnectionTypeChanged); + } // namespace Global namespace Adaptive { +inline base::Observable &Changed() { + return Global::RefAdaptiveChanged(); +} + inline bool OneColumn() { return Global::AdaptiveLayout() == OneColumnLayout; } diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp index 579489aa6..2e55c9000 100644 --- a/Telegram/SourceFiles/history.cpp +++ b/Telegram/SourceFiles/history.cpp @@ -699,6 +699,14 @@ HistoryItem *Histories::addNewMessage(const MTPMessage &msg, NewMessageType type return result; } +int Histories::unreadBadge() const { + return _unreadFull - (Global::IncludeMuted() ? 0 : _unreadMuted); +} + +bool Histories::unreadOnlyMuted() const { + return Global::IncludeMuted() ? (_unreadMuted >= _unreadFull) : false; +} + HistoryItem *History::createItem(const MTPMessage &msg, bool applyServiceAction, bool detachExistingItem) { MsgId msgId = 0; switch (msg.type()) { @@ -1492,7 +1500,7 @@ void History::setUnreadCount(int newUnreadCount) { } if (inChatList(Dialogs::Mode::All)) { App::histories().unreadIncrement(newUnreadCount - _unreadCount, mute()); - if (!mute() || cIncludeMuted()) { + if (!mute() || Global::IncludeMuted()) { Notify::unreadCounterUpdated(); } } diff --git a/Telegram/SourceFiles/history.h b/Telegram/SourceFiles/history.h index b830643bc..44c812344 100644 --- a/Telegram/SourceFiles/history.h +++ b/Telegram/SourceFiles/history.h @@ -62,15 +62,11 @@ public: TypingHistories typing; Animation _a_typings; - int32 unreadBadge() const { - return _unreadFull - (cIncludeMuted() ? 0 : _unreadMuted); - } - int32 unreadMutedCount() const { + int unreadBadge() const; + int unreadMutedCount() const { return _unreadMuted; } - bool unreadOnlyMuted() const { - return cIncludeMuted() ? (_unreadMuted >= _unreadFull) : false; - } + bool unreadOnlyMuted() const; void unreadIncrement(int32 count, bool muted) { _unreadFull += count; if (muted) { @@ -86,7 +82,7 @@ public: } private: - int32 _unreadFull, _unreadMuted; + int _unreadFull, _unreadMuted; }; diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 3e56f14a6..ccfb1b5b4 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -45,6 +45,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "localstorage.h" #include "apiwrap.h" #include "window/top_bar_widget.h" +#include "window/chat_background.h" #include "observer_peer.h" #include "playerwidget.h" @@ -361,7 +362,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { } } else if (noHistoryDisplayed) { QPoint dogPos((width() - st::msgDogImg.pxWidth()) / 2, ((height() - st::msgDogImg.pxHeight()) * 4) / 9); - p.drawPixmap(dogPos, *cChatDogImage()); + p.drawPixmap(dogPos, Window::chatBackground()->dog()); } if (!noHistoryDisplayed) { adjustCurrent(r.top()); @@ -3149,6 +3150,8 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent) connect(&_attachDragPhoto, SIGNAL(dropped(const QMimeData*)), this, SLOT(onPhotoDrop(const QMimeData*))); connect(&_updateEditTimeLeftDisplay, SIGNAL(timeout()), this, SLOT(updateField())); + + subscribe(Adaptive::Changed(), [this]() { update(); }); } void HistoryWidget::start() { @@ -5521,10 +5524,6 @@ void HistoryWidget::doneShow() { } } -void HistoryWidget::updateAdaptiveLayout() { - update(); -} - void HistoryWidget::animStop() { if (!_a_show.animating()) return; _a_show.stop(); @@ -8692,8 +8691,8 @@ void HistoryWidget::paintEvent(QPaintEvent *e) { int fromy = (hasTopBar ? (-st::topBarHeight) : 0) + (hasPlayer ? (-st::playerHeight) : 0), x = 0, y = 0; QPixmap cached = App::main()->cachedBackground(fill, x, y); if (cached.isNull()) { - const QPixmap &pix(*cChatBackground()); - if (cTileBackground()) { + auto &pix = Window::chatBackground()->image(); + if (Window::chatBackground()->tile()) { int left = r.left(), top = r.top(), right = r.left() + r.width(), bottom = r.top() + r.height(); float64 w = pix.width() / cRetinaFactor(), h = pix.height() / cRetinaFactor(); int sx = qFloor(left / w), sy = qFloor((top - fromy) / h), cx = qCeil(right / w), cy = qCeil((bottom - fromy) / h); @@ -8731,7 +8730,7 @@ void HistoryWidget::paintEvent(QPaintEvent *e) { if (_scroll.isHidden()) { p.setClipRect(_scroll.geometry()); QPoint dogPos((width() - st::msgDogImg.pxWidth()) / 2, ((height() - _field.height() - 2 * st::sendPadding - st::msgDogImg.pxHeight()) * 4) / 9); - p.drawPixmap(dogPos, *cChatDogImage()); + p.drawPixmap(dogPos, Window::chatBackground()->dog()); } } else { style::font font(st::msgServiceFont); diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index 8c08638a4..d5f625174 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -520,7 +520,7 @@ public: EntitiesInText entitiesFromTextTags(const TextWithTags::Tags &tags); TextWithTags::Tags textTagsFromEntities(const EntitiesInText &entities); -class HistoryWidget : public TWidget, public RPCSender { +class HistoryWidget : public TWidget, public RPCSender, private base::Subscriber { Q_OBJECT public: @@ -614,7 +614,6 @@ public: void step_show(float64 ms, bool timer); void animStop(); - void updateAdaptiveLayout(); void doneShow(); QPoint clampMousePosition(QPoint point); diff --git a/Telegram/SourceFiles/intro/introwidget.cpp b/Telegram/SourceFiles/intro/introwidget.cpp index 09caacd8c..9d2f661fb 100644 --- a/Telegram/SourceFiles/intro/introwidget.cpp +++ b/Telegram/SourceFiles/intro/introwidget.cpp @@ -373,9 +373,6 @@ void IntroWidget::keyPressEvent(QKeyEvent *e) { } } -void IntroWidget::updateAdaptiveLayout() { -} - void IntroWidget::rpcClear() { for (IntroStep *step : _stepHistory) { step->rpcClear(); diff --git a/Telegram/SourceFiles/intro/introwidget.h b/Telegram/SourceFiles/intro/introwidget.h index c569e2a3c..44217efd9 100644 --- a/Telegram/SourceFiles/intro/introwidget.h +++ b/Telegram/SourceFiles/intro/introwidget.h @@ -34,8 +34,6 @@ public: void resizeEvent(QResizeEvent *e) override; void keyPressEvent(QKeyEvent *e) override; - void updateAdaptiveLayout(); - void animShow(const QPixmap &bgAnimCache, bool back = false); void step_show(float64 ms, bool timer); void stop_show(); diff --git a/Telegram/SourceFiles/layerwidget.cpp b/Telegram/SourceFiles/layerwidget.cpp index 0244ffa0e..8e1509c29 100644 --- a/Telegram/SourceFiles/layerwidget.cpp +++ b/Telegram/SourceFiles/layerwidget.cpp @@ -281,9 +281,6 @@ void LayerStackWidget::resizeEvent(QResizeEvent *e) { updateLayerBox(); } -void LayerStackWidget::updateAdaptiveLayout() { -} - void LayerStackWidget::showLayer(LayerWidget *l) { clearLayers(); appendLayer(l); diff --git a/Telegram/SourceFiles/layerwidget.h b/Telegram/SourceFiles/layerwidget.h index 32c642092..ffba58d3f 100644 --- a/Telegram/SourceFiles/layerwidget.h +++ b/Telegram/SourceFiles/layerwidget.h @@ -61,8 +61,6 @@ public: void showFast(); - void updateAdaptiveLayout(); - void showLayer(LayerWidget *l); void showSpecialLayer(LayerWidget *l); void appendLayer(LayerWidget *l); diff --git a/Telegram/SourceFiles/localstorage.cpp b/Telegram/SourceFiles/localstorage.cpp index f8d4a1786..fc0121fa2 100644 --- a/Telegram/SourceFiles/localstorage.cpp +++ b/Telegram/SourceFiles/localstorage.cpp @@ -26,6 +26,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "serialize/serialize_document.h" #include "serialize/serialize_common.h" #include "data/data_drafts.h" +#include "window/chat_background.h" #include "observer_peer.h" #include "mainwidget.h" #include "mainwindow.h" @@ -910,7 +911,7 @@ namespace { stream >> v; if (!_checkStreamStatus(stream)) return false; - cSetSoundNotify(v == 1); + Global::SetSoundNotify(v == 1); } break; case dbiAutoDownload: { @@ -960,7 +961,7 @@ namespace { stream >> v; if (!_checkStreamStatus(stream)) return false; - cSetIncludeMuted(v == 1); + Global::SetIncludeMuted(v == 1); } break; case dbiShowingSavedGifs: { @@ -976,7 +977,7 @@ namespace { stream >> v; if (!_checkStreamStatus(stream)) return false; - cSetDesktopNotify(v == 1); + Global::SetDesktopNotify(v == 1); if (App::wnd()) App::wnd()->updateTrayMenu(); } break; @@ -985,9 +986,9 @@ namespace { stream >> v; if (!_checkStreamStatus(stream)) return false; - cSetWindowsNotifications(v == 1); + Global::SetWindowsNotifications(v == 1); if (cPlatform() == dbipWindows) { - cSetCustomNotifies((App::wnd() ? !App::wnd()->psHasNativeNotifications() : true) || !cWindowsNotifications()); + Global::SetCustomNotifies((App::wnd() ? !App::wnd()->psHasNativeNotifications() : true) || !Global::WindowsNotifications()); } } break; @@ -1011,18 +1012,17 @@ namespace { switch (v) { case dbictHttpProxy: case dbictTcpProxy: { - ConnectionProxy p; + ProxyData p; qint32 port; stream >> p.host >> port >> p.user >> p.password; if (!_checkStreamStatus(stream)) return false; p.port = uint32(port); - cSetConnectionProxy(p); - } - cSetConnectionType(DBIConnectionType(v)); - break; + Global::SetConnectionProxy(p); + Global::SetConnectionType(DBIConnectionType(v)); + } break; case dbictHttpAuto: - default: cSetConnectionType(dbictAuto); break; + default: Global::SetConnectionType(dbictAuto); break; }; } break; @@ -1031,7 +1031,7 @@ namespace { stream >> v; if (!_checkStreamStatus(stream)) return false; - cSetTryIPv6(v == 1); + Global::SetTryIPv6(v == 1); } break; case dbiSeenTrayTooltip: { @@ -1148,10 +1148,8 @@ namespace { stream >> v; if (!_checkStreamStatus(stream)) return false; - cSetTileBackground(v == 1); - if (version < 8005 && !_backgroundKey) { - cSetTileBackground(false); - } + bool tile = (version < 8005 && !_backgroundKey) ? false : (v == 1); + Window::chatBackground()->setTile(tile); } break; case dbiAdaptiveForWide: { @@ -1195,9 +1193,9 @@ namespace { if (!_checkStreamStatus(stream)) return false; switch (v) { - case dbinvShowNothing: cSetNotifyView(dbinvShowNothing); break; - case dbinvShowName: cSetNotifyView(dbinvShowName); break; - default: cSetNotifyView(dbinvShowPreview); break; + case dbinvShowNothing: Global::SetNotifyView(dbinvShowNothing); break; + case dbinvShowName: Global::SetNotifyView(dbinvShowName); break; + default: Global::SetNotifyView(dbinvShowPreview); break; } } break; @@ -1206,7 +1204,7 @@ namespace { stream >> v; if (!_checkStreamStatus(stream)) return false; - cSetAskDownloadPath(v == 1); + Global::SetAskDownloadPath(v == 1); } break; case dbiDownloadPathOld: { @@ -1215,8 +1213,9 @@ namespace { if (!_checkStreamStatus(stream)) return false; if (!v.isEmpty() && v != qstr("tmp") && !v.endsWith('/')) v += '/'; - cSetDownloadPath(v); - cSetDownloadPathBookmark(QByteArray()); + Global::SetDownloadPath(v); + Global::SetDownloadPathBookmark(QByteArray()); + Global::RefDownloadPathChanged().notify(); } break; case dbiDownloadPath: { @@ -1226,9 +1225,10 @@ namespace { if (!_checkStreamStatus(stream)) return false; if (!v.isEmpty() && v != qstr("tmp") && !v.endsWith('/')) v += '/'; - cSetDownloadPath(v); - cSetDownloadPathBookmark(bookmark); + Global::SetDownloadPath(v); + Global::SetDownloadPathBookmark(bookmark); psDownloadPathEnableAccess(); + Global::RefDownloadPathChanged().notify(); } break; case dbiCompressPastedImage: { @@ -1554,7 +1554,7 @@ namespace { } uint32 size = 18 * (sizeof(quint32) + sizeof(qint32)); - size += sizeof(quint32) + Serialize::stringSize(cAskDownloadPath() ? QString() : cDownloadPath()) + Serialize::bytearraySize(cAskDownloadPath() ? QByteArray() : cDownloadPathBookmark()); + size += sizeof(quint32) + Serialize::stringSize(Global::AskDownloadPath() ? QString() : Global::DownloadPath()) + Serialize::bytearraySize(Global::AskDownloadPath() ? QByteArray() : Global::DownloadPathBookmark()); size += sizeof(quint32) + sizeof(qint32) + (cRecentEmojisPreload().isEmpty() ? cGetRecentEmojis().size() : cRecentEmojisPreload().size()) * (sizeof(uint64) + sizeof(ushort)); 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)); @@ -1567,19 +1567,19 @@ namespace { EncryptedDescriptor data(size); data.stream << quint32(dbiSendKey) << qint32(cCtrlEnter() ? dbiskCtrlEnter : dbiskEnter); - data.stream << quint32(dbiTileBackground) << qint32(cTileBackground() ? 1 : 0); + data.stream << quint32(dbiTileBackground) << qint32(Window::chatBackground()->tile() ? 1 : 0); data.stream << quint32(dbiAdaptiveForWide) << qint32(Global::AdaptiveForWide() ? 1 : 0); data.stream << quint32(dbiAutoLock) << qint32(cAutoLock()); data.stream << quint32(dbiReplaceEmojis) << qint32(cReplaceEmojis() ? 1 : 0); data.stream << quint32(dbiDefaultAttach) << qint32(cDefaultAttach()); - data.stream << quint32(dbiSoundNotify) << qint32(cSoundNotify()); - data.stream << quint32(dbiIncludeMuted) << qint32(cIncludeMuted()); + data.stream << quint32(dbiSoundNotify) << qint32(Global::SoundNotify()); + data.stream << quint32(dbiIncludeMuted) << qint32(Global::IncludeMuted()); data.stream << quint32(dbiShowingSavedGifs) << qint32(cShowingSavedGifs()); - data.stream << quint32(dbiDesktopNotify) << qint32(cDesktopNotify()); - data.stream << quint32(dbiNotifyView) << qint32(cNotifyView()); - data.stream << quint32(dbiWindowsNotifications) << qint32(cWindowsNotifications()); - data.stream << quint32(dbiAskDownloadPath) << qint32(cAskDownloadPath()); - data.stream << quint32(dbiDownloadPath) << (cAskDownloadPath() ? QString() : cDownloadPath()) << (cAskDownloadPath() ? QByteArray() : cDownloadPathBookmark()); + data.stream << quint32(dbiDesktopNotify) << qint32(Global::DesktopNotify()); + data.stream << quint32(dbiNotifyView) << qint32(Global::NotifyView()); + data.stream << quint32(dbiWindowsNotifications) << qint32(Global::WindowsNotifications()); + data.stream << quint32(dbiAskDownloadPath) << qint32(Global::AskDownloadPath()); + data.stream << quint32(dbiDownloadPath) << (Global::AskDownloadPath() ? QString() : Global::DownloadPath()) << (Global::AskDownloadPath() ? QByteArray() : Global::DownloadPathBookmark()); data.stream << quint32(dbiCompressPastedImage) << qint32(cCompressPastedImage()); data.stream << quint32(dbiDialogLastPath) << cDialogLastPath(); data.stream << quint32(dbiSongVolume) << qint32(qRound(Global::SongVolume() * 1e6)); @@ -2203,8 +2203,8 @@ namespace Local { size += sizeof(quint32) + Serialize::stringSize(cLangFile()); size += sizeof(quint32) + sizeof(qint32); - if (cConnectionType() == dbictHttpProxy || cConnectionType() == dbictTcpProxy) { - const ConnectionProxy &proxy(cConnectionProxy()); + if (Global::ConnectionType() == dbictHttpProxy || Global::ConnectionType() == dbictTcpProxy) { + auto &proxy = Global::ConnectionProxy(); size += Serialize::stringSize(proxy.host) + sizeof(qint32) + Serialize::stringSize(proxy.user) + Serialize::stringSize(proxy.password); } @@ -2231,12 +2231,12 @@ namespace Local { } data.stream << quint32(dbiLangFile) << cLangFile(); - data.stream << quint32(dbiConnectionType) << qint32(cConnectionType()); - if (cConnectionType() == dbictHttpProxy || cConnectionType() == dbictTcpProxy) { - const ConnectionProxy &proxy(cConnectionProxy()); + data.stream << quint32(dbiConnectionType) << qint32(Global::ConnectionType()); + if (Global::ConnectionType() == dbictHttpProxy || Global::ConnectionType() == dbictTcpProxy) { + auto &proxy = Global::ConnectionProxy(); data.stream << proxy.host << qint32(proxy.port) << proxy.user << proxy.password; } - data.stream << quint32(dbiTryIPv6) << qint32(cTryIPv6()); + data.stream << quint32(dbiTryIPv6) << qint32(Global::TryIPv6()); TWindowPos pos(cWindowPos()); data.stream << quint32(dbiWindowPosition) << qint32(pos.x) << qint32(pos.y) << qint32(pos.w) << qint32(pos.h) << qint32(pos.moncrc) << qint32(pos.maximized); @@ -3609,8 +3609,8 @@ namespace Local { bg.stream >> id; if (!id || id == DefaultChatBackground) { if (bg.version < 8005) { - if (!id) cSetTileBackground(!DefaultChatBackground); App::initBackground(DefaultChatBackground, QImage(), true); + if (!id) Window::chatBackground()->setTile(!DefaultChatBackground); } else { App::initBackground(id, QImage(), true); } diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 7fe3997b2..a7d0360d7 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -51,6 +51,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "media/media_audio.h" #include "core/qthelp_regex.h" #include "core/qthelp_url.h" +#include "window/chat_background.h" StackItemSection::StackItemSection(std_::unique_ptr &&memento) : StackItem(nullptr) , _memento(std_::move(memento)) { @@ -103,8 +104,16 @@ MainWidget::MainWidget(MainWindow *window) : TWidget(window) _webPageUpdater.setSingleShot(true); connect(&_webPageUpdater, SIGNAL(timeout()), this, SLOT(webPagesUpdate())); + subscribe(Window::chatBackground(), [this](const Window::ChatBackgroundUpdate &update) { + using Update = Window::ChatBackgroundUpdate; + if (update.type == Update::Type::New || update.type == Update::Type::Changed) { + clearCachedBackground(); + } + }); connect(&_cacheBackgroundTimer, SIGNAL(timeout()), this, SLOT(onCacheBackground())); + subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); }); + _dialogs->show(); if (Adaptive::OneColumn()) { _history->hide(); @@ -1007,8 +1016,8 @@ bool MainWidget::sendMessageFail(const RPCError &error) { } void MainWidget::onCacheBackground() { - const QPixmap &bg(*cChatBackground()); - if (cTileBackground()) { + auto &bg = Window::chatBackground()->image(); + if (Window::chatBackground()->tile()) { QImage result(_willCacheFor.width() * cIntRetinaFactor(), _willCacheFor.height() * cIntRetinaFactor(), QImage::Format_RGB32); result.setDevicePixelRatio(cRetinaFactor()); { @@ -1508,9 +1517,10 @@ void MainWidget::loadFailed(mtpFileLoader *loader, bool started, const char *ret } void MainWidget::onDownloadPathSettings() { - cSetDownloadPath(QString()); - cSetDownloadPathBookmark(QByteArray()); + Global::SetDownloadPath(QString()); + Global::SetDownloadPathBookmark(QByteArray()); Ui::showLayer(new DownloadPathBox()); + Global::RefDownloadPathChanged().notify(); } void MainWidget::onSharePhoneWithBot(PeerData *recipient) { @@ -1766,6 +1776,7 @@ bool MainWidget::isIdle() const { void MainWidget::clearCachedBackground() { _cachedBackground = QPixmap(); _cacheBackgroundTimer.stop(); + update(); } QPixmap MainWidget::cachedBackground(const QRect &forRect, int &x, int &y) { @@ -1782,7 +1793,7 @@ QPixmap MainWidget::cachedBackground(const QRect &forRect, int &x, int &y) { } void MainWidget::backgroundParams(const QRect &forRect, QRect &to, QRect &from) const { - const QSize &bg(cChatBackground()->size()); + auto &bg = Window::chatBackground()->image().size(); if (uint64(bg.width()) * forRect.height() > uint64(bg.height()) * forRect.width()) { float64 pxsize = forRect.height() / float64(bg.height()); int takewidth = qCeil(forRect.width() / pxsize); @@ -2689,11 +2700,6 @@ void MainWidget::keyPressEvent(QKeyEvent *e) { void MainWidget::updateAdaptiveLayout() { showAll(); _sideShadow.setVisible(!Adaptive::OneColumn()); - if (_wideSection) { - _wideSection->updateAdaptiveLayout(); - } - _topBar->updateAdaptiveLayout(); - _history->updateAdaptiveLayout(); } bool MainWidget::needBackButton() { diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index e0645a95b..8925f7091 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -127,7 +127,7 @@ class ItemBase; } // namespace Layout } // namespace InlineBots -class MainWidget : public TWidget, public RPCSender { +class MainWidget : public TWidget, public RPCSender, private base::Subscriber { Q_OBJECT public: @@ -138,7 +138,6 @@ public: void resizeEvent(QResizeEvent *e) override; void keyPressEvent(QKeyEvent *e) override; - void updateAdaptiveLayout(); bool needBackButton(); // Temporary methods, while top bar was not done inside HistoryWidget / OverviewWidget. @@ -318,7 +317,6 @@ public: bool isIdle() const; - void clearCachedBackground(); QPixmap cachedBackground(const QRect &forRect, int &x, int &y); void backgroundParams(const QRect &forRect, QRect &to, QRect &from) const; void updateScrollColors(); @@ -480,6 +478,8 @@ private slots: void onDeletePhotoSure(); private: + void updateAdaptiveLayout(); + void sendReadRequest(PeerData *peer, MsgId upTo); void channelReadDone(PeerData *peer, const MTPBool &result); void historyReadDone(PeerData *peer, const MTPmessages_AffectedMessages &result); @@ -562,6 +562,8 @@ private: void overviewPreloaded(PeerData *data, const MTPmessages_Messages &result, mtpRequestId req); bool overviewFailed(PeerData *data, const RPCError &error, mtpRequestId req); + void clearCachedBackground(); + Animation _a_show; QPixmap _cacheUnder, _cacheOver; anim::ivalue a_coordUnder, a_coordOver; diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index d11a71f43..d84ee853e 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -171,7 +171,7 @@ void NotifyWindow::updateNotifyDisplay() { p.fillRect(st::notifyBorderWidth, h - st::notifyBorderWidth, w - st::notifyBorderWidth, st::notifyBorderWidth, st::notifyBorder->b); p.fillRect(0, st::notifyBorderWidth, st::notifyBorderWidth, h - st::notifyBorderWidth, st::notifyBorder->b); - if (!App::passcoded() && cNotifyView() <= dbinvShowName) { + if (!App::passcoded() && Global::NotifyView() <= dbinvShowName) { history->peer->loadUserpic(true, true); history->peer->paintUserpicLeft(p, st::notifyPhotoSize, st::notifyPhotoPos.x(), st::notifyPhotoPos.y(), width()); } else { @@ -182,7 +182,7 @@ void NotifyWindow::updateNotifyDisplay() { int32 itemWidth = w - st::notifyPhotoPos.x() - st::notifyPhotoSize - st::notifyTextLeft - st::notifyClosePos.x() - st::notifyClose.width; QRect rectForName(st::notifyPhotoPos.x() + st::notifyPhotoSize + st::notifyTextLeft, st::notifyTextTop, itemWidth, st::msgNameFont->height); - if (!App::passcoded() && cNotifyView() <= dbinvShowName) { + if (!App::passcoded() && Global::NotifyView() <= dbinvShowName) { if (history->peer->isChat() || history->peer->isMegagroup()) { p.drawSprite(QPoint(rectForName.left() + st::dialogsChatImgPos.x(), rectForName.top() + st::dialogsChatImgPos.y()), st::dlgChatImg); rectForName.setLeft(rectForName.left() + st::dialogsImgSkip); @@ -201,7 +201,7 @@ void NotifyWindow::updateNotifyDisplay() { p.setPen(st::dialogsDateFg); p.drawText(rectForName.left() + rectForName.width() + st::dialogsDateSkip, rectForName.top() + st::dialogsTextFont->ascent, dt); - if (!App::passcoded() && cNotifyView() <= dbinvShowPreview) { + if (!App::passcoded() && Global::NotifyView() <= dbinvShowPreview) { const HistoryItem *textCachedFor = 0; Text itemTextCache(itemWidth); QRect r(st::notifyPhotoPos.x() + st::notifyPhotoSize + st::notifyTextLeft, st::notifyItemTop + st::msgNameFont->height, itemWidth, 2 * st::dialogsTextFont->height); @@ -226,7 +226,7 @@ void NotifyWindow::updateNotifyDisplay() { } p.setPen(st::dialogsNameFg); - if (!App::passcoded() && cNotifyView() <= dbinvShowName) { + if (!App::passcoded() && Global::NotifyView() <= dbinvShowName) { history->peer->dialogName().drawElided(p, rectForName.left(), rectForName.top(), rectForName.width()); } else { p.setFont(st::msgNameFont->f); @@ -372,6 +372,19 @@ MainWindow::MainWindow() { iconbig32 = iconbig256.scaledToWidth(32, Qt::SmoothTransformation); iconbig64 = iconbig256.scaledToWidth(64, Qt::SmoothTransformation); + subscribe(Global::RefNotifySettingsChanged(), [this](const Notify::ChangeType &type) { + if (type == Notify::ChangeType::DesktopEnabled) { + updateTrayMenu(); + notifyClear(); + } else if (type == Notify::ChangeType::ViewParams) { + notifyUpdateAll(); + } else if (type == Notify::ChangeType::UseNative) { + notifyClearFast(); + } else if (type == Notify::ChangeType::IncludeMuted) { + Notify::unreadCounterUpdated(); + } + }); + if (objectName().isEmpty()) { setObjectName(qsl("MainWindow")); } @@ -396,6 +409,8 @@ MainWindow::MainWindow() { connect(this, SIGNAL(imageLoaded()), this, SLOT(notifyUpdateAllPhotos())); + subscribe(Global::RefSelfChanged(), [this]() { updateGlobalMenu(); }); + setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_OpaquePaintEvent); } @@ -455,7 +470,7 @@ void MainWindow::firstShow() { #else trayIconMenu = new QMenu(this); #endif - auto notificationItem = lang(cDesktopNotify() + auto notificationItem = lang(Global::DesktopNotify() ? lng_disable_notifications_from_tray : lng_enable_notifications_from_tray); if (cPlatform() == dbipWindows || cPlatform() == dbipMac || cPlatform() == dbipMacOld) { @@ -716,7 +731,7 @@ void MainWindow::ui_hideSettingsAndLayer(ShowLayerOptions options) { void MainWindow::mtpStateChanged(int32 dc, int32 state) { if (dc == MTP::maindc()) { updateTitleStatus(); -// if (settings) settings->updateConnectionType(); TODO + Global::RefConnectionTypeChanged().notify(); } } @@ -1108,7 +1123,7 @@ void MainWindow::updateTrayMenu(bool force) { if (!trayIconMenu || (cPlatform() == dbipWindows && !force)) return; bool active = isActive(false); - QString notificationItem = lang(cDesktopNotify() + QString notificationItem = lang(Global::DesktopNotify() ? lng_disable_notifications_from_tray : lng_enable_notifications_from_tray); if (cPlatform() == dbipWindows || cPlatform() == dbipMac || cPlatform() == dbipMacOld) { @@ -1255,15 +1270,28 @@ void MainWindow::toggleDisplayNotifyFromTray() { Ui::showLayer(new InformBox(lang(lng_passcode_need_unblock))); return; } - cSetDesktopNotify(!cDesktopNotify()); - if (settings) { -// settings->updateDisplayNotify(); TODO - } else { - if (!cDesktopNotify()) { - notifyClear(); + + bool soundNotifyChanged = false; + Global::SetDesktopNotify(!Global::DesktopNotify()); + if (Global::DesktopNotify()) { + if (Global::RestoreSoundNotifyFromTray() && !Global::SoundNotify()) { + Global::SetSoundNotify(true); + Global::SetRestoreSoundNotifyFromTray(false); + soundNotifyChanged = true; } - Local::writeUserSettings(); - updateTrayMenu(); + } else { + if (Global::SoundNotify()) { + Global::SetSoundNotify(false); + Global::SetRestoreSoundNotifyFromTray(true); + soundNotifyChanged = true; + } else { + Global::SetRestoreSoundNotifyFromTray(false); + } + } + Local::writeUserSettings(); + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::DesktopEnabled); + if (soundNotifyChanged) { + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::SoundEnabled); } } @@ -1294,7 +1322,7 @@ void MainWindow::resizeEvent(QResizeEvent *e) { } if (layout != Global::AdaptiveLayout()) { Global::SetAdaptiveLayout(layout); - updateAdaptiveLayout(); + Adaptive::Changed().notify(true); } title->setGeometry(0, 0, width(), st::titleHeight); if (layerBg) layerBg->resize(width(), height()); @@ -1303,13 +1331,6 @@ void MainWindow::resizeEvent(QResizeEvent *e) { emit resized(QSize(width(), height() - st::titleHeight)); } -void MainWindow::updateAdaptiveLayout() { - title->updateAdaptiveLayout(); - if (main) main->updateAdaptiveLayout(); - if (intro) intro->updateAdaptiveLayout(); - if (layerBg) layerBg->updateAdaptiveLayout(); -} - MainWindow::TempDirState MainWindow::tempDirState() { if (_clearManager && _clearManager->hasTask(Local::ClearManagerDownloads)) { return TempDirRemoving; @@ -1407,7 +1428,7 @@ void MainWindow::notifySchedule(History *history, HistoryItem *item) { uint64 when = ms + delay; notifyWhenAlerts[history].insert(when, notifyByFrom); - if (cDesktopNotify() && !psSkipDesktopNotify()) { + if (Global::DesktopNotify() && !psSkipDesktopNotify()) { NotifyWhenMaps::iterator i = notifyWhenMaps.find(history); if (i == notifyWhenMaps.end()) { i = notifyWhenMaps.insert(history, NotifyWhenMap()); @@ -1553,14 +1574,14 @@ void MainWindow::notifyShowNext(NotifyWindow *remove) { App::playSound(); } - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { for (NotifyWindows::const_iterator i = notifyWindows.cbegin(), e = notifyWindows.cend(); i != e; ++i) { int32 ind = (*i)->index(); if (ind < 0) continue; --count; } } - if (count <= 0 || notifyWaiters.isEmpty() || !cDesktopNotify() || psSkipDesktopNotify()) { + if (count <= 0 || notifyWaiters.isEmpty() || !Global::DesktopNotify() || psSkipDesktopNotify()) { if (nextAlert) { notifyWaitTimer.start(nextAlert - ms); } @@ -1656,7 +1677,7 @@ void MainWindow::notifyShowNext(NotifyWindow *remove) { } while (nextNotify); } - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { NotifyWindow *notify = new NotifyWindow(notifyItem, x, y, fwdCount); notifyWindows.push_back(notify); psNotifyShown(notify); @@ -1689,7 +1710,7 @@ void MainWindow::notifyShowNext(NotifyWindow *remove) { } void MainWindow::notifyItemRemoved(HistoryItem *item) { - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { for (NotifyWindows::const_iterator i = notifyWindows.cbegin(), e = notifyWindows.cend(); i != e; ++i) { (*i)->itemRemoved(item); } @@ -1697,7 +1718,7 @@ void MainWindow::notifyItemRemoved(HistoryItem *item) { } void MainWindow::notifyStopHiding() { - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { for (NotifyWindows::const_iterator i = notifyWindows.cbegin(), e = notifyWindows.cend(); i != e; ++i) { (*i)->stopHiding(); } @@ -1705,7 +1726,7 @@ void MainWindow::notifyStopHiding() { } void MainWindow::notifyStartHiding() { - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { for (NotifyWindows::const_iterator i = notifyWindows.cbegin(), e = notifyWindows.cend(); i != e; ++i) { (*i)->startHiding(); } @@ -1713,7 +1734,7 @@ void MainWindow::notifyStartHiding() { } void MainWindow::notifyUpdateAllPhotos() { - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { for (NotifyWindows::const_iterator i = notifyWindows.cbegin(), e = notifyWindows.cend(); i != e; ++i) { (*i)->updatePeerPhoto(); } @@ -1726,7 +1747,7 @@ void MainWindow::app_activateClickHandler(ClickHandlerPtr handler, Qt::MouseButt } void MainWindow::notifyUpdateAll() { - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { for (NotifyWindows::const_iterator i = notifyWindows.cbegin(), e = notifyWindows.cend(); i != e; ++i) { (*i)->updateNotifyDisplay(); } @@ -1735,7 +1756,7 @@ void MainWindow::notifyUpdateAll() { } void MainWindow::notifyActivateAll() { - if (cCustomNotifies()) { + if (Global::CustomNotifies()) { for (NotifyWindows::const_iterator i = notifyWindows.cbegin(), e = notifyWindows.cend(); i != e; ++i) { psActivateNotify(*i); } @@ -2758,7 +2779,7 @@ void LastCrashedWindow::updateControls() { } void LastCrashedWindow::onNetworkSettings() { - const ConnectionProxy &p(Sandbox::PreLaunchProxy()); + auto &p = Sandbox::PreLaunchProxy(); NetworkSettingsWindow *box = new NetworkSettingsWindow(this, p.host, p.port ? p.port : 80, p.user, p.password); connect(box, SIGNAL(saved(QString, quint32, QString, QString)), this, SLOT(onNetworkSettingsSaved(QString, quint32, QString, QString))); box->show(); diff --git a/Telegram/SourceFiles/mainwindow.h b/Telegram/SourceFiles/mainwindow.h index 413268c20..edd20a794 100644 --- a/Telegram/SourceFiles/mainwindow.h +++ b/Telegram/SourceFiles/mainwindow.h @@ -126,7 +126,7 @@ typedef QList NotifyWindows; class MediaPreviewWidget; -class MainWindow : public Platform::MainWindow { +class MainWindow : public Platform::MainWindow, private base::Subscriber { Q_OBJECT public: @@ -151,7 +151,6 @@ public: void paintEvent(QPaintEvent *e); void resizeEvent(QResizeEvent *e); - void updateAdaptiveLayout(); void setupPasscode(bool anim); void clearPasscode(); diff --git a/Telegram/SourceFiles/mediaview.cpp b/Telegram/SourceFiles/mediaview.cpp index 44669a276..4f3b2604e 100644 --- a/Telegram/SourceFiles/mediaview.cpp +++ b/Telegram/SourceFiles/mediaview.cpp @@ -773,17 +773,17 @@ PeerData *MediaView::ui_getPeerForMouseAction() { } void MediaView::onDownload() { - if (cAskDownloadPath()) { + if (Global::AskDownloadPath()) { return onSaveAs(); } QString path; - if (cDownloadPath().isEmpty()) { + if (Global::DownloadPath().isEmpty()) { path = psDownloadPath(); - } else if (cDownloadPath() == qsl("tmp")) { + } else if (Global::DownloadPath() == qsl("tmp")) { path = cTempDir(); } else { - path = cDownloadPath(); + path = Global::DownloadPath(); } QString toName; if (_doc) { diff --git a/Telegram/SourceFiles/mtproto/connection.cpp b/Telegram/SourceFiles/mtproto/connection.cpp index 79e787e94..32949bf62 100644 --- a/Telegram/SourceFiles/mtproto/connection.cpp +++ b/Telegram/SourceFiles/mtproto/connection.cpp @@ -513,7 +513,7 @@ QString ConnectionPrivate::transport() const { return QString(); } QString result = (_conn4 ? _conn4 : _conn6)->transport(); - if (!result.isEmpty() && cTryIPv6()) result += (_conn4 ? "/IPv4" : "/IPv6"); + if (!result.isEmpty() && Global::TryIPv6()) result += (_conn4 ? "/IPv4" : "/IPv6"); return result; } @@ -1130,15 +1130,15 @@ void ConnectionPrivate::socketStart(bool afterConfig) { } } } - bool noIPv4 = !port[IPv4address][HttpProtocol], noIPv6 = (!cTryIPv6() || !port[IPv6address][HttpProtocol]); + bool noIPv4 = !port[IPv4address][HttpProtocol], noIPv6 = (!Global::TryIPv6() || !port[IPv6address][HttpProtocol]); if (noIPv4 && noIPv6) { if (afterConfig) { if (noIPv4) LOG(("MTP Error: DC %1 options for IPv4 over HTTP not found right after config load!").arg(dc)); - if (cTryIPv6() && noIPv6) LOG(("MTP Error: DC %1 options for IPv6 over HTTP not found right after config load!").arg(dc)); + if (Global::TryIPv6() && noIPv6) LOG(("MTP Error: DC %1 options for IPv6 over HTTP not found right after config load!").arg(dc)); return restart(); } if (noIPv4) DEBUG_LOG(("MTP Info: DC %1 options for IPv4 over HTTP not found, waiting for config").arg(dc)); - if (cTryIPv6() && noIPv6) DEBUG_LOG(("MTP Info: DC %1 options for IPv6 over HTTP not found, waiting for config").arg(dc)); + if (Global::TryIPv6() && noIPv6) DEBUG_LOG(("MTP Info: DC %1 options for IPv6 over HTTP not found, waiting for config").arg(dc)); connect(configLoader(), SIGNAL(loaded()), this, SLOT(onConfigLoaded())); configLoader()->load(); return; @@ -1273,7 +1273,7 @@ void ConnectionPrivate::onPingSendForce() { } void ConnectionPrivate::onWaitReceivedFailed() { - if (cConnectionType() != dbictAuto && cConnectionType() != dbictTcpProxy) { + if (Global::ConnectionType() != dbictAuto && Global::ConnectionType() != dbictTcpProxy) { return; } diff --git a/Telegram/SourceFiles/mtproto/connection_abstract.cpp b/Telegram/SourceFiles/mtproto/connection_abstract.cpp index 1e6d96fc3..a9450d92e 100644 --- a/Telegram/SourceFiles/mtproto/connection_abstract.cpp +++ b/Telegram/SourceFiles/mtproto/connection_abstract.cpp @@ -78,9 +78,9 @@ MTPResPQ AbstractConnection::readPQFakeReply(const mtpBuffer &buffer) { } AbstractConnection *AbstractConnection::create(QThread *thread) { - if (cConnectionType() == dbictHttpProxy) { + if (Global::ConnectionType() == dbictHttpProxy) { return new HTTPConnection(thread); - } else if (cConnectionType() == dbictTcpProxy) { + } else if (Global::ConnectionType() == dbictTcpProxy) { return new TCPConnection(thread); } return new AutoConnection(thread); diff --git a/Telegram/SourceFiles/overviewwidget.cpp b/Telegram/SourceFiles/overviewwidget.cpp index b10530130..efbf98167 100644 --- a/Telegram/SourceFiles/overviewwidget.cpp +++ b/Telegram/SourceFiles/overviewwidget.cpp @@ -26,6 +26,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "boxes/photocropbox.h" #include "ui/filedialog.h" #include "window/top_bar_widget.h" +#include "window/chat_background.h" #include "lang.h" #include "mainwindow.h" #include "mainwidget.h" @@ -812,7 +813,7 @@ void OverviewInner::paintEvent(QPaintEvent *e) { if (_history->overview[_type].isEmpty() && (!_migrated || !_history->overviewLoaded(_type) || _migrated->overview[_type].isEmpty())) { QPoint dogPos((_width - st::msgDogImg.pxWidth()) / 2, ((height() - st::msgDogImg.pxHeight()) * 4) / 9); - p.drawPixmap(dogPos, *cChatDogImage()); + p.drawPixmap(dogPos, Window::chatBackground()->dog()); return; } else if (_inSearch && _searchResults.isEmpty() && _searchFull && (!_migrated || _searchFullMigrated) && !_searchTimer.isActive()) { p.setFont(st::noContactsFont->f); diff --git a/Telegram/SourceFiles/platform/mac/main_window_mac.mm b/Telegram/SourceFiles/platform/mac/main_window_mac.mm index c849827fc..149e68803 100644 --- a/Telegram/SourceFiles/platform/mac/main_window_mac.mm +++ b/Telegram/SourceFiles/platform/mac/main_window_mac.mm @@ -483,12 +483,12 @@ void MainWindow::psNotifyShown(NotifyWindow *w) { } void MainWindow::psPlatformNotify(HistoryItem *item, int32 fwdCount) { - QString title = (!App::passcoded() && cNotifyView() <= dbinvShowName && !Global::ScreenIsLocked()) ? item->history()->peer->name : qsl("Telegram Desktop"); - QString subtitle = (!App::passcoded() && cNotifyView() <= dbinvShowName && !Global::ScreenIsLocked()) ? item->notificationHeader() : QString(); - QPixmap pix = (!App::passcoded() && cNotifyView() <= dbinvShowName && !Global::ScreenIsLocked()) ? item->history()->peer->genUserpic(st::notifyMacPhotoSize) : QPixmap(); - QString msg = (!App::passcoded() && cNotifyView() <= dbinvShowPreview && !Global::ScreenIsLocked()) ? (fwdCount < 2 ? item->notificationText() : lng_forward_messages(lt_count, fwdCount)) : lang(lng_notification_preview); + QString title = (!App::passcoded() && Global::NotifyView() <= dbinvShowName && !Global::ScreenIsLocked()) ? item->history()->peer->name : qsl("Telegram Desktop"); + QString subtitle = (!App::passcoded() && Global::NotifyView() <= dbinvShowName && !Global::ScreenIsLocked()) ? item->notificationHeader() : QString(); + QPixmap pix = (!App::passcoded() && Global::NotifyView() <= dbinvShowName && !Global::ScreenIsLocked()) ? item->history()->peer->genUserpic(st::notifyMacPhotoSize) : QPixmap(); + QString msg = (!App::passcoded() && Global::NotifyView() <= dbinvShowPreview && !Global::ScreenIsLocked()) ? (fwdCount < 2 ? item->notificationText() : lng_forward_messages(lt_count, fwdCount)) : lang(lng_notification_preview); - bool withReply = !App::passcoded() && (cNotifyView() <= dbinvShowPreview && !Global::ScreenIsLocked()) && item->history()->peer->canWrite(); + bool withReply = !App::passcoded() && (Global::NotifyView() <= dbinvShowPreview && !Global::ScreenIsLocked()) && item->history()->peer->canWrite(); _private.showNotify(item->history()->peer->id, item->id, pix, title, subtitle, msg, withReply); } diff --git a/Telegram/SourceFiles/platform/win/main_window_win.cpp b/Telegram/SourceFiles/platform/win/main_window_win.cpp index 0dc587238..789d6fd79 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.cpp +++ b/Telegram/SourceFiles/platform/win/main_window_win.cpp @@ -886,9 +886,9 @@ bool MainWindow::psHasNativeNotifications() { Q_DECLARE_METATYPE(QMargins); void MainWindow::psFirstShow() { if (Toasts::supported()) { - cSetCustomNotifies(!cWindowsNotifications()); + Global::SetCustomNotifies(!Global::WindowsNotifications()); } else { - cSetCustomNotifies(true); + Global::SetCustomNotifies(true); } _psShadowWindows.init(_shActive); @@ -1088,10 +1088,10 @@ void MainWindow::psNotifyShown(NotifyWindow *w) { } void MainWindow::psPlatformNotify(HistoryItem *item, int32 fwdCount) { - QString title = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->history()->peer->name : qsl("Telegram Desktop"); - QString subtitle = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->notificationHeader() : QString(); - bool showpix = (!App::passcoded() && cNotifyView() <= dbinvShowName); - QString msg = (!App::passcoded() && cNotifyView() <= dbinvShowPreview) ? (fwdCount < 2 ? item->notificationText() : lng_forward_messages(lt_count, fwdCount)) : lang(lng_notification_preview); + QString title = (!App::passcoded() && Global::NotifyView() <= dbinvShowName) ? item->history()->peer->name : qsl("Telegram Desktop"); + QString subtitle = (!App::passcoded() && Global::NotifyView() <= dbinvShowName) ? item->notificationHeader() : QString(); + bool showpix = (!App::passcoded() && Global::NotifyView() <= dbinvShowName); + QString msg = (!App::passcoded() && Global::NotifyView() <= dbinvShowPreview) ? (fwdCount < 2 ? item->notificationText() : lng_forward_messages(lt_count, fwdCount)) : lang(lng_notification_preview); Toasts::create(item->history()->peer, item->id, showpix, title, subtitle, msg); } diff --git a/Telegram/SourceFiles/profile/profile_widget.cpp b/Telegram/SourceFiles/profile/profile_widget.cpp index 8c25e3bd4..ea63da7ed 100644 --- a/Telegram/SourceFiles/profile/profile_widget.cpp +++ b/Telegram/SourceFiles/profile/profile_widget.cpp @@ -41,6 +41,7 @@ Widget::Widget(QWidget *parent, PeerData *peer) : Window::SectionWidget(parent) _fixedBarShadow->setMode(ToggleableShadow::Mode::HiddenFast); _fixedBarShadow->raise(); updateAdaptiveLayout(); + subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); }); _scroll->setOwnedWidget(_inner); _scroll->move(0, _fixedBar->height()); diff --git a/Telegram/SourceFiles/profile/profile_widget.h b/Telegram/SourceFiles/profile/profile_widget.h index b1ef6e06a..2bc9b91e7 100644 --- a/Telegram/SourceFiles/profile/profile_widget.h +++ b/Telegram/SourceFiles/profile/profile_widget.h @@ -48,8 +48,6 @@ public: void setInnerFocus() override; - void updateAdaptiveLayout() override; - bool showInternal(const Window::SectionMemento *memento) override; std_::unique_ptr createMemento() const override; @@ -65,6 +63,8 @@ private slots: void onScroll(); private: + void updateAdaptiveLayout(); + friend class SectionMemento; ChildWidget _scroll; diff --git a/Telegram/SourceFiles/settings.cpp b/Telegram/SourceFiles/settings.cpp index f24dcbb36..3196e7e8a 100644 --- a/Telegram/SourceFiles/settings.cpp +++ b/Telegram/SourceFiles/settings.cpp @@ -47,11 +47,6 @@ QString gLangErrors; QString gDialogLastPath, gDialogHelperPath; // optimize QFileDialog -bool gSoundNotify = true; -bool gIncludeMuted = true; -bool gDesktopNotify = true; -DBINotifyView gNotifyView = dbinvShowPreview; -bool gWindowsNotifications = true; bool gStartMinimized = false; bool gStartInTray = false; bool gAutoStart = false; @@ -61,13 +56,6 @@ TWindowPos gWindowPos; LaunchMode gLaunchMode = LaunchModeNormal; bool gSupportTray = true; DBIWorkMode gWorkMode = dbiwmWindowAndTray; -DBIConnectionType gConnectionType = dbictAuto; -ConnectionProxy gConnectionProxy; -#ifdef Q_OS_WIN -bool gTryIPv6 = false; -#else -bool gTryIPv6 = true; -#endif bool gSeenTrayTooltip = false; bool gRestartingUpdate = false, gRestarting = false, gRestartingToSettings = false, gWriteProtected = false; int32 gLastUpdateCheck = 0; @@ -75,17 +63,9 @@ bool gNoStartUpdate = false; bool gStartToSettings = false; DBIDefaultAttach gDefaultAttach = dbidaDocument; bool gReplaceEmojis = true; -bool gAskDownloadPath = false; -QString gDownloadPath; -QByteArray gDownloadPathBookmark; bool gCtrlEnter = false; -QPixmapPointer gChatBackground = 0; -int32 gChatBackgroundId = 0; -QPixmapPointer gChatDogImage = 0; -bool gTileBackground = false; - uint32 gConnectionsInSession = 1; QString gLoggedPhoneNumber; @@ -126,7 +106,6 @@ QString gLangFile; bool gRetina = false; float64 gRetinaFactor = 1.; int32 gIntRetinaFactor = 1; -bool gCustomNotifies = true; #ifdef Q_OS_WIN DBIPlatform gPlatform = dbipWindows; @@ -175,7 +154,6 @@ void settingsParseArgs(int argc, char *argv[]) { case dbipMac: gUpdateURL = QUrl(qsl("http://tdesktop.com/mac/tupdates/current")); gPlatformString = qsl("MacOS"); - gCustomNotifies = false; break; case dbipMacOld: gUpdateURL = QUrl(qsl("http://tdesktop.com/mac32/tupdates/current")); diff --git a/Telegram/SourceFiles/settings.h b/Telegram/SourceFiles/settings.h index c27d862fe..a1edfbe3c 100644 --- a/Telegram/SourceFiles/settings.h +++ b/Telegram/SourceFiles/settings.h @@ -91,20 +91,8 @@ inline const QString &cDialogHelperPathFinal() { } DeclareSetting(bool, CtrlEnter); -typedef QPixmap *QPixmapPointer; -DeclareSetting(QPixmapPointer, ChatBackground); -DeclareSetting(int32, ChatBackgroundId); -DeclareSetting(QPixmapPointer, ChatDogImage); -DeclareSetting(bool, TileBackground); - -DeclareSetting(bool, SoundNotify); -DeclareSetting(bool, IncludeMuted); -DeclareSetting(bool, DesktopNotify); -DeclareSetting(DBINotifyView, NotifyView); DeclareSetting(bool, AutoUpdate); -DeclareSetting(bool, WindowsNotifications); - struct TWindowPos { TWindowPos() : moncrc(0), maximized(0), x(0), y(0), w(0), h(0) { } @@ -114,10 +102,7 @@ struct TWindowPos { DeclareSetting(TWindowPos, WindowPos); DeclareSetting(bool, SupportTray); DeclareSetting(DBIWorkMode, WorkMode); -DeclareSetting(DBIConnectionType, ConnectionType); -DeclareSetting(bool, TryIPv6); DeclareSetting(DBIDefaultAttach, DefaultAttach); -DeclareSetting(ConnectionProxy, ConnectionProxy); DeclareSetting(bool, SeenTrayTooltip); DeclareSetting(bool, RestartingUpdate); DeclareSetting(bool, Restarting); @@ -128,9 +113,7 @@ DeclareSetting(bool, NoStartUpdate); DeclareSetting(bool, StartToSettings); DeclareSetting(bool, ReplaceEmojis); DeclareReadSetting(bool, ManyInstance); -DeclareSetting(bool, AskDownloadPath); -DeclareSetting(QString, DownloadPath); -DeclareSetting(QByteArray, DownloadPathBookmark); + DeclareSetting(QByteArray, LocalSalt); DeclareSetting(DBIScale, RealScale); DeclareSetting(DBIScale, ScreenScale); @@ -279,7 +262,6 @@ DeclareSetting(QString, LangErrors); DeclareSetting(bool, Retina); DeclareSetting(float64, RetinaFactor); DeclareSetting(int32, IntRetinaFactor); -DeclareSetting(bool, CustomNotifies); DeclareReadSetting(DBIPlatform, Platform); DeclareReadSetting(QString, PlatformString); diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index c1102e527..5a27c0984 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -20,6 +20,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ using "basic.style"; using "basic_types.style"; +using "dialogs/dialogs.style"; settingsMaxWidth: 520px; settingsMaxPadding: 48px; @@ -82,6 +83,22 @@ settingsSecondaryButton: RoundButton(settingsPrimaryButton) { textBg: #ffffff; textBgOver: #f2f7fa; } +settingsEditButton: RoundButton { + width: 24px; + height: 34px; + icon: settingsEditIcon; + + textTop: 0px; + downTextTop: 1px; + + textFg: transparent; + textFgOver: transparent; + secondaryTextFg: transparent; + secondaryTextFgOver: transparent; + textBg: transparent; + textBgOver: transparent; +} + settingsBlocksTop: 7px; settingsBlocksBottom: 20px; @@ -117,3 +134,5 @@ settingsSliderLabelTop: 17px; settingsSliderLabelFont: normalFont; settingsSliderLabelFg: #1485c2; settingsSliderDuration: 200; + +settingsBackgroundSize: 120px; diff --git a/Telegram/SourceFiles/settings/settings_advanced_widget.cpp b/Telegram/SourceFiles/settings/settings_advanced_widget.cpp index 69f1c72b5..34835e522 100644 --- a/Telegram/SourceFiles/settings/settings_advanced_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_advanced_widget.cpp @@ -32,6 +32,11 @@ namespace Settings { AdvancedWidget::AdvancedWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_advanced_settings)) { createControls(); +#ifndef TDESKTOP_DISABLE_NETWORK_PROXY + subscribe(Global::RefConnectionTypeChanged(), [this]() { + connectionTypeUpdated(); + }); +#endif // TDESKTOP_DISABLE_NETWORK_PROXY } void AdvancedWidget::createControls() { @@ -43,6 +48,7 @@ void AdvancedWidget::createControls() { } #ifndef TDESKTOP_DISABLE_NETWORK_PROXY addChildRow(_connectionType, marginLarge, lang(lng_connection_type), lang(lng_connection_auto_connecting)); + connectionTypeUpdated(); connect(_connectionType->link(), SIGNAL(clicked()), this, SLOT(onConnectionType())); #endif // TDESKTOP_DISABLE_NETWORK_PROXY if (self()) { @@ -59,6 +65,23 @@ void AdvancedWidget::onManageLocalStorage() { } #ifndef TDESKTOP_DISABLE_NETWORK_PROXY +void AdvancedWidget::connectionTypeUpdated() { + QString connection; + switch (Global::ConnectionType()) { + case dbictAuto: { + QString transport = MTP::dctransport(); + connection = transport.isEmpty() ? lang(lng_connection_auto_connecting) : lng_connection_auto(lt_transport, transport); + } break; + case dbictHttpProxy: + case dbictTcpProxy: { + QString transport = MTP::dctransport(); + connection = transport.isEmpty() ? lang(lng_connection_proxy_connecting) : lng_connection_proxy(lt_transport, transport); + } break; + } + _connectionType->link()->setText(connection); + resizeToWidth(width()); +} + void AdvancedWidget::onConnectionType() { Ui::showLayer(new ConnectionBox()); } diff --git a/Telegram/SourceFiles/settings/settings_advanced_widget.h b/Telegram/SourceFiles/settings/settings_advanced_widget.h index 001a2a124..92eecc0b1 100644 --- a/Telegram/SourceFiles/settings/settings_advanced_widget.h +++ b/Telegram/SourceFiles/settings/settings_advanced_widget.h @@ -43,6 +43,9 @@ private slots: private: void createControls(); +#ifndef TDESKTOP_DISABLE_NETWORK_PROXY + void connectionTypeUpdated(); +#endif // TDESKTOP_DISABLE_NETWORK_PROXY void supportGot(const MTPhelp_Support &support); ChildWidget _manageLocalStorage = { nullptr }; diff --git a/Telegram/SourceFiles/settings/settings_background_widget.cpp b/Telegram/SourceFiles/settings/settings_background_widget.cpp index b5dc57957..22d7d27a2 100644 --- a/Telegram/SourceFiles/settings/settings_background_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_background_widget.cpp @@ -23,21 +23,237 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "styles/style_settings.h" #include "lang.h" +#include "mainwidget.h" +#include "boxes/backgroundbox.h" +#include "ui/widgets/widget_slide_wrap.h" +#include "localstorage.h" +#include "mainwindow.h" +#include "window/chat_background.h" namespace Settings { +BackgroundRow::BackgroundRow(QWidget *parent) : TWidget(parent) +, _chooseFromGallery(this, lang(lng_settings_bg_from_gallery)) +, _chooseFromFile(this, lang(lng_settings_bg_from_file)) +, _radial(animation(this, &BackgroundRow::step_radial)) { + Window::chatBackground()->initIfEmpty(); + + updateImage(); + + connect(_chooseFromGallery, SIGNAL(clicked()), this, SIGNAL(chooseFromGallery())); + connect(_chooseFromFile, SIGNAL(clicked()), this, SIGNAL(chooseFromFile())); +} + +void BackgroundRow::paintEvent(QPaintEvent *e) { + Painter p(this); + + bool radial = false; + float64 radialOpacity = 0; + if (_radial.animating()) { + _radial.step(getms()); + radial = _radial.animating(); + radialOpacity = _radial.opacity(); + } + if (radial) { + auto backThumb = App::main() ? App::main()->newBackgroundThumb() : ImagePtr(); + if (backThumb->isNull()) { + p.drawPixmap(0, 0, _background); + } else { + const QPixmap &pix = App::main()->newBackgroundThumb()->pixBlurred(st::setBackgroundSize); + p.drawPixmap(0, 0, st::setBackgroundSize, st::setBackgroundSize, pix, 0, (pix.height() - st::setBackgroundSize) / 2, st::setBackgroundSize, st::setBackgroundSize); + } + + auto outer = radialRect(); + QRect inner(QPoint(outer.x() + (outer.width() - st::radialSize.width()) / 2, outer.y() + (outer.height() - st::radialSize.height()) / 2), st::radialSize); + p.setPen(Qt::NoPen); + p.setBrush(st::black); + p.setOpacity(radialOpacity * st::radialBgOpacity); + + p.setRenderHint(QPainter::HighQualityAntialiasing); + p.drawEllipse(inner); + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + + p.setOpacity(1); + QRect arc(inner.marginsRemoved(QMargins(st::radialLine, st::radialLine, st::radialLine, st::radialLine))); + _radial.draw(p, arc, st::radialLine, st::white); + } else { + p.drawPixmap(0, 0, _background); + } +} + +int BackgroundRow::resizeGetHeight(int newWidth) { + int linkLeft = st::settingsBackgroundSize + st::settingsSmallSkip; + int linkWidth = newWidth - linkLeft; + _chooseFromGallery->resizeToWidth(qMin(linkWidth, _chooseFromGallery->naturalWidth())); + _chooseFromFile->resizeToWidth(qMin(linkWidth, _chooseFromFile->naturalWidth())); + + _chooseFromGallery->moveToLeft(linkLeft, 0); + _chooseFromFile->moveToLeft(linkLeft, _chooseFromGallery->height() + st::settingsSmallSkip); + + return st::settingsBackgroundSize; +} + +float64 BackgroundRow::radialProgress() const { + if (auto m = App::main()) { + return m->chatBackgroundProgress(); + } + return 1.; +} + +bool BackgroundRow::radialLoading() const { + if (auto m = App::main()) { + if (m->chatBackgroundLoading()) { + m->checkChatBackground(); + if (m->chatBackgroundLoading()) { + return true; + } else { + const_cast(this)->updateImage(); + } + } + } + return false; +} + +QRect BackgroundRow::radialRect() const { + return QRect(0, 0, st::setBackgroundSize, st::setBackgroundSize); +} + +void BackgroundRow::radialStart() { + if (radialLoading() && !_radial.animating()) { + _radial.start(radialProgress()); + if (auto shift = radialTimeShift()) { + _radial.update(radialProgress(), !radialLoading(), getms() + shift); + } + } +} + +uint64 BackgroundRow::radialTimeShift() const { + return st::radialDuration; +} + +void BackgroundRow::step_radial(uint64 ms, bool timer) { + _radial.update(radialProgress(), !radialLoading(), ms + radialTimeShift()); + if (timer && _radial.animating()) { + rtlupdate(radialRect()); + } +} + +void BackgroundRow::updateImage() { + int32 size = st::setBackgroundSize * cIntRetinaFactor(); + QImage back(size, size, QImage::Format_ARGB32_Premultiplied); + back.setDevicePixelRatio(cRetinaFactor()); + { + QPainter p(&back); + auto &pix = Window::chatBackground()->image(); + int sx = (pix.width() > pix.height()) ? ((pix.width() - pix.height()) / 2) : 0; + int sy = (pix.height() > pix.width()) ? ((pix.height() - pix.width()) / 2) : 0; + int s = (pix.width() > pix.height()) ? pix.height() : pix.width(); + p.setRenderHint(QPainter::SmoothPixmapTransform); + p.drawPixmap(0, 0, st::setBackgroundSize, st::setBackgroundSize, pix, sx, sy, s, s); + } + imageRound(back, ImageRoundRadius::Small); + _background = App::pixmapFromImageInPlace(std_::move(back)); + _background.setDevicePixelRatio(cRetinaFactor()); + + rtlupdate(radialRect()); + + if (radialLoading()) { + radialStart(); + } +} + BackgroundWidget::BackgroundWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_background)) { - refreshControls(); + FileDialog::registerObserver(this, &BackgroundWidget::notifyFileQueryUpdated); + createControls(); + + subscribe(Window::chatBackground(), [this](const Window::ChatBackgroundUpdate &update) { + using Update = Window::ChatBackgroundUpdate; + if (update.type == Update::Type::New) { + _background->updateImage(); + } else if (update.type == Update::Type::Start) { + needBackgroundUpdate(update.tiled); + } + }); + subscribe(Adaptive::Changed(), [this]() { + if (Global::AdaptiveLayout() == Adaptive::WideLayout) { + _adaptive->slideDown(); + } else { + _adaptive->slideUp(); + } + }); } -void BackgroundWidget::refreshControls() { +void BackgroundWidget::createControls() { + style::margins margin(0, 0, 0, st::settingsSmallSkip); + style::margins slidedPadding(0, margin.bottom() / 2, 0, margin.bottom() - (margin.bottom() / 2)); + + addChildRow(_background, margin); + connect(_background, SIGNAL(chooseFromGallery()), this, SLOT(onChooseFromGallery())); + connect(_background, SIGNAL(chooseFromFile()), this, SLOT(onChooseFromFile())); + + addChildRow(_tile, margin, lang(lng_settings_bg_tile), SLOT(onTile()), Window::chatBackground()->tile()); + addChildRow(_adaptive, margin, slidedPadding, lang(lng_settings_adaptive_wide), SLOT(onAdaptive()), Global::AdaptiveForWide()); + if (Global::AdaptiveLayout() != Adaptive::WideLayout) { + _adaptive->hideFast(); + } } -int BackgroundWidget::resizeGetHeight(int newWidth) { - int newHeight = contentTop(); +void BackgroundWidget::onChooseFromGallery() { + Ui::showLayer(new BackgroundBox()); +} - newHeight += st::settingsBlockMarginBottom; - return newHeight; +void BackgroundWidget::needBackgroundUpdate(bool tile) { + _tile->setChecked(tile); + _background->updateImage(); +} + +void BackgroundWidget::onChooseFromFile() { + QStringList imgExtensions(cImgExtensions()); + QString filter(qsl("Image files (*") + imgExtensions.join(qsl(" *")) + qsl(");;") + filedialogAllFilesFilter()); + + _chooseFromFileQueryId = FileDialog::queryReadFile(lang(lng_choose_images), filter); +} + +void BackgroundWidget::notifyFileQueryUpdated(const FileDialog::QueryUpdate &update) { + if (_chooseFromFileQueryId != update.queryId) { + return; + } + _chooseFromFileQueryId = 0; + + if (update.filePaths.isEmpty() && update.remoteContent.isEmpty()) { + return; + } + + QImage img; + if (!update.remoteContent.isEmpty()) { + img = App::readImage(update.remoteContent); + } else { + img = App::readImage(update.filePaths.front()); + } + + if (img.isNull() || img.width() <= 0 || img.height() <= 0) return; + + if (img.width() > 4096 * img.height()) { + img = img.copy((img.width() - 4096 * img.height()) / 2, 0, 4096 * img.height(), img.height()); + } else if (img.height() > 4096 * img.width()) { + img = img.copy(0, (img.height() - 4096 * img.width()) / 2, img.width(), 4096 * img.width()); + } + + App::initBackground(-1, img); + _tile->setChecked(false); + _background->updateImage(); +} + +void BackgroundWidget::onTile() { + Window::chatBackground()->setTile(_tile->checked()); +} + +void BackgroundWidget::onAdaptive() { + if (Global::AdaptiveForWide() != _adaptive->entity()->checked()) { + Global::SetAdaptiveForWide(_adaptive->entity()->checked()); + Adaptive::Changed().notify(); + Local::writeUserSettings(); + } } } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_background_widget.h b/Telegram/SourceFiles/settings/settings_background_widget.h index 44ba85667..f7c6c34f5 100644 --- a/Telegram/SourceFiles/settings/settings_background_widget.h +++ b/Telegram/SourceFiles/settings/settings_background_widget.h @@ -21,19 +21,72 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "settings/settings_block_widget.h" +#include "ui/filedialog.h" + +class LinkButton; +class Checkbox; +namespace Ui { +template +class WidgetSlideWrap; +} // namespace Ui; namespace Settings { +class BackgroundRow : public TWidget { + Q_OBJECT + +public: + BackgroundRow(QWidget *parent); + + void updateImage(); + +protected: + void paintEvent(QPaintEvent *e) override; + + int resizeGetHeight(int newWidth) override; + +signals: + void chooseFromGallery(); + void chooseFromFile(); + +private: + float64 radialProgress() const; + bool radialLoading() const; + QRect radialRect() const; + void radialStart(); + uint64 radialTimeShift() const; + void step_radial(uint64 ms, bool timer); + + QPixmap _background; + ChildWidget _chooseFromGallery; + ChildWidget _chooseFromFile; + + RadialAnimation _radial; + +}; + class BackgroundWidget : public BlockWidget { + Q_OBJECT + public: BackgroundWidget(QWidget *parent, UserData *self); -protected: - // Resizes content and counts natural widget height for the desired width. - int resizeGetHeight(int newWidth) override; +private slots: + void onChooseFromGallery(); + void onChooseFromFile(); + void onTile(); + void onAdaptive(); private: - void refreshControls(); + void createControls(); + void needBackgroundUpdate(bool tile); + void notifyFileQueryUpdated(const FileDialog::QueryUpdate &update); + + ChildWidget _background = { nullptr }; + ChildWidget _tile = { nullptr }; + ChildWidget> _adaptive = { nullptr }; + + FileDialog::QueryId _chooseFromFileQueryId = 0; }; diff --git a/Telegram/SourceFiles/settings/settings_block_widget.cpp b/Telegram/SourceFiles/settings/settings_block_widget.cpp index 4052ccc37..5dfaab86c 100644 --- a/Telegram/SourceFiles/settings/settings_block_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_block_widget.cpp @@ -96,7 +96,7 @@ void BlockWidget::createChildRow(ChildWidget &child, style::margins void BlockWidget::createChildRow(ChildWidget &child, style::margins &margin, const QString &text, const char *slot) { child = new LinkButton(this, text); - connect(child, SIGNAL(changed()), this, slot); + connect(child, SIGNAL(clicked()), this, slot); } } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_block_widget.h b/Telegram/SourceFiles/settings/settings_block_widget.h index 9e3afb21a..f7c949b00 100644 --- a/Telegram/SourceFiles/settings/settings_block_widget.h +++ b/Telegram/SourceFiles/settings/settings_block_widget.h @@ -32,7 +32,7 @@ class WidgetSlideWrap; namespace Settings { -class BlockWidget : public ScrolledWidget, public Notify::Observer, public base::Subscriber { +class BlockWidget : public ScrolledWidget, public Notify::Observer, protected base::Subscriber { Q_OBJECT public: diff --git a/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp b/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp index 3d6e01fd1..31ecab39b 100644 --- a/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_chat_settings_widget.cpp @@ -36,8 +36,23 @@ namespace Settings { ChatSettingsWidget::ChatSettingsWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_chat_settings)) { createControls(); + + subscribe(Global::RefDownloadPathChanged(), [this]() { + _downloadPath->entity()->link()->setText(downloadPathText()); + resizeToWidth(width()); + }); } +QString ChatSettingsWidget::downloadPathText() const { + if (Global::DownloadPath().isEmpty()) { + return lang(lng_download_path_default); + } else if (Global::DownloadPath() == qsl("tmp")) { + return lang(lng_download_path_temp); + } + return QDir::toNativeSeparators(Global::DownloadPath()); +}; + + void ChatSettingsWidget::createControls() { style::margins marginSmall(0, 0, 0, st::settingsSmallSkip); style::margins marginSkip(0, 0, 0, st::settingsSkip); @@ -48,18 +63,13 @@ void ChatSettingsWidget::createControls() { style::margins marginList(st::defaultCheckbox.textPosition.x(), 0, 0, st::settingsSkip); addChildRow(_viewList, marginList, slidedPadding, lang(lng_settings_view_emojis), SLOT(onViewList())); - addChildRow(_dontAskDownloadPath, marginSub, lang(lng_download_path_dont_ask), SLOT(onDontAskDownloadPath()), !cAskDownloadPath()); - auto downloadPathText = []() -> QString { - if (cDownloadPath().isEmpty()) { - return lang(lng_download_path_default); - } else if (cDownloadPath() == qsl("tmp")) { - return lang(lng_download_path_temp); - } - return QDir::toNativeSeparators(cDownloadPath()); - }; + addChildRow(_dontAskDownloadPath, marginSub, lang(lng_download_path_dont_ask), SLOT(onDontAskDownloadPath()), !Global::AskDownloadPath()); style::margins marginPath(st::defaultCheckbox.textPosition.x(), 0, 0, st::settingsSkip); addChildRow(_downloadPath, marginPath, slidedPadding, lang(lng_download_path_label), downloadPathText()); connect(_downloadPath->entity()->link(), SIGNAL(clicked()), this, SLOT(onDownloadPath())); + if (Global::AskDownloadPath()) { + _downloadPath->hideFast(); + } addChildRow(_sendByEnter, marginSmall, qsl("send_key"), 0, lang(lng_settings_send_enter), SLOT(onSendByEnter()), !cCtrlEnter()); addChildRow(_sendByCtrlEnter, marginSkip, qsl("send_key"), 1, lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_settings_send_cmdenter : lng_settings_send_ctrlenter), SLOT(onSendByCtrlEnter()), cCtrlEnter()); @@ -104,7 +114,7 @@ void ChatSettingsWidget::onViewList() { } void ChatSettingsWidget::onDontAskDownloadPath() { - cSetAskDownloadPath(!_dontAskDownloadPath->checked()); + Global::SetAskDownloadPath(!_dontAskDownloadPath->checked()); Local::writeUserSettings(); if (_dontAskDownloadPath->checked()) { _downloadPath->slideDown(); diff --git a/Telegram/SourceFiles/settings/settings_chat_settings_widget.h b/Telegram/SourceFiles/settings/settings_chat_settings_widget.h index 208c6ea76..6656c7811 100644 --- a/Telegram/SourceFiles/settings/settings_chat_settings_widget.h +++ b/Telegram/SourceFiles/settings/settings_chat_settings_widget.h @@ -65,6 +65,7 @@ private slots: private: void createControls(); + QString downloadPathText() const; ChildWidget _replaceEmoji = { nullptr }; ChildWidget> _viewList = { nullptr }; diff --git a/Telegram/SourceFiles/settings/settings_cover.cpp b/Telegram/SourceFiles/settings/settings_cover.cpp index 40f39160d..d6c689d91 100644 --- a/Telegram/SourceFiles/settings/settings_cover.cpp +++ b/Telegram/SourceFiles/settings/settings_cover.cpp @@ -42,6 +42,7 @@ CoverWidget::CoverWidget(QWidget *parent, UserData *self) : BlockWidget(parent, , _self(App::self()) , _userpicButton(this, _self) , _name(this, st::settingsNameLabel) +, _editNameInline(this, QString(), st::settingsEditButton) , _setPhoto(this, lang(lng_settings_upload), st::settingsPrimaryButton) , _editName(this, lang(lng_settings_edit), st::settingsSecondaryButton) { setAcceptDrops(true); @@ -53,6 +54,7 @@ CoverWidget::CoverWidget(QWidget *parent, UserData *self) : BlockWidget(parent, connect(_setPhoto, SIGNAL(clicked()), this, SLOT(onSetPhoto())); _editName->setTextTransform(Ui::RoundButton::TextTransform::ToUpper); connect(_editName, SIGNAL(clicked()), this, SLOT(onEditName())); + connect(_editNameInline, SIGNAL(clicked()), this, SLOT(onEditName())); auto observeEvents = Notify::PeerUpdate::Flag::NameChanged; Notify::registerPeerObserver(observeEvents, this, &CoverWidget::notifyPeerUpdated); @@ -97,8 +99,6 @@ int CoverWidget::resizeGetHeight(int newWidth) { _userpicButton->moveToLeft(contentLeft() + st::settingsPhotoLeft, newHeight); - refreshNameGeometry(newWidth); - int infoLeft = _userpicButton->x() + _userpicButton->width(); _statusPosition = QPoint(infoLeft + st::settingsStatusLeft, _userpicButton->y() + st::settingsStatusTop); if (_cancelPhotoUpload) { @@ -109,12 +109,11 @@ int CoverWidget::resizeGetHeight(int newWidth) { int buttonsRight = newWidth - st::settingsButtonSkip; _setPhoto->moveToLeft(buttonLeft, _userpicButton->y() + st::settingsButtonTop); buttonLeft += _setPhoto->width() + st::settingsButtonSkip; - _editName->moveToLeft(buttonLeft, _setPhoto->y()); // TODO - if (buttonLeft + _editName->width() + st::settingsButtonSkip > newWidth) { - _editName->hide(); - } else { - _editName->show(); - } + _editName->moveToLeft(buttonLeft, _setPhoto->y()); + _editNameVisible = (buttonLeft + _editName->width() + st::settingsButtonSkip <= newWidth); + _editName->setVisible(_editNameVisible); + + refreshNameGeometry(newWidth); newHeight += st::settingsPhotoSize; newHeight += st::settingsMarginBottom; @@ -133,9 +132,17 @@ void CoverWidget::refreshNameGeometry(int newWidth) { int nameLeft = infoLeft + st::settingsNameLeft - st::settingsNameLabel.margin.left(); int nameTop = _userpicButton->y() + st::settingsNameTop - st::settingsNameLabel.margin.top(); int nameWidth = newWidth - infoLeft - st::settingsNameLeft; + auto editNameInlineVisible = !_editNameVisible; + if (editNameInlineVisible) { + nameWidth -= _editNameInline->width(); + } int marginsAdd = st::settingsNameLabel.margin.left() + st::settingsNameLabel.margin.right(); + _name->resizeToWidth(qMin(nameWidth - marginsAdd, _name->naturalWidth()) + marginsAdd); _name->moveToLeft(nameLeft, nameTop); + + _editNameInline->moveToLeft(nameLeft + _name->width(), nameTop); + _editNameInline->setVisible(editNameInlineVisible); } void CoverWidget::showFinished() { diff --git a/Telegram/SourceFiles/settings/settings_cover.h b/Telegram/SourceFiles/settings/settings_cover.h index 1dd635ac7..e062c4981 100644 --- a/Telegram/SourceFiles/settings/settings_cover.h +++ b/Telegram/SourceFiles/settings/settings_cover.h @@ -93,6 +93,7 @@ private: ChildWidget _dropArea = { nullptr }; ChildWidget _name; + ChildWidget _editNameInline; ChildWidget _cancelPhotoUpload = { nullptr }; QPoint _statusPosition; @@ -101,6 +102,7 @@ private: ChildWidget _setPhoto; ChildWidget _editName; + bool _editNameVisible = true; int _dividerTop = 0; diff --git a/Telegram/SourceFiles/settings/settings_general_widget.cpp b/Telegram/SourceFiles/settings/settings_general_widget.cpp index 2c3949a21..0059472de 100644 --- a/Telegram/SourceFiles/settings/settings_general_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_general_widget.cpp @@ -52,6 +52,7 @@ QString currentVersion() { GeneralWidget::GeneralWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_general)) , _changeLanguage(this, lang(lng_settings_change_lang)) { + connect(_changeLanguage, SIGNAL(clicked()), this, SLOT(onChangeLanguage())); refreshControls(); } @@ -73,9 +74,9 @@ void GeneralWidget::refreshControls() { #endif // TDESKTOP_DISABLE_AUTOUPDATE if (cPlatform() == dbipWindows || cSupportTray()) { - addChildRow(_enableTrayIcon, marginSmall, lang(lng_settings_workmode_tray), SLOT(onWorkmodeChange()), (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray)); + addChildRow(_enableTrayIcon, marginSmall, lang(lng_settings_workmode_tray), SLOT(onEnableTrayIcon()), (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray)); if (cPlatform() == dbipWindows) { - addChildRow(_enableTaskbarIcon, marginLarge, lang(lng_settings_workmode_window), SLOT(onWorkmodeChange()), (cWorkMode() == dbiwmWindowOnly || cWorkMode() == dbiwmWindowAndTray)); + addChildRow(_enableTaskbarIcon, marginLarge, lang(lng_settings_workmode_window), SLOT(onEnableTaskbarIcon()), (cWorkMode() == dbiwmWindowOnly || cWorkMode() == dbiwmWindowAndTray)); addChildRow(_autoStart, marginSmall, lang(lng_settings_auto_start), SLOT(onAutoStart()), cAutoStart()); addChildRow(_startMinimized, marginLarge, slidedPadding, lang(lng_settings_start_min), SLOT(onStartMinimized()), cStartMinimized()); diff --git a/Telegram/SourceFiles/settings/settings_inner_widget.cpp b/Telegram/SourceFiles/settings/settings_inner_widget.cpp index 95763ed1b..cab185df3 100644 --- a/Telegram/SourceFiles/settings/settings_inner_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_inner_widget.cpp @@ -37,18 +37,34 @@ namespace Settings { InnerWidget::InnerWidget(QWidget *parent) : TWidget(parent) , _self(App::self()) { - if (_self) { - _cover = new CoverWidget(this, _self); - } refreshBlocks(); + subscribe(Global::RefSelfChanged(), [this]() { selfUpdated(); }); +} + +void InnerWidget::selfUpdated() { + _self = App::self(); + refreshBlocks(); + + if (_cover) { + _cover->setContentLeft(_contentLeft); + _cover->resizeToWidth(width()); + } + for_const (auto block, _blocks) { + block->setContentLeft(_contentLeft); + block->resizeToWidth(width()); + } + onBlockHeightUpdated(); } void InnerWidget::refreshBlocks() { + _cover.destroyDelayed(); for_const (auto block, _blocks) { block->deleteLater(); } _blocks.clear(); + if (_self) { + _cover = new CoverWidget(this, _self); _blocks.push_back(new Settings::InfoWidget(this, _self)); _blocks.push_back(new Settings::NotificationsWidget(this, _self)); } @@ -60,7 +76,12 @@ void InnerWidget::refreshBlocks() { _blocks.push_back(new Settings::PrivacyWidget(this, _self)); } _blocks.push_back(new Settings::AdvancedWidget(this, _self)); + + if (_cover) { + _cover->show(); + } for_const (auto block, _blocks) { + block->show(); connect(block, SIGNAL(heightUpdated()), this, SLOT(onBlockHeightUpdated())); } } @@ -102,6 +123,7 @@ void InnerWidget::onBlockHeightUpdated() { int newHeight = refreshBlocksPositions(); if (newHeight != height()) { resize(width(), newHeight); + emit heightUpdated(); } } diff --git a/Telegram/SourceFiles/settings/settings_inner_widget.h b/Telegram/SourceFiles/settings/settings_inner_widget.h index 7f5453fcf..a71d2b20f 100644 --- a/Telegram/SourceFiles/settings/settings_inner_widget.h +++ b/Telegram/SourceFiles/settings/settings_inner_widget.h @@ -25,7 +25,7 @@ namespace Settings { class CoverWidget; class BlockWidget; -class InnerWidget : public TWidget { +class InnerWidget : public TWidget, private base::Subscriber { Q_OBJECT public: @@ -42,6 +42,9 @@ public: void showFinished(); +signals: + void heightUpdated(); + private slots: void onBlockHeightUpdated(); @@ -50,6 +53,7 @@ protected: int resizeGetHeight(int newWidth) override; private: + void selfUpdated(); void refreshBlocks(); // Returns the new height value. diff --git a/Telegram/SourceFiles/settings/settings_notifications_widget.cpp b/Telegram/SourceFiles/settings/settings_notifications_widget.cpp index 93a3ce4c4..4f7b45585 100644 --- a/Telegram/SourceFiles/settings/settings_notifications_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_notifications_widget.cpp @@ -32,14 +32,24 @@ namespace Settings { NotificationsWidget::NotificationsWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_notify)) { createControls(); + + subscribe(Global::RefNotifySettingsChanged(), [this](const Notify::ChangeType &type) { + if (type == Notify::ChangeType::DesktopEnabled) { + desktopEnabledUpdated(); + } else if (type == Notify::ChangeType::ViewParams) { + viewParamUpdated(); + } else if (type == Notify::ChangeType::SoundEnabled) { + _playSound->setChecked(Global::SoundNotify()); + } + }); } void NotificationsWidget::createControls() { style::margins margin(0, 0, 0, st::settingsSmallSkip); style::margins slidedPadding(0, margin.bottom() / 2, 0, margin.bottom() - (margin.bottom() / 2)); - addChildRow(_desktopNotifications, margin, lang(lng_settings_desktop_notify), SLOT(onDesktopNotifications()), cDesktopNotify()); - addChildRow(_showSenderName, margin, slidedPadding, lang(lng_settings_show_name), SLOT(onShowSenderName()), cNotifyView() <= dbinvShowName); - addChildRow(_showMessagePreview, margin, slidedPadding, lang(lng_settings_show_preview), SLOT(onShowMessagePreview()), cNotifyView() <= dbinvShowPreview); + addChildRow(_desktopNotifications, margin, lang(lng_settings_desktop_notify), SLOT(onDesktopNotifications()), Global::DesktopNotify()); + addChildRow(_showSenderName, margin, slidedPadding, lang(lng_settings_show_name), SLOT(onShowSenderName()), Global::NotifyView() <= dbinvShowName); + addChildRow(_showMessagePreview, margin, slidedPadding, lang(lng_settings_show_preview), SLOT(onShowMessagePreview()), Global::NotifyView() <= dbinvShowPreview); if (!_showSenderName->entity()->checked()) { _showMessagePreview->hideFast(); } @@ -49,79 +59,105 @@ void NotificationsWidget::createControls() { } #ifdef Q_OS_WIN if (App::wnd()->psHasNativeNotifications()) { - addChildRow(_windowsNative, margin, lang(lng_settings_use_windows), SLOT(onWindowsNative()), cWindowsNotifications()); + addChildRow(_windowsNative, margin, lang(lng_settings_use_windows), SLOT(onWindowsNative()), Global::WindowsNotifications()); } #endif // Q_OS_WIN - addChildRow(_playSound, margin, lang(lng_settings_sound_notify), SLOT(onPlaySound()), cSoundNotify()); - addChildRow(_includeMuted, margin, lang(lng_settings_include_muted), SLOT(onIncludeMuted()), cIncludeMuted()); + addChildRow(_playSound, margin, lang(lng_settings_sound_notify), SLOT(onPlaySound()), Global::SoundNotify()); + addChildRow(_includeMuted, margin, lang(lng_settings_include_muted), SLOT(onIncludeMuted()), Global::IncludeMuted()); } void NotificationsWidget::onDesktopNotifications() { - cSetDesktopNotify(_desktopNotifications->checked()); + if (Global::DesktopNotify() == _desktopNotifications->checked()) { + return; + } + Global::SetDesktopNotify(_desktopNotifications->checked()); Local::writeUserSettings(); - if (App::wnd()) App::wnd()->updateTrayMenu(); + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::DesktopEnabled); +} - if (_desktopNotifications->checked()) { +void NotificationsWidget::desktopEnabledUpdated() { + _desktopNotifications->setChecked(Global::DesktopNotify()); + if (Global::DesktopNotify()) { _showSenderName->slideDown(); if (_showSenderName->entity()->checked()) { _showMessagePreview->slideDown(); } } else { - App::wnd()->notifyClear(); _showSenderName->slideUp(); _showMessagePreview->slideUp(); } } void NotificationsWidget::onShowSenderName() { + auto viewParam = ([this]() { + if (!_showSenderName->entity()->checked()) { + return dbinvShowNothing; + } else if (!_showMessagePreview->entity()->checked()) { + return dbinvShowName; + } + return dbinvShowPreview; + })(); + if (viewParam == Global::NotifyView()) { + return; + } + Global::SetNotifyView(viewParam); + Local::writeUserSettings(); + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::ViewParams); +} + +void NotificationsWidget::onShowMessagePreview() { + auto viewParam = ([this]() { + if (_showMessagePreview->entity()->checked()) { + return dbinvShowPreview; + } else if (_showSenderName->entity()->checked()) { + return dbinvShowName; + } + return dbinvShowNothing; + })(); + if (viewParam == Global::NotifyView()) { + return; + } + + Global::SetNotifyView(viewParam); + Local::writeUserSettings(); + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::ViewParams); +} + +void NotificationsWidget::viewParamUpdated() { if (_showSenderName->entity()->checked()) { _showMessagePreview->slideDown(); } else { _showMessagePreview->slideUp(); } - - if (!_showSenderName->entity()->checked()) { - cSetNotifyView(dbinvShowNothing); - } else if (!_showMessagePreview->entity()->checked()) { - cSetNotifyView(dbinvShowName); - } else { - cSetNotifyView(dbinvShowPreview); - } - Local::writeUserSettings(); - App::wnd()->notifyUpdateAll(); } -void NotificationsWidget::onShowMessagePreview() { - if (_showMessagePreview->entity()->checked()) { - cSetNotifyView(dbinvShowPreview); - } else if (_showSenderName->entity()->checked()) { - cSetNotifyView(dbinvShowName); - } else { - cSetNotifyView(dbinvShowNothing); - } - Local::writeUserSettings(); - App::wnd()->notifyUpdateAll(); -} - -#ifdef Q_OS_WIN void NotificationsWidget::onWindowsNative() { - if (cPlatform() != dbipWindows) return; - cSetWindowsNotifications(!cWindowsNotifications()); - App::wnd()->notifyClearFast(); - cSetCustomNotifies(!cWindowsNotifications()); +#ifdef Q_OS_WIN + if (Global::WindowsNotifications() == _windowsNative->checked()) { + return; + } + + Global::SetWindowsNotifications(_windowsNative->checked()); + Global::SetCustomNotifies(!Global::WindowsNotifications()); Local::writeUserSettings(); -} + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::UseNative); #endif // Q_OS_WIN +} void NotificationsWidget::onPlaySound() { - cSetSoundNotify(_playSound->checked()); + if (_playSound->checked() == Global::SoundNotify()) { + return; + } + + Global::SetSoundNotify(_playSound->checked()); Local::writeUserSettings(); + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::SoundEnabled); } void NotificationsWidget::onIncludeMuted() { - cSetIncludeMuted(_includeMuted->checked()); - Notify::unreadCounterUpdated(); + Global::SetIncludeMuted(_includeMuted->checked()); Local::writeUserSettings(); + Global::RefNotifySettingsChanged().notify(Notify::ChangeType::IncludeMuted); } } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_notifications_widget.h b/Telegram/SourceFiles/settings/settings_notifications_widget.h index 77d61e735..7625a76b7 100644 --- a/Telegram/SourceFiles/settings/settings_notifications_widget.h +++ b/Telegram/SourceFiles/settings/settings_notifications_widget.h @@ -34,14 +34,14 @@ private slots: void onDesktopNotifications(); void onShowSenderName(); void onShowMessagePreview(); -#ifdef Q_OS_WIN void onWindowsNative(); -#endif // Q_OS_WIN void onPlaySound(); void onIncludeMuted(); private: void createControls(); + void desktopEnabledUpdated(); + void viewParamUpdated(); ChildWidget _desktopNotifications = { nullptr }; ChildWidget> _showSenderName = { nullptr }; diff --git a/Telegram/SourceFiles/settings/settings_widget.cpp b/Telegram/SourceFiles/settings/settings_widget.cpp index c24625b19..d76716a73 100644 --- a/Telegram/SourceFiles/settings/settings_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_widget.cpp @@ -42,6 +42,8 @@ Widget::Widget() : LayerWidget() _fixedBarShadow1->move(0, _fixedBar->y() + st::settingsFixedBarHeight); _fixedBarShadow2->move(0, _fixedBarShadow1->y() + st::lineWidth); _scroll->move(0, st::settingsFixedBarHeight); + + connect(_inner, SIGNAL(heightUpdated()), this, SLOT(onInnerHeightUpdated())); } void Widget::parentResized() { @@ -70,6 +72,17 @@ void Widget::parentResized() { // resize it here, not in the resizeEvent() handler. _inner->resizeToWidth(newWidth, newContentLeft); + resizeUsingInnerHeight(newWidth, newContentLeft); +} + +void Widget::onInnerHeightUpdated() { + resizeUsingInnerHeight(width(), _contentLeft); +} + +void Widget::resizeUsingInnerHeight(int newWidth, int newContentLeft) { + if (!App::wnd()) return; + + int windowWidth = App::wnd()->width(); int windowHeight = App::wnd()->height(); int maxHeight = st::settingsFixedBarHeight + _inner->height(); int newHeight = maxHeight; diff --git a/Telegram/SourceFiles/settings/settings_widget.h b/Telegram/SourceFiles/settings/settings_widget.h index 34757f001..c96e9546c 100644 --- a/Telegram/SourceFiles/settings/settings_widget.h +++ b/Telegram/SourceFiles/settings/settings_widget.h @@ -28,6 +28,8 @@ class InnerWidget; class FixedBar; class Widget : public LayerWidget { + Q_OBJECT + public: Widget(); @@ -38,7 +40,12 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; +private slots: + void onInnerHeightUpdated(); + private: + void resizeUsingInnerHeight(int newWidth, int newContentLeft); + ChildWidget _scroll; ChildWidget _inner; ChildWidget _fixedBar; diff --git a/Telegram/SourceFiles/settingswidget.cpp b/Telegram/SourceFiles/settingswidget.cpp index 8d57e058f..ff8220b81 100644 --- a/Telegram/SourceFiles/settingswidget.cpp +++ b/Telegram/SourceFiles/settingswidget.cpp @@ -127,12 +127,12 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : TWidget(parent) , _chooseUsername(this, (self() && !self()->username.isEmpty()) ? ('@' + self()->username) : lang(lng_settings_choose_username)) // notifications -, _desktopNotify(this, lang(lng_settings_desktop_notify), cDesktopNotify()) -, _senderName(this, lang(lng_settings_show_name), cNotifyView() <= dbinvShowName) -, _messagePreview(this, lang(lng_settings_show_preview), cNotifyView() <= dbinvShowPreview) -, _windowsNotifications(this, lang(lng_settings_use_windows), cWindowsNotifications()) -, _soundNotify(this, lang(lng_settings_sound_notify), cSoundNotify()) -, _includeMuted(this, lang(lng_settings_include_muted), cIncludeMuted()) +, _desktopNotify(this, lang(lng_settings_desktop_notify), Global::DesktopNotify()) +, _senderName(this, lang(lng_settings_show_name), Global::NotifyView() <= dbinvShowName) +, _messagePreview(this, lang(lng_settings_show_preview), Global::NotifyView() <= dbinvShowPreview) +, _windowsNotifications(this, lang(lng_settings_use_windows), Global::WindowsNotifications()) +, _soundNotify(this, lang(lng_settings_sound_notify), Global::SoundNotify()) +, _includeMuted(this, lang(lng_settings_include_muted), Global::IncludeMuted()) // general , _changeLanguage(this, lang(lng_settings_change_lang)) @@ -165,9 +165,9 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : TWidget(parent) , _enterSend(this, qsl("send_key"), 0, lang(lng_settings_send_enter), !cCtrlEnter()) , _ctrlEnterSend(this, qsl("send_key"), 1, lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_settings_send_cmdenter : lng_settings_send_ctrlenter), cCtrlEnter()) -, _dontAskDownloadPath(this, lang(lng_download_path_dont_ask), !cAskDownloadPath()) +, _dontAskDownloadPath(this, lang(lng_download_path_dont_ask), false/*!cAskDownloadPath()*/) , _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::cbDefFlat.textLeft - _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)) , _tempDirClearingWidth(st::linkFont->width(lang(lng_download_path_clearing))) , _tempDirClearedWidth(st::linkFont->width(lang(lng_download_path_cleared))) @@ -185,7 +185,7 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : TWidget(parent) // chat background , _backFromGallery(this, lang(lng_settings_bg_from_gallery)) , _backFromFile(this, lang(lng_settings_bg_from_file)) -, _tileBackground(this, lang(lng_settings_bg_tile), cTileBackground()) +, _tileBackground(this, lang(lng_settings_bg_tile), false/*cTileBackground()*/) , _adaptiveForWide(this, lang(lng_settings_adaptive_wide), Global::AdaptiveForWide()) , _needBackgroundUpdate(false) , _radial(animation(this, &SettingsInner::step_radial)) @@ -208,7 +208,6 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : TWidget(parent) , _logOut(this, lang(lng_settings_logout), st::btnRedLink) , _supportGetRequest(0) { Notify::registerPeerObserver(Notify::PeerUpdate::Flag::UsernameChanged, this, &SettingsInner::notifyPeerUpdated); - registerDownloadPathObserver(this, &SettingsInner::notifyDownloadPathUpdated); App::clearMousedItems(); @@ -313,7 +312,7 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : TWidget(parent) } // chat background - if (!cChatBackground()) App::initBackground(); + //if (!cChatBackground()) App::initBackground(); updateChatBackground(); connect(&_backFromGallery, SIGNAL(clicked()), this, SLOT(onBackFromGallery())); connect(&_backFromFile, SIGNAL(clicked()), this, SLOT(onBackFromFile())); @@ -368,19 +367,6 @@ void SettingsInner::notifyPeerUpdated(const Notify::PeerUpdate &update) { } } -void SettingsInner::notifyDownloadPathUpdated(const DownloadPathUpdate &update) { - QString path; - if (cDownloadPath().isEmpty()) { - path = lang(lng_download_path_default); - } else if (cDownloadPath() == qsl("tmp")) { - path = lang(lng_download_path_temp); - } else { - path = st::linkFont->elided(QDir::toNativeSeparators(cDownloadPath()), st::setWidth - st::setVersionLeft - _downloadPathWidth); - } - _downloadPathEdit.setText(path); - showAll(); -} - void SettingsInner::peerUpdated(PeerData *data) { if (self() && data == self()) { if (self()->photoId && self()->photoId != UnknownPeerPhotoId) { @@ -556,25 +542,25 @@ void SettingsInner::paintEvent(QPaintEvent *e) { top += _ctrlEnterSend.height() + st::setSectionSkip; top += _dontAskDownloadPath.height(); - if (!cAskDownloadPath()) { - top += st::setLittleSkip; - p.setFont(st::linkFont->f); - p.setPen(st::black->p); - p.drawText(_left + st::cbDefFlat.textLeft, top + st::linkFont->ascent, lang(lng_download_path_label)); - if (cDownloadPath() == qsl("tmp")) { - QString clearText; - int32 clearWidth = 0; - switch (_tempDirClearState) { - case TempDirClearing: clearText = lang(lng_download_path_clearing); clearWidth = _tempDirClearingWidth; break; - case TempDirCleared: clearText = lang(lng_download_path_cleared); clearWidth = _tempDirClearedWidth; break; - case TempDirClearFailed: clearText = lang(lng_download_path_clear_failed); clearWidth = _tempDirClearFailedWidth; break; - } - if (clearWidth) { - p.drawText(_left + st::setWidth - clearWidth, top + st::linkFont->ascent, clearText); - } - } - top += _downloadPathEdit.height(); - } + //if (!cAskDownloadPath()) { + // top += st::setLittleSkip; + // p.setFont(st::linkFont->f); + // p.setPen(st::black->p); + // p.drawText(_left + st::cbDefFlat.textLeft, top + st::linkFont->ascent, lang(lng_download_path_label)); + // if (cDownloadPath() == qsl("tmp")) { + // QString clearText; + // int32 clearWidth = 0; + // switch (_tempDirClearState) { + // case TempDirClearing: clearText = lang(lng_download_path_clearing); clearWidth = _tempDirClearingWidth; break; + // case TempDirCleared: clearText = lang(lng_download_path_cleared); clearWidth = _tempDirClearedWidth; break; + // case TempDirClearFailed: clearText = lang(lng_download_path_clear_failed); clearWidth = _tempDirClearFailedWidth; break; + // } + // if (clearWidth) { + // p.drawText(_left + st::setWidth - clearWidth, top + st::linkFont->ascent, clearText); + // } + // } + // top += _downloadPathEdit.height(); + //} top += st::setLittleSkip; top += _autoDownload.height(); @@ -755,14 +741,14 @@ void SettingsInner::resizeEvent(QResizeEvent *e) { _enterSend.move(_left, top); top += _enterSend.height() + st::setLittleSkip; _ctrlEnterSend.move(_left, top); top += _ctrlEnterSend.height() + st::setSectionSkip; _dontAskDownloadPath.move(_left, top); top += _dontAskDownloadPath.height(); - if (!cAskDownloadPath()) { - top += st::setLittleSkip; - _downloadPathEdit.move(_left + st::cbDefFlat.textLeft + _downloadPathWidth, top); - if (cDownloadPath() == qsl("tmp")) { - _downloadPathClear.move(_left + st::setWidth - _downloadPathClear.width(), top); - } - top += _downloadPathEdit.height(); - } + //if (!cAskDownloadPath()) { + // top += st::setLittleSkip; + // _downloadPathEdit.move(_left + st::cbDefFlat.textLeft + _downloadPathWidth, top); + // if (cDownloadPath() == qsl("tmp")) { + // _downloadPathClear.move(_left + st::setWidth - _downloadPathClear.width(), top); + // } + // top += _downloadPathEdit.height(); + //} top += st::setLittleSkip; _autoDownload.move(_left + st::cbDefFlat.textLeft, top); top += _autoDownload.height(); @@ -950,19 +936,19 @@ void SettingsInner::updateOnlineDisplay() { } void SettingsInner::updateConnectionType() { - QString connection; - switch (cConnectionType()) { - case dbictAuto: { - QString transport = MTP::dctransport(); - connection = transport.isEmpty() ? lang(lng_connection_auto_connecting) : lng_connection_auto(lt_transport, transport); - } break; - case dbictHttpProxy: - case dbictTcpProxy: { - QString transport = MTP::dctransport(); - connection = transport.isEmpty() ? lang(lng_connection_proxy_connecting) : lng_connection_proxy(lt_transport, transport); - } break; - } - _connectionType.setText(connection); + //QString connection; + //switch (cConnectionType()) { + //case dbictAuto: { + // QString transport = MTP::dctransport(); + // connection = transport.isEmpty() ? lang(lng_connection_auto_connecting) : lng_connection_auto(lt_transport, transport); + //} break; + //case dbictHttpProxy: + //case dbictTcpProxy: { + // QString transport = MTP::dctransport(); + // connection = transport.isEmpty() ? lang(lng_connection_proxy_connecting) : lng_connection_proxy(lt_transport, transport); + //} break; + //} + //_connectionType.setText(connection); } void SettingsInner::passcodeChanged() { @@ -1128,17 +1114,17 @@ void SettingsInner::showAll() { _enterSend.show(); _ctrlEnterSend.show(); _dontAskDownloadPath.show(); - if (cAskDownloadPath()) { - _downloadPathEdit.hide(); - _downloadPathClear.hide(); - } else { - _downloadPathEdit.show(); - if (cDownloadPath() == qsl("tmp") && _tempDirClearState == TempDirExists) { // dir exists, not clearing right now - _downloadPathClear.show(); - } else { - _downloadPathClear.hide(); - } - } + //if (cAskDownloadPath()) { + // _downloadPathEdit.hide(); + // _downloadPathClear.hide(); + //} else { + // _downloadPathEdit.show(); + // if (cDownloadPath() == qsl("tmp") && _tempDirClearState == TempDirExists) { // dir exists, not clearing right now + // _downloadPathClear.show(); + // } else { + // _downloadPathClear.hide(); + // } + //} _autoDownload.show(); } else { _replaceEmojis.hide(); @@ -1547,36 +1533,36 @@ void SettingsInner::setScale(DBIScale newScale) { } void SettingsInner::onSoundNotify() { - cSetSoundNotify(_soundNotify.checked()); - Local::writeUserSettings(); + //cSetSoundNotify(_soundNotify.checked()); + //Local::writeUserSettings(); } void SettingsInner::onIncludeMuted() { - cSetIncludeMuted(_includeMuted.checked()); - Notify::unreadCounterUpdated(); - Local::writeUserSettings(); + //cSetIncludeMuted(_includeMuted.checked()); + //Notify::unreadCounterUpdated(); + //Local::writeUserSettings(); } void SettingsInner::onWindowsNotifications() { - if (cPlatform() != dbipWindows) return; - cSetWindowsNotifications(!cWindowsNotifications()); - App::wnd()->notifyClearFast(); - cSetCustomNotifies(!cWindowsNotifications()); - Local::writeUserSettings(); + //if (cPlatform() != dbipWindows) return; + //cSetWindowsNotifications(!cWindowsNotifications()); + //App::wnd()->notifyClearFast(); + //cSetCustomNotifies(!cWindowsNotifications()); + //Local::writeUserSettings(); } void SettingsInner::onDesktopNotify() { - cSetDesktopNotify(_desktopNotify.checked()); - if (!_desktopNotify.checked()) { - App::wnd()->notifyClear(); - _senderName.setDisabled(true); - _messagePreview.setDisabled(true); - } else { - _senderName.setDisabled(false); - _messagePreview.setDisabled(!_senderName.checked()); - } - Local::writeUserSettings(); - if (App::wnd()) App::wnd()->updateTrayMenu(); + //cSetDesktopNotify(_desktopNotify.checked()); + //if (!_desktopNotify.checked()) { + // App::wnd()->notifyClear(); + // _senderName.setDisabled(true); + // _messagePreview.setDisabled(true); + //} else { + // _senderName.setDisabled(false); + // _messagePreview.setDisabled(!_senderName.checked()); + //} + //Local::writeUserSettings(); + //if (App::wnd()) App::wnd()->updateTrayMenu(); } void SettingsInner::enableDisplayNotify(bool enable) @@ -1585,32 +1571,32 @@ void SettingsInner::enableDisplayNotify(bool enable) } void SettingsInner::onSenderName() { - _messagePreview.setDisabled(!_senderName.checked()); - if (!_senderName.checked() && _messagePreview.checked()) { - _messagePreview.setChecked(false); - } else { - if (_messagePreview.checked()) { - cSetNotifyView(dbinvShowPreview); - } else if (_senderName.checked()) { - cSetNotifyView(dbinvShowName); - } else { - cSetNotifyView(dbinvShowNothing); - } - Local::writeUserSettings(); - App::wnd()->notifyUpdateAll(); - } + //_messagePreview.setDisabled(!_senderName.checked()); + //if (!_senderName.checked() && _messagePreview.checked()) { + // _messagePreview.setChecked(false); + //} else { + // if (_messagePreview.checked()) { + // cSetNotifyView(dbinvShowPreview); + // } else if (_senderName.checked()) { + // cSetNotifyView(dbinvShowName); + // } else { + // cSetNotifyView(dbinvShowNothing); + // } + // Local::writeUserSettings(); + // App::wnd()->notifyUpdateAll(); + //} } void SettingsInner::onMessagePreview() { - if (_messagePreview.checked()) { - cSetNotifyView(dbinvShowPreview); - } else if (_senderName.checked()) { - cSetNotifyView(dbinvShowName); - } else { - cSetNotifyView(dbinvShowNothing); - } - Local::writeUserSettings(); - App::wnd()->notifyUpdateAll(); + //if (_messagePreview.checked()) { + // cSetNotifyView(dbinvShowPreview); + //} else if (_senderName.checked()) { + // cSetNotifyView(dbinvShowName); + //} else { + // cSetNotifyView(dbinvShowNothing); + //} + //Local::writeUserSettings(); + //App::wnd()->notifyUpdateAll(); } void SettingsInner::onReplaceEmojis() { @@ -1649,12 +1635,12 @@ void SettingsInner::onCtrlEnterSend() { } void SettingsInner::onBackFromGallery() { - BackgroundBox *box = new BackgroundBox(); - box->setUpdateCallback([this, weak_this = weakThis()](bool tile) { - if (!weak_this) return; - needBackgroundUpdate(tile); - }); - Ui::showLayer(box); + //BackgroundBox *box = new BackgroundBox(); + //box->setUpdateCallback([this, weak_this = weakThis()](bool tile) { + // if (!weak_this) return; + // needBackgroundUpdate(tile); + //}); + //Ui::showLayer(box); } void SettingsInner::onBackFromFile() { @@ -1735,23 +1721,23 @@ void SettingsInner::step_radial(uint64 ms, bool timer) { } void SettingsInner::updateChatBackground() { - int32 size = st::setBackgroundSize * cIntRetinaFactor(); - QImage back(size, size, QImage::Format_ARGB32_Premultiplied); - back.setDevicePixelRatio(cRetinaFactor()); - { - QPainter p(&back); - const QPixmap &pix(*cChatBackground()); - int sx = (pix.width() > pix.height()) ? ((pix.width() - pix.height()) / 2) : 0; - int sy = (pix.height() > pix.width()) ? ((pix.height() - pix.width()) / 2) : 0; - int s = (pix.width() > pix.height()) ? pix.height() : pix.width(); - p.setRenderHint(QPainter::SmoothPixmapTransform); - p.drawPixmap(0, 0, st::setBackgroundSize, st::setBackgroundSize, pix, sx, sy, s, s); - } - _background = App::pixmapFromImageInPlace(std_::move(back)); - _background.setDevicePixelRatio(cRetinaFactor()); - _needBackgroundUpdate = false; + //int32 size = st::setBackgroundSize * cIntRetinaFactor(); + //QImage back(size, size, QImage::Format_ARGB32_Premultiplied); + //back.setDevicePixelRatio(cRetinaFactor()); + //{ + // QPainter p(&back); + // const QPixmap &pix(*cChatBackground()); + // int sx = (pix.width() > pix.height()) ? ((pix.width() - pix.height()) / 2) : 0; + // int sy = (pix.height() > pix.width()) ? ((pix.height() - pix.width()) / 2) : 0; + // int s = (pix.width() > pix.height()) ? pix.height() : pix.width(); + // p.setRenderHint(QPainter::SmoothPixmapTransform); + // p.drawPixmap(0, 0, st::setBackgroundSize, st::setBackgroundSize, pix, sx, sy, s, s); + //} + //_background = App::pixmapFromImageInPlace(std_::move(back)); + //_background.setDevicePixelRatio(cRetinaFactor()); + //_needBackgroundUpdate = false; - updateBackgroundRect(); + //updateBackgroundRect(); } void SettingsInner::needBackgroundUpdate(bool tile) { @@ -1764,30 +1750,30 @@ void SettingsInner::needBackgroundUpdate(bool tile) { } void SettingsInner::onTileBackground() { - if (cTileBackground() != _tileBackground.checked()) { - cSetTileBackground(_tileBackground.checked()); - if (App::main()) App::main()->clearCachedBackground(); - Local::writeUserSettings(); - } + //if (cTileBackground() != _tileBackground.checked()) { + // cSetTileBackground(_tileBackground.checked()); + // if (App::main()) App::main()->clearCachedBackground(); + // Local::writeUserSettings(); + //} } void SettingsInner::onAdaptiveForWide() { - if (Global::AdaptiveForWide() != _adaptiveForWide.checked()) { - Global::SetAdaptiveForWide(_adaptiveForWide.checked()); - if (App::wnd()) { - App::wnd()->updateAdaptiveLayout(); - } - Local::writeUserSettings(); - } + //if (Global::AdaptiveForWide() != _adaptiveForWide.checked()) { + // Global::SetAdaptiveForWide(_adaptiveForWide.checked()); + // if (App::wnd()) { + // App::wnd()->updateAdaptiveLayout(); + // } + // Local::writeUserSettings(); + //} } void SettingsInner::onDontAskDownloadPath() { - cSetAskDownloadPath(!_dontAskDownloadPath.checked()); - Local::writeUserSettings(); + //cSetAskDownloadPath(!_dontAskDownloadPath.checked()); + //Local::writeUserSettings(); - showAll(); - resizeEvent(0); - update(); + //showAll(); + //resizeEvent(0); + //update(); } void SettingsInner::onDownloadPathEdit() { @@ -2041,7 +2027,7 @@ void SettingsWidget::updateAdaptiveLayout() { } void SettingsWidget::updateDisplayNotify() { - _inner.enableDisplayNotify(cDesktopNotify()); + //_inner.enableDisplayNotify(cDesktopNotify()); } void SettingsWidget::updateOnlineDisplay() { diff --git a/Telegram/SourceFiles/settingswidget.h b/Telegram/SourceFiles/settingswidget.h index da7fcd492..0f8f42116 100644 --- a/Telegram/SourceFiles/settingswidget.h +++ b/Telegram/SourceFiles/settingswidget.h @@ -194,7 +194,6 @@ private slots: private: void notifyPeerUpdated(const Notify::PeerUpdate &update); - void notifyDownloadPathUpdated(const DownloadPathUpdate &update); void saveError(const QString &str = QString()); diff --git a/Telegram/SourceFiles/stdafx.h b/Telegram/SourceFiles/stdafx.h index 51bf3598e..58d0d38d1 100644 --- a/Telegram/SourceFiles/stdafx.h +++ b/Telegram/SourceFiles/stdafx.h @@ -45,7 +45,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma clang diagnostic pop #endif // __clang__ - #include #include diff --git a/Telegram/SourceFiles/structs.cpp b/Telegram/SourceFiles/structs.cpp index b971ddd3e..ace06622a 100644 --- a/Telegram/SourceFiles/structs.cpp +++ b/Telegram/SourceFiles/structs.cpp @@ -806,7 +806,7 @@ QString saveFileName(const QString &title, const QString &filter, const QString #elif defined Q_OS_LINUX name = name.replace(QRegularExpression(qsl("[\\/]")), qsl("_")); #endif - if (cAskDownloadPath() || savingAs) { + if (Global::AskDownloadPath() || savingAs) { if (!name.isEmpty() && name.at(0) == QChar::fromLatin1('.')) { name = filedialogDefaultName(prefix, name); } else if (dir.path() != qsl(".")) { @@ -851,12 +851,12 @@ QString saveFileName(const QString &title, const QString &filter, const QString } QString path; - if (cDownloadPath().isEmpty()) { + if (Global::DownloadPath().isEmpty()) { path = psDownloadPath(); - } else if (cDownloadPath() == qsl("tmp")) { + } else if (Global::DownloadPath() == qsl("tmp")) { path = cTempDir(); } else { - path = cDownloadPath(); + path = Global::DownloadPath(); } if (name.isEmpty()) name = qsl(".unknown"); if (name.at(0) == QChar::fromLatin1('.')) { @@ -1480,7 +1480,7 @@ QString DocumentData::filepath(FilePathResolveType type, bool forceSavingAs) con if (saveFromData) { if (type != FilePathResolveSaveFromData && type != FilePathResolveSaveFromDataSilent) { saveFromData = false; - } else if (type == FilePathResolveSaveFromDataSilent && (cAskDownloadPath() || forceSavingAs)) { + } else if (type == FilePathResolveSaveFromDataSilent && (Global::AskDownloadPath() || forceSavingAs)) { saveFromData = false; } } diff --git a/Telegram/SourceFiles/title.cpp b/Telegram/SourceFiles/title.cpp index e3cbdf91f..170afbd89 100644 --- a/Telegram/SourceFiles/title.cpp +++ b/Telegram/SourceFiles/title.cpp @@ -89,6 +89,8 @@ TitleWidget::TitleWidget(MainWindow *window) : TWidget(window) Sandbox::connect(SIGNAL(updateReady()), this, SLOT(showUpdateBtn())); #endif + subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); }); + if (cPlatform() != dbipWindows) { _minimize.hide(); _maximize.hide(); diff --git a/Telegram/SourceFiles/title.h b/Telegram/SourceFiles/title.h index a8ad2bfbe..7d6f4f760 100644 --- a/Telegram/SourceFiles/title.h +++ b/Telegram/SourceFiles/title.h @@ -39,7 +39,7 @@ private: }; -class TitleWidget : public TWidget { +class TitleWidget : public TWidget, private base::Subscriber { Q_OBJECT public: @@ -49,7 +49,6 @@ public: void resizeEvent(QResizeEvent *e); void updateBackButton(); - void updateAdaptiveLayout(); void updateCounter(); void mousePressEvent(QMouseEvent *e); @@ -77,6 +76,7 @@ signals: void hiderClicked(); private: + void updateAdaptiveLayout(); MainWindow *wnd; diff --git a/Telegram/SourceFiles/window/chat_background.cpp b/Telegram/SourceFiles/window/chat_background.cpp new file mode 100644 index 000000000..442c3c1f2 --- /dev/null +++ b/Telegram/SourceFiles/window/chat_background.cpp @@ -0,0 +1,90 @@ +/* +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 "window/chat_background.h" + +#include "mainwidget.h" +#include "localstorage.h" + +namespace Window { +namespace { + +NeverFreedPointer instance; + +} // namespace + +bool ChatBackground::empty() const { + return _image.isNull(); +} + +void ChatBackground::initIfEmpty() { + if (empty()) { + App::initBackground(); + } +} + +void ChatBackground::init(int32 id, QPixmap &&image, QPixmap &&dog) { + _id = id; + _image = std_::move(image); + _dog = std_::move(dog); + + notify(ChatBackgroundUpdate(ChatBackgroundUpdate::Type::New, _tile)); +} + +void ChatBackground::reset() { + _id = 0; + _image = QPixmap(); + _dog = QPixmap(); + _tile = false; + + notify(ChatBackgroundUpdate(ChatBackgroundUpdate::Type::New, _tile)); +} + +int32 ChatBackground::id() const { + return _id; +} + +const QPixmap &ChatBackground::image() const { + return _image; +} + +const QPixmap &ChatBackground::dog() const { + return _dog; +} + +bool ChatBackground::tile() const { + return _tile; +} + +void ChatBackground::setTile(bool tile) { + if (_tile != tile) { + _tile = tile; + Local::writeUserSettings(); + notify(ChatBackgroundUpdate(ChatBackgroundUpdate::Type::Changed, _tile)); + } +} + +ChatBackground *chatBackground() { + instance.makeIfNull(); + return instance.data(); +} + +} // namespace Window diff --git a/Telegram/SourceFiles/window/chat_background.h b/Telegram/SourceFiles/window/chat_background.h new file mode 100644 index 000000000..67a2bf72d --- /dev/null +++ b/Telegram/SourceFiles/window/chat_background.h @@ -0,0 +1,61 @@ +/* +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 Window { + +struct ChatBackgroundUpdate { + enum class Type { + New, + Changed, + Start, + }; + + ChatBackgroundUpdate(Type type, bool tiled) : type(type), tiled(tiled) { + } + Type type; + bool tiled; +}; + +class ChatBackground : public base::Observable { +public: + bool empty() const; + void initIfEmpty(); + void init(int32 id, QPixmap &&image, QPixmap &&dog); + void reset(); + + int32 id() const; + const QPixmap &image() const; + const QPixmap &dog() const; + bool tile() const; + void setTile(bool tile); + +private: + int32 _id = 0; + QPixmap _image; + QPixmap _dog; + bool _tile = false; + +}; + +ChatBackground *chatBackground(); + +} // namespace Window diff --git a/Telegram/SourceFiles/window/section_widget.h b/Telegram/SourceFiles/window/section_widget.h index 4cdc36e4c..b77377fbe 100644 --- a/Telegram/SourceFiles/window/section_widget.h +++ b/Telegram/SourceFiles/window/section_widget.h @@ -32,7 +32,7 @@ struct SectionSlideParams { bool withTopBarShadow = false; }; -class SectionWidget : public TWidget { +class SectionWidget : public TWidget, protected base::Subscriber { Q_OBJECT public: @@ -71,9 +71,6 @@ public: setFocus(); } - virtual void updateAdaptiveLayout() { - } - protected: void paintEvent(QPaintEvent *e) override; diff --git a/Telegram/SourceFiles/window/top_bar_widget.cpp b/Telegram/SourceFiles/window/top_bar_widget.cpp index fdc290a8b..bb2f68d20 100644 --- a/Telegram/SourceFiles/window/top_bar_widget.cpp +++ b/Telegram/SourceFiles/window/top_bar_widget.cpp @@ -50,6 +50,8 @@ TopBarWidget::TopBarWidget(MainWidget *w) : TWidget(w) connect(_info, SIGNAL(clicked()), this, SLOT(onInfoClicked())); connect(_search, SIGNAL(clicked()), this, SLOT(onSearch())); + subscribe(Adaptive::Changed(), [this]() { updateAdaptiveLayout(); }); + setCursor(style::cur_pointer); showAll(); } diff --git a/Telegram/SourceFiles/window/top_bar_widget.h b/Telegram/SourceFiles/window/top_bar_widget.h index 0b8500acd..f9206d121 100644 --- a/Telegram/SourceFiles/window/top_bar_widget.h +++ b/Telegram/SourceFiles/window/top_bar_widget.h @@ -30,7 +30,7 @@ class IconedButton; namespace Window { -class TopBarWidget : public TWidget { +class TopBarWidget : public TWidget, private base::Subscriber { Q_OBJECT public: @@ -51,8 +51,6 @@ public: void showAll(); void showSelected(uint32 selCount, bool canDelete = false); - void updateAdaptiveLayout(); - void updateMembersShowArea(); Ui::RoundButton *mediaTypeButton(); @@ -71,6 +69,8 @@ signals: void clicked(); private: + void updateAdaptiveLayout(); + MainWidget *main(); anim::fvalue a_over = { 0. }; Animation _a_appearance; diff --git a/Telegram/gyp/Telegram.gyp b/Telegram/gyp/Telegram.gyp index 56d8947e5..3798112ea 100644 --- a/Telegram/gyp/Telegram.gyp +++ b/Telegram/gyp/Telegram.gyp @@ -86,6 +86,7 @@ '<(src_loc)/application.h', '<(src_loc)/autoupdater.cpp', '<(src_loc)/autoupdater.h', + '<(src_loc)/config.h', '<(src_loc)/dialogswidget.cpp', '<(src_loc)/dialogswidget.h', '<(src_loc)/dropdown.cpp', @@ -427,6 +428,8 @@ '<(src_loc)/ui/scrollarea.h', '<(src_loc)/ui/twidget.cpp', '<(src_loc)/ui/twidget.h', + '<(src_loc)/window/chat_background.cpp', + '<(src_loc)/window/chat_background.h', '<(src_loc)/window/main_window.cpp', '<(src_loc)/window/main_window.h', '<(src_loc)/window/section_widget.cpp', diff --git a/Telegram/gyp/settings_win.gypi b/Telegram/gyp/settings_win.gypi index 873ff21a9..19136e791 100644 --- a/Telegram/gyp/settings_win.gypi +++ b/Telegram/gyp/settings_win.gypi @@ -20,6 +20,16 @@ { 'conditions': [ [ 'build_win', { + 'defines': [ + 'WIN32', + '_WINDOWS', + '_UNICODE', + 'UNICODE', + 'HAVE_STDINT_H', + 'ZLIB_WINAPI', + '_SCL_SECURE_NO_WARNINGS', + '_USING_V110_SDK71_', + ], 'msvs_cygwin_shell': 0, 'msvs_settings': { 'VCCLCompilerTool': { @@ -29,16 +39,6 @@ '/MP', # Enable multi process build. '/EHsc', # Catch C++ exceptions only, extern C functions never throw a C++ exception. ], - 'PreprocessorDefinitions': [ - 'WIN32', - '_WINDOWS', - '_UNICODE', - 'UNICODE', - 'HAVE_STDINT_H', - 'ZLIB_WINAPI', - '_SCL_SECURE_NO_WARNINGS', - '_USING_V110_SDK71_', - ], 'TreatWChar_tAsBuiltInType': 'false', }, 'VCLinkerTool': {