diff --git a/porcupine/plugins/directory_tree.py b/porcupine/plugins/directory_tree.py index ba29b8685..f13e0efa3 100644 --- a/porcupine/plugins/directory_tree.py +++ b/porcupine/plugins/directory_tree.py @@ -93,15 +93,13 @@ def __init__(self, master: tkinter.Misc) -> None: # Needs after_idle because selection hasn't updated when binding runs self.bind("", self._on_click, add=True) + self.bind("", self._on_double_click, add=True) self.bind("<>", self.open_file_or_dir, add=True) self.bind("<>", self._config_tags, add=True) self.column("#0", minwidth=500) # allow scrolling sideways self._config_tags() - self._last_click_time = 0 # Very long time since previous click, no double click - self._last_click_item: str | None = None - self._project_num_counter = 0 self.contextmenu = tkinter.Menu(tearoff=False) @@ -118,6 +116,19 @@ def set_the_selection_correctly(self, id: str) -> None: self.selection_set(id) self.focus(id) + def _on_double_click(self, event: tkinter.Event[DirectoryTree]) -> str | None: + item = self.identify_row(event.y) + if not item: + return None + self.set_the_selection_correctly(item) + + if item.startswith("file"): + self.open_file_or_dir() + return "break" + + # If it's not a file, treat the double-click as two single clicks. + return None + def _on_click(self, event: tkinter.Event[DirectoryTree]) -> str | None: self.tk.call("focus", self) @@ -126,27 +137,13 @@ def _on_click(self, event: tkinter.Event[DirectoryTree]) -> str | None: if not item: return None - # Couldn't get to work, so I wrote a program to - # measure max time between double clicks. It's 500ms on my system. - double_click = event.time - self._last_click_time < 500 and self._last_click_item == item - self.set_the_selection_correctly(item) - if item.startswith("file:"): - if double_click: + + if item.startswith(("dir", "project")): + self.item(item, open=(not self.item(item, "open"))) + if self.item(item, "open"): self.open_file_or_dir() - else: - little_arrow_clicked = self.identify_element(event.x, event.y) == "Treeitem.indicator" - if double_click or little_arrow_clicked: - self.item(item, open=(not self.item(item, "open"))) - if self.item(item, "open"): - self.open_file_or_dir() - - self._last_click_item = item - if double_click: - # Prevent getting two double clicks with 3 quick subsequent clicks - self._last_click_time = 0 - else: - self._last_click_time = event.time + return "break" def _config_tags(self, junk: object = None) -> None: