Update media viewer geometry on showing and screen change

This commit is contained in:
Ilya Fedin 2020-11-16 20:47:32 +04:00 committed by John Preston
parent b71f61dec3
commit cd67cb1c62
2 changed files with 41 additions and 10 deletions

View file

@ -359,6 +359,7 @@ OverlayWidget::OverlayWidget()
} else {
setWindowFlags(Qt::FramelessWindowHint);
}
updateGeometry(QApplication::primaryScreen()->geometry());
moveToScreen();
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_TranslucentBackground, true);
@ -374,6 +375,17 @@ OverlayWidget::OverlayWidget()
setWindowState(Qt::WindowFullScreen);
}
connect(
windowHandle(),
&QWindow::visibleChanged,
this,
[=](bool visible) { handleVisibleChanged(visible); });
connect(
windowHandle(),
&QWindow::screenChanged,
this,
[=](QScreen *screen) { handleScreenChanged(screen); });
#if defined Q_OS_MAC && !defined OS_OSX
TouchBar::SetupMediaViewTouchBar(
winId(),
@ -417,7 +429,7 @@ void OverlayWidget::refreshLang() {
InvokeQueued(this, [this] { updateThemePreviewGeometry(); });
}
void OverlayWidget::moveToScreen(bool force) {
void OverlayWidget::moveToScreen() {
const auto widgetScreen = [&](auto &&widget) -> QScreen* {
if (auto handle = widget ? widget->windowHandle() : nullptr) {
return handle->screen();
@ -432,14 +444,10 @@ void OverlayWidget::moveToScreen(bool force) {
if (activeWindowScreen && myScreen && myScreen != activeWindowScreen) {
windowHandle()->setScreen(activeWindowScreen);
}
const auto screen = activeWindowScreen
? activeWindowScreen
: QApplication::primaryScreen();
const auto available = screen->geometry();
if (!force && geometry() == available) {
return;
}
setGeometry(available);
}
void OverlayWidget::updateGeometry(const QRect &rect) {
setGeometry(rect);
auto navSkip = 2 * st::mediaviewControlMargin + st::mediaviewControlSize;
_closeNav = myrtlrect(width() - st::mediaviewControlMargin - st::mediaviewControlSize, st::mediaviewControlMargin, st::mediaviewControlSize, st::mediaviewControlSize);
@ -1294,6 +1302,12 @@ void OverlayWidget::onScreenResized(int screen) {
const auto changed = (screen >= 0 && screen < screens.size())
? screens[screen]
: nullptr;
if (windowHandle()
&& windowHandle()->screen()
&& changed
&& windowHandle()->screen() == changed) {
updateGeometry(changed->geometry());
}
if (!windowHandle()
|| !windowHandle()->screen()
|| !changed
@ -1302,6 +1316,19 @@ void OverlayWidget::onScreenResized(int screen) {
}
}
void OverlayWidget::handleVisibleChanged(bool visible) {
if (visible) {
const auto screen = windowHandle()->screen()
? windowHandle()->screen()
: QApplication::primaryScreen();
updateGeometry(screen->geometry());
}
}
void OverlayWidget::handleScreenChanged(QScreen *screen) {
updateGeometry(screen->geometry());
}
void OverlayWidget::onToMessage() {
if (!_session) {
return;

View file

@ -208,10 +208,14 @@ private:
void assignMediaPointer(not_null<PhotoData*> photo);
void updateOver(QPoint mpos);
void moveToScreen(bool force = false);
void moveToScreen();
bool moveToNext(int delta);
void preloadData(int delta);
void updateGeometry(const QRect &rect);
void handleVisibleChanged(bool visible);
void handleScreenChanged(QScreen *screen);
bool contentCanBeSaved() const;
void checkForSaveLoaded();