Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim-plugins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Fomin <fominde@gmail.com>2010-09-17 17:08:03 +0400
committerDenis Fomin <fominde@gmail.com>2010-09-17 17:08:03 +0400
commit8c50df8ea0f0cf3b597d6e51d034f15630a02b48 (patch)
tree80b4d3c8f6da07831ea50e5da0b63c6d0ef9f422 /clickable_nicknames
First commit
Diffstat (limited to 'clickable_nicknames')
-rw-r--r--clickable_nicknames/__init__.py1
-rw-r--r--clickable_nicknames/clickable_nicknames.py137
2 files changed, 138 insertions, 0 deletions
diff --git a/clickable_nicknames/__init__.py b/clickable_nicknames/__init__.py
new file mode 100644
index 0000000..bc61cbb
--- /dev/null
+++ b/clickable_nicknames/__init__.py
@@ -0,0 +1 @@
+from clickable_nicknames import ClickableNicknames
diff --git a/clickable_nicknames/clickable_nicknames.py b/clickable_nicknames/clickable_nicknames.py
new file mode 100644
index 0000000..3fe11ec
--- /dev/null
+++ b/clickable_nicknames/clickable_nicknames.py
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+
+import gtk
+from string import rstrip
+from string import lstrip
+
+from common import gajim
+from plugins import GajimPlugin
+from plugins.helpers import log_calls, log
+
+
+class ClickableNicknames(GajimPlugin):
+ name = u'Clickable Nicknames'
+ short_name = u'clickable_nicknames'
+ version = u'0.1'
+ description = _(u'''Clickable nicknames in the conversation textview.''')
+ authors = [u'Denis Fomin <fominde@gmail.com>']
+
+ homepage = u'http://bitbucket.org/dicson12/plugins/src/tip/clickable_nicknames/'
+
+ @log_calls('ClickableNicknamesPlugin')
+ def init(self):
+ self.config_dialog = None#ClickableNicknamesPluginConfigDialog(self)
+ self.gui_extension_points = {
+ 'chat_control_base' : (self.connect_with_chat_control,
+ self.disconnect_from_chat_control)}
+
+ self.is_active = None
+ self.gc_controls = {}
+
+ self.tag_names = []
+ colors = gajim.config.get('gc_nicknames_colors')
+ colors = colors.split(':')
+ for i, color in enumerate(colors):
+ tagname = 'gc_nickname_color_' + str(i)
+ self.tag_names.append(tagname)
+
+ @log_calls('ClickableNicknamesPlugin')
+ def activate(self):
+ for gc_control in gajim.interface.msg_win_mgr.get_controls('gc'):
+ # TODO support minimized groupchat
+ if gc_control not in self.gc_controls.keys():
+ control = Base(self, gc_control)
+ self.gc_controls[gc_control] = control
+ else:
+ self.gc_controls[gc_control].connect_signals()
+ self.is_active = True
+
+ @log_calls('ClickableNicknamesPlugin')
+ def deactivate(self):
+ for control in self.gc_controls.keys():
+ self.gc_controls[control].disconnect_from_chat_control()
+ self.gc_controls.clear()
+ self.is_active = None
+
+ @log_calls('ClickableNicknamesPlugin')
+ def connect_with_chat_control(self, chat_control):
+ if chat_control.widget_name != 'groupchat_control':
+ return
+ if self.is_active:
+ control = Base(self, chat_control)
+ self.gc_controls[chat_control] = control
+
+ @log_calls('ClickableNicknamesPlugin')
+ def disconnect_from_chat_control(self, chat_control):
+ pass
+
+class Base(object):
+ def __init__(self, plugin, chat_control):
+ self.plugin = plugin
+ self.chat_control = chat_control
+ self.textview = self.chat_control.conv_textview
+ self.tags_id = []
+ self.change_cursor = False
+ self.connect_signals()
+
+ def connect_signals(self):
+ # connect signals with textbuffer tags
+ self.tag_names = self.plugin.tag_names
+ tag_table = self.textview.tv.get_buffer().get_tag_table()
+ for name in self.tag_names:
+ tag = tag_table.lookup(name)
+ if tag:
+ id_ = tag.connect('event', self.insert_nick, name)
+ self.chat_control.handlers[id_] = tag
+ self.tags_id.append((id_, tag))
+
+ self.id_ = self.textview.tv.connect('motion_notify_event',
+ self.on_textview_motion_notify_event)
+ self.chat_control.handlers[self.id_] = self.textview.tv
+
+ def on_textview_motion_notify_event(self, widget, event):
+ # change cursor on the nicks
+ pointer_x, pointer_y = self.textview.tv.window.get_pointer()[0:2]
+ x, y = self.textview.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
+ pointer_x, pointer_y)
+ tags = self.textview.tv.get_iter_at_location(x, y).get_tags()
+ tag_table = self.textview.tv.get_buffer().get_tag_table()
+ if self.change_cursor:
+ self.textview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(
+ gtk.gdk.Cursor(gtk.gdk.XTERM))
+ self.change_cursor = False
+ for tag in tags:
+ if tag in [x[1] for x in self.tags_id]:
+ self.textview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(
+ gtk.gdk.Cursor(gtk.gdk.HAND2))
+ self.change_cursor = True
+ self.textview.on_textview_motion_notify_event(widget, event)
+
+ def insert_nick(self, texttag, widget, event, iter_, kind):
+ # insert nickname to message buffer
+ if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
+ # left mouse button clicked
+ begin_iter = iter_.copy()
+ # we get the begining of the tag
+ while not begin_iter.begins_tag(texttag):
+ begin_iter.backward_char()
+ end_iter = iter_.copy()
+ # we get the end of the tag
+ while not end_iter.ends_tag(texttag):
+ end_iter.forward_char()
+ buffer_ = self.textview.tv.get_buffer()
+ word = buffer_.get_text(begin_iter, end_iter).decode('utf-8')
+ nick = word.rstrip().rstrip(gajim.config.get('after_nickname'))
+ nick = nick.lstrip(gajim.config.get('before_nickname'))
+ nick = nick + gajim.config.get('gc_refer_to_nick_char') + ' '
+ message_buffer = self.chat_control.msg_textview.get_buffer()
+ message_buffer.insert_at_cursor(nick)
+ self.chat_control.msg_textview.grab_focus()
+
+ def disconnect_from_chat_control(self):
+ # disconnect signals from textbuffer tags
+ for item in self.tags_id:
+ if item[1].handler_is_connected(item[0]):
+ item[1].disconnect(item[0])
+ if self.textview.tv.handler_is_connected(self.id_):
+ self.textview.tv.disconnect(self.id_)