52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
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,
|
|
after=None):
|
|
super(MenuContribution, self).__init__()
|
|
self.menu_id = menu_id
|
|
self.action = action
|
|
self.menu = menu
|
|
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)
|