Files
Xenia-Canary/src/xenia/ui/imgui_host_notification.cc

90 lines
3.1 KiB
C++

/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2023 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include <cmath>
#include "xenia/base/logging.h"
#include "xenia/base/platform.h"
#include "xenia/ui/imgui_host_notification.h"
#include "xenia/ui/imgui_notification.h"
namespace xe {
namespace ui {
ImGuiHostNotification::ImGuiHostNotification(ui::ImGuiDrawer* imgui_drawer,
std::string& title,
std::string& description,
uint8_t user_index,
uint8_t position_id)
: ImGuiNotification(imgui_drawer, NotificationType::Host, title,
description, user_index, position_id) {
SetCreationTime(Clock::QueryHostUptimeMillis() + notification_initial_delay);
imgui_drawer->AddNotification(this);
}
ImGuiHostNotification::~ImGuiHostNotification() {}
const ImVec2 ImGuiHostNotification::CalculateNotificationSize(ImVec2 text_size,
float scale) {
const ImVec2 result = ImVec2(text_size.x * scale, text_size.y * scale);
return result;
}
void HostNotificationWindow::OnDraw(ImGuiIO& io) {
if (IsNotificationClosingTime() || IsMarkedForDeletion()) {
delete this;
return;
}
// Adding 200ms of delay in case of notification spam.
if (Clock::QueryHostUptimeMillis() < GetCreationTime()) {
return;
}
const std::string_view longest_notification_text_line =
GetTitle().size() > GetDescription().size() ? GetTitle()
: GetDescription();
const ImVec2 screen_size = io.DisplaySize;
const float window_scale =
std::fminf(screen_size.x / default_drawing_resolution.x,
screen_size.y / default_drawing_resolution.y);
const float font_size = io.Fonts->Fonts[0]->FontSize;
const ImVec2 text_size = io.Fonts->Fonts[0]->CalcTextSizeA(
font_size * window_scale, FLT_MAX, -1.0f,
longest_notification_text_line.data());
const ImVec2 notification_size =
CalculateNotificationSize(text_size, window_scale);
const ImVec2 notification_position = CalculateNotificationScreenPosition(
screen_size, notification_size, GetPositionId());
if (std::isnan(notification_position.x) ||
std::isnan(notification_position.y)) {
return;
}
ImGui::SetNextWindowPos(notification_position);
ImGui::Begin("Notification Window", NULL, NOTIFY_TOAST_FLAGS);
{
ImGui::SetWindowFontScale(window_scale);
ImGui::Text("%s", GetTitle().data());
ImGui::Separator();
ImGui::Text("%s", GetDescription().data());
}
ImGui::End();
}
} // namespace ui
} // namespace xe