2023-01-21 20:37:04 +01:00
|
|
|
#include "Notification.h"
|
|
|
|
|
|
|
|
Notification::Notification(const std::string &overlayText,
|
|
|
|
NotificationStatus status,
|
|
|
|
float delayBeforeFadeoutInSeconds,
|
|
|
|
float shakeDuration,
|
|
|
|
GX2Color textColor,
|
|
|
|
GX2Color backgroundColor,
|
|
|
|
void (*finishFunc)(NotificationModuleHandle, void *),
|
|
|
|
void *context,
|
2024-04-26 13:53:15 +02:00
|
|
|
void (*removedFromOverlayCallback)(Notification *),
|
|
|
|
bool keepUntilShown) : GuiFrame(0, 0), mBackground(0, 0, backgroundColor) {
|
2023-01-21 20:37:04 +01:00
|
|
|
mFinishFunction = finishFunc;
|
|
|
|
mFinishFunctionContext = context;
|
|
|
|
mRemovedFromOverlayCallback = removedFromOverlayCallback;
|
|
|
|
mDelayBeforeFadeoutInSeconds = delayBeforeFadeoutInSeconds;
|
|
|
|
mShakeDurationInSeconds = shakeDuration;
|
|
|
|
mBackground.setImageColor(backgroundColor);
|
|
|
|
|
|
|
|
mNotificationText.setColor({textColor.r / 255.0f, textColor.g / 255.0f, textColor.b / 255.0f, textColor.a / 255.0f});
|
|
|
|
mNotificationText.setPosition(0, 0);
|
|
|
|
mNotificationText.setFontSize(20);
|
|
|
|
mNotificationText.setAlignment(ALIGN_CENTERED);
|
2024-04-26 13:53:15 +02:00
|
|
|
mKeepUntilShown = keepUntilShown;
|
2023-01-21 20:37:04 +01:00
|
|
|
|
|
|
|
updateStatus(status);
|
|
|
|
|
|
|
|
if (!overlayText.empty()) {
|
|
|
|
updateText(overlayText.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
mWaitForReset = true;
|
|
|
|
|
|
|
|
append(&mBackground);
|
|
|
|
append(&mNotificationText);
|
|
|
|
}
|
|
|
|
|
|
|
|
Notification::~Notification() {
|
|
|
|
finishFunction();
|
|
|
|
remove(&mNotificationText);
|
|
|
|
remove(&mBackground);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Notification::process() {
|
|
|
|
GuiFrame::process();
|
|
|
|
|
|
|
|
if (mWaitForReset) {
|
|
|
|
mTimer.reset();
|
|
|
|
mWaitForReset = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mInternalStatus == NOTIFICATION_STATUS_WAIT) {
|
|
|
|
if (mTimer.elapsed() >= mDelayBeforeFadeoutInSeconds) {
|
|
|
|
mInternalStatus = NOTIFICATION_STATUS_REQUESTED_FADE_OUT_AND_EXIT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Notification::finishFunction() {
|
|
|
|
if (!mFinishFunctionCalled && mFinishFunction) {
|
|
|
|
mFinishFunction(this->getHandle(), mFinishFunctionContext);
|
|
|
|
mFinishFunctionCalled = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Notification::draw(bool SRGBConversion) {
|
|
|
|
if (!mPositionSet) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (mTextDirty) {
|
|
|
|
mNotificationText.updateTextSize();
|
|
|
|
mTextDirty = false;
|
|
|
|
}
|
|
|
|
width = (float) mNotificationText.getTextWidth() + 25;
|
|
|
|
height = (float) mNotificationText.getTextHeight() + 25;
|
|
|
|
|
|
|
|
mBackground.setSize(width, height);
|
|
|
|
if (width > 25 || height > 25) {
|
|
|
|
GuiFrame::draw(SRGBConversion);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Notification::updateStatus(NotificationStatus newStatus) {
|
|
|
|
switch (newStatus) {
|
|
|
|
case NOTIFICATION_STATUS_INFO:
|
|
|
|
mInternalStatus = NOTIFICATION_STATUS_WAIT;
|
|
|
|
break;
|
|
|
|
case NOTIFICATION_STATUS_ERROR:
|
|
|
|
mInternalStatus = NOTIFICATION_STATUS_REQUESTED_SHAKE;
|
|
|
|
break;
|
|
|
|
case NOTIFICATION_STATUS_IN_PROGRESS:
|
|
|
|
mInternalStatus = NOTIFICATION_STATUS_NOTHING;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mWaitForReset = true;
|
|
|
|
this->mStatus = newStatus;
|
|
|
|
}
|