Fix activity double-join bug where opening a shared activity twice opened a blank tab

This commit is contained in:
Dan Williams 2006-07-07 11:00:20 -04:00
parent 679d92dac8
commit 8270a84e09
2 changed files with 62 additions and 19 deletions

View File

@ -8,6 +8,7 @@ import xml.sax.saxutils
import gobject
import socket
import dbus_bindings
from google import google
from sugar.presence.PresenceService import PresenceService
@ -101,10 +102,11 @@ class ActivitiesModel(gtk.ListStore):
self.append([ title, address, subtitle, service ])
class ActivitiesView(gtk.TreeView):
def __init__(self, model):
def __init__(self, activity_controller, model):
gtk.TreeView.__init__(self, model)
self._owner = None
self._activity_controller = activity_controller
self.set_headers_visible(False)
@ -160,14 +162,26 @@ class ActivitiesView(gtk.TreeView):
if service is None:
browser_shell.open_browser(address)
else:
return
if not self._owner:
raise RuntimeError("We don't have an owner yet!")
# If the activity is already started, switch to it
service_act_id = service.get_activity_id()
if service_act_id and self._activity_controller.have_activity(service_act_id):
self._activity_controller.switch_to_activity(service_act_id)
return
# Start a new activity
serialized_service = service.serialize(self._owner)
try:
browser_shell.open_browser(address, serialized_service)
except dbus_bindings.DBusException, exc:
pass
class StartPage(gtk.HBox):
def __init__(self, ac_signal_object):
def __init__(self, activity_controller, ac_signal_object):
gtk.HBox.__init__(self)
self._ac_signal_object = ac_signal_object
@ -245,7 +259,7 @@ class StartPage(gtk.HBox):
self._activities_model = ActivitiesModel()
owner = self._pservice.get_owner()
self._activities = ActivitiesView(self._activities_model)
self._activities = ActivitiesView(activity_controller, self._activities_model)
sw.add(self._activities)
self._activities.show()

View File

@ -106,6 +106,7 @@ class ActivityHost(dbus.service.Object):
self.peer_service.got_focus()
def lost_focus(self):
if self.peer_service != None:
self.peer_service.lost_focus()
def get_chat(self):
@ -329,7 +330,7 @@ class ActivityContainer(dbus.service.Object):
self.notebook.set_scrollable(True)
tab_label = gtk.Label("Everyone")
self._start_page = StartPage(self._signal_helper)
self._start_page = StartPage(self, self._signal_helper)
self.notebook.append_page(self._start_page, tab_label)
self._start_page.show()
@ -376,6 +377,9 @@ class ActivityContainer(dbus.service.Object):
self.window.show()
def set_current_activity(self, activity):
if self.current_activity != None:
self.current_activity.lost_focus()
self.current_activity = activity
self._presence_window.set_activity(activity)
@ -388,17 +392,36 @@ class ActivityContainer(dbus.service.Object):
# For some reason the substitution screw up window position
self._chat_wm.update()
def notebook_tab_changed(self, notebook, page, page_number):
new_activity = notebook.get_nth_page(page_number).get_data("sugar-activity")
if self.current_activity != None:
self.current_activity.lost_focus()
self.set_current_activity(new_activity)
if self.current_activity != None:
self.current_activity.got_focus()
def notebook_tab_changed(self, notebook, page, page_number):
new_activity = notebook.get_nth_page(page_number).get_data("sugar-activity")
self.set_current_activity(new_activity)
def switch_to_activity(self, activity_id):
found = False
for owner, activity in self.activities:
if activity.get_host_activity_id() == activity_id:
found = True
break
if not found:
return
# Find the activity in the notebook
activity_page = None
npages = self.notebook.get_n_pages()
for pageno in range(1, npages):
activity = self.notebook.get_nth_page(pageno).get_data("sugar-activity")
if activity and activity.get_host_activity_id() == activity_id:
activity_page = pageno
break
if not activity_page:
return
print "switching to activity page %d" % activity_page
self.notebook.set_current_page(activity_page)
def name_owner_changed(self, service_name, old_service_name, new_service_name):
#print "in name_owner_changed: svc=%s oldsvc=%s newsvc=%s"%(service_name, old_service_name, new_service_name)
for owner, activity in self.activities[:]:
@ -408,6 +431,12 @@ class ActivityContainer(dbus.service.Object):
self.activities.remove((owner, activity))
#self.__print_activities()
def have_activity(self, activity_id):
for owner, activity in self.activities:
list_activity_id = activity.get_host_activity_id()
if activity_id == list_activity_id:
return True
return False
@dbus.service.method("com.redhat.Sugar.Shell.ActivityContainer", \
in_signature="ss", \