-
alexander.mruchok authored
[+] AdaptiveWidget, ScreenInfo, DefaultMultiScreen, MultiScreenAbstract, screens, MultiScreenWindow, Screen,
417e6953
#include <QtDebug>
#include <QStackedWidget>
#include <QDesktopWidget>
#include <QApplication>
#include <QScreen>
#include "DapUiScreen.h"
#include "DapUiMainWindow.h"
#include "MainWindow.h"
/**
* @brief DapUiScreen::DapUiScreen
* @param parent
* @param a_sw
*/
DapUiScreen::DapUiScreen(QObject *parent, QStackedWidget * a_sw)
: QObject(parent), m_sw(a_sw)
{
Q_ASSERT(m_sw);
// Set up default rotations, childs could change that by their own
m_rotations.insert(Hor);
#ifdef DAP_PLATFORM_MOBILE
m_rotations.insert(Ver);
#endif
}
DapUiScreen::~DapUiScreen()
{
// for(auto l_page: m_page)
// delete l_page;
}
QSize DapUiScreen::getWindowSizeInPoints(ScreenSize screenSize/* = DapUiScreen::ScreenSize::Medium*/)
{
switch (screenSize) {
case DapUiScreen::ScreenSize::Small:
return QSize(640, 400);
case DapUiScreen::ScreenSize::Medium:
return QSize(1024, 744);
case DapUiScreen::ScreenSize::Big:
return QSize(1664, 1040);
default:
qWarning() << "Not supported Screen";
throw "Not supported Screen";
}
}
const char *DapUiScreen::PROP_SCREEN_SIZE = "screenSize";
DapUiScreen::ScreenSize DapUiScreen::getScreenSize()
{
ScreenSize screenSize; //returned value
QCoreApplication *app = QApplication::instance();
if (app->property(PROP_SCREEN_SIZE).isValid()) { //retun value from dinamic property if exist
return app->property(PROP_SCREEN_SIZE).value<ScreenSize>();
}
else {
QScreen *screen = QGuiApplication::primaryScreen();
QSize avSize = screen->availableSize();
int avWidth = avSize.width();
int avHeight = avSize.height();
#ifdef DAP_PLATFORM_DESKTOP
const QSize WINDOW_BORDER_MAX_SIZE_PX = QSize(0, 25); // width of left and right borders and height of caption and bottom border
const int TASK_BAR_MAX_SIZE_PX = 100; // For checking
QSize fullScreenSize = screen->size();
// in some cases task availableSize method return wrong sizes (too small).
// If there are several screens
bool severalScreens = QApplication::desktop()->screenCount() > 1;
bool wrongSize = (fullScreenSize.height() - avHeight) > TASK_BAR_MAX_SIZE_PX;
if (severalScreens && wrongSize)
{
avSize = fullScreenSize;
}
screenSize = Small;
for (auto curSize: {Big, Medium}) {
QSize screenResolution (getWindowSizeInPoints(curSize) += WINDOW_BORDER_MAX_SIZE_PX);
if (avHeight >= screenResolution.height()
&& avWidth >= screenResolution.width()) {
screenSize = curSize;
break;
}
}
#else
if(avHeight > avWidth){
avWidth = avSize.height();
avHeight = avSize.width();
}
if(avHeight < 700)
screenSize = Small;
if(avHeight > 1400)
screenSize = Big;
else
screenSize = Medium;
#endif
QApplication::instance()->setProperty(PROP_SCREEN_SIZE, QVariant(screenSize));
return screenSize;
}
}
/**
* @brief DapUiScreen::show
*/
void DapUiScreen::show()
{
rotate(rotation());
}
/**
* @brief DapUiScreenAbstract::rotate
* @param a_rot
*/
void DapUiScreen::rotate(ScreenRotation a_rot)
{
m_rotation=a_rot;
if(rotations().contains(a_rot))
sw()->setCurrentWidget(page(a_rot));
}
/**
* @brief DapUiScreenAbstract::connectTo
* @param a_objName
* @param a_signal
* @param a_recv
* @param a_slot
*/
void DapUiScreen::connectTo(const QString& a_objName,const char *a_signal, const QObject *a_recv, const char *a_slot )
{
foreach (auto rotation, rotations()) {
QWidget * w = getWidget(a_objName,rotation);
if(w)
connect(w,a_signal,a_recv,a_slot);
}
}
void DapUiScreen::update()
{
if(rotations().contains( DapUiMainWindow::getInstance()->rotation())){
QWidget * w = page(DapUiMainWindow::getInstance()->rotation());
if(w != sw()->currentWidget()){
sw()->setCurrentWidget(w);
}
}
}