Funkin/source/funkin/ui/debug/charting/handlers/ChartEditorNotificationHandler.hx

154 lines
4.8 KiB
Haxe
Raw Normal View History

package funkin.ui.debug.charting.handlers;
2023-11-22 19:41:52 -05:00
import haxe.ui.components.Button;
import haxe.ui.containers.HBox;
import haxe.ui.notifications.Notification;
import haxe.ui.notifications.NotificationManager;
import haxe.ui.notifications.NotificationType;
class ChartEditorNotificationHandler
{
public static function setupNotifications(state:ChartEditorState):Void
{
// Setup notifications.
@:privateAccess
NotificationManager.GUTTER_SIZE = 20;
}
/**
* Send a notification with a checkmark indicating success.
* @param state The current state of the chart editor.
*/
public static function success(state:ChartEditorState, title:String, body:String):Notification
{
return sendNotification(state, title, body, NotificationType.Success);
}
/**
* Send a notification with a warning icon.
* @param state The current state of the chart editor.
*/
public static function warning(state:ChartEditorState, title:String, body:String):Notification
{
return sendNotification(state, title, body, NotificationType.Warning);
}
/**
* Send a notification with a warning icon.
* @param state The current state of the chart editor.
*/
public static inline function warn(state:ChartEditorState, title:String, body:String):Notification
{
return warning(state, title, body);
}
/**
* Send a notification with a cross indicating an error.
* @param state The current state of the chart editor.
*/
public static function error(state:ChartEditorState, title:String, body:String):Notification
{
return sendNotification(state, title, body, NotificationType.Error);
}
/**
* Send a notification with a cross indicating failure.
* @param state The current state of the chart editor.
*/
public static inline function failure(state:ChartEditorState, title:String, body:String):Notification
{
return error(state, title, body);
}
/**
* Send a notification with an info icon.
* @param state The current state of the chart editor.
*/
public static function info(state:ChartEditorState, title:String, body:String):Notification
{
return sendNotification(state, title, body, NotificationType.Info);
}
2023-11-22 19:41:52 -05:00
/**
* Send a notification with an info icon and one or more actions.
* @param state The current state of the chart editor.
* @param title The title of the notification.
* @param body The body of the notification.
* @param actions The actions to add to the notification.
* @return The notification that was sent.
*/
2023-11-22 20:25:25 -05:00
public static function infoWithActions(state:ChartEditorState, title:String, body:String, actions:Array<NotificationAction>):Notification
2023-11-22 19:41:52 -05:00
{
return sendNotification(state, title, body, NotificationType.Info, actions);
2023-11-22 19:41:52 -05:00
}
/**
* Clear all active notifications.
* @param state The current state of the chart editor.
*/
public static function clearNotifications(state:ChartEditorState):Void
{
NotificationManager.instance.clearNotifications();
}
/**
* Clear a specific notification.
* @param state The current state of the chart editor.
* @param notif The notification to clear.
*/
public static function clearNotification(state:ChartEditorState, notif:Notification):Void
{
NotificationManager.instance.removeNotification(notif);
}
static function sendNotification(state:ChartEditorState, title:String, body:String, ?type:NotificationType, ?actions:Array<NotificationAction>):Notification
{
#if !mac
2023-11-22 20:25:25 -05:00
var actionNames:Array<String> = actions == null ? [] : actions.map(action -> action.text);
2023-11-22 19:41:52 -05:00
var notif = NotificationManager.instance.addNotification(
{
title: title,
body: body,
type: type ?? NotificationType.Default,
2023-11-22 19:41:52 -05:00
expiryMs: Constants.NOTIFICATION_DISMISS_TIME,
actions: actionNames
});
2023-11-22 19:41:52 -05:00
2023-11-22 20:25:25 -05:00
if (actionNames.length > 0)
{
// TODO: Tell Ian that this is REALLY dumb.
var actionsContainer:HBox = notif.findComponent('actionsContainer', HBox);
actionsContainer.walkComponents(function(component) {
if (Std.isOfType(component, Button))
2023-11-22 19:41:52 -05:00
{
2023-11-22 20:25:25 -05:00
var button:Button = cast component;
var action:Null<NotificationAction> = actions.find(action -> action.text == button.text);
if (action != null && action.callback != null)
{
button.onClick = function(_) {
// Don't allow actions to be clicked while the playtest is open.
if (state.subState != null) return;
2023-11-22 20:25:25 -05:00
action.callback();
};
}
2023-11-22 19:41:52 -05:00
}
2023-11-22 20:25:25 -05:00
return true; // Continue walking.
});
}
2023-11-22 19:41:52 -05:00
return notif;
#else
2023-12-07 14:29:45 -05:00
// TODO: Implement notifications on Mac OS OR... make sure the null is handled properly on mac?
return null;
trace('WARNING: Notifications are not supported on Mac OS.');
#end
}
}
2023-11-22 19:41:52 -05:00
typedef NotificationAction =
{
text:String,
callback:Void->Void
}