Skip to content

Commit 4e55196

Browse files
Add select/deselect all and round HKL buttons (#123)
1 parent ce27c80 commit 4e55196

File tree

2 files changed

+65
-11
lines changed

2 files changed

+65
-11
lines changed

src/shiver/views/refine_ub.py

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
QGroupBox,
1212
QComboBox,
1313
)
14-
from qtpy.QtCore import Qt, QAbstractTableModel
14+
from qtpy.QtCore import Qt, QAbstractTableModel, QModelIndex
1515

1616
from matplotlib.backends.backend_qtagg import FigureCanvas # pylint: disable=no-name-in-module
1717
import matplotlib.pyplot as plt
@@ -101,6 +101,26 @@ def refine_rows(self):
101101
"""Return a list of row number where "Refine" box is checked"""
102102
return sorted(k for k, v in self._refine.items() if v)
103103

104+
def select_all(self):
105+
"""Select all refine/recenter checkboxes"""
106+
self._refine = {n: True for n in range(self.rowCount(0))}
107+
self._recenter = {n: True for n in range(self.rowCount(0))}
108+
self.dataChanged.emit(QModelIndex(), QModelIndex()) # force view to redraw
109+
110+
def deselect_all(self):
111+
"""Deselect all refine/recenter checkboxes"""
112+
self._refine = {}
113+
self._recenter = {}
114+
self.dataChanged.emit(QModelIndex(), QModelIndex()) # force view to redraw
115+
116+
def round_hkl(self):
117+
"""Round all HKL values to integer"""
118+
for row in range(self.rowCount(0)):
119+
for index in range(1, 4):
120+
self._data_model.set_cell_data(row, index, round(self._data_model.get_cell(row, index)), False)
121+
122+
self.dataChanged.emit(QModelIndex(), QModelIndex()) # force view to redraw
123+
104124

105125
class RefineUBView(QWidget):
106126
"""The view for the Refine UB widget"""
@@ -143,18 +163,29 @@ def _setup_ui(self):
143163

144164
peaks_layout = QVBoxLayout()
145165

146-
btn_layout = QHBoxLayout()
166+
btn_layout = QGridLayout()
147167
self.populate_peaks = QPushButton("Populate Peaks")
148168
self.populate_peaks.setCheckable(True)
149-
self.populate_peaks.clicked.connect(self.populate_peaks_call)
169+
self.populate_peaks.clicked.connect(self._populate_peaks_call)
150170
self.predict_peaks = QPushButton("Predict peaks")
151-
self.predict_peaks.clicked.connect(self.predict_peaks_call)
171+
self.predict_peaks.clicked.connect(self._predict_peaks_call)
152172
self.recenter_peaks = QPushButton("Recenter")
153-
self.recenter_peaks.clicked.connect(self.recenter_peaks_call)
173+
self.recenter_peaks.clicked.connect(self._recenter_peaks_call)
174+
175+
self.select_all = QPushButton("Select All")
176+
self.select_all.clicked.connect(self._select_all_call)
177+
self.deselect_all = QPushButton("Deselect All")
178+
self.deselect_all.clicked.connect(self._deselect_all_call)
179+
self.round_hkl = QPushButton("Round HKL")
180+
self.round_hkl.clicked.connect(self._round_hkl_call)
181+
182+
btn_layout.addWidget(self.populate_peaks, 0, 0)
183+
btn_layout.addWidget(self.predict_peaks, 0, 1)
184+
btn_layout.addWidget(self.recenter_peaks, 0, 2)
185+
btn_layout.addWidget(self.select_all, 1, 0)
186+
btn_layout.addWidget(self.deselect_all, 1, 1)
187+
btn_layout.addWidget(self.round_hkl, 1, 2)
154188

155-
btn_layout.addWidget(self.populate_peaks)
156-
btn_layout.addWidget(self.predict_peaks)
157-
btn_layout.addWidget(self.recenter_peaks)
158189
peaks_layout.addLayout(btn_layout)
159190
peaks_layout.addWidget(self.peaks_table.view)
160191
self.peaks_table.view.selectionModel().currentRowChanged.connect(self._on_row_selected)
@@ -240,7 +271,7 @@ def connect_populate_peaks(self, callback):
240271
"""connect the "populate peaks" button callback"""
241272
self.populate_peaks_callback = callback
242273

243-
def populate_peaks_call(self, checked):
274+
def _populate_peaks_call(self, checked):
244275
"""call when "populate peaks" button pressed"""
245276
if self.populate_peaks_callback:
246277
self.populate_peaks_callback(checked)
@@ -249,7 +280,7 @@ def connect_predict_peaks(self, callback):
249280
"""connect the "predict peaks" button callback"""
250281
self.predict_peaks_callback = callback
251282

252-
def predict_peaks_call(self):
283+
def _predict_peaks_call(self):
253284
"""call when "predict peaks" button pressed"""
254285
if self.predict_peaks_callback:
255286
self.predict_peaks_callback()
@@ -258,11 +289,23 @@ def connect_recenter_peaks(self, callback):
258289
"""connect the recenter button callback"""
259290
self.recenter_peaks_callback = callback
260291

261-
def recenter_peaks_call(self):
292+
def _recenter_peaks_call(self):
262293
"""call when recenter button pressed"""
263294
if self.recenter_peaks_callback:
264295
self.recenter_peaks_callback()
265296

297+
def _select_all_call(self):
298+
"""call when select all button pressed"""
299+
self.peaks_table.view.model().select_all()
300+
301+
def _deselect_all_call(self):
302+
"""call when deselect all button pressed"""
303+
self.peaks_table.view.model().deselect_all()
304+
305+
def _round_hkl_call(self):
306+
"""call when round HKL button pressed"""
307+
self.peaks_table.view.model().round_hkl()
308+
266309
def connect_refine(self, callback):
267310
"""connect the refine button callback"""
268311
self.refine_callback = callback

tests/views/test_refine_ub_ui.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,17 @@ def test_refine_ub_ui(qtbot):
108108
[5.00797398e-07, 6.28529930, -2.60952093e-05]
109109
)
110110

111+
# test round HKL button
112+
assert refine_ub.model.peaks.getPeak(3).getHKL() == pytest.approx([-4.15318e-06, 7.97044e-08, 1.000336])
113+
qtbot.mouseClick(refine_ub.view.round_hkl, QtCore.Qt.LeftButton)
114+
assert refine_ub.model.peaks.getPeak(3).getHKL() == pytest.approx([0, 0, 1])
115+
116+
# test select all/deselect all buttons
117+
qtbot.mouseClick(refine_ub.view.select_all, QtCore.Qt.LeftButton)
118+
assert refine_ub.view.peaks_table.view.model().refine_rows() == [0, 1, 2, 3, 4, 5]
119+
qtbot.mouseClick(refine_ub.view.deselect_all, QtCore.Qt.LeftButton)
120+
assert refine_ub.view.peaks_table.view.model().refine_rows() == []
121+
111122
# select 3 peaks then press "Refine" and check that UB is updated
112123
assert refine_ub.model.peaks.sample().getOrientedLattice().a() == 1
113124
assert refine_ub.model.peaks.sample().getOrientedLattice().b() == 1

0 commit comments

Comments
 (0)