sort menu items
This commit is contained in:
@@ -1,11 +1,51 @@
|
||||
from raven.plugins.domain.raction import RAction
|
||||
from raven.plugins.domain.rmenu import RMenu
|
||||
|
||||
id_counter = 0
|
||||
|
||||
|
||||
def next_id() -> str:
|
||||
global id_counter
|
||||
id_counter = id_counter + 1
|
||||
return "action_%d" % id_counter
|
||||
|
||||
|
||||
class MenuContribution():
|
||||
def __init__(self, menu_id: str, action: RAction = None, menu: RMenu = None, action_id=None):
|
||||
def __init__(self,
|
||||
menu_id: str,
|
||||
action: RAction = None,
|
||||
menu: RMenu = None,
|
||||
action_id=None,
|
||||
after=None):
|
||||
super(MenuContribution, self).__init__()
|
||||
self.menu_id = menu_id
|
||||
self.action = action
|
||||
self.menu = menu
|
||||
self.action_id = action_id
|
||||
self.action_id = action_id if action_id else next_id()
|
||||
self.after = after
|
||||
|
||||
|
||||
def _sort_by_action_id(menu_contributions: [MenuContribution]) -> [MenuContribution]:
|
||||
return sorted(menu_contributions, key=lambda mc: mc.action_id)
|
||||
|
||||
|
||||
def sort_menu_contributions(menu_contributions: [MenuContribution]) -> [MenuContribution]:
|
||||
result = []
|
||||
items = _sort_by_action_id(menu_contributions[:])
|
||||
|
||||
_recursive_half_order_adder(result, items, None)
|
||||
|
||||
# add remaining items to the end (ordered by their action_id)
|
||||
# This resolves cycles.
|
||||
for item in items:
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
|
||||
def _recursive_half_order_adder(result: [MenuContribution], items: [MenuContribution], parent):
|
||||
for item in items:
|
||||
mc: MenuContribution = item
|
||||
if not mc.after:
|
||||
result.append(mc)
|
||||
items.remove(mc)
|
||||
_recursive_half_order_adder(result, items, mc.action_id)
|
||||
|
||||
Reference in New Issue
Block a user