Make the whole wedge in the activity ring clickable. #2029

This commit is contained in:
Dan Winship 2007-08-02 14:14:21 -04:00
parent 4aeee4caa9
commit f52e55381a

View File

@ -147,6 +147,8 @@ class ActivitiesDonut(hippo.CanvasBox, hippo.CanvasItem):
self._model.connect('activity-removed', self._activity_removed_cb) self._model.connect('activity-removed', self._activity_removed_cb)
self._model.connect('active-activity-changed', self._activity_changed_cb) self._model.connect('active-activity-changed', self._activity_changed_cb)
self.connect('button-release-event', self._button_release_event_cb)
def _get_icon_from_activity(self, activity): def _get_icon_from_activity(self, activity):
for icon in self._activities: for icon in self._activities:
if icon.get_activity().equals(activity): if icon.get_activity().equals(activity):
@ -170,18 +172,49 @@ class ActivitiesDonut(hippo.CanvasBox, hippo.CanvasItem):
def _add_activity(self, activity): def _add_activity(self, activity):
icon = ActivityIcon(activity) icon = ActivityIcon(activity)
icon.connect('activated', self._activity_icon_clicked_cb)
self.append(icon, hippo.PACK_FIXED) self.append(icon, hippo.PACK_FIXED)
self._activities.append(icon) self._activities.append(icon)
self.emit_paint_needed(0, 0, -1, -1) self.emit_paint_needed(0, 0, -1, -1)
def _activity_icon_clicked_cb(self, icon): def _get_activity(self, x, y):
activity = icon.get_activity() # Compute the distance from the center.
[width, height] = self.get_allocation()
x -= width / 2
y -= height / 2
r = math.hypot(x, y)
# Ignore the click if it's not inside the donut
if r < self._get_inner_radius() or r > self._get_radius():
return None
# Now figure out where in the donut the click was.
angle = math.atan2(-y, -x) + math.pi
# Unfortunately, _get_angles() doesn't count from 0 to 2pi, it
# counts from roughly pi/2 to roughly 5pi/2. So we have to
# compare its return values against both angle and angle+2pi
high_angle = angle + 2 * math.pi
for index, activity in enumerate(self._model):
[angle_start, angle_end] = self._get_angles(index)
if angle_start < angle and angle_end > angle:
return activity
elif angle_start < high_angle and angle_end > high_angle:
return activity
return None
def _button_release_event_cb(self, item, event):
activity = self._get_activity(event.x, event.y)
if activity is None:
return False
activity_host = self._shell.get_activity(activity.get_activity_id()) activity_host = self._shell.get_activity(activity.get_activity_id())
if activity_host: if activity_host:
activity_host.present() activity_host.present()
return True
def _get_angles(self, index): def _get_angles(self, index):
angle = 2 * math.pi / 8 angle = 2 * math.pi / 8
@ -251,9 +284,7 @@ class ActivitiesDonut(hippo.CanvasBox, hippo.CanvasItem):
radius = (self._get_inner_radius() + self._get_radius()) / 2 radius = (self._get_inner_radius() + self._get_radius()) / 2
i = 0 for i, icon in enumerate(self._activities):
for h_activity in self._model:
icon = self._get_icon_from_activity(h_activity)
[angle_start, angle_end] = self._get_angles(i) [angle_start, angle_end] = self._get_angles(i)
angle = angle_start + (angle_end - angle_start) / 2 angle = angle_start + (angle_end - angle_start) / 2
@ -262,5 +293,3 @@ class ActivitiesDonut(hippo.CanvasBox, hippo.CanvasItem):
x = int(radius * math.cos(angle)) - icon_width / 2 x = int(radius * math.cos(angle)) - icon_width / 2
y = int(radius * math.sin(angle)) - icon_height / 2 y = int(radius * math.sin(angle)) - icon_height / 2
self.set_position(icon, x + width / 2, y + height / 2) self.set_position(icon, x + width / 2, y + height / 2)
i += 1