refactor(@desktop/general): status custom events and os notification moved to the status namespace

- DockShowAppEvent
- OSThemeEvent
- OSNotification
are now part of our `Status` namespace

Corresponding files are renamed and moved to appropriate Status folder.
This commit is contained in:
Sale Djenic 2021-09-07 10:31:59 +02:00 committed by Michał
parent 15b44e7b8f
commit ca536cf714
13 changed files with 182 additions and 146 deletions

View File

@ -82,11 +82,11 @@ DOS_API void DOS_CALL dos_qguiapplication_delete(void);
DOS_API void DOS_CALL dos_qguiapplication_icon(const char *filename); DOS_API void DOS_CALL dos_qguiapplication_icon(const char *filename);
DOS_API void dos_qguiapplication_installEventFilter(DosStatusEventObject *vptr); DOS_API void dos_qguiapplication_installEventFilter(DosEvent *vptr);
DOS_API void dos_qapplication_clipboard_setText(const char* text); DOS_API void dos_qapplication_clipboard_setText(const char* text);
DOS_API void dos_qapplication_installEventFilter(DosStatusEventObject *vptr); DOS_API void dos_qapplication_installEventFilter(DosEvent *vptr);
DOS_API void dos_qapplication_clipboard_setImage(const char *text); DOS_API void dos_qapplication_clipboard_setImage(const char *text);
@ -998,16 +998,25 @@ DOS_API void DOS_CALL dos_singleinstance_delete(DosSingleInstance *vptr);
/// @} /// @}
/// Status event object #pragma region Events exposed methods
DOS_API DosStatusEventObject* dos_statusevent_create_showAppEvent(DosQQmlApplicationEngine* vptr);
DOS_API DosStatusEventObject* dos_statusevent_create_osThemeEvent(DosQQmlApplicationEngine* vptr);
DOS_API void dos_statusevent_delete(DosStatusEventObject* vptr);
/// Status notification object DOS_API DosEvent* dos_event_create_showAppEvent(DosQQmlApplicationEngine* vptr);
DOS_API DosStatusOSNotificationObject* dos_statusosnotification_create(); DOS_API DosEvent* dos_event_create_osThemeEvent(DosQQmlApplicationEngine* vptr);
DOS_API void dos_statusosnotification_show_notification(DosStatusOSNotificationObject* vptr, DOS_API void dos_event_delete(DosEvent* vptr);
#pragma endregion
#pragma region OS notification exposed methods
DOS_API DosOSNotification* dos_osnotification_create();
DOS_API void dos_osnotification_show_notification(DosOSNotification* vptr,
const char* title, const char* message, const char* identifier); const char* title, const char* message, const char* identifier);
DOS_API void dos_statusosnotification_delete(DosStatusOSNotificationObject* vptr); DOS_API void dos_osnotification_delete(DosOSNotification* vptr);
#pragma endregion
#pragma endregion
DOS_API char *dos_to_local_file(const char* fileUrl); DOS_API char *dos_to_local_file(const char* fileUrl);

View File

@ -98,11 +98,13 @@ typedef void DosPixmap;
/// A pointer to SingleInstance /// A pointer to SingleInstance
typedef void DosSingleInstance; typedef void DosSingleInstance;
/// A pointer to a status event object which is actualy a QObject /// A pointer to a event object which is actualy a QObject
typedef void DosStatusEventObject; typedef void DosEvent;
/// A pointer to a os notification object which is actualy a QObject
typedef DosQObject DosOSNotification;
/// A pointer to a status os notification object which is actualy a QObject
typedef DosQObject DosStatusOSNotificationObject;
/// A pixmap callback to be supplied to an image provider /// A pixmap callback to be supplied to an image provider
/// \param id Image source id /// \param id Image source id

View File

@ -0,0 +1,27 @@
#ifndef STATUS_DOCK_SHOW_APP_EVENT_H
#define STATUS_DOCK_SHOW_APP_EVENT_H
#include "../DOtherSideTypes.h"
#include <QObject>
#include <QQmlApplicationEngine>
namespace Status
{
class DockShowAppEvent : public QObject
{
Q_OBJECT
public:
DockShowAppEvent(DosQQmlApplicationEngine* vptr, QObject* parent = nullptr);
protected:
bool eventFilter(QObject* obj, QEvent* event) override;
private:
Qt::ApplicationState m_prevAppState;
QQmlApplicationEngine* m_engine;
};
}
#endif

View File

@ -0,0 +1,51 @@
#ifndef STATUS_OS_NOTIFICATION_H
#define STATUS_OS_NOTIFICATION_H
#include <QObject>
#include <QHash>
#ifdef Q_OS_WIN
#include "windows.h"
#elif defined Q_OS_MACOS
class NotificationHelper;
#endif
namespace Status
{
class OSNotification : public QObject
{
Q_OBJECT
public:
OSNotification(QObject *parent = nullptr);
~OSNotification();
void showNotification(const QString& title, const QString& message,
const QString& identifier);
signals:
void notificationClicked(QString identifier);
#ifdef Q_OS_WIN
public:
QHash<uint, QString> m_identifiers;
private:
bool initNotificationWin();
void stringToLimitedWCharArray(QString in, wchar_t* target, int maxLength);
private:
HWND m_hwnd;
#elif defined Q_OS_MACOS
private:
void initNotificationMacOs();
void showNotificationMacOs(QString title, QString message, QString identifier);
private:
NotificationHelper *m_notificationHelper;
#endif
};
}
#endif

View File

@ -0,0 +1,26 @@
#ifndef STATUS_OS_THEME_EVENT_H
#define STATUS_OS_THEME_EVENT_H
#include "../DOtherSideTypes.h"
#include <QObject>
#include <QQmlApplicationEngine>
namespace Status
{
class OSThemeEvent : public QObject
{
Q_OBJECT
public:
OSThemeEvent(DosQQmlApplicationEngine* vptr, QObject* parent = nullptr);
protected:
bool eventFilter(QObject* obj, QEvent* event) override;
private:
QQmlApplicationEngine* m_engine;
};
}
#endif

View File

@ -1,24 +0,0 @@
#ifndef STATUS_DOCK_SHOW_APP_EVENT_H
#define STATUS_DOCK_SHOW_APP_EVENT_H
#include "../DOtherSideTypes.h"
#include <QObject>
#include <QQmlApplicationEngine>
class StatusDockShowAppEvent : public QObject
{
Q_OBJECT
public:
StatusDockShowAppEvent(DosQQmlApplicationEngine* vptr, QObject* parent = nullptr);
protected:
bool eventFilter(QObject* obj, QEvent* event) override;
private:
Qt::ApplicationState m_prevAppState;
QQmlApplicationEngine* m_engine;
};
#endif

View File

@ -1,23 +0,0 @@
#ifndef STATUS_OS_THEME_EVENT_H
#define STATUS_OS_THEME_EVENT_H
#include "../DOtherSideTypes.h"
#include <QObject>
#include <QQmlApplicationEngine>
class StatusOSThemeEvent : public QObject
{
Q_OBJECT
public:
StatusOSThemeEvent(DosQQmlApplicationEngine* vptr, QObject* parent = nullptr);
protected:
bool eventFilter(QObject* obj, QEvent* event) override;
private:
QQmlApplicationEngine* m_engine;
};
#endif

View File

@ -1,48 +0,0 @@
#ifndef STATUS_OS_NOTIFICATION_H
#define STATUS_OS_NOTIFICATION_H
#include <QObject>
#include <QHash>
#ifdef Q_OS_WIN
#include "windows.h"
#elif defined Q_OS_MACOS
class NotificationHelper;
#endif
class StatusOSNotification : public QObject
{
Q_OBJECT
public:
StatusOSNotification(QObject *parent = nullptr);
~StatusOSNotification();
void showNotification(const QString& title, const QString& message,
const QString& identifier);
signals:
void notificationClicked(QString identifier);
#ifdef Q_OS_WIN
public:
QHash<uint, QString> m_identifiers;
private:
bool initNotificationWin();
void stringToLimitedWCharArray(QString in, wchar_t* target, int maxLength);
private:
HWND m_hwnd;
#elif defined Q_OS_MACOS
private:
void initNotificationMacOs();
void showNotificationMacOs(QString title, QString message, QString identifier);
private:
NotificationHelper *m_notificationHelper;
#endif
};
#endif

View File

@ -62,9 +62,9 @@
#include "DOtherSide/DOtherSideSingleInstance.h" #include "DOtherSide/DOtherSideSingleInstance.h"
#include "DOtherSide/DOtherSideStatusSyntaxHighlighter.h" #include "DOtherSide/DOtherSideStatusSyntaxHighlighter.h"
#include "DOtherSide/StatusEvents/StatusDockShowAppEvent.h" #include "DOtherSide/Status/DockShowAppEvent.h"
#include "DOtherSide/StatusEvents/StatusOSThemeEvent.h" #include "DOtherSide/Status/OSThemeEvent.h"
#include "DOtherSide/StatusNotification/StatusOSNotification.h" #include "DOtherSide/Status/OSNotification.h"
#include "DOtherSide/DosSpellchecker.h" #include "DOtherSide/DosSpellchecker.h"
namespace { namespace {
@ -203,7 +203,7 @@ void dos_qguiapplication_icon(const char *filename)
qGuiApp->setWindowIcon(QIcon(filename)); qGuiApp->setWindowIcon(QIcon(filename));
} }
void dos_qguiapplication_installEventFilter(::DosStatusEventObject* vptr) void dos_qguiapplication_installEventFilter(::DosEvent* vptr)
{ {
auto qobject = static_cast<QObject*>(vptr); auto qobject = static_cast<QObject*>(vptr);
qGuiApp->installEventFilter(qobject); qGuiApp->installEventFilter(qobject);
@ -240,7 +240,7 @@ void dos_qapplication_quit()
QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection); QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection);
} }
void dos_qapplication_installEventFilter(::DosStatusEventObject* vptr) void dos_qapplication_installEventFilter(::DosEvent* vptr)
{ {
auto qobject = static_cast<QObject*>(vptr); auto qobject = static_cast<QObject*>(vptr);
qApp->installEventFilter(qobject); qApp->installEventFilter(qobject);
@ -1355,44 +1355,50 @@ bool dos_singleinstance_isfirst(DosSingleInstance *vptr)
return false; return false;
} }
::DosStatusEventObject* dos_statusevent_create_showAppEvent(::DosQQmlApplicationEngine* vptr) #pragma region Events
::DosEvent* dos_event_create_showAppEvent(::DosQQmlApplicationEngine* vptr)
{ {
auto engine = static_cast<QQmlApplicationEngine*>(vptr); auto engine = static_cast<QQmlApplicationEngine*>(vptr);
return new StatusDockShowAppEvent(engine); return new Status::DockShowAppEvent(engine);
} }
::DosStatusEventObject* dos_statusevent_create_osThemeEvent(::DosQQmlApplicationEngine* vptr) ::DosEvent* dos_event_create_osThemeEvent(::DosQQmlApplicationEngine* vptr)
{ {
auto engine = static_cast<QQmlApplicationEngine*>(vptr); auto engine = static_cast<QQmlApplicationEngine*>(vptr);
return new StatusOSThemeEvent(engine); return new Status::OSThemeEvent(engine);
} }
void dos_statusevent_delete(DosStatusEventObject* vptr) void dos_event_delete(DosEvent* vptr)
{ {
auto qobject = static_cast<QObject*>(vptr); auto qobject = static_cast<QObject*>(vptr);
qobject->deleteLater(); qobject->deleteLater();
} }
#pragma endregion
::DosStatusOSNotificationObject* dos_statusosnotification_create() #pragma region OSNotification
::DosOSNotification* dos_osnotification_create()
{ {
return new StatusOSNotification(); return new Status::OSNotification();
} }
void dos_statusosnotification_show_notification(DosStatusOSNotificationObject* vptr, void dos_osnotification_show_notification(DosOSNotification* vptr,
const char* title, const char* message, const char* identifier) const char* title, const char* message, const char* identifier)
{ {
auto notificationObj = static_cast<StatusOSNotification*>(vptr); auto notificationObj = static_cast<Status::OSNotification*>(vptr);
if(notificationObj) if(notificationObj)
notificationObj->showNotification(title, message, identifier); notificationObj->showNotification(title, message, identifier);
} }
void dos_statusosnotification_delete(DosStatusOSNotificationObject* vptr) void dos_osnotification_delete(DosOSNotification* vptr)
{ {
auto qobject = static_cast<QObject*>(vptr); auto qobject = static_cast<QObject*>(vptr);
if(qobject) if(qobject)
qobject->deleteLater(); qobject->deleteLater();
} }
#pragma endregion
char* dos_to_local_file(const char* fileUrl) char* dos_to_local_file(const char* fileUrl)
{ {
return convert_to_cstring(QUrl(QString::fromUtf8(fileUrl)).toLocalFile()); return convert_to_cstring(QUrl(QString::fromUtf8(fileUrl)).toLocalFile());

View File

@ -1,4 +1,4 @@
#include "DOtherSide/StatusEvents/StatusDockShowAppEvent.h" #include "DOtherSide/Status/DockShowAppEvent.h"
#include <QQuickWindow> #include <QQuickWindow>
@ -9,14 +9,16 @@
installing filters. installing filters.
*/ */
StatusDockShowAppEvent::StatusDockShowAppEvent(DosQQmlApplicationEngine* vptr, using namespace Status;
DockShowAppEvent::DockShowAppEvent(DosQQmlApplicationEngine* vptr,
QObject* parent) QObject* parent)
: QObject(parent) : QObject(parent)
{ {
m_engine = static_cast<QQmlApplicationEngine*>(vptr); m_engine = static_cast<QQmlApplicationEngine*>(vptr);
} }
bool StatusDockShowAppEvent::eventFilter(QObject* obj, QEvent* event) bool DockShowAppEvent::eventFilter(QObject* obj, QEvent* event)
{ {
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
if (event->type() == QEvent::ApplicationStateChange) if (event->type() == QEvent::ApplicationStateChange)

View File

@ -1,4 +1,4 @@
#include "DOtherSide/StatusNotification/StatusOSNotification.h" #include "DOtherSide/StatusNotification/OSNotification.h"
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#include <shellapi.h> #include <shellapi.h>
@ -7,12 +7,16 @@
#include <winuser.h> #include <winuser.h>
#include <comdef.h> #include <comdef.h>
using namespace Status;
static const UINT NOTIFYICONID = 0; static const UINT NOTIFYICONID = 0;
static std::pair<HWND, StatusOSNotification *> HWND_INSTANCE_PAIR; static std::pair<HWND, OSNotification *> HWND_INSTANCE_PAIR;
#endif #endif
StatusOSNotification::StatusOSNotification(QObject *parent) using namespace Status;
OSNotification::OSNotification(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -24,7 +28,7 @@ StatusOSNotification::StatusOSNotification(QObject *parent)
#endif #endif
} }
StatusOSNotification::~StatusOSNotification() OSNotification::~OSNotification()
{ {
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
if(m_notificationHelper) if(m_notificationHelper)
@ -52,7 +56,7 @@ LRESULT CALLBACK StatusWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara
return DefWindowProc(hwnd, uMsg, wParam, lParam); return DefWindowProc(hwnd, uMsg, wParam, lParam);
} }
void StatusOSNotification::stringToLimitedWCharArray(QString in, wchar_t* target, void OSNotification::stringToLimitedWCharArray(QString in, wchar_t* target,
int maxLength) int maxLength)
{ {
const int length = qMin(maxLength - 1, in.size()); const int length = qMin(maxLength - 1, in.size());
@ -62,7 +66,7 @@ void StatusOSNotification::stringToLimitedWCharArray(QString in, wchar_t* target
target[length] = wchar_t(0); target[length] = wchar_t(0);
} }
bool StatusOSNotification::initNotificationWin() bool OSNotification::initNotificationWin()
{ {
// m_hwnd should be init only once, but that would be a case if we create system // m_hwnd should be init only once, but that would be a case if we create system
// tray window from here. But since we already have system tray added in the // tray window from here. But since we already have system tray added in the
@ -98,7 +102,7 @@ bool StatusOSNotification::initNotificationWin()
ATOM atom = RegisterClassEx(&wc); ATOM atom = RegisterClassEx(&wc);
if (!atom) if (!atom)
printf("StatusOsNotification registering window class failed.\n"); printf("Status::OsNotification registering window class failed.\n");
m_hwnd = FindWindowExA(0, 0, className, windowName); m_hwnd = FindWindowExA(0, 0, className, windowName);
if(m_hwnd) if(m_hwnd)
@ -111,7 +115,7 @@ bool StatusOSNotification::initNotificationWin()
} }
#endif #endif
void StatusOSNotification::showNotification(const QString& title, void OSNotification::showNotification(const QString& title,
const QString& message, const QString& identifier) const QString& message, const QString& identifier)
{ {
#ifdef Q_OS_WIN #ifdef Q_OS_WIN

View File

@ -1,18 +1,20 @@
#include "DOtherSide/StatusNotification/StatusOSNotification.h" #include "DOtherSide/StatusNotification/OSNotification.h"
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
#import <AppKit/AppKit.h> #import <AppKit/AppKit.h>
using namespace Status;
@interface NotificationDelegate : NSObject <NSUserNotificationCenterDelegate> @interface NotificationDelegate : NSObject <NSUserNotificationCenterDelegate>
- (instancetype)initStatusOSNotification:(StatusOSNotification*) instance; - (instancetype)initOSNotification:(OSNotification*) instance;
@end @end
class NotificationHelper class NotificationHelper
{ {
public: public:
NotificationHelper(StatusOSNotification* instance) { NotificationHelper(OSNotification* instance) {
delegate = [[NotificationDelegate alloc] initStatusOSNotification:instance]; delegate = [[NotificationDelegate alloc] initOSNotification:instance];
NSUserNotificationCenter.defaultUserNotificationCenter.delegate = delegate; NSUserNotificationCenter.defaultUserNotificationCenter.delegate = delegate;
} }
@ -26,7 +28,7 @@ public:
NotificationDelegate* delegate; NotificationDelegate* delegate;
}; };
void StatusOSNotification::initNotificationMacOs() void OSNotification::initNotificationMacOs()
{ {
if (!m_notificationHelper) if (!m_notificationHelper)
{ {
@ -34,7 +36,7 @@ void StatusOSNotification::initNotificationMacOs()
} }
} }
void StatusOSNotification::showNotificationMacOs(QString title, QString message, void OSNotification::showNotificationMacOs(QString title, QString message,
QString identifier) QString identifier)
{ {
if (!m_notificationHelper) if (!m_notificationHelper)
@ -54,10 +56,10 @@ void StatusOSNotification::showNotificationMacOs(QString title, QString message,
} }
@implementation NotificationDelegate { @implementation NotificationDelegate {
StatusOSNotification* instance; OSNotification* instance;
} }
- (instancetype)initStatusOSNotification:(StatusOSNotification*)ins - (instancetype)initOSNotification:(OSNotification*)ins
{ {
self = [super init]; self = [super init];
if (self) { if (self) {

View File

@ -1,14 +1,16 @@
#include "DOtherSide/StatusEvents/StatusOSThemeEvent.h" #include "DOtherSide/Status/OSThemeEvent.h"
#include <QQuickWindow> #include <QQuickWindow>
StatusOSThemeEvent::StatusOSThemeEvent(DosQQmlApplicationEngine* vptr, QObject* parent) using namespace Status;
OSThemeEvent::OSThemeEvent(DosQQmlApplicationEngine* vptr, QObject* parent)
: QObject(parent) : QObject(parent)
{ {
m_engine = static_cast<QQmlApplicationEngine*>(vptr); m_engine = static_cast<QQmlApplicationEngine*>(vptr);
} }
bool StatusOSThemeEvent::eventFilter(QObject *obj, QEvent *event) bool OSThemeEvent::eventFilter(QObject *obj, QEvent *event)
{ {
if (event->type() == QEvent::PaletteChange || if (event->type() == QEvent::PaletteChange ||
event->type() == QEvent::ApplicationPaletteChange) event->type() == QEvent::ApplicationPaletteChange)