From bbd937115c8d4aa1c791394d36b41a007dfea895 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 3 Feb 2023 19:32:25 +0400 Subject: [PATCH] Add "Open in new window" to context menu. --- Telegram/Resources/icons/menu/new_window.png | Bin 0 -> 549 bytes .../Resources/icons/menu/new_window@2x.png | Bin 0 -> 864 bytes .../Resources/icons/menu/new_window@3x.png | Bin 0 -> 1284 bytes Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/calls/calls.style | 2 +- .../dialogs/dialogs_inner_widget.cpp | 16 ++------ .../dialogs/dialogs_inner_widget.h | 2 - .../SourceFiles/dialogs/dialogs_widget.cpp | 20 +--------- .../SourceFiles/media/view/media_view.style | 2 +- .../settings/settings_experimental.cpp | 2 - .../settings/settings_information.cpp | 20 ++++++---- Telegram/SourceFiles/ui/menu_icons.style | 1 + .../SourceFiles/window/window_controller.h | 1 - .../SourceFiles/window/window_peer_menu.cpp | 36 ++++++++++++++++++ .../SourceFiles/window/window_peer_menu.h | 2 + .../window/window_session_controller.cpp | 29 +++++++++++++- .../window/window_session_controller.h | 4 ++ Telegram/lib_ui | 2 +- 18 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 Telegram/Resources/icons/menu/new_window.png create mode 100644 Telegram/Resources/icons/menu/new_window@2x.png create mode 100644 Telegram/Resources/icons/menu/new_window@3x.png diff --git a/Telegram/Resources/icons/menu/new_window.png b/Telegram/Resources/icons/menu/new_window.png new file mode 100644 index 0000000000000000000000000000000000000000..5b926de16350fb24d3966359e73dee97eea3ea04 GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgftl!hcF~maf z?UaS94+V%EE6q_z)8$Sw0V+^JMQ+%9zv|sUvol%}~Q4 z!l2{u_n&Ov<7}!g|Ech9fB$=K{_UGPy;c6bnc7ot964?E)m5ujiCD|^uX}y({r3x9 z++NEspMJV2M(_RiYN;vbpPSG2-5a+*ZvB;7t*%8Xlg~?k`Th6s!wF~8lr3Kr9Bf&4 zM8R{C+v17OE4SZ1TPX8l*0QtDKY#vtMq*>bz6hNIEsM_V$=iPWWl7cEdu6+A=lWgv z7~?2l&>$ue@Z-&fih#uzXZWaX%e~y@FY+&IWyq_doi&$)Pkvb7@w?bi@5J}NF?!;Y zS;c)gK1g0{ds$*7!Sg}$`fJlt?WtayZ_4nszi$p(9lHDOv1Jl%j?Eix798Be&-C$Y z@kNnUA0#*SE)WRSIelnXhZTR7joc!^`0Y`;GHDYZI!62qTB%aC|Eh)0(Imq=b;mwj z?zeuh=6u@byLrcRq7s<4My(Cd*pu>6;meC%d9%{gCNKQEsA>PH3Y)$^+dFR5|Fvq& YKeD0gmE^XUmY^u|boFyt=akR{01G;m4~e&^GXE-yL$wXl14w2txpn&&m?=XPy2o;T;j^fwJ}4%9zuNIL#g zs`prXd;9F!(yOnY^0@l8EPHE|+T@qtfAiI&z~z< zTf2`gx|p$`VZvOg#_8eV;aXF(tmanP%nMuX>U-Pj$H$M1*;RY*y?y(3TY>`vi;T+c zB!7dcoA*z5Tm0}qMsi(3O-;>{rfAbkFHIgOJiMHj6reTrK*;K=A1ioN*4@mR=CzdL z*wdnk3(h~kePmM|kHaAbt-5Km?mxU$up~m~-rc)}f+l|c{vS_xve?UBYVfM#tDenV z6vE;y{^iprrz?B*?|=UJ=fQ-AoQO~jksID#rvda}YJX3>JO-M-VJ)?e3Naa2UXVM2o!i$M3$4_#-Ue?D8u z{_9q7*sHTvJ1(Xeb^aA7>v>uf`KgXWMdslxw#Ci|*qIvlzL!{P&ElA!pMS%KrTO6D zcPnqoMrD8EV-~uNe?8c6QnT7*&WJ<%Sv&9Msk2Y{AD%4G__^-#%R71HdefCZ^Ryqf=QjEx!*{&E zLgmNbdz)|SIM+sXolVo8>Qxc+++m8#`R literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/new_window@3x.png b/Telegram/Resources/icons/menu/new_window@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..873e1817164203980bf95d9640b8cfcdc257a13e GIT binary patch literal 1284 zcmZ8heK^wz9RKZwK`Xr?@aL&t5#--|#dzHvI|TsH1iY_zD9vc%NB|-sc>OTWj`c8Y+Mg2TCY<6}5Xd7ErgH|}Ul>BZP+^6|rirjsSa8IOAjp+7G_Ac)q*S_eQ zzYsSe$`j3dfk4w+UF`n@b(twNB?n=TKp^()=`ro?=;&Bll2}5~F^n^3Qc_aZnw$6c z^`#wM0)bHbA*J_W2ZR_5Ml6x+^YVJcD}k8>+Cz?q-Z1-ArNiQIL|@gL9Y`d2gPVXL z7tYPib#;*_dr>G(Vc|YBx@3a|mO`O;dwZWe>0HlDOnmnIc{^_qi@`_-2e;VR1kRV1 zIuYosPGA+ShN_MN-ClPIKGM*D6%UHVV%O+0BgoD7wY*^p-)-~efj9lf6BB2Gax*eO z*xc~PWA8nDe>LLF1cGlL(w_b9b}KO?#KY5*$zb^WNoi9th|1a5?K zvN#b|7eYII`ubDp{TEeLRTUM?^mK)WLcLB*Pk%}7WcVe)9+sCY+S;hP#>Pg@3Bx{Z zQT?N@@sBDh^6B+qL^4?+moHpPtcGoTU=t*jN-@LV?%Fkq3-|W;MyOOO)oO*qvGDMB z?3z`QbJ?t{tQ!Lo3Hs?rsTw}KaW&0waXPVq+&%Q;!dMe+^v0G_;-&=jr+UVc{45L^ zNg@W@I#i3r6l&NesPWsE0&t+cN6z?ooC01U64f;o7Z>MTy-Lg$>;PLdt;wjW2JJ>t z>gwuzFMpJCI9B3k34j?VvqV#jwc7ptygzwxP9}qrs*;nFO`4mUls!H1bb3KSfw1}` zDKxZGrOLj5ax!*RBe!ciJm7Fv*RotL$LLflmASe3`pHaC>JwVo84U@lT3k$tjUAep z5Nr_EGwmT?yB+hs$*kY<-&Vl!pG};%cgzvFEFT7+GayZ>NtI z{JJ~q%lKt0_xQI7@$uTJsTfhOAL+gBvTR^rpry5yYiaY^($aF7K#7iyX6Ndr)_#bR zAzT~=Uj}N2hFCcoS*>G+-V8pg*L(CAq$F=)CMPc}F1AGI60q)ep33PfKOKqqJ9S&( zojVklwf8F6Y<6nWxfbconDgiF(rfxP8tQq@_}G}q`tnpBk2j~b_Q}r6Ya}~6?x!6r z6Lnm&kn?!(MdoT-)T_{+Y1SbKtx=@w3%y=X_r8eF2(V>+5kogp2XORyhVxzWn!wDg zEMqs;aJP^xT@aHGgSUAq`Fwuc!x0?C#r&@@ab!e9QJS3}Y-FBeq>OW~Z0311hKlOl sA9NIUa+xj5#e5{S list) { auto result = 0; for (const auto &row : *list) { @@ -105,8 +99,6 @@ int PinnedDialogsCount( } // namespace -const char kOptionCtrlClickChatNewWindow[] = "ctrl-click-chat-new-window"; - struct InnerWidget::CollapsedRow { CollapsedRow(Data::Folder *folder) : folder(folder) { } @@ -2206,7 +2198,7 @@ void InnerWidget::contextMenuEvent(QContextMenuEvent *e) { _menu = base::make_unique_q( this, - row.fullId ? st::defaultPopupMenu : st::popupMenuWithIcons); + row.fullId ? st::defaultPopupMenu : st::popupMenuExpandedSeparator); if (row.fullId) { if (session().supportMode()) { fillSupportSearchMenu(_menu.get()); @@ -3310,9 +3302,7 @@ bool InnerWidget::chooseRow( const auto modifyChosenRow = []( ChosenRow row, Qt::KeyboardModifiers modifiers) { - if (CtrlClickChatNewWindow.value()) { - row.newWindow = (modifiers & Qt::ControlModifier); - } + row.newWindow = (modifiers & Qt::ControlModifier); return row; }; auto chosen = modifyChosenRow(computeChosenRow(), modifiers); diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index ec9aa015d..00d06ba99 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -54,8 +54,6 @@ struct TopicJumpCache; namespace Dialogs { -extern const char kOptionCtrlClickChatNewWindow[]; - class Row; class FakeRow; class IndexedList; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index a0b0867cc..ac7e00de3 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -484,24 +484,8 @@ void Widget::chosenRow(const ChosenRow &row) { const auto showAtMsgId = controller()->uniqueChatsInSearchResults() ? ShowAtUnreadMsgId : row.message.fullId.msg; - if (row.newWindow && controller()->canShowSeparateWindow(peer)) { - const auto active = controller()->activeChatCurrent(); - const auto fromActive = active.history() - ? (active.history()->peer == peer) - : false; - const auto toSeparate = [=] { - Core::App().ensureSeparateWindowForPeer( - peer, - showAtMsgId); - }; - if (fromActive) { - controller()->window().preventOrInvoke([=] { - controller()->clearSectionStack(); - toSeparate(); - }); - } else { - toSeparate(); - } + if (row.newWindow) { + controller()->showInNewWindow(peer, showAtMsgId); } else { controller()->showThread( history, diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index 0405886d1..bc8f8beb2 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -192,7 +192,7 @@ mediaviewControlsMenu: Menu(defaultMenu) { fg: mediaviewPlaybackIconRipple; } - arrow: icon {{ "dropdown_submenu_arrow", mediaviewPlaybackProgressFg }}; + arrow: icon {{ "menu/submenu_arrow", mediaviewPlaybackProgressFg }}; ripple: RippleAnimation(defaultRippleAnimation) { color: mediaviewPlaybackIconRipple; diff --git a/Telegram/SourceFiles/settings/settings_experimental.cpp b/Telegram/SourceFiles/settings/settings_experimental.cpp index 61163ac90..8359cf233 100644 --- a/Telegram/SourceFiles/settings/settings_experimental.cpp +++ b/Telegram/SourceFiles/settings/settings_experimental.cpp @@ -18,7 +18,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/application.h" #include "core/launcher.h" #include "chat_helpers/tabbed_panel.h" -#include "dialogs/dialogs_inner_widget.h" #include "lang/lang_keys.h" #include "mainwindow.h" #include "media/player/media_player_instance.h" @@ -140,7 +139,6 @@ void SetupExperimental( addToggle(ChatHelpers::kOptionTabbedPanelShowOnClick); addToggle(Core::kOptionFractionalScalingEnabled); addToggle(Window::kOptionViewProfileInChatsListContextMenu); - addToggle(Dialogs::kOptionCtrlClickChatNewWindow); addToggle(Ui::GL::kOptionAllowLinuxNvidiaOpenGL); addToggle(Ui::kOptionUseSmallMsgBubbleRadius); addToggle(Media::Player::kOptionDisableAutoplayNext); diff --git a/Telegram/SourceFiles/settings/settings_information.cpp b/Telegram/SourceFiles/settings/settings_information.cpp index 8f4931526..01f58aac0 100644 --- a/Telegram/SourceFiles/settings/settings_information.cpp +++ b/Telegram/SourceFiles/settings/settings_information.cpp @@ -7,7 +7,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "settings/settings_information.h" -#include "dialogs/dialogs_inner_widget.h" // kOptionCtrlClickChatNewWindow. #include "editor/photo_editor_layer_widget.h" #include "settings/settings_common.h" #include "ui/wrap/vertical_layout.h" @@ -23,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/boxes/confirm_box.h" #include "ui/controls/userpic_button.h" #include "ui/text/text_utilities.h" +#include "ui/delayed_activation.h" #include "ui/painter.h" #include "ui/unread_badge_paint.h" #include "core/application.h" @@ -55,6 +55,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/options.h" #include "base/unixtime.h" #include "base/random.h" +#include "styles/style_chat.h" // popupMenuExpandedSeparator #include "styles/style_dialogs.h" // dialogsPremiumIcon #include "styles/style_layers.h" #include "styles/style_settings.h" @@ -670,9 +671,16 @@ void SetupAccountsWrap( } state->menu = base::make_unique_q( raw, - st::popupMenuWithIcons); + st::popupMenuExpandedSeparator); const auto addAction = Ui::Menu::CreateAddActionCallback( state->menu); + addAction(tr::lng_context_new_window(tr::now), [=] { + Ui::PreventDelayedActivation(); + Core::App().ensureSeparateWindowForAccount(account); + Core::App().domain().maybeActivate(account); + }, &st::menuIconNewWindow); + Window::AddSeparatorAndShiftUp(addAction); + addAction(tr::lng_profile_copy_phone(tr::now), [=] { const auto phone = rpl::variable( Info::Profile::PhoneValue(session->user())); @@ -812,9 +820,7 @@ not_null*> AccountsList::setupAdd() { ) | rpl::start_with_next([=](Qt::MouseButton which) { if (which == Qt::LeftButton) { const auto modifiers = button->clickModifiers(); - const auto newWindow = (modifiers & Qt::ControlModifier) - && base::options::lookup( - Dialogs::kOptionCtrlClickChatNewWindow).value(); + const auto newWindow = (modifiers & Qt::ControlModifier); add(Environment::Production, newWindow); return; } else if (which != Qt::RightButton @@ -884,9 +890,7 @@ void AccountsList::rebuild() { _currentAccountActivations.fire({}); return; } - const auto newWindow = (modifiers & Qt::ControlModifier) - && base::options::lookup( - Dialogs::kOptionCtrlClickChatNewWindow).value(); + const auto newWindow = (modifiers & Qt::ControlModifier); auto activate = [=, guard = _accountSwitchGuard.make_guard()]{ if (guard) { _reorder->finishReordering(); diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index fef75c9ad..142cc47f0 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -99,6 +99,7 @@ menuIconSpoilerOff: icon {{ "menu/spoiler_off", menuIconColor }}; menuIconDisable: icon {{ "menu/disable", menuIconColor }}; menuIconPhotoSet: icon {{ "menu/photo_set", menuIconColor }}; menuIconPhotoSuggest: icon {{ "menu/photo_suggest", menuIconColor }}; +menuIconNewWindow: icon {{ "menu/new_window", menuIconColor }}; menuIconTTLAny: icon {{ "menu/auto_delete_plain", menuIconColor }}; menuIconTTLAnyTextPosition: point(11px, 22px); diff --git a/Telegram/SourceFiles/window/window_controller.h b/Telegram/SourceFiles/window/window_controller.h index 69693da24..b106a4d51 100644 --- a/Telegram/SourceFiles/window/window_controller.h +++ b/Telegram/SourceFiles/window/window_controller.h @@ -147,7 +147,6 @@ private: MsgId singlePeerShowAtMsgId); void setupSideBar(); void sideBarChanged(); - void logoutWithChecks(Main::Account *account); void showBox( object_ptr content, diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 56ad3f55d..2e00071fa 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -41,6 +41,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/menu/menu_add_action_callback_factory.h" #include "ui/layers/generic_box.h" #include "ui/toasts/common_toasts.h" +#include "ui/delayed_activation.h" #include "main/main_session.h" #include "main/main_session_settings.h" #include "menu/menu_mute.h" @@ -81,6 +82,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/application.h" #include "export/export_manager.h" #include "boxes/peers/edit_peer_info_box.h" +#include "styles/style_chat.h" #include "styles/style_layers.h" #include "styles/style_boxes.h" #include "styles/style_window.h" // st::windowMinWidth @@ -254,6 +256,7 @@ private: void addToggleMuteSubmenu(bool addSeparator); void addSupportInfo(); void addInfo(); + void addNewWindow(); void addToggleFolder(); void addToggleUnreadMark(); void addToggleArchive(); @@ -597,6 +600,25 @@ void Filler::addToggleUnreadMark() { }, (unread ? &st::menuIconMarkRead : &st::menuIconMarkUnread)); } +void Filler::addNewWindow() { + const auto history = _request.key.history(); + if (!_peer + || _topic + || _peer->isForum() + || (history + && history->useTopPromotion() + && !history->topPromotionType().isEmpty())) { + return; + } + const auto peer = _peer; + const auto controller = _controller; + _addAction(tr::lng_context_new_window(tr::now), [=] { + Ui::PreventDelayedActivation(); + controller->showInNewWindow(peer); + }, &st::menuIconNewWindow); + AddSeparatorAndShiftUp(_addAction); +} + void Filler::addToggleArchive() { if (!_peer || _topic) { return; @@ -1162,6 +1184,7 @@ void Filler::addVideoChat() { } void Filler::fillContextMenuActions() { + addNewWindow(); addHidePromotion(); addToggleArchive(); addTogglePin(); @@ -2413,4 +2436,17 @@ void MarkAsReadThread(not_null thread) { } } +void AddSeparatorAndShiftUp(const PeerMenuCallback &addAction) { + addAction({ .isSeparator = true }); + + const auto &st = st::popupMenuExpandedSeparator.menu; + const auto shift = st::popupMenuExpandedSeparator.scrollPadding.top() + + st.itemPadding.top() + + st.itemStyle.font->height + + st.itemPadding.bottom() + + st.separator.padding.top() + + st.separator.width / 2; + addAction({ .addTopShift = -shift }); +} + } // namespace Window diff --git a/Telegram/SourceFiles/window/window_peer_menu.h b/Telegram/SourceFiles/window/window_peer_menu.h index ebe249dd0..d224197d1 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.h +++ b/Telegram/SourceFiles/window/window_peer_menu.h @@ -164,4 +164,6 @@ void UnpinAllMessages( [[nodiscard]] bool IsUnreadThread(not_null thread); void MarkAsReadThread(not_null thread); +void AddSeparatorAndShiftUp(const PeerMenuCallback &addAction); + } // namespace Window diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 67b82fba9..81a369019 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1460,7 +1460,7 @@ void SessionController::closeThirdSection() { bool SessionController::canShowSeparateWindow( not_null peer) const { - return peer->computeUnavailableReason().isEmpty(); + return !peer->isForum() && peer->computeUnavailableReason().isEmpty(); } void SessionController::showPeer(not_null peer, MsgId msgId) { @@ -1690,6 +1690,33 @@ void SessionController::clearChooseReportMessages() { content()->clearChooseReportMessages(); } +void SessionController::showInNewWindow( + not_null peer, + MsgId msgId) { + if (!canShowSeparateWindow(peer)) { + showThread( + peer->owner().history(peer), + msgId, + Window::SectionShow::Way::ClearStack); + return; + } + const auto active = activeChatCurrent(); + const auto fromActive = active.history() + ? (active.history()->peer == peer) + : false; + const auto toSeparate = [=] { + Core::App().ensureSeparateWindowForPeer(peer, msgId); + }; + if (fromActive) { + window().preventOrInvoke([=] { + clearSectionStack(); + toSeparate(); + }); + } else { + toSeparate(); + } +} + void SessionController::toggleChooseChatTheme(not_null peer) { content()->toggleChooseChatTheme(peer); } diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index 76f12014a..dad287fd5 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -477,6 +477,10 @@ public: Fn done); void clearChooseReportMessages(); + void showInNewWindow( + not_null peer, + MsgId msgId = ShowAtUnreadMsgId); + void toggleChooseChatTheme(not_null peer); [[nodiscard]] bool dialogsListFocused() const { diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 30e765785..98fa93787 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 30e765785946f3e4aa89d1b1b7fa2118b612a8a0 +Subproject commit 98fa93787a13d8ad9427facb465500fe3179860e