#include <Common/iLogger>
#include <Common/iRegistry>
#include <Common/iApp>
+#include <Common/iProp>
#include <QtGui>
+#include <QXmlStreamReader>
namespace eVaf {
namespace SdiWindow {
//-------------------------------------------------------------------
-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)
+ , mTimerId(0)
{
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
EVAF_INFO("%s created", qPrintable(objectName()));
}
-MainWindow::~MainWindow()
+SdiWindow::Internal::MainWindow::~MainWindow()
{
mSdiWindow = 0;
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);
setWindowTitle(Common::iApp::instance()->name());
+ // Start the garbage collector timer
+ mTimerId = startTimer(60 * 1000);
+
show();
mReady = true;
return true;
}
-void MainWindow::done()
+void SdiWindow::Internal::MainWindow::done()
{
mReady = false;
close();
- // Delete the window
- if (mWindow)
- delete mWindow.data();
+ 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();
+ }
+ mPanels.clear();
+ mMinimizedPanels.clear();
+ mPanelNames.clear();
+ mMainPanel.clear();
+ 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)
+{
+ 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);
+ }
+ }
+}
+
+Gui::Panel * SdiWindow::Internal::MainWindow::panel(QString const & name) const
+{
+ QHash<QString, QWeakPointer<Gui::Panel> >::const_iterator it = mPanelNames.constFind(name);
+ if (it != mPanelNames.constEnd())
+ return it.value().data();
+ return 0;
+}
+
+bool SdiWindow::Internal::MainWindow::showPanel(QString const & name)
{
- // Delete the existing window
- if (mWindow)
- delete mWindow.data();
- mLayout->addWidget(window);
- mWindow = window;
+ Gui::Panel * p = panel(name);
+ if (p) {
+ p->show();
+ return true;
+ }
+ return false;
}
-void MainWindow::saveSettings()
+void SdiWindow::Internal::MainWindow::saveSettings()
{
static int ver[4] = {VER_FILE_VERSION};
QSettings settings(VER_COMPANY_NAME_STR, Common::iApp::instance()->name());
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());
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();
}
}
+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;
+ }
+ }
+ }
+
+ QWidget::closeEvent(e);
+}
+
+void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e)
+{
+ if (e->type() == QEvent::WindowStateChange) {
+ QWindowStateChangeEvent * wse = static_cast<QWindowStateChangeEvent *>(e);
+
+ 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();
+ }
+ mMinimizedPanels.clear();
+ }
+
+ else if (windowState() == Qt::WindowMinimized && wse->oldState() != Qt::WindowMinimized) {
+
+ // 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()) {
+ mMinimizedPanels.append(p);
+ p.data()->showMinimized();
+ }
+ }
+ }
+ }
+ QWidget::changeEvent(e);
+}
+
+void SdiWindow::Internal::MainWindow::timerEvent(QTimerEvent * e)
+{
+ if (e->timerId() == mTimerId) {
+
+ // Remove panels that are deleted
+ {
+ 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;
+ }
+ }
+
+ // 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;
+ }
+ }
+ }
+ else
+ QWidget::timerEvent(e);
+}
+
//-------------------------------------------------------------------
-SdiWindowPlugin::SdiWindowPlugin()
+SdiWindow::Internal::SdiWindowPlugin::SdiWindowPlugin()
: Plugins::iPlugin()
{
setObjectName(VER_MODULE_NAME_STR);
EVAF_INFO("%s created", qPrintable(objectName()));
}
-SdiWindowPlugin::~SdiWindowPlugin()
+SdiWindow::Internal::SdiWindowPlugin::~SdiWindowPlugin()
{
delete mWindow;
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;
return true;
}
-void SdiWindowPlugin::done()
+void SdiWindow::Internal::SdiWindowPlugin::done()
{
mWindow->done();
#include "isdiwindow.h"
#include <Plugins/iPlugin>
-#include <Gui/Window>
+#include <Gui/Panel>
#include <QObject>
#include <QString>
#include <QWidget>
#include <QList>
+#include <QVector>
+#include <QHash>
#include <QWeakPointer>
class QVBoxLayout;
virtual bool isReady() { return mReady; }
- virtual void addWindow(Gui::Window * window);
+ virtual void addPanel(QString const & name, Gui::Panel * panel);
+
+ virtual Gui::Panel * panel(QString const & name) const;
+
+ virtual bool showPanel(QString const & name);
+
+ virtual void changeEvent(QEvent * e);
+
+ virtual void closeEvent(QCloseEvent * e);
+
+
+protected: // Methods
+
+ /// Garbage collector timer
+ virtual void timerEvent(QTimerEvent * e);
private: // Methods
/// The layout of the main window
QVBoxLayout * mLayout;
- /// eVaf GUI window implementing the main window
- QWeakPointer<Gui::Window> mWindow;
+ /// Name of the main panel that becomes part of this window
+ QString mMainPanelName;
+
+ /// List of GUI::Panel objects added to the manager
+ QList<QWeakPointer<Gui::Panel> > mPanels;
+
+ /// List of minimized GUI::Panel objects
+ QVector<QWeakPointer<Gui::Panel> > mMinimizedPanels;
+
+ /// Hash with panel names
+ QHash<QString, QWeakPointer<Gui::Panel> > mPanelNames;
+
+ /// Current main panel added to this window
+ QWeakPointer<Gui::Panel> mMainPanel;
+
+ /// Garbage collector timer ID
+ int mTimerId;
+
+
+private: // Methods
+
+ /// Gets the main panel name from module attributes
+ QString getMainPanelName(QString const & args) const;
};