X-Git-Url: https://vaikene.ee/gitweb/pswgen11.html?a=blobdiff_plain;f=src%2Fplugins%2FSdiWindow%2Fsdiwindow.cpp;h=25a86acab2639b0505ebf10fc35f6b938b5a4ca1;hb=de270ece1b764b19968e14420f538321f1c06b15;hp=c0e3587711afa35e00cbab88a421d4c38b634e47;hpb=5dd5f367dfcecab75077c3cb4ca1f01113fc1561;p=evaf diff --git a/src/plugins/SdiWindow/sdiwindow.cpp b/src/plugins/SdiWindow/sdiwindow.cpp index c0e3587..25a86ac 100644 --- a/src/plugins/SdiWindow/sdiwindow.cpp +++ b/src/plugins/SdiWindow/sdiwindow.cpp @@ -3,7 +3,7 @@ * @brief SdiWindow module's implementation * @author Enar Vaikene * - * Copyright (c) 2011 Enar Vaikene + * Copyright (c) 2011-2019 Enar Vaikene * * This file is part of the eVaf C++ cross-platform application development framework. * @@ -25,14 +25,14 @@ #include #include -#include +#include #include namespace eVaf { namespace SdiWindow { namespace Internal { /// iSdiWindow interface instance singleton - static iSdiWindow * mSdiWindow = 0; + static iSdiWindow * mSdiWindow = nullptr; } // namespace eVaf::SdiWindow::Internal } // namespace eVaf::SdiWindow } // namespace eVaf @@ -53,7 +53,7 @@ SdiWindow::iSdiWindow * SdiWindow::iSdiWindow::instance() SdiWindow::Internal::MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) : QWidget(parent, flags) , mReady(false) - , mTimerId(0) + , mMainPanel(nullptr) { setObjectName(QString("%1-%2").arg(VER_MODULE_NAME_STR).arg(__FUNCTION__)); @@ -74,7 +74,7 @@ SdiWindow::Internal::MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags fl SdiWindow::Internal::MainWindow::~MainWindow() { - mSdiWindow = 0; + mSdiWindow = nullptr; // Save geometry saveSettings(); @@ -103,9 +103,6 @@ bool SdiWindow::Internal::MainWindow::init(QString const & args) setWindowTitle(Common::iApp::instance()->name()); - // Start the garbage collector timer - mTimerId = startTimer(60 * 1000); - show(); mReady = true; @@ -121,21 +118,15 @@ void SdiWindow::Internal::MainWindow::done() close(); - if (mTimerId) { - killTimer(mTimerId); - mTimerId = 0; - } - // Delete all the panels for (int i = mPanels.size() - 1; i >= 0; --i) { - QWeakPointer p = mPanels.at(i); - if (p) - delete p.data(); + disconnect(mPanels.at(i), SIGNAL(destroyed(QObject *)), this, SLOT(panelDestroyed(QObject *))); + delete mPanels.at(i); } mPanels.clear(); mMinimizedPanels.clear(); mPanelNames.clear(); - mMainPanel.clear(); + mMainPanel = nullptr; mMainPanelName.clear(); EVAF_INFO("%s finalized", qPrintable(objectName())); @@ -143,6 +134,7 @@ void SdiWindow::Internal::MainWindow::done() void SdiWindow::Internal::MainWindow::addPanel(QString const & name, Gui::Panel * panel) { + connect(panel, SIGNAL(destroyed(QObject *)), this, SLOT(panelDestroyed(QObject*))); mPanels.append(panel); mPanelNames.insert(name, panel); @@ -165,10 +157,10 @@ void SdiWindow::Internal::MainWindow::addPanel(QString const & name, Gui::Panel Gui::Panel * SdiWindow::Internal::MainWindow::panel(QString const & name) const { - QHash >::const_iterator it = mPanelNames.constFind(name); + QHash::const_iterator it = mPanelNames.constFind(name); if (it != mPanelNames.constEnd()) - return it.value().data(); - return 0; + return it.value(); + return nullptr; } bool SdiWindow::Internal::MainWindow::showPanel(QString const & name) @@ -246,12 +238,10 @@ void SdiWindow::Internal::MainWindow::setWindowSize() void SdiWindow::Internal::MainWindow::closeEvent(QCloseEvent * e) { // Try to close all the managed panels; ignore the event if one of the managed panels refuses to close - foreach (QWeakPointer p, mPanels) { - if (p) { - if (!p.data()->close()) { - e->ignore(); - return; - } + foreach (Gui::Panel * p, mPanels) { + if (!p->close()) { + e->ignore(); + return; } } @@ -266,9 +256,9 @@ void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e) if (windowState() == Qt::WindowNoState && wse->oldState() == Qt::WindowMinimized) { // Restore all the managed panels that were previously minimized - foreach (QWeakPointer p, mMinimizedPanels) { - if (p && p.data()->isVisible()) - p.data()->showNormal(); + foreach (Gui::Panel * p, mMinimizedPanels) { + if (p->isVisible()) + p->showNormal(); } mMinimizedPanels.clear(); } @@ -277,13 +267,10 @@ void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e) // Minimize all the managed panels that are not minimized yet mMinimizedPanels.clear(); - foreach (QWeakPointer p, mPanels) { - if (!p) - continue; - - if (p.data()->windowState() != Qt::WindowMinimized && p.data()->isVisible()) { + foreach (Gui::Panel * p, mPanels) { + if (p->windowState() != Qt::WindowMinimized && p->isVisible()) { mMinimizedPanels.append(p); - p.data()->showMinimized(); + p->showMinimized(); } } } @@ -291,36 +278,52 @@ void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e) QWidget::changeEvent(e); } -void SdiWindow::Internal::MainWindow::timerEvent(QTimerEvent * e) +void SdiWindow::Internal::MainWindow::panelDestroyed(QObject * obj) { - if (e->timerId() == mTimerId) { - - // Remove panels that are deleted + // Remove panels that are deleted + { + QList::iterator it = mPanels.begin(); + while (it != mPanels.end()) { + if (*it == obj) { + it = mPanels.erase(it); + } + else { + ++it; + } + } + } + { + QVector::iterator it = mMinimizedPanels.begin(); + while (it != mMinimizedPanels.end()) { - QList >::iterator it = mPanels.begin(); - while (it != mPanels.end()) { - QWeakPointer p = *it; - if (!p) - it = mPanels.erase(it); - else - ++it; + if (*it == obj) + { + it = mMinimizedPanels.erase(it); + } + else + { + ++it; } } + } - // Do the same with panel names - { - QHash >::iterator it = mPanelNames.begin(); - while (it != mPanelNames.end()) { - QWeakPointer p = it.value(); - if (!p) - it = mPanelNames.erase(it); - else - ++it; + // Do the same with panel names + { + QHash::iterator it = mPanelNames.begin(); + while (it != mPanelNames.end()) { + if (it.value() == obj) { + it = mPanelNames.erase(it); + } + else { + ++it; } } } - else - QWidget::timerEvent(e); + + // If it was the main panel, set the main panel to NULL + if (mMainPanel == obj) { + mMainPanel = nullptr; + } } @@ -328,17 +331,16 @@ void SdiWindow::Internal::MainWindow::timerEvent(QTimerEvent * e) SdiWindow::Internal::SdiWindowPlugin::SdiWindowPlugin() : Plugins::iPlugin() + , mWindow(new MainWindow) { setObjectName(VER_MODULE_NAME_STR); - mWindow = new MainWindow; - EVAF_INFO("%s created", qPrintable(objectName())); } SdiWindow::Internal::SdiWindowPlugin::~SdiWindowPlugin() { - delete mWindow; + mWindow.reset(); EVAF_INFO("%s destroyed", qPrintable(objectName())); }