Skip to content
Extraits de code Groupes Projets
Vérifiée Valider be66180b rédigé par Kubat's avatar Kubat
Parcourir les fichiers

UI: Avoid memory leaks on reload of sub documents

parent c5dcabdd
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!18Implement the VivyDocument specification
...@@ -9,3 +9,16 @@ Utils::setTransparentBackgroundForWidget(QWidget *const w) noexcept ...@@ -9,3 +9,16 @@ Utils::setTransparentBackgroundForWidget(QWidget *const w) noexcept
w->setAttribute(Qt::WA_TranslucentBackground); w->setAttribute(Qt::WA_TranslucentBackground);
w->setAttribute(Qt::WA_TransparentForMouseEvents); w->setAttribute(Qt::WA_TransparentForMouseEvents);
} }
const QString Utils::untouchedTabIndicator = QStringLiteral("(*)");
const QString Utils::unsavedTabIndicator = QStringLiteral("(+)");
void
Utils::deleteInternalWidget(QDockWidget *const dock) noexcept
{
QWidget *widget = dock->widget();
if (widget != nullptr) {
delete widget;
dock->setWidget(nullptr);
}
}
...@@ -11,4 +11,7 @@ class QWidget; ...@@ -11,4 +11,7 @@ class QWidget;
namespace Vivy::Utils namespace Vivy::Utils
{ {
void setTransparentBackgroundForWidget(QWidget *const) noexcept; void setTransparentBackgroundForWidget(QWidget *const) noexcept;
void deleteInternalWidget(QDockWidget *const) noexcept;
extern const QString untouchedTabIndicator;
extern const QString unsavedTabIndicator;
} }
...@@ -52,9 +52,9 @@ VivyDocumentView::getDocument() const noexcept ...@@ -52,9 +52,9 @@ VivyDocumentView::getDocument() const noexcept
QString QString
VivyDocumentView::getDocumentTabName() const noexcept VivyDocumentView::getDocumentTabName() const noexcept
{ {
return QString::fromUtf8( return document->checkDocumentOption(VivyDocument::UntouchedByDefault)
document->checkDocumentOption(VivyDocument::UntouchedByDefault) ? "(*) " : "") + ? (Utils::untouchedTabIndicator + " ")
Utils::getBaseName(document->getName()); : QString::fromUtf8("") + Utils::getBaseName(document->getName());
} }
QString QString
...@@ -74,7 +74,9 @@ VivyDocumentView::getDocumentTabToolTip() const noexcept ...@@ -74,7 +74,9 @@ VivyDocumentView::getDocumentTabToolTip() const noexcept
void void
VivyDocumentView::loadVideoView() noexcept VivyDocumentView::loadVideoView() noexcept
{ {
if (document->checkDocumentCapabilities(VivyDocument::Capabilities::VideoAble)) { if (!document->checkDocumentCapabilities(VivyDocument::Capabilities::VideoAble))
return;
if (!videoView) { if (!videoView) {
videoView = new UnclosableDockWidget("Video View", this); videoView = new UnclosableDockWidget("Video View", this);
videoView->setAllowedAreas(Qt::AllDockWidgetAreas); videoView->setAllowedAreas(Qt::AllDockWidgetAreas);
...@@ -82,19 +84,18 @@ VivyDocumentView::loadVideoView() noexcept ...@@ -82,19 +84,18 @@ VivyDocumentView::loadVideoView() noexcept
addDockWidget(Qt::BottomDockWidgetArea, videoView, Qt::Vertical); addDockWidget(Qt::BottomDockWidgetArea, videoView, Qt::Vertical);
} }
// Kubat: because the dock is "closable", when closed the widget itself Utils::deleteInternalWidget(videoView);
// is not deleted, it will be hidden and the content will be deleted.
// TODO: Check if it works on more platforms.
videoView->setWidget(new VideoView(videoView)); videoView->setWidget(new VideoView(videoView));
qobject_cast<VideoView *>(videoView->widget()) qobject_cast<VideoView *>(videoView->widget())
->loadFile(document->getVideoSubDocument()->getFilePath()); ->loadFile(document->getVideoSubDocument()->getFilePath());
} }
}
void void
VivyDocumentView::loadAssView() noexcept VivyDocumentView::loadAssView() noexcept
{ {
if (document->checkDocumentCapabilities(VivyDocument::Capabilities::AssAble)) { if (!document->checkDocumentCapabilities(VivyDocument::Capabilities::AssAble))
return;
if (!assLines) { if (!assLines) {
assLines = new UnclosableDockWidget("ASS Lines", this); assLines = new UnclosableDockWidget("ASS Lines", this);
assLines->setFeatures(onlyClosableDockFeatures); assLines->setFeatures(onlyClosableDockFeatures);
...@@ -104,19 +105,19 @@ VivyDocumentView::loadAssView() noexcept ...@@ -104,19 +105,19 @@ VivyDocumentView::loadAssView() noexcept
} }
assModel.reset(new AssLinesModel(document->getAssSubDocument()->getLines())); assModel.reset(new AssLinesModel(document->getAssSubDocument()->getLines()));
Utils::deleteInternalWidget(assLines);
assLines->setWidget(new AssLinesView(assModel.get(), assLines)); assLines->setWidget(new AssLinesView(assModel.get(), assLines));
} }
}
void void
VivyDocumentView::loadAudioView() noexcept VivyDocumentView::loadAudioView() noexcept
{ {
if (document->checkDocumentCapabilities(VivyDocument::AudioAble)) { if (!document->checkDocumentCapabilities(VivyDocument::AudioAble))
std::shared_ptr<AudioSubDocument> audioDocument = document->getAudioSubDocument(); return;
qDebug() << "Create an audio vizualizer for the audio sub document"
<< audioDocument->getFilePath();
std::shared_ptr<AudioSubDocument> audioDocument = document->getAudioSubDocument();
AudioContext::StreamPtr stream = audioDocument->getDefaultStream(); AudioContext::StreamPtr stream = audioDocument->getDefaultStream();
if (stream == nullptr) { if (stream == nullptr) {
qCritical() << "Failed to get default audio stream"; qCritical() << "Failed to get default audio stream";
return; return;
...@@ -134,15 +135,11 @@ VivyDocumentView::loadAudioView() noexcept ...@@ -134,15 +135,11 @@ VivyDocumentView::loadAudioView() noexcept
// Kubat: don't check, may throw an error but don't think we can // Kubat: don't check, may throw an error but don't think we can
// recover from it. // recover from it.
AudioVisualizer *visualizerInner = new AudioVisualizer(stream, visualizer); AudioVisualizer *visualizerInner = new AudioVisualizer(stream, visualizer);
Utils::deleteInternalWidget(visualizer);
visualizer->setWidget(visualizerInner); visualizer->setWidget(visualizerInner);
visualizer->layout()->setAlignment(visualizerInner, Qt::AlignTop); visualizer->layout()->setAlignment(visualizerInner, Qt::AlignTop);
} }
else {
qDebug() << "The document" << document->getName() << "is not AudioAble";
}
}
void void
VivyDocumentView::closeDocument() noexcept VivyDocumentView::closeDocument() noexcept
{ {
...@@ -150,6 +147,8 @@ VivyDocumentView::closeDocument() noexcept ...@@ -150,6 +147,8 @@ VivyDocumentView::closeDocument() noexcept
<< document.use_count() << ")"; << document.use_count() << ")";
vivyApp->documentStore.closeDocument(document->getUuid()); vivyApp->documentStore.closeDocument(document->getUuid());
TODO(Force close all floating docks)
// Kubat: the visualizer pointer should have been deleted by the // Kubat: the visualizer pointer should have been deleted by the
// deleteAllContent() call if it was created. // deleteAllContent() call if it was created.
deleteAllContent(); deleteAllContent();
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter