Attached Files | Archive.zip [^] (3,412 bytes) 2008-06-20 17:36
pqsettings.cxx.diff [^] (6,510 bytes) 2009-03-04 10:31 [Show Content] [Hide Content]Index: Qt/Core/pqSettings.cxx
===================================================================
RCS file: /cvsroot/ParaView3/ParaView3/Qt/Core/pqSettings.cxx,v
retrieving revision 1.8
diff -u -r1.8 pqSettings.cxx
--- Qt/Core/pqSettings.cxx 7 Nov 2008 17:32:14 -0000 1.8
+++ Qt/Core/pqSettings.cxx 4 Mar 2009 15:31:34 -0000
@@ -7,7 +7,7 @@
All rights reserved.
ParaView is a free software; you can redistribute it and/or modify it
- under the terms of the ParaView license version 1.2.
+ under the terms of the ParaView license version 1.2.
See License_v1.2.txt for the full ParaView license.
A copy of this license can be obtained by contacting
@@ -34,13 +34,14 @@
#include <QDialog>
#include <QMainWindow>
#include <QDesktopWidget>
+#include <QDockWidget>
//-----------------------------------------------------------------------------
pqSettings::pqSettings(
- const QString& organization,
+ const QString& organization,
const QString& application,
QObject* p) :
- QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application, p)
+QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application, p)
{
}
@@ -69,17 +70,17 @@
void pqSettings::restoreState(const QString& key, QMainWindow& window)
{
this->beginGroup(key);
-
+
if(this->contains("Size"))
{
window.resize(this->value("Size").toSize());
}
-
+
if(this->contains("Position"))
{
QPoint windowTopLeft = this->value("Position").toPoint();
QRect mwRect(windowTopLeft, window.size());
-
+
QDesktopWidget desktop;
QRect desktopRect = desktop.availableGeometry( desktop.primaryScreen() );
// try moving it to keep size
@@ -99,20 +100,29 @@
if(this->contains("Layout"))
{
window.restoreState(this->value("Layout").toByteArray());
- }
-
+
+ QList<QDockWidget*> dockWidgets = window.findChildren<QDockWidget*>();
+ foreach(QDockWidget* dock_widget, dockWidgets)
+ {
+ if (dock_widget->isFloating() == true )
+ {
+ sanityCheckDock(dock_widget);
+ }
+ }
+ }
+
this->endGroup();
}
void pqSettings::restoreState(const QString& key, QDialog& dialog)
{
this->beginGroup(key);
-
+
if(this->contains("Size"))
{
dialog.resize(this->value("Size").toSize());
}
-
+
if(this->contains("Position"))
{
dialog.move(this->value("Position").toPoint());
@@ -120,3 +130,111 @@
this->endGroup();
}
+
+void pqSettings::sanityCheckDock(QDockWidget* dock_widget)
+{
+ QDesktopWidget desktop;
+ int screen = -1;
+ if (NULL == dock_widget)
+ {
+ return;
+ }
+
+ QPoint dockTopLeft = dock_widget->pos();
+ QRect dockRect(dockTopLeft, dock_widget->size());
+
+ QRect geometry = QRect(dockTopLeft, dock_widget->frameSize());
+ int titleBarHeight = geometry.height() - dockRect.height();
+
+ screen = desktop.screenNumber(dock_widget);
+ if (screen == -1) // Dock is at least partially on a screen
+ {
+ screen = desktop.screenNumber(dockTopLeft);
+ }
+
+ QRect screenRect = desktop.availableGeometry(screen);
+ QRect desktopRect = desktop.availableGeometry(); // SHould give us the entire Desktop geometry
+ // Ensure the top left corner of the window is on the screen
+ if (!screenRect.contains(dockTopLeft))
+ {
+ // Are we High?
+ if (dockTopLeft.y() < screenRect.y()) {
+ dock_widget->move(dockRect.x(), screenRect.y());
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+ // Are we low
+ if (dockTopLeft.y() > screenRect.y() + screenRect.height()) {
+ dock_widget->move(dockRect.x(), screenRect.y() + screenRect.height() - 20);
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+ // Are we left
+ if (dockTopLeft.x() < screenRect.x()) {
+ dock_widget->move(screenRect.x(), dockRect.y());
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+ // Are we right
+ if (dockTopLeft.x() > screenRect.x() + screenRect.width()) {
+ dock_widget->move(screenRect.x() + screenRect.width() - dockRect.width(), dockRect.y());
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+
+ if ( !desktopRect.contains(dockRect))
+ {
+ //Are we too wide
+ if (dockRect.x() + dockRect.width() > screenRect.x() + screenRect.width())
+ {
+ if (screenRect.x() + screenRect.width() - dockRect.width() > screenRect.x() )
+ {
+ // Move dock side to side
+ dockRect.setX(screenRect.x() + screenRect.width() - dockRect.width() );
+ dock_widget->move(dockRect.x(), dockRect.y());
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+ else
+ {
+ // Move dock side to side + resize to fit
+ dockRect.setX(screenRect.x() + screenRect.width() - dockRect.width() );
+ dockRect.setWidth(screenRect.width());
+ dock_widget->resize(dockRect.width(), dockRect.height());
+ dock_widget->move(dockRect.x(), dockRect.y());
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+ }
+
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ // Are we too Tall
+ if (dockRect.y() + dockRect.height() > screenRect.y() + screenRect.height())
+ {
+ // See if we can move it more on screen so that the entire dock is on screen
+ if (screenRect.y() + screenRect.height() - dockRect.height() > screenRect.y() )
+ {
+ // Move dock up
+ dockRect.setY(screenRect.y() + screenRect.height() - dockRect.height() );
+ dock_widget->move(dockRect.x(), dockRect.y());
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+ else
+ {
+ // Move dock up + resize to fit
+ dock_widget->resize(dockRect.width(), screenRect.height() - titleBarHeight);
+ dock_widget->move(dockRect.x(), screenRect.y());
+ dockTopLeft = dock_widget->pos();
+ dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+ }
+ }
+ }
+
+}
+
pqsettings.h.diff [^] (1,369 bytes) 2009-03-04 10:35 [Show Content] [Hide Content]Index: Qt/Core/pqSettings.h
===================================================================
RCS file: /cvsroot/ParaView3/ParaView3/Qt/Core/pqSettings.h,v
retrieving revision 1.6
diff -u -r1.6 pqSettings.h
--- Qt/Core/pqSettings.h 7 Nov 2008 17:32:14 -0000 1.6
+++ Qt/Core/pqSettings.h 4 Mar 2009 15:35:21 -0000
@@ -7,7 +7,7 @@
All rights reserved.
ParaView is a free software; you can redistribute it and/or modify it
- under the terms of the ParaView license version 1.2.
+ under the terms of the ParaView license version 1.2.
See License_v1.2.txt for the full ParaView license.
A copy of this license can be obtained by contacting
@@ -42,6 +42,7 @@
class QDialog;
class QMainWindow;
+class QDockWidget;
class PQCORE_EXPORT pqSettings :
public QSettings
@@ -53,18 +54,20 @@
const QString& organization,
const QString& application,
QObject* p);
-
+
void saveState(const QMainWindow& window, const QString& key);
void saveState(const QDialog& dialog, const QString& key);
-
+
void restoreState(const QString& key, QMainWindow& window);
void restoreState(const QString& key, QDialog& dialog);
+ void sanityCheckDock(QDockWidget* dock_widget);
/// Calling this method will cause the modified signal to be emited.
void alertSettingsModified();
signals:
void modified();
+
};
#endif
|