///////////////////////////////////////////////////////////////////////////////
// MuldeR's Utilities for Qt
-// Copyright (C) 2004-2014 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2015 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
// http://www.gnu.org/licenses/lgpl-2.1.txt
//////////////////////////////////////////////////////////////////////////////////
+//MUtils
#include <MUtils/GUI.h>
+#include <MUtils/OSSupport.h>
+
+//Internal
+#include "Utils_Win32.h"
//Qt
+#include <QIcon>
#include <QApplication>
#include <QWidget>
+#include <QMutex>
///////////////////////////////////////////////////////////////////////////////
// BROADCAST
}
///////////////////////////////////////////////////////////////////////////////
-// BROADCAST
+// WINDOW ICON
+///////////////////////////////////////////////////////////////////////////////
+
+namespace MUtils
+{
+ namespace GUI
+ {
+ namespace Internal
+ {
+ class WindowIconHelper : public QObject
+ {
+ public:
+ WindowIconHelper(QWidget *const parent, const HICON hIcon, const bool &bIsBigIcon)
+ :
+ QObject(parent),
+ m_hIcon(hIcon)
+ {
+ SendMessage(parent->winId(), WM_SETICON, (bIsBigIcon ? ICON_BIG : ICON_SMALL), LPARAM(hIcon));
+ }
+
+ ~WindowIconHelper(void)
+ {
+ if(m_hIcon)
+ {
+ DestroyIcon(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())
+ {
+ const int extend = (bIsBigIcon ? 32 : 16);
+ if(HICON hIcon = qicon_to_hicon(icon, extend, extend))
+ {
+ if(new Internal::WindowIconHelper(window, hIcon, bIsBigIcon))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// BLINK WINDOW
+///////////////////////////////////////////////////////////////////////////////
+
+static QMutex g_blinkMutex;
+
+void MUtils::GUI::blink_window(QWidget *const poWindow, const unsigned int &count, const unsigned int &delay)
+{
+ const double maxOpac = 1.0;
+ const double minOpac = 0.3;
+ const double delOpac = 0.1;
+
+ 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(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)
+ {
+ poWindow->setWindowOpacity(x);
+ QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
+ MUtils::OS::sleep_ms(sleep);
+ }
+ }
+
+ poWindow->setWindowOpacity(opacity);
+ QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
+ }
+ catch(...)
+ {
+ qWarning("Exception error while blinking!");
+ }
+
+ g_blinkMutex.unlock();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// FORCE QUIT
///////////////////////////////////////////////////////////////////////////////
void MUtils::GUI::force_quit(void)