# HG changeset patch # User Torsten # Date 1384151539 -3600 # Node ID 14c427b5c5c1115272cb8f9ee16084347e0697aa # Parent 8c33abdd2f9a7dafab4745a4587f5c4b4ddf4069 Restore geometry of floating widgets after restart in windows (bug #40485) * main-window.cc(set_window_layout): non-window systems: restore geometry of all non-floating widgets, make widgets floating after restoring main window * octave_dock_widget.h: new class variable for floating state * octave_dock_widget.cc(constructor): initialize floating to false; (destructor): use this new state variable for saving settings; (make_window): store last docked geometry, set last floating geometry with setGeometry instead of restoreGeometry, set floating state true; (make_widget): save last geometry with geometry only, restore last docked geometry, set floating state false; (change_floating): determine necessary action from floating state; diff -r 8c33abdd2f9a -r 14c427b5c5c1 libgui/src/main-window.cc --- a/libgui/src/main-window.cc Mon Nov 11 01:49:57 2013 -0500 +++ b/libgui/src/main-window.cc Mon Nov 11 07:32:19 2013 +0100 @@ -665,21 +665,23 @@ if (! name.isEmpty ()) { - // If floating, make window from widget. bool floating = settings->value ("DockWidgets/" + name + "Floating", false).toBool (); + bool visible = settings->value + ("DockWidgets/" + name + "Visible", true).toBool (); + +#if defined (Q_OS_WIN32) + // If floating, make window from widget. if (floating) widget->make_window (); else if (! widget->parent ()) // should not be floating but is widget->make_widget (false); // no docking, just reparent - +#else // restore geometry QVariant val = settings->value ("DockWidgets/" + name); widget->restoreGeometry (val.toByteArray ()); - +#endif // make widget visible if desired - bool visible = settings->value - ("DockWidgets/" + name + "Visible", true).toBool (); if (floating && visible) // floating and visible float_and_visible.append (widget); // not show before main win else @@ -696,7 +698,12 @@ // show floating widgets after main win to ensure "Octave" in central menu foreach (octave_dock_widget *widget, float_and_visible) - widget->setVisible (true); + { +#if not defined (Q_OS_WIN32) + widget->make_window (); +#endif + widget->setVisible (true); + } } diff -r 8c33abdd2f9a -r 14c427b5c5c1 libgui/src/octave-dock-widget.cc --- a/libgui/src/octave-dock-widget.cc Mon Nov 11 01:49:57 2013 -0500 +++ b/libgui/src/octave-dock-widget.cc Mon Nov 11 07:32:19 2013 +0100 @@ -38,6 +38,7 @@ { _parent = static_cast (p); // store main window + _floating = false; connect (this, SIGNAL (visibilityChanged (bool)), this, SLOT (handle_visibility_changed (bool))); @@ -104,25 +105,20 @@ octave_dock_widget::~octave_dock_widget () { // save state of this dock-widget - bool floating = false; - bool visible; QString name = objectName (); QSettings *settings = resource_manager::get_settings (); settings->beginGroup ("DockWidgets"); - if (!parent ()) - { - // widget is floating (windows), save actual floating geometry - floating = true; - settings->setValue (name+"_floating_geometry", saveGeometry ()); - } - else // not floating save docked (normal) geometry +#if defined (Q_OS_WIN32) + if (_floating) // widget is floating (windows), save actual floating geometry + settings->setValue (name+"_floating_geometry", geometry ()); + else // not floating save docked (normal) geometry +#endif settings->setValue (name, saveGeometry ()); - visible = isVisible (); - settings->setValue (name+"Floating", floating); // store floating state - settings->setValue (name+"Visible", visible); // store visibility + settings->setValue (name+"Visible", isVisible ()); // store visibility + settings->setValue (name+"Floating", _floating); // store visibility settings->endGroup (); settings->sync (); @@ -161,10 +157,11 @@ QSettings *settings = resource_manager::get_settings (); - // save the docking area for later redocking + // save the docking area and geometry for later redocking // FIXME: dockWidgetArea always returns 2 settings->setValue ("DockWidgets/" + objectName () + "_dock_area", _parent->dockWidgetArea (this)); + settings->setValue ("DockWidgets/" + objectName (), saveGeometry ()); settings->sync (); // remove parent and adjust the (un)dock icon @@ -172,9 +169,9 @@ _dock_action->setIcon (QIcon (":/actions/icons/widget-dock.png")); _dock_action->setToolTip (tr ("Dock widget")); - // restore the last geometry when floating - restoreGeometry (settings->value ("DockWidgets/" + objectName () - + "_floating_geometry").toByteArray ()); + // restore the last geometry( when floating + setGeometry (settings->value ("DockWidgets/" + objectName () + + "_floating_geometry",QRect(50,100,480,480)).toRect ()); #else @@ -183,6 +180,7 @@ #endif + _floating = true; } // dock the widget @@ -195,9 +193,10 @@ QSettings *settings = resource_manager::get_settings (); - // save last floating geometry - settings->setValue ("DockWidgets/" + objectName () + "_floating_geometry", - saveGeometry ()); + // save last floating geometry if widget really was floating + if (_floating) + settings->setValue ("DockWidgets/" + objectName () + "_floating_geometry", + geometry ()); settings->sync (); if (dock) @@ -209,8 +208,8 @@ // FIXME: restoreGeometry is ignored for docked widgets // and its child widget - // restoreGeometry (settings->value - // ("DockWidgets/" + objectName ()).toByteArray ()); + restoreGeometry (settings->value + ("DockWidgets/" + objectName ()).toByteArray ()); } else // only reparent, no docking setParent (_parent); @@ -225,23 +224,21 @@ setWindowFlags (Qt::Widget); #endif + + _floating = false; } // slot for (un)dock action void -octave_dock_widget::change_floating (bool floating) +octave_dock_widget::change_floating (bool) { -#if defined (Q_OS_WIN32) - if (parent ()) -#else - if (floating) -#endif + if (_floating) + make_widget (); + else { make_window (); focus (); } - else - make_widget (); } // slot for hiding the widget diff -r 8c33abdd2f9a -r 14c427b5c5c1 libgui/src/octave-dock-widget.h --- a/libgui/src/octave-dock-widget.h Mon Nov 11 01:49:57 2013 -0500 +++ b/libgui/src/octave-dock-widget.h Mon Nov 11 07:32:19 2013 +0100 @@ -109,6 +109,7 @@ QMainWindow *_parent; // store the parent since we are reparenting to 0 QAction *_dock_action; + bool _floating; };