diff --git a/Telegram/Resources/icons/mediaview_download.png b/Telegram/Resources/icons/mediaview/download.png similarity index 100% rename from Telegram/Resources/icons/mediaview_download.png rename to Telegram/Resources/icons/mediaview/download.png diff --git a/Telegram/Resources/icons/mediaview_download@2x.png b/Telegram/Resources/icons/mediaview/download@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_download@2x.png rename to Telegram/Resources/icons/mediaview/download@2x.png diff --git a/Telegram/Resources/icons/mediaview_download@3x.png b/Telegram/Resources/icons/mediaview/download@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_download@3x.png rename to Telegram/Resources/icons/mediaview/download@3x.png diff --git a/Telegram/Resources/icons/mediaview_file_corner.png b/Telegram/Resources/icons/mediaview/file_corner.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner.png rename to Telegram/Resources/icons/mediaview/file_corner.png diff --git a/Telegram/Resources/icons/mediaview_file_corner@2x.png b/Telegram/Resources/icons/mediaview/file_corner@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner@2x.png rename to Telegram/Resources/icons/mediaview/file_corner@2x.png diff --git a/Telegram/Resources/icons/mediaview_file_corner@3x.png b/Telegram/Resources/icons/mediaview/file_corner@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner@3x.png rename to Telegram/Resources/icons/mediaview/file_corner@3x.png diff --git a/Telegram/Resources/icons/mediaview_more.png b/Telegram/Resources/icons/mediaview/more.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more.png rename to Telegram/Resources/icons/mediaview/more.png diff --git a/Telegram/Resources/icons/mediaview_more@2x.png b/Telegram/Resources/icons/mediaview/more@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more@2x.png rename to Telegram/Resources/icons/mediaview/more@2x.png diff --git a/Telegram/Resources/icons/mediaview_more@3x.png b/Telegram/Resources/icons/mediaview/more@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more@3x.png rename to Telegram/Resources/icons/mediaview/more@3x.png diff --git a/Telegram/Resources/icons/mediaview_next.png b/Telegram/Resources/icons/mediaview/next.png similarity index 100% rename from Telegram/Resources/icons/mediaview_next.png rename to Telegram/Resources/icons/mediaview/next.png diff --git a/Telegram/Resources/icons/mediaview_next@2x.png b/Telegram/Resources/icons/mediaview/next@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_next@2x.png rename to Telegram/Resources/icons/mediaview/next@2x.png diff --git a/Telegram/Resources/icons/mediaview_next@3x.png b/Telegram/Resources/icons/mediaview/next@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_next@3x.png rename to Telegram/Resources/icons/mediaview/next@3x.png diff --git a/Telegram/Resources/icons/mediaview_rotate.png b/Telegram/Resources/icons/mediaview/rotate.png similarity index 100% rename from Telegram/Resources/icons/mediaview_rotate.png rename to Telegram/Resources/icons/mediaview/rotate.png diff --git a/Telegram/Resources/icons/mediaview_rotate@2x.png b/Telegram/Resources/icons/mediaview/rotate@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_rotate@2x.png rename to Telegram/Resources/icons/mediaview/rotate@2x.png diff --git a/Telegram/Resources/icons/mediaview_rotate@3x.png b/Telegram/Resources/icons/mediaview/rotate@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_rotate@3x.png rename to Telegram/Resources/icons/mediaview/rotate@3x.png diff --git a/Telegram/Resources/icons/mediaview_save_check.png b/Telegram/Resources/icons/mediaview/save_check.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check.png rename to Telegram/Resources/icons/mediaview/save_check.png diff --git a/Telegram/Resources/icons/mediaview_save_check@2x.png b/Telegram/Resources/icons/mediaview/save_check@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check@2x.png rename to Telegram/Resources/icons/mediaview/save_check@2x.png diff --git a/Telegram/Resources/icons/mediaview_save_check@3x.png b/Telegram/Resources/icons/mediaview/save_check@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check@3x.png rename to Telegram/Resources/icons/mediaview/save_check@3x.png diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom.png b/Telegram/Resources/icons/mediaview/shadow_bottom.png new file mode 100644 index 000000000..ccf350f2b Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_bottom.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png b/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png new file mode 100644 index 000000000..6d0c8762d Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png b/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png new file mode 100644 index 000000000..52ea5cfd1 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_top.png b/Telegram/Resources/icons/mediaview/shadow_top.png new file mode 100644 index 000000000..bc809219f Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_top.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_top@2x.png b/Telegram/Resources/icons/mediaview/shadow_top@2x.png new file mode 100644 index 000000000..2c329add7 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_top@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_top@3x.png b/Telegram/Resources/icons/mediaview/shadow_top@3x.png new file mode 100644 index 000000000..57d6e4fdb Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_top@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close.png new file mode 100644 index 000000000..6cacc40cf Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_close.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png new file mode 100644 index 000000000..04a35b7db Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png new file mode 100644 index 000000000..74b637e15 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png new file mode 100644 index 000000000..84df61a0a Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@2x.png new file mode 100644 index 000000000..77f55bfa9 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png new file mode 100644 index 000000000..7dca97312 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png new file mode 100644 index 000000000..b1577578a Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@2x.png new file mode 100644 index 000000000..fc183b360 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@3x.png new file mode 100644 index 000000000..e7336cef3 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_restore.png b/Telegram/Resources/icons/mediaview/title_viewer_button_restore.png new file mode 100644 index 000000000..a171db17b Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_restore.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_restore@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@2x.png new file mode 100644 index 000000000..a62d1a7e1 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png new file mode 100644 index 000000000..1651e5d62 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png new file mode 100644 index 000000000..9f319e196 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png new file mode 100644 index 000000000..088b66f1c Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png new file mode 100644 index 000000000..2ee92d25b Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png new file mode 100644 index 000000000..07e3a28e6 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png new file mode 100644 index 000000000..312be9534 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png new file mode 100644 index 000000000..5c5509cfa Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize.png new file mode 100644 index 000000000..89a0f911e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@2x.png new file mode 100644 index 000000000..368a4b1d2 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png new file mode 100644 index 000000000..df9993eef Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore.png new file mode 100644 index 000000000..ec21a77d6 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@2x.png new file mode 100644 index 000000000..c516259aa Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@3x.png new file mode 100644 index 000000000..4952b8c87 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@3x.png differ diff --git a/Telegram/Resources/icons/mediaview_close.png b/Telegram/Resources/icons/mediaview_close.png deleted file mode 100644 index 891b4735a..000000000 Binary files a/Telegram/Resources/icons/mediaview_close.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_close@2x.png b/Telegram/Resources/icons/mediaview_close@2x.png deleted file mode 100644 index 03995759f..000000000 Binary files a/Telegram/Resources/icons/mediaview_close@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_close@3x.png b/Telegram/Resources/icons/mediaview_close@3x.png deleted file mode 100644 index b52db954c..000000000 Binary files a/Telegram/Resources/icons/mediaview_close@3x.png and /dev/null differ diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index be94ae617..23116be7f 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -101,28 +101,27 @@ mediaviewVolumeToggle: IconButton(mediaviewControlsButton) { } mediaviewVolumeSkip: 4px; -mediaviewLeft: icon {{ "mediaview_next-flip_horizontal", mediaviewControlFg }}; -mediaviewRight: icon {{ "mediaview_next", mediaviewControlFg }}; -mediaviewClose: icon {{ "mediaview_close", mediaviewControlFg }}; -mediaviewSave: icon {{ "mediaview_download", mediaviewControlFg }}; -mediaviewRotate: icon {{ "mediaview_rotate", mediaviewControlFg }}; -mediaviewMore: icon {{ "mediaview_more", mediaviewControlFg }}; +mediaviewLeft: icon {{ "mediaview/next-flip_horizontal", mediaviewControlFg }}; +mediaviewRight: icon {{ "mediaview/next", mediaviewControlFg }}; +mediaviewSave: icon {{ "mediaview/download", mediaviewControlFg }}; +mediaviewRotate: icon {{ "mediaview/rotate", mediaviewControlFg }}; +mediaviewMore: icon {{ "mediaview/more", mediaviewControlFg }}; mediaviewFileRed: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileRedCornerFg }, + { "mediaview/file_corner", mediaviewFileRedCornerFg }, }; mediaviewFileYellow: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileYellowCornerFg }, + { "mediaview/file_corner", mediaviewFileYellowCornerFg }, }; mediaviewFileGreen: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileGreenCornerFg }, + { "mediaview/file_corner", mediaviewFileGreenCornerFg }, }; mediaviewFileBlue: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileBlueCornerFg }, + { "mediaview/file_corner", mediaviewFileBlueCornerFg }, }; mediaviewFilePadding: 18px; @@ -211,7 +210,7 @@ mediaviewControlsPopupMenu: PopupMenu(defaultPopupMenu) { animation: mediaviewControlsPanelAnimation; } -mediaviewSaveMsgCheck: icon {{ "mediaview_save_check", mediaviewSaveMsgFg }}; +mediaviewSaveMsgCheck: icon {{ "mediaview/save_check", mediaviewSaveMsgFg }}; mediaviewSaveMsgPadding: margins(55px, 19px, 29px, 20px); mediaviewSaveMsgCheckPos: point(23px, 21px); mediaviewSaveMsgShowing: 200; @@ -269,6 +268,56 @@ mediaviewDefaultTop: 120px; mediaviewDefaultWidth: 800px; mediaviewDefaultHeight: 600px; +mediaviewTitleMinimize: icon{ + { "mediaview/title_viewer_shadow_minimize", windowShadowFg }, + { "mediaview/title_viewer_button_minimize", mediaviewControlFg }, +}; +mediaviewTitleMaximize: icon{ + { "mediaview/title_viewer_shadow_maximize", windowShadowFg }, + { "mediaview/title_viewer_button_maximize", mediaviewControlFg }, +}; +mediaviewTitleRestore: icon{ + { "mediaview/title_viewer_shadow_restore", windowShadowFg }, + { "mediaview/title_viewer_button_restore", mediaviewControlFg }, +}; +mediaviewTitleClose: icon{ + { "mediaview/title_viewer_shadow_close", windowShadowFg }, + { "mediaview/title_viewer_button_close", mediaviewControlFg }, +}; +mediaviewTitleButton: IconButton(windowTitleButton) { + width: 44px; + height: 32px; +} +mediaviewTitle: WindowTitle(defaultWindowTitle) { + height: 0px; + bg: mediaviewBg; + bgActive: mediaviewBg; + fg: transparent; + fgActive: transparent; + minimize: IconButton(mediaviewTitleButton) { + icon: mediaviewTitleMinimize; + iconOver: mediaviewTitleMinimize; + } + minimizeIconActive: mediaviewTitleMinimize; + minimizeIconActiveOver: mediaviewTitleMinimize; + maximize: IconButton(mediaviewTitleButton) { + icon: mediaviewTitleMaximize; + iconOver: mediaviewTitleMaximize; + } + maximizeIconActive: mediaviewTitleMaximize; + maximizeIconActiveOver: mediaviewTitleMaximize; + restoreIcon: mediaviewTitleRestore; + restoreIconOver: mediaviewTitleRestore; + restoreIconActive: mediaviewTitleRestore; + restoreIconActiveOver: mediaviewTitleRestore; + close: IconButton(mediaviewTitleButton) { + icon: mediaviewTitleClose; + iconOver: mediaviewTitleClose; + } + closeIconActive: mediaviewTitleClose; + closeIconActiveOver: mediaviewTitleClose; +} + themePreviewSize: size(903px, 584px); themePreviewBg: windowBg; themePreviewOverlayOpacity: 0.8; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp index 88d72ffc0..880cc2b9d 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp @@ -558,10 +558,9 @@ auto OverlayWidget::RendererGL::ControlMeta(OverState control) switch (control) { case OverLeftNav: return { 0, &st::mediaviewLeft }; case OverRightNav: return { 1, &st::mediaviewRight }; - case OverClose: return { 2, &st::mediaviewClose }; - case OverSave: return { 3, &st::mediaviewSave }; - case OverRotate: return { 4, &st::mediaviewRotate }; - case OverMore: return { 5, &st::mediaviewMore }; + case OverSave: return { 2, &st::mediaviewSave }; + case OverRotate: return { 3, &st::mediaviewRotate }; + case OverMore: return { 4, &st::mediaviewMore }; } Unexpected("Control value in OverlayWidget::RendererGL::ControlIndex."); } @@ -573,7 +572,6 @@ void OverlayWidget::RendererGL::validateControls() { const auto metas = { ControlMeta(OverLeftNav), ControlMeta(OverRightNav), - ControlMeta(OverClose), ControlMeta(OverSave), ControlMeta(OverRotate), ControlMeta(OverMore), diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h index f143e712c..668a75113 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h @@ -130,7 +130,7 @@ private: Ui::GL::Image _groupThumbsImage; Ui::GL::Image _controlsImage; - static constexpr auto kControlsCount = 6; + static constexpr auto kControlsCount = 5; [[nodiscard]] static Control ControlMeta(OverState control); std::array _controlsTextures; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index f95668c54..aa4f64971 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -89,7 +89,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_media_view.h" #include "styles/style_chat.h" #include "styles/style_menu_icons.h" -#include "styles/style_calls.h" #ifdef Q_OS_MAC #include "platform/mac/touchbar/mac_touchbar_media_view.h" @@ -426,7 +425,7 @@ OverlayWidget::OverlayWidget() // // This doesn't make sense. But it works. :shrug: _titleBugWorkaround->setGeometry( - { 0, 0, size.width(), st::callTitleButton.height }); + { 0, 0, size.width(), st::mediaviewTitleButton.height }); _widget->setGeometry({ QPoint(), size }); updateControlsGeometry(); @@ -476,7 +475,7 @@ OverlayWidget::OverlayWidget() }); _window->setTitle(u"Media viewer"_q); - _window->setTitleStyle(st::callTitle); + _window->setTitleStyle(st::mediaviewTitle); if constexpr (Platform::IsMac()) { // Without Qt::Tool starting with Qt 5.15.1 this widget @@ -523,6 +522,10 @@ OverlayWidget::OverlayWidget() _touchTimer.setCallback([=] { handleTouchTimer(); }); _controlsHideTimer.setCallback([=] { hideControls(); }); + _helper->controlsActivations( + ) | rpl::start_with_next([=] { + activateControls(); + }, lifetime()); _docDownload->addClickHandler([=] { downloadMedia(); }); _docSaveAs->addClickHandler([=] { saveAs(); }); @@ -779,8 +782,6 @@ void OverlayWidget::updateGeometryToScreen(bool inMove) { void OverlayWidget::updateControlsGeometry() { const auto navSkip = st::mediaviewHeaderTop; - _closeNav = QRect(width() - st::mediaviewControlSize, 0, st::mediaviewControlSize, st::mediaviewControlSize); - _closeNavIcon = style::centerrect(_closeNav, st::mediaviewClose); _leftNav = QRect(0, navSkip, st::mediaviewControlSize, height() - 2 * navSkip); _leftNavIcon = style::centerrect(_leftNav, st::mediaviewLeft); _rightNav = QRect(width() - st::mediaviewControlSize, navSkip, st::mediaviewControlSize, height() - 2 * navSkip); @@ -1365,10 +1366,10 @@ bool OverlayWidget::updateControlsAnimation(crl::time now) { } else { _controlsOpacity.update(dt, anim::linear); } + _helper->setControlsOpacity(_controlsOpacity.current()); const auto toUpdate = QRegion() + (_over == OverLeftNav ? _leftNav : _leftNavIcon) + (_over == OverRightNav ? _rightNav : _rightNavIcon) - + (_over == OverClose ? _closeNav : _closeNavIcon) + _saveNavIcon + _rotateNavIcon + _moreNavIcon @@ -1759,6 +1760,7 @@ void OverlayWidget::close() { if (const auto window = Core::App().activeWindow()) { window->reActivate(); } + _helper->clearState(); } void OverlayWidget::minimize() { @@ -1769,6 +1771,7 @@ void OverlayWidget::minimize() { } void OverlayWidget::toggleFullScreen(bool fullscreen) { + _helper->clearState(); _fullscreen = fullscreen; _windowed = !fullscreen; initNormalGeometry(); @@ -1786,6 +1789,7 @@ void OverlayWidget::toggleFullScreen(bool fullscreen) { _wasWindowedMode = true; } savePosition(); + _helper->clearState(); } void OverlayWidget::activateControls() { @@ -4164,12 +4168,6 @@ void OverlayWidget::paintControls( _rightNav, _rightNavIcon, st::mediaviewRight }, - { - OverClose, - false, - _closeNav, - _closeNavIcon, - st::mediaviewClose }, { OverSave, _saveVisible, @@ -4695,7 +4693,6 @@ void OverlayWidget::handleMousePress( || _over == OverRotate || _over == OverIcon || _over == OverMore - || _over == OverClose || _over == OverVideo) { _down = _over; } else if (!_saveMsg.contains(position) || !isSaveMsgShown()) { @@ -4778,7 +4775,6 @@ void OverlayWidget::updateOverRect(OverState state) { case OverRotate: update(_rotateNavIcon); break; case OverIcon: update(_docIconRect); break; case OverHeader: update(_headerNav); break; - case OverClose: update(_closeNav); break; case OverMore: update(_moreNavIcon); break; } } @@ -4875,10 +4871,6 @@ void OverlayWidget::updateOver(QPoint pos) { updateOverState(OverIcon); } else if (_moreNav.contains(pos)) { updateOverState(OverMore); -#if 0 // close - } else if (_closeNav.contains(pos)) { - updateOverState(OverClose); -#endif } else if (documentContentShown() && finalContentRect().contains(pos)) { if ((_document->isVideoFile() || _document->isVideoMessage()) && _streamed) { updateOverState(OverVideo); @@ -4937,9 +4929,6 @@ void OverlayWidget::handleMouseRelease( handleDocumentClick(); } else if (_over == OverMore && _down == OverMore) { InvokeQueued(_widget, [=] { showDropdown(); }); - } else if (_over == OverClose && _down == OverClose) { - //close(); - toggleFullScreen(!_fullscreen); } else if (_over == OverVideo && _down == OverVideo) { if (_streamed) { playbackPauseResume(); @@ -5220,6 +5209,7 @@ void OverlayWidget::clearBeforeHide() { _controlsHideTimer.cancel(); _controlsState = ControlsShown; _controlsOpacity = anim::value(1); + _helper->setControlsOpacity(1.); _groupThumbs = nullptr; _groupThumbsRect = QRect(); _body->hide(); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 91bd3cede..becfa9053 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -129,7 +129,6 @@ private: OverNone, OverLeftNav, OverRightNav, - OverClose, OverHeader, OverName, OverDate, @@ -492,7 +491,6 @@ private: std::unique_ptr _collage; std::optional _collageData; - QRect _closeNav, _closeNavIcon; QRect _leftNav, _leftNavIcon, _rightNav, _rightNavIcon; QRect _headerNav, _nameNav, _dateNav; QRect _rotateNav, _rotateNavIcon, _saveNav, _saveNavIcon, _moreNav, _moreNavIcon; diff --git a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm index 39f5a1f33..877b8ea8a 100644 --- a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm +++ b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm @@ -118,9 +118,6 @@ void MacOverlayWidgetHelper::activate(int button) { void MacOverlayWidgetHelper::beforeShow(bool fullscreen) { _data->window->setAttribute(Qt::WA_MacAlwaysShowToolWindow, !fullscreen); _data->window->windowHandle()->setFlag(Qt::FramelessWindowHint, fullscreen); - if (!fullscreen) { - _data->window->setGeometry({ 100, 100, 800, 600 }); - } updateStyles(fullscreen); } diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp index b9805c13d..af4a98858 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp @@ -7,11 +7,170 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "platform/platform_overlay_widget.h" +#include "ui/effects/animations.h" #include "ui/platform/ui_platform_window_title.h" #include "ui/widgets/rp_window.h" -#include "styles/style_calls.h" +#include "ui/abstract_button.h" +#include "styles/style_media_view.h" namespace Platform { +namespace { + +using namespace Media::View; + +} // namespace + +class DefaultOverlayWidgetHelper::Buttons final + : public Ui::Platform::AbstractTitleButtons { +public: + using Control = Ui::Platform::TitleControl; + + object_ptr create( + not_null parent, + Control control, + const style::WindowTitle &st) override; + void updateState( + bool active, + bool maximized, + const style::WindowTitle &st) override; + void notifySynteticOver(Control control, bool over) override; + + void setMasterOpacity(float64 opacity); + [[nodiscard]] rpl::producer<> activations() const; + + void clearState(); + +private: + rpl::event_stream<> _activations; + rpl::variable _masterOpacity = 1.; + rpl::variable _maximized = false; + rpl::event_stream<> _clearStateRequests; + +}; + +object_ptr DefaultOverlayWidgetHelper::Buttons::create( + not_null parent, + Control control, + const style::WindowTitle &st) { + auto result = object_ptr(parent); + const auto raw = result.data(); + + struct State { + Ui::Animations::Simple animation; + float64 progress = -1.; + QImage frame; + bool maximized = false; + bool over = false; + }; + const auto state = raw->lifetime().make_state(); + + rpl::merge( + _masterOpacity.changes() | rpl::to_empty, + _maximized.changes() | rpl::to_empty + ) | rpl::start_with_next([=] { + raw->update(); + }, raw->lifetime()); + + _clearStateRequests.events( + ) | rpl::start_with_next([=] { + raw->clearState(); + raw->update(); + state->over = raw->isOver(); + state->animation.stop(); + }, raw->lifetime()); + + const auto icon = [&] { + switch (control) { + case Control::Minimize: return &st::mediaviewTitleMinimize; + case Control::Maximize: return &st::mediaviewTitleMaximize; + case Control::Close: return &st::mediaviewTitleClose; + } + Unexpected("Value in DefaultOverlayWidgetHelper::Buttons::create."); + }(); + + raw->resize(icon->size()); + state->frame = QImage( + icon->size() * style::DevicePixelRatio(), + QImage::Format_ARGB32_Premultiplied); + state->frame.setDevicePixelRatio(style::DevicePixelRatio()); + + const auto updateOver = [=] { + const auto over = raw->isOver(); + if (state->over == over) { + return; + } + state->over = over; + state->animation.start( + [=] { raw->update(); }, + state->over ? 0. : 1., + state->over ? 1. : 0., + st::mediaviewFadeDuration); + }; + + const auto prepareFrame = [=] { + const auto progress = state->animation.value(state->over ? 1. : 0.); + const auto maximized = _maximized.current(); + if (state->progress == progress && state->maximized == maximized) { + return; + } + state->progress = progress; + state->maximized = maximized; + auto current = icon; + if (control == Control::Maximize) { + current = maximized ? &st::mediaviewTitleRestore : icon; + } + const auto alpha = progress * kOverBackgroundOpacity; + const auto ialpha = anim::interpolate(0, 255, alpha); + state->frame.fill(QColor(255, 255, 255, ialpha)); + + auto q = QPainter(&state->frame); + const auto normal = maximized + ? kMaximizedIconOpacity + : kNormalIconOpacity; + q.setOpacity(progress + (1 - progress) * normal); + current->paint(q, 0, 0, raw->width()); + q.end(); + }; + + raw->paintRequest( + ) | rpl::start_with_next([=] { + updateOver(); + prepareFrame(); + + auto p = QPainter(raw); + p.setOpacity(_masterOpacity.current()); + p.drawImage(0, 0, state->frame); + }, raw->lifetime()); + + return result; +} + +void DefaultOverlayWidgetHelper::Buttons::updateState( + bool active, + bool maximized, + const style::WindowTitle &st) { + _maximized = maximized; +} + +void DefaultOverlayWidgetHelper::Buttons::notifySynteticOver( + Ui::Platform::TitleControl control, + bool over) { + if (over) { + _activations.fire({}); + } +} + +void DefaultOverlayWidgetHelper::Buttons::clearState() { + _clearStateRequests.fire({}); +} + +void DefaultOverlayWidgetHelper::Buttons::setMasterOpacity(float64 opacity) { + _masterOpacity = opacity; +} + +rpl::producer<> DefaultOverlayWidgetHelper::Buttons::activations() const { + return _activations.events(); +} void OverlayWidgetHelper::minimize(not_null window) { window->setWindowState(window->windowState() | Qt::WindowMinimized); @@ -20,10 +179,14 @@ void OverlayWidgetHelper::minimize(not_null window) { DefaultOverlayWidgetHelper::DefaultOverlayWidgetHelper( not_null window, Fn maximize) -: _controls(Ui::Platform::SetupSeparateTitleControls( +: _buttons(new DefaultOverlayWidgetHelper::Buttons()) +, _controls(Ui::Platform::SetupSeparateTitleControls( window, - st::callTitle, - std::move(maximize))) { + std::make_unique( + window->body(), + st::mediaviewTitle, + std::unique_ptr(_buttons.get()), + std::move(maximize)))) { } DefaultOverlayWidgetHelper::~DefaultOverlayWidgetHelper() = default; @@ -36,4 +199,20 @@ bool DefaultOverlayWidgetHelper::skipTitleHitTest(QPoint position) { return _controls->controls.geometry().contains(position); } +rpl::producer<> DefaultOverlayWidgetHelper::controlsActivations() { + return _buttons->activations(); +} + +void DefaultOverlayWidgetHelper::beforeShow(bool fullscreen) { + _buttons->clearState(); +} + +void DefaultOverlayWidgetHelper::clearState() { + _buttons->clearState(); +} + +void DefaultOverlayWidgetHelper::setControlsOpacity(float64 opacity) { + _buttons->setMasterOpacity(opacity); +} + } // namespace Platform diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.h b/Telegram/SourceFiles/platform/platform_overlay_widget.h index 06e969653..307e5282d 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.h +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.h @@ -15,6 +15,14 @@ namespace Ui::Platform { struct SeparateTitleControls; } // namespace Ui::Platform +namespace Media::View { + +inline constexpr auto kMaximizedIconOpacity = 0.6; +inline constexpr auto kNormalIconOpacity = 0.9; +inline constexpr auto kOverBackgroundOpacity = 0.15; + +} // namespace Media::View + namespace Platform { class OverlayWidgetHelper { @@ -26,6 +34,9 @@ public: [[nodiscard]] virtual bool skipTitleHitTest(QPoint position) { return false; } + [[nodiscard]] virtual rpl::producer<> controlsActivations() { + return rpl::never<>(); + } virtual void beforeShow(bool fullscreen) { } virtual void afterShow(bool fullscreen) { @@ -33,6 +44,10 @@ public: virtual void notifyFileDialogShown(bool shown) { } virtual void minimize(not_null window); + virtual void clearState() { + } + virtual void setControlsOpacity(float64 opacity) { + } }; [[nodiscard]] std::unique_ptr CreateOverlayWidgetHelper( @@ -48,8 +63,15 @@ public: void orderWidgets() override; bool skipTitleHitTest(QPoint position) override; + rpl::producer<> controlsActivations() override; + void beforeShow(bool fullscreen) override; + void clearState() override; + void setControlsOpacity(float64 opacity) override; private: + class Buttons; + + const not_null _buttons; const std::unique_ptr _controls; }; diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 104c72181..6cf89a6d0 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -320,10 +320,10 @@ historyFileOutPlay: icon {{ "history_file_play", historyFileOutIconFg }}; historyFileOutPlaySelected: icon {{ "history_file_play", historyFileOutIconFgSelected }}; historyFileInPlay: icon {{ "history_file_play", historyFileInIconFg }}; historyFileInPlaySelected: icon {{ "history_file_play", historyFileInIconFgSelected }}; -historyFileOutWaiting: icon {{ "mediaview_save_check", historyFileOutIconFg }}; -historyFileOutWaitingSelected: icon {{ "mediaview_save_check", historyFileOutIconFgSelected }}; -historyFileInWaiting: icon {{ "mediaview_save_check", historyFileInIconFg }}; -historyFileInWaitingSelected: icon {{ "mediaview_save_check", historyFileInIconFgSelected }}; +historyFileOutWaiting: icon {{ "mediaview/save_check", historyFileOutIconFg }}; +historyFileOutWaitingSelected: icon {{ "mediaview/save_check", historyFileOutIconFgSelected }}; +historyFileInWaiting: icon {{ "mediaview/save_check", historyFileInIconFg }}; +historyFileInWaitingSelected: icon {{ "mediaview/save_check", historyFileInIconFgSelected }}; historyFileThumbPause: icon {{ "history_file_pause", historyFileThumbIconFg }}; historyFileThumbPauseSelected: icon {{ "history_file_pause", historyFileThumbIconFgSelected }}; @@ -333,8 +333,8 @@ historyFileThumbCancel: icon {{ "history_file_cancel", historyFileThumbIconFg }} historyFileThumbCancelSelected: icon {{ "history_file_cancel", historyFileThumbIconFgSelected }}; historyFileThumbPlay: icon {{ "history_file_play", historyFileThumbIconFg }}; historyFileThumbPlaySelected: icon {{ "history_file_play", historyFileThumbIconFgSelected }}; -historyFileThumbWaiting: icon {{ "mediaview_save_check", historyFileThumbIconFg }}; -historyFileThumbWaitingSelected: icon {{ "mediaview_save_check", historyFileThumbIconFgSelected }}; +historyFileThumbWaiting: icon {{ "mediaview/save_check", historyFileThumbIconFg }}; +historyFileThumbWaitingSelected: icon {{ "mediaview/save_check", historyFileThumbIconFgSelected }}; historySendStateSpace: 24px; historySendStatePosition: point(-17px, -19px);