[UI] Host Notification: Replace previous notification in case of new one
This commit is contained in:
parent
ee210db096
commit
9c8a575b76
|
@ -467,20 +467,32 @@ void ImGuiDrawer::Draw(UIDrawContext& ui_draw_context) {
|
||||||
dialog_loop_next_index_ = SIZE_MAX;
|
dialog_loop_next_index_ = SIZE_MAX;
|
||||||
|
|
||||||
if (!notifications_.empty()) {
|
if (!notifications_.empty()) {
|
||||||
bool was_guest_notification_drawn = false;
|
std::vector<ui::ImGuiNotification*> guest_notifications = {};
|
||||||
bool was_host_notification_drawn = false;
|
std::vector<ui::ImGuiNotification*> host_notifications = {};
|
||||||
|
|
||||||
for (const auto& notification : notifications_) {
|
std::copy_if(notifications_.cbegin(), notifications_.cend(),
|
||||||
if (notification->GetNotificationType() == NotificationType::Guest &&
|
std::back_inserter(guest_notifications),
|
||||||
!was_guest_notification_drawn) {
|
[](ui::ImGuiNotification* notification) {
|
||||||
was_guest_notification_drawn = true;
|
return notification->GetNotificationType() ==
|
||||||
notification->Draw();
|
NotificationType::Guest;
|
||||||
}
|
});
|
||||||
|
|
||||||
if (notification->GetNotificationType() == NotificationType::Host &&
|
std::copy_if(notifications_.cbegin(), notifications_.cend(),
|
||||||
!was_host_notification_drawn) {
|
std::back_inserter(host_notifications),
|
||||||
was_host_notification_drawn = true;
|
[](ui::ImGuiNotification* notification) {
|
||||||
notification->Draw();
|
return notification->GetNotificationType() ==
|
||||||
|
NotificationType::Host;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (guest_notifications.size() > 0) {
|
||||||
|
guest_notifications.at(0)->Draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (host_notifications.size() > 0) {
|
||||||
|
host_notifications.at(0)->Draw();
|
||||||
|
|
||||||
|
if (host_notifications.size() > 1) {
|
||||||
|
host_notifications.at(0)->SetDeletionPending();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ ImGuiHostNotification::ImGuiHostNotification(ui::ImGuiDrawer* imgui_drawer,
|
||||||
uint8_t position_id)
|
uint8_t position_id)
|
||||||
: ImGuiNotification(imgui_drawer, NotificationType::Host, title,
|
: ImGuiNotification(imgui_drawer, NotificationType::Host, title,
|
||||||
description, user_index, position_id) {
|
description, user_index, position_id) {
|
||||||
SetCreationTime(Clock::QueryHostUptimeMillis());
|
SetCreationTime(Clock::QueryHostUptimeMillis() + notification_initial_delay);
|
||||||
imgui_drawer->AddNotification(this);
|
imgui_drawer->AddNotification(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,11 +39,16 @@ const ImVec2 ImGuiHostNotification::CalculateNotificationSize(ImVec2 text_size,
|
||||||
}
|
}
|
||||||
|
|
||||||
void HostNotificationWindow::OnDraw(ImGuiIO& io) {
|
void HostNotificationWindow::OnDraw(ImGuiIO& io) {
|
||||||
if (IsNotificationClosingTime()) {
|
if (IsNotificationClosingTime() || IsMarkedForDeletion()) {
|
||||||
delete this;
|
delete this;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adding 200ms of delay in case of notification spam.
|
||||||
|
if (Clock::QueryHostUptimeMillis() < GetCreationTime()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string longest_notification_text_line =
|
const std::string longest_notification_text_line =
|
||||||
GetTitle().size() > GetDescription().size() ? GetTitle().c_str()
|
GetTitle().size() > GetDescription().size() ? GetTitle().c_str()
|
||||||
: GetDescription().c_str();
|
: GetDescription().c_str();
|
||||||
|
|
|
@ -26,6 +26,9 @@ class ImGuiHostNotification : public ImGuiNotification {
|
||||||
~ImGuiHostNotification();
|
~ImGuiHostNotification();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
const uint64_t notification_initial_delay =
|
||||||
|
std::chrono::milliseconds(200).count();
|
||||||
|
|
||||||
const ImVec2 CalculateNotificationSize(ImVec2 text_size,
|
const ImVec2 CalculateNotificationSize(ImVec2 text_size,
|
||||||
float scale) override;
|
float scale) override;
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ ImGuiNotification::~ImGuiNotification() {
|
||||||
void ImGuiNotification::Draw() { OnDraw(imgui_drawer_->GetIO()); }
|
void ImGuiNotification::Draw() { OnDraw(imgui_drawer_->GetIO()); }
|
||||||
|
|
||||||
const NotificationAlignment ImGuiNotification::GetNotificationAlignment(
|
const NotificationAlignment ImGuiNotification::GetNotificationAlignment(
|
||||||
const uint8_t notification_position_id) {
|
const uint8_t notification_position_id) const {
|
||||||
NotificationAlignment alignment = NotificationAlignment::kAlignUnknown;
|
NotificationAlignment alignment = NotificationAlignment::kAlignUnknown;
|
||||||
|
|
||||||
if (notification_position_id >=
|
if (notification_position_id >=
|
||||||
|
@ -60,7 +60,8 @@ const NotificationAlignment ImGuiNotification::GetNotificationAlignment(
|
||||||
}
|
}
|
||||||
|
|
||||||
const ImVec2 ImGuiNotification::CalculateNotificationScreenPosition(
|
const ImVec2 ImGuiNotification::CalculateNotificationScreenPosition(
|
||||||
ImVec2 screen_size, ImVec2 window_size, uint8_t notification_position_id) {
|
ImVec2 screen_size, ImVec2 window_size,
|
||||||
|
uint8_t notification_position_id) const {
|
||||||
ImVec2 result = {NAN, NAN};
|
ImVec2 result = {NAN, NAN};
|
||||||
|
|
||||||
if (window_size.x >= screen_size.x || window_size.y >= screen_size.y) {
|
if (window_size.x >= screen_size.x || window_size.y >= screen_size.y) {
|
||||||
|
|
|
@ -63,14 +63,21 @@ class ImGuiNotification {
|
||||||
return notification_type_;
|
return notification_type_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetDeletionPending() { marked_for_deletion_ = true; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ImGuiDrawer* GetDrawer() { return imgui_drawer_; }
|
ImGuiDrawer* GetDrawer() { return imgui_drawer_; }
|
||||||
|
|
||||||
const bool IsNotificationClosingTime() {
|
const bool IsNotificationClosingTime() const {
|
||||||
return Clock::QueryHostUptimeMillis() - creation_time_ > time_to_close_;
|
const uint64_t current_time = Clock::QueryHostUptimeMillis();
|
||||||
|
// We're before showing notification
|
||||||
|
if (current_time < creation_time_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return current_time - creation_time_ > time_to_close_;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string GetNotificationText() {
|
const std::string GetNotificationText() const {
|
||||||
std::string text = title_;
|
std::string text = title_;
|
||||||
|
|
||||||
if (!description_.empty()) {
|
if (!description_.empty()) {
|
||||||
|
@ -83,17 +90,20 @@ class ImGuiNotification {
|
||||||
creation_time_ = new_creation_time;
|
creation_time_ = new_creation_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string GetTitle() { return title_; }
|
const bool IsMarkedForDeletion() const { return marked_for_deletion_; }
|
||||||
const std::string GetDescription() { return description_; }
|
const std::string GetTitle() const { return title_; }
|
||||||
|
const std::string GetDescription() const { return description_; }
|
||||||
|
|
||||||
const uint8_t GetPositionId() { return position_; }
|
const uint8_t GetPositionId() const { return position_; }
|
||||||
const uint8_t GetUserIndex() { return user_index_; }
|
const uint8_t GetUserIndex() const { return user_index_; }
|
||||||
|
const uint64_t GetCreationTime() const { return creation_time_; }
|
||||||
|
|
||||||
const NotificationAlignment GetNotificationAlignment(
|
const NotificationAlignment GetNotificationAlignment(
|
||||||
const uint8_t notification_position_id);
|
const uint8_t notification_position_id) const;
|
||||||
|
|
||||||
const ImVec2 CalculateNotificationScreenPosition(
|
const ImVec2 CalculateNotificationScreenPosition(
|
||||||
ImVec2 screen_size, ImVec2 window_size, uint8_t notification_position_id);
|
ImVec2 screen_size, ImVec2 window_size,
|
||||||
|
uint8_t notification_position_id) const;
|
||||||
|
|
||||||
virtual const ImVec2 CalculateNotificationSize(ImVec2 text_size,
|
virtual const ImVec2 CalculateNotificationSize(ImVec2 text_size,
|
||||||
float scale) = 0;
|
float scale) = 0;
|
||||||
|
@ -114,6 +124,8 @@ class ImGuiNotification {
|
||||||
std::string title_;
|
std::string title_;
|
||||||
std::string description_;
|
std::string description_;
|
||||||
|
|
||||||
|
bool marked_for_deletion_ = false;
|
||||||
|
|
||||||
ImGuiDrawer* imgui_drawer_ = nullptr;
|
ImGuiDrawer* imgui_drawer_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue