#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Video Viewer activity: A video viewer a set of videos on a server
|
|
# Lionel Laské
|
|
|
|
|
|
from gi.repository import Gtk, Gdk
|
|
import logging
|
|
import os
|
|
|
|
from gettext import gettext as _
|
|
|
|
from sugar3.activity import activity
|
|
from sugar3.graphics.toolbarbox import ToolbarBox
|
|
from sugar3.graphics.toolbutton import ToolButton
|
|
from sugar3.activity.widgets import ActivityButton
|
|
from sugar3.activity.widgets import TitleEntry
|
|
from sugar3.activity.widgets import StopButton
|
|
from sugar3.activity.widgets import ShareButton
|
|
from sugar3.activity.widgets import DescriptionItem
|
|
from sugar3.presence import presenceservice
|
|
from sugar3.activity.widgets import ActivityToolbarButton
|
|
from sugar3.graphics.toolbarbox import ToolbarButton
|
|
|
|
from gi.repository import WebKit
|
|
import logging
|
|
import gconf
|
|
|
|
from datetime import date
|
|
|
|
from enyo import Enyo
|
|
|
|
|
|
class EnyoActivity(activity.Activity):
|
|
"""EnyoActivity class as specified in activity.info"""
|
|
|
|
def __init__(self, handle):
|
|
"""Set up the activity."""
|
|
activity.Activity.__init__(self, handle)
|
|
|
|
self.max_participants = 1
|
|
self.context = {}
|
|
|
|
self.favorite_status = 'notfavorite'
|
|
self.filter_status = ''
|
|
|
|
self.make_toolbar()
|
|
self.make_mainview()
|
|
|
|
def filter_changed(self, button):
|
|
if self.filter_status == button.get_label():
|
|
self.filter_status = ''
|
|
else:
|
|
self.filter_status = button.get_label()
|
|
self.enyo.send_message("filter_clicked", self.filter_status)
|
|
|
|
def favorite(self, button):
|
|
if self.favorite_status == 'favorite':
|
|
self.favorite_button.icon_name = self.favorite_status = 'notfavorite'
|
|
self.enyo.send_message("favorite_clicked", 0)
|
|
else:
|
|
self.favorite_button.icon_name = self.favorite_status = 'favorite'
|
|
self.enyo.send_message("favorite_clicked", 1)
|
|
|
|
def text_filter(self, entry):
|
|
self.enyo.send_message("text_typed", entry.props.text)
|
|
|
|
def library_clicked(self, button):
|
|
self.enyo.send_message("library_clicked")
|
|
|
|
def refresh(self, context):
|
|
self.context = context
|
|
web_app_page = os.path.join(activity.get_bundle_path(), "index.html")
|
|
self.webview.load_uri('file://' + web_app_page+"?onsugar=1")
|
|
|
|
def init_context(self, args):
|
|
"""Init Javascript context sending buddy information"""
|
|
# Get XO colors
|
|
buddy = {}
|
|
client = gconf.client_get_default()
|
|
colors = client.get_string("/desktop/sugar/user/color")
|
|
buddy["colors"] = colors.split(",")
|
|
|
|
# Get XO name
|
|
presenceService = presenceservice.get_instance()
|
|
buddy["name"] = presenceService.get_owner().props.nick
|
|
|
|
self.enyo.send_message("buddy", buddy)
|
|
if self.context != {}:
|
|
self.enyo.send_message("load-context", self.context)
|
|
else:
|
|
self.enyo.send_message("library_clicked")
|
|
|
|
def make_mainview(self):
|
|
"""Create the activity view"""
|
|
# Create global box
|
|
vbox = Gtk.VBox(True)
|
|
|
|
# Create webview
|
|
self.webview = webview = WebKit.WebView()
|
|
webview.show()
|
|
vbox.pack_start(webview, True, True, 0)
|
|
vbox.show()
|
|
|
|
# Activate Enyo interface
|
|
self.enyo = Enyo(webview)
|
|
self.enyo.connect("ready", self.init_context)
|
|
self.enyo.connect("save-context", self.save_context)
|
|
self.enyo.connect("refresh-screen", self.refresh)
|
|
self.enyo.connect("set_categories", self.set_categories)
|
|
|
|
# Go to first page
|
|
web_app_page = os.path.join(activity.get_bundle_path(), "index.html")
|
|
self.webview.load_uri('file://' + web_app_page+"?onsugar=1")
|
|
|
|
# Display all
|
|
self.set_canvas(vbox)
|
|
vbox.show()
|
|
|
|
def make_toolbar(self):
|
|
# toolbar with the new toolbar redesign
|
|
toolbar_box = ToolbarBox()
|
|
|
|
activity_button = ActivityToolbarButton(self)
|
|
toolbar_box.toolbar.insert(activity_button, 0)
|
|
activity_button.show()
|
|
|
|
self.toolbarview = Gtk.Toolbar()
|
|
langtoolbar_button = ToolbarButton(
|
|
label=_('Filter'),
|
|
page=self.toolbarview,
|
|
icon_name='filter')
|
|
langtoolbar_button.show()
|
|
toolbar_box.toolbar.insert(langtoolbar_button, -1)
|
|
self.toolbarview.show()
|
|
|
|
box_search_item = Gtk.ToolItem()
|
|
self.search_entry = Gtk.Entry()
|
|
self.search_entry.connect('changed', self.text_filter)
|
|
self.search_entry.set_size_request(300, -1)
|
|
box_search_item.add(self.search_entry)
|
|
self.search_entry.show()
|
|
box_search_item.show()
|
|
toolbar_box.toolbar.insert(box_search_item, -1)
|
|
|
|
favorite_button = ToolButton(self.favorite_status)
|
|
favorite_button.set_tooltip('Filter on favorite')
|
|
favorite_button.connect('clicked', self.favorite)
|
|
toolbar_box.toolbar.insert(favorite_button, -1)
|
|
favorite_button.show()
|
|
self.favorite_button = favorite_button
|
|
|
|
library_button = ToolButton('library')
|
|
library_button.set_tooltip('Show libraries')
|
|
library_button.connect('clicked', self.library_clicked)
|
|
toolbar_box.toolbar.insert(library_button, -1)
|
|
library_button.show()
|
|
|
|
separator = Gtk.SeparatorToolItem()
|
|
separator.props.draw = False
|
|
separator.set_expand(True)
|
|
toolbar_box.toolbar.insert(separator, -1)
|
|
separator.show()
|
|
|
|
stop_button = StopButton(self)
|
|
toolbar_box.toolbar.insert(stop_button, -1)
|
|
stop_button.show()
|
|
|
|
self.set_toolbar_box(toolbar_box)
|
|
toolbar_box.show()
|
|
|
|
def set_categories(self, categories):
|
|
"""Called when Enyo load a new database with new categories, udate the filter"""
|
|
nitems = self.toolbarview.get_n_items()
|
|
for i in range(0, nitems):
|
|
self.toolbarview.remove(self.toolbarview.get_nth_item(0))
|
|
for category in categories:
|
|
btn = Gtk.Button.new_with_label(category['id'])
|
|
btn.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0.1568, 0.1568, 0.1568, 1.0))
|
|
btn.connect('clicked', self.filter_changed)
|
|
btn.show()
|
|
tool = Gtk.ToolItem()
|
|
tool.add(btn)
|
|
tool.show()
|
|
self.toolbarview.insert(tool, -1)
|
|
self.toolbarview.show()
|
|
|
|
def write_file(self, file_path):
|
|
"""Called when activity is saved, get the current context in Enyo"""
|
|
self.file_path = file_path
|
|
self.enyo.send_message("save-context")
|
|
|
|
def save_context(self, context):
|
|
"""Called by Enyo to save the current context"""
|
|
file = open(self.file_path, 'w')
|
|
try:
|
|
file.write(self.enyo.json_encode(context)+'\n')
|
|
finally:
|
|
file.close()
|
|
|
|
def read_file(self, file_path):
|
|
"""Called when activity is loaded, load the current context in the file"""
|
|
file = open(file_path, 'r')
|
|
self.context = {}
|
|
try:
|
|
self.context = self.enyo.json_decode(file.readline().strip('\n'))
|
|
finally:
|
|
file.close()
|