Files
krowlog/src/plugins/domain/menucontribution.py

84 lines
2.6 KiB
Python

from src.plugins.domain.raction import RAction
from src.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[:])
for item in items:
mc: MenuContribution = item
if not mc.after:
result.append(mc)
items.remove(mc)
result = result + _new_recursive(mc.action_id, items)
# _recursive_half_order_adder(result, items)
# add remaining items to the end (ordered by their action_id)
# This resolves cycles.
for item in items:
if result.count(item) == 0:
result.append(item)
return result
def _new_recursive(current_action_id: str, items: [MenuContribution]) -> [MenuContribution]:
result = []
for item in items:
mc: MenuContribution = item
# print("%s checking %s" % (current_action_id, mc.action_id))
if mc.after == current_action_id:
#print("%s adding %s" % (current_action_id, mc.action_id))
result.append(mc)
result = result + _new_recursive(mc.action_id, items)
return result
def _recursive_half_order_adder(result: [MenuContribution], items: [MenuContribution]):
#print("%s -- %s" % ([mc.action_id for mc in result], [mc.action_id for mc in items]))
for item in items:
mc: MenuContribution = item
if mc.after:
index = 0
for r in result:
index = index + 1
mc_in_result: MenuContribution = r
if mc.after == mc_in_result.action_id:
result.insert(index, mc)
items.remove(mc)
_recursive_half_order_adder(result, items)
if not mc.after:
result.append(mc)
items.remove(mc)
_recursive_half_order_adder(result, items)