fix: invoke js clearInterval on WebMediaController::stop

This commit is contained in:
Ian Chua
2026-09-16 14:13:37 +08:00
parent b4f33e71e9
commit 2ac45b2f78
+19 -14
View File
@@ -4,25 +4,20 @@
namespace Slic3r { namespace GUI { namespace Slic3r { namespace GUI {
WebMediaController::WebMediaController(wxWebView *webview) : m_webview(webview) WebMediaController::WebMediaController(wxWebView* webview) : m_webview(webview)
{ {
if (!m_webview) if (!m_webview)
return; return;
m_webview->SetBackgroundColour(*wxBLACK); m_webview->SetBackgroundColour(*wxBLACK);
m_webview->SetPage( m_webview->SetPage("<html><head><style>html,body{margin:0;height:100%;background:#000;}</style></head><body></body></html>", "");
"<html><head><style>html,body{margin:0;height:100%;background:#000;}</style></head><body></body></html>",
"");
} }
void WebMediaController::Load(wxURI url) void WebMediaController::Load(wxURI url) { Load(url, CameraStreamMode::http); }
{
Load(url, CameraStreamMode::http);
}
void WebMediaController::Load(wxURI url, CameraStreamMode mode) void WebMediaController::Load(wxURI url, CameraStreamMode mode)
{ {
m_url = url.BuildURI().ToStdString(); m_url = url.BuildURI().ToStdString();
m_stream_mode = mode; m_stream_mode = mode;
} }
@@ -31,13 +26,14 @@ void WebMediaController::Play()
if (!m_webview) if (!m_webview)
return; return;
wxString url = wxString::FromUTF8(m_url); wxString url = wxString::FromUTF8(m_url);
wxString html = "<html><head><style>" wxString html = "<html><head><style>"
"html,body{margin:0;height:100%;background:#000;overflow:hidden;}" "html,body{margin:0;height:100%;background:#000;overflow:hidden;}"
"img{width:100%;height:100%;object-fit:contain;display:block;}" "img{width:100%;height:100%;object-fit:contain;display:block;}"
"</style></head><body><img id=\"camera-frame\""; "</style></head><body><img id=\"camera-frame\"";
if (m_stream_mode == CameraStreamMode::http_snapshot) { if (m_stream_mode == CameraStreamMode::http_snapshot) {
html += " data-camera-url=\"" + url + "\"><script>" html += " data-camera-url=\"" + url +
"\"><script>"
"const cameraFrame=document.getElementById('camera-frame');" "const cameraFrame=document.getElementById('camera-frame');"
"const cameraUrl=cameraFrame.dataset.cameraUrl;" "const cameraUrl=cameraFrame.dataset.cameraUrl;"
"let cameraFrameLoading=false;" "let cameraFrameLoading=false;"
@@ -49,8 +45,15 @@ void WebMediaController::Play()
"nextFrame.onerror=function(){cameraFrameLoading=false;};" "nextFrame.onerror=function(){cameraFrameLoading=false;};"
"nextFrame.src=cameraUrl+(cameraUrl.indexOf('?')>=0?'&':'?')+'_orca_frame='+Date.now();" "nextFrame.src=cameraUrl+(cameraUrl.indexOf('?')>=0?'&':'?')+'_orca_frame='+Date.now();"
"}" "}"
"let cameraRefreshInterval=null;"
"function stopCameraRefresh(){"
"if(cameraRefreshInterval!==null){"
"clearInterval(cameraRefreshInterval);"
"cameraRefreshInterval=null;"
"}"
"}"
"refreshCameraFrame();" "refreshCameraFrame();"
"setInterval(refreshCameraFrame,200);" "cameraRefreshInterval = setInterval(refreshCameraFrame,200);"
"</script></body></html>"; "</script></body></html>";
m_webview->SetPage(html, url); m_webview->SetPage(html, url);
} else { } else {
@@ -63,9 +66,11 @@ void WebMediaController::Play()
void WebMediaController::Stop() void WebMediaController::Stop()
{ {
m_url.clear(); if (m_webview) {
if (m_webview) m_webview->RunScript("if(typeof stopCameraRefresh==='function') stopCameraRefresh();");
m_webview->Stop(); m_webview->Stop();
}
m_url.clear();
} }
}} // namespace Slic3r::GUI }} // namespace Slic3r::GUI