From 3ae40139b3e94d82b91dcbda45497175e07acb83 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 16 Dec 2020 13:59:16 +0100 Subject: [PATCH] render timer --- src/slic3r/GUI/GLCanvas3D.cpp | 14 ++++++++-- src/slic3r/GUI/NotificationManager.cpp | 36 +++++++++++++------------- src/slic3r/GUI/NotificationManager.hpp | 6 ++--- src/slic3r/Utils/PresetUpdater.cpp | 2 -- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ff2752cfe..28f5c7c7f 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2409,7 +2409,6 @@ void GLCanvas3D::on_idle(wxIdleEvent& evt) { if (!m_initialized) return; - #if ENABLE_NEW_NOTIFICATIONS_FADE_OUT /*NotificationManager* notification_mgr = wxGetApp().plater()->get_notification_manager(); if (notification_mgr->requires_update()) @@ -2982,7 +2981,17 @@ void GLCanvas3D::on_timer(wxTimerEvent& evt) void GLCanvas3D::on_render_timer(wxTimerEvent& evt) { - render(); + // If slicer is not top window -> restart timer with one second to try again + wxWindow* p = dynamic_cast(wxGetApp().plater()); + while (p->GetParent() != nullptr) + p = p->GetParent(); + wxTopLevelWindow* top_level_wnd = dynamic_cast(p); + if (!top_level_wnd->IsActive()) { + request_extra_frame_delayed(1000); + return; + } + //render(); + m_dirty = true; } void GLCanvas3D::request_extra_frame_delayed(wxLongLong miliseconds) @@ -2995,6 +3004,7 @@ void GLCanvas3D::request_extra_frame_delayed(wxLongLong miliseconds) } else { const wxLongLong remaining_time = m_extra_frame_requested_delayed - (wxGetLocalTimeMillis() - m_render_timer_start); if(miliseconds < remaining_time) { + m_render_timer.Stop(); m_extra_frame_requested_delayed = miliseconds; m_render_timer.StartOnce((int)miliseconds.ToLong()); m_render_timer_start = wxGetLocalTimeMillis(); diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 300303bbd..d241bd3c2 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -22,6 +22,9 @@ static constexpr float SPACE_RIGHT_PANEL = 10.0f; static constexpr float FADING_OUT_DURATION = 2.0f; // Time in Miliseconds after next render is requested static constexpr int FADING_OUT_TIMEOUT = 100; +// If timeout is changed to higher than 1 second, substract_time call should be revorked +static constexpr int MAX_TIMEOUT_MILISECONDS = 1000; +static constexpr int MAX_TIMEOUT_SECONDS = 1; #endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT namespace Slic3r { @@ -136,7 +139,7 @@ NotificationManager::PopNotification::PopNotification(const NotificationData &n, , m_hypertext (n.hypertext) , m_text2 (n.text2) , m_evt_handler (evt_handler) - , m_notification_start (wxGetLocalTimeMillis()) +// , m_notification_start (wxGetLocalTimeMillis()) { //init(); } @@ -763,24 +766,26 @@ void NotificationManager::PopNotification::update_state() m_fading_out = false; m_current_fade_opacity = 1.0f; m_remaining_time = m_data.duration; +// m_notification_start = wxGetLocalTimeMillis(); + BOOST_LOG_TRIVIAL(error) << "hover"; } if (m_counting_down) { - wxMilliClock_t up_time = wxGetLocalTimeMillis() - m_notification_start; - + //wxMilliClock_t up_time = wxGetLocalTimeMillis() - m_notification_start; + if (m_fading_out && m_current_fade_opacity <= 0.0f) m_finished = true; - else if (!m_fading_out && up_time >= m_remaining_time * 1000) { + else if (!m_fading_out && m_remaining_time <=0/*up_time >= m_data.duration * 1000*/) { m_fading_out = true; m_fading_start = wxGetLocalTimeMillis(); m_last_render_fading = wxGetLocalTimeMillis(); } else if (!m_fading_out) { - m_next_render = m_remaining_time * 1000 - up_time; - BOOST_LOG_TRIVIAL(error) << (boost::format("next render %1%") % m_next_render); + m_next_render = std::min(/*m_data.duration * 1000 - up_time*/m_remaining_time * 1000, MAX_TIMEOUT_MILISECONDS); + //BOOST_LOG_TRIVIAL(error) << (boost::format("up time %1% next render %2%") % up_time % m_next_render); } } - + if (m_finished) { m_state = EState::Finished; m_next_render = 0; @@ -802,15 +807,15 @@ void NotificationManager::PopNotification::update_state() m_current_fade_opacity = std::clamp(1.0f - 0.001f * static_cast(curr_time.GetValue()) / FADING_OUT_DURATION, 0.0f, 1.0f); auto next_render = FADING_OUT_TIMEOUT - no_render_time; if (next_render <= 0) { - m_last_render_fading = wxGetLocalTimeMillis(); + //m_last_render_fading = wxGetLocalTimeMillis(); m_state = EState::FadingOutRender; m_next_render = 0; } else m_next_render = next_render; - BOOST_LOG_TRIVIAL(error) << (boost::format("fade render %1%") % m_next_render); + //BOOST_LOG_TRIVIAL(error) << (boost::format("fade render %1%") % m_next_render); } } - + BOOST_LOG_TRIVIAL(error) << (boost::format("remaining time %1% fading %2% next render %3%") % m_remaining_time % m_fading_out % m_next_render); } #endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT @@ -1399,11 +1404,6 @@ void NotificationManager::update_notifications() break; } } - if (m_hovered) { - for (const std::unique_ptr& notification : m_pop_notifications) { - notification->reset_start_time(); - } - } // Reuire render if some notification was just deleted. @@ -1450,13 +1450,13 @@ void NotificationManager::update_notifications() long now = wxGetLocalTime(); // Pausing fade-out when the mouse is over some notification. if (!m_hovered && m_last_time < now) { - if (now - m_last_time >= 1) { + if (now - m_last_time >= MAX_TIMEOUT_SECONDS) { for (auto& notification : m_pop_notifications) { //if (notification->get_state() != PopNotification::EState::Static) - notification->substract_remaining_time(); + notification->substract_remaining_time(MAX_TIMEOUT_SECONDS); } + m_last_time = now; } - m_last_time = now; } } } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index fef66f183..a7a333fae 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -232,7 +232,7 @@ private: const NotificationData get_data() const { return m_data; } const bool is_gray() const { return m_is_gray; } // Call equals one second down - void substract_remaining_time() { m_remaining_time--; } + void substract_remaining_time(int seconds) { m_remaining_time -= seconds; } void set_gray(bool g) { m_is_gray = g; } void set_paused(bool p) { m_paused = p; } bool compare_text(const std::string& text); @@ -243,7 +243,7 @@ private: bool requires_update() const { return m_state != EState::Hidden; } EState get_state() const { return m_state; } wxLongLong next_render() const { return m_next_render; } - void reset_start_time() { m_notification_start = wxGetLocalTimeMillis(); } +// void reset_start_time() { m_notification_start = wxGetLocalTimeMillis(); } #endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT protected: @@ -303,7 +303,7 @@ private: // time of last done render when fading wxLongLong m_last_render_fading { 0LL }; // first appereance of notification or last hover; - wxLongLong m_notification_start; +// wxLongLong m_notification_start; // time to next must-do render wxLongLong m_next_render { std::numeric_limits::max() }; #else diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 5de3da743..c3ea473cb 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -741,8 +741,6 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3 { if (! p->enabled_config_update) { return R_NOOP; } - GUI::wxGetApp().plater()->get_notification_manager()->push_notification(GUI::NotificationType::PresetUpdateAvailable); - auto updates = p->get_config_updates(old_slic3r_version); if (updates.incompats.size() > 0) { BOOST_LOG_TRIVIAL(info) << format("%1% bundles incompatible. Asking for action...", updates.incompats.size());