'Show and execute the `EditLinksDialog`.
Optional `initial_links` list can provide a list of initial
`(source, sink)` channel tuples to show in the view, otherwise
the dialog is populated with existing links in the scheme (passing
an empty list will disable all initial links).'

def edit_links(self, source_node, sink_node, initial_links=None):

    (status, links_to_add, links_to_remove) = edit_links(self.scheme, source_node, sink_node, initial_links, parent=self.document)
    if (status == EditLinksDialog.Accepted):
        links_to_add = [scheme.SchemeLink(source_node, source_channel, sink_node, sink_channel) for (source_channel, sink_channel) in links_to_add]
        links_to_remove = [self.scheme.find_links(source_node, source_channel, sink_node, sink_channel) for (source_channel, sink_channel) in links_to_remove]
        links_to_remove = reduce(list.__add__, links_to_remove, [])
        conflicting = [_f for _f in [conflicting_single_link(self.scheme, link) for link in links_to_add] if _f]
        for link in conflicting:
            if (link not in links_to_remove):
                links_to_remove.append(link)
        return (status, links_to_add, links_to_remove)
    else:
        return (status, [], [])
