Skip to content

(issue 165) remember size of main window and internal components #191

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/source/changes/version_0_32.rst.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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
^^^^^
Expand Down
3 changes: 2 additions & 1 deletion larray_editor/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,6 @@ def compare(*args, **kwargs):

absolute(array1 - array2) <= (atol + rtol * absolute(array2))


Examples
--------
>>> a1 = ndtest(3) # doctest: +SKIP
Expand All @@ -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()
Expand Down
5 changes: 5 additions & 0 deletions larray_editor/comparator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
41 changes: 38 additions & 3 deletions larray_editor/editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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)
Expand All @@ -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)

Expand Down Expand Up @@ -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 #
Expand Down