Notification manager refactoring: Use unique_ptr for management
of dynamic data.
This commit is contained in:
parent
52f51ba757
commit
afa31433d1
@ -51,9 +51,6 @@ NotificationManager::PopNotification::PopNotification(const NotificationData &n,
|
||||
{
|
||||
//init();
|
||||
}
|
||||
NotificationManager::PopNotification::~PopNotification()
|
||||
{
|
||||
}
|
||||
NotificationManager::PopNotification::RenderResult NotificationManager::PopNotification::render(GLCanvas3D& canvas, const float& initial_y, bool move_from_overlay, float overlay_width, bool move_from_slope, float slope_width)
|
||||
{
|
||||
if (!m_initialized) {
|
||||
@ -618,13 +615,6 @@ NotificationManager::NotificationManager(wxEvtHandler* evt_handler) :
|
||||
m_evt_handler(evt_handler)
|
||||
{
|
||||
}
|
||||
NotificationManager::~NotificationManager()
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications)
|
||||
{
|
||||
delete notification;
|
||||
}
|
||||
}
|
||||
void NotificationManager::push_notification(const NotificationType type, GLCanvas3D& canvas, int timestamp)
|
||||
{
|
||||
auto it = std::find_if(basic_notifications.begin(), basic_notifications.end(),
|
||||
@ -664,17 +654,12 @@ void NotificationManager::push_slicing_warning_notification(const std::string& t
|
||||
{
|
||||
NotificationData data { NotificationType::SlicingWarning, NotificationLevel::WarningNotification, 0, _u8L("WARNING:") + "\n" + text };
|
||||
|
||||
NotificationManager::SlicingWarningNotification* notification = new NotificationManager::SlicingWarningNotification(data, m_next_id++, m_evt_handler);
|
||||
auto notification = std::make_unique<NotificationManager::SlicingWarningNotification>(data, m_next_id++, m_evt_handler);
|
||||
notification->set_object_id(oid);
|
||||
notification->set_warning_step(warning_step);
|
||||
if
|
||||
(push_notification_data(notification, canvas, 0)) {
|
||||
if (push_notification_data(std::move(notification), canvas, 0)) {
|
||||
notification->set_gray(gray);
|
||||
}
|
||||
else {
|
||||
delete notification;
|
||||
}
|
||||
|
||||
}
|
||||
void NotificationManager::push_plater_error_notification(const std::string& text, GLCanvas3D& canvas)
|
||||
{
|
||||
@ -688,7 +673,7 @@ void NotificationManager::push_plater_warning_notification(const std::string& te
|
||||
}
|
||||
void NotificationManager::close_plater_error_notification(const std::string& text)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::PlaterError && notification->compare_text(_u8L("ERROR:") + "\n" + text)) {
|
||||
notification->close();
|
||||
}
|
||||
@ -696,7 +681,7 @@ void NotificationManager::close_plater_error_notification(const std::string& tex
|
||||
}
|
||||
void NotificationManager::close_plater_warning_notification(const std::string& text)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::PlaterWarning && notification->compare_text(_u8L("WARNING:") + "\n" + text)) {
|
||||
notification->close();
|
||||
}
|
||||
@ -704,7 +689,7 @@ void NotificationManager::close_plater_warning_notification(const std::string& t
|
||||
}
|
||||
void NotificationManager::set_all_slicing_errors_gray(bool g)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::SlicingError) {
|
||||
notification->set_gray(g);
|
||||
}
|
||||
@ -712,7 +697,7 @@ void NotificationManager::set_all_slicing_errors_gray(bool g)
|
||||
}
|
||||
void NotificationManager::set_all_slicing_warnings_gray(bool g)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::SlicingWarning) {
|
||||
notification->set_gray(g);
|
||||
}
|
||||
@ -720,7 +705,7 @@ void NotificationManager::set_all_slicing_warnings_gray(bool g)
|
||||
}
|
||||
void NotificationManager::set_slicing_warning_gray(const std::string& text, bool g)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::SlicingWarning && notification->compare_text(text)) {
|
||||
notification->set_gray(g);
|
||||
}
|
||||
@ -728,7 +713,7 @@ void NotificationManager::set_slicing_warning_gray(const std::string& text, bool
|
||||
}
|
||||
void NotificationManager::close_slicing_errors_and_warnings()
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::SlicingError || notification->get_type() == NotificationType::SlicingWarning) {
|
||||
notification->close();
|
||||
}
|
||||
@ -745,33 +730,30 @@ void NotificationManager::push_slicing_complete_notification(GLCanvas3D& canvas,
|
||||
time = 0;
|
||||
}
|
||||
NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext };
|
||||
|
||||
NotificationManager::SlicingCompleteLargeNotification* notification = new NotificationManager::SlicingCompleteLargeNotification(data, m_next_id++, m_evt_handler, large);
|
||||
if (!push_notification_data(notification, canvas, timestamp)) {
|
||||
delete notification;
|
||||
}
|
||||
push_notification_data(std::make_unique<NotificationManager::SlicingCompleteLargeNotification>(data, m_next_id++, m_evt_handler, large),
|
||||
canvas, timestamp);
|
||||
}
|
||||
void NotificationManager::set_slicing_complete_print_time(std::string info)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::SlicingComplete) {
|
||||
dynamic_cast<SlicingCompleteLargeNotification*>(notification)->set_print_info(info);
|
||||
dynamic_cast<SlicingCompleteLargeNotification*>(notification.get())->set_print_info(info);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void NotificationManager::set_slicing_complete_large(bool large)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::SlicingComplete) {
|
||||
dynamic_cast<SlicingCompleteLargeNotification*>(notification)->set_large(large);
|
||||
dynamic_cast<SlicingCompleteLargeNotification*>(notification.get())->set_large(large);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void NotificationManager::close_notification_of_type(const NotificationType type)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == type) {
|
||||
notification->close();
|
||||
}
|
||||
@ -779,9 +761,9 @@ void NotificationManager::close_notification_of_type(const NotificationType type
|
||||
}
|
||||
void NotificationManager::compare_warning_oids(const std::vector<size_t>& living_oids)
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::SlicingWarning) {
|
||||
auto w = dynamic_cast<SlicingWarningNotification*>(notification);
|
||||
auto w = dynamic_cast<SlicingWarningNotification*>(notification.get());
|
||||
bool found = false;
|
||||
for (size_t oid : living_oids) {
|
||||
if (w->get_object_id() == oid) {
|
||||
@ -796,13 +778,9 @@ void NotificationManager::compare_warning_oids(const std::vector<size_t>& living
|
||||
}
|
||||
bool NotificationManager::push_notification_data(const NotificationData ¬ification_data, GLCanvas3D& canvas, int timestamp)
|
||||
{
|
||||
PopNotification* n = new PopNotification(notification_data, m_next_id++, m_evt_handler);
|
||||
bool r = push_notification_data(n, canvas, timestamp);
|
||||
if (!r)
|
||||
delete n;
|
||||
return r;
|
||||
return push_notification_data(std::make_unique<PopNotification>(notification_data, m_next_id++, m_evt_handler), canvas, timestamp);
|
||||
}
|
||||
bool NotificationManager::push_notification_data(NotificationManager::PopNotification* notification, GLCanvas3D& canvas, int timestamp)
|
||||
bool NotificationManager::push_notification_data(std::unique_ptr<NotificationManager::PopNotification> notification, GLCanvas3D& canvas, int timestamp)
|
||||
{
|
||||
// if timestamped notif, push only new one
|
||||
if (timestamp != 0) {
|
||||
@ -812,8 +790,8 @@ bool NotificationManager::push_notification_data(NotificationManager::PopNotific
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!this->find_older(notification)) {
|
||||
m_pop_notifications.emplace_back(notification);
|
||||
if (!this->find_older(notification.get())) {
|
||||
m_pop_notifications.emplace_back(std::move(notification));
|
||||
canvas.request_extra_frame();
|
||||
return true;
|
||||
} else {
|
||||
@ -833,7 +811,6 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay
|
||||
// iterate thru notifications and render them / erease them
|
||||
for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) {
|
||||
if ((*it)->get_finished()) {
|
||||
delete (*it);
|
||||
it = m_pop_notifications.erase(it);
|
||||
} else {
|
||||
(*it)->set_paused(m_hovered);
|
||||
@ -864,7 +841,7 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay
|
||||
{
|
||||
if (wxGetLocalTime() - m_last_time == 1)
|
||||
{
|
||||
for(auto notification : m_pop_notifications)
|
||||
for(auto ¬ification : m_pop_notifications)
|
||||
{
|
||||
notification->substract_remaining_time();
|
||||
}
|
||||
@ -879,7 +856,7 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay
|
||||
|
||||
void NotificationManager::sort_notifications()
|
||||
{
|
||||
std::sort(m_pop_notifications.begin(), m_pop_notifications.end(), [](PopNotification* n1, PopNotification* n2) {
|
||||
std::sort(m_pop_notifications.begin(), m_pop_notifications.end(), [](const std::unique_ptr<PopNotification> &n1, const std::unique_ptr<PopNotification> &n2) {
|
||||
int n1l = (int)n1->get_data().level;
|
||||
int n2l = (int)n2->get_data().level;
|
||||
if (n1l == n2l && n1->get_is_gray() && !n2->get_is_gray())
|
||||
@ -899,7 +876,7 @@ bool NotificationManager::find_older(NotificationManager::PopNotification* notif
|
||||
continue;
|
||||
}else if (type == NotificationType::SlicingWarning) {
|
||||
auto w1 = dynamic_cast<SlicingWarningNotification*>(notification);
|
||||
auto w2 = dynamic_cast<SlicingWarningNotification*>(*it);
|
||||
auto w2 = dynamic_cast<SlicingWarningNotification*>(it->get());
|
||||
if (w1 != nullptr && w2 != nullptr) {
|
||||
if (!(*it)->compare_text(text) || w1->get_object_id() != w2->get_object_id()) {
|
||||
continue;
|
||||
@ -920,14 +897,14 @@ bool NotificationManager::find_older(NotificationManager::PopNotification* notif
|
||||
void NotificationManager::set_in_preview(bool preview)
|
||||
{
|
||||
m_in_preview = preview;
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::PlaterWarning)
|
||||
notification->hide(preview);
|
||||
}
|
||||
}
|
||||
bool NotificationManager::has_error_notification()
|
||||
{
|
||||
for (PopNotification* notification : m_pop_notifications) {
|
||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||
if (notification->get_data().level == NotificationLevel::ErrorNotification)
|
||||
return true;
|
||||
}
|
||||
|
@ -55,8 +55,6 @@ public:
|
||||
};
|
||||
|
||||
NotificationManager(wxEvtHandler* evt_handler);
|
||||
~NotificationManager();
|
||||
|
||||
|
||||
// only type means one of basic_notification (see below)
|
||||
void push_notification(const NotificationType type, GLCanvas3D& canvas, int timestamp = 0);
|
||||
@ -118,7 +116,7 @@ private:
|
||||
Hovered
|
||||
};
|
||||
PopNotification(const NotificationData &n, const int id, wxEvtHandler* evt_handler);
|
||||
virtual ~PopNotification();
|
||||
virtual ~PopNotification() = default;
|
||||
RenderResult render(GLCanvas3D& canvas, const float& initial_y, bool move_from_overlay, float overlay_width, bool move_from_slope, float slope_width);
|
||||
// close will dissapear notification on next render
|
||||
void close() { m_close_pending = true; }
|
||||
@ -243,14 +241,14 @@ private:
|
||||
//pushes notification into the queue of notifications that are rendered
|
||||
//can be used to create custom notification
|
||||
bool push_notification_data(const NotificationData& notification_data, GLCanvas3D& canvas, int timestamp);
|
||||
bool push_notification_data(NotificationManager::PopNotification* notification, GLCanvas3D& canvas, int timestamp);
|
||||
bool push_notification_data(std::unique_ptr<NotificationManager::PopNotification> notification, GLCanvas3D& canvas, int timestamp);
|
||||
//finds older notification of same type and moves it to the end of queue. returns true if found
|
||||
bool find_older(NotificationManager::PopNotification* notification);
|
||||
void sort_notifications();
|
||||
bool has_error_notification();
|
||||
|
||||
wxEvtHandler* m_evt_handler;
|
||||
std::deque<PopNotification*> m_pop_notifications;
|
||||
std::deque<std::unique_ptr<PopNotification>> m_pop_notifications;
|
||||
int m_next_id { 1 };
|
||||
long m_last_time { 0 };
|
||||
bool m_hovered { false };
|
||||
|
Loading…
Reference in New Issue
Block a user