Added functions for "high DPI" support.

This commit is contained in:
LoRd_MuldeR 2017-03-03 22:51:01 +01:00
parent 62315b390f
commit db4513a63f
2 changed files with 74 additions and 26 deletions

View File

@ -62,6 +62,11 @@ namespace MUtils
//Theme support
MUTILS_API bool themes_enabled(void);
//DPI information
MUTILS_API double dpi_scale(void);
MUTILS_API bool scale_widget(QWidget *const widget, const bool recenter = true);
MUTILS_API bool center_widget(QWidget *const widget);
//System menu
MUTILS_API bool sysmenu_append(const QWidget *const win, const unsigned int identifier, const QString &text);
MUTILS_API bool sysmenu_update(const QWidget *const win, const unsigned int identifier, const QString &text);

View File

@ -31,6 +31,7 @@
#include <QApplication>
#include <QWidget>
#include <QMutex>
#include <QDesktopWidget>
//Win32 API
#ifndef _INC_WINDOWS
@ -84,38 +85,38 @@ namespace MUtils
{
namespace Internal
{
class WindowIconHelper : public QObject
{
public:
WindowIconHelper(QWidget *const parent, const HICON hIcon, const bool &bIsBigIcon)
class WindowIconHelper : public QObject
{
public:
WindowIconHelper(QWidget *const parent, const HICON hIcon, const bool &bIsBigIcon)
:
QObject(parent),
m_hIcon(hIcon)
{
SendMessage(reinterpret_cast<HWND>(parent->winId()), WM_SETICON, (bIsBigIcon ? ICON_BIG : ICON_SMALL), LPARAM(hIcon));
}
QObject(parent),
m_hIcon(hIcon)
{
SendMessage(reinterpret_cast<HWND>(parent->winId()), WM_SETICON, (bIsBigIcon ? ICON_BIG : ICON_SMALL), LPARAM(hIcon));
}
virtual ~WindowIconHelper(void)
virtual ~WindowIconHelper(void)
{
if (m_hIcon)
{
if(m_hIcon)
{
DestroyIcon(m_hIcon);
}
DestroyIcon(m_hIcon);
}
}
private:
const HICON m_hIcon;
};
private:
const HICON m_hIcon;
};
}
}
}
bool MUtils::GUI::set_window_icon(QWidget *const window, const QIcon &icon, const bool bIsBigIcon)
{
if((!icon.isNull()) && window->winId())
if ((!icon.isNull()) && window->winId())
{
const int extend = (bIsBigIcon ? 32 : 16);
if(const HICON hIcon = (HICON) MUtils::Win32Utils::qicon_to_hicon(&icon, extend, extend))
if (const HICON hIcon = (HICON)MUtils::Win32Utils::qicon_to_hicon(&icon, extend, extend))
{
new Internal::WindowIconHelper(window, hIcon, bIsBigIcon); /*will be free'd using QObject parent mechanism*/
return true;
@ -136,28 +137,28 @@ void MUtils::GUI::blink_window(QWidget *const poWindow, const unsigned int &coun
const double minOpac = 0.3;
const double delOpac = 0.1;
if(!g_blinkMutex.tryLock())
if (!g_blinkMutex.tryLock())
{
qWarning("Blinking is already in progress, skipping!");
return;
}
try
{
const int steps = static_cast<int>(ceil(maxOpac - minOpac) / delOpac);
const int sleep = static_cast<int>(floor(static_cast<double>(delay) / static_cast<double>(steps)));
const double opacity = poWindow->windowOpacity();
for(unsigned int i = 0; i < count; i++)
for (unsigned int i = 0; i < count; i++)
{
for(double x = maxOpac; x >= minOpac; x -= delOpac)
for (double x = maxOpac; x >= minOpac; x -= delOpac)
{
poWindow->setWindowOpacity(x);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
MUtils::OS::sleep_ms(sleep);
}
for(double x = minOpac; x <= maxOpac; x += delOpac)
for (double x = minOpac; x <= maxOpac; x += delOpac)
{
poWindow->setWindowOpacity(x);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
@ -168,7 +169,7 @@ void MUtils::GUI::blink_window(QWidget *const poWindow, const unsigned int &coun
poWindow->setWindowOpacity(opacity);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
catch(...)
catch (...)
{
qWarning("Exception error while blinking!");
}
@ -176,6 +177,48 @@ void MUtils::GUI::blink_window(QWidget *const poWindow, const unsigned int &coun
g_blinkMutex.unlock();
}
///////////////////////////////////////////////////////////////////////////////
// DPI SCALING
///////////////////////////////////////////////////////////////////////////////
double MUtils::GUI::dpi_scale(void)
{
if (const QApplication *const app = dynamic_cast<QApplication*>(QCoreApplication::instance()))
{
const double dpiX = static_cast<double>(app->desktop()->logicalDpiX());
const double dpiY = static_cast<double>(app->desktop()->logicalDpiY());
return qBound(1.0, ((dpiX + dpiY) / 192.0), 2.0);
}
return -1.0;
}
bool MUtils::GUI::scale_widget(QWidget *const widget, const bool recenter)
{
if (widget && (!widget->parentWidget()))
{
const double dpiScale = dpi_scale();
if ((dpiScale > 0.0) && (!qFuzzyCompare(dpiScale, 1.0)))
{
const QSize originalSize = widget->size();
widget->resize(qRound(originalSize.width() * dpiScale), qRound(originalSize.height() * dpiScale));
return recenter ? center_widget(widget) : true;
}
}
return false;
}
bool MUtils::GUI::center_widget(QWidget *const widget)
{
if (widget && (!widget->parentWidget()))
{
const QRect desktopRect = QApplication::desktop()->screenGeometry();
const QRect thisRect = widget->geometry();
widget->move((desktopRect.width() - thisRect.width()) / 2, (desktopRect.height() - thisRect.height()) / 2);
return true;
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
// FORCE QUIT
///////////////////////////////////////////////////////////////////////////////