Mercurial > octave
comparison libgui/src/main-window.cc @ 29147:5d7a651bf0bb stable
fix error when restoring previous main window layout (bug #59426)
* default-qt-settings.in: remove default settings for dock widgets
* gui-preferences-mw.h: remove default values for main window
geometry and state
* main-window.cc: (reset_windows): slot for resetting layout action
now calling the new member function do_reset_windows;
(set_window_layout): calling new member function do_reset_windows
when geometry or state are not yet available from the settings file,
set size to screen size if state was maximized, the settings pointer
now is always valid so no further checks are required;
(construct_central_widget): size for hidden central widget is fixed;
(construct): window layout and adding the dock widget is moved into
the new member function do_reset_windows;
(resize_dock): new member function resizing a docked widget either
by resizeDocks (since Qt 5.6) or by a not very reliable replacement;
(do_reset_windows): new member function setting the default size of
the main window, adding all widget, resize the terminal widget to the
default size, showing everything if the argument is true (default)
and storing size and state of main window
* main-window.h (do_reset_windows, resize_dock): new member functions
* octave-dock-widget.cc (make_widget): fix indentation;
* acinclude.m4: add test for QMainWindow::resizeDocks ()
author | Torsten Lilge <ttl-octave@mailbox.org> |
---|---|
date | Sun, 06 Dec 2020 13:53:30 +0100 |
parents | 7220b59c490b |
children | d9ac99164c18 0a5b15007766 |
comparison
equal
deleted
inserted
replaced
29145:1153f47f29a7 | 29147:5d7a651bf0bb |
---|---|
954 void main_window::go_to_previous_widget (void) | 954 void main_window::go_to_previous_widget (void) |
955 { | 955 { |
956 m_previous_dock->activate (); | 956 m_previous_dock->activate (); |
957 } | 957 } |
958 | 958 |
959 void main_window::reset_windows (void) | |
960 { | |
961 hide (); | |
962 set_window_layout (nullptr); // do not use the settings file | |
963 showNormal (); // make sure main window is not minimized | |
964 focus_command_window (); | |
965 } | |
966 | |
967 void main_window::update_octave_directory (const QString& dir) | 959 void main_window::update_octave_directory (const QString& dir) |
968 { | 960 { |
969 // Remove existing entry, if any, then add new directory at top and | 961 // Remove existing entry, if any, then add new directory at top and |
970 // mark it as the current directory. Finally, update the file list | 962 // mark it as the current directory. Finally, update the file list |
971 // widget. | 963 // widget. |
1472 } | 1464 } |
1473 | 1465 |
1474 void main_window::set_window_layout (gui_settings *settings) | 1466 void main_window::set_window_layout (gui_settings *settings) |
1475 { | 1467 { |
1476 // Restore main window state and geometry from settings file or, in case | 1468 // Restore main window state and geometry from settings file or, in case |
1477 // of an error, from the default layout. | 1469 // of an error (no pref values yet), from the default layout. |
1478 if (settings) | 1470 if (! restoreGeometry (settings->value (mw_geometry).toByteArray ())) |
1479 { | 1471 { |
1480 if (! restoreState (settings->value (mw_state).toByteArray ())) | 1472 do_reset_windows (true); |
1481 restoreState (mw_state.def.toByteArray ()); | 1473 return; |
1482 | 1474 } |
1483 if (! restoreGeometry (settings->value (mw_geometry).toByteArray ())) | 1475 |
1484 restoreGeometry (mw_geometry.def.toByteArray ()); | 1476 if (isMaximized()) |
1477 { | |
1478 setGeometry( QApplication::desktop ()->availableGeometry (this)); | |
1479 } | |
1480 | |
1481 if (! restoreState (settings->value (mw_state).toByteArray ())) | |
1482 { | |
1483 do_reset_windows (true); | |
1484 return; | |
1485 } | 1485 } |
1486 | 1486 |
1487 // Restore the geometry of all dock-widgets | 1487 // Restore the geometry of all dock-widgets |
1488 for (auto *widget : dock_widget_list ()) | 1488 for (auto *widget : dock_widget_list ()) |
1489 { | 1489 { |
1491 | 1491 |
1492 if (! name.isEmpty ()) | 1492 if (! name.isEmpty ()) |
1493 { | 1493 { |
1494 bool floating = false; | 1494 bool floating = false; |
1495 bool visible = true; | 1495 bool visible = true; |
1496 if (settings) | 1496 |
1497 { | 1497 floating = settings->value |
1498 floating = settings->value | 1498 (dw_is_floating.key.arg (name), dw_is_floating.def).toBool (); |
1499 (dw_is_floating.key.arg (name), dw_is_floating.def).toBool (); | 1499 visible = settings->value |
1500 visible = settings->value | 1500 (dw_is_visible.key.arg (name), dw_is_visible.def).toBool (); |
1501 (dw_is_visible.key.arg (name), dw_is_visible.def).toBool (); | |
1502 } | |
1503 | 1501 |
1504 // If floating, make window from widget. | 1502 // If floating, make window from widget. |
1505 if (floating) | 1503 if (floating) |
1506 { | 1504 { |
1507 widget->make_window (); | 1505 widget->make_window (); |
1508 | 1506 |
1509 if (visible) | 1507 if (visible) |
1510 { | 1508 { |
1511 if (settings | 1509 if (settings->value (dw_is_minimized.key.arg (name), |
1512 && settings->value (dw_is_minimized.key.arg (name), | 1510 dw_is_minimized.def).toBool ()) |
1513 dw_is_minimized.def).toBool ()) | |
1514 widget->showMinimized (); | 1511 widget->showMinimized (); |
1515 else | 1512 else |
1516 widget->setVisible (true); | 1513 widget->setVisible (true); |
1517 } | 1514 } |
1518 } | 1515 } |
1523 | 1520 |
1524 widget->make_widget (); | 1521 widget->make_widget (); |
1525 widget->setVisible (visible); // not floating -> show | 1522 widget->setVisible (visible); // not floating -> show |
1526 } | 1523 } |
1527 } | 1524 } |
1528 } | |
1529 | |
1530 if (! settings) | |
1531 { | |
1532 restoreGeometry (mw_geometry.def.toByteArray ()); | |
1533 restoreState (mw_state.def.toByteArray ()); | |
1534 | |
1535 set_default_geometry (); | |
1536 } | 1525 } |
1537 | 1526 |
1538 show (); | 1527 show (); |
1539 } | 1528 } |
1540 | 1529 |
1943 // destroying this main_window. | 1932 // destroying this main_window. |
1944 | 1933 |
1945 QWidget *dummyWidget = new QWidget (); | 1934 QWidget *dummyWidget = new QWidget (); |
1946 dummyWidget->setObjectName ("CentralDummyWidget"); | 1935 dummyWidget->setObjectName ("CentralDummyWidget"); |
1947 dummyWidget->resize (10, 10); | 1936 dummyWidget->resize (10, 10); |
1948 dummyWidget->setSizePolicy (QSizePolicy::Minimum, QSizePolicy::Minimum); | 1937 dummyWidget->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed); |
1949 dummyWidget->hide (); | 1938 dummyWidget->hide (); |
1950 setCentralWidget (dummyWidget); | 1939 setCentralWidget (dummyWidget); |
1951 } | 1940 } |
1952 | 1941 |
1953 // Main subroutine of the constructor | 1942 // Main subroutine of the constructor |
2052 // should be executed by the gui thread | 2041 // should be executed by the gui thread |
2053 | 2042 |
2054 connect (this, SIGNAL (warning_function_not_found_signal (const QString&)), | 2043 connect (this, SIGNAL (warning_function_not_found_signal (const QString&)), |
2055 this, SLOT (warning_function_not_found (const QString&))); | 2044 this, SLOT (warning_function_not_found (const QString&))); |
2056 | 2045 |
2057 // Build the window with widgets | |
2058 | |
2059 setWindowTitle ("Octave"); | 2046 setWindowTitle ("Octave"); |
2060 | |
2061 // See Octave bug #53409 and https://bugreports.qt.io/browse/QTBUG-55357 | |
2062 #if (QT_VERSION < 0x050601) || (QT_VERSION >= 0x050701) | |
2063 setDockOptions (QMainWindow::AnimatedDocks | |
2064 | QMainWindow::AllowNestedDocks | |
2065 | QMainWindow::AllowTabbedDocks); | |
2066 #else | |
2067 setDockNestingEnabled (true); | |
2068 #endif | |
2069 | |
2070 addDockWidget (Qt::RightDockWidgetArea, m_command_window); | |
2071 addDockWidget (Qt::RightDockWidgetArea, m_doc_browser_window); | |
2072 tabifyDockWidget (m_command_window, m_doc_browser_window); | |
2073 | |
2074 #if defined (HAVE_QSCINTILLA) | |
2075 addDockWidget (Qt::RightDockWidgetArea, m_editor_window); | |
2076 tabifyDockWidget (m_command_window, m_editor_window); | |
2077 #endif | |
2078 addDockWidget (Qt::RightDockWidgetArea, m_variable_editor_window); | |
2079 tabifyDockWidget (m_command_window, m_variable_editor_window); | |
2080 | |
2081 addDockWidget (Qt::LeftDockWidgetArea, m_file_browser_window); | |
2082 addDockWidget (Qt::LeftDockWidgetArea, m_workspace_window); | |
2083 addDockWidget (Qt::LeftDockWidgetArea, m_history_window); | |
2084 | |
2085 set_default_geometry (); | |
2086 | 2047 |
2087 setStatusBar (m_status_bar); | 2048 setStatusBar (m_status_bar); |
2088 | 2049 |
2089 #if defined (HAVE_QSCINTILLA) | 2050 #if defined (HAVE_QSCINTILLA) |
2090 connect (this, | 2051 connect (this, |
2818 | 2779 |
2819 F__mfile_encoding__ (interp, ovl (mfile_encoding)); | 2780 F__mfile_encoding__ (interp, ovl (mfile_encoding)); |
2820 }); | 2781 }); |
2821 } | 2782 } |
2822 | 2783 |
2784 // Get size of screen where the main window is located | |
2823 void main_window::get_screen_geometry (int *width, int *height) | 2785 void main_window::get_screen_geometry (int *width, int *height) |
2824 { | 2786 { |
2825 QRect screen_geometry | 2787 QRect screen_geometry |
2826 = QApplication::desktop ()->availableGeometry (this); | 2788 = QApplication::desktop ()->availableGeometry (this); |
2827 | 2789 |
2828 *width = screen_geometry.width (); | 2790 *width = screen_geometry.width (); |
2829 *height = screen_geometry.height (); | 2791 *height = screen_geometry.height (); |
2830 } | 2792 } |
2831 | 2793 |
2794 void main_window::resize_dock (QDockWidget *dw, int width, int height) | |
2795 { | |
2796 #if defined (HAVE_QMAINWINDOW_RESIZEDOCKS) | |
2797 // resizeDockWidget was added to Qt in Qt 5.6 | |
2798 if (width >= 0) | |
2799 resizeDocks ({dw},{width},Qt::Horizontal); | |
2800 if (height >= 0) | |
2801 resizeDocks ({dw},{height},Qt::Vertical); | |
2802 #else | |
2803 // This replacement of resizeDockWidget is not very reliable. | |
2804 // But even if Qt4 is not yet | |
2805 QSize s = dw->widget ()->size (); | |
2806 if (width >= 0) | |
2807 s.setWidth (width); | |
2808 if (height >= 0) | |
2809 s.setHeight (height); | |
2810 dw->widget ()->resize (s); | |
2811 dw->adjustSize (); | |
2812 #endif | |
2813 } | |
2814 | |
2815 // The default main window size relative to the desktop size | |
2832 void main_window::set_default_geometry () | 2816 void main_window::set_default_geometry () |
2833 { | 2817 { |
2834 int win_x, win_y; | 2818 int win_x, win_y; |
2835 get_screen_geometry (&win_x, &win_y); | 2819 get_screen_geometry (&win_x, &win_y); |
2836 | 2820 |
2837 move (0, 0); | 2821 move (0, 0); |
2838 resize (2*win_x/3, 7*win_y/8); | 2822 resize (2*win_x/3, 7*win_y/8); |
2839 } | 2823 } |
2840 | 2824 |
2825 void main_window::reset_windows (void) | |
2826 { | |
2827 // Slot for resetting the window layout to the default one | |
2828 hide (); | |
2829 showNormal (); // Unmaximize | |
2830 do_reset_windows (false); // Add all widgets | |
2831 // Re-add after giving time: This seems to be a reliable way to | |
2832 // reset the main window's layout | |
2833 QTimer::singleShot (250, this, SLOT (do_reset_windows (void))); | |
2834 } | |
2835 | |
2836 // Create the default layout of the main window. Do not use | |
2837 // restoreState () and restoreGeometry () with default values since | |
2838 // this might lead to problems when the Qt version changes | |
2839 void main_window::do_reset_windows (bool show_it) | |
2840 { | |
2841 // Set main window default geometry and store its width for | |
2842 // later resizing the command window | |
2843 set_default_geometry (); | |
2844 int win_x = geometry ().width (); | |
2845 | |
2846 // Resize command window, the important one in the default layout | |
2847 resize_dock (m_command_window, 7*win_x/8, -1); | |
2848 | |
2849 // See Octave bug #53409 and https://bugreports.qt.io/browse/QTBUG-55357 | |
2850 #if (QT_VERSION < 0x050601) || (QT_VERSION >= 0x050701) | |
2851 setDockOptions (QMainWindow::AnimatedDocks | |
2852 | QMainWindow::AllowNestedDocks | |
2853 | QMainWindow::AllowTabbedDocks); | |
2854 #else | |
2855 setDockNestingEnabled (true); | |
2856 #endif | |
2857 | |
2858 // Add the dock widgets and show them | |
2859 addDockWidget (Qt::LeftDockWidgetArea, m_file_browser_window); | |
2860 addDockWidget (Qt::LeftDockWidgetArea, m_workspace_window); | |
2861 addDockWidget (Qt::LeftDockWidgetArea, m_history_window); | |
2862 | |
2863 addDockWidget (Qt::RightDockWidgetArea, m_command_window); | |
2864 | |
2865 addDockWidget (Qt::RightDockWidgetArea, m_doc_browser_window); | |
2866 tabifyDockWidget (m_command_window, m_doc_browser_window); | |
2867 | |
2868 addDockWidget (Qt::RightDockWidgetArea, m_variable_editor_window); | |
2869 tabifyDockWidget (m_command_window, m_variable_editor_window); | |
2870 | |
2871 #if defined (HAVE_QSCINTILLA) | |
2872 addDockWidget (Qt::RightDockWidgetArea, m_editor_window); | |
2873 tabifyDockWidget (m_command_window, m_editor_window); | |
2874 #endif | |
2875 | |
2876 // Resize command window, the important one in the default layout | |
2877 resize_dock (m_command_window, 2*win_x/3, -1); | |
2878 | |
2879 // Show main wibdow, save state and geometry of main window and | |
2880 // all dock widgets | |
2881 if (show_it) | |
2882 { | |
2883 // Show all dock widgets | |
2884 for (auto *widget : dock_widget_list ()) | |
2885 widget->show (); | |
2886 | |
2887 // Show main window and store size and state | |
2888 showNormal (); | |
2889 | |
2890 resource_manager& rmgr = m_octave_qobj.get_resource_manager (); | |
2891 gui_settings *settings = rmgr.get_settings (); | |
2892 | |
2893 settings->setValue (mw_geometry.key, saveGeometry ()); | |
2894 settings->setValue (mw_state.key, saveState ()); | |
2895 | |
2896 focus_command_window (); | |
2897 } | |
2898 } | |
2841 } | 2899 } |