# HG changeset patch # User Torsten # Date 1427298612 -3600 # Node ID 643de08e524cd8c684ab7cc2491c9a0c697d46a6 # Parent 9a8be23d2c0556011b09fc1ce217f06a715c2ebd save and restore previously active widget in a tabbed stack (bug #42980) * main-window.cc (focus_changed): store previous widget as predecessor if new widget is tabbed togehter with the previous one; * octave-dock-widget.cc (octave_dock_widget): initialize predecessor to 0; (set_predecessor_widget): new oublic method for setting the predecessor; (set_focus_predecessor): if predecessor is defined which means that this wigdet was tabbed with predecessor, set focus to predecessor; (make_window): call set_focus_predecessor; (closeEvent): moved here from header file, call set_focus_predecessor * octave-dock-widget.h: new public function set_predecessor_widget, closeEvent moved to octave_dock_widget.cc, new private function set_focus_predecessor (), new variable _predecessor_widget holding the previously active widget in the tabbed stack diff -r 9a8be23d2c05 -r 643de08e524c libgui/src/main-window.cc --- a/libgui/src/main-window.cc Tue Mar 24 21:07:51 2015 +0100 +++ b/libgui/src/main-window.cc Wed Mar 25 16:50:12 2015 +0100 @@ -204,6 +204,10 @@ // signal to all dock widgets for updating the style emit active_dock_changed (_active_dock, dock); + QList tabbed = tabifiedDockWidgets (dock); + if (tabbed.contains (_active_dock)) + dock->set_predecessor_widget (_active_dock); + if (edit_dock_widget == dock) emit editor_focus_changed (true); else if (edit_dock_widget == _active_dock) diff -r 9a8be23d2c05 -r 643de08e524c libgui/src/octave-dock-widget.cc --- a/libgui/src/octave-dock-widget.cc Tue Mar 24 21:07:51 2015 +0100 +++ b/libgui/src/octave-dock-widget.cc Wed Mar 25 16:50:12 2015 +0100 @@ -43,6 +43,7 @@ _parent = static_cast (p); // store main window _floating = false; + _predecessor_widget = 0; connect (this, SIGNAL (visibilityChanged (bool)), this, SLOT (handle_visibility_changed (bool))); @@ -155,6 +156,13 @@ } +// set the widget which previously had focus when tabified +void +octave_dock_widget::set_predecessor_widget (octave_dock_widget *prev_widget) +{ + _predecessor_widget = prev_widget; +} + // set the title in the dockwidgets title bar void octave_dock_widget::set_title (const QString& title) @@ -169,6 +177,16 @@ setWindowTitle (title); } +// set focus to previously active widget in tabbed widget stack +void +octave_dock_widget::set_focus_predecessor () +{ + if (_predecessor_widget) // only != 0 if widget was tabbed + _predecessor_widget->focus (); + + _predecessor_widget = 0; +} + // make the widget floating void octave_dock_widget::make_window () @@ -207,8 +225,11 @@ #endif _floating = true; + + set_focus_predecessor (); // set focus previously active widget if tabbed } + // dock the widget void octave_dock_widget::make_widget (bool dock) @@ -455,3 +476,13 @@ update (); } } + + +// close event +void +octave_dock_widget::closeEvent (QCloseEvent *e) +{ + emit active_changed (false); + set_focus_predecessor (); + QDockWidget::closeEvent (e); +} diff -r 9a8be23d2c05 -r 643de08e524c libgui/src/octave-dock-widget.h --- a/libgui/src/octave-dock-widget.h Tue Mar 24 21:07:51 2015 +0100 +++ b/libgui/src/octave-dock-widget.h Wed Mar 25 16:50:12 2015 +0100 @@ -43,7 +43,7 @@ void make_window (void); void make_widget (bool dock=true); void set_title (const QString&); - + void set_predecessor_widget (octave_dock_widget *prev_widget); signals: /** Custom signal that tells whether a user has clicked away @@ -53,11 +53,7 @@ protected: - virtual void closeEvent (QCloseEvent *e) - { - emit active_changed (false); - QDockWidget::closeEvent (e); - } + virtual void closeEvent (QCloseEvent *e); QWidget * focusWidget (); @@ -114,6 +110,7 @@ private: void set_style (bool active); + void set_focus_predecessor (); QMainWindow *_parent; // store the parent since we are reparenting to 0 bool _floating; @@ -126,6 +123,7 @@ QColor _fg_color_active; QString _icon_color; QString _icon_color_active; + octave_dock_widget *_predecessor_widget; #if defined (Q_OS_WIN32) QWidget *_title_widget;