You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Tools/AssetProcessor/native/utilities/windowscreen.cpp

205 lines
6.3 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <QGuiApplication>
#include <QSettings>
#include <QScreen>
#include "windowscreen.h"
WindowScreen::WindowScreen(QObject* parent)
: QObject(parent)
{
}
WindowScreen::~WindowScreen()
{
}
void WindowScreen::loadSettings(int width, int height, int minimumWidth, int minimumHeight)
{
QSettings loader;
setPositionX(loader.value(m_windowName + "/" + "PositionX", 99999).toInt());
setPositionY(loader.value(m_windowName + "/" + "PositionY", 99999).toInt());
setWidth(loader.value(m_windowName + "/" + "Width", width).toInt());
setHeight(loader.value(m_windowName + "/" + "Height", height).toInt());
setWindowState(static_cast<QWindow::Visibility>(loader.value(m_windowName + "/" + "WindowState", QWindow::Windowed).toInt()));
if (!CheckSettings(minimumWidth, minimumHeight))
{
CenterWindowInPrimaryScreen(minimumWidth, minimumHeight);
}
}
void WindowScreen::saveSettings()
{
QSettings saver;
saver.remove(m_windowName + "/" + "WindowState");
saver.setValue(m_windowName + "/" + "WindowState", m_windowCurrentInfo.m_windowState);
//If the window current state is maximised or fullscreen than we save x,y,width and height
//of the window prev state so that it can be minimised correctly the next time we start the application
WindowScreenInfo* screenInfo = nullptr;
if (m_windowCurrentInfo.m_windowState != QWindow::Maximized && m_windowCurrentInfo.m_windowState != QWindow::FullScreen)
{
screenInfo = &m_windowCurrentInfo;
}
else
{
screenInfo = &m_windowPreviousInfo;
}
saver.remove(m_windowName + "/" + "PositionX");
saver.setValue(m_windowName + "/" + "PositionX", screenInfo->m_positionX);
saver.remove(m_windowName + "/" + "PositionY");
saver.setValue(m_windowName + "/" + "PositionY", screenInfo->m_positionY);
saver.remove(m_windowName + "/" + "Width");
saver.setValue(m_windowName + "/" + "Width", screenInfo->m_width);
saver.remove(m_windowName + "/" + "Height");
saver.setValue(m_windowName + "/" + "Height", screenInfo->m_height);
}
bool WindowScreen::CheckSettings(int minimumWidth, int minimumHeight)
{
if (m_windowCurrentInfo.m_positionX == 99999 && m_windowCurrentInfo.m_positionY == 99999)
{
//we are running the app first time and there is no settings to load from,
//we will centre the window ourselves
return false;
}
if (m_windowCurrentInfo.m_width < minimumWidth || m_windowCurrentInfo.m_height < minimumHeight)
{
return false;
}
//Check whether the window is fully inside the display
QScreen* screen = QGuiApplication::primaryScreen();
bool isPosXOK = m_windowCurrentInfo.m_positionX >= (screen->availableVirtualGeometry().x()) && m_windowCurrentInfo.m_positionX <= (screen->availableVirtualGeometry().width()) ? true : false;
bool isPosYOK = m_windowCurrentInfo.m_positionY >= (screen->availableVirtualGeometry().y()) && m_windowCurrentInfo.m_positionY <= (screen->availableVirtualGeometry().height()) ? true : false;
bool isWidthOK = m_windowCurrentInfo.m_positionX + m_windowCurrentInfo.m_width <= screen->availableVirtualSize().width() ? true : false;
bool isHeightOK = m_windowCurrentInfo.m_positionY + m_windowCurrentInfo.m_height <= screen->availableVirtualSize().height() ? true : false;
return isPosXOK && isPosYOK && isWidthOK && isHeightOK;
}
void WindowScreen::CenterWindowInPrimaryScreen(int minimumWidth, int minimumHeight)
{
//check to see whether the width is more than minimum width
if (m_windowCurrentInfo.m_width < minimumWidth)
{
m_windowCurrentInfo.m_width = minimumWidth;
}
//check to see whether the height is more than minimum height
if (m_windowCurrentInfo.m_height < minimumHeight)
{
m_windowCurrentInfo.m_height = minimumHeight;
}
QScreen* screen = QGuiApplication::primaryScreen();
m_windowCurrentInfo.m_positionX = qRound((screen->availableGeometry().width() - screen->availableGeometry().x()) / 2.0 - m_windowCurrentInfo.m_width / 2.0);
m_windowCurrentInfo.m_positionY = qRound((screen->availableGeometry().height() - screen->availableGeometry().y()) / 2.0 - m_windowCurrentInfo.m_height / 2.0);
m_windowCurrentInfo.m_windowState = QWindow::Windowed;
}
int WindowScreen::positionX() const
{
return m_windowCurrentInfo.m_positionX;
}
void WindowScreen::setPositionX(int posX)
{
if (posX == m_windowCurrentInfo.m_positionX)
{
return;
}
m_windowPreviousInfo.m_positionX = m_windowCurrentInfo.m_positionX;
m_windowCurrentInfo.m_positionX = posX;
Q_EMIT positionXChanged();
}
int WindowScreen::positionY() const
{
return m_windowCurrentInfo.m_positionY;
}
void WindowScreen::setPositionY(int posY)
{
if (posY == m_windowCurrentInfo.m_positionY)
{
return;
}
m_windowPreviousInfo.m_positionY = m_windowCurrentInfo.m_positionY;
m_windowCurrentInfo.m_positionY = posY;
Q_EMIT positionYChanged();
}
int WindowScreen::width() const
{
return m_windowCurrentInfo.m_width;
}
void WindowScreen::setWidth(int width)
{
if (width == m_windowCurrentInfo.m_width)
{
return;
}
m_windowPreviousInfo.m_width = m_windowCurrentInfo.m_width;
m_windowCurrentInfo.m_width = width;
Q_EMIT widthChanged();
}
int WindowScreen::height() const
{
return m_windowCurrentInfo.m_height;
}
void WindowScreen::setHeight(int height)
{
if (height == m_windowCurrentInfo.m_height)
{
return;
}
m_windowPreviousInfo.m_height = m_windowCurrentInfo.m_height;
m_windowCurrentInfo.m_height = height;
Q_EMIT heightChanged();
}
QString WindowScreen::windowName() const
{
return m_windowName;
}
void WindowScreen::setWindowName(QString windowName)
{
m_windowName = windowName;
}
QWindow::Visibility WindowScreen::windowState() const
{
return m_windowCurrentInfo.m_windowState;
}
void WindowScreen::setWindowState(QWindow::Visibility state)
{
if (m_windowCurrentInfo.m_windowState == state)
{
return;
}
m_windowPreviousInfo.m_windowState = m_windowCurrentInfo.m_windowState;
m_windowCurrentInfo.m_windowState = state;
Q_EMIT windowStateChanged();
}