Skip to content

Commit c765ed1

Browse files
committed
Merge branch 'major' into major-database-deletion
2 parents ef150fc + d425ece commit c765ed1

6 files changed

Lines changed: 264 additions & 68 deletions

File tree

activity_browser/layouts/pages/activity_details/exchanges_tab.py

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def dragEnterEvent(self, event):
195195
return
196196

197197
if event.mimeData().hasFormat("application/bw-nodekeylist"):
198-
self.overlay = DropOverlay(self)
198+
self.overlay = widgets.ABDropOverlay(self)
199199
self.overlay.show()
200200
event.accept()
201201

@@ -239,28 +239,6 @@ def get_exchange_type(activity_key: tuple) -> str | None:
239239
return None
240240

241241

242-
class DropOverlay(QtWidgets.QWidget):
243-
def __init__(self, parent=None):
244-
super().__init__(parent)
245-
self.setAttribute(Qt.WA_TransparentForMouseEvents)
246-
self.setAttribute(Qt.WA_NoSystemBackground)
247-
self.setAttribute(Qt.WA_TranslucentBackground)
248-
self.setAutoFillBackground(False)
249-
self.resize(parent.size())
250-
251-
def paintEvent(self, event):
252-
painter = QtGui.QPainter(self)
253-
painter.setRenderHint(QtGui.QPainter.Antialiasing)
254-
painter.fillRect(self.rect(), QtGui.QColor(0, 100, 255, 200)) # Semi-transparent blue
255-
painter.setPen(Qt.white)
256-
257-
font = self.font()
258-
font.setBold(True)
259-
260-
painter.setFont(font)
261-
painter.drawText(self.rect(), Qt.AlignCenter, "Drop here to create new exchanges")
262-
263-
264242
class RelinkDelegate(delegates.StringDelegate):
265243
matched: pd.DataFrame
266244
column: str

activity_browser/layouts/pages/activity_details/graph_tab.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import bw_functional as bf
1010

1111
from activity_browser import static, bwutils, actions
12-
from .exchanges_tab import DropOverlay, get_exchange_type
12+
from activity_browser.ui import widgets
13+
from .exchanges_tab import get_exchange_type
1314

1415
log = getLogger(__name__)
1516

@@ -208,7 +209,7 @@ def dragEnterEvent(self, event):
208209
return
209210

210211
if event.mimeData().hasFormat("application/bw-nodekeylist"):
211-
self.overlay = DropOverlay(self)
212+
self.overlay = widgets.ABDropOverlay(self)
212213
self.overlay.show()
213214
event.accept()
214215

activity_browser/layouts/pages/impact_category_details/impact_category_details.py

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from activity_browser import actions, signals
88
from activity_browser.ui import widgets, icons, delegates
9-
from activity_browser.bwutils import AB_metadata
9+
from activity_browser.bwutils import AB_metadata, is_node_biosphere
1010

1111
from .impact_category_header import ImpactCategoryHeader
1212

@@ -16,6 +16,7 @@ def __init__(self, name: tuple, parent=None):
1616
super().__init__(parent)
1717
self.name = name
1818
self.impact_category = bd.Method(name)
19+
self.is_editable = False
1920

2021
self.setObjectName(" | ".join(name))
2122

@@ -74,8 +75,9 @@ def build_df(self):
7475

7576
df = df.merge(other, left_on="id", right_on="id").rename(columns={"id": "_id", "data": "_cf"})
7677
df["_impact_category_name"] = [self.name for i in range(len(df))]
78+
df["_editable"] = self.is_editable
7779

78-
cols = ["name", "categories", "database", "amount", "unit", "uncertainty", "_id", "_impact_category_name", "_cf"]
80+
cols = ["name", "categories", "database", "amount", "unit", "uncertainty", "_id", "_impact_category_name", "_cf", "_editable"]
7981
return df[cols]
8082

8183

@@ -86,7 +88,91 @@ class CharacterizationFactorsView(widgets.ABTreeView):
8688
"uncertainty": delegates.UncertaintyDelegate,
8789
}
8890

91+
class ContextMenu(widgets.ABMenu):
92+
menuSetup = [
93+
lambda m: m.add(actions.CFRemove, m.impact_category_name, m.char_factors,
94+
enable=bool(m.char_factors) and m.is_editable,
95+
text="Remove characterization factor(s)"),
96+
]
8997

98+
@property
99+
def is_editable(self):
100+
return self.parent().parent().is_editable
101+
102+
@property
103+
def impact_category_name(self):
104+
return self.parent().parent().name
105+
106+
@property
107+
def char_factors(self):
108+
indexes = self.parent().selectedIndexes()
109+
return [(idx.internalPointer()["_id"], idx.internalPointer()["_cf"])
110+
for idx in indexes if idx.isValid() and idx.column() == 0]
111+
112+
def __init__(self, parent):
113+
super().__init__(parent)
114+
self.setAcceptDrops(True)
115+
self.setSortingEnabled(True)
116+
self.overlay = None
117+
118+
def dragEnterEvent(self, event):
119+
"""
120+
Handles the drag enter event.
121+
122+
Args:
123+
event: The drag enter event.
124+
"""
125+
if not self.parent().is_editable:
126+
event.ignore()
127+
return
128+
129+
if event.mimeData().hasFormat("application/bw-nodekeylist"):
130+
self.overlay = widgets.ABDropOverlay(self)
131+
self.overlay.show()
132+
event.accept()
133+
else:
134+
event.ignore()
135+
136+
def dragMoveEvent(self, event):
137+
"""Handles the drag move event - required for proper drop indicator."""
138+
if not self.parent().is_editable:
139+
event.ignore()
140+
return
141+
142+
if event.mimeData().hasFormat("application/bw-nodekeylist"):
143+
event.accept()
144+
else:
145+
event.ignore()
146+
147+
def dragLeaveEvent(self, event):
148+
"""
149+
Handles the drag leave event.
150+
151+
Args:
152+
event: The drag leave event.
153+
"""
154+
if not self.overlay is None:
155+
# Reset the palette on drag leave
156+
self.overlay.deleteLater()
157+
self.overlay = None
158+
159+
def dropEvent(self, event):
160+
"""
161+
Handles the drop event.
162+
163+
Args:
164+
event: The drop event.
165+
"""
166+
self.overlay.deleteLater()
167+
self.overlay = None
168+
169+
keys: list = event.mimeData().retrievePickleData("application/bw-nodekeylist")
170+
171+
# Filter to only biosphere flows
172+
biosphere_keys = [key for key in keys if is_node_biosphere(key)]
173+
174+
if biosphere_keys:
175+
actions.CFNew.run(self.parent().name, biosphere_keys)
90176

91177

92178
class ExchangesItem(widgets.ABDataItem):
@@ -102,7 +188,8 @@ def flags(self, col: int, key: str):
102188
QtCore.Qt.ItemFlags: The item flags.
103189
"""
104190
flags = super().flags(col, key)
105-
if key in ["amount", "uncertainty"]:
191+
192+
if key in ["amount", "uncertainty"] and self["_editable"]:
106193
return flags | Qt.ItemFlag.ItemIsEditable
107194
return flags
108195

0 commit comments

Comments
 (0)