client/addons/misc/functions/fnc_notify.sqf
Jacob Schmidt c6daf95415
All checks were successful
Build / Build (push) Successful in 53s
Initial Repo Setup
2025-01-01 14:35:12 -06:00

221 lines
6.3 KiB
Plaintext

#include "..\script_component.hpp"
/*
* Function: forge_client_misc_fnc_notify
* Author: Creedcoder, J.Schmidt
* Edit: 07.15.2024
* Copyright © 2024 Creedcoder, J.Schmidt, All rights reserved
*
* Do not edit without permission!
*
* This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivative 4.0 International License.
* To view a copy of this license, vist https://creativecommons.org/licenses/by-nc-nd/4.0/ or send a letter to Creative Commons,
* PO Box 1866, Mountain View, CA 94042
*
* [Description]
* Creates a notification.
*
* Arguments:
* 0: STRING - The text to display
* 1: STRING - The type or color of the notification
* 2: SCALAR - The speed of the notification
* 3: STRING - The display side of the notification
*
* Return Value:
* void
*
* Example:
* ["Hello World!", "default", 3, "right"] call forge_client_misc_fnc_notify;
*
* Public: Yes
*/
params [["_text", "", [""]], ["_type", "default", [objNull, "", [], {}]], ["_speed", 10, [0]], ["_displaySide", "right", [""]]];
if (isDedicated || !hasInterface) exitWith {};
if (isNil "open_notifications") then { open_notifications = []; };
disableSerialization;
private _display = findDisplay 46;
private _alpha = 1;
private _colorName = "";
private _color = [];
if (typeName _type == "ARRAY" || typeName _type == "OBJECT") then {
_color = _type;
} else {
switch (_type) do {
case "error": {
_colorName = "red";
};
case "warning": {
_colorName = "amber";
};
case "success": {
_colorName = "green";
};
case "info": {
_colorName = "blue";
};
default {
_colorName = _type;
};
};
// https://material.io/guidelines/style/color.html
switch (_colorName) do {
case "red": {
_color = [0.957, 0.263, 0.212, _alpha];
};
case "pink": {
_color = [0.914, 0.118, 0.388, _alpha];
};
case "purple": {
_color = [0.612, 0.153, 0.69, _alpha];
};
case "deep-purple": {
_color = [0.404, 0.227, 0.718, _alpha];
};
case "indigo": {
_color = [0.247, 0.318, 0.71, _alpha];
};
case "blue": {
_color = [0.129, 0.588, 0.953, _alpha];
};
case "light-blue": {
_color = [0.012, 0.663, 0.957, _alpha];
};
case "cyan": {
_color = [0, 0.737, 0.831, _alpha];
};
case "teal": {
_color = [0, 0.588, 0.533, _alpha];
};
case "green": {
_color = [0.298, 0.686, 0.314, _alpha];
};
case "light-green": {
_color = [0.545, 0.765, 0.29, _alpha];
};
case "lime": {
_color = [0.804, 0.863, 0.224, _alpha];
};
case "yellow": {
_color = [1, 0.922, 0.231, _alpha];
};
case "amber": {
_color = [1, 0.757, 0.027, _alpha];
};
case "orange": {
_color = [1, 0.596, 0, _alpha];
};
case "deep-orange": {
_color = [1, 0.341, 0.133, _alpha];
};
case "brown": {
_color = [0.475, 0.333, 0.282, _alpha];
};
case "grey": {
_color = [0.62, 0.62, 0.62, _alpha];
};
case "blue-grey": {
_color = [0.376, 0.49, 0.545, _alpha];
};
default {
_color = [(profileNamespace getVariable ['GUI_BCG_RGB_R', 0.3843]), (profileNamespace getVariable ['GUI_BCG_RGB_G', 0.7019]), (profileNamespace getVariable ['GUI_BCG_RGB_B', 0.8862]), _alpha];
};
};
};
if (_text isEqualType "") then {
_text = parseText _text;
};
playSound "HintExpand";
private _margin = 0.01;
private _width = 300 * pixelW;
private _borderWidth = 5 * pixelW;
private _textWidth = _width - _borderWidth;
private _height = 0.01;
private _posX = 0;
private _posY = 0;
if (_displaySide == "left") then {
_posX = _margin + safeZoneX;
} else {
_posX = safeZoneW + safeZoneX - _margin - _width;
};
private _BorderCtrl = _display ctrlCreate ["RscText", -1];
_BorderCtrl ctrlSetPosition [_posX, _posY, _borderWidth, _height];
_BorderCtrl ctrlSetBackgroundColor _color;
_BorderCtrl ctrlSetFade 1;
_BorderCtrl ctrlCommit 0;
_BorderCtrl ctrlSetFade 0;
_BorderCtrl ctrlCommit 0.4;
private _TextCtrl = _display ctrlCreate ["RscStructuredText", -1];
_TextCtrl ctrlSetStructuredText _text;
_TextCtrl ctrlSetPosition [(_posX + _borderWidth), _posY, _textWidth, _height];
_TextCtrl ctrlCommit 0;
_adjustedHeight = (ctrlTextHeight _TextCtrl);
_TextCtrl ctrlSetPosition [(_posX + _borderWidth), _posY, _textWidth, _adjustedHeight];
_TextCtrl ctrlCommit 0;
_BorderCtrl ctrlSetPosition [_posX, _posY, _borderWidth, _adjustedHeight];
_BorderCtrl ctrlCommit 0;
_TextCtrl ctrlSetBackgroundColor [0.129, 0.129, 0.129, _alpha];
_TextCtrl ctrlSetFade 1;
_TextCtrl ctrlCommit 0;
_TextCtrl ctrlSetFade 0;
_TextCtrl ctrlCommit 0.4;
[_TextCtrl, _BorderCtrl, _speed] spawn {
disableSerialization;
uiSleep (_this select 2);
private _TextCtrl = _this select 0;
private _BorderCtrl = _this select 1;
_TextCtrl ctrlSetFade 1;
_TextCtrl ctrlCommit 0.3;
_BorderCtrl ctrlSetFade 1;
_BorderCtrl ctrlCommit 0.3;
uiSleep 0.3;
ctrlDelete _BorderCtrl;
ctrlDelete _TextCtrl;
};
_offsetY = 0;
if (count open_notifications > 0) then {
private _activeNotifications = 0;
{
private _ctrlBorder = _x select 0;
private _ctrlText = _x select 1;
if (!isNull _ctrlBorder && !isNull _ctrlText) then {
_ctrlBorder ctrlSetPosition [_posX, (_posY + _offsetY)];
_ctrlText ctrlSetPosition [(_posX + _borderWidth), (_posY + _offsetY)];
_ctrlBorder ctrlCommit 0.25;
_ctrlText ctrlCommit 0.25;
_offsetY = _offsetY + _margin + ((ctrlPosition _ctrlText) select 3);
if (_activeNotifications > 3) then {
_ctrlText ctrlSetFade 1;
_ctrlText ctrlCommit 0.2;
_ctrlBorder ctrlSetFade 1;
_ctrlBorder ctrlCommit 0.2;
};
};
_activeNotifications = _activeNotifications + 1;
true
} count (open_notifications);
};
open_notifications = ([[_BorderCtrl, _TextCtrl]] + open_notifications) select { !isNull (_x select 0) && !isNull (_x select 1) };