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)