mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-13 01:37:53 -06:00
Notification manager refactoring: Use unique_ptr for management
of dynamic data.
This commit is contained in:
parent
52f51ba757
commit
afa31433d1
2 changed files with 29 additions and 54 deletions
|
@ -51,9 +51,6 @@ NotificationManager::PopNotification::PopNotification(const NotificationData &n,
|
||||||
{
|
{
|
||||||
//init();
|
//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)
|
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) {
|
if (!m_initialized) {
|
||||||
|
@ -618,13 +615,6 @@ NotificationManager::NotificationManager(wxEvtHandler* evt_handler) :
|
||||||
m_evt_handler(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)
|
void NotificationManager::push_notification(const NotificationType type, GLCanvas3D& canvas, int timestamp)
|
||||||
{
|
{
|
||||||
auto it = std::find_if(basic_notifications.begin(), basic_notifications.end(),
|
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 };
|
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_object_id(oid);
|
||||||
notification->set_warning_step(warning_step);
|
notification->set_warning_step(warning_step);
|
||||||
if
|
if (push_notification_data(std::move(notification), canvas, 0)) {
|
||||||
(push_notification_data(notification, canvas, 0)) {
|
|
||||||
notification->set_gray(gray);
|
notification->set_gray(gray);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
delete notification;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void NotificationManager::push_plater_error_notification(const std::string& text, GLCanvas3D& canvas)
|
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)
|
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)) {
|
if (notification->get_type() == NotificationType::PlaterError && notification->compare_text(_u8L("ERROR:") + "\n" + text)) {
|
||||||
notification->close();
|
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)
|
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)) {
|
if (notification->get_type() == NotificationType::PlaterWarning && notification->compare_text(_u8L("WARNING:") + "\n" + text)) {
|
||||||
notification->close();
|
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)
|
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) {
|
if (notification->get_type() == NotificationType::SlicingError) {
|
||||||
notification->set_gray(g);
|
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)
|
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) {
|
if (notification->get_type() == NotificationType::SlicingWarning) {
|
||||||
notification->set_gray(g);
|
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)
|
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)) {
|
if (notification->get_type() == NotificationType::SlicingWarning && notification->compare_text(text)) {
|
||||||
notification->set_gray(g);
|
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()
|
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) {
|
if (notification->get_type() == NotificationType::SlicingError || notification->get_type() == NotificationType::SlicingWarning) {
|
||||||
notification->close();
|
notification->close();
|
||||||
}
|
}
|
||||||
|
@ -745,33 +730,30 @@ void NotificationManager::push_slicing_complete_notification(GLCanvas3D& canvas,
|
||||||
time = 0;
|
time = 0;
|
||||||
}
|
}
|
||||||
NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext };
|
NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext };
|
||||||
|
push_notification_data(std::make_unique<NotificationManager::SlicingCompleteLargeNotification>(data, m_next_id++, m_evt_handler, large),
|
||||||
NotificationManager::SlicingCompleteLargeNotification* notification = new NotificationManager::SlicingCompleteLargeNotification(data, m_next_id++, m_evt_handler, large);
|
canvas, timestamp);
|
||||||
if (!push_notification_data(notification, canvas, timestamp)) {
|
|
||||||
delete notification;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
void NotificationManager::set_slicing_complete_print_time(std::string info)
|
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) {
|
if (notification->get_type() == NotificationType::SlicingComplete) {
|
||||||
dynamic_cast<SlicingCompleteLargeNotification*>(notification)->set_print_info(info);
|
dynamic_cast<SlicingCompleteLargeNotification*>(notification.get())->set_print_info(info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void NotificationManager::set_slicing_complete_large(bool large)
|
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) {
|
if (notification->get_type() == NotificationType::SlicingComplete) {
|
||||||
dynamic_cast<SlicingCompleteLargeNotification*>(notification)->set_large(large);
|
dynamic_cast<SlicingCompleteLargeNotification*>(notification.get())->set_large(large);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void NotificationManager::close_notification_of_type(const NotificationType type)
|
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) {
|
if (notification->get_type() == type) {
|
||||||
notification->close();
|
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)
|
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) {
|
if (notification->get_type() == NotificationType::SlicingWarning) {
|
||||||
auto w = dynamic_cast<SlicingWarningNotification*>(notification);
|
auto w = dynamic_cast<SlicingWarningNotification*>(notification.get());
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (size_t oid : living_oids) {
|
for (size_t oid : living_oids) {
|
||||||
if (w->get_object_id() == oid) {
|
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)
|
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);
|
return push_notification_data(std::make_unique<PopNotification>(notification_data, m_next_id++, m_evt_handler), canvas, timestamp);
|
||||||
bool r = push_notification_data(n, canvas, timestamp);
|
|
||||||
if (!r)
|
|
||||||
delete n;
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
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 timestamped notif, push only new one
|
||||||
if (timestamp != 0) {
|
if (timestamp != 0) {
|
||||||
|
@ -812,8 +790,8 @@ bool NotificationManager::push_notification_data(NotificationManager::PopNotific
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!this->find_older(notification)) {
|
if (!this->find_older(notification.get())) {
|
||||||
m_pop_notifications.emplace_back(notification);
|
m_pop_notifications.emplace_back(std::move(notification));
|
||||||
canvas.request_extra_frame();
|
canvas.request_extra_frame();
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -833,7 +811,6 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay
|
||||||
// iterate thru notifications and render them / erease them
|
// iterate thru notifications and render them / erease them
|
||||||
for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) {
|
for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) {
|
||||||
if ((*it)->get_finished()) {
|
if ((*it)->get_finished()) {
|
||||||
delete (*it);
|
|
||||||
it = m_pop_notifications.erase(it);
|
it = m_pop_notifications.erase(it);
|
||||||
} else {
|
} else {
|
||||||
(*it)->set_paused(m_hovered);
|
(*it)->set_paused(m_hovered);
|
||||||
|
@ -864,7 +841,7 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay
|
||||||
{
|
{
|
||||||
if (wxGetLocalTime() - m_last_time == 1)
|
if (wxGetLocalTime() - m_last_time == 1)
|
||||||
{
|
{
|
||||||
for(auto notification : m_pop_notifications)
|
for(auto ¬ification : m_pop_notifications)
|
||||||
{
|
{
|
||||||
notification->substract_remaining_time();
|
notification->substract_remaining_time();
|
||||||
}
|
}
|
||||||
|
@ -879,7 +856,7 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay
|
||||||
|
|
||||||
void NotificationManager::sort_notifications()
|
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 n1l = (int)n1->get_data().level;
|
||||||
int n2l = (int)n2->get_data().level;
|
int n2l = (int)n2->get_data().level;
|
||||||
if (n1l == n2l && n1->get_is_gray() && !n2->get_is_gray())
|
if (n1l == n2l && n1->get_is_gray() && !n2->get_is_gray())
|
||||||
|
@ -899,7 +876,7 @@ bool NotificationManager::find_older(NotificationManager::PopNotification* notif
|
||||||
continue;
|
continue;
|
||||||
}else if (type == NotificationType::SlicingWarning) {
|
}else if (type == NotificationType::SlicingWarning) {
|
||||||
auto w1 = dynamic_cast<SlicingWarningNotification*>(notification);
|
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 (w1 != nullptr && w2 != nullptr) {
|
||||||
if (!(*it)->compare_text(text) || w1->get_object_id() != w2->get_object_id()) {
|
if (!(*it)->compare_text(text) || w1->get_object_id() != w2->get_object_id()) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -920,14 +897,14 @@ bool NotificationManager::find_older(NotificationManager::PopNotification* notif
|
||||||
void NotificationManager::set_in_preview(bool preview)
|
void NotificationManager::set_in_preview(bool preview)
|
||||||
{
|
{
|
||||||
m_in_preview = 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)
|
if (notification->get_type() == NotificationType::PlaterWarning)
|
||||||
notification->hide(preview);
|
notification->hide(preview);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool NotificationManager::has_error_notification()
|
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)
|
if (notification->get_data().level == NotificationLevel::ErrorNotification)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,8 +55,6 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
NotificationManager(wxEvtHandler* evt_handler);
|
NotificationManager(wxEvtHandler* evt_handler);
|
||||||
~NotificationManager();
|
|
||||||
|
|
||||||
|
|
||||||
// only type means one of basic_notification (see below)
|
// only type means one of basic_notification (see below)
|
||||||
void push_notification(const NotificationType type, GLCanvas3D& canvas, int timestamp = 0);
|
void push_notification(const NotificationType type, GLCanvas3D& canvas, int timestamp = 0);
|
||||||
|
@ -118,7 +116,7 @@ private:
|
||||||
Hovered
|
Hovered
|
||||||
};
|
};
|
||||||
PopNotification(const NotificationData &n, const int id, wxEvtHandler* evt_handler);
|
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);
|
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
|
// close will dissapear notification on next render
|
||||||
void close() { m_close_pending = true; }
|
void close() { m_close_pending = true; }
|
||||||
|
@ -243,14 +241,14 @@ private:
|
||||||
//pushes notification into the queue of notifications that are rendered
|
//pushes notification into the queue of notifications that are rendered
|
||||||
//can be used to create custom notification
|
//can be used to create custom notification
|
||||||
bool push_notification_data(const NotificationData& notification_data, GLCanvas3D& canvas, int timestamp);
|
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
|
//finds older notification of same type and moves it to the end of queue. returns true if found
|
||||||
bool find_older(NotificationManager::PopNotification* notification);
|
bool find_older(NotificationManager::PopNotification* notification);
|
||||||
void sort_notifications();
|
void sort_notifications();
|
||||||
bool has_error_notification();
|
bool has_error_notification();
|
||||||
|
|
||||||
wxEvtHandler* m_evt_handler;
|
wxEvtHandler* m_evt_handler;
|
||||||
std::deque<PopNotification*> m_pop_notifications;
|
std::deque<std::unique_ptr<PopNotification>> m_pop_notifications;
|
||||||
int m_next_id { 1 };
|
int m_next_id { 1 };
|
||||||
long m_last_time { 0 };
|
long m_last_time { 0 };
|
||||||
bool m_hovered { false };
|
bool m_hovered { false };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue