4141import  queueHandler 
4242import  ui 
4343
44- from  ...ruleHandler  import  GestureScope , Rule , Result , Zone , ruleTypes 
44+ from  ...ruleHandler  import  Criteria ,  GestureScope , Rule , Result ,  Selector , Zone , ruleTypes 
4545from  ...utils  import  guarded 
4646from  ...webModuleHandler  import  getEditableWebModule , save 
4747from  .. import  ContextualDialog , showContextualDialog , stripAccel 
@@ -85,7 +85,13 @@ def show(context, parent=None):
8585TreeItemData  =  namedtuple ("TreeItemData" , ("label" , "obj" , "children" ))
8686
8787
88- def  getCriteriaLabel (criteria ):
88+ def  getCriteriaOrSelectorLabel (criteriaOrSelector ):
89+ 	if  isinstance (criteriaOrSelector , Criteria ):
90+ 		criteria  =  criteriaOrSelector 
91+ 		selector  =  None 
92+ 	elif  isinstance (criteriaOrSelector , Selector ):
93+ 		selector  =  criteriaOrSelector 
94+ 		criteria  =  selector .criteria 
8995	rule  =  criteria .rule 
9096	label  =  rule .name 
9197	if  len (rule .criteria ) >  1 :
@@ -98,6 +104,13 @@ def getCriteriaLabel(criteria):
98104			inputCore .getDisplayTextForGestureIdentifier (identifier )[1 ]
99105			for  identifier  in  list (rule ._gestureMap .keys ())
100106		))
107+ 	if  selector  is  not None :
108+ 		if  selector  is  criteria .startSelector :
109+ 			# Translators: A mention on the Rules Manager dialog for free zone selectors 
110+ 			label  +=  _ (" (start)" )
111+ 		elif  selector  is  criteria .endSelector :
112+ 			# Translators: A mention on the Rules Manager dialog for free zone selectors 
113+ 			label  +=  _ (" (end)" )
101114	return  label 
102115
103116
@@ -208,13 +221,16 @@ def getRulesByContext(ruleManager, filter=None, active=False):
208221			alternatives  =  (result .criteria  for  result  in  results )
209222		else :
210223			alternatives  =  (criteria  for  criteria  in  rule .criteria )
211- 		for  criteria  in  alternatives :
224+ 		for  selector  in  (
225+ 			s  for  c  in  alternatives  for  s  in  ( c .nodeSelector , c .startSelector , c .endSelector )
226+ 			if  s  is  not None 
227+ 		):
212228			contexts .setdefault ((
213- 				criteria .contextPageTitle  or  "" ,  # Avoiding None eases later sorting 
214- 				criteria .contextPageType  or  "" ,
215- 				criteria .contextParent  or  "" ,
229+ 				selector .contextPageTitle  or  "" ,  # Avoiding None eases later sorting 
230+ 				selector .contextPageType  or  "" ,
231+ 				selector .contextParent  or  "" ,
216232			), []).append (TreeItemData (
217- 				label = getCriteriaLabel ( criteria ),
233+ 				label = getCriteriaOrSelectorLabel ( selector ),
218234				obj = rule ,
219235				children = []
220236			))
@@ -237,11 +253,20 @@ def getRulesByContext(ruleManager, filter=None, active=False):
237253		else :
238254			# Translators: A context grouping label on the Rules Manager 
239255			label  =  "General" 
240- 		yield  TreeItemData (
241- 			label = label ,
242- 			obj = None ,
243- 			children = sorted (tids , key = lambda  tid : tid .label )
244- 		)
256+ 		
257+ 		def  sortKey (tld ):
258+ 			label  =  tld .label 
259+ 			for  index , suffix  in  (
260+ 				# Translators: A mention on the Rules Manager dialog for free zone selectors 
261+ 				(0 , _ (" (end)" )),
262+ 				# Translators: A mention on the Rules Manager dialog for free zone selectors 
263+ 				(1 , _ (" (end)" )),
264+ 			):
265+ 				if  label .endswith (suffix ):
266+ 					label  =  label [:- len (suffix )] +  str (index )
267+ 			return  label 
268+ 		
269+ 		yield  TreeItemData (label = label , obj = None , children = sorted (tids , key = sortKey ))
245270
246271
247272def  getRulesByName (ruleManager , filter = None , active = False ):
@@ -283,7 +308,7 @@ def getRulesByPosition(ruleManager, filter=None, active=True):
283308		if  layer  and  rule .layer  !=  layer :
284309			continue 
285310		tid  =  TreeItemData (
286- 			label = getCriteriaLabel (result .criteria ),
311+ 			label = getCriteriaOrSelectorLabel (result .criteria ),
287312			obj = result ,
288313			children = []
289314		)
0 commit comments