* @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.
*
#include <Common/iApp>
#include <Common/iProp>
-#include <QtGui>
+#include <QtWidgets>
#include <QXmlStreamReader>
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
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__));
SdiWindow::Internal::MainWindow::~MainWindow()
{
- mSdiWindow = 0;
+ mSdiWindow = nullptr;
// Save geometry
saveSettings();
setWindowTitle(Common::iApp::instance()->name());
- // Start the garbage collector timer
- mTimerId = startTimer(60 * 1000);
-
show();
mReady = true;
close();
- if (mTimerId) {
- killTimer(mTimerId);
- mTimerId = 0;
- }
-
// Delete all the panels
for (int i = mPanels.size() - 1; i >= 0; --i) {
- QWeakPointer<Gui::Panel> 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()));
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);
Gui::Panel * SdiWindow::Internal::MainWindow::panel(QString const & name) const
{
- QHash<QString, QWeakPointer<Gui::Panel> >::const_iterator it = mPanelNames.constFind(name);
+ QHash<QString, Gui::Panel *>::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)
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<Gui::Panel> p, mPanels) {
- if (p) {
- if (!p.data()->close()) {
- e->ignore();
- return;
- }
+ foreach (Gui::Panel * p, mPanels) {
+ if (!p->close()) {
+ e->ignore();
+ return;
}
}
if (windowState() == Qt::WindowNoState && wse->oldState() == Qt::WindowMinimized) {
// Restore all the managed panels that were previously minimized
- foreach (QWeakPointer<Gui::Panel> p, mMinimizedPanels) {
- if (p && p.data()->isVisible())
- p.data()->showNormal();
+ foreach (Gui::Panel * p, mMinimizedPanels) {
+ if (p->isVisible())
+ p->showNormal();
}
mMinimizedPanels.clear();
}
// Minimize all the managed panels that are not minimized yet
mMinimizedPanels.clear();
- foreach (QWeakPointer<Gui::Panel> 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();
}
}
}
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<Gui::Panel *>::iterator it = mPanels.begin();
+ while (it != mPanels.end()) {
+ if (*it == obj) {
+ it = mPanels.erase(it);
+ }
+ else {
+ ++it;
+ }
+ }
+ }
+ {
+ QVector<Gui::Panel *>::iterator it = mMinimizedPanels.begin();
+ while (it != mMinimizedPanels.end())
{
- QList<QWeakPointer<Gui::Panel> >::iterator it = mPanels.begin();
- while (it != mPanels.end()) {
- QWeakPointer<Gui::Panel> 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<QString, QWeakPointer<Gui::Panel> >::iterator it = mPanelNames.begin();
- while (it != mPanelNames.end()) {
- QWeakPointer<Gui::Panel> p = it.value();
- if (!p)
- it = mPanelNames.erase(it);
- else
- ++it;
+ // Do the same with panel names
+ {
+ QHash<QString, Gui::Panel *>::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;
+ }
}
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()));
}