-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy paththread_progress.py
92 lines (71 loc) · 2.99 KB
/
thread_progress.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
Copied from:
https://github.com/wbond/package_control/blob/master/package_control/thread_progress.py
with the following licence:
Copyright (c) 2011-2016 Will Bond <[email protected]>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
"""
import sublime
class ThreadProgress():
"""
Animates an indicator, [= ], in the status area while a thread runs
:param thread:
The thread to track for activity
:param message:
The message to display next to the activity indicator
:param success_message:
The message to display once the thread is complete
"""
def __init__(self, thread, message, success_message):
self.thread = thread
self.message = message
self.success_message = success_message
self.addend = 1
self.size = 8
self.last_view = None
self.window = None
sublime.set_timeout(lambda: self.run(0), 100)
def run(self, i):
if self.window is None:
self.window = sublime.active_window()
active_view = self.window.active_view()
if self.last_view is not None and active_view != self.last_view:
self.last_view.erase_status('_pandoc')
self.last_view = None
if not self.thread.is_alive():
def cleanup():
active_view.erase_status('_pandoc')
if hasattr(self.thread, 'result') and not self.thread.result:
cleanup()
return
active_view.set_status('_pandoc', self.success_message)
sublime.set_timeout(cleanup, 1000)
return
before = i % self.size
after = (self.size - 1) - before
active_view.set_status(
'_pandoc',
'%s [%s=%s]' % (self.message, ' ' * before, ' ' * after)
)
if self.last_view is None:
self.last_view = active_view
if not after:
self.addend = -1
if not before:
self.addend = 1
i += self.addend
sublime.set_timeout(lambda: self.run(i), 100)