|
5 | 5 | from .sheets import apply_group_selection |
6 | 6 | from .state import TabStackWindowState |
7 | 7 |
|
| 8 | +SHOW_PANEL_DELAY_MS = 150 |
| 9 | + |
| 10 | + |
| 11 | +def _ensure_ctrl_release_poller(window, state) -> None: |
| 12 | + if state.ctrl_release_poller: |
| 13 | + return |
| 14 | + |
| 15 | + def on_release() -> None: |
| 16 | + if state.session_active: |
| 17 | + _commit_session(window, state) |
| 18 | + elif state.session_pending: |
| 19 | + state.clear_session() |
| 20 | + |
| 21 | + state.ctrl_release_poller = CtrlReleasePoller(on_release, 25) |
| 22 | + state.ctrl_release_poller.start() |
| 23 | + |
8 | 24 |
|
9 | 25 | def show_panel(window, state) -> None: |
10 | 26 | if not state.session_active or not state.session_entries: |
@@ -33,12 +49,23 @@ def on_highlight(index: int) -> None: |
33 | 49 | placeholder="Release ctrl to close; Hit ctrl+escape to abort", |
34 | 50 | ) |
35 | 51 |
|
36 | | - if not state.ctrl_release_poller: |
37 | | - state.ctrl_release_poller = CtrlReleasePoller( |
38 | | - lambda: _commit_session(window, state), |
39 | | - 25, |
40 | | - ) |
41 | | - state.ctrl_release_poller.start() |
| 52 | + _ensure_ctrl_release_poller(window, state) |
| 53 | + |
| 54 | + |
| 55 | +def schedule_panel(window, state, *, token: int) -> None: |
| 56 | + _ensure_ctrl_release_poller(window, state) |
| 57 | + |
| 58 | + def open_if_still_pending() -> None: |
| 59 | + if not state.session_pending or state.session_pending_token != token: |
| 60 | + return |
| 61 | + if state.ctrl_release_poller is not None and not state.ctrl_release_poller.is_ctrl_down(): |
| 62 | + state.clear_session() |
| 63 | + return |
| 64 | + state.session_active = True |
| 65 | + state.session_pending = False |
| 66 | + show_panel(window, state) |
| 67 | + |
| 68 | + sublime.set_timeout(open_if_still_pending, SHOW_PANEL_DELAY_MS) |
42 | 69 |
|
43 | 70 |
|
44 | 71 | def preview_entry(window, state: TabStackWindowState) -> None: |
@@ -71,6 +98,9 @@ def _commit_session(window, state) -> None: |
71 | 98 |
|
72 | 99 | def cancel_session(window, state) -> None: |
73 | 100 | if not state.session_active: |
| 101 | + if not state.session_pending: |
| 102 | + return |
| 103 | + state.clear_session() |
74 | 104 | return |
75 | 105 |
|
76 | 106 | origin = state.session_origin_selection |
|
0 commit comments