Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,23 @@ extend-ignore-names = ['allKeys',
'closeEvent',
'columnCount',
'createEditor',
'expandingDirections',
'eventFilter',
'hasHeightForWidth',
'headerData',
'heightForWidth',
'isClean',
'itemAt',
'mergeWith',
'minimumSize',
'mouseDoubleClickEvent',
'paintEvent',
'resizeEvent',
'rowCount',
'setClean',
'setData',
'setEditorData',
'setGeometry',
'setModel',
'setModelData',
'setText',
Expand All @@ -70,6 +76,7 @@ extend-ignore-names = ['allKeys',
'sizeHint',
'stepBy',
'supportedDropActions',
'takeAt',
'textFromValue',
'timerEvent',
'valueFromText',]
24 changes: 21 additions & 3 deletions rascal2/ui/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def __init__(self):
self.create_toolbar()
self.create_status_bar()

self.setMinimumSize(1024, 800)
self.setMinimumSize(1360, 800)
self.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose)

self.settings = Settings()
Expand Down Expand Up @@ -182,7 +182,7 @@ def create_actions(self):
self.tile_windows_action = QtGui.QAction("Tile Windows", self)
self.tile_windows_action.setStatusTip("Arrange windows in the default grid.")
self.tile_windows_action.setIcon(QtGui.QIcon(path_for("tile.png")))
self.tile_windows_action.triggered.connect(self.mdi.tileSubWindows)
self.tile_windows_action.triggered.connect(self.custom_tile_layout)
self.tile_windows_action.setEnabled(False)
self.disabled_elements.append(self.tile_windows_action)

Expand Down Expand Up @@ -338,7 +338,7 @@ def reset_mdi_layout(self):
if mdi_defaults is None:
for window in self.mdi.subWindowList():
window.showNormal()
self.mdi.tileSubWindows()
self.custom_tile_layout()
else:
for window in self.mdi.subWindowList():
# get corresponding MDIGeometries entry for the widget
Expand All @@ -364,6 +364,24 @@ def save_mdi_layout(self):
global_setting.setValue("window_geometry", self.saveGeometry())
global_setting.sync()

def custom_tile_layout(self):
"""Tile the MDI windows using user recommended sizes."""
# The percentages are estimated from provided screenshot in
# https://github.com/RascalSoftware/RasCAL-2/issues/188
rect = self.centralWidget().contentsRect()
plot_width = round(0.6 * rect.width())
plot_height = round(0.65 * rect.height())
project_width = rect.width() - plot_width
project_height = round(0.5 * rect.height())

plot_geom = (0, 0, plot_width, plot_height)
project_geom = (plot_width, 0, project_width, project_height)
terminal_geom = (0, plot_height, plot_width, rect.height() - plot_height)
controls_geom = (plot_width, project_height, project_width, rect.height() - project_height)
geoms = [controls_geom, terminal_geom, project_geom, plot_geom] # windows in reverse order of creation
for geom, windows in zip(geoms, self.mdi.subWindowList(), strict=False):
windows.setGeometry(*geom)

def enable_elements(self):
"""Enable the elements that are disabled on startup."""
for element in self.disabled_elements:
Expand Down
7 changes: 5 additions & 2 deletions rascal2/widgets/controls.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ def __init__(self, parent):

widget_layout = QtWidgets.QHBoxLayout()
widget_layout.addStretch(1)
widget_layout.addLayout(procedure_box, 4)
widget_layout.addLayout(procedure_box, 8)
widget_layout.addSpacing(20)
widget_layout.addWidget(self.fit_settings, 4)
widget_layout.addWidget(self.fit_settings, 12)
widget_layout.addStretch(1)
self.setLayout(widget_layout)

Expand Down Expand Up @@ -191,13 +191,16 @@ def __init__(self, parent, settings, presenter):
self.rows = {}
self.datasetter = {}
self.val_labels = {}
adjusted_decimals = {"nsTolerance": 3}

settings_grid = QtWidgets.QGridLayout()
settings_grid.setContentsMargins(10, 10, 10, 10)
controls_fields = self.get_controls_attribute("model_fields")
for i, setting in enumerate(settings):
field_info = controls_fields[setting]
self.rows[setting] = get_validated_input(field_info)
if setting in adjusted_decimals:
self.rows[setting].editor.setDecimals(adjusted_decimals[setting])
self.rows[setting].layout().setContentsMargins(5, 0, 0, 0)
self.datasetter[setting] = self.create_model_data_setter(setting)
self.rows[setting].edited_signal.connect(self.datasetter[setting])
Expand Down
2 changes: 0 additions & 2 deletions rascal2/widgets/inputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,6 @@ def create_editor(self, field_info: FieldInfo) -> QtWidgets.QWidget:
class AdaptiveDoubleSpinBox(QtWidgets.QDoubleSpinBox):
"""A double spinbox which adapts to given numbers of decimals."""

MIN_DECIMALS = 2

def __init__(self, parent=None):
super().__init__(parent)

Expand Down
6 changes: 4 additions & 2 deletions rascal2/widgets/plot.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ def __init__(self, parent):
sub_layout.addWidget(slider)
sub_layout.addStretch(1)
plot_toolbar.addLayout(sub_layout)
plot_toolbar.addSpacing(15)
plot_toolbar.addSpacing(5)

sidebar = QtWidgets.QHBoxLayout()
sidebar.addWidget(self.plot_controls)
Expand All @@ -237,6 +237,7 @@ def __init__(self, parent):
scroll_area.setWidgetResizable(True)

central_layout = QtWidgets.QVBoxLayout()
central_layout.setSpacing(0)
central_layout.setContentsMargins(0, 0, 0, 0)
self.interaction_layout = self.make_interaction_layout()
if self.interaction_layout is not None:
Expand Down Expand Up @@ -399,6 +400,8 @@ def make_figure(self) -> matplotlib.figure.Figure:
self.resize_timer = 0
figure = matplotlib.figure.Figure()
figure.subplots(1, 2)
figure.set_tight_layout(True)
figure.set_tight_layout({"pad": 0, "w_pad": 0.5})

return figure

Expand Down Expand Up @@ -465,7 +468,6 @@ def plot_event(self, data: ratapi.events.PlotEventData | None = None):
show_legend = self.show_legend.isChecked() if self.current_plot_data.contrastNames else False
self.figure.clear()
self.update_figure_size()
self.figure.tight_layout()
ratapi.plotting.plot_ref_sld_helper(
self.current_plot_data,
self.figure,
Expand Down
108 changes: 49 additions & 59 deletions rascal2/widgets/project/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
ProjectFieldWidget,
ResolutionsFieldWidget,
)
from rascal2.widgets.utils import FlowLayout


class ProjectWidget(QtWidgets.QWidget):
Expand Down Expand Up @@ -77,16 +78,43 @@ def __init__(self, parent):
layout.addWidget(self.stacked_widget)
self.setLayout(layout)

@staticmethod
def make_labelled_widget(label_text, form_widget):
"""Create widget containing a label and the given widget.

Parameters
----------
label_text: str
The label text for the form widget.
form_widget
The widget to add.

Returns
-------
label_form_widget:
A widget with label and the given widget.
Comment thread
StephenNneji marked this conversation as resolved.
Outdated
"""
layout = QtWidgets.QHBoxLayout()
layout.setSpacing(0)
layout.setContentsMargins(2, 5, 2, 5)
layout.addWidget(QtWidgets.QLabel(f"{label_text}: ", objectName="BoldLabel"))
layout.addWidget(form_widget)

widget = QtWidgets.QWidget()
widget.setLayout(layout)
widget.setSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed)
return widget

def create_project_view(self) -> QtWidgets.QWidget:
"""Create the project (non-edit) view."""
project_widget = QtWidgets.QWidget()
main_layout = QtWidgets.QVBoxLayout()
main_layout.setSpacing(20)

show_sliders_button = QtWidgets.QPushButton("Show sliders", self)
show_sliders_button = QtWidgets.QPushButton("Show sliders")
show_sliders_button.clicked.connect(self.parent.toggle_sliders)

self.edit_project_button = QtWidgets.QPushButton("Edit Project", self, icon=QtGui.QIcon(path_for("edit.png")))
self.edit_project_button = QtWidgets.QPushButton("Edit Project", icon=QtGui.QIcon(path_for("edit.png")))
self.edit_project_button.clicked.connect(self.show_edit_view)
button_layout = QtWidgets.QHBoxLayout()
button_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight)
Expand All @@ -95,42 +123,27 @@ def create_project_view(self) -> QtWidgets.QWidget:

main_layout.addLayout(button_layout)

settings_layout = QtWidgets.QHBoxLayout()
settings_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter)
settings_layout = FlowLayout(spacing=2)
settings_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight)

absorption_label = QtWidgets.QLabel("Absorption:", self, objectName="BoldLabel")
self.absorption_checkbox = QtWidgets.QCheckBox()
self.absorption_checkbox.setDisabled(True)
settings_layout.addWidget(self.make_labelled_widget("Absorption", self.absorption_checkbox))

settings_layout.addWidget(absorption_label)
settings_layout.addWidget(self.absorption_checkbox)

self.calculation_label = QtWidgets.QLabel("Calculation:", self, objectName="BoldLabel")

self.calculation_type = QtWidgets.QLineEdit(self)
self.calculation_type = QtWidgets.QLineEdit()
self.calculation_type.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.calculation_type.setReadOnly(True)
settings_layout.addWidget(self.make_labelled_widget("Calculation", self.calculation_type))

settings_layout.addWidget(self.calculation_label)
settings_layout.addWidget(self.calculation_type)

self.model_type_label = QtWidgets.QLabel("Model Type:", self, objectName="BoldLabel")

self.model_type = QtWidgets.QLineEdit(self)
self.model_type = QtWidgets.QLineEdit()
self.model_type.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.model_type.setReadOnly(True)
settings_layout.addWidget(self.make_labelled_widget("Model Type", self.model_type))

settings_layout.addWidget(self.model_type_label)
settings_layout.addWidget(self.model_type)

self.geometry_label = QtWidgets.QLabel("Geometry:", self, objectName="BoldLabel")

self.geometry_type = QtWidgets.QLineEdit(self)
self.geometry_type = QtWidgets.QLineEdit()
self.geometry_type.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.geometry_type.setReadOnly(True)

settings_layout.addWidget(self.geometry_label)
settings_layout.addWidget(self.geometry_type)
settings_layout.addWidget(self.make_labelled_widget("Geometry", self.geometry_type))

main_layout.addLayout(settings_layout)

Expand All @@ -152,11 +165,11 @@ def create_edit_view(self) -> QtWidgets.QWidget:
main_layout.setSpacing(20)

self.save_project_button = QtWidgets.QPushButton(
"Accept Changes", self, icon=QtGui.QIcon(path_for("save-project.png"))
"Accept Changes", icon=QtGui.QIcon(path_for("save-project.png"))
)
self.save_project_button.clicked.connect(self.save_changes)

self.cancel_button = QtWidgets.QPushButton("Cancel", self, icon=QtGui.QIcon(path_for("cancel-dark.png")))
self.cancel_button = QtWidgets.QPushButton("Cancel", icon=QtGui.QIcon(path_for("cancel-dark.png")))
self.cancel_button.clicked.connect(self.show_project_view)

buttons_layout = QtWidgets.QHBoxLayout()
Expand All @@ -165,47 +178,24 @@ def create_edit_view(self) -> QtWidgets.QWidget:
buttons_layout.addWidget(self.cancel_button)
main_layout.addLayout(buttons_layout)

settings_layout = QtWidgets.QHBoxLayout()
settings_layout = FlowLayout(spacing=2)
settings_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter)

absorption_label = QtWidgets.QLabel("Absorption:", self, objectName="BoldLabel")
self.edit_absorption_checkbox = QtWidgets.QCheckBox()
settings_layout.addWidget(self.make_labelled_widget("Absorption", self.edit_absorption_checkbox))

settings_layout.addWidget(absorption_label)
settings_layout.addWidget(self.edit_absorption_checkbox)

self.edit_calculation_label = QtWidgets.QLabel("Calculation:", self, objectName="BoldLabel")

self.calculation_combobox = QtWidgets.QComboBox(self)
self.calculation_combobox.setSizePolicy(
QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.Fixed
)
self.calculation_combobox = QtWidgets.QComboBox()
self.calculation_combobox.addItems([calc for calc in Calculations])
settings_layout.addWidget(self.make_labelled_widget("Calculation", self.calculation_combobox))

settings_layout.addWidget(self.edit_calculation_label)
settings_layout.addWidget(self.calculation_combobox)

self.edit_model_type_label = QtWidgets.QLabel("Model Type:", self, objectName="BoldLabel")

self.model_combobox = QtWidgets.QComboBox(self)
self.model_combobox.setSizePolicy(
QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.Fixed
)
self.model_combobox = QtWidgets.QComboBox()
self.model_combobox.addItems([model for model in LayerModels])
settings_layout.addWidget(self.make_labelled_widget("Model Type", self.model_combobox))

settings_layout.addWidget(self.edit_model_type_label)
settings_layout.addWidget(self.model_combobox)

self.edit_geometry_label = QtWidgets.QLabel("Geometry:", self, objectName="BoldLabel")

self.geometry_combobox = QtWidgets.QComboBox(self)
self.geometry_combobox.setSizePolicy(
QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.Fixed
)
self.geometry_combobox = QtWidgets.QComboBox()
self.geometry_combobox.addItems([geo for geo in Geometries])
settings_layout.addWidget(self.make_labelled_widget("Geometry", self.geometry_combobox))

settings_layout.addWidget(self.edit_geometry_label)
settings_layout.addWidget(self.geometry_combobox)
main_layout.addLayout(settings_layout)

self.edit_absorption_checkbox.checkStateChanged.connect(
Expand Down
Loading
Loading