예제 #1
1
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()