Exemplo n.º 1
0
def on_new_tab(tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):
        tab.settings.add_option("langserver", None, Optional[LangServerConfig])

        tab.bind(
            "<<TabSettingChanged:langserver>>", partial(switch_langservers, tab, False), add=True
        )
        tab.bind("<<PathChanged>>", partial(switch_langservers, tab, True), add=True)
        switch_langservers(tab, False)
Exemplo n.º 2
0
    def __init__(self, master: tkinter.BaseWidget, tab: tabs.Tab):
        super().__init__(master)
        self.tab = tab
        # one label for each tab-separated thing
        self.labels = [ttk.Label(self)]
        self.labels[0].pack(side='left')

        tab.bind('<<StatusChanged>>', self.do_update, add=True)
        self.do_update()
Exemplo n.º 3
0
def on_new_tab(tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):
        setup_displayers(tab)
        # https://github.com/python/mypy/issues/9658
        tab.bind("<<Reloaded>>", (lambda event: setup_displayers(tab)), add=True)  # type: ignore
        tab.textwidget.bind(
            "<Enter>",
            (
                # This runs after clicking "Use this" button, mouse <Enter>s text widget
                # Don't know why this needs a small timeout instead of after_idle
                lambda event: tab.after(50, tab.textwidget.event_generate, "<<UpdateLineNumbers>>")  # type: ignore
            ),
            add=True,
        )
Exemplo n.º 4
0
def on_new_tab(tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):
        # needed because pygments_lexer might change
        def on_lexer_changed(junk: object = None) -> None:
            assert isinstance(tab, tabs.FileTab)  # f u mypy
            highlighter.set_lexer(tab.settings.get("pygments_lexer", LexerMeta)())

        highlighter = Highlighter(tab.textwidget)
        tab.bind("<<TabSettingChanged:pygments_lexer>>", on_lexer_changed, add=True)
        on_lexer_changed()
        utils.bind_with_data(tab.textwidget, "<<ContentChanged>>", highlighter.on_change, add=True)
        utils.add_scroll_command(
            tab.textwidget, "yscrollcommand", debounce(tab, highlighter.highlight_visible, 100)
        )
        highlighter.highlight_visible()
Exemplo n.º 5
0
def on_new_tab(tab: tabs.Tab) -> None:
    if not isinstance(tab, tabs.FileTab):
        return

    tab.settings.add_option("autocomplete_chars", [], List[str])

    completer = AutoCompleter(tab)

    # no idea why backspace has to be bound separately
    utils.bind_with_data(tab.textwidget,
                         "<Key>",
                         completer.on_any_key,
                         add=True)
    tab.textwidget.bind("<BackSpace>", completer.on_any_key, add=True)

    utils.bind_tab_key(tab.textwidget, completer.on_tab, add=True)
    tab.textwidget.bind("<Return>", completer.on_enter, add=True)
    tab.textwidget.bind("<Escape>", completer.on_escape, add=True)
    tab.textwidget.bind("<Prior>", completer.popup.on_page_up_down, add=True)
    tab.textwidget.bind("<Next>", completer.popup.on_page_up_down, add=True)
    tab.textwidget.bind("<Up>", completer.popup.on_arrow_key_up_down, add=True)
    tab.textwidget.bind("<Down>",
                        completer.popup.on_arrow_key_up_down,
                        add=True)
    completer.popup.treeview.bind("<Button-1>",
                                  (lambda event: completer._accept()),
                                  add=True)

    # avoid weird corner cases
    tab.winfo_toplevel().bind("<FocusOut>",
                              (lambda event: completer._reject()),
                              add=True)
    tab.textwidget.bind(
        # any mouse button
        "<Button>",
        lambda event: completer._reject(),
        add=True,
    )

    tab.bind("<Destroy>", (lambda event: completer.popup.toplevel.destroy()),
             add=True)
Exemplo n.º 6
0
def on_new_tab(tree: DirectoryTree, tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):

        def path_callback(junk: object = None) -> None:
            assert isinstance(tab, tabs.FileTab)
            if tab.path is not None:
                tree.add_project(utils.find_project_root(tab.path))
                tree.refresh_everything(
                    when_done=partial(tree.select_file, tab.path))

        path_callback()

        tab.bind("<<AfterSave>>", path_callback, add=True)
        tab.bind("<<AfterSave>>", tree.hide_old_projects, add=True)
        tab.bind("<Destroy>", tree.hide_old_projects, add=True)
Exemplo n.º 7
0
def on_new_tab(tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):
        get_config_and_apply_to_tab(tab)
        tab.bind("<<PathChanged>>", partial(get_config_and_apply_to_tab, tab), add=True)
Exemplo n.º 8
0
 def on_new_tab(self, tab: tabs.Tab) -> None:
     self._frame.pack_forget()
     tab.bind("<Destroy>", self._on_tab_closed, add=True)
Exemplo n.º 9
0
def on_new_tab(tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):
        tab.settings.add_option("insert_final_newline", True)
        tab.bind("<<BeforeSave>>", on_save, add=True)
Exemplo n.º 10
0
def on_new_tab(tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):
        on_path_changed(tab)
        tab.bind("<<PathChanged>>", partial(on_path_changed, tab), add=True)
Exemplo n.º 11
0
def on_new_tab(tab: tabs.Tab) -> None:
    if isinstance(tab, tabs.FileTab):
        callback = partial(reload_if_necessary, tab)
        tab.bind("<<TabSelected>>", callback, add=True)
        tab.textwidget.bind("<FocusIn>", callback, add=True)
        tab.textwidget.bind("<Button-1>", callback, add=True)