diff --git a/doc/source/changes/version_0_32.rst.inc b/doc/source/changes/version_0_32.rst.inc index 67b94b2..d6564e7 100644 --- a/doc/source/changes/version_0_32.rst.inc +++ b/doc/source/changes/version_0_32.rst.inc @@ -8,6 +8,9 @@ Miscellaneous improvements * added keyword arguments ``rtol``, ``atol`` and ``nans_equal`` to the :py:obj:`compare()` function (closes :editor_issue:`172`). +* Sizes of the main window and the resizable components are saved when closing the viewer and restored + when the viewer is reopened (closes :editor_issue:`165`). + Fixes ^^^^^ diff --git a/larray_editor/api.py b/larray_editor/api.py index f114da3..15b1c14 100644 --- a/larray_editor/api.py +++ b/larray_editor/api.py @@ -216,7 +216,6 @@ def compare(*args, **kwargs): absolute(array1 - array2) <= (atol + rtol * absolute(array2)) - Examples -------- >>> a1 = ndtest(3) # doctest: +SKIP @@ -234,6 +233,8 @@ def compare(*args, **kwargs): _app = QApplication.instance() if _app is None: _app = qapplication() + _app.setOrganizationName("LArray") + _app.setApplicationName("Viewer") parent = None else: parent = _app.activeWindow() diff --git a/larray_editor/comparator.py b/larray_editor/comparator.py index 99e11d8..2538eff 100644 --- a/larray_editor/comparator.py +++ b/larray_editor/comparator.py @@ -267,6 +267,7 @@ def _setup_and_check(self, widget, data, title, readonly, **kwargs): main_splitter.addWidget(comparatorwidget) main_splitter.setSizes([5, 95]) main_splitter.setCollapsible(1, False) + self.widget_state_settings['main_splitter'] = main_splitter layout.addWidget(main_splitter) self.listwidget.setCurrentRow(0) @@ -277,3 +278,7 @@ def get_arrays(self, name): def on_item_changed(self, curr, prev): arrays = self.get_arrays(str(curr.text())) self.arraywidget.set_data(arrays, self.stack_axis) + + def closeEvent(self, event): + self.save_widgets_state_and_geometry() + AbstractEditor.closeEvent(self, event) diff --git a/larray_editor/editor.py b/larray_editor/editor.py index ed897ba..26a71bd 100644 --- a/larray_editor/editor.py +++ b/larray_editor/editor.py @@ -11,7 +11,7 @@ from larray_editor.arraywidget import ArrayEditorWidget from larray_editor.commands import EditSessionArrayCommand, EditCurrentArrayCommand -from qtpy.QtCore import Qt, QUrl +from qtpy.QtCore import Qt, QUrl, QSettings from qtpy.QtGui import QDesktopServices, QKeySequence from qtpy.QtWidgets import (QMainWindow, QWidget, QListWidget, QListWidgetItem, QSplitter, QFileDialog, QPushButton, QDialogButtonBox, QShortcut, QHBoxLayout, QVBoxLayout, QGridLayout, QLineEdit, QUndoStack, @@ -74,6 +74,9 @@ def __init__(self, parent=None, editable=False, file_menu=False, help_menu=False if editable: self.edit_undo_stack = QUndoStack(self) + self.settings_group_name = self.name.lower().replace(' ', '_') + self.widget_state_settings = {} + def setup_and_check(self, data, title='', readonly=False, caller_info=None, **kwargs): """Return False if data is not supported, True otherwise""" # set icon @@ -103,10 +106,12 @@ def setup_and_check(self, data, title='', readonly=False, caller_info=None, **kw # setup central widget self._setup_and_check(widget, data, title, readonly, **kwargs) - # resize - self.resize(1000, 600) + if not self.restore_widgets_state_and_geometry(): + # resize + self.resize(1000, 600) # This is more or less the minimum space required to display a 1D array self.setMinimumSize(300, 180) + return True def setup_menu_bar(self): @@ -276,6 +281,31 @@ def get_value(self): # already been destroyed, due to the Qt.WA_DeleteOnClose attribute return self.data + def save_widgets_state_and_geometry(self): + settings = QSettings() + settings.beginGroup(self.settings_group_name) + settings.setValue('geometry', self.saveGeometry()) + settings.setValue('state', self.saveState()) + for widget_name, widget in self.widget_state_settings.items(): + settings.setValue('state/{}'.format(widget_name), widget.saveState()) + settings.endGroup() + + def restore_widgets_state_and_geometry(self): + settings = QSettings() + settings.beginGroup(self.settings_group_name) + geometry = settings.value('geometry') + if geometry: + self.restoreGeometry(geometry) + state = settings.value('state') + if state: + self.restoreState(state) + for widget_name, widget in self.widget_state_settings.items(): + state = settings.value('state/{}'.format(widget_name)) + if state: + widget.restoreState(state) + settings.endGroup() + return (geometry is not None) or (state is not None) + def _setup_and_check(self, widget, data, title, readonly, **kwargs): raise NotImplementedError() @@ -360,6 +390,7 @@ def void_formatter(array, *args, **kwargs): right_panel_widget.addWidget(self.arraywidget) right_panel_widget.addWidget(self.eval_box) right_panel_widget.setSizes([90, 10]) + self.widget_state_settings['right_panel_widget'] = right_panel_widget else: self.eval_box = QLineEdit() self.eval_box.returnPressed.connect(self.line_edit_update) @@ -378,6 +409,7 @@ def void_formatter(array, *args, **kwargs): main_splitter.addWidget(right_panel_widget) main_splitter.setSizes([10, 90]) main_splitter.setCollapsible(1, False) + self.widget_state_settings['main_splitter'] = main_splitter layout.addWidget(main_splitter) @@ -695,6 +727,9 @@ def closeEvent(self, event): event.accept() else: event.ignore() + self.save_widgets_state_and_geometry() + AbstractEditor.closeEvent(self, event) + ######################################### # FILE MENU #