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 }