Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pippy_app.py
diff options
context:
space:
mode:
Diffstat (limited to 'pippy_app.py')
-rw-r--r--pippy_app.py215
1 files changed, 208 insertions, 7 deletions
diff --git a/pippy_app.py b/pippy_app.py
index 3c0227e..d37e84b 100644
--- a/pippy_app.py
+++ b/pippy_app.py
@@ -16,20 +16,30 @@
from gettext import gettext as _
import hippo
+import cairo
import gtk
import pango
import logging
import re
import cjson
import time
+import os
+import sugar
+import glob
+import rsvg
+
+
+
from datetime import datetime
from activity import ViewSourceActivity
-
from sugar.activity.activity import Activity, ActivityToolbox, SCOPE_PRIVATE
+from sugar.graphics import style
+from sugar.activity.activity import get_activity_root
from sugar.graphics.alert import NotifyAlert
from sugar.graphics.style import (Color, COLOR_BLACK, COLOR_WHITE,
COLOR_BUTTON_GREY, FONT_BOLD, FONT_NORMAL)
from sugar.graphics.roundbox import CanvasRoundBox
+from sugar.graphics import style
from sugar.graphics.xocolor import XoColor
from sugar.graphics.palette import Palette, CanvasInvoker
from sugar.graphics.menuitem import MenuItem
@@ -37,7 +47,6 @@ from sugar.util import timestamp_to_elapsed_string
from sugar.graphics.toolbarbox import ToolbarBox
from sugar.activity.widgets import *
from sugar.presence import presenceservice
-
from telepathy.client import Connection, Channel
from telepathy.interfaces import (
CHANNEL_INTERFACE, CHANNEL_INTERFACE_GROUP, CHANNEL_TYPE_TEXT,
@@ -52,6 +61,149 @@ URL_REGEXP = re.compile('((http|ftp)s?://)?'
'(([-a-zA-Z0-9]+[.])+[-a-zA-Z0-9]{2,}|([0-9]{1,3}[.]){3}[0-9]{1,3})'
'(:[1-9][0-9]{0,4})?(/[-a-zA-Z0-9/%~@&_+=;:,.?#]*[a-zA-Z0-9/])?')
+TEMP_SVG_PATH="icons/smilies"
+ICON_SVG_PATH=os.path.join(get_activity_root(),'data', 'icons','smilies')
+
+## For adding a new smiley add an entry in this dictionary and place the corresponding smiley file in data/icons
+FILE_NAMES={
+ "O)" : "angel.png" ,
+ "O-)" : "angel.png" ,
+ "x(" : "angry.png",
+ "x-(" : "angry.png",
+ "B)" : "cool.png",
+ "B-)" : "cool.png",
+ ">:>" : "devil.png",
+ ":D" : "grin.png",
+ ":-D" : "grin.png",
+ ":|" : "neutral.png",
+ ":-|" : "neutral.png",
+ ":-(" : "sad.png",
+ ":(" : "sad.png" ,
+ ":O" : "shock.png",
+ ":-O" : "shock.png",
+ ":$" : "blush.png",
+ ":-$" : "blush.png",
+ ":)" : "smile.png",
+ ":-)" : "smile.png",
+ ":P" : "tongue.png",
+ ":-P" : "tongue.png",
+ ";)" : "wink.png",
+ ";-)" : "wink.png",
+
+
+ }
+
+def find_key(dic, val):
+ return [k for k, v in dic.iteritems() if v == val][0]
+
+### Checks if a text is smiley by looking into FILE_NAMES keys
+def is_smiley(text):
+ MYKEYS=FILE_NAMES.keys()
+ for smiley in MYKEYS:
+ if smiley==text:
+ return True
+ return False
+
+def process_text_for_continuous_smileys(text):
+ keys=FILE_NAMES.keys()
+ for key in keys:
+ text=text.replace(key," "+key+" ")
+ return text
+###Converts svg into png
+def from_svg_at_size(filename=None, width=None, height=None, handle=None,
+ keep_ratio=True):
+ """Scale and load SVG into pixbuf"""
+
+ if not handle:
+ handle = rsvg.Handle(filename)
+
+ dimensions = handle.get_dimension_data()
+ icon_width = dimensions[0]
+ icon_height = dimensions[1]
+ if icon_width != width or icon_height != height:
+ ratio_width = float(width) / icon_width
+ ratio_height = float(height) / icon_height
+
+ if keep_ratio:
+ ratio = min(ratio_width, ratio_height)
+ if ratio_width != ratio:
+ ratio_width = ratio
+ width = int(icon_width * ratio)
+ elif ratio_height != ratio:
+ ratio_height = ratio
+ height = int(icon_height * ratio)
+ else:
+ ratio_width = 1
+ ratio_height = 1
+
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ context = cairo.Context(surface)
+ context.scale(ratio_width, ratio_height)
+ handle.render_cairo(context)
+
+ loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
+ surface.write_to_png(loader)
+ loader.close()
+
+ return loader.get_pixbuf()
+
+### Invoked on first run to create pngs from svgs and store in ICON_SVG_PATH
+def create_pngs():
+ os.makedirs(ICON_SVG_PATH)
+ for infile in glob.glob( os.path.join(TEMP_SVG_PATH, '*.svg') ):
+ pixbuf=from_svg_at_size(infile,style.MEDIUM_ICON_SIZE,style.MEDIUM_ICON_SIZE,None,True)
+ pixbuf.save(os.path.join(ICON_SVG_PATH,os.path.basename(os.path.splitext(infile)[0])+".png"),'png')
+
+##returns an Image for a given smily
+def get_smiley(text):
+
+ if text not in FILE_NAMES:
+ raise KeyError
+ else:
+ file_name=os.path.join(ICON_SVG_PATH , FILE_NAMES[text])
+ surface = cairo.ImageSurface.create_from_png(file_name)
+ image = hippo.CanvasImage(image=surface,
+ border=0,
+ border_color=style.COLOR_BUTTON_GREY.get_int(),
+ xalign=hippo.ALIGNMENT_CENTER,
+ yalign=hippo.ALIGNMENT_CENTER,
+ scale_width=35,
+ scale_height=35)
+ return image
+
+##returns table of icons for the Smiley palette
+def get_pallete_smiley_table(self):
+ MYVALUES=list(set(FILE_NAMES.values()))
+ smiley_count= len(MYVALUES)
+ row_count=smiley_count/4;
+ last_row_smiley_count=smiley_count%4
+ table=gtk.Table(rows=row_count,columns=4)
+ count=0
+ for i in range(4):
+ for j in range(row_count):
+ count=count+1
+ image=gtk.image_new_from_file(os.path.join(ICON_SVG_PATH,MYVALUES[count-1]))
+ but=ToolButton(icon_widget=image)
+ but.connect('clicked',self._add_smiley_to_entry,MYVALUES[count-1])
+ #but.set_icon()
+ table.attach(but,i,i+1,j,j+1)
+ but.show()
+
+ ### add the remaining ICONS to the the last row
+ print last_row_smiley_count
+ for i in range(last_row_smiley_count):
+ count=count+1
+ image=gtk.image_new_from_file(os.path.join(ICON_SVG_PATH,MYVALUES[count-1]))
+ but=ToolButton(icon_widget=image)
+ but.connect('clicked',self._add_smiley_to_entry,MYVALUES[count-1])
+ table.attach(but,i,i+1,row_count,row_count+1)
+ but.show()
+
+
+ return table
+
+
+
class Chat(ViewSourceActivity):
def __init__(self, handle):
super(Chat, self).__init__(handle)
@@ -65,7 +217,35 @@ class Chat(ViewSourceActivity):
self.set_toolbar_box(toolbar_box)
toolbar_box.toolbar.insert(ActivityButton(self), -1)
toolbar_box.toolbar.insert(TitleEntry(self), -1)
+
+ ###check for existence of icons directory
+ if(not os.path.isdir(ICON_SVG_PATH)):
+ create_pngs()
+
+
+ smiley_icon_image=gtk.image_new_from_file(os.path.join(ICON_SVG_PATH,'smiley-icon')+".png")
+ self.smiley = RadioMenuButton(icon_widget=smiley_icon_image)
+
+
+ self.smiley.set_tooltip(_('Insert Smiley'))
+
+
+
+
+
+ toolbar_box.toolbar.insert(self.smiley, -1)
+ self.smiley.show()
+ self.smiley_palette=Palette("Choose Smiley")
+ self.smiley.palette=self.smiley_palette
+
+
+ table=get_pallete_smiley_table(self)
+
+ table.show_all()
+ self.smiley_palette.set_content(table)
+ self.smiley.set_palette(self.smiley_palette)
+
share_button = ShareButton(self)
toolbar_box.toolbar.insert(share_button, -1)
toolbar_box.toolbar.insert(KeepButton(self), -1)
@@ -109,6 +289,15 @@ class Chat(ViewSourceActivity):
self._alert(_('Off-line'), _('Share, or invite someone.'))
self.connect('shared', self._shared_cb)
+
+
+ def _add_smiley_to_entry(self,activity,text):
+
+ self.entry.set_text(self.entry.get_text()+ find_key(FILE_NAMES,text))
+ self.smiley_palette.popdown(True)
+
+
+
def _shared_cb(self, activity):
logger.debug('Chat was shared')
self._setup()
@@ -287,6 +476,8 @@ class Chat(ViewSourceActivity):
def _link_activated_cb(self, link):
url = url_check_protocol(link.props.text)
self._show_via_journal(url)
+
+
def add_text(self, buddy, text, status_message=False):
"""Display text on screen, with name and colors.
@@ -418,14 +609,24 @@ class Chat(ViewSourceActivity):
text = text[match.end():]
match = URL_REGEXP.search(text)
if text:
- message = hippo.CanvasText(
- text=text,
+ text=process_text_for_continuous_smileys(text)
+ line=text
+
+ words=line.split(' ')
+ for word in words:
+ if is_smiley(word):
+
+ image=get_smiley(word)
+ msg_hbox.append(image)
+
+ else:
+ message = hippo.CanvasText(text=word+" ", #change here for changing the typed text
size_mode=hippo.CANVAS_SIZE_WRAP_WORD,
color=text_color,
font_desc=FONT_NORMAL.get_pango_desc(),
xalign=hippo.ALIGNMENT_START)
- msg_hbox.append(message)
-
+ msg_hbox.append(message)
+
# Order of boxes for RTL languages:
if lang_rtl:
msg_hbox.reverse()
@@ -436,7 +637,7 @@ class Chat(ViewSourceActivity):
box = hippo.CanvasBox(padding=2)
box.append(rb)
self.conversation.append(box)
-
+
def add_separator(self, timestamp):
"""Add whitespace and timestamp between chat sessions."""
box = hippo.CanvasBox(padding=2)