Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
"""
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