Merge lp:~erigami/dockmanager/workrave_helper_improvements into lp:dockmanager

Proposed by Erigami
Status: Merged
Merged at revision: 74
Proposed branch: lp:~erigami/dockmanager/workrave_helper_improvements
Merge into: lp:dockmanager
Diff against target: 185 lines (+71/-33)
1 file modified
scripts/workrave_helper.py (+71/-33)
To merge this branch: bzr merge lp:~erigami/dockmanager/workrave_helper_improvements
Reviewer Review Type Date Requested Status
Robert Dyer (community) Approve
Erigami (community) Needs Resubmitting
Review via email: mp+40797@code.launchpad.net

Description of the change

I've made a couple of improvements to the workrave helper. Could they be merged in?

The changes are:
  - Hide seconds on launcher until we're under 5 min
  - Show a tooltip with the exact amount of time left for all launchers
  - remove unused variables

I've tested with both AWN and Docky.

To post a comment you must log in.
Revision history for this message
Erigami (erigami) wrote :

Bump.

review: Needs Resubmitting
Revision history for this message
Robert Dyer (psybers) :
review: Approve
Revision history for this message
Erigami (erigami) wrote :

Thanks!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'scripts/workrave_helper.py'
--- scripts/workrave_helper.py 2010-10-07 22:25:27 +0000
+++ scripts/workrave_helper.py 2010-11-13 22:28:59 +0000
@@ -35,6 +35,11 @@
35 print `e`35 print `e`
36 exit()36 exit()
3737
38break_names = {
39 'micro_pause' : "Micro break",
40 'rest_break' : 'Rest break',
41 'daily_limit' : 'Daily limit'
42}
3843
39class Workrave:44class Workrave:
40 """Interface to Workrave."""45 """Interface to Workrave."""
@@ -49,13 +54,16 @@
49 def findNextEnd(self):54 def findNextEnd(self):
50 """Find the next timer to go off.55 """Find the next timer to go off.
5156
52 Returns a tuple of (seconds-until-timer-ends, length-of-timer, name-of-timer), 57 Returns an array of tuples. Each typle consists of
58 (seconds-until-timer-ends, length-of-timer, time-timer-ends, name-of-timer),
53 where the timer is the next timer scheduled to end.59 where the timer is the next timer scheduled to end.
60
61 If there are no ticking timers, an empty array is returned.
54 """62 """
55 # Pick a really large number for the next timer63 # Pick a really large number for the next timer
56 remaining = 2 ** 1864 remaining = 2 ** 18
57 remainingName = None
5865
66 toReturn = []
59 for (timerName, configName) in [['microbreak', 'micro_pause'], ['restbreak', 'rest_break'], ['dailylimit', 'daily_limit']]:67 for (timerName, configName) in [['microbreak', 'micro_pause'], ['restbreak', 'rest_break'], ['dailylimit', 'daily_limit']]:
60 if not self.workrave.IsTimerRunning(timerName):68 if not self.workrave.IsTimerRunning(timerName):
61 continue69 continue
@@ -65,15 +73,16 @@
6573
66 elapsed = self.workrave.GetTimerElapsed(timerName)74 elapsed = self.workrave.GetTimerElapsed(timerName)
67 r = length - elapsed75 r = length - elapsed
68 remaining = min(remaining, r)76
69 if r == remaining:77 tuple = (r, length, r + time.time(), configName)
70 remainingName = timerName78 toReturn.append(tuple)
7179
72 if remainingName == None:80 def c(a, b):
73 return (None, None, None)81 return cmp(a[0], b[0])
7482
75 return (remaining, length, remainingName)83 toReturn.sort(c)
7684
85 return toReturn
7786
7887
79class WorkraveWatcher:88class WorkraveWatcher:
@@ -82,16 +91,16 @@
82 def __init__(self):91 def __init__(self):
83 self.wr = Workrave()92 self.wr = Workrave()
84 self.dock_item = None93 self.dock_item = None
85 self.next_break = 0
86 self.workrave_state = None94 self.workrave_state = None
95 self.breaks = []
87 self.timers = []96 self.timers = []
8897
8998
90 def on_service_change(self, bus, conn):99 def on_service_change(self, bus, conn):
91 if "" == conn:100 if "" == conn:
92 # Workrave has gone away101 # Workrave has gone away
93 self.next_break = 0
94 self.workrave_state = None102 self.workrave_state = None
103 self.breaks = []
95 104
96 for timer in self.timers:105 for timer in self.timers:
97 gobject.source_remove(timer)106 gobject.source_remove(timer)
@@ -119,49 +128,77 @@
119128
120 def __state_change(self, timer, progress):129 def __state_change(self, timer, progress):
121 self.workrave_state = progress130 self.workrave_state = progress
122131 self.__poll_workrave()
123 if progress == 'none':
124 self.next_break = 0
125132
126133
127 def __poll_workrave(self):134 def __poll_workrave(self):
128 (rem, length, timer) = self.wr.findNextEnd()135 self.breaks = self.wr.findNextEnd()
129 if not rem == None:
130 self.next_break = rem + time.time()
131 self.duration = length
132136
133 return True137 return True
134138
135
136 def __update_ui(self):139 def __update_ui(self):
137 message = ""140 message = ""
138 progress = 0141 progress = 0
139 if self.workrave_state == 'break':142 if self.workrave_state == 'break':
140 message = 'Break'143 message = 'Break'
141 else:144 else:
142 if self.next_break <= 0:145 next_break = 0
143 message = "(paused)"146 duration = 0
147 if len(self.breaks) > 0:
148 next_break = self.breaks[0][2]
149 duration = self.breaks[0][1]
150
151 if next_break <= 0:
152 message = "(pause)"
144 else:153 else:
145 rem = self.next_break - time.time()154 rem = next_break - time.time()
155 message = self.__humanize_time(rem)
146 if rem < 0:156 if rem < 0:
147 minutes = -1 * math.ceil(float(rem) / 60)
148 seconds = (-1 * rem) % 60
149 message = "-%i:%02i" % (minutes, seconds)
150 progress = 100157 progress = 100
151 else:158 else:
152 minutes = int(rem / 60)159 progress = 100 - int(100 * (float(rem) / float(duration)))
153 seconds = rem % 60
154 message = "%i:%02i" % (minutes, seconds)
155
156 progress = 100 - int(100 * (float(rem) / float(self.duration)))
157160
158 if self.dock_item:161 if self.dock_item:
159 self.dock_item.set_message(message)162 self.dock_item.set_message(message)
160 self.dock_item.set_progress(progress)163 self.dock_item.set_progress(progress)
164 self.dock_item.set_tooltip(self.__calculate_tooltip())
161165
162 return True166 return True
163167
164168 def __calculate_tooltip(self):
169 toReturn = ''
170
171 for timer in self.breaks:
172 if len(toReturn) > 0:
173 toReturn = toReturn + ", "
174
175 secondsLeft = int(timer[2] - time.time())
176 msg = self.__humanize_time(secondsLeft, False)
177 toReturn = toReturn + ("%s in %s" % (break_names[timer[3]], msg))
178
179 if len(toReturn) == 0:
180 toReturn = 'Workrave'
181
182 toReturn = toReturn + " "
183
184 return toReturn
185
186
187 def __humanize_time(self, rem, hide_seconds=True):
188 if rem < 0:
189 minutes = -1 * math.ceil(float(rem) / 60)
190 seconds = (-1 * rem) % 60
191 message = "-%i:%02i" % (minutes, seconds)
192 else:
193 minutes = int(rem / 60)
194 seconds = rem % 60
195 if hide_seconds and minutes >= 5:
196 message = "%im" % minutes
197 else:
198 message = "%i:%02i" % (minutes, seconds)
199
200 return message
201
165 def register_dock_item(self, item):202 def register_dock_item(self, item):
166 self.dock_item = item203 self.dock_item = item
167204
@@ -210,6 +247,7 @@
210247
211sink = WorkraveSink()248sink = WorkraveSink()
212249
250
213if __name__ == "__main__":251if __name__ == "__main__":
214 bus = dbus.SessionBus()252 bus = dbus.SessionBus()
215 bus.watch_name_owner("org.workrave.Workrave", lambda x: watcher.on_service_change(bus, x))253 bus.watch_name_owner("org.workrave.Workrave", lambda x: watcher.on_service_change(bus, x))

Subscribers

People subscribed via source and target branches

to status/vote changes: