X-Git-Url: https://vaikene.ee/gitweb/pswgen09.html?a=blobdiff_plain;f=src%2Fplugins%2FSdiWindow%2Fsdiwindow.cpp;h=25a86acab2639b0505ebf10fc35f6b938b5a4ca1;hb=de270ece1b764b19968e14420f538321f1c06b15;hp=aa264de0362658deacd5b22e587cd5f6d56abee5;hpb=54f282ee6797c05e60993632218875092362bdf7;p=evaf diff --git a/src/plugins/SdiWindow/sdiwindow.cpp b/src/plugins/SdiWindow/sdiwindow.cpp index aa264de..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. * @@ -23,14 +23,16 @@ #include #include #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 @@ -40,28 +42,25 @@ using namespace eVaf; //------------------------------------------------------------------- -using namespace eVaf::SdiWindow; - -iSdiWindow * iSdiWindow::instance() +SdiWindow::iSdiWindow * SdiWindow::iSdiWindow::instance() { - return Internal::mSdiWindow; + return SdiWindow::Internal::mSdiWindow; } //------------------------------------------------------------------- -using namespace eVaf::SdiWindow::Internal; - -MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) +SdiWindow::Internal::MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) : QWidget(parent, flags) , mReady(false) + , mMainPanel(nullptr) { setObjectName(QString("%1-%2").arg(VER_MODULE_NAME_STR).arg(__FUNCTION__)); // Restore geometry restoreSettings(); - // Apply the size specified in a) properties; or b) on the command line + // Apply the size specified in a) properties; or b) on the command line (overwrites stored geometry) setWindowSize(); // Create the default layout @@ -73,9 +72,9 @@ MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) EVAF_INFO("%s created", qPrintable(objectName())); } -MainWindow::~MainWindow() +SdiWindow::Internal::MainWindow::~MainWindow() { - mSdiWindow = 0; + mSdiWindow = nullptr; // Save geometry saveSettings(); @@ -83,9 +82,22 @@ MainWindow::~MainWindow() EVAF_INFO("%s destroyed", qPrintable(objectName())); } -bool MainWindow::init(QString const & args) +QString SdiWindow::Internal::MainWindow::getMainPanelName(QString const & args) const +{ + QXmlStreamReader xml(args); + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "attributes") { + if (xml.attributes().hasAttribute("mainPanelName")) + return xml.attributes().value("mainPanelName").toString(); + } + } + return QString(); +} + +bool SdiWindow::Internal::MainWindow::init(QString const & args) { - Q_UNUSED(args); + mMainPanelName = getMainPanelName(args); Common::iRegistry::instance()->registerInterface("iSdiWindow", this); @@ -100,29 +112,68 @@ bool MainWindow::init(QString const & args) return true; } -void MainWindow::done() +void SdiWindow::Internal::MainWindow::done() { mReady = false; close(); - // Delete the window - if (mWindow) - delete mWindow.data(); + // Delete all the panels + for (int i = mPanels.size() - 1; i >= 0; --i) { + disconnect(mPanels.at(i), SIGNAL(destroyed(QObject *)), this, SLOT(panelDestroyed(QObject *))); + delete mPanels.at(i); + } + mPanels.clear(); + mMinimizedPanels.clear(); + mPanelNames.clear(); + mMainPanel = nullptr; + mMainPanelName.clear(); EVAF_INFO("%s finalized", qPrintable(objectName())); } -void MainWindow::addWindow(Gui::Window * window) +void SdiWindow::Internal::MainWindow::addPanel(QString const & name, Gui::Panel * panel) { - // Delete the existing window - if (mWindow) - delete mWindow.data(); - mLayout->addWidget(window); - mWindow = window; + connect(panel, SIGNAL(destroyed(QObject *)), this, SLOT(panelDestroyed(QObject*))); + mPanels.append(panel); + mPanelNames.insert(name, panel); + + // If this is the predefined main panel, add it to this window + if (!mMainPanelName.isEmpty()) { + if (name == mMainPanelName) { + mMainPanel = panel; + mLayout->addWidget(panel); + } + } + + // If the predefined main panel name is not set, use the first panel + else { + if (!mMainPanel) { + mMainPanel = panel; + mLayout->addWidget(panel); + } + } } -void MainWindow::saveSettings() +Gui::Panel * SdiWindow::Internal::MainWindow::panel(QString const & name) const +{ + QHash::const_iterator it = mPanelNames.constFind(name); + if (it != mPanelNames.constEnd()) + return it.value(); + return nullptr; +} + +bool SdiWindow::Internal::MainWindow::showPanel(QString const & name) +{ + Gui::Panel * p = panel(name); + if (p) { + p->show(); + return true; + } + return false; +} + +void SdiWindow::Internal::MainWindow::saveSettings() { static int ver[4] = {VER_FILE_VERSION}; QSettings settings(VER_COMPANY_NAME_STR, Common::iApp::instance()->name()); @@ -131,7 +182,7 @@ void MainWindow::saveSettings() settings.setValue(QString("%1/geometry").arg(objectName()), saveGeometry()); } -void MainWindow::restoreSettings() +void SdiWindow::Internal::MainWindow::restoreSettings() { static int ver[4] = {VER_FILE_VERSION}; QSettings settings(VER_COMPANY_NAME_STR, Common::iApp::instance()->name()); @@ -149,11 +200,11 @@ void MainWindow::restoreSettings() restoreGeometry(settings.value(QString("%1/geometry").arg(objectName())).toByteArray()); } -void MainWindow::setWindowSize() +void SdiWindow::Internal::MainWindow::setWindowSize() { // a) Get window size from properties - int w = 0; - int h = 0; + int w = Common::iProp::instance()->getValue("windowWidth", 0).toInt(); + int h = Common::iProp::instance()->getValue("windowHeight", 0).toInt(); // b) Use command line arguments QStringList args = QApplication::arguments(); @@ -184,27 +235,117 @@ void 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 (Gui::Panel * p, mPanels) { + if (!p->close()) { + e->ignore(); + return; + } + } + + QWidget::closeEvent(e); +} + +void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e) +{ + if (e->type() == QEvent::WindowStateChange) { + QWindowStateChangeEvent * wse = static_cast(e); + + if (windowState() == Qt::WindowNoState && wse->oldState() == Qt::WindowMinimized) { + + // Restore all the managed panels that were previously minimized + foreach (Gui::Panel * p, mMinimizedPanels) { + if (p->isVisible()) + p->showNormal(); + } + mMinimizedPanels.clear(); + } + + else if (windowState() == Qt::WindowMinimized && wse->oldState() != Qt::WindowMinimized) { + + // Minimize all the managed panels that are not minimized yet + mMinimizedPanels.clear(); + foreach (Gui::Panel * p, mPanels) { + if (p->windowState() != Qt::WindowMinimized && p->isVisible()) { + mMinimizedPanels.append(p); + p->showMinimized(); + } + } + } + } + QWidget::changeEvent(e); +} + +void SdiWindow::Internal::MainWindow::panelDestroyed(QObject * obj) +{ + // 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()) + { + if (*it == obj) + { + it = mMinimizedPanels.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; + } + } + } + + // If it was the main panel, set the main panel to NULL + if (mMainPanel == obj) { + mMainPanel = nullptr; + } +} + //------------------------------------------------------------------- -SdiWindowPlugin::SdiWindowPlugin() +SdiWindow::Internal::SdiWindowPlugin::SdiWindowPlugin() : Plugins::iPlugin() + , mWindow(new MainWindow) { setObjectName(VER_MODULE_NAME_STR); - mWindow = new MainWindow; - EVAF_INFO("%s created", qPrintable(objectName())); } -SdiWindowPlugin::~SdiWindowPlugin() +SdiWindow::Internal::SdiWindowPlugin::~SdiWindowPlugin() { - delete mWindow; + mWindow.reset(); EVAF_INFO("%s destroyed", qPrintable(objectName())); } -bool SdiWindowPlugin::init(const QString & args) +bool SdiWindow::Internal::SdiWindowPlugin::init(const QString & args) { if (!mWindow->init(args)) return false; @@ -214,7 +355,7 @@ bool SdiWindowPlugin::init(const QString & args) return true; } -void SdiWindowPlugin::done() +void SdiWindow::Internal::SdiWindowPlugin::done() { mWindow->done();