///////////////////////////////////////////////////////////////////////////////
// MuldeR's Utilities for Qt
-// Copyright (C) 2004-2016 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2023 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include <QApplication>
#include <QWidget>
#include <QMutex>
+#include <QDesktopWidget>
//Win32 API
#ifndef _INC_WINDOWS
{
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;
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);
poWindow->setWindowOpacity(opacity);
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
- catch(...)
+ catch (...)
{
qWarning("Exception error while blinking!");
}
}
///////////////////////////////////////////////////////////////////////////////
+// DPI SCALING
+///////////////////////////////////////////////////////////////////////////////
+
+double MUtils::GUI::dpi_scale(void)
+{
+ if (const QApplication *const app = dynamic_cast<QApplication*>(QCoreApplication::instance()))
+ {
+ const double dpi_x = static_cast<double>(app->desktop()->logicalDpiX());
+ const double dpi_y = static_cast<double>(app->desktop()->logicalDpiY());
+ return qBound(1.0, ((dpi_x + dpi_y) / 192.0), 2.0);
+ }
+ return -1.0;
+}
+
+bool MUtils::GUI::scale_widget(QWidget *const widget, const bool recenter)
+{
+ if (widget && (widget->windowFlags().testFlag(Qt::WindowType::Window)))
+ {
+ 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
///////////////////////////////////////////////////////////////////////////////