From 906dd7697baedee61f9cc7bc6971a53eb49945c7 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 19 Oct 2023 16:43:27 +0100 Subject: [PATCH 01/29] Add functionality of default saving in a new example --- eqt/ui/FormDialog.py | 15 +++- examples/dialog_example_3_save_default.py | 86 +++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 examples/dialog_example_3_save_default.py diff --git a/eqt/ui/FormDialog.py b/eqt/ui/FormDialog.py index 510ff59..a77beba 100644 --- a/eqt/ui/FormDialog.py +++ b/eqt/ui/FormDialog.py @@ -23,8 +23,11 @@ def __init__(self, parent=None, title=None): self.setWindowTitle(title) # add button box to the UI self.formWidget.uiElements['verticalLayout'].addWidget(bb) + bb.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self._onOk) bb.button(QtWidgets.QDialogButtonBox.Cancel).clicked.connect(self._onCancel) + + @property def Ok(self): '''returns a reference to the Dialog Ok button to connect its signals''' @@ -35,11 +38,21 @@ def Cancel(self): '''returns a reference to the Dialog Cancel button to connect its signals''' return self.buttonBox.button(QtWidgets.QDialogButtonBox.Cancel) + def _onOk(self): + '''calls `onOk`''' + print("I am _onOk") + self.onOk() + def _onCancel(self): - '''calls onCancel and closes the FormDialog''' + '''calls onCancel and closes the FormDialog''' self.onCancel() self.close() + def onOk(self): + '''Called when the dialog's "Ok" button is clicked. + Can be redefined to add additional functionality on "Ok"''' + pass + def onCancel(self): '''Called when the dialog's "Cancel" button is clicked. Can be redefined to add additional functionality on "Cancel"''' diff --git a/examples/dialog_example_3_save_default.py b/examples/dialog_example_3_save_default.py new file mode 100644 index 0000000..da48f30 --- /dev/null +++ b/examples/dialog_example_3_save_default.py @@ -0,0 +1,86 @@ +import sys + +from PySide2 import QtWidgets + +from eqt.ui import FormDialog + + +class MainUI(QtWidgets.QMainWindow): + def __init__(self, parent=None): + QtWidgets.QMainWindow.__init__(self, parent) + + pb = QtWidgets.QPushButton(self) + pb.setText("Open Dialog with form layout") + + pb.clicked.connect(lambda: self.executedialog()) + + layout = QtWidgets.QHBoxLayout() + layout.addWidget(pb) + widg = QtWidgets.QWidget() + widg.setLayout(layout) + + self.setCentralWidget(widg) + self.dialog = FormDialog(parent=self, title='Example') + + self.openFormDialog() + self.show() + + def openFormDialog(self): + # Example on how to add elements to the FormDialog + # add input 1 as QLineEdit + qlabel = QtWidgets.QLabel(self.dialog.groupBox) + qlabel.setText("Input 1: ") + qwidget = QtWidgets.QLineEdit(self.dialog.groupBox) + qwidget.setClearButtonEnabled(True) + # finally add to the form widget + self.dialog.addSpanningWidget(QtWidgets.QLabel("Input Values: "), 'input_title') + self.dialog.addWidget(qwidget, qlabel, 'input1') + + # add input 2 as QComboBox + qlabel = QtWidgets.QLabel(self.dialog.groupBox) + qlabel.setText("Input 2: ") + qwidget = QtWidgets.QComboBox(self.dialog.groupBox) + qwidget.addItem("option 1") + qwidget.addItem("option 2") + qwidget.setCurrentIndex(0) + qwidget.setEnabled(True) + # finally add to the form widget + self.dialog.addWidget(qwidget, qlabel, 'input2') + self.dialog.addWidget(QtWidgets.QLabel("Example Vertical Layout Text"), layout="vertical") + + # Example of using 'getWidget': + self.dialog.getWidget('input2').setCurrentIndex(1) + + # store a reference + #self.dialog = dialog + self.dialog.onOk = self.accepted + self.dialog.onCancel = self.rejected + + #self.dialog.restoreAllSavedWidgetStates() + if hasattr(self.dialog, 'widget_states'): + print("There are states") + print(self.dialog.widget_states) + + def executedialog(self): + self.dialog.restoreAllSavedWidgetStates() + self.dialog.exec() + + def accepted(self): + self.dialog.widget_states = self.dialog.saveAllWidgetStates() + print("accepted") + print(self.dialog.widgets['input1_field'].text()) + print(self.dialog.widgets['input2_field'].currentText()) + #print(self.widget_states) + print(self.dialog.widget_states) + self.dialog.close() + + def rejected(self): + print("rejected") + + +if __name__ == "__main__": + app = QtWidgets.QApplication(sys.argv) + + window = MainUI() + + sys.exit(app.exec_()) From c143250c26a82f4e688c218289d401e8d305414f Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 20 Oct 2023 12:11:48 +0100 Subject: [PATCH 02/29] Save states and restore states as a default in FormDialog --- eqt/ui/FormDialog.py | 11 +++++------ examples/dialog_example_3_save_default.py | 18 +++--------------- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/eqt/ui/FormDialog.py b/eqt/ui/FormDialog.py index a77beba..5e3f9cc 100644 --- a/eqt/ui/FormDialog.py +++ b/eqt/ui/FormDialog.py @@ -25,9 +25,7 @@ def __init__(self, parent=None, title=None): self.formWidget.uiElements['verticalLayout'].addWidget(bb) bb.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self._onOk) bb.button(QtWidgets.QDialogButtonBox.Cancel).clicked.connect(self._onCancel) - - @property def Ok(self): '''returns a reference to the Dialog Ok button to connect its signals''' @@ -40,22 +38,23 @@ def Cancel(self): def _onOk(self): '''calls `onOk`''' - print("I am _onOk") + self.saveAllWidgetStates() self.onOk() def _onCancel(self): - '''calls onCancel and closes the FormDialog''' + '''calls onCancel and closes the FormDialog''' self.onCancel() + self.restoreAllSavedWidgetStates() self.close() def onOk(self): '''Called when the dialog's "Ok" button is clicked. - Can be redefined to add additional functionality on "Ok"''' + Can be redefined to add additional functionality on "Ok"''' pass def onCancel(self): '''Called when the dialog's "Cancel" button is clicked. - Can be redefined to add additional functionality on "Cancel"''' + Can be redefined to add additional functionality on "Cancel"''' pass @property diff --git a/examples/dialog_example_3_save_default.py b/examples/dialog_example_3_save_default.py index da48f30..8f3be60 100644 --- a/examples/dialog_example_3_save_default.py +++ b/examples/dialog_example_3_save_default.py @@ -26,13 +26,11 @@ def __init__(self, parent=None): self.show() def openFormDialog(self): - # Example on how to add elements to the FormDialog # add input 1 as QLineEdit qlabel = QtWidgets.QLabel(self.dialog.groupBox) qlabel.setText("Input 1: ") qwidget = QtWidgets.QLineEdit(self.dialog.groupBox) qwidget.setClearButtonEnabled(True) - # finally add to the form widget self.dialog.addSpanningWidget(QtWidgets.QLabel("Input Values: "), 'input_title') self.dialog.addWidget(qwidget, qlabel, 'input1') @@ -44,34 +42,24 @@ def openFormDialog(self): qwidget.addItem("option 2") qwidget.setCurrentIndex(0) qwidget.setEnabled(True) - # finally add to the form widget self.dialog.addWidget(qwidget, qlabel, 'input2') self.dialog.addWidget(QtWidgets.QLabel("Example Vertical Layout Text"), layout="vertical") # Example of using 'getWidget': self.dialog.getWidget('input2').setCurrentIndex(1) - # store a reference - #self.dialog = dialog + #redefine the onOk and onCancel functions self.dialog.onOk = self.accepted self.dialog.onCancel = self.rejected - #self.dialog.restoreAllSavedWidgetStates() - if hasattr(self.dialog, 'widget_states'): - print("There are states") - print(self.dialog.widget_states) - + #open dialog function when the parent button is clicked def executedialog(self): - self.dialog.restoreAllSavedWidgetStates() - self.dialog.exec() + self.dialog.open() def accepted(self): - self.dialog.widget_states = self.dialog.saveAllWidgetStates() print("accepted") print(self.dialog.widgets['input1_field'].text()) print(self.dialog.widgets['input2_field'].currentText()) - #print(self.widget_states) - print(self.dialog.widget_states) self.dialog.close() def rejected(self): From 071aa0c0c0ab0d196f723f23ceaea0ddfefa7264 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 20 Oct 2023 18:28:03 +0100 Subject: [PATCH 03/29] Add all widgets to example 3 and set state method --- examples/dialog_example_3_save_default.py | 84 +++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/examples/dialog_example_3_save_default.py b/examples/dialog_example_3_save_default.py index 8f3be60..65a4291 100644 --- a/examples/dialog_example_3_save_default.py +++ b/examples/dialog_example_3_save_default.py @@ -3,6 +3,7 @@ from PySide2 import QtWidgets from eqt.ui import FormDialog +from eqt.ui.UISliderWidget import UISliderWidget class MainUI(QtWidgets.QMainWindow): @@ -23,6 +24,13 @@ def __init__(self, parent=None): self.dialog = FormDialog(parent=self, title='Example') self.openFormDialog() + + + + + + self.setstate(0) + self.setstate(1) self.show() def openFormDialog(self): @@ -47,11 +55,87 @@ def openFormDialog(self): # Example of using 'getWidget': self.dialog.getWidget('input2').setCurrentIndex(1) + form=self.dialog + form.addWidget(QtWidgets.QLabel('test label'), 'Label: ', 'label') + form.addWidget(QtWidgets.QCheckBox('test checkbox'), 'CheckBox: ', 'checkBox') + form.addWidget(QtWidgets.QComboBox(), 'ComboBox: ', 'comboBox') + form.addWidget(QtWidgets.QDoubleSpinBox(), 'DoubleSpinBox: ', 'doubleSpinBox') + form.addWidget(QtWidgets.QSpinBox(), 'SpinBox: ', 'spinBox') + form.addWidget(QtWidgets.QSlider(), 'Slider: ', 'slider') + form.addWidget(UISliderWidget(QtWidgets.QLabel()), 'UISliderWidget: ', 'uiSliderWidget') + form.addWidget(QtWidgets.QRadioButton('test'), 'RadioButton: ', 'radioButton') + form.addWidget(QtWidgets.QTextEdit('test'), 'TextEdit: ', 'textEdit') + form.addWidget(QtWidgets.QPlainTextEdit('test'), 'PlainTextEdit: ', 'plainTextEdit') + form.addWidget(QtWidgets.QLineEdit('test'), 'LineEdit: ', 'lineEdit') + form.addWidget(QtWidgets.QPushButton('test'), 'Button: ', 'button') + + + + #redefine the onOk and onCancel functions self.dialog.onOk = self.accepted self.dialog.onCancel = self.rejected + def setstate(self,ii): + + state=[0,0] + state[1] = {'label_value': 'Test label state 1', + 'checkbox_value':True, + 'combobox_value': 1, + 'doubleSpinBox_value': 1.0, + 'spinBox_value': 1, + 'slider_value': 1, + 'uislider_value': 1, + 'radio_value': True, + 'textEdit_value': 'test edit 1', + 'plainTextEdit_value': 'test plain 1', + 'lineEdit_value': 'test line 1', + 'button_value': True + } + + state[0] = {'label_value': 'Test label state 0', + 'checkbox_value':False, + 'combobox_value': 0, + 'doubleSpinBox_value': 10.0, + 'spinBox_value': 10, + 'slider_value': 10, + 'uislider_value': 10, + 'radio_value': False, + 'textEdit_value': 'test edit 0', + 'plainTextEdit_value': 'test plain 0', + 'lineEdit_value': 'test line 0', + 'button_value': False + } + + self.dialog.getWidget('label').setText(state[ii]['label_value']) + self.dialog.getWidget('checkBox').setChecked(state[ii]['checkbox_value']) + + combobox_list = ['test', 'test2'] + self.dialog.getWidget('comboBox').addItems(combobox_list) + self.dialog.getWidget('comboBox').setCurrentIndex(state[ii]['combobox_value']) + + self.dialog.getWidget('doubleSpinBox').setValue(state[ii]['doubleSpinBox_value']) + + self.dialog.getWidget('spinBox').setValue(state[ii]['spinBox_value']) + + self.dialog.getWidget('slider').setValue(state[ii]['slider_value']) + + self.dialog.getWidget('uiSliderWidget').setValue(state[ii]['uislider_value']) + + self.dialog.getWidget('textEdit').setText(state[ii]['textEdit_value']) + + self.dialog.getWidget('plainTextEdit').setPlainText(state[ii]['plainTextEdit_value']) + + self.dialog.getWidget('lineEdit').setText(state[ii]['lineEdit_value']) + + self.dialog.getWidget('button').setCheckable(True) + self.dialog.getWidget('button').setChecked(state[ii]['button_value']) + + self.dialog.getWidget('radioButton').setChecked(state[ii]['radio_value']) + + + #open dialog function when the parent button is clicked def executedialog(self): self.dialog.open() From 9473391045552dffb8e44cd155ad099282fa4f3f Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 20 Oct 2023 18:29:02 +0100 Subject: [PATCH 04/29] Add unit test for state changes in form dialog --- not finished --- test/test__formUI_status_test.py | 102 +++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index c35676b..19f18e4 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -3,6 +3,8 @@ from unittest import mock from PySide2 import QtWidgets +from PySide2.QtTest import QTest +from PySide2.QtCore import Qt from eqt.ui.FormDialog import FormDialog from eqt.ui.UIFormWidget import FormDockWidget, FormWidget @@ -39,6 +41,64 @@ def add_two_widgets(self): form.addWidget(QtWidgets.QLabel('test label'), 'Label: ', 'label') form.addWidget(QtWidgets.QCheckBox('test checkbox'), 'CheckBox: ', 'checkBox') + def set_state(self,ii): + #define two states for every widget + state=[0,0] + state[1] = {'label_value': 'Test label state 1', + 'checkbox_value':True, + 'combobox_value': 1, + 'doubleSpinBox_value': 1.0, + 'spinBox_value': 1, + 'slider_value': 1, + 'uislider_value': 1, + 'radio_value': True, + 'textEdit_value': 'test edit 1', + 'plainTextEdit_value': 'test plain 1', + 'lineEdit_value': 'test line 1', + 'pushButton_value': True + } + state[0] = {'label_value': 'Test label state 0', + 'checkbox_value':False, + 'combobox_value': 0, + 'doubleSpinBox_value': 10.0, + 'spinBox_value': 10, + 'slider_value': 10, + 'uislider_value': 10, + 'radio_value': False, + 'textEdit_value': 'test edit 0', + 'plainTextEdit_value': 'test plain 0', + 'lineEdit_value': 'test line 0', + 'pushButton_value': False + } + #set the states + #QLabel + self.form.getWidget('label').setText(state[ii]['label_value']) + #QCheckBox + self.form.getWidget('checkBox').setChecked(state[ii]['checkbox_value']) + #QComboBox + combobox_list = ['test', 'test2'] + self.form.getWidget('comboBox').addItems(combobox_list) + self.form.getWidget('comboBox').setCurrentIndex(state[ii]['combobox_value']) + #QDoubleSpinBox + self.form.getWidget('doubleSpinBox').setValue(state[ii]['doubleSpinBox_value']) + #QSpinBox + self.form.getWidget('spinBox').setValue(state[ii]['spinBox_value']) + #QSlider + self.form.getWidget('slider').setValue(state[ii]['slider_value']) + #UISlider + self.form.getWidget('uiSliderWidget').setValue(state[ii]['uislider_value']) + #QRadioButton + self.form.getWidget('radioButton').setChecked(state[ii]['radio_value']) + #QTextEdit + self.form.getWidget('textEdit').setText(state[ii]['textEdit_value']) + #QPlainTextEdit + self.form.getWidget('plainTextEdit').setPlainText(state[ii]['plainTextEdit_value']) + #QLineEdit + self.form.getWidget('lineEdit').setText(state[ii]['lineEdit_value']) + #QPushButton + self.form.getWidget('button').setCheckable(True) + self.form.getWidget('button').setChecked(state[ii]['pushButton_value']) + def test_getWidgetState_returns_visibility(self): """ Check that the visibility of the widget is saved to the state @@ -296,6 +356,48 @@ def setUp(self): self.simple_form = FormDialog() self.add_two_widgets() + def click_Ok(self): + QTest.mouseClick(self.form.Ok, Qt.LeftButton) + + def click_Cancel(self): + QTest.mouseClick(self.form.Cancel, Qt.LeftButton) + + def test_save_states_default(self): + #test both states are working + self.set_state(1) + states1=self.form.getAllWidgetStates() + self.set_state(0) + states0=self.form.getAllWidgetStates() + self.assertEqual(states0,states0) + self.assertEqual(states1,states1) + #self.assertEqual(states0,states1) + # Click the Ok button + self.click_Ok() + #self.form.close() + + #self.form.open() + self.assertEqual(states0,self.form.getAllWidgetStates()) + #self.assertEqual(states0,states1) + #self.assertEqual(states0,states0) + + # Click the Ok button + self.click_Ok() + self.form.close() + + self.form.open() + # #check states are states 1 + self.set_state(0) + self.click_Cancel() + self.form.close() + + self.form.open() + # #check states are states 1 + self.set_state(0) + # #press ok + self.form.close() + self.form.open() + # check states are states 0 + def test_getWidgetState_returns_QLabel_value(self): """Check that the value of the QLabel is saved to the state""" initial_label_value = 'Label: ' From 2e05d9719f8fa96ef24b5d78d57ebc6d5abf02b6 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 26 Oct 2023 12:55:49 +0100 Subject: [PATCH 05/29] Unit tests working --- test/test__formUI_status_test.py | 47 ++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index 19f18e4..60bc3f8 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -364,39 +364,46 @@ def click_Cancel(self): def test_save_states_default(self): #test both states are working + self.form.open() + #state1 self.set_state(1) states1=self.form.getAllWidgetStates() + self.assertEqual(states1,self.form.getAllWidgetStates()) + #state0 self.set_state(0) states0=self.form.getAllWidgetStates() + self.assertNotEqual(states1,self.form.getAllWidgetStates()) + self.assertEqual(states0,self.form.getAllWidgetStates()) + #together self.assertEqual(states0,states0) self.assertEqual(states1,states1) - #self.assertEqual(states0,states1) - # Click the Ok button - self.click_Ok() - #self.form.close() - - #self.form.open() + self.assertNotEqual(states0,states1) + #check nothing is saved when Cancel is pressed + self.click_Cancel() + self.assertNotEqual(states0,self.form.getAllWidgetStates()) + self.assertNotEqual(states1,self.form.getAllWidgetStates()) + #save state 0 + self.form.open() + self.set_state(0) self.assertEqual(states0,self.form.getAllWidgetStates()) - #self.assertEqual(states0,states1) - #self.assertEqual(states0,states0) - - # Click the Ok button - self.click_Ok() + self.click_Ok() self.form.close() - self.form.open() - # #check states are states 1 - self.set_state(0) - self.click_Cancel() + self.assertEqual(states0,self.form.getAllWidgetStates()) + #save state 1 + self.form.open() + self.set_state(1) + self.assertEqual(states1,self.form.getAllWidgetStates()) + self.click_Ok() self.form.close() - self.form.open() - # #check states are states 1 + self.assertEqual(states1,self.form.getAllWidgetStates()) + #change to state 0 without saving self.set_state(0) - # #press ok - self.form.close() + self.assertEqual(states0,self.form.getAllWidgetStates()) + self.click_Cancel() self.form.open() - # check states are states 0 + self.assertEqual(states1,self.form.getAllWidgetStates()) def test_getWidgetState_returns_QLabel_value(self): """Check that the value of the QLabel is saved to the state""" From 0538ef5badc75246623df5a79b44ba4b63d9b785 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 26 Oct 2023 13:55:23 +0100 Subject: [PATCH 06/29] Modify and tidy example --- examples/dialog_example_3_save_default.py | 136 ++++------------------ 1 file changed, 22 insertions(+), 114 deletions(-) diff --git a/examples/dialog_example_3_save_default.py b/examples/dialog_example_3_save_default.py index 65a4291..a48ab60 100644 --- a/examples/dialog_example_3_save_default.py +++ b/examples/dialog_example_3_save_default.py @@ -5,16 +5,14 @@ from eqt.ui import FormDialog from eqt.ui.UISliderWidget import UISliderWidget - class MainUI(QtWidgets.QMainWindow): def __init__(self, parent=None): QtWidgets.QMainWindow.__init__(self, parent) pb = QtWidgets.QPushButton(self) pb.setText("Open Dialog with form layout") - pb.clicked.connect(lambda: self.executedialog()) - + layout = QtWidgets.QHBoxLayout() layout.addWidget(pb) widg = QtWidgets.QWidget() @@ -22,133 +20,43 @@ def __init__(self, parent=None): self.setCentralWidget(widg) self.dialog = FormDialog(parent=self, title='Example') - self.openFormDialog() - - - - - self.setstate(0) - self.setstate(1) self.show() def openFormDialog(self): - # add input 1 as QLineEdit - qlabel = QtWidgets.QLabel(self.dialog.groupBox) - qlabel.setText("Input 1: ") - qwidget = QtWidgets.QLineEdit(self.dialog.groupBox) - qwidget.setClearButtonEnabled(True) + # add a spanning widget self.dialog.addSpanningWidget(QtWidgets.QLabel("Input Values: "), 'input_title') - self.dialog.addWidget(qwidget, qlabel, 'input1') - - # add input 2 as QComboBox - qlabel = QtWidgets.QLabel(self.dialog.groupBox) - qlabel.setText("Input 2: ") - qwidget = QtWidgets.QComboBox(self.dialog.groupBox) - qwidget.addItem("option 1") - qwidget.addItem("option 2") - qwidget.setCurrentIndex(0) - qwidget.setEnabled(True) - self.dialog.addWidget(qwidget, qlabel, 'input2') - self.dialog.addWidget(QtWidgets.QLabel("Example Vertical Layout Text"), layout="vertical") - - # Example of using 'getWidget': - self.dialog.getWidget('input2').setCurrentIndex(1) - form=self.dialog - form.addWidget(QtWidgets.QLabel('test label'), 'Label: ', 'label') - form.addWidget(QtWidgets.QCheckBox('test checkbox'), 'CheckBox: ', 'checkBox') - form.addWidget(QtWidgets.QComboBox(), 'ComboBox: ', 'comboBox') - form.addWidget(QtWidgets.QDoubleSpinBox(), 'DoubleSpinBox: ', 'doubleSpinBox') - form.addWidget(QtWidgets.QSpinBox(), 'SpinBox: ', 'spinBox') - form.addWidget(QtWidgets.QSlider(), 'Slider: ', 'slider') - form.addWidget(UISliderWidget(QtWidgets.QLabel()), 'UISliderWidget: ', 'uiSliderWidget') - form.addWidget(QtWidgets.QRadioButton('test'), 'RadioButton: ', 'radioButton') - form.addWidget(QtWidgets.QTextEdit('test'), 'TextEdit: ', 'textEdit') - form.addWidget(QtWidgets.QPlainTextEdit('test'), 'PlainTextEdit: ', 'plainTextEdit') - form.addWidget(QtWidgets.QLineEdit('test'), 'LineEdit: ', 'lineEdit') - form.addWidget(QtWidgets.QPushButton('test'), 'Button: ', 'button') - - - - + # add all widgets + self.dialog.addWidget(QtWidgets.QLabel('Label'), 'Label: ', 'label') + self.dialog.addWidget(QtWidgets.QCheckBox('check me'), 'CheckBox: ', 'checkBox') + combobox_list = ['choice 1', 'choice 2'] + self.dialog.addWidget(QtWidgets.QComboBox(), 'ComboBox: ', 'comboBox') + self.dialog.getWidget('comboBox').addItems(combobox_list) + self.dialog.addWidget(QtWidgets.QDoubleSpinBox(), 'DoubleSpinBox: ', 'doubleSpinBox') + self.dialog.addWidget(QtWidgets.QSpinBox(), 'SpinBox: ', 'spinBox') + self.dialog.addWidget(QtWidgets.QSlider(), 'Slider: ', 'slider') + self.dialog.addWidget(UISliderWidget(QtWidgets.QLabel()), 'UISlider: ', 'uiSliderWidget') + self.dialog.addWidget(QtWidgets.QRadioButton('select me'), 'RadioButton: ', 'radioButton') + self.dialog.addWidget(QtWidgets.QTextEdit('write text here'), 'TextEdit: ', 'textEdit') + self.dialog.addWidget(QtWidgets.QPlainTextEdit('write text here'), 'PlainTextEdit: ', 'plainTextEdit') + self.dialog.addWidget(QtWidgets.QLineEdit('write text here'), 'LineEdit: ', 'lineEdit') + self.dialog.addWidget(QtWidgets.QPushButton('Click me'), 'Button: ', 'button') #redefine the onOk and onCancel functions self.dialog.onOk = self.accepted self.dialog.onCancel = self.rejected - def setstate(self,ii): - - state=[0,0] - state[1] = {'label_value': 'Test label state 1', - 'checkbox_value':True, - 'combobox_value': 1, - 'doubleSpinBox_value': 1.0, - 'spinBox_value': 1, - 'slider_value': 1, - 'uislider_value': 1, - 'radio_value': True, - 'textEdit_value': 'test edit 1', - 'plainTextEdit_value': 'test plain 1', - 'lineEdit_value': 'test line 1', - 'button_value': True - } - - state[0] = {'label_value': 'Test label state 0', - 'checkbox_value':False, - 'combobox_value': 0, - 'doubleSpinBox_value': 10.0, - 'spinBox_value': 10, - 'slider_value': 10, - 'uislider_value': 10, - 'radio_value': False, - 'textEdit_value': 'test edit 0', - 'plainTextEdit_value': 'test plain 0', - 'lineEdit_value': 'test line 0', - 'button_value': False - } - - self.dialog.getWidget('label').setText(state[ii]['label_value']) - self.dialog.getWidget('checkBox').setChecked(state[ii]['checkbox_value']) - - combobox_list = ['test', 'test2'] - self.dialog.getWidget('comboBox').addItems(combobox_list) - self.dialog.getWidget('comboBox').setCurrentIndex(state[ii]['combobox_value']) - - self.dialog.getWidget('doubleSpinBox').setValue(state[ii]['doubleSpinBox_value']) - - self.dialog.getWidget('spinBox').setValue(state[ii]['spinBox_value']) - - self.dialog.getWidget('slider').setValue(state[ii]['slider_value']) - - self.dialog.getWidget('uiSliderWidget').setValue(state[ii]['uislider_value']) - - self.dialog.getWidget('textEdit').setText(state[ii]['textEdit_value']) - - self.dialog.getWidget('plainTextEdit').setPlainText(state[ii]['plainTextEdit_value']) - - self.dialog.getWidget('lineEdit').setText(state[ii]['lineEdit_value']) - - self.dialog.getWidget('button').setCheckable(True) - self.dialog.getWidget('button').setChecked(state[ii]['button_value']) - - self.dialog.getWidget('radioButton').setChecked(state[ii]['radio_value']) - - - - #open dialog function when the parent button is clicked - def executedialog(self): - self.dialog.open() - def accepted(self): - print("accepted") - print(self.dialog.widgets['input1_field'].text()) - print(self.dialog.widgets['input2_field'].currentText()) + print("States saved") self.dialog.close() def rejected(self): - print("rejected") + print("States rejected") + #open dialog function when the parent button is clicked + def executedialog(self): + self.dialog.open() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) From 46231b57f645af39a7ea2acde9cbfbf00d8bd1b1 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 26 Oct 2023 14:02:44 +0100 Subject: [PATCH 07/29] Add minor changes --- eqt/ui/FormDialog.py | 4 ++-- test/test__formUI_status_test.py | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eqt/ui/FormDialog.py b/eqt/ui/FormDialog.py index 5e3f9cc..89a5a89 100644 --- a/eqt/ui/FormDialog.py +++ b/eqt/ui/FormDialog.py @@ -37,12 +37,12 @@ def Cancel(self): return self.buttonBox.button(QtWidgets.QDialogButtonBox.Cancel) def _onOk(self): - '''calls `onOk`''' + '''saves the widget states and calls `onOk`''' self.saveAllWidgetStates() self.onOk() def _onCancel(self): - '''calls onCancel and closes the FormDialog''' + '''calls `onCancel`, restores the previously saved states if existing and closes the FormDialog''' self.onCancel() self.restoreAllSavedWidgetStates() self.close() diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index 60bc3f8..415b6f0 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -44,19 +44,6 @@ def add_two_widgets(self): def set_state(self,ii): #define two states for every widget state=[0,0] - state[1] = {'label_value': 'Test label state 1', - 'checkbox_value':True, - 'combobox_value': 1, - 'doubleSpinBox_value': 1.0, - 'spinBox_value': 1, - 'slider_value': 1, - 'uislider_value': 1, - 'radio_value': True, - 'textEdit_value': 'test edit 1', - 'plainTextEdit_value': 'test plain 1', - 'lineEdit_value': 'test line 1', - 'pushButton_value': True - } state[0] = {'label_value': 'Test label state 0', 'checkbox_value':False, 'combobox_value': 0, @@ -70,6 +57,19 @@ def set_state(self,ii): 'lineEdit_value': 'test line 0', 'pushButton_value': False } + state[1] = {'label_value': 'Test label state 1', + 'checkbox_value':True, + 'combobox_value': 1, + 'doubleSpinBox_value': 1.0, + 'spinBox_value': 1, + 'slider_value': 1, + 'uislider_value': 1, + 'radio_value': True, + 'textEdit_value': 'test edit 1', + 'plainTextEdit_value': 'test plain 1', + 'lineEdit_value': 'test line 1', + 'pushButton_value': True + } #set the states #QLabel self.form.getWidget('label').setText(state[ii]['label_value']) From d2cfb9a9c2d2344a3750a7270c3e7909a2a9e52b Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 26 Oct 2023 14:18:34 +0100 Subject: [PATCH 08/29] Add changes from pre-commit --- eqt/ui/FormDialog.py | 7 +- examples/dialog_example_3_save_default.py | 11 +- test/test__formUI_status_test.py | 126 ++++++++++------------ 3 files changed, 67 insertions(+), 77 deletions(-) diff --git a/eqt/ui/FormDialog.py b/eqt/ui/FormDialog.py index 89a5a89..ba9146f 100644 --- a/eqt/ui/FormDialog.py +++ b/eqt/ui/FormDialog.py @@ -25,7 +25,7 @@ def __init__(self, parent=None, title=None): self.formWidget.uiElements['verticalLayout'].addWidget(bb) bb.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self._onOk) bb.button(QtWidgets.QDialogButtonBox.Cancel).clicked.connect(self._onCancel) - + @property def Ok(self): '''returns a reference to the Dialog Ok button to connect its signals''' @@ -38,11 +38,12 @@ def Cancel(self): def _onOk(self): '''saves the widget states and calls `onOk`''' - self.saveAllWidgetStates() + self.saveAllWidgetStates() self.onOk() def _onCancel(self): - '''calls `onCancel`, restores the previously saved states if existing and closes the FormDialog''' + '''calls `onCancel`, restores the previously saved states if existing and + closes the FormDialog''' self.onCancel() self.restoreAllSavedWidgetStates() self.close() diff --git a/examples/dialog_example_3_save_default.py b/examples/dialog_example_3_save_default.py index a48ab60..3fef30b 100644 --- a/examples/dialog_example_3_save_default.py +++ b/examples/dialog_example_3_save_default.py @@ -5,6 +5,7 @@ from eqt.ui import FormDialog from eqt.ui.UISliderWidget import UISliderWidget + class MainUI(QtWidgets.QMainWindow): def __init__(self, parent=None): QtWidgets.QMainWindow.__init__(self, parent) @@ -12,7 +13,7 @@ def __init__(self, parent=None): pb = QtWidgets.QPushButton(self) pb.setText("Open Dialog with form layout") pb.clicked.connect(lambda: self.executedialog()) - + layout = QtWidgets.QHBoxLayout() layout.addWidget(pb) widg = QtWidgets.QWidget() @@ -39,11 +40,12 @@ def openFormDialog(self): self.dialog.addWidget(UISliderWidget(QtWidgets.QLabel()), 'UISlider: ', 'uiSliderWidget') self.dialog.addWidget(QtWidgets.QRadioButton('select me'), 'RadioButton: ', 'radioButton') self.dialog.addWidget(QtWidgets.QTextEdit('write text here'), 'TextEdit: ', 'textEdit') - self.dialog.addWidget(QtWidgets.QPlainTextEdit('write text here'), 'PlainTextEdit: ', 'plainTextEdit') + self.dialog.addWidget(QtWidgets.QPlainTextEdit('write text here'), 'PlainTextEdit: ', + 'plainTextEdit') self.dialog.addWidget(QtWidgets.QLineEdit('write text here'), 'LineEdit: ', 'lineEdit') self.dialog.addWidget(QtWidgets.QPushButton('Click me'), 'Button: ', 'button') - #redefine the onOk and onCancel functions + # redefine the onOk and onCancel functions self.dialog.onOk = self.accepted self.dialog.onCancel = self.rejected @@ -54,10 +56,11 @@ def accepted(self): def rejected(self): print("States rejected") - #open dialog function when the parent button is clicked + # open dialog function when the parent button is clicked def executedialog(self): self.dialog.open() + if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index 415b6f0..bafbe5f 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -3,8 +3,8 @@ from unittest import mock from PySide2 import QtWidgets -from PySide2.QtTest import QTest from PySide2.QtCore import Qt +from PySide2.QtTest import QTest from eqt.ui.FormDialog import FormDialog from eqt.ui.UIFormWidget import FormDockWidget, FormWidget @@ -41,61 +41,47 @@ def add_two_widgets(self): form.addWidget(QtWidgets.QLabel('test label'), 'Label: ', 'label') form.addWidget(QtWidgets.QCheckBox('test checkbox'), 'CheckBox: ', 'checkBox') - def set_state(self,ii): - #define two states for every widget - state=[0,0] - state[0] = {'label_value': 'Test label state 0', - 'checkbox_value':False, - 'combobox_value': 0, - 'doubleSpinBox_value': 10.0, - 'spinBox_value': 10, - 'slider_value': 10, - 'uislider_value': 10, - 'radio_value': False, - 'textEdit_value': 'test edit 0', - 'plainTextEdit_value': 'test plain 0', - 'lineEdit_value': 'test line 0', - 'pushButton_value': False - } - state[1] = {'label_value': 'Test label state 1', - 'checkbox_value':True, - 'combobox_value': 1, - 'doubleSpinBox_value': 1.0, - 'spinBox_value': 1, - 'slider_value': 1, - 'uislider_value': 1, - 'radio_value': True, - 'textEdit_value': 'test edit 1', - 'plainTextEdit_value': 'test plain 1', - 'lineEdit_value': 'test line 1', - 'pushButton_value': True - } - #set the states - #QLabel + def set_state(self, ii): + # define two states for every widget + state = [0, 0] + state[0] = { + 'label_value': 'Test label state 0', 'checkbox_value': False, 'combobox_value': 0, + 'doubleSpinBox_value': 10.0, 'spinBox_value': 10, 'slider_value': 10, + 'uislider_value': 10, 'radio_value': False, 'textEdit_value': 'test edit 0', + 'plainTextEdit_value': 'test plain 0', 'lineEdit_value': 'test line 0', + 'pushButton_value': False} + state[1] = { + 'label_value': 'Test label state 1', 'checkbox_value': True, 'combobox_value': 1, + 'doubleSpinBox_value': 1.0, 'spinBox_value': 1, 'slider_value': 1, 'uislider_value': 1, + 'radio_value': True, 'textEdit_value': 'test edit 1', + 'plainTextEdit_value': 'test plain 1', 'lineEdit_value': 'test line 1', + 'pushButton_value': True} + # set the states + # QLabel self.form.getWidget('label').setText(state[ii]['label_value']) - #QCheckBox + # QCheckBox self.form.getWidget('checkBox').setChecked(state[ii]['checkbox_value']) - #QComboBox + # QComboBox combobox_list = ['test', 'test2'] self.form.getWidget('comboBox').addItems(combobox_list) self.form.getWidget('comboBox').setCurrentIndex(state[ii]['combobox_value']) - #QDoubleSpinBox + # QDoubleSpinBox self.form.getWidget('doubleSpinBox').setValue(state[ii]['doubleSpinBox_value']) - #QSpinBox + # QSpinBox self.form.getWidget('spinBox').setValue(state[ii]['spinBox_value']) - #QSlider + # QSlider self.form.getWidget('slider').setValue(state[ii]['slider_value']) - #UISlider + # UISlider self.form.getWidget('uiSliderWidget').setValue(state[ii]['uislider_value']) - #QRadioButton + # QRadioButton self.form.getWidget('radioButton').setChecked(state[ii]['radio_value']) - #QTextEdit + # QTextEdit self.form.getWidget('textEdit').setText(state[ii]['textEdit_value']) - #QPlainTextEdit + # QPlainTextEdit self.form.getWidget('plainTextEdit').setPlainText(state[ii]['plainTextEdit_value']) - #QLineEdit + # QLineEdit self.form.getWidget('lineEdit').setText(state[ii]['lineEdit_value']) - #QPushButton + # QPushButton self.form.getWidget('button').setCheckable(True) self.form.getWidget('button').setChecked(state[ii]['pushButton_value']) @@ -363,47 +349,47 @@ def click_Cancel(self): QTest.mouseClick(self.form.Cancel, Qt.LeftButton) def test_save_states_default(self): - #test both states are working + # test both states are working self.form.open() - #state1 + # state1 self.set_state(1) - states1=self.form.getAllWidgetStates() - self.assertEqual(states1,self.form.getAllWidgetStates()) - #state0 + states1 = self.form.getAllWidgetStates() + self.assertEqual(states1, self.form.getAllWidgetStates()) + # state0 self.set_state(0) - states0=self.form.getAllWidgetStates() - self.assertNotEqual(states1,self.form.getAllWidgetStates()) - self.assertEqual(states0,self.form.getAllWidgetStates()) - #together - self.assertEqual(states0,states0) - self.assertEqual(states1,states1) - self.assertNotEqual(states0,states1) - #check nothing is saved when Cancel is pressed + states0 = self.form.getAllWidgetStates() + self.assertNotEqual(states1, self.form.getAllWidgetStates()) + self.assertEqual(states0, self.form.getAllWidgetStates()) + # together + self.assertEqual(states0, states0) + self.assertEqual(states1, states1) + self.assertNotEqual(states0, states1) + # check nothing is saved when Cancel is pressed self.click_Cancel() - self.assertNotEqual(states0,self.form.getAllWidgetStates()) - self.assertNotEqual(states1,self.form.getAllWidgetStates()) - #save state 0 + self.assertNotEqual(states0, self.form.getAllWidgetStates()) + self.assertNotEqual(states1, self.form.getAllWidgetStates()) + # save state 0 self.form.open() self.set_state(0) - self.assertEqual(states0,self.form.getAllWidgetStates()) - self.click_Ok() + self.assertEqual(states0, self.form.getAllWidgetStates()) + self.click_Ok() self.form.close() self.form.open() - self.assertEqual(states0,self.form.getAllWidgetStates()) - #save state 1 + self.assertEqual(states0, self.form.getAllWidgetStates()) + # save state 1 self.form.open() self.set_state(1) - self.assertEqual(states1,self.form.getAllWidgetStates()) - self.click_Ok() + self.assertEqual(states1, self.form.getAllWidgetStates()) + self.click_Ok() self.form.close() self.form.open() - self.assertEqual(states1,self.form.getAllWidgetStates()) - #change to state 0 without saving + self.assertEqual(states1, self.form.getAllWidgetStates()) + # change to state 0 without saving self.set_state(0) - self.assertEqual(states0,self.form.getAllWidgetStates()) - self.click_Cancel() + self.assertEqual(states0, self.form.getAllWidgetStates()) + self.click_Cancel() self.form.open() - self.assertEqual(states1,self.form.getAllWidgetStates()) + self.assertEqual(states1, self.form.getAllWidgetStates()) def test_getWidgetState_returns_QLabel_value(self): """Check that the value of the QLabel is saved to the state""" From ffe74e4c4303abcb88fd0a2128f41eb309944442 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Mon, 30 Oct 2023 18:00:29 +0000 Subject: [PATCH 09/29] Fix first cancel call bug --- eqt/ui/UIFormWidget.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 926a536..1518cd6 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -137,6 +137,26 @@ def _addWidget(self, name, qwidget, qlabel=None): formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 + self.getWidgetValuesFromState() + + def getWidgetValuesFromState(self): + if not hasattr(self, 'widget_default'): + self.widget_default={} + states=self.getAllWidgetStates() + self.widget_default={state_key:states[state_key]['value'] for state_key in states.keys()} + print(self.widget_default) + print("invoking get default") + + def applyWidgetValuesToState(self): + self.saveAllWidgetStates() + for state_key in self.widget_default.keys(): + self.widget_states[state_key]['value']=self.widget_default[state_key] + print("invoking apply default") + + + + + def getAllWidgetStates(self): ''' @@ -292,6 +312,7 @@ def saveAllWidgetStates(self): Saves the state of all widgets in the form. To later restore the states, use `restoreAllSavedWidgetStates()`. ''' + print("saving states") self.widget_states = self.getAllWidgetStates() def restoreAllSavedWidgetStates(self): @@ -299,8 +320,13 @@ def restoreAllSavedWidgetStates(self): Restore all widgets in the form to the state saved by `saveAllWidgetStates()`. If `saveAllWidgetStates()` method was not previously invoked, do nothing. ''' - if hasattr(self, 'widget_states'): - self.applyWidgetStates(self.widget_states) + + if not hasattr(self, 'widget_states'): + self.applyWidgetValuesToState() + print("making the default state") + self.applyWidgetStates(self.widget_states) + print("applying saved states") + class FormWidget(QtWidgets.QWidget, UIFormWidget): From 00dbb7afee700eec54fecc34cd9fb76fd5ea27e1 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Mon, 30 Oct 2023 18:52:59 +0000 Subject: [PATCH 10/29] Save default values one by one in `_addWidget` --- eqt/ui/UIFormWidget.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 1518cd6..146ca7e 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -109,6 +109,10 @@ def addSeparator(self, name): def _addWidget(self, name, qwidget, qlabel=None): formLayout = self.uiElements['groupBoxFormLayout'] + # create the default values + if not hasattr(self, 'widget_default'): + self.widget_default={} + # Create the widgets: widgetno = self.num_widgets @@ -117,6 +121,9 @@ def _addWidget(self, name, qwidget, qlabel=None): field = f'{name}_field' self.widgets[field] = qwidget + # add the default value of the qwidget + self.widget_default[field]=self.getWidgetState(qwidget)['value'] + if qlabel is not None: # add the label label = f'{name}_label' @@ -125,30 +132,25 @@ def _addWidget(self, name, qwidget, qlabel=None): qlabel = QtWidgets.QLabel(self.uiElements['groupBox']) qlabel.setText(txt) formLayout.setWidget(widgetno, QtWidgets.QFormLayout.LabelRole, qlabel) - + # save a reference to label widgets in the dictionary self.widgets[label] = qlabel field_form_role = QtWidgets.QFormLayout.FieldRole + # add the default value of the qlabel + self.widget_default[label]=self.getWidgetState(qlabel,label)['value'] + else: # In the case we don't have a qlabel, set a spanning widget: field_form_role = QtWidgets.QFormLayout.SpanningRole formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 - self.getWidgetValuesFromState() - - def getWidgetValuesFromState(self): - if not hasattr(self, 'widget_default'): - self.widget_default={} - states=self.getAllWidgetStates() - self.widget_default={state_key:states[state_key]['value'] for state_key in states.keys()} - print(self.widget_default) - print("invoking get default") def applyWidgetValuesToState(self): self.saveAllWidgetStates() + print("this time i am inside default apply") for state_key in self.widget_default.keys(): self.widget_states[state_key]['value']=self.widget_default[state_key] print("invoking apply default") @@ -323,7 +325,7 @@ def restoreAllSavedWidgetStates(self): if not hasattr(self, 'widget_states'): self.applyWidgetValuesToState() - print("making the default state") + print("apply the default state") self.applyWidgetStates(self.widget_states) print("applying saved states") From 6be5a9c8e44ab11352b9c1ed9594a2ae44e0581d Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Tue, 31 Oct 2023 13:35:59 +0000 Subject: [PATCH 11/29] Close dialog when Ok is clicked and add example file for methods --- eqt/ui/FormDialog.py | 1 + examples/dialog_example_3_save_default.py | 28 ++++------------------- examples/utilitiesForExamples.py | 26 +++++++++++++++++++++ 3 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 examples/utilitiesForExamples.py diff --git a/eqt/ui/FormDialog.py b/eqt/ui/FormDialog.py index ba9146f..799400e 100644 --- a/eqt/ui/FormDialog.py +++ b/eqt/ui/FormDialog.py @@ -40,6 +40,7 @@ def _onOk(self): '''saves the widget states and calls `onOk`''' self.saveAllWidgetStates() self.onOk() + self.close() def _onCancel(self): '''calls `onCancel`, restores the previously saved states if existing and diff --git a/examples/dialog_example_3_save_default.py b/examples/dialog_example_3_save_default.py index 3fef30b..8b0f655 100644 --- a/examples/dialog_example_3_save_default.py +++ b/examples/dialog_example_3_save_default.py @@ -3,7 +3,8 @@ from PySide2 import QtWidgets from eqt.ui import FormDialog -from eqt.ui.UISliderWidget import UISliderWidget + +import utilitiesForExamples as utex class MainUI(QtWidgets.QMainWindow): @@ -12,7 +13,7 @@ def __init__(self, parent=None): pb = QtWidgets.QPushButton(self) pb.setText("Open Dialog with form layout") - pb.clicked.connect(lambda: self.executedialog()) + pb.clicked.connect(lambda: self.executeDialog()) layout = QtWidgets.QHBoxLayout() layout.addWidget(pb) @@ -26,38 +27,19 @@ def __init__(self, parent=None): self.show() def openFormDialog(self): - # add a spanning widget - self.dialog.addSpanningWidget(QtWidgets.QLabel("Input Values: "), 'input_title') - # add all widgets - self.dialog.addWidget(QtWidgets.QLabel('Label'), 'Label: ', 'label') - self.dialog.addWidget(QtWidgets.QCheckBox('check me'), 'CheckBox: ', 'checkBox') - combobox_list = ['choice 1', 'choice 2'] - self.dialog.addWidget(QtWidgets.QComboBox(), 'ComboBox: ', 'comboBox') - self.dialog.getWidget('comboBox').addItems(combobox_list) - self.dialog.addWidget(QtWidgets.QDoubleSpinBox(), 'DoubleSpinBox: ', 'doubleSpinBox') - self.dialog.addWidget(QtWidgets.QSpinBox(), 'SpinBox: ', 'spinBox') - self.dialog.addWidget(QtWidgets.QSlider(), 'Slider: ', 'slider') - self.dialog.addWidget(UISliderWidget(QtWidgets.QLabel()), 'UISlider: ', 'uiSliderWidget') - self.dialog.addWidget(QtWidgets.QRadioButton('select me'), 'RadioButton: ', 'radioButton') - self.dialog.addWidget(QtWidgets.QTextEdit('write text here'), 'TextEdit: ', 'textEdit') - self.dialog.addWidget(QtWidgets.QPlainTextEdit('write text here'), 'PlainTextEdit: ', - 'plainTextEdit') - self.dialog.addWidget(QtWidgets.QLineEdit('write text here'), 'LineEdit: ', 'lineEdit') - self.dialog.addWidget(QtWidgets.QPushButton('Click me'), 'Button: ', 'button') - + utex.addWidgetsToExample(self.dialog) # redefine the onOk and onCancel functions self.dialog.onOk = self.accepted self.dialog.onCancel = self.rejected def accepted(self): print("States saved") - self.dialog.close() def rejected(self): print("States rejected") # open dialog function when the parent button is clicked - def executedialog(self): + def executeDialog(self): self.dialog.open() diff --git a/examples/utilitiesForExamples.py b/examples/utilitiesForExamples.py new file mode 100644 index 0000000..1b5a9ec --- /dev/null +++ b/examples/utilitiesForExamples.py @@ -0,0 +1,26 @@ +from PySide2 import QtWidgets +from eqt.ui.UISliderWidget import UISliderWidget + +def addWidgetsToExample(form): + ''' + Adds a spanning widget and every type of widget to a form + ''' + # add a spanning widget + form.addSpanningWidget(QtWidgets.QLabel("Input Values: "), 'input_title') + # add all widgets + form.addWidget(QtWidgets.QLabel('Label'), 'Label: ', 'label') + form.addWidget(QtWidgets.QCheckBox('check me'), 'CheckBox: ', 'checkBox') + combobox_list = ['choice 1', 'choice 2'] + form.addWidget(QtWidgets.QComboBox(), 'ComboBox: ', 'comboBox') + form.getWidget('comboBox').addItems(combobox_list) + form.addWidget(QtWidgets.QDoubleSpinBox(), 'DoubleSpinBox: ', 'doubleSpinBox') + form.addWidget(QtWidgets.QSpinBox(), 'SpinBox: ', 'spinBox') + form.addWidget(QtWidgets.QSlider(), 'Slider: ', 'slider') + form.addWidget(UISliderWidget(QtWidgets.QLabel()), 'UISlider: ', 'uiSliderWidget') + form.addWidget(QtWidgets.QRadioButton('select me'), 'RadioButton: ', 'radioButton') + form.addWidget(QtWidgets.QTextEdit('write text here'), 'TextEdit: ', 'textEdit') + form.addWidget(QtWidgets.QPlainTextEdit('write text here'), 'PlainTextEdit: ', + 'plainTextEdit') + form.addWidget(QtWidgets.QLineEdit('write text here'), 'LineEdit: ', 'lineEdit') + form.addWidget(QtWidgets.QPushButton('Click me'), 'Button: ', 'button') + From 4c5ca41d79b568a24c9909c69d7ed0fa2cb0c532 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Tue, 31 Oct 2023 13:38:54 +0000 Subject: [PATCH 12/29] Add example state to tests, add docstring to set_state --- eqt/ui/UIFormWidget.py | 14 +------- test/test__formUI_status_test.py | 56 +++++++++++++++++--------------- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 146ca7e..c666b26 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -150,16 +150,9 @@ def _addWidget(self, name, qwidget, qlabel=None): def applyWidgetValuesToState(self): self.saveAllWidgetStates() - print("this time i am inside default apply") for state_key in self.widget_default.keys(): self.widget_states[state_key]['value']=self.widget_default[state_key] - print("invoking apply default") - - - - - def getAllWidgetStates(self): ''' Returns @@ -314,7 +307,6 @@ def saveAllWidgetStates(self): Saves the state of all widgets in the form. To later restore the states, use `restoreAllSavedWidgetStates()`. ''' - print("saving states") self.widget_states = self.getAllWidgetStates() def restoreAllSavedWidgetStates(self): @@ -322,15 +314,11 @@ def restoreAllSavedWidgetStates(self): Restore all widgets in the form to the state saved by `saveAllWidgetStates()`. If `saveAllWidgetStates()` method was not previously invoked, do nothing. ''' - if not hasattr(self, 'widget_states'): self.applyWidgetValuesToState() - print("apply the default state") self.applyWidgetStates(self.widget_states) - print("applying saved states") - - + class FormWidget(QtWidgets.QWidget, UIFormWidget): def __init__(self, parent=None): # dockWidgetContents = QtWidgets.QWidget() diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index bafbe5f..1e228a9 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -15,9 +15,29 @@ class FormsCommonTests(metaclass=abc.ABCMeta): """Common tests for all Form types""" + @abc.abstractmethod def setUp(self): raise NotImplementedError + + @property + def exampleState(self): + # define two states for every widget + state=[ + { + 'label_value': 'Test label state 0', 'checkbox_value': False, 'combobox_value': 0, + 'doubleSpinBox_value': 10.0, 'spinBox_value': 10, 'slider_value': 10, + 'uislider_value': 10, 'radio_value': False, 'textEdit_value': 'test edit 0', + 'plainTextEdit_value': 'test plain 0', 'lineEdit_value': 'test line 0', + 'pushButton_value': False}, + { + 'label_value': 'Test label state 1', 'checkbox_value': True, 'combobox_value': 1, + 'doubleSpinBox_value': 1.0, 'spinBox_value': 1, 'slider_value': 1, 'uislider_value': 1, + 'radio_value': True, 'textEdit_value': 'test edit 1', + 'plainTextEdit_value': 'test plain 1', 'lineEdit_value': 'test line 1', + 'pushButton_value': True} + ] + return state def add_every_widget(self): """Generate every widget and add it to `self.form`""" @@ -42,20 +62,14 @@ def add_two_widgets(self): form.addWidget(QtWidgets.QCheckBox('test checkbox'), 'CheckBox: ', 'checkBox') def set_state(self, ii): - # define two states for every widget - state = [0, 0] - state[0] = { - 'label_value': 'Test label state 0', 'checkbox_value': False, 'combobox_value': 0, - 'doubleSpinBox_value': 10.0, 'spinBox_value': 10, 'slider_value': 10, - 'uislider_value': 10, 'radio_value': False, 'textEdit_value': 'test edit 0', - 'plainTextEdit_value': 'test plain 0', 'lineEdit_value': 'test line 0', - 'pushButton_value': False} - state[1] = { - 'label_value': 'Test label state 1', 'checkbox_value': True, 'combobox_value': 1, - 'doubleSpinBox_value': 1.0, 'spinBox_value': 1, 'slider_value': 1, 'uislider_value': 1, - 'radio_value': True, 'textEdit_value': 'test edit 1', - 'plainTextEdit_value': 'test plain 1', 'lineEdit_value': 'test line 1', - 'pushButton_value': True} + """ + Applies the values saved in `self.exampleState` at position `ii` to the widgets in the form. + + Parameters + ---------------- + ii: int + """ + state=self.exampleState # set the states # QLabel self.form.getWidget('label').setText(state[ii]['label_value']) @@ -350,7 +364,6 @@ def click_Cancel(self): def test_save_states_default(self): # test both states are working - self.form.open() # state1 self.set_state(1) states1 = self.form.getAllWidgetStates() @@ -360,35 +373,24 @@ def test_save_states_default(self): states0 = self.form.getAllWidgetStates() self.assertNotEqual(states1, self.form.getAllWidgetStates()) self.assertEqual(states0, self.form.getAllWidgetStates()) - # together - self.assertEqual(states0, states0) - self.assertEqual(states1, states1) - self.assertNotEqual(states0, states1) - # check nothing is saved when Cancel is pressed + # check state 0 and 1 are not saved when Cancel is pressed self.click_Cancel() self.assertNotEqual(states0, self.form.getAllWidgetStates()) self.assertNotEqual(states1, self.form.getAllWidgetStates()) # save state 0 - self.form.open() self.set_state(0) self.assertEqual(states0, self.form.getAllWidgetStates()) self.click_Ok() - self.form.close() - self.form.open() self.assertEqual(states0, self.form.getAllWidgetStates()) # save state 1 - self.form.open() self.set_state(1) self.assertEqual(states1, self.form.getAllWidgetStates()) self.click_Ok() - self.form.close() - self.form.open() self.assertEqual(states1, self.form.getAllWidgetStates()) # change to state 0 without saving self.set_state(0) self.assertEqual(states0, self.form.getAllWidgetStates()) self.click_Cancel() - self.form.open() self.assertEqual(states1, self.form.getAllWidgetStates()) def test_getWidgetState_returns_QLabel_value(self): From 540f27eb9db7f017cb5498e851bed7401c4b711d Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 17 Nov 2023 13:14:48 +0000 Subject: [PATCH 13/29] ii changed to i in test set_state --- test/test__formUI_status_test.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index 1e228a9..600003c 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -61,43 +61,43 @@ def add_two_widgets(self): form.addWidget(QtWidgets.QLabel('test label'), 'Label: ', 'label') form.addWidget(QtWidgets.QCheckBox('test checkbox'), 'CheckBox: ', 'checkBox') - def set_state(self, ii): + def set_state(self, i): """ - Applies the values saved in `self.exampleState` at position `ii` to the widgets in the form. + Applies the values saved in `self.exampleState` at position `i` to the widgets in the form. Parameters ---------------- - ii: int + i: int """ state=self.exampleState # set the states # QLabel - self.form.getWidget('label').setText(state[ii]['label_value']) + self.form.getWidget('label').setText(state[i]['label_value']) # QCheckBox - self.form.getWidget('checkBox').setChecked(state[ii]['checkbox_value']) + self.form.getWidget('checkBox').setChecked(state[i]['checkbox_value']) # QComboBox combobox_list = ['test', 'test2'] self.form.getWidget('comboBox').addItems(combobox_list) - self.form.getWidget('comboBox').setCurrentIndex(state[ii]['combobox_value']) + self.form.getWidget('comboBox').setCurrentIndex(state[i]['combobox_value']) # QDoubleSpinBox - self.form.getWidget('doubleSpinBox').setValue(state[ii]['doubleSpinBox_value']) + self.form.getWidget('doubleSpinBox').setValue(state[i]['doubleSpinBox_value']) # QSpinBox - self.form.getWidget('spinBox').setValue(state[ii]['spinBox_value']) + self.form.getWidget('spinBox').setValue(state[i]['spinBox_value']) # QSlider - self.form.getWidget('slider').setValue(state[ii]['slider_value']) + self.form.getWidget('slider').setValue(state[i]['slider_value']) # UISlider - self.form.getWidget('uiSliderWidget').setValue(state[ii]['uislider_value']) + self.form.getWidget('uiSliderWidget').setValue(state[i]['uislider_value']) # QRadioButton - self.form.getWidget('radioButton').setChecked(state[ii]['radio_value']) + self.form.getWidget('radioButton').setChecked(state[i]['radio_value']) # QTextEdit - self.form.getWidget('textEdit').setText(state[ii]['textEdit_value']) + self.form.getWidget('textEdit').setText(state[i]['textEdit_value']) # QPlainTextEdit - self.form.getWidget('plainTextEdit').setPlainText(state[ii]['plainTextEdit_value']) + self.form.getWidget('plainTextEdit').setPlainText(state[i]['plainTextEdit_value']) # QLineEdit - self.form.getWidget('lineEdit').setText(state[ii]['lineEdit_value']) + self.form.getWidget('lineEdit').setText(state[i]['lineEdit_value']) # QPushButton self.form.getWidget('button').setCheckable(True) - self.form.getWidget('button').setChecked(state[ii]['pushButton_value']) + self.form.getWidget('button').setChecked(state[i]['pushButton_value']) def test_getWidgetState_returns_visibility(self): """ From 006e4a947410d7a2b5be78a4539d3b1579fe3d75 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 17 Nov 2023 14:00:35 +0000 Subject: [PATCH 14/29] Improve applyDefaultWidgetValuesToState with docstring and new name --- eqt/ui/UIFormWidget.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index c666b26..73ae99e 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -148,7 +148,12 @@ def _addWidget(self, name, qwidget, qlabel=None): formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 - def applyWidgetValuesToState(self): + def applyDefaultWidgetValuesToState(self): + ''' + Saves all states in a form widget - typically invoked when a form is firstly opened and no states are saved yet. + Retrieves the default values from the widgets and applies them to the saved states - this preserves visible and + enabled in the widgets. + ''' self.saveAllWidgetStates() for state_key in self.widget_default.keys(): self.widget_states[state_key]['value']=self.widget_default[state_key] @@ -315,7 +320,7 @@ def restoreAllSavedWidgetStates(self): If `saveAllWidgetStates()` method was not previously invoked, do nothing. ''' if not hasattr(self, 'widget_states'): - self.applyWidgetValuesToState() + self.applyDefaultWidgetValuesToState() self.applyWidgetStates(self.widget_states) From 54235ecfbc8bdda8f4cd9563c724d46f5fef8202 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 17 Nov 2023 14:14:50 +0000 Subject: [PATCH 15/29] Change docstring to restoreAllSavedWidgetStates --- eqt/ui/UIFormWidget.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 73ae99e..0d22954 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -316,8 +316,10 @@ def saveAllWidgetStates(self): def restoreAllSavedWidgetStates(self): ''' - Restore all widgets in the form to the state saved by `saveAllWidgetStates()`. - If `saveAllWidgetStates()` method was not previously invoked, do nothing. + There are saved states only if `saveAllWidgetStates` was previously invoked. + If there are no previously saved states, `applyDefaultWidgetValuesToState` + saves the states and applies default values to them. Once the existence of the + `widget_states` is checked, all widgets in the form are restored to the saved states. ''' if not hasattr(self, 'widget_states'): self.applyDefaultWidgetValuesToState() From 424d6b498c33a3b95257ea4112231929e38e4738 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 17 Nov 2023 14:31:00 +0000 Subject: [PATCH 16/29] Pre-commit run --- eqt/ui/UIFormWidget.py | 24 ++++++++++----------- examples/dialog_example_3_save_default.py | 3 +-- examples/utilitiesForExamples.py | 6 +++--- test/test__formUI_status_test.py | 26 ++++++++++------------- 4 files changed, 27 insertions(+), 32 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 0d22954..5c5fd32 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -111,7 +111,7 @@ def _addWidget(self, name, qwidget, qlabel=None): # create the default values if not hasattr(self, 'widget_default'): - self.widget_default={} + self.widget_default = {} # Create the widgets: @@ -122,7 +122,7 @@ def _addWidget(self, name, qwidget, qlabel=None): self.widgets[field] = qwidget # add the default value of the qwidget - self.widget_default[field]=self.getWidgetState(qwidget)['value'] + self.widget_default[field] = self.getWidgetState(qwidget)['value'] if qlabel is not None: # add the label @@ -132,14 +132,14 @@ def _addWidget(self, name, qwidget, qlabel=None): qlabel = QtWidgets.QLabel(self.uiElements['groupBox']) qlabel.setText(txt) formLayout.setWidget(widgetno, QtWidgets.QFormLayout.LabelRole, qlabel) - + # save a reference to label widgets in the dictionary self.widgets[label] = qlabel field_form_role = QtWidgets.QFormLayout.FieldRole # add the default value of the qlabel - self.widget_default[label]=self.getWidgetState(qlabel,label)['value'] + self.widget_default[label] = self.getWidgetState(qlabel, label)['value'] else: # In the case we don't have a qlabel, set a spanning widget: @@ -150,14 +150,14 @@ def _addWidget(self, name, qwidget, qlabel=None): def applyDefaultWidgetValuesToState(self): ''' - Saves all states in a form widget - typically invoked when a form is firstly opened and no states are saved yet. - Retrieves the default values from the widgets and applies them to the saved states - this preserves visible and - enabled in the widgets. + Saves all states in a form widget - typically invoked when a form is firstly opened + and no states are saved yet. Retrieves the default values from the widgets and applies + them to the saved states - this preserves visible and enabled in the widgets. ''' self.saveAllWidgetStates() for state_key in self.widget_default.keys(): - self.widget_states[state_key]['value']=self.widget_default[state_key] - + self.widget_states[state_key]['value'] = self.widget_default[state_key] + def getAllWidgetStates(self): ''' Returns @@ -317,15 +317,15 @@ def saveAllWidgetStates(self): def restoreAllSavedWidgetStates(self): ''' There are saved states only if `saveAllWidgetStates` was previously invoked. - If there are no previously saved states, `applyDefaultWidgetValuesToState` - saves the states and applies default values to them. Once the existence of the + If there are no previously saved states, `applyDefaultWidgetValuesToState` + saves the states and applies default values to them. Once the existence of the `widget_states` is checked, all widgets in the form are restored to the saved states. ''' if not hasattr(self, 'widget_states'): self.applyDefaultWidgetValuesToState() self.applyWidgetStates(self.widget_states) - + class FormWidget(QtWidgets.QWidget, UIFormWidget): def __init__(self, parent=None): # dockWidgetContents = QtWidgets.QWidget() diff --git a/examples/dialog_example_3_save_default.py b/examples/dialog_example_3_save_default.py index 8b0f655..27c8cc5 100644 --- a/examples/dialog_example_3_save_default.py +++ b/examples/dialog_example_3_save_default.py @@ -1,11 +1,10 @@ import sys +import utilitiesForExamples as utex from PySide2 import QtWidgets from eqt.ui import FormDialog -import utilitiesForExamples as utex - class MainUI(QtWidgets.QMainWindow): def __init__(self, parent=None): diff --git a/examples/utilitiesForExamples.py b/examples/utilitiesForExamples.py index 1b5a9ec..19eda57 100644 --- a/examples/utilitiesForExamples.py +++ b/examples/utilitiesForExamples.py @@ -1,6 +1,8 @@ from PySide2 import QtWidgets + from eqt.ui.UISliderWidget import UISliderWidget + def addWidgetsToExample(form): ''' Adds a spanning widget and every type of widget to a form @@ -19,8 +21,6 @@ def addWidgetsToExample(form): form.addWidget(UISliderWidget(QtWidgets.QLabel()), 'UISlider: ', 'uiSliderWidget') form.addWidget(QtWidgets.QRadioButton('select me'), 'RadioButton: ', 'radioButton') form.addWidget(QtWidgets.QTextEdit('write text here'), 'TextEdit: ', 'textEdit') - form.addWidget(QtWidgets.QPlainTextEdit('write text here'), 'PlainTextEdit: ', - 'plainTextEdit') + form.addWidget(QtWidgets.QPlainTextEdit('write text here'), 'PlainTextEdit: ', 'plainTextEdit') form.addWidget(QtWidgets.QLineEdit('write text here'), 'LineEdit: ', 'lineEdit') form.addWidget(QtWidgets.QPushButton('Click me'), 'Button: ', 'button') - diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index 600003c..5db1eba 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -15,28 +15,24 @@ class FormsCommonTests(metaclass=abc.ABCMeta): """Common tests for all Form types""" - @abc.abstractmethod def setUp(self): raise NotImplementedError - - @property - def exampleState(self): + + @property + def exampleState(self): # define two states for every widget - state=[ - { + state = [{ 'label_value': 'Test label state 0', 'checkbox_value': False, 'combobox_value': 0, 'doubleSpinBox_value': 10.0, 'spinBox_value': 10, 'slider_value': 10, 'uislider_value': 10, 'radio_value': False, 'textEdit_value': 'test edit 0', 'plainTextEdit_value': 'test plain 0', 'lineEdit_value': 'test line 0', - 'pushButton_value': False}, - { - 'label_value': 'Test label state 1', 'checkbox_value': True, 'combobox_value': 1, - 'doubleSpinBox_value': 1.0, 'spinBox_value': 1, 'slider_value': 1, 'uislider_value': 1, - 'radio_value': True, 'textEdit_value': 'test edit 1', - 'plainTextEdit_value': 'test plain 1', 'lineEdit_value': 'test line 1', - 'pushButton_value': True} - ] + 'pushButton_value': False}, { + 'label_value': 'Test label state 1', 'checkbox_value': True, 'combobox_value': 1, + 'doubleSpinBox_value': 1.0, 'spinBox_value': 1, 'slider_value': 1, + 'uislider_value': 1, 'radio_value': True, 'textEdit_value': 'test edit 1', + 'plainTextEdit_value': 'test plain 1', 'lineEdit_value': 'test line 1', + 'pushButton_value': True}] return state def add_every_widget(self): @@ -69,7 +65,7 @@ def set_state(self, i): ---------------- i: int """ - state=self.exampleState + state = self.exampleState # set the states # QLabel self.form.getWidget('label').setText(state[i]['label_value']) From 92d1332a4a38c716124f8a564758c4b8c48771b4 Mon Sep 17 00:00:00 2001 From: lauramurgatroyd Date: Tue, 21 Nov 2023 09:08:55 +0000 Subject: [PATCH 17/29] Fix issues with unit tests --- eqt/ui/SessionDialogs.py | 2 +- test/test_MainWindowWithSessionManagement.py | 46 +------------ ..._MainWindowWithSessionManagementDialogs.py | 68 +++++++++++++++++++ test/test_SessionDialogs.py | 4 ++ 4 files changed, 74 insertions(+), 46 deletions(-) create mode 100644 test/test_MainWindowWithSessionManagementDialogs.py diff --git a/eqt/ui/SessionDialogs.py b/eqt/ui/SessionDialogs.py index 71c44e9..dfb77cf 100644 --- a/eqt/ui/SessionDialogs.py +++ b/eqt/ui/SessionDialogs.py @@ -70,7 +70,7 @@ def __init__(self, parent=None, app_name=None): self.app_name = app_name label_text = ("Select a session directory to save and retrieve all" - f" {app_name or ''} Sessions:") + f"{app_name or ''} Sessions:") self.addSpanningWidget(QLabel(label_text), 'select_session_directory') diff --git a/test/test_MainWindowWithSessionManagement.py b/test/test_MainWindowWithSessionManagement.py index c5f0365..777014c 100644 --- a/test/test_MainWindowWithSessionManagement.py +++ b/test/test_MainWindowWithSessionManagement.py @@ -228,57 +228,13 @@ def tearDown(self): shutil.rmtree("Test Folder") -@skip_ci -class TestMainWindowWithSessionManagementCreateLoadSessionDialog(unittest.TestCase): - ''' - Tests the createLoadSessionDialog method of the MainWindowWithSessionManagement class - - This method is responsible for creating the load session dialog - and populating it with the available sessions - ''' - def setUp(self): - self.title = "title" - self.app_name = "app_name" - self.smw = MainWindowWithSessionManagement(self.title, self.app_name) - self.smw.sessions_directory = mock.MagicMock() - self.zip_folders = ["zip_folder_1", "zip_folder_2"] - - def test_createLoadSessionDialog_populates_session_dropdown(self): - dialog = self.smw.createLoadSessionDialog(self.zip_folders) - assert dialog is not None - assert isinstance(dialog, eqt.ui.SessionDialogs.LoadSessionDialog) - select_session_combo = dialog.getWidget('select_session') - assert select_session_combo is not None - items_in_combo = [ - select_session_combo.itemText(i) for i in range(select_session_combo.count())] - assert items_in_combo == self.zip_folders - - def test_createLoadSessionDialog_connections(self): - dialog = self.smw.createLoadSessionDialog(self.zip_folders) - - self.smw.loadSessionLoad = mock.MagicMock() - self.smw.selectLoadSessionsDirectorySelectedInSessionSelector = mock.MagicMock() - self.smw.loadSessionNew = mock.MagicMock() - - dialog = self.smw.createLoadSessionDialog(self.zip_folders) - - dialog.Ok.click() - self.smw.loadSessionLoad.assert_called_once() - - dialog.Select.click() - self.smw.selectLoadSessionsDirectorySelectedInSessionSelector.assert_called_with(dialog) - - dialog.Cancel.click() - self.smw.loadSessionNew.assert_called_once() - - @skip_ci class TestSelectLoadSessionsDirectorySelectedInSessionSelector(unittest.TestCase): ''' Tests the `selectLoadSessionsDirectorySelectedInSessionSelector` method of the `MainWindowWithSessionManagement` class - This method sould close the passed dialog, and call + This method should close the passed dialog, and call `createSessionsDirectorySelectionDialog(new_session=True)` ''' def setUp(self): diff --git a/test/test_MainWindowWithSessionManagementDialogs.py b/test/test_MainWindowWithSessionManagementDialogs.py new file mode 100644 index 0000000..81a611f --- /dev/null +++ b/test/test_MainWindowWithSessionManagementDialogs.py @@ -0,0 +1,68 @@ + +import json +import os +import shutil +import unittest +from datetime import datetime +from unittest import mock +from unittest.mock import patch + +from PySide2.QtCore import QSettings, QThreadPool +from PySide2.QtWidgets import QMenu, QMenuBar + +import eqt +from eqt.io import zip_directory +from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement + +from eqt.ui.SessionDialogs import (LoadSessionDialog) + +from . import skip_ci + +''' Unit tests for the MainWindowWithSessionManagement class +methods which create dialogs''' + +@skip_ci +class TestMainWindowWithSessionManagementCreateLoadSessionDialog(unittest.TestCase): + ''' + Tests the createLoadSessionDialog method of the MainWindowWithSessionManagement class + + This method is responsible for creating the load session dialog + and populating it with the available sessions + ''' + def setUp(self): + self.title = "title" + self.app_name = "app_name" + self.smw = MainWindowWithSessionManagement(self.title, self.app_name) + self.smw.sessions_directory = mock.MagicMock() + self.zip_folders = ["zip_folder_1", "zip_folder_2"] + + def test_createLoadSessionDialog_populates_session_dropdown(self): + dialog = self.smw.createLoadSessionDialog(self.zip_folders) + assert dialog is not None + print(LoadSessionDialog) + print(type(LoadSessionDialog)) + print(type(dialog)) + assert isinstance(dialog, LoadSessionDialog) + select_session_combo = dialog.getWidget('select_session') + assert select_session_combo is not None + items_in_combo = [ + select_session_combo.itemText(i) for i in range(select_session_combo.count())] + assert items_in_combo == self.zip_folders + + def test_createLoadSessionDialog_connections(self): + dialog = self.smw.createLoadSessionDialog(self.zip_folders) + + self.smw.loadSessionLoad = mock.MagicMock() + self.smw.selectLoadSessionsDirectorySelectedInSessionSelector = mock.MagicMock() + self.smw.loadSessionNew = mock.MagicMock() + + dialog = self.smw.createLoadSessionDialog(self.zip_folders) + + dialog.Ok.click() + self.smw.loadSessionLoad.assert_called_once() + + dialog.Select.click() + self.smw.selectLoadSessionsDirectorySelectedInSessionSelector.assert_called_with(dialog) + + dialog.Cancel.click() + self.smw.loadSessionNew.assert_called_once() diff --git a/test/test_SessionDialogs.py b/test/test_SessionDialogs.py index 5a3c352..4761c13 100644 --- a/test/test_SessionDialogs.py +++ b/test/test_SessionDialogs.py @@ -1,6 +1,7 @@ import os import unittest from pathlib import Path +from unittest import mock from unittest.mock import patch from PySide2.QtWidgets import QFileDialog @@ -14,6 +15,8 @@ WarningDialog, ) +from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement + from . import skip_ci @@ -139,3 +142,4 @@ class TestAppSettingsDialog(unittest.TestCase): def test_init(self): asd = AppSettingsDialog() assert asd is not None + From 94f172e0cb34570b40781f38fe534d7efbc66710 Mon Sep 17 00:00:00 2001 From: lauramurgatroyd Date: Tue, 21 Nov 2023 09:14:35 +0000 Subject: [PATCH 18/29] Fix issues with session label --- eqt/ui/SessionDialogs.py | 7 ++++++- test/dialog_example_2_test.py | 2 +- test/test_MainWindowWithSessionManagementDialogs.py | 11 +---------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/eqt/ui/SessionDialogs.py b/eqt/ui/SessionDialogs.py index dfb77cf..cf5a35d 100644 --- a/eqt/ui/SessionDialogs.py +++ b/eqt/ui/SessionDialogs.py @@ -69,8 +69,13 @@ def __init__(self, parent=None, app_name=None): self.app_name = app_name + if app_name is not None: + app_name_label = ' ' + app_name + else: + app_name_label = '' + label_text = ("Select a session directory to save and retrieve all" - f"{app_name or ''} Sessions:") + f"{app_name_label} Sessions:") self.addSpanningWidget(QLabel(label_text), 'select_session_directory') diff --git a/test/dialog_example_2_test.py b/test/dialog_example_2_test.py index 1bacc34..d15e7f1 100644 --- a/test/dialog_example_2_test.py +++ b/test/dialog_example_2_test.py @@ -56,7 +56,7 @@ def openFormDialog(self): # store a reference self.dialog = dialog - dialog.exec() + dialog.open() def accepted(self): print("accepted") diff --git a/test/test_MainWindowWithSessionManagementDialogs.py b/test/test_MainWindowWithSessionManagementDialogs.py index 81a611f..f611b88 100644 --- a/test/test_MainWindowWithSessionManagementDialogs.py +++ b/test/test_MainWindowWithSessionManagementDialogs.py @@ -1,20 +1,11 @@ -import json -import os -import shutil import unittest -from datetime import datetime from unittest import mock -from unittest.mock import patch -from PySide2.QtCore import QSettings, QThreadPool -from PySide2.QtWidgets import QMenu, QMenuBar - -import eqt from eqt.io import zip_directory from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement -from eqt.ui.SessionDialogs import (LoadSessionDialog) +from eqt.ui.SessionDialogs import LoadSessionDialog from . import skip_ci From d6d2cc6eadf2acd8e58d926c86dbaf72be94f4f3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:15:52 +0000 Subject: [PATCH 19/29] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- test/test_MainWindowWithSessionManagementDialogs.py | 3 +-- test/test_SessionDialogs.py | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/test/test_MainWindowWithSessionManagementDialogs.py b/test/test_MainWindowWithSessionManagementDialogs.py index f611b88..6a38afb 100644 --- a/test/test_MainWindowWithSessionManagementDialogs.py +++ b/test/test_MainWindowWithSessionManagementDialogs.py @@ -1,10 +1,8 @@ - import unittest from unittest import mock from eqt.io import zip_directory from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement - from eqt.ui.SessionDialogs import LoadSessionDialog from . import skip_ci @@ -12,6 +10,7 @@ ''' Unit tests for the MainWindowWithSessionManagement class methods which create dialogs''' + @skip_ci class TestMainWindowWithSessionManagementCreateLoadSessionDialog(unittest.TestCase): ''' diff --git a/test/test_SessionDialogs.py b/test/test_SessionDialogs.py index 4761c13..31b2d7b 100644 --- a/test/test_SessionDialogs.py +++ b/test/test_SessionDialogs.py @@ -6,6 +6,7 @@ from PySide2.QtWidgets import QFileDialog +from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement from eqt.ui.SessionDialogs import ( AppSettingsDialog, ErrorDialog, @@ -15,8 +16,6 @@ WarningDialog, ) -from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement - from . import skip_ci @@ -142,4 +141,3 @@ class TestAppSettingsDialog(unittest.TestCase): def test_init(self): asd = AppSettingsDialog() assert asd is not None - From 73f419c09a32b2e7432d60ac1345d8bbf6fb19c1 Mon Sep 17 00:00:00 2001 From: lauramurgatroyd Date: Tue, 21 Nov 2023 09:21:12 +0000 Subject: [PATCH 20/29] Fix formatting --- test/test_MainWindowWithSessionManagementDialogs.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/test_MainWindowWithSessionManagementDialogs.py b/test/test_MainWindowWithSessionManagementDialogs.py index 6a38afb..2f00f0c 100644 --- a/test/test_MainWindowWithSessionManagementDialogs.py +++ b/test/test_MainWindowWithSessionManagementDialogs.py @@ -1,14 +1,13 @@ import unittest from unittest import mock -from eqt.io import zip_directory from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement from eqt.ui.SessionDialogs import LoadSessionDialog from . import skip_ci -''' Unit tests for the MainWindowWithSessionManagement class -methods which create dialogs''' +# Unit tests for the MainWindowWithSessionManagement class +# methods which create dialogs @skip_ci From ccdf0fa39e07a6827c8c35492273108ed5fa1438 Mon Sep 17 00:00:00 2001 From: lauramurgatroyd Date: Tue, 21 Nov 2023 09:27:18 +0000 Subject: [PATCH 21/29] Remove unused imports --- test/test_SessionDialogs.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/test_SessionDialogs.py b/test/test_SessionDialogs.py index 31b2d7b..5a3c352 100644 --- a/test/test_SessionDialogs.py +++ b/test/test_SessionDialogs.py @@ -1,12 +1,10 @@ import os import unittest from pathlib import Path -from unittest import mock from unittest.mock import patch from PySide2.QtWidgets import QFileDialog -from eqt.ui.MainWindowWithSessionManagement import MainWindowWithSessionManagement from eqt.ui.SessionDialogs import ( AppSettingsDialog, ErrorDialog, From 05ff03703b744ba53b57e0080d250c26c5cc12bc Mon Sep 17 00:00:00 2001 From: lauramurgatroyd Date: Tue, 21 Nov 2023 09:29:23 +0000 Subject: [PATCH 22/29] remove prints --- test/test_MainWindowWithSessionManagementDialogs.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/test_MainWindowWithSessionManagementDialogs.py b/test/test_MainWindowWithSessionManagementDialogs.py index 2f00f0c..1c8bb79 100644 --- a/test/test_MainWindowWithSessionManagementDialogs.py +++ b/test/test_MainWindowWithSessionManagementDialogs.py @@ -28,9 +28,6 @@ def setUp(self): def test_createLoadSessionDialog_populates_session_dropdown(self): dialog = self.smw.createLoadSessionDialog(self.zip_folders) assert dialog is not None - print(LoadSessionDialog) - print(type(LoadSessionDialog)) - print(type(dialog)) assert isinstance(dialog, LoadSessionDialog) select_session_combo = dialog.getWidget('select_session') assert select_session_combo is not None From d3bf1716f249f863485eb7a72af7dd491915598b Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 23 Nov 2023 12:58:00 +0000 Subject: [PATCH 23/29] Add default widget state as a larger dictionary --- eqt/ui/FormDialog.py | 2 +- eqt/ui/UIFormWidget.py | 50 +++++++++++++++++++++++------------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/eqt/ui/FormDialog.py b/eqt/ui/FormDialog.py index 799400e..964e655 100644 --- a/eqt/ui/FormDialog.py +++ b/eqt/ui/FormDialog.py @@ -46,8 +46,8 @@ def _onCancel(self): '''calls `onCancel`, restores the previously saved states if existing and closes the FormDialog''' self.onCancel() - self.restoreAllSavedWidgetStates() self.close() + self.restoreAllSavedWidgetStates() def onOk(self): '''Called when the dialog's "Ok" button is clicked. diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 5c5fd32..6d5c6d4 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -109,10 +109,6 @@ def addSeparator(self, name): def _addWidget(self, name, qwidget, qlabel=None): formLayout = self.uiElements['groupBoxFormLayout'] - # create the default values - if not hasattr(self, 'widget_default'): - self.widget_default = {} - # Create the widgets: widgetno = self.num_widgets @@ -121,9 +117,7 @@ def _addWidget(self, name, qwidget, qlabel=None): field = f'{name}_field' self.widgets[field] = qwidget - # add the default value of the qwidget - self.widget_default[field] = self.getWidgetState(qwidget)['value'] - + if qlabel is not None: # add the label label = f'{name}_label' @@ -138,8 +132,7 @@ def _addWidget(self, name, qwidget, qlabel=None): field_form_role = QtWidgets.QFormLayout.FieldRole - # add the default value of the qlabel - self.widget_default[label] = self.getWidgetState(qlabel, label)['value'] + else: # In the case we don't have a qlabel, set a spanning widget: @@ -147,16 +140,28 @@ def _addWidget(self, name, qwidget, qlabel=None): formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 + self.populate_default_widget_states_dictionary(name,qlabel) - def applyDefaultWidgetValuesToState(self): + def populate_default_widget_states_dictionary(self,name,qlabel): + ''' + Creates an attribute dictionary of default widget states. The entries are in the + format: {'value': str | bool | int, 'enabled': bool, 'visible': bool}. + This can be used to restore the default states of the widgets invoking `applyWidgetStates`. ''' - Saves all states in a form widget - typically invoked when a form is firstly opened - and no states are saved yet. Retrieves the default values from the widgets and applies - them to the saved states - this preserves visible and enabled in the widgets. + if not hasattr(self, 'default_widget_states'): + self.default_widget_states = {} + # add the default state of the qwidget + self.default_widget_states[f'{name}_field'] = self.getWidgetState(name,'field') + # add the default state of the qlabel + if qlabel is not None: + self.default_widget_states[f'{name}_label'] = self.getWidgetState(name, 'label') + + def make_default_widget_states_visible(self): + ''' + Sets all of the entries 'visible' in the `default_widget_states` dictionary to be `True`. ''' - self.saveAllWidgetStates() - for state_key in self.widget_default.keys(): - self.widget_states[state_key]['value'] = self.widget_default[state_key] + for key in self.default_widget_states.keys(): + self.default_widget_states[key]['visible'] = True def getAllWidgetStates(self): ''' @@ -316,14 +321,15 @@ def saveAllWidgetStates(self): def restoreAllSavedWidgetStates(self): ''' - There are saved states only if `saveAllWidgetStates` was previously invoked. - If there are no previously saved states, `applyDefaultWidgetValuesToState` - saves the states and applies default values to them. Once the existence of the - `widget_states` is checked, all widgets in the form are restored to the saved states. + All widgets in the form are restored to the saved states. There are saved states only if + `saveAllWidgetStates` was previously invoked. If there are no previously saved states, + `default_widget_states` are used instead, after being made visible. ''' if not hasattr(self, 'widget_states'): - self.applyDefaultWidgetValuesToState() - self.applyWidgetStates(self.widget_states) + self.make_default_widget_states_visible() + self.applyWidgetStates(self.default_widget_states) + else: + self.applyWidgetStates(self.widget_states) class FormWidget(QtWidgets.QWidget, UIFormWidget): From 90ea8e8839dad1fefecfc86d8ffe827bf5910b9f Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 23 Nov 2023 13:19:48 +0000 Subject: [PATCH 24/29] Polish test_dialog_buttons_default_behaviour --- test/test__formUI_status_test.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/test/test__formUI_status_test.py b/test/test__formUI_status_test.py index 5db1eba..3417acd 100644 --- a/test/test__formUI_status_test.py +++ b/test/test__formUI_status_test.py @@ -358,17 +358,12 @@ def click_Ok(self): def click_Cancel(self): QTest.mouseClick(self.form.Cancel, Qt.LeftButton) - def test_save_states_default(self): - # test both states are working - # state1 + def test_dialog_buttons_default_behaviour(self): + # create the states dictionary self.set_state(1) states1 = self.form.getAllWidgetStates() - self.assertEqual(states1, self.form.getAllWidgetStates()) - # state0 self.set_state(0) states0 = self.form.getAllWidgetStates() - self.assertNotEqual(states1, self.form.getAllWidgetStates()) - self.assertEqual(states0, self.form.getAllWidgetStates()) # check state 0 and 1 are not saved when Cancel is pressed self.click_Cancel() self.assertNotEqual(states0, self.form.getAllWidgetStates()) From 1ecc16a3e4b81f387622e2d9dcd51323d2eac42a Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 23 Nov 2023 13:27:00 +0000 Subject: [PATCH 25/29] pre-commit run --- eqt/ui/UIFormWidget.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 6d5c6d4..8dd1986 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -117,7 +117,6 @@ def _addWidget(self, name, qwidget, qlabel=None): field = f'{name}_field' self.widgets[field] = qwidget - if qlabel is not None: # add the label label = f'{name}_label' @@ -132,30 +131,28 @@ def _addWidget(self, name, qwidget, qlabel=None): field_form_role = QtWidgets.QFormLayout.FieldRole - - else: # In the case we don't have a qlabel, set a spanning widget: field_form_role = QtWidgets.QFormLayout.SpanningRole formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 - self.populate_default_widget_states_dictionary(name,qlabel) + self.populate_default_widget_states_dictionary(name, qlabel) - def populate_default_widget_states_dictionary(self,name,qlabel): + def populate_default_widget_states_dictionary(self, name, qlabel): ''' - Creates an attribute dictionary of default widget states. The entries are in the + Creates an attribute dictionary of default widget states. The entries are in the format: {'value': str | bool | int, 'enabled': bool, 'visible': bool}. This can be used to restore the default states of the widgets invoking `applyWidgetStates`. ''' if not hasattr(self, 'default_widget_states'): self.default_widget_states = {} # add the default state of the qwidget - self.default_widget_states[f'{name}_field'] = self.getWidgetState(name,'field') + self.default_widget_states[f'{name}_field'] = self.getWidgetState(name, 'field') # add the default state of the qlabel if qlabel is not None: self.default_widget_states[f'{name}_label'] = self.getWidgetState(name, 'label') - + def make_default_widget_states_visible(self): ''' Sets all of the entries 'visible' in the `default_widget_states` dictionary to be `True`. @@ -321,9 +318,9 @@ def saveAllWidgetStates(self): def restoreAllSavedWidgetStates(self): ''' - All widgets in the form are restored to the saved states. There are saved states only if - `saveAllWidgetStates` was previously invoked. If there are no previously saved states, - `default_widget_states` are used instead, after being made visible. + All widgets in the form are restored to the saved states. There are saved states only if + `saveAllWidgetStates` was previously invoked. If there are no previously saved states, + `default_widget_states` are used instead, after being made visible. ''' if not hasattr(self, 'widget_states'): self.make_default_widget_states_visible() From 69701cde29daa68d4580e05ba58d23de61929e63 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Thu, 23 Nov 2023 13:29:45 +0000 Subject: [PATCH 26/29] improve docstring and other minor things --- eqt/ui/FormDialog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eqt/ui/FormDialog.py b/eqt/ui/FormDialog.py index 964e655..8ed7738 100644 --- a/eqt/ui/FormDialog.py +++ b/eqt/ui/FormDialog.py @@ -43,8 +43,8 @@ def _onOk(self): self.close() def _onCancel(self): - '''calls `onCancel`, restores the previously saved states if existing and - closes the FormDialog''' + '''calls `onCancel`, closes the FormDialog and restores the previously saved states + or the default states.''' self.onCancel() self.close() self.restoreAllSavedWidgetStates() From 664316745ecbde48d7a415a87adcaf1cf025623a Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Fri, 24 Nov 2023 11:08:04 +0000 Subject: [PATCH 27/29] Attempt to make remove widget and save default states compatible, not working yet --- eqt/ui/UIFormWidget.py | 13 +++++++++++++ examples/remove_widgets_example.py | 9 ++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index 073984b..fede5dd 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -46,6 +46,7 @@ def createForm(self): 'verticalLayout': verticalLayout, 'groupBox': groupBox, 'groupBoxFormLayout': groupBoxFormLayout} self.widgets = {} + self.default_widgets = {} @property def groupBox(self): @@ -140,6 +141,7 @@ def _addWidget(self, name, qwidget, qlabel=None): # add the field field = f'{name}_field' self.widgets[field] = qwidget + self.default_widgets[field] = qwidget if qlabel is not None: # add the label @@ -152,6 +154,7 @@ def _addWidget(self, name, qwidget, qlabel=None): # save a reference to label widgets in the dictionary self.widgets[label] = qlabel + self.default_widgets[label] = qlabel field_form_role = QtWidgets.QFormLayout.FieldRole @@ -161,6 +164,7 @@ def _addWidget(self, name, qwidget, qlabel=None): formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 + #self.default_widgets = self.widgets.copy() self.populate_default_widget_states_dictionary(name, qlabel) def populate_default_widget_states_dictionary(self, name, qlabel): @@ -347,9 +351,18 @@ def restoreAllSavedWidgetStates(self): `default_widget_states` are used instead, after being made visible. ''' if not hasattr(self, 'widget_states'): + print(self.widgets) + print(self.default_widgets) + #self.widgets=self.default_widgets + print(self.widgets) self.make_default_widget_states_visible() + #for key in self.default_widget_states.keys(): + ## if key not in self.widgets: + # self.addWidget + #self.widgets[name + '_field'] self.applyWidgetStates(self.default_widget_states) else: + print(self.default_widgets) self.applyWidgetStates(self.widget_states) diff --git a/examples/remove_widgets_example.py b/examples/remove_widgets_example.py index aebfdf4..ff10a40 100644 --- a/examples/remove_widgets_example.py +++ b/examples/remove_widgets_example.py @@ -50,12 +50,19 @@ def openFormDialog(self): # store a reference self.dialog = dialog self.dialog.onCancel = self.rejected + #redefine `onOk`` so it does not close the dialog. + self.dialog._onOk= self._onOkRedefined # print dictionary of all widgets in dialog - print("Dictionary of widgets in Form Dialog:\n" + str(self.dialog.getWidgets())) + print("\nDictionary of widgets in Form Dialog:\n" + str(self.dialog.getWidgets())) dialog.open() + def _onOkRedefined(self): + '''saves the widget states''' + self.dialog.saveAllWidgetStates() + #pass + def addWidgetsToExampleForm(self, form): # add widget 1 as QLineEdit From 970be18bb345b22210d8639d8eb9a77826de62ee Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Mon, 4 Dec 2023 12:04:34 +0000 Subject: [PATCH 28/29] Polish code and run pre-commit --- eqt/ui/UIFormWidget.py | 10 ---------- examples/remove_widgets_example.py | 7 +++---- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index fede5dd..4b3606f 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -164,7 +164,6 @@ def _addWidget(self, name, qwidget, qlabel=None): formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 - #self.default_widgets = self.widgets.copy() self.populate_default_widget_states_dictionary(name, qlabel) def populate_default_widget_states_dictionary(self, name, qlabel): @@ -351,18 +350,9 @@ def restoreAllSavedWidgetStates(self): `default_widget_states` are used instead, after being made visible. ''' if not hasattr(self, 'widget_states'): - print(self.widgets) - print(self.default_widgets) - #self.widgets=self.default_widgets - print(self.widgets) self.make_default_widget_states_visible() - #for key in self.default_widget_states.keys(): - ## if key not in self.widgets: - # self.addWidget - #self.widgets[name + '_field'] self.applyWidgetStates(self.default_widget_states) else: - print(self.default_widgets) self.applyWidgetStates(self.widget_states) diff --git a/examples/remove_widgets_example.py b/examples/remove_widgets_example.py index ff10a40..0884c8a 100644 --- a/examples/remove_widgets_example.py +++ b/examples/remove_widgets_example.py @@ -50,8 +50,8 @@ def openFormDialog(self): # store a reference self.dialog = dialog self.dialog.onCancel = self.rejected - #redefine `onOk`` so it does not close the dialog. - self.dialog._onOk= self._onOkRedefined + # redefine `onOk`` so it does not close the dialog. + self.dialog._onOk = self._onOkRedefined # print dictionary of all widgets in dialog print("\nDictionary of widgets in Form Dialog:\n" + str(self.dialog.getWidgets())) @@ -59,9 +59,8 @@ def openFormDialog(self): dialog.open() def _onOkRedefined(self): - '''saves the widget states''' + '''Saves the widget states.''' self.dialog.saveAllWidgetStates() - #pass def addWidgetsToExampleForm(self, form): From f9a342bfd8f1dace5bc0d81b948b4d9111af4141 Mon Sep 17 00:00:00 2001 From: Danica Sugic Date: Mon, 4 Dec 2023 18:20:19 +0000 Subject: [PATCH 29/29] Change method name and remove qlabel from default state dictionary --- eqt/ui/UIFormWidget.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/eqt/ui/UIFormWidget.py b/eqt/ui/UIFormWidget.py index a4ff0fc..48947f1 100644 --- a/eqt/ui/UIFormWidget.py +++ b/eqt/ui/UIFormWidget.py @@ -164,9 +164,9 @@ def _addWidget(self, name, qwidget, qlabel=None): formLayout.setWidget(widgetno, field_form_role, qwidget) self.num_widgets += 1 - self.populate_default_widget_states_dictionary(name, qlabel) + self.populate_default_widget_states_dictionary(name) - def populate_default_widget_states_dictionary(self, name, qlabel): + def populate_default_widget_states_dictionary(self, name): ''' Creates an attribute dictionary of default widget states. The entries are in the format: {'value': str | bool | int, 'enabled': bool, 'visible': bool}. @@ -177,10 +177,10 @@ def populate_default_widget_states_dictionary(self, name, qlabel): # add the default state of the qwidget self.default_widget_states[f'{name}_field'] = self.getWidgetState(name, 'field') # add the default state of the qlabel - if qlabel is not None: + if f'{name}_label' in self.widgets.keys(): self.default_widget_states[f'{name}_label'] = self.getWidgetState(name, 'label') - def make_default_widget_states_visible(self): + def set_default_widget_states_visible_true(self): ''' Sets all of the entries 'visible' in the `default_widget_states` dictionary to be `True`. ''' @@ -350,7 +350,7 @@ def restoreAllSavedWidgetStates(self): `default_widget_states` are used instead, after being made visible. ''' if not hasattr(self, 'widget_states'): - self.make_default_widget_states_visible() + self.set_default_widget_states_visible_true() self.applyWidgetStates(self.default_widget_states) else: self.applyWidgetStates(self.widget_states)