First go at shared links (not functional)
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
from sugar.presence import PresenceService
|
||||
|
||||
class LinksController(object):
|
||||
def __init__(self, service, model):
|
||||
self._model = model
|
||||
|
||||
self._pservice = PresenceService.get_instance()
|
||||
|
||||
self._stream = Stream.new_from_service(service)
|
||||
self._stream.set_data_listener(self._recv_message)
|
||||
self._stream_writer = self._stream.new_writer()
|
||||
|
||||
def post_link(self, title, address):
|
||||
self._stream_writer.write('test')
|
||||
|
||||
def _recv_message(self, address, msg):
|
||||
buddy = self._pservice.get_buddy_by_address(address)
|
||||
if buddy:
|
||||
self._model.add_link(buddy, 'Test title', 'Test address')
|
||||
@@ -0,0 +1,35 @@
|
||||
import gobject
|
||||
|
||||
class Link(object):
|
||||
def __init__(self, buddy, title, url):
|
||||
self.buddy = buddy
|
||||
self.title = title
|
||||
self.url = url
|
||||
|
||||
class LinksModel(gobject.GObject):
|
||||
__gsignals__ = {
|
||||
'link-added': (gobject.SIGNAL_RUN_FIRST,
|
||||
gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
|
||||
'link-removed': (gobject.SIGNAL_RUN_FIRST,
|
||||
gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
gobject.GObject.__init__(self)
|
||||
self._links = {}
|
||||
|
||||
def add_link(buddy, title, url):
|
||||
link = Link(buddy, title, url)
|
||||
self._links[(buddy.get_name(), url)] = link
|
||||
|
||||
self.emit('link-added', link)
|
||||
|
||||
def remove_link(buddy, url):
|
||||
key = (buddy.get_name(), url)
|
||||
if self._links.haskey(key):
|
||||
link = self._links[key]
|
||||
del self._links[key]
|
||||
self.emit('link-removed', link)
|
||||
|
||||
def __iter__(self):
|
||||
return self._links.values().__iter__()
|
||||
@@ -0,0 +1,36 @@
|
||||
import hippo
|
||||
|
||||
from sugar.graphics.bubble import Bubble
|
||||
|
||||
class LinksView(hippo.Canvas):
|
||||
def __init__(self, model):
|
||||
hippo.Canvas.__init__(self)
|
||||
|
||||
self._bubbles = {}
|
||||
|
||||
self._box = hippo.CanvasBox(background_color=0x414141ff)
|
||||
self.set_root(self._box)
|
||||
|
||||
for link in model:
|
||||
self._add_link(link)
|
||||
|
||||
model.connect('link_added', self._link_added_cb)
|
||||
model.connect('link_removed', self._link_removed_cb)
|
||||
|
||||
def _add_link(self, link):
|
||||
bubble = Bubble(color=link.buddy.get_color())
|
||||
self._box.append(link)
|
||||
|
||||
self._bubbles[link] = bubble
|
||||
|
||||
def _remove_link(self, link):
|
||||
bubble = self._bubbles[link]
|
||||
self._box.remove(bubble)
|
||||
|
||||
del self._bubbles[link]
|
||||
|
||||
def _link_added_cb(self, model, link):
|
||||
self._add_link(link)
|
||||
|
||||
def _link_removed_cb(self, model, link):
|
||||
self._removed_link(link)
|
||||
@@ -43,6 +43,18 @@ class Toolbar(gtk.Toolbar):
|
||||
self.insert(address_item, -1)
|
||||
address_item.show()
|
||||
|
||||
separator = gtk.SeparatorToolItem()
|
||||
separator.set_draw(False)
|
||||
self.insert(separator, -1)
|
||||
separator.show()
|
||||
|
||||
self._post = gtk.ToolButton()
|
||||
self._post.props.sensitive = False
|
||||
self._post.set_icon_name('stock-add')
|
||||
self._post.connect("clicked", self._post_cb)
|
||||
self.insert(self._post, -1)
|
||||
self._post.show()
|
||||
|
||||
self._insert_spring()
|
||||
|
||||
self._embed = embed
|
||||
@@ -53,6 +65,10 @@ class Toolbar(gtk.Toolbar):
|
||||
self._embed.connect("notify::can-go-forward",
|
||||
self._can_go_forward_changed_cb)
|
||||
|
||||
def set_links_controller(self, links_controller):
|
||||
self._links_controller = links_controller
|
||||
self._post.props.sensitive = False
|
||||
|
||||
def _progress_changed_cb(self, embed, spec):
|
||||
self._entry.props.progress = embed.props.progress
|
||||
|
||||
@@ -74,6 +90,11 @@ class Toolbar(gtk.Toolbar):
|
||||
def _go_forward_cb(self, button):
|
||||
self._embed.go_forward()
|
||||
|
||||
def _post_cb(self, button):
|
||||
title = self._embed.get_title()
|
||||
address = self._embed.get_location()
|
||||
self._links_controller.post_link(title, address)
|
||||
|
||||
def _insert_spring(self):
|
||||
separator = gtk.SeparatorToolItem()
|
||||
separator.set_draw(False)
|
||||
|
||||
@@ -6,6 +6,9 @@ from sugar.activity.Activity import Activity
|
||||
from sugar import env
|
||||
from webbrowser import WebBrowser
|
||||
from toolbar import Toolbar
|
||||
from linksmodel import LinksModel
|
||||
from linksview import LinksView
|
||||
from linkscontroller import LinksController
|
||||
|
||||
_HOMEPAGE = 'http://www.google.com'
|
||||
|
||||
@@ -20,13 +23,24 @@ class WebActivity(Activity):
|
||||
self._browser = WebBrowser()
|
||||
self._browser.connect('notify::title', self._title_changed_cb)
|
||||
|
||||
toolbar = Toolbar(self._browser)
|
||||
vbox.pack_start(toolbar, False)
|
||||
toolbar.show()
|
||||
links_model = LinksModel()
|
||||
links_view = LinksView(links_model)
|
||||
|
||||
vbox.pack_start(self._browser)
|
||||
self._toolbar = Toolbar(self._browser)
|
||||
vbox.pack_start(self._toolbar, False)
|
||||
self._toolbar.show()
|
||||
|
||||
hbox = gtk.HBox()
|
||||
|
||||
hbox.pack_start(links_view, False)
|
||||
links_view.show()
|
||||
|
||||
hbox.pack_start(self._browser)
|
||||
self._browser.show()
|
||||
|
||||
vbox.pack_start(hbox)
|
||||
hbox.show()
|
||||
|
||||
self.add(vbox)
|
||||
vbox.show()
|
||||
|
||||
@@ -35,6 +49,9 @@ class WebActivity(Activity):
|
||||
def join(self, activity_ps):
|
||||
Activity.join(self, activity_ps)
|
||||
|
||||
links_controller = LinksController(service, links_model)
|
||||
self._toolbar.set_links_controller(links_controller)
|
||||
|
||||
url = self._service.get_published_value('URL')
|
||||
if url:
|
||||
self._browser.load_url(url)
|
||||
|
||||
Reference in New Issue
Block a user