Skip to content

Commit

Permalink
implement plot matrix states and logic
Browse files Browse the repository at this point in the history
  • Loading branch information
paulmueller committed Jul 8, 2019
1 parent b237687 commit 6b51a60
Show file tree
Hide file tree
Showing 9 changed files with 631 additions and 42 deletions.
6 changes: 3 additions & 3 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
2.0.0a17
- implement data matrix states
- implement data matrix logic
2.0.0a16
- implement data/plot matrix states
- implement data/plot matrix logic
2.0.0a16
- add documentation (from Shape-Out 1)
- test deployment for macOS
2.0.0a1
Expand Down
1 change: 1 addition & 0 deletions shapeout2/gui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ def __init__(self):
self.toolButton_new_filter.clicked.connect(self.data_matrix.add_filter)
self.toolButton_new_dataset.clicked.connect(self.import_dataset)
self.toolButton_import.clicked.connect(self.import_dataset)
self.toolButton_new_plot.clicked.connect(self.plot_matrix.add_plot)
# settings
self.settings = settings.SettingsFile()

Expand Down
12 changes: 9 additions & 3 deletions shapeout2/gui/main.ui
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
<item row="0" column="2">
<widget class="QToolButton" name="toolButton_dm">
<property name="text">
<string>Data &amp;Matrix</string>
<string>Block &amp;Matrix</string>
</property>
<property name="checkable">
<bool>true</bool>
Expand Down Expand Up @@ -285,7 +285,7 @@
</widget>
</item>
<item row="0" column="2">
<widget class="QWidget" name="plot_matrix" native="true">
<widget class="PlotMatrix" name="plot_matrix" native="true">
<property name="minimumSize">
<size>
<width>30</width>
Expand All @@ -308,7 +308,7 @@
</spacer>
</item>
<item row="0" column="3" alignment="Qt::AlignTop">
<widget class="QToolButton" name="toolButton">
<widget class="QToolButton" name="toolButton_new_plot">
<property name="toolTip">
<string>Add a new plot</string>
</property>
Expand Down Expand Up @@ -494,6 +494,12 @@
<header>shapeout2.gui.matrix.data_matrix</header>
<container>1</container>
</customwidget>
<customwidget>
<class>PlotMatrix</class>
<extends>QWidget</extends>
<header>shapeout2.gui.matrix.plot_matrix</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
Expand Down
Empty file.
119 changes: 83 additions & 36 deletions shapeout2/gui/matrix/data_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
class DataMatrix(QtWidgets.QWidget):
quickviewed = QtCore.pyqtSignal(pathlib.Path, list)

def __init__(self, parent=None, analysis=range(3)):
def __init__(self, parent=None):
super(DataMatrix, self).__init__(parent)

self.glo = None
Expand All @@ -27,27 +27,21 @@ def __init__(self, parent=None, analysis=range(3)):
def __getstate__(self):
"""Logical states of the current data matrix"""
# datasets
nrows = self.num_datasets
datasets = []
for ii in range(nrows):
ds = self.glo.itemAtPosition(ii+1, 0).widget()
for ds in self.datasets:
datasets.append(ds.__getstate__())
# filters
ncols = self.num_filters
filters = []
for jj in range(ncols):
f = self.glo.itemAtPosition(0, jj+1).widget()
filters.append(f.__getstate__())
for fs in self.filters:
filters.append(fs.__getstate__())
# elements
mestates = {}
for si in range(nrows):
idds = self.glo.itemAtPosition(si+1, 0).widget().identifier
for ds in self.datasets:
idict = {}
for sj in range(ncols):
idf = self.glo.itemAtPosition(0, sj+1).widget().identifier
me = self.glo.itemAtPosition(si+1, sj+1).widget()
idict[idf] = me.__getstate__()
mestates[idds] = idict
for fs in self.filters:
me = self.get_matrix_element(ds.identifier, fs.identifier)
idict[fs.identifier] = me.__getstate__()
mestates[ds.identifier] = idict
state = {"elements": mestates,
"datasets": datasets,
"filters": filters}
Expand Down Expand Up @@ -90,6 +84,50 @@ def _reset_layout(self):
self.setLayout(self.glo)
self.adjust_size()

@property
def datasets(self):
datasets = []
for ii in range(self.glo.rowCount()):
item = self.glo.itemAtPosition(ii+1, 0)
if item is not None:
ds = item.widget()
datasets.append(ds)
return datasets

@property
def element_width(self):
"""Data matrix element width (without 2px spacing)"""
for jj in range(1, self.glo.columnCount()-1):
item = self.glo.itemAtPosition(0, jj)
if item is not None:
width = item.geometry().width()
break
else:
width = 90
return width

@property
def element_height(self):
"""Data matrix element height (without 2px spacing)"""
for ii in range(1, self.glo.rowCount()-1):
item = self.glo.itemAtPosition(ii, 0)
if item is not None:
height = item.geometry().height()
break
else:
height = 90
return height

@property
def filters(self):
filters = []
for jj in range(self.glo.columnCount()):
item = self.glo.itemAtPosition(0, jj+1)
if item is not None:
fs = item.widget()
filters.append(fs)
return filters

@property
def num_datasets(self):
count = 0
Expand All @@ -106,17 +144,29 @@ def num_filters(self):
count += 1
return count

@property
def plot_matrix(self):
for ch in self.parent().children():
if ch.__class__.__name__ == "PlotMatrix":
break
else:
raise KeyError("PlotMatrix not found!")
return ch

def add_dataset(self, path):
md = MatrixDataset(path)
self.glo.addWidget(md, self.num_datasets+1, 0)
md.active_toggled.connect(self.toggle_dataset_active)
md.enabled_toggled.connect(self.toggle_dataset_enable)
md.enabled_toggled.connect(self.plot_matrix.toggle_dataset_enable)
md.option_action.connect(self.on_option_dataset)
self.fill_elements()
self.adjust_size()
self.plot_matrix.fill_elements()
self.plot_matrix.adjust_size()
return md

def add_filter(self, evt=None):
def add_filter(self):
name = "FS{}".format(self.num_filters+1)
mf = MatrixFilter(name)
mf.active_toggled.connect(self.toggle_filter_active)
Expand All @@ -131,15 +181,15 @@ def adjust_size(self):
QtWidgets.QApplication.processEvents()
ncols = self.num_filters
nrows = self.num_datasets
if ncols > 1 and nrows > 1:
hwidth = self.glo.itemAtPosition(0, 1).geometry().width() + 2
if ncols and nrows:
hwidth = self.element_width + 2
hheight = self.glo.itemAtPosition(0, 1).geometry().height()
dwidth = self.glo.itemAtPosition(1, 0).geometry().width()
dheight = self.glo.itemAtPosition(1, 0).geometry().height() + 2
self.setMinimumSize((ncols)*hwidth+dwidth,
(nrows)*dheight+hheight)
self.setFixedSize((ncols)*hwidth+dwidth,
(nrows)*dheight+hheight)
dheight = self.element_height + 2
self.setMinimumSize(ncols*hwidth+dwidth,
nrows*dheight+hheight)
self.setFixedSize(ncols*hwidth+dwidth,
nrows*dheight+hheight)

def clear(self):
"""Reset layout"""
Expand Down Expand Up @@ -175,9 +225,7 @@ def fill_elements(self):
me.__setstate__(mstate)

def get_dataset(self, dataset_id):
nrows = self.glo.rowCount()
for ii in range(1, nrows):
ds = self.glo.itemAtPosition(ii, 0).widget()
for ds in self.datasets:
if ds.identifier == dataset_id:
break
else:
Expand All @@ -186,22 +234,18 @@ def get_dataset(self, dataset_id):

def get_dataset_paths(self):
"""Return dataset paths in the order they are shown"""
nrows = self.glo.rowCount()
paths = []
for ii in range(1, nrows):
item = self.glo.itemAtPosition(ii, 0)
paths.append(item.widget().path)
for ds in self.datasets:
paths.append(ds.path)
return paths

def get_filter(self, filter_id):
ncols = self.glo.columnCount()
for jj in range(1, ncols):
f = self.glo.itemAtPosition(0, jj).widget()
if f.identifier == filter_id:
for fs in self.filters:
if fs.identifier == filter_id:
break
else:
raise KeyError("Filter '{}' not found!".format(filter_id))
return f
return fs

def get_matrix_element(self, dataset_id, filter_id):
"""Return matrix element matching dataset and filter identifiers"""
Expand Down Expand Up @@ -229,6 +273,7 @@ def on_option_dataset(self, option):
row, _, _, _ = self.glo.getItemPosition(idx)
state = self.__getstate__()
ds_state = sender.__getstate__()
pstate = self.plot_matrix.__getstate__()
if option == "insert_anew":
ds_new = self.add_dataset(path=None)
ds_state["identifier"] = ds_new.identifier
Expand All @@ -245,11 +290,13 @@ def on_option_dataset(self, option):
else: # remove
state["datasets"].pop(row-1)
state["elements"].pop(ds_state["identifier"])
pstate["elements"].pop(ds_state["identifier"])
self.__setstate__(state)
self.plot_matrix.__setstate__(pstate)

@QtCore.pyqtSlot(str)
def on_option_filter(self, option):
"""Filter option logic (remove, insert_anew, duplicate)"""
"""Filter option logic (remove, duplicate)"""
sender = self.sender()
idx = self.glo.indexOf(sender)
_, column, _, _ = self.glo.getItemPosition(idx)
Expand Down

0 comments on commit 6b51a60

Please sign in to comment.