Skip to content

Commit eb36846

Browse files
authored
fix #66 : Compare colors (#68)
fix #66 : changed management of bg_value in Adapater and DataArrayModel
1 parent 8b7ea10 commit eb36846

File tree

5 files changed

+32
-18
lines changed

5 files changed

+32
-18
lines changed

larray_editor/api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,15 +352,15 @@ def restore_display_hook():
352352
# profile.runctx('edit(la.Session(arr2=arr2))', vars(), {},
353353
# 'c:\\tmp\\edit.profile')
354354

355-
edit(ses)
355+
# edit(ses)
356356
# edit(ses)
357357
# edit(file)
358358
# edit('fake_path')
359359
# edit(REOPEN_LAST_FILE)
360360

361-
# edit(arr2)
361+
edit(arr2)
362362
# compare(la.Session(arr2=arr2, arr3=arr3), la.Session(arr2=arr2 + 1.0, arr3=arr3 + 1.0))
363-
# compare(arr2, arr2 + 1.0)
363+
compare(arr3, arr3 + la.ndrange(arr3.axes))
364364

365365
# s = la.local_arrays()
366366
# view(s)

larray_editor/arrayadapter.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ def get_changes_2D(self):
8383
changes_2D[local_key] = v
8484
return changes_2D
8585

86+
def get_bg_value_2D(self, shape_2D):
87+
if self.bg_value is not None:
88+
filtered_bg_value = self.bg_value[self.current_filter]
89+
if np.isscalar(filtered_bg_value):
90+
filtered_bg_value = la.aslarray(filtered_bg_value)
91+
return filtered_bg_value.data.reshape(shape_2D)
92+
else:
93+
return None
94+
8695
# XXX: or create two methods?:
8796
# - set_data (which reset the current filter)
8897
# - update_data (which sets new data but keeps current filter unchanged)
@@ -93,8 +102,9 @@ def set_data(self, data, bg_gradient=None, bg_value=None, current_filter=None):
93102
self.current_filter = {}
94103
self.changes = {}
95104
self.la_data = la.aslarray(data)
105+
self.bg_value = la.aslarray(bg_value) if bg_value is not None else None
106+
self.bg_gradient = bg_gradient
96107
self.update_filtered_data(current_filter)
97-
self.data_model.set_background(bg_gradient, bg_value)
98108

99109
def update_filtered_data(self, current_filter=None):
100110
if current_filter is not None:
@@ -113,10 +123,12 @@ def update_filtered_data(self, current_filter=None):
113123
ylabels = self.get_ylabels()
114124
data_2D = self.get_2D_data()
115125
changes_2D = self.get_changes_2D()
126+
bg_value_2D = self.get_bg_value_2D(data_2D.shape)
116127
self.axes_model.set_data(axes)
117128
self.xlabels_model.set_data(xlabels)
118129
self.ylabels_model.set_data(ylabels)
119130
self.data_model.set_data(data_2D, changes_2D)
131+
self.data_model.set_background(self.bg_gradient, bg_value_2D)
120132

121133
def get_data(self):
122134
return self.la_data

larray_editor/arraymodel.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,8 @@ class DataArrayModel(AbstractArrayModel):
201201
Parent Widget.
202202
bg_gradient : LinearGradient, optional
203203
Background color gradient
204-
bg_value : LArray, optional
205-
Background color value
204+
bg_value : Numpy ndarray, optional
205+
Background color value. Must have the shape as data
206206
minvalue : scalar
207207
Minimum value allowed.
208208
maxvalue : scalar
@@ -299,7 +299,14 @@ def set_format(self, format):
299299
self.reset()
300300

301301
def set_background(self, bg_gradient=None, bg_value=None):
302-
self.bg_gradient = bg_gradient
302+
if bg_gradient is not None and not isinstance(bg_gradient, LinearGradient):
303+
raise ValueError("Expected None or LinearGradient instance for `bg_gradient` argument")
304+
if bg_value is not None and not (isinstance(bg_value, np.ndarray) and bg_value.shape == self._data.shape):
305+
raise ValueError("Expected None or 2D Numpy ndarray with shape {} for `bg_value` argument"
306+
.format(self._data.shape))
307+
# self.bg_gradient must never be None
308+
if bg_gradient is not None:
309+
self.bg_gradient = bg_gradient
303310
self.bg_value = bg_value
304311
self.reset()
305312

@@ -349,13 +356,8 @@ def data(self, index, role=Qt.DisplayRole):
349356
if self.bg_value is None:
350357
return self.bg_gradient[float(self.color_func(value))]
351358
else:
352-
bg_value = self.bg_value
353-
x, y = index.row(), index.column()
354-
# FIXME: this is buggy on filtered data. We should change
355-
# bg_value when changing the filter.
356-
idx = y + x * bg_value.shape[-1]
357-
value = bg_value.data.flat[idx]
358-
return self.bg_gradient[value]
359+
i, j = index.row(), index.column()
360+
return self.bg_gradient[self.bg_value[i, j]]
359361
# elif role == Qt.ToolTipRole:
360362
# return to_qvariant("{}\n{}".format(repr(value),self.get_labels(index)))
361363
return to_qvariant()

larray_editor/arraywidget.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,12 +504,12 @@ def __init__(self, parent, data, readonly=False, bg_value=None, bg_gradient=None
504504
self.model_ylabels = LabelsArrayModel(parent=self, readonly=readonly)
505505
self.view_ylabels = LabelsView(parent=self, model=self.model_ylabels, position=(BOTTOM, LEFT))
506506

507-
self.model_data = DataArrayModel(parent=self, readonly=readonly, bg_value=bg_value, bg_gradient=bg_gradient,
508-
minvalue=minvalue, maxvalue=maxvalue)
507+
self.model_data = DataArrayModel(parent=self, readonly=readonly, minvalue=minvalue, maxvalue=maxvalue)
509508
self.view_data = DataView(parent=self, model=self.model_data, dtype=data.dtype, shape=data.shape)
510509

511510
self.data_adapter = LArrayDataAdapter(axes_model=self.model_axes, xlabels_model=self.model_xlabels,
512-
ylabels_model=self.model_ylabels, data_model=self.model_data, data=data)
511+
ylabels_model=self.model_ylabels, data_model=self.model_data, data=data,
512+
bg_value=bg_value, bg_gradient=bg_gradient)
513513

514514
# Create vertical and horizontal scrollbars
515515
self.vscrollbar = ScrollBar(self, self.view_data.verticalScrollBar())

larray_editor/comparator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def setup_and_check(self, arrays, names, title=''):
5454
layout.addLayout(maxdiff_layout)
5555

5656
if absmax:
57-
# scale diff to 0-1
57+
# scale diff to range 0-1
5858
bg_value = (diff / absmax) / 2 + 0.5
5959
else:
6060
# all 0.5 (white)

0 commit comments

Comments
 (0)