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
1=== modified file 'scripts/workrave_helper.py'
2--- scripts/workrave_helper.py 2010-10-07 22:25:27 +0000
3+++ scripts/workrave_helper.py 2010-11-13 22:28:59 +0000
4@@ -35,6 +35,11 @@
5 print `e`
6 exit()
7
8+break_names = {
9+ 'micro_pause' : "Micro break",
10+ 'rest_break' : 'Rest break',
11+ 'daily_limit' : 'Daily limit'
12+}
13
14 class Workrave:
15 """Interface to Workrave."""
16@@ -49,13 +54,16 @@
17 def findNextEnd(self):
18 """Find the next timer to go off.
19
20- Returns a tuple of (seconds-until-timer-ends, length-of-timer, name-of-timer),
21+ Returns an array of tuples. Each typle consists of
22+ (seconds-until-timer-ends, length-of-timer, time-timer-ends, name-of-timer),
23 where the timer is the next timer scheduled to end.
24+
25+ If there are no ticking timers, an empty array is returned.
26 """
27 # Pick a really large number for the next timer
28 remaining = 2 ** 18
29- remainingName = None
30
31+ toReturn = []
32 for (timerName, configName) in [['microbreak', 'micro_pause'], ['restbreak', 'rest_break'], ['dailylimit', 'daily_limit']]:
33 if not self.workrave.IsTimerRunning(timerName):
34 continue
35@@ -65,15 +73,16 @@
36
37 elapsed = self.workrave.GetTimerElapsed(timerName)
38 r = length - elapsed
39- remaining = min(remaining, r)
40- if r == remaining:
41- remainingName = timerName
42-
43- if remainingName == None:
44- return (None, None, None)
45-
46- return (remaining, length, remainingName)
47-
48+
49+ tuple = (r, length, r + time.time(), configName)
50+ toReturn.append(tuple)
51+
52+ def c(a, b):
53+ return cmp(a[0], b[0])
54+
55+ toReturn.sort(c)
56+
57+ return toReturn
58
59
60 class WorkraveWatcher:
61@@ -82,16 +91,16 @@
62 def __init__(self):
63 self.wr = Workrave()
64 self.dock_item = None
65- self.next_break = 0
66 self.workrave_state = None
67+ self.breaks = []
68 self.timers = []
69
70
71 def on_service_change(self, bus, conn):
72 if "" == conn:
73 # Workrave has gone away
74- self.next_break = 0
75 self.workrave_state = None
76+ self.breaks = []
77
78 for timer in self.timers:
79 gobject.source_remove(timer)
80@@ -119,49 +128,77 @@
81
82 def __state_change(self, timer, progress):
83 self.workrave_state = progress
84-
85- if progress == 'none':
86- self.next_break = 0
87+ self.__poll_workrave()
88
89
90 def __poll_workrave(self):
91- (rem, length, timer) = self.wr.findNextEnd()
92- if not rem == None:
93- self.next_break = rem + time.time()
94- self.duration = length
95+ self.breaks = self.wr.findNextEnd()
96
97 return True
98
99-
100 def __update_ui(self):
101 message = ""
102 progress = 0
103 if self.workrave_state == 'break':
104 message = 'Break'
105 else:
106- if self.next_break <= 0:
107- message = "(paused)"
108+ next_break = 0
109+ duration = 0
110+ if len(self.breaks) > 0:
111+ next_break = self.breaks[0][2]
112+ duration = self.breaks[0][1]
113+
114+ if next_break <= 0:
115+ message = "(pause)"
116 else:
117- rem = self.next_break - time.time()
118+ rem = next_break - time.time()
119+ message = self.__humanize_time(rem)
120 if rem < 0:
121- minutes = -1 * math.ceil(float(rem) / 60)
122- seconds = (-1 * rem) % 60
123- message = "-%i:%02i" % (minutes, seconds)
124 progress = 100
125 else:
126- minutes = int(rem / 60)
127- seconds = rem % 60
128- message = "%i:%02i" % (minutes, seconds)
129-
130- progress = 100 - int(100 * (float(rem) / float(self.duration)))
131+ progress = 100 - int(100 * (float(rem) / float(duration)))
132
133 if self.dock_item:
134 self.dock_item.set_message(message)
135 self.dock_item.set_progress(progress)
136+ self.dock_item.set_tooltip(self.__calculate_tooltip())
137
138 return True
139
140-
141+ def __calculate_tooltip(self):
142+ toReturn = ''
143+
144+ for timer in self.breaks:
145+ if len(toReturn) > 0:
146+ toReturn = toReturn + ", "
147+
148+ secondsLeft = int(timer[2] - time.time())
149+ msg = self.__humanize_time(secondsLeft, False)
150+ toReturn = toReturn + ("%s in %s" % (break_names[timer[3]], msg))
151+
152+ if len(toReturn) == 0:
153+ toReturn = 'Workrave'
154+
155+ toReturn = toReturn + " "
156+
157+ return toReturn
158+
159+
160+ def __humanize_time(self, rem, hide_seconds=True):
161+ if rem < 0:
162+ minutes = -1 * math.ceil(float(rem) / 60)
163+ seconds = (-1 * rem) % 60
164+ message = "-%i:%02i" % (minutes, seconds)
165+ else:
166+ minutes = int(rem / 60)
167+ seconds = rem % 60
168+ if hide_seconds and minutes >= 5:
169+ message = "%im" % minutes
170+ else:
171+ message = "%i:%02i" % (minutes, seconds)
172+
173+ return message
174+
175 def register_dock_item(self, item):
176 self.dock_item = item
177
178@@ -210,6 +247,7 @@
179
180 sink = WorkraveSink()
181
182+
183 if __name__ == "__main__":
184 bus = dbus.SessionBus()
185 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: