66
77from activity_browser import actions , signals
88from 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
1111from .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
92178class 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