2
0
mirror of https://github.com/telegramdesktop/tdesktop synced 2025-09-02 15:35:51 +00:00

Create dialogs widget only in the primary window.

This commit is contained in:
John Preston
2022-01-04 16:13:00 +03:00
parent 8b0725650d
commit 54247cd11b
8 changed files with 181 additions and 102 deletions

View File

@@ -223,15 +223,17 @@ MainWidget::MainWidget(
, _controller(controller)
, _dialogsWidth(st::columnMinimalWidthLeft)
, _thirdColumnWidth(st::columnMinimalWidthThird)
, _sideShadow(this)
, _dialogs(this, _controller)
, _history(this, _controller)
, _sideShadow(isPrimary()
? base::make_unique_q<Ui::PlainShadow>(this)
: nullptr)
, _dialogs(isPrimary()
? base::make_unique_q<Dialogs::Widget>(this, _controller)
: nullptr)
, _history(std::in_place, this, _controller)
, _playerPlaylist(this, _controller)
, _changelogs(Core::Changelogs::Create(&controller->session())) {
setupConnectingWidget();
connect(_dialogs, SIGNAL(cancelled()), this, SLOT(dialogsCancelled()));
_history->cancelRequests(
) | rpl::start_with_next([=] {
handleHistoryBack();
@@ -351,13 +353,14 @@ MainWidget::MainWidget(
handleAdaptiveLayoutUpdate();
}, lifetime());
_dialogs->show();
if (isOneColumn()) {
if (_dialogs) {
_dialogs->show();
}
if (_dialogs && isOneColumn()) {
_history->hide();
} else {
_history->show();
}
orderWidgets();
if (!Core::UpdaterDisabled()) {
@@ -399,9 +402,10 @@ not_null<Ui::RpWidget*> MainWidget::floatPlayerWidget() {
auto MainWidget::floatPlayerGetSection(Window::Column column)
-> not_null<Media::Player::FloatSectionDelegate*> {
if (isThreeColumn()) {
if (column == Window::Column::First) {
if (_dialogs && column == Window::Column::First) {
return _dialogs;
} else if (column == Window::Column::Second
|| !_dialogs
|| !_thirdSection) {
if (_mainSection) {
return _mainSection;
@@ -410,7 +414,7 @@ auto MainWidget::floatPlayerGetSection(Window::Column column)
}
return _thirdSection;
} else if (isNormalColumn()) {
if (column == Window::Column::First) {
if (_dialogs && column == Window::Column::First) {
return _dialogs;
} else if (_mainSection) {
return _mainSection;
@@ -418,12 +422,14 @@ auto MainWidget::floatPlayerGetSection(Window::Column column)
return _history;
}
if (isOneColumn() && selectingPeer()) {
Assert(_dialogs != nullptr);
return _dialogs;
} else if (_mainSection) {
return _mainSection;
} else if (!isOneColumn() || _history->peer()) {
return _history;
}
Assert(_dialogs != nullptr);
return _dialogs;
}
@@ -431,7 +437,9 @@ void MainWidget::floatPlayerEnumerateSections(Fn<void(
not_null<Media::Player::FloatSectionDelegate*> widget,
Window::Column widgetColumn)> callback) {
if (isThreeColumn()) {
callback(_dialogs, Window::Column::First);
if (_dialogs) {
callback(_dialogs, Window::Column::First);
}
if (_mainSection) {
callback(_mainSection, Window::Column::Second);
} else {
@@ -441,7 +449,9 @@ void MainWidget::floatPlayerEnumerateSections(Fn<void(
callback(_thirdSection, Window::Column::Third);
}
} else if (isNormalColumn()) {
callback(_dialogs, Window::Column::First);
if (_dialogs) {
callback(_dialogs, Window::Column::First);
}
if (_mainSection) {
callback(_mainSection, Window::Column::Second);
} else {
@@ -449,12 +459,14 @@ void MainWidget::floatPlayerEnumerateSections(Fn<void(
}
} else {
if (isOneColumn() && selectingPeer()) {
Assert(_dialogs != nullptr);
callback(_dialogs, Window::Column::First);
} else if (_mainSection) {
callback(_mainSection, Window::Column::Second);
} else if (!isOneColumn() || _history->peer()) {
callback(_history, Window::Column::Second);
} else {
Assert(_dialogs != nullptr);
callback(_dialogs, Window::Column::First);
}
}
@@ -616,6 +628,7 @@ void MainWidget::clearHider(not_null<Window::HistoryHider*> instance) {
_hider.release();
controller()->setSelectingPeer(false);
Assert(_dialogs != nullptr);
if (isOneColumn()) {
if (_mainSection || (_history->peer() && _history->peer()->id)) {
auto animationParams = ([=] {
@@ -638,7 +651,7 @@ void MainWidget::clearHider(not_null<Window::HistoryHider*> instance) {
}
void MainWidget::hiderLayer(base::unique_qptr<Window::HistoryHider> hider) {
if (controller()->window().locked()) {
if (!_dialogs || controller()->window().locked()) {
return;
}
@@ -764,6 +777,10 @@ bool MainWidget::insertBotCommand(const QString &cmd) {
}
void MainWidget::searchMessages(const QString &query, Dialogs::Key inChat) {
// #TODO windows
if (!_dialogs) {
return;
}
_dialogs->searchMessages(query, inChat);
if (isOneColumn()) {
Ui::showChatsList(&session());
@@ -1048,24 +1065,6 @@ void MainWidget::exportTopBarHeightUpdated() {
}
}
void MainWidget::inlineResultLoadProgress(FileLoader *loader) {
//InlineBots::Result *result = InlineBots::resultFromLoader(loader);
//if (!result) return;
//result->loaded();
//Ui::repaintInlineItem();
}
void MainWidget::inlineResultLoadFailed(FileLoader *loader, bool started) {
//InlineBots::Result *result = InlineBots::resultFromLoader(loader);
//if (!result) return;
//result->loaded();
//Ui::repaintInlineItem();
}
SendMenu::Type MainWidget::sendMenuType() const {
return _history->sendMenuType();
}
@@ -1195,6 +1194,7 @@ Image *MainWidget::newBackgroundThumb() {
void MainWidget::setInnerFocus() {
if (_hider || !_history->peer()) {
Assert(_dialogs != nullptr);
if (!_hider && _mainSection) {
_mainSection->setInnerFocus();
} else if (!_hider && _thirdSection) {
@@ -1257,7 +1257,9 @@ void MainWidget::ui_showPeerHistory(
PeerId peerId,
const SectionShow &params,
MsgId showAtMsgId) {
if (peerId && _controller->window().locked()) {
if (!peerId && !isPrimary()) {
return;
} else if (peerId && _controller->window().locked()) {
return;
} else if (auto peer = session().data().peerLoaded(peerId)) {
if (peer->migrateTo()) {
@@ -1350,7 +1352,7 @@ void MainWidget::ui_showPeerHistory(
}
if (!peerId) {
if (isOneColumn()) {
return _dialogs->isHidden();
return _dialogs && _dialogs->isHidden();
} else {
return false;
}
@@ -1360,7 +1362,7 @@ void MainWidget::ui_showPeerHistory(
return false;
}
return (_mainSection != nullptr)
|| (isOneColumn() && !_dialogs->isHidden());
|| (isOneColumn() && _dialogs && !_dialogs->isHidden());
}
if (back || way == Way::Forward) {
return true;
@@ -1392,6 +1394,7 @@ void MainWidget::ui_showPeerHistory(
}
if (onlyDialogs) {
Assert(_dialogs != nullptr);
_history->hide();
if (!_a_show.animating()) {
if (animationParams) {
@@ -1406,7 +1409,7 @@ void MainWidget::ui_showPeerHistory(
if (nowActivePeer && nowActivePeer != wasActivePeer) {
session().api().views().removeIncremented(nowActivePeer);
}
if (isOneColumn() && !_dialogs->isHidden()) {
if (isOneColumn() && _dialogs && !_dialogs->isHidden()) {
_dialogs->hide();
}
if (!_a_show.animating()) {
@@ -1425,7 +1428,7 @@ void MainWidget::ui_showPeerHistory(
}
}
if (!_dialogs->isHidden()) {
if (_dialogs && !_dialogs->isHidden()) {
if (!back) {
if (const auto history = _history->history()) {
_dialogs->scrollToEntry(Dialogs::RowDescriptor(
@@ -1676,7 +1679,9 @@ void MainWidget::showNewSection(
_history->finishAnimating();
_history->showHistory(0, 0);
_history->hide();
if (isOneColumn()) _dialogs->hide();
if (isOneColumn() && _dialogs) {
_dialogs->hide();
}
}
if (animationParams) {
@@ -1726,6 +1731,14 @@ void MainWidget::dropMainSection(Window::SectionWidget *widget) {
anim::activation::background));
}
PeerData *MainWidget::singlePeer() const {
return _controller->singlePeer();
}
bool MainWidget::isPrimary() const {
return _controller->isPrimary();
}
bool MainWidget::isMainSectionShown() const {
return _mainSection || _history->peer();
}
@@ -1802,7 +1815,9 @@ void MainWidget::showBackFromStack(
}
void MainWidget::orderWidgets() {
_dialogs->raise();
if (_dialogs) {
_dialogs->raise();
}
if (_player) {
_player->raise();
}
@@ -1812,7 +1827,9 @@ void MainWidget::orderWidgets() {
if (_callTopBar) {
_callTopBar->raise();
}
_sideShadow->raise();
if (_sideShadow) {
_sideShadow->raise();
}
if (_thirdShadow) {
_thirdShadow->raise();
}
@@ -1850,7 +1867,9 @@ QPixmap MainWidget::grabForShowAnimation(const Window::SectionSlideParams &param
_dialogsWidth,
height() - sectionTop));
} else {
_sideShadow->hide();
if (_sideShadow) {
_sideShadow->hide();
}
if (_thirdShadow) {
_thirdShadow->hide();
}
@@ -1859,7 +1878,9 @@ QPixmap MainWidget::grabForShowAnimation(const Window::SectionSlideParams &param
sectionTop,
width() - _dialogsWidth,
height() - sectionTop));
_sideShadow->show();
if (_sideShadow) {
_sideShadow->show();
}
if (_thirdShadow) {
_thirdShadow->show();
}
@@ -1879,7 +1900,9 @@ void MainWidget::windowShown() {
}
void MainWidget::dialogsToUp() {
_dialogs->jumpToTop();
if (_dialogs) {
_dialogs->jumpToTop();
}
}
void MainWidget::checkHistoryActivation() {
@@ -1950,7 +1973,9 @@ int MainWidget::getThirdSectionTop() const {
}
void MainWidget::hideAll() {
_dialogs->hide();
if (_dialogs) {
_dialogs->hide();
}
_history->hide();
if (_mainSection) {
_mainSection->hide();
@@ -1958,7 +1983,9 @@ void MainWidget::hideAll() {
if (_thirdSection) {
_thirdSection->hide();
}
_sideShadow->hide();
if (_sideShadow) {
_sideShadow->hide();
}
if (_thirdShadow) {
_thirdShadow->hide();
}
@@ -1978,11 +2005,14 @@ void MainWidget::showAll() {
Ui::show(Box<Ui::InformBox>(tr::lng_cloud_password_updated(tr::now)));
}
if (isOneColumn()) {
_sideShadow->hide();
if (_sideShadow) {
_sideShadow->hide();
}
if (_hider) {
_hider->hide();
}
if (selectingPeer()) {
Assert(_dialogs != nullptr);
_dialogs->showFast();
_history->hide();
if (_mainSection) _mainSection->hide();
@@ -1992,22 +2022,23 @@ void MainWidget::showAll() {
_history->show();
_history->updateControlsGeometry();
} else {
Assert(_dialogs != nullptr);
_dialogs->showFast();
_history->hide();
}
if (!selectingPeer()) {
if (_mainSection) {
_dialogs->hide();
} else if (isMainSectionShown()) {
_dialogs->hide();
}
if (!selectingPeer() && _dialogs && isMainSectionShown()) {
_dialogs->hide();
}
} else {
_sideShadow->show();
if (_sideShadow) {
_sideShadow->show();
}
if (_hider) {
_hider->show();
}
_dialogs->showFast();
if (_dialogs) {
_dialogs->showFast();
}
if (_mainSection) {
_mainSection->show();
} else {
@@ -2046,11 +2077,13 @@ void MainWidget::resizeEvent(QResizeEvent *e) {
void MainWidget::updateControlsGeometry() {
updateWindowAdaptiveLayout();
if (Core::App().settings().dialogsWidthRatio() > 0) {
_a_dialogsWidth.stop();
}
if (!_a_dialogsWidth.animating()) {
_dialogs->stopWidthAnimation();
if (_dialogs) {
if (Core::App().settings().dialogsWidthRatio() > 0) {
_a_dialogsWidth.stop();
}
if (!_a_dialogsWidth.animating()) {
_dialogs->stopWidthAnimation();
}
}
if (isThreeColumn()) {
if (!_thirdSection
@@ -2078,8 +2111,12 @@ void MainWidget::updateControlsGeometry() {
_thirdSection.destroy();
_thirdShadow.destroy();
}
auto mainSectionTop = getMainSectionTop();
auto dialogsWidth = qRound(_a_dialogsWidth.value(_dialogsWidth));
const auto mainSectionTop = getMainSectionTop();
auto dialogsWidth = _dialogs
? qRound(_a_dialogsWidth.value(_dialogsWidth))
: isOneColumn()
? _dialogsWidth
: 0;
if (isOneColumn()) {
if (_callTopBar) {
_callTopBar->resizeToWidth(dialogsWidth);
@@ -2093,13 +2130,19 @@ void MainWidget::updateControlsGeometry() {
_player->resizeToWidth(dialogsWidth);
_player->moveToLeft(0, _callTopBarHeight + _exportTopBarHeight);
}
auto mainSectionGeometry = QRect(
const auto mainSectionGeometry = QRect(
0,
mainSectionTop,
dialogsWidth,
height() - mainSectionTop);
_dialogs->setGeometryWithTopMoved(mainSectionGeometry, _contentScrollAddToY);
_history->setGeometryWithTopMoved(mainSectionGeometry, _contentScrollAddToY);
if (_dialogs) {
_dialogs->setGeometryWithTopMoved(
mainSectionGeometry,
_contentScrollAddToY);
}
_history->setGeometryWithTopMoved(
mainSectionGeometry,
_contentScrollAddToY);
if (_hider) _hider->setGeometry(0, 0, dialogsWidth, height());
} else {
auto thirdSectionWidth = _thirdSection ? _thirdColumnWidth : 0;
@@ -2111,17 +2154,21 @@ void MainWidget::updateControlsGeometry() {
thirdSectionWidth,
height() - thirdSectionTop);
}
accumulate_min(dialogsWidth, width() - st::columnMinimalWidthMain);
auto mainSectionWidth = width() - dialogsWidth - thirdSectionWidth;
_dialogs->setGeometryToLeft(0, 0, dialogsWidth, height());
const auto shadowTop = _controller->window().verticalShadowTop();
const auto shadowHeight = height() - shadowTop;
_sideShadow->setGeometryToLeft(
dialogsWidth,
shadowTop,
st::lineWidth,
shadowHeight);
if (_dialogs) {
accumulate_min(
dialogsWidth,
width() - st::columnMinimalWidthMain);
_dialogs->setGeometryToLeft(0, 0, dialogsWidth, height());
}
if (_sideShadow) {
_sideShadow->setGeometryToLeft(
dialogsWidth,
shadowTop,
st::lineWidth,
shadowHeight);
}
if (_thirdShadow) {
_thirdShadow->setGeometryToLeft(
width() - thirdSectionWidth - st::lineWidth,
@@ -2129,6 +2176,9 @@ void MainWidget::updateControlsGeometry() {
st::lineWidth,
shadowHeight);
}
const auto mainSectionWidth = width()
- dialogsWidth
- thirdSectionWidth;
if (_callTopBar) {
_callTopBar->resizeToWidth(mainSectionWidth);
_callTopBar->moveToLeft(dialogsWidth, 0);
@@ -2143,14 +2193,29 @@ void MainWidget::updateControlsGeometry() {
dialogsWidth,
_callTopBarHeight + _exportTopBarHeight);
}
_history->setGeometryWithTopMoved({ dialogsWidth, mainSectionTop, mainSectionWidth, height() - mainSectionTop }, _contentScrollAddToY);
_history->setGeometryWithTopMoved(QRect(
dialogsWidth,
mainSectionTop,
mainSectionWidth,
height() - mainSectionTop
), _contentScrollAddToY);
if (_hider) {
_hider->setGeometryToLeft(dialogsWidth, 0, mainSectionWidth, height());
_hider->setGeometryToLeft(
dialogsWidth,
0,
mainSectionWidth,
height());
}
}
if (_mainSection) {
auto mainSectionGeometry = QRect(_history->x(), mainSectionTop, _history->width(), height() - mainSectionTop);
_mainSection->setGeometryWithTopMoved(mainSectionGeometry, _contentScrollAddToY);
const auto mainSectionGeometry = QRect(
_history->x(),
mainSectionTop,
_history->width(),
height() - mainSectionTop);
_mainSection->setGeometryWithTopMoved(
mainSectionGeometry,
_contentScrollAddToY);
}
refreshResizeAreas();
if (_player) {
@@ -2252,7 +2317,7 @@ void MainWidget::ensureThirdColumnResizeAreaCreated() {
}
void MainWidget::updateDialogsWidthAnimated() {
if (Core::App().settings().dialogsWidthRatio() > 0) {
if (!_dialogs || Core::App().settings().dialogsWidthRatio() > 0) {
return;
}
auto dialogsWidth = _dialogsWidth;
@@ -2383,7 +2448,8 @@ bool MainWidget::eventFilter(QObject *o, QEvent *e) {
|| (_mainSection && (_mainSection == widget || _mainSection->isAncestorOf(widget)))
|| (_thirdSection && (_thirdSection == widget || _thirdSection->isAncestorOf(widget)))) {
_controller->dialogsListFocused().set(false);
} else if (_dialogs == widget || _dialogs->isAncestorOf(widget)) {
} else if (_dialogs
&& (_dialogs == widget || _dialogs->isAncestorOf(widget))) {
_controller->dialogsListFocused().set(true);
}
}
@@ -2404,13 +2470,19 @@ bool MainWidget::eventFilter(QObject *o, QEvent *e) {
void MainWidget::handleAdaptiveLayoutUpdate() {
showAll();
_sideShadow->setVisible(!isOneColumn());
if (_sideShadow) {
_sideShadow->setVisible(!isOneColumn());
}
if (_player) {
_player->updateAdaptiveLayout();
}
}
void MainWidget::handleHistoryBack() {
// #TODO windows
if (!_dialogs) {
return;
}
const auto historyFromFolder = _history->history()
? _history->history()->folder()
: nullptr;
@@ -2487,6 +2559,11 @@ int MainWidget::backgroundFromY() const {
}
void MainWidget::searchInChat(Dialogs::Key chat) {
// #TODO windows
if (!_dialogs) {
return;
}
if (_controller->openedFolder().current()) {
_controller->closeFolder();
}
@@ -2508,6 +2585,7 @@ void MainWidget::activate() {
return;
} else if (!_mainSection) {
if (_hider) {
Assert(_dialogs != nullptr);
_dialogs->setInnerFocus();
} else if (!Ui::isLayerShown()) {
if (!cSendPaths().isEmpty()) {
@@ -2527,6 +2605,7 @@ void MainWidget::activate() {
} else if (_history->peer()) {
_history->activate();
} else {
Assert(_dialogs != nullptr);
_dialogs->setInnerFocus();
}
}
@@ -2544,10 +2623,6 @@ bool MainWidget::doWeMarkAsRead() const {
return isActive() && !_mainSection;
}
int32 MainWidget::dlgsWidth() const {
return _dialogs->width();
}
void MainWidget::saveFieldToHistoryLocalDraft() {
_history->saveFieldToHistoryLocalDraft();
}