Skip to content

Commit

Permalink
Refactor methods table (#265)
Browse files Browse the repository at this point in the history
* Implement MethodsTable from ABDataFrameView

* Remove old MethodsTable code

* Implement CFTable with ABDataFrameView

* Remove old CFTable code, clean up imports
  • Loading branch information
dgdekoning authored Aug 21, 2019
1 parent 22d92dd commit b5093e3
Showing 1 changed file with 84 additions and 64 deletions.
148 changes: 84 additions & 64 deletions activity_browser/app/ui/tables/impact_categories.py
Original file line number Diff line number Diff line change
@@ -1,91 +1,111 @@
# -*- coding: utf-8 -*-
import numbers
from PyQt5 import QtWidgets

import brightway2 as bw
from pandas import DataFrame
from PyQt5 import QtWidgets

from activity_browser.app.signals import signals

from . table import ABTableWidget, ABTableItem
from ...signals import signals
from .views import ABDataFrameView, dataframe_sync


class MethodsTable(ABTableWidget):
HEADERS = ["Name", "Unit", "# CFs"]
def __init__(self):
super(MethodsTable, self).__init__()
class MethodsTable(ABDataFrameView):
HEADERS = ["Name", "Unit", "# CFs", "method"]

def __init__(self, parent=None):
super().__init__(parent)
self.drag_model = True
self.setDragEnabled(True)
self.setColumnCount(len(self.HEADERS))
self.setSizePolicy(QtWidgets.QSizePolicy(
QtWidgets.QSizePolicy.Preferred,
QtWidgets.QSizePolicy.Maximum)
)
self.connect_signals()
self.setDragDropMode(ABDataFrameView.DragOnly)
self.sync()
self._connect_signals()

def connect_signals(self):
self.itemDoubleClicked.connect(
lambda x: signals.method_selected.emit(x.method)
)
def _connect_signals(self):
self.doubleClicked.connect(self.method_selected)
signals.project_selected.connect(self.sync)

@ABTableWidget.decorated_sync
def sync(self, query=None):
self.setHorizontalHeaderLabels(self.HEADERS)
def method_selected(self, proxy):
index = self.get_source_index(proxy)
method = self.dataframe.iloc[index.row(), ]["method"]
signals.method_selected.emit(method)

def selectedItems(self) -> list:
""" Use to retrieve the method objects for the selected rows.
NOTE: Shadows the `selectedItems` method in QTableWidget as it is used
by `CSMethodsTable`. Possibly remove or improve in the future.
"""
indexes = [self.get_source_index(p) for p in self.selectedIndexes()]
return [
self.dataframe.iloc[index.row(), ] for index in indexes
]

@dataframe_sync
def sync(self, query=None):
sorted_names = sorted([(", ".join(method), method) for method in bw.methods])

if query:
sorted_names = [
obj for obj in sorted_names
if query.lower() in obj[0].lower()
]

self.setRowCount(len(sorted_names))

for row, method_obj in enumerate(sorted_names):
name, method = method_obj
data = bw.methods[method]
self.setItem(row, 0, ABTableItem(name, method=method))
self.setItem(row, 1, ABTableItem(data.get('unit', "Unknown"), method=method))
num_cfs = data.get('num_cfs', 0)
self.setItem(row, 2, ABTableItem(str(num_cfs), method=method, number=num_cfs, ))


class CFTable(ABTableWidget):
COLUMNS = {
0: "name",
1: "amount",
2: "unit",
3: "uncertain",
}
HEADERS = ["Name", "Category", "Amount", "Unit", "Uncertain"]

def __init__(self):
super(CFTable, self).__init__()
self.setVisible(False)
self.setColumnCount(len(self.HEADERS))
sorted_names = filter(
lambda obj: query.lower() in obj[0].lower(), sorted_names
)

data = []
for method_obj in sorted_names:
method = bw.methods[method_obj[1]]
row = {
"Name": method_obj[0],
"Unit": method.get("unit", "Unknown"),
"# CFs": str(method.get("num_cfs", 0)),
"method": method_obj[1],
}
data.append(row)
self.dataframe = DataFrame(data, columns=self.HEADERS)

def _resize(self):
self.setColumnHidden(3, True)
self.setSizePolicy(QtWidgets.QSizePolicy(
QtWidgets.QSizePolicy.Preferred,
QtWidgets.QSizePolicy.Maximum)
)
QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum
))


class CFTable(ABDataFrameView):
COLUMNS = [
"name",
"categories",
"amount",
"unit",
"uncertain",
]
HEADERS = ["Name", "Category", "Amount", "Unit", "Uncertain"] + ["key"]

@ABTableWidget.decorated_sync
def sync(self, method):
self.setHorizontalHeaderLabels(self.HEADERS)
def __init__(self, parent=None):
super().__init__(parent)
self.setVisible(False)

@dataframe_sync
def sync(self, method: tuple) -> None:
method = bw.Method(method)
data = method.load()
self.setRowCount(len(data))
for row, obj in enumerate(data):
method_data = method.load()
data = []
for obj in method_data:
key, amount = obj[:2]
flow = bw.get_activity(key)
if isinstance(amount, numbers.Number):
uncertain = "False"
else:
uncertain = "True"
amount = amount['amount']
self.setItem(row, 0, ABTableItem(flow['name'], key=key))
self.setItem(row, 1, ABTableItem(str(flow['categories']), key=key))
self.setItem(row, 1, ABTableItem(str(flow['categories']), key=key))
self.setItem(row, 2, ABTableItem("{:.6g}".format(amount), key=key))
self.setItem(row, 3, ABTableItem(flow.get('unit', 'Unknown'), key=key))
self.setItem(row, 4, ABTableItem(str(uncertain), key=key))
row = {
self.HEADERS[i]: flow.get(self.COLUMNS[i])
for i in range(len(self.COLUMNS))
}
row.update({"Amount": amount, "Uncertain": uncertain, "key": key})
data.append(row)
self.dataframe = DataFrame(data, columns=self.HEADERS)

def _resize(self):
self.setColumnHidden(5, True)
self.setSizePolicy(QtWidgets.QSizePolicy(
QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum
))

0 comments on commit b5093e3

Please sign in to comment.