Skip to content

Commit

Permalink
Merge branch 'master' of git@github.com:drf/amsn2
Browse files Browse the repository at this point in the history
  • Loading branch information
Youness Alaoui committed Mar 12, 2009
2 parents ac43634 + d372fc5 commit f3e3784
Show file tree
Hide file tree
Showing 6 changed files with 366 additions and 72 deletions.
73 changes: 23 additions & 50 deletions amsn2.py 100755 → 100644
Expand Up @@ -11,56 +11,29 @@
passwd = None
default_front_end = "console"

if os.name == "posix":
system = os.uname()[0]
if system == "Linux":

""" Here we are trying to import some base modules for the GUI
interfaces to get a working default frontend. EFL is the first one,
then come the others.
Suggestion/TODO: we can avoid OS detection through this method.
I think it makes more sense creating a priority list, something like
that one:
cocoa > efl > qt4 > gtk > console
As you can imagine, the OS you're using no longer matters: IMHO
this list (except for qt & gtk, didn't know what to put first) is
the right way to do it, since it tries to be as native as possible.
There are some even better ways to do it, especially on gtk/qt side.
For example, we can use DBus to know what DE is running.
So, my thoughts on how to do it:
Try cocoa, try Efl. If both went bad, try to see if DBus is running.
If not, we're probably not on Linux, so give priority to Qt. If it is,
check for kded service or for a GNOME service and choose that toolkit.
When all else fails, console will be our friend.
This way we'll have the best default possible, and as you can see
from the first implementation, it's really easy to do.
"""

try:
import ecore
default_front_end = "efl"
except ImportError: # Efl not available
try:
import PyQt4.QtGui
default_front_end = "qt4"
except ImportError: # Qt not available
try:
import gtk
default_front_end = "gtk"
except ImportError: # GTK not available
print "No graphical toolkits detected, falling back to console..."
default_front_end = "console"

elif system == "Darwin":
default_front_end = "cocoa"
elif os.name == "nt":
default_front_end = "qt4"

# Detect graphical toolkit available.
# Format - 'default_front_end : module name'
# cocoa > efl > qt4 > gtk > console
toolkits = {'cocoa' : '????',
'elf' : 'ecore',
'qt4' : 'PyQt4.QtGui',
'gtk' : 'gtk',
'console' : None}
for toolkit in toolkits:
try:
default_front_end = toolkit
module_name = toolkits[toolkit]
module = __import__(module_name)
vars()[module_name] = module
# Debug
# print 'Imported toolkit "%s" with module "%s"' % (toolkit, module)
break
except ImportError:
# Debug
# print 'Couldn\'t import %s - doesn\'t exist!' % module_name
pass
except TypeError:
pass

parser = optparse.OptionParser()
parser.add_option("-a", "--account", dest="account",
Expand Down
11 changes: 6 additions & 5 deletions amsn2/core/conversation.py
Expand Up @@ -67,7 +67,7 @@ def onUserTyping(self, contact_uid):
c = self._core._contactlist_manager.getContact(contact_uid)
self._convWidget.onUserTyping(c.nickname)

def onMessageReceived(self, message, sender_uid=None):
def onMessageReceived(self, message, sender_uid=None, formatting=None):
#TODO: messageView
mv = MessageView()
if sender_uid is None:
Expand All @@ -79,17 +79,18 @@ def onMessageReceived(self, message, sender_uid=None):
mv.message_type = MessageView.MESSAGE_OUTGOING
mv.sender.appendStringView(c.nickname)
mv.msg = message
self._convWidget.onMessageReceived(mv)
self._convWidget.onMessageReceived(mv, formatting)

def onNudgeReceived(self, sender_uid):
self._convWidget.nudge()

""" Actions from ourselves """
def sendMessage(self, msg):
def sendMessage(self, msg, formatting=None):
""" msg is a StringView """
# for the moment, no formatting, no smiley substitution... (TODO)
self.onMessageReceived(msg)
message = pymsn.ConversationMessage(msg.toString())
# peacey: Added formatting of styles
self.onMessageReceived(msg, formatting=formatting)
message = pymsn.ConversationMessage(msg.toString(), formatting)
self._conv.send_text_message(message)

def sendNudge(self):
Expand Down
122 changes: 108 additions & 14 deletions amsn2/gui/front_ends/gtk/chat_window.py
Expand Up @@ -29,6 +29,8 @@
from htmltextview import *
from amsn2.gui import base
from amsn2.core.views import StringView
import gtk_extras
import pymsn

class aMSNChatWindow(base.aMSNChatWindow, gtk.Window):
def __init__(self, amsn_core):
Expand Down Expand Up @@ -87,6 +89,20 @@ def __init__(self, amsn_conversation, parent):
# Bottom
self.entry = MessageTextView()

# Tags for entry
tag = self.entry.get_buffer().create_tag("bold")
tag.set_property("weight", pango.WEIGHT_BOLD)
tag = self.entry.get_buffer().create_tag("italic")
tag.set_property("style", pango.STYLE_ITALIC)
tag = self.entry.get_buffer().create_tag("underline")
tag.set_property("underline", pango.UNDERLINE_SINGLE)
tag = self.entry.get_buffer().create_tag("strikethrough")
tag.set_property("strikethrough", True)
tag = self.entry.get_buffer().create_tag("foreground")
tag.set_property("foreground_gdk", gtk.gdk.Color(0,0,0))
tag = self.entry.get_buffer().create_tag("family")
tag.set_property("family", "MS Sans Serif")

escroll = gtk.ScrolledWindow()
escroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
escroll.set_placement(gtk.CORNER_TOP_LEFT)
Expand All @@ -108,23 +124,28 @@ def __init__(self, amsn_conversation, parent):

self.button1 = gtk.ToolButton('button_smile')
self.button2 = gtk.ToolButton('button_nudge')
self.button3 = gtk.ToggleToolButton(gtk.STOCK_BOLD)
self.button4 = gtk.ToggleToolButton(gtk.STOCK_ITALIC)
self.button5 = gtk.ToggleToolButton(gtk.STOCK_UNDERLINE)
self.button6 = gtk.ToggleToolButton(gtk.STOCK_STRIKETHROUGH)
self.button7 = gtk.ToolButton(gtk.STOCK_COLOR_PICKER)
self.button_bold = gtk.ToggleToolButton(gtk.STOCK_BOLD)
self.button_italic = gtk.ToggleToolButton(gtk.STOCK_ITALIC)
self.button_underline = gtk.ToggleToolButton(gtk.STOCK_UNDERLINE)
self.button_strikethrough = gtk.ToggleToolButton(gtk.STOCK_STRIKETHROUGH)
self.button_color = gtk_extras.ColorToolButton()
self.button_font = gtk_extras.FontToolButton()
self.button8 = gtk.ToolButton(gtk.STOCK_CLEAR)

self.button_font.set_show_size(0)
self.button_font.set_show_style(0)

bbox = gtk.Toolbar()
bbox.set_style(gtk.TOOLBAR_ICONS)
bbox.insert(self.button1, -1)
bbox.insert(self.button2, -1)
bbox.insert(gtk.SeparatorToolItem(), -1)
bbox.insert(self.button3, -1)
bbox.insert(self.button4, -1)
bbox.insert(self.button5, -1)
bbox.insert(self.button6, -1)
bbox.insert(self.button7, -1)
bbox.insert(self.button_font, -1)
bbox.insert(self.button_color, -1)
bbox.insert(self.button_bold, -1)
bbox.insert(self.button_italic, -1)
bbox.insert(self.button_underline, -1)
bbox.insert(self.button_strikethrough, -1)
bbox.insert(gtk.SeparatorToolItem(), -1)
bbox.insert(self.button8, -1)

Expand Down Expand Up @@ -168,11 +189,50 @@ def __init__(self, amsn_conversation, parent):
self.__on_changed_text_effect, 'strikethrough')
self.button7.connect("clicked", self.__on_changed_text_color)
'''
self.entry.get_buffer().connect("changed", self.__updateTextFormat)
self.button_bold.connect("toggled", self.__on_changed_text_effect, "bold")
self.button_italic.connect("toggled", self.__on_changed_text_effect, "italic")
self.button_underline.connect("toggled", self.__on_changed_text_effect, "underline")
self.button_strikethrough.connect("toggled", self.__on_changed_text_effect, "strikethrough")
self.button_color.connect("color_set", self.__on_changed_text_color)
self.button_font.connect("font_set", self.__on_changed_text_font)
self.button2.connect("clicked", self.__on_nudge_send)
self.button8.connect("clicked", self.__on_clear_textview)
self.entry.connect('mykeypress', self.__on_chat_send)
self.entry.connect('key-press-event', self.__on_typing_event)

def __updateTextFormat(self, textbuffer):
self.reapply_text_effects();
self.__on_changed_text_color(self.button_color)
self.__on_changed_text_font(self.button_font)

def __on_changed_text_effect(self, button, tag_type):
buffer = self.entry.get_buffer();
if button.get_active():
buffer.apply_tag_by_name(tag_type, buffer.get_start_iter(), buffer.get_end_iter())
else:
buffer.remove_tag_by_name(tag_type, buffer.get_start_iter(), buffer.get_end_iter())

def reapply_text_effects(self):
self.__on_changed_text_effect(self.button_bold, "bold")
self.__on_changed_text_effect(self.button_italic, "italic")
self.__on_changed_text_effect(self.button_underline, "underline")
self.__on_changed_text_effect(self.button_strikethrough, "strikethrough")

def __on_changed_text_color(self, button):
buffer = self.entry.get_buffer();
tag = buffer.get_tag_table().lookup("foreground")
tag.set_property("foreground_gdk", button.get_color())
buffer.apply_tag_by_name("foreground", buffer.get_start_iter(), buffer.get_end_iter())

def __on_changed_text_font(self, button):
buffer = self.entry.get_buffer();
font_name = self.button_font.get_font_name()
font_family = pango.FontDescription(font_name).get_family()
tag = buffer.get_tag_table().lookup("family")
tag.set_property("family", font_family)
buffer.apply_tag_by_name("family", buffer.get_start_iter(), buffer.get_end_iter())

def __clean_string(self, str):
return cgi.escape(str)

Expand All @@ -185,9 +245,19 @@ def __on_chat_send(self, entry, event_keyval, event_keymod):
entry.grab_focus()
if (msg == ''): return False

color = self.button_color.get_color()
hex8 = "%.2x%.2x%.2x" % ((color.red/0x101), (color.green/0x101), (color.blue/0x101))
style = pymsn.TextFormat.NO_EFFECT
if self.button_bold.get_active(): style |= pymsn.TextFormat.BOLD
if self.button_italic.get_active(): style |= pymsn.TextFormat.ITALIC
if self.button_underline.get_active(): style |= pymsn.TextFormat.UNDERLINE
if self.button_strikethrough.get_active(): style |= pymsn.TextFormat.STRIKETHROUGH
font_name = self.button_font.get_font_name()
font_family = pango.FontDescription(font_name).get_family()
format = pymsn.TextFormat(font=font_family, color=hex8, style=style)
strv = StringView()
strv.appendText(msg)
self._amsn_conversation.sendMessage(strv)
self._amsn_conversation.sendMessage(strv, format)

def __on_clear_textview(self, widget):
buffer = self.textview.get_buffer()
Expand Down Expand Up @@ -223,15 +293,39 @@ def __set_statusbar_text(self, msg):
self.statusbar.pop(context)
self.statusbar.push(context, msg)

def onMessageReceived(self, messageview):
def onMessageReceived(self, messageview, formatting=None):
text = messageview.toStringView().toHtmlString()
text = self.__clean_string(text)
nick, msg = text.split('\n', 1)
nick = str(nick.replace('\n', '<br/>'))
msg = str(msg.replace('\n', '<br/>'))
sender = messageview.sender.toString()

self.__print_chat(nick, msg, sender)
# peacey: Check formatting of styles and perform the required changes
if formatting:
fmsg = '''<span style="'''
if formatting.font:
fmsg += "font-family: %s;" % formatting.font
if formatting.color:
fmsg += "color: %s;" % ("#"+formatting.color)
if formatting.style & pymsn.TextFormat.BOLD == pymsn.TextFormat.BOLD:
fmsg += "font-weight: bold;"
if formatting.style & pymsn.TextFormat.ITALIC == pymsn.TextFormat.ITALIC:
fmsg += "font-style: italic;"
if formatting.style & pymsn.TextFormat.UNDERLINE == pymsn.TextFormat.UNDERLINE:
fmsg += "text-decoration: underline;"
if formatting.style & pymsn.TextFormat.STRIKETHROUGH == pymsn.TextFormat.STRIKETHROUGH:
fmsg += "text-decoration: line-through;"
if formatting.right_alignment:
fmsg += "text-align: right;"
fmsg = fmsg.rstrip(";")
fmsg += '''">'''
fmsg += msg
fmsg += "</span>"
else:
fmsg = msg

self.__print_chat(nick, fmsg, sender)

self.last_sender = sender

Expand Down Expand Up @@ -291,4 +385,4 @@ def update(self, cview):
self.psm_color, psm)

self.title.set_markup(title)


0 comments on commit f3e3784

Please sign in to comment.