def update_mru_menu_items(mru_file_list: List[str], mru_menu: QMenu, file_open_action: Callable[[str], None], current_file_name: str, clear_all_actions: Callable[[None], None] = None): # look for a separator below the item list act_separator = None act_clear = None for act in mru_menu.actions(): if act.isSeparator(): act_separator = act elif act.data() == 'clearall': act_clear = act if act_clear and act_separator: break if not act_separator: act_separator = mru_menu.addSeparator() if not act_clear: if clear_all_actions: act_clear = mru_menu.addAction('Clear all') act_clear.setData('clearall') act_clear.triggered.connect(clear_all_actions) act_clear.setVisible(len(mru_file_list) > 0) else: act_clear.setVisible(clear_all_actions is not None and len(mru_file_list) > 0) action_idx = -1 home_dir = os.path.expanduser('~') for idx, file_name in enumerate(mru_file_list): if file_name.find(home_dir) == 0: short_file_name = '~' + file_name[len(home_dir):] else: short_file_name = file_name action_idx += 1 if action_idx < len(mru_menu.actions()) and not mru_menu.actions()[action_idx].isSeparator(): act = mru_menu.actions()[action_idx] act.setText(short_file_name) else: act = QAction(short_file_name, mru_menu) mru_menu.insertAction(act_separator, act) act.triggered.disconnect() act.triggered.connect(partial(file_open_action, file_name)) act.setVisible(True) act.setCheckable(True) if file_name == current_file_name: act.setChecked(True) else: act.setChecked(False) # hide all unused actions action_idx += 1 for idx in range(action_idx, len(mru_menu.actions())): act = mru_menu.actions()[idx] if not (act.isSeparator() or act.data() == 'clearall'): act.setVisible(False) mru_menu.update()