Skip to content

Commit 9d4f835

Browse files
committed
fix #165 : remember window and components size
1 parent 8452ae9 commit 9d4f835

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

doc/source/changes/version_0_32.rst.inc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ Miscellaneous improvements
88
* added keyword arguments ``rtol``, ``atol`` and ``nans_equal`` to the :py:obj:`compare()` function
99
(closes :editor_issue:`172`).
1010

11+
* Sizes of the main window and the resizable components are saved when closing the viewer and restored
12+
when the viewer is reopened (closes :editor_issue:`165`).
13+
1114

1215
Fixes
1316
^^^^^

larray_editor/comparator.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ def _setup_and_check(self, widget, data, title, readonly, **kwargs):
267267
main_splitter.addWidget(comparatorwidget)
268268
main_splitter.setSizes([5, 95])
269269
main_splitter.setCollapsible(1, False)
270+
self.widget_state_settings['main_splitter'] = main_splitter
270271

271272
layout.addWidget(main_splitter)
272273
self.listwidget.setCurrentRow(0)
@@ -277,3 +278,7 @@ def get_arrays(self, name):
277278
def on_item_changed(self, curr, prev):
278279
arrays = self.get_arrays(str(curr.text()))
279280
self.arraywidget.set_data(arrays, self.stack_axis)
281+
282+
def closeEvent(self, event):
283+
self.save_widgets_state_and_geometry()
284+
AbstractEditor.closeEvent(self, event)

larray_editor/editor.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from larray_editor.arraywidget import ArrayEditorWidget
1212
from larray_editor.commands import EditSessionArrayCommand, EditCurrentArrayCommand
1313

14-
from qtpy.QtCore import Qt, QUrl
14+
from qtpy.QtCore import Qt, QUrl, QSettings
1515
from qtpy.QtGui import QDesktopServices, QKeySequence
1616
from qtpy.QtWidgets import (QMainWindow, QWidget, QListWidget, QListWidgetItem, QSplitter, QFileDialog, QPushButton,
1717
QDialogButtonBox, QShortcut, QHBoxLayout, QVBoxLayout, QGridLayout, QLineEdit, QUndoStack,
@@ -74,6 +74,9 @@ def __init__(self, parent=None, editable=False, file_menu=False, help_menu=False
7474
if editable:
7575
self.edit_undo_stack = QUndoStack(self)
7676

77+
self.settings_group_name = self.name.lower().replace(' ', '_')
78+
self.widget_state_settings = {}
79+
7780
def setup_and_check(self, data, title='', readonly=False, caller_info=None, **kwargs):
7881
"""Return False if data is not supported, True otherwise"""
7982
# set icon
@@ -103,10 +106,12 @@ def setup_and_check(self, data, title='', readonly=False, caller_info=None, **kw
103106
# setup central widget
104107
self._setup_and_check(widget, data, title, readonly, **kwargs)
105108

106-
# resize
107-
self.resize(1000, 600)
109+
if not self.restore_widgets_state_and_geometry():
110+
# resize
111+
self.resize(1000, 600)
108112
# This is more or less the minimum space required to display a 1D array
109113
self.setMinimumSize(300, 180)
114+
110115
return True
111116

112117
def setup_menu_bar(self):
@@ -276,6 +281,31 @@ def get_value(self):
276281
# already been destroyed, due to the Qt.WA_DeleteOnClose attribute
277282
return self.data
278283

284+
def save_widgets_state_and_geometry(self):
285+
settings = QSettings()
286+
settings.beginGroup(self.settings_group_name)
287+
settings.setValue('geometry', self.saveGeometry())
288+
settings.setValue('state', self.saveState())
289+
for widget_name, widget in self.widget_state_settings.items():
290+
settings.setValue('state/{}'.format(widget_name), widget.saveState())
291+
settings.endGroup()
292+
293+
def restore_widgets_state_and_geometry(self):
294+
settings = QSettings()
295+
settings.beginGroup(self.settings_group_name)
296+
geometry = settings.value('geometry')
297+
if geometry:
298+
self.restoreGeometry(geometry)
299+
state = settings.value('state')
300+
if state:
301+
self.restoreState(state)
302+
for widget_name, widget in self.widget_state_settings.items():
303+
state = settings.value('state/{}'.format(widget_name))
304+
if state:
305+
widget.restoreState(state)
306+
settings.endGroup()
307+
return (geometry is not None) or (state is not None)
308+
279309
def _setup_and_check(self, widget, data, title, readonly, **kwargs):
280310
raise NotImplementedError()
281311

@@ -360,6 +390,7 @@ def void_formatter(array, *args, **kwargs):
360390
right_panel_widget.addWidget(self.arraywidget)
361391
right_panel_widget.addWidget(self.eval_box)
362392
right_panel_widget.setSizes([90, 10])
393+
self.widget_state_settings['right_panel_widget'] = right_panel_widget
363394
else:
364395
self.eval_box = QLineEdit()
365396
self.eval_box.returnPressed.connect(self.line_edit_update)
@@ -378,6 +409,7 @@ def void_formatter(array, *args, **kwargs):
378409
main_splitter.addWidget(right_panel_widget)
379410
main_splitter.setSizes([10, 90])
380411
main_splitter.setCollapsible(1, False)
412+
self.widget_state_settings['main_splitter'] = main_splitter
381413

382414
layout.addWidget(main_splitter)
383415

@@ -695,6 +727,9 @@ def closeEvent(self, event):
695727
event.accept()
696728
else:
697729
event.ignore()
730+
self.save_widgets_state_and_geometry()
731+
AbstractEditor.closeEvent(self, event)
732+
698733

699734
#########################################
700735
# FILE MENU #

0 commit comments

Comments
 (0)