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