Refactor link context menu
- Move hyperlink handling into HtmlTextView - Use actions on the menuitems
This commit is contained in:
parent
4077e0d6d6
commit
06302cdc4d
|
@ -14,6 +14,9 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk
|
||||
|
||||
from gajim.common import app
|
||||
from gajim.common import helpers
|
||||
from gajim.common.app import interface
|
||||
|
@ -130,24 +133,29 @@ def on_service_disco(action, param):
|
|||
pass
|
||||
|
||||
|
||||
def on_join_gc(action, param):
|
||||
account = None
|
||||
def on_join_gc(_action, param):
|
||||
account, jid = None, None
|
||||
if param is None:
|
||||
if not app.get_connected_accounts():
|
||||
return
|
||||
else:
|
||||
account = param.get_string()
|
||||
account, jid = param.get_strv()
|
||||
if not jid:
|
||||
jid = None
|
||||
window = app.get_app_window(JoinGroupchatWindow)
|
||||
if window is None:
|
||||
JoinGroupchatWindow(account, None)
|
||||
JoinGroupchatWindow(account, jid)
|
||||
else:
|
||||
window.present()
|
||||
|
||||
|
||||
def on_add_contact(action, param):
|
||||
window = app.get_app_window(AddNewContactWindow)
|
||||
def on_add_contact(_action, param):
|
||||
account, jid = param.get_strv()
|
||||
if not jid:
|
||||
jid = None
|
||||
window = app.get_app_window(AddNewContactWindow, account)
|
||||
if window is None:
|
||||
AddNewContactWindow(param.get_string())
|
||||
AddNewContactWindow(account, jid)
|
||||
else:
|
||||
window.present()
|
||||
|
||||
|
@ -337,3 +345,25 @@ def show_next_pending_event(action, param):
|
|||
if not event:
|
||||
return
|
||||
app.interface.handle_event(account, jid, event.type_)
|
||||
|
||||
|
||||
def open_link(_action, param):
|
||||
kind, link = param.get_strv()
|
||||
helpers.launch_browser_mailer(kind, link)
|
||||
|
||||
|
||||
def copy_link(_action, param):
|
||||
text = param.get_string()
|
||||
clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
||||
clip.set_text(text, -1)
|
||||
|
||||
|
||||
def start_chat(_action, param):
|
||||
account, jid = param.get_strv()
|
||||
app.interface.new_chat_from_jid(account, jid)
|
||||
|
||||
|
||||
def join_groupchat(_action, param):
|
||||
account, jid = param.get_strv()
|
||||
room_jid = jid.split('?')[0]
|
||||
app.interface.join_gc_minimal(account, room_jid)
|
||||
|
|
|
@ -363,6 +363,14 @@ class GajimApplication(Gtk.Application):
|
|||
act.connect("activate", app_actions.on_add_contact_jid)
|
||||
self.add_action(act)
|
||||
|
||||
act = Gio.SimpleAction.new('copy-link', GLib.VariantType.new('s'))
|
||||
act.connect("activate", app_actions.copy_link)
|
||||
self.add_action(act)
|
||||
|
||||
act = Gio.SimpleAction.new('open-link', GLib.VariantType.new('as'))
|
||||
act.connect("activate", app_actions.open_link)
|
||||
self.add_action(act)
|
||||
|
||||
for action in general_actions:
|
||||
action_name, func = action
|
||||
act = Gio.SimpleAction.new(action_name, None)
|
||||
|
@ -388,8 +396,9 @@ class GajimApplication(Gtk.Application):
|
|||
|
||||
return [
|
||||
('-start-single-chat', a.on_single_message, 'online', 's'),
|
||||
('-join-groupchat', a.on_join_gc, 'online', 's'),
|
||||
('-add-contact', a.on_add_contact, 'online', 's'),
|
||||
('-start-chat', a.start_chat, 'online', 'as'),
|
||||
('-join-groupchat', a.on_join_gc, 'online', 'as'),
|
||||
('-add-contact', a.on_add_contact, 'online', 'as'),
|
||||
('-services', a.on_service_disco, 'online', 's'),
|
||||
('-profile', a.on_profile, 'feature', 's'),
|
||||
('-xml-console', a.on_xml_console, 'always', 's'),
|
||||
|
|
|
@ -23,21 +23,20 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import time
|
||||
import os
|
||||
import queue
|
||||
import urllib
|
||||
import logging
|
||||
from calendar import timegm
|
||||
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk
|
||||
from gi.repository import Pango
|
||||
from gi.repository import GObject
|
||||
from gi.repository import GLib
|
||||
import time
|
||||
import os
|
||||
|
||||
import queue
|
||||
import urllib
|
||||
|
||||
from gajim.gtk import AddNewContactWindow
|
||||
from gajim.gtk import util
|
||||
from gajim.gtk.util import load_icon
|
||||
from gajim.gtk.util import get_builder
|
||||
from gajim.gtk.util import get_cursor
|
||||
from gajim.gtk.emoji_data import emoji_pixbufs
|
||||
from gajim.gtk.emoji_data import is_emoji
|
||||
|
@ -45,7 +44,7 @@ from gajim.gtk.emoji_data import get_emoji_pixbuf
|
|||
from gajim.common import app
|
||||
from gajim.common import helpers
|
||||
from gajim.common import i18n
|
||||
from calendar import timegm
|
||||
|
||||
from gajim.common.fuzzyclock import FuzzyClock
|
||||
from gajim.common.const import StyleAttr
|
||||
|
||||
|
@ -55,7 +54,6 @@ NOT_SHOWN = 0
|
|||
ALREADY_RECEIVED = 1
|
||||
SHOWN = 2
|
||||
|
||||
import logging
|
||||
log = logging.getLogger('gajim.conversation_textview')
|
||||
|
||||
def is_selection_modified(mark):
|
||||
|
@ -172,10 +170,7 @@ class ConversationTextview(GObject.GObject):
|
|||
self.fc = FuzzyClock()
|
||||
|
||||
# no need to inherit TextView, use it as atrribute is safer
|
||||
self.tv = HtmlTextView()
|
||||
# we have to override HtmlTextView Event handlers
|
||||
# because we don't inherit
|
||||
self.tv.hyperlink_handler = self.hyperlink_handler
|
||||
self.tv = HtmlTextView(account)
|
||||
self.tv.connect_tooltip(self.query_tooltip)
|
||||
|
||||
# set properties
|
||||
|
@ -658,146 +653,6 @@ class ConversationTextview(GObject.GObject):
|
|||
finish_sel.forward_word_end()
|
||||
self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True)
|
||||
|
||||
def on_open_link_activate(self, widget, kind, text):
|
||||
helpers.launch_browser_mailer(kind, text)
|
||||
|
||||
def on_copy_link_activate(self, widget, text):
|
||||
clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
||||
clip.set_text(text, -1)
|
||||
|
||||
def on_start_chat_activate(self, widget, jid):
|
||||
app.interface.new_chat_from_jid(self.account, jid)
|
||||
|
||||
def on_join_group_chat_menuitem_activate(self, widget, room_jid):
|
||||
# Remove ?join
|
||||
room_jid = room_jid.split('?')[0]
|
||||
app.interface.join_gc_minimal(self.account, room_jid)
|
||||
|
||||
def on_add_to_roster_activate(self, widget, jid):
|
||||
AddNewContactWindow(self.account, jid)
|
||||
|
||||
def make_link_menu(self, event, kind, text):
|
||||
xml = get_builder('chat_context_menu.ui')
|
||||
menu = xml.get_object('chat_context_menu')
|
||||
childs = menu.get_children()
|
||||
if kind == 'url':
|
||||
id_ = childs[0].connect('activate', self.on_copy_link_activate, text)
|
||||
self.handlers[id_] = childs[0]
|
||||
id_ = childs[1].connect('activate', self.on_open_link_activate, kind,
|
||||
text)
|
||||
self.handlers[id_] = childs[1]
|
||||
childs[2].hide() # copy mail/jid address
|
||||
childs[3].hide() # open mail composer
|
||||
childs[4].hide() # jid section separator
|
||||
childs[5].hide() # start chat
|
||||
childs[6].hide() # join group chat
|
||||
childs[7].hide() # add to roster
|
||||
else: # It's a mail or a JID
|
||||
text = text.lower()
|
||||
if text.startswith('xmpp:'):
|
||||
text = text[5:]
|
||||
id_ = childs[2].connect('activate', self.on_copy_link_activate, text)
|
||||
self.handlers[id_] = childs[2]
|
||||
id_ = childs[3].connect('activate', self.on_open_link_activate, kind,
|
||||
text)
|
||||
self.handlers[id_] = childs[3]
|
||||
id_ = childs[5].connect('activate', self.on_start_chat_activate, text)
|
||||
self.handlers[id_] = childs[5]
|
||||
id_ = childs[6].connect('activate',
|
||||
self.on_join_group_chat_menuitem_activate, text)
|
||||
self.handlers[id_] = childs[6]
|
||||
|
||||
if self.account and app.connections[self.account].\
|
||||
roster_supported:
|
||||
id_ = childs[7].connect('activate',
|
||||
self.on_add_to_roster_activate, text)
|
||||
self.handlers[id_] = childs[7]
|
||||
childs[7].show() # show add to roster menuitem
|
||||
else:
|
||||
childs[7].hide() # hide add to roster menuitem
|
||||
|
||||
if kind == 'xmpp':
|
||||
id_ = childs[0].connect('activate', self.on_copy_link_activate,
|
||||
'xmpp:' + text)
|
||||
self.handlers[id_] = childs[0]
|
||||
childs[0].set_label(_('Copy JID'))
|
||||
childs[2].hide() # copy mail/jid address
|
||||
childs[3].hide() # open mail composer
|
||||
childs[4].hide() # jid section separator
|
||||
elif kind == 'mail':
|
||||
childs[2].set_label(_('Copy Email Address'))
|
||||
childs[4].hide() # jid section separator
|
||||
childs[5].hide() # start chat
|
||||
childs[6].hide() # join group chat
|
||||
childs[7].hide() # add to roster
|
||||
|
||||
if kind != 'xmpp':
|
||||
childs[0].hide() # copy link location
|
||||
childs[1].hide() # open link in browser
|
||||
|
||||
menu.attach_to_widget(self.tv, None)
|
||||
menu.popup(None, None, None, None, event.button.button, event.time)
|
||||
|
||||
def hyperlink_handler(self, texttag, widget, event, iter_, kind):
|
||||
if event.type == Gdk.EventType.BUTTON_PRESS:
|
||||
begin_iter = iter_.copy()
|
||||
# we get the beginning 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()
|
||||
|
||||
# Detect XHTML-IM link
|
||||
word = getattr(texttag, 'href', None)
|
||||
if word:
|
||||
if word.startswith('xmpp'):
|
||||
kind = 'xmpp'
|
||||
elif word.startswith('mailto:'):
|
||||
kind = 'mail'
|
||||
elif app.interface.sth_at_sth_dot_sth_re.match(word):
|
||||
# it's a JID or mail
|
||||
kind = 'sth_at_sth'
|
||||
else:
|
||||
word = self.tv.get_buffer().get_text(begin_iter, end_iter, True)
|
||||
|
||||
if event.button.button == 3: # right click
|
||||
self.make_link_menu(event, kind, word)
|
||||
return True
|
||||
|
||||
self.plugin_modified = False
|
||||
app.plugin_manager.extension_point(
|
||||
'hyperlink_handler', word, kind, self,
|
||||
self.tv.get_toplevel())
|
||||
if self.plugin_modified:
|
||||
return
|
||||
|
||||
# we launch the correct application
|
||||
if kind == 'xmpp':
|
||||
word = word[5:]
|
||||
if '?' in word:
|
||||
(jid, action) = word.split('?')
|
||||
if action == 'join':
|
||||
app.interface.join_gc_minimal(self.account, jid)
|
||||
else:
|
||||
self.on_start_chat_activate(None, jid)
|
||||
else:
|
||||
self.on_start_chat_activate(None, word)
|
||||
# handle geo:-URIs
|
||||
elif word[:4] == 'geo:':
|
||||
location = word[4:]
|
||||
lat, _, lon = location.partition(',')
|
||||
if lon == '':
|
||||
return
|
||||
uri = 'https://www.openstreetmap.org/?' \
|
||||
'mlat=%(lat)s&mlon=%(lon)s&zoom=16' % \
|
||||
{'lat': lat, 'lon': lon}
|
||||
helpers.launch_browser_mailer(kind, uri)
|
||||
# other URIs
|
||||
else:
|
||||
helpers.launch_browser_mailer(kind, word)
|
||||
|
||||
def detect_and_print_special_text(self, otext, other_tags, graphics=True,
|
||||
iter_=None, additional_data=None):
|
||||
"""
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated with glade 3.18.3 -->
|
||||
<interface>
|
||||
<requires lib="gtk+" version="3.12"/>
|
||||
<object class="GtkMenu" id="chat_context_menu">
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="copy_link_location_menuitem">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">_Copy Link Location</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="open_link_in_browser_menuitem">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">_Open Link in Browser</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="copy_email_address_menuitem">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">_Copy JID/Email Address</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="open_email_composer_menuitem">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">_Open Email Composer</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="jid_section_separator">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="start_chat_menuitem">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">_Start Chat</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="join_group_chat_menuitem">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Join _Group Chat</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="on_join_group_chat_menuitem_activate" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="add_to_roster_menuitem">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">_Add to Roster...</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
|
@ -675,7 +675,7 @@ def get_bookmarks_menu(account, rebuild=False):
|
|||
# Build Join Groupchat
|
||||
action = 'app.{}-join-groupchat'.format(account)
|
||||
menuitem = Gio.MenuItem.new(_('Join Group Chat'), action)
|
||||
variant = GLib.Variant('s', account)
|
||||
variant = GLib.Variant('as', [account, ''])
|
||||
menuitem.set_action_and_target_value(action, variant)
|
||||
menu.append_item(menuitem)
|
||||
|
||||
|
@ -749,7 +749,10 @@ def get_account_menu(account):
|
|||
continue
|
||||
action = 'app.{}{}'.format(account, action)
|
||||
menuitem = Gio.MenuItem.new(label, action)
|
||||
variant = GLib.Variant('s', account)
|
||||
if 'add_contact' in action:
|
||||
variant = GLib.Variant('as', [account, ''])
|
||||
else:
|
||||
variant = GLib.Variant('s', account)
|
||||
menuitem.set_action_and_target_value(action, variant)
|
||||
menu.append_item(menuitem)
|
||||
else:
|
||||
|
@ -840,6 +843,75 @@ def get_encryption_menu(control_id, type_id, zeroconf=False):
|
|||
return menu
|
||||
|
||||
|
||||
def get_conv_context_menu(account, kind, text):
|
||||
if kind == 'xmpp':
|
||||
if '?join' in text:
|
||||
context_menu = [
|
||||
('copy-link', _('Copy JID')),
|
||||
('-join-groupchat', _('Join Groupchat')),
|
||||
]
|
||||
else:
|
||||
context_menu = [
|
||||
('copy-link', _('Copy JID')),
|
||||
('-start-chat', _('Start Chat')),
|
||||
('-add-contact', _('Add to Roster…')),
|
||||
]
|
||||
|
||||
elif kind == 'url':
|
||||
context_menu = [
|
||||
('copy-link', _('Copy Link Location')),
|
||||
('open-link', _('Open Link in Browser')),
|
||||
]
|
||||
|
||||
elif kind == 'mail':
|
||||
context_menu = [
|
||||
('copy-link', _('Copy Email Address')),
|
||||
('open-link', _('Open Email Composer')),
|
||||
]
|
||||
|
||||
elif kind == 'sth_at_sth':
|
||||
context_menu = [
|
||||
('copy-link', _('Copy JID/Email')),
|
||||
('open-link', _('Open Email Composer')),
|
||||
('-start-chat', _('Start Chat')),
|
||||
('-join-groupchat', _('Join Groupchat')),
|
||||
('-add-contact', _('Add to Roster…')),
|
||||
]
|
||||
else:
|
||||
return
|
||||
|
||||
menu = Gtk.Menu()
|
||||
for item in context_menu:
|
||||
action, label = item
|
||||
menuitem = Gtk.MenuItem()
|
||||
menuitem.set_label(label)
|
||||
|
||||
if action.startswith('-'):
|
||||
action = 'app.%s%s' % (account, action)
|
||||
else:
|
||||
action = 'app.%s' % action
|
||||
menuitem.set_action_name(action)
|
||||
|
||||
if 'join-groupchat' in action:
|
||||
text = text.replace('xmpp:', '')
|
||||
text = text.split('?')[0]
|
||||
|
||||
if 'add-contact' in action:
|
||||
text = text.replace('xmpp:', '')
|
||||
text = text.split('?')[0]
|
||||
|
||||
if action == 'app.open-link':
|
||||
value = GLib.Variant.new_strv([kind, text])
|
||||
elif action == 'app.copy-link':
|
||||
value = GLib.Variant.new_string(text)
|
||||
else:
|
||||
value = GLib.Variant.new_strv([account, text])
|
||||
menuitem.set_action_target_value(value)
|
||||
menuitem.show()
|
||||
menu.append(menuitem)
|
||||
return menu
|
||||
|
||||
|
||||
def escape_mnemonic(label):
|
||||
if label is None:
|
||||
return
|
||||
|
|
|
@ -43,16 +43,16 @@ from gi.repository import Pango
|
|||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk
|
||||
from gi.repository import GdkPixbuf
|
||||
from gi.repository import GLib
|
||||
|
||||
from gajim.common import app
|
||||
from gajim.common import helpers
|
||||
from gajim.common.i18n import _
|
||||
from gajim.common.const import StyleAttr
|
||||
from gajim.gtk import JoinGroupchatWindow
|
||||
from gajim.gtk import AddNewContactWindow
|
||||
from gajim.gtk.util import load_icon
|
||||
from gajim.gtk.util import get_cursor
|
||||
from gajim.gtk.util import get_builder
|
||||
|
||||
from gajim.gui_menu_builder import get_conv_context_menu
|
||||
|
||||
log = logging.getLogger('gajim.htmlview')
|
||||
|
||||
|
@ -825,7 +825,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler):
|
|||
|
||||
class HtmlTextView(Gtk.TextView):
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, account=None):
|
||||
Gtk.TextView.__init__(self)
|
||||
self.set_wrap_mode(Gtk.WrapMode.CHAR)
|
||||
self.set_editable(False)
|
||||
|
@ -835,11 +835,12 @@ class HtmlTextView(Gtk.TextView):
|
|||
self.connect('unrealize', self.on_html_text_view_unrealized)
|
||||
self.connect('copy-clipboard', self.on_html_text_view_copy_clipboard)
|
||||
self.id_ = self.connect('button-release-event',
|
||||
self.on_left_mouse_button_release)
|
||||
self.on_left_mouse_button_release)
|
||||
self.get_buffer().eol_tag = self.get_buffer().create_tag('eol')
|
||||
self.config = app.config
|
||||
self.interface = app.interface
|
||||
# end big hack
|
||||
self.account = account
|
||||
self.plugin_modified = False
|
||||
|
||||
def connect_tooltip(self, func=None):
|
||||
self.connect('query-tooltip', func or self.__query_tooltip)
|
||||
|
@ -892,73 +893,21 @@ class HtmlTextView(Gtk.TextView):
|
|||
self._changed_cursor = False
|
||||
return False
|
||||
|
||||
def on_open_link_activate(self, widget, kind, text):
|
||||
helpers.launch_browser_mailer(kind, text)
|
||||
def show_context_menu(self, _event, kind, text):
|
||||
menu = get_conv_context_menu(self.account, kind, text)
|
||||
if menu is None:
|
||||
return
|
||||
|
||||
def on_copy_link_activate(self, widget, text):
|
||||
clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
||||
clip.set_text(text, -1)
|
||||
def destroy(menu, pspec):
|
||||
visible = menu.get_property('visible')
|
||||
if not visible:
|
||||
GLib.idle_add(menu.destroy)
|
||||
|
||||
# def on_start_chat_activate(self, widget, jid):
|
||||
# app.interface.new_chat_from_jid(self.account, jid)
|
||||
menu.attach_to_widget(self, None)
|
||||
menu.connect('notify::visible', destroy)
|
||||
menu.popup_at_pointer()
|
||||
|
||||
def on_join_group_chat_menuitem_activate(self, widget, room_jid):
|
||||
JoinGroupchatWindow(None, room_jid)
|
||||
|
||||
def on_add_to_roster_activate(self, widget, jid):
|
||||
AddNewContactWindow(self.account, jid)
|
||||
|
||||
def make_link_menu(self, event, kind, text):
|
||||
ui = get_builder('chat_context_menu.ui')
|
||||
menu = ui.get_object('chat_context_menu')
|
||||
childs = menu.get_children()
|
||||
if kind == 'url':
|
||||
childs[0].connect('activate', self.on_copy_link_activate, text)
|
||||
childs[1].connect('activate', self.on_open_link_activate, kind,
|
||||
text)
|
||||
childs[2].hide() # copy mail address
|
||||
childs[3].hide() # open mail composer
|
||||
childs[4].hide() # jid section separator
|
||||
childs[5].hide() # start chat
|
||||
childs[6].hide() # join group chat
|
||||
childs[7].hide() # add to roster
|
||||
else: # It's a mail or a JID
|
||||
text = text.lower()
|
||||
if text.startswith('xmpp:'):
|
||||
text = text[5:]
|
||||
childs[2].connect('activate', self.on_copy_link_activate, text)
|
||||
childs[3].connect('activate', self.on_open_link_activate, kind,
|
||||
text)
|
||||
# childs[5].connect('activate', self.on_start_chat_activate, text)
|
||||
childs[6].connect('activate',
|
||||
self.on_join_group_chat_menuitem_activate, text)
|
||||
|
||||
# if self.account and app.connections[self.account].\
|
||||
# roster_supported:
|
||||
# childs[7].connect('activate',
|
||||
# self.on_add_to_roster_activate, text)
|
||||
# childs[7].show() # show add to roster menuitem
|
||||
# else:
|
||||
# childs[7].hide() # hide add to roster menuitem
|
||||
|
||||
if kind == 'xmpp':
|
||||
childs[0].connect('activate', self.on_copy_link_activate,
|
||||
'xmpp:' + text)
|
||||
childs[2].hide() # copy mail address
|
||||
childs[3].hide() # open mail composer
|
||||
elif kind == 'mail':
|
||||
childs[6].hide() # join group chat
|
||||
|
||||
if kind != 'xmpp':
|
||||
childs[0].hide() # copy link location
|
||||
childs[1].hide() # open link in browser
|
||||
childs[4].hide() # jid section separator
|
||||
childs[5].hide() # start chat
|
||||
childs[7].hide() # add to roster
|
||||
|
||||
menu.popup(None, None, None, event.button, event.time)
|
||||
|
||||
def hyperlink_handler(self, texttag, widget, event, iter_, kind):
|
||||
def hyperlink_handler(self, texttag, _widget, event, iter_, kind):
|
||||
if event.type == Gdk.EventType.BUTTON_PRESS:
|
||||
begin_iter = iter_.copy()
|
||||
# we get the beginning of the tag
|
||||
|
@ -980,31 +929,45 @@ class HtmlTextView(Gtk.TextView):
|
|||
# it's a JID or mail
|
||||
kind = 'sth_at_sth'
|
||||
else:
|
||||
word = self.textview.get_buffer().get_text(begin_iter,
|
||||
end_iter)
|
||||
word = self.get_buffer().get_text(begin_iter, end_iter, True)
|
||||
|
||||
if event.button == 3: # right click
|
||||
self.make_link_menu(event, kind, word)
|
||||
if event.button.button == 3: # right click
|
||||
self.show_context_menu(event, kind, word)
|
||||
return True
|
||||
|
||||
self.plugin_modified = False
|
||||
app.plugin_manager.extension_point(
|
||||
'hyperlink_handler', word, kind, self,
|
||||
self.get_toplevel())
|
||||
if self.plugin_modified:
|
||||
return
|
||||
|
||||
# we launch the correct application
|
||||
if kind == 'xmpp':
|
||||
word = word[5:]
|
||||
if '?' in word:
|
||||
(jid, action) = word.split('?')
|
||||
if action == 'join':
|
||||
self.on_join_group_chat_menuitem_activate(None, jid)
|
||||
app.interface.join_gc_minimal(self.account, jid)
|
||||
else:
|
||||
self.on_start_chat_activate(None, jid)
|
||||
app.interface.new_chat_from_jid(self.account, jid)
|
||||
else:
|
||||
self.on_start_chat_activate(None, word)
|
||||
app.interface.new_chat_from_jid(self.account, word)
|
||||
|
||||
# handle geo:-URIs
|
||||
elif word[:4] == 'geo:':
|
||||
location = word[4:]
|
||||
lat, _, lon = location.partition(',')
|
||||
if lon == '':
|
||||
return
|
||||
uri = 'https://www.openstreetmap.org/?' \
|
||||
'mlat=%(lat)s&mlon=%(lon)s&zoom=16' % \
|
||||
{'lat': lat, 'lon': lon}
|
||||
helpers.launch_browser_mailer(kind, uri)
|
||||
# other URIs
|
||||
else:
|
||||
helpers.launch_browser_mailer(kind, word)
|
||||
|
||||
def _hyperlink_handler(self, texttag, widget, event, iter_, kind):
|
||||
# self.hyperlink_handler can be overwritten, so call it when needed
|
||||
self.hyperlink_handler(texttag, widget, event, iter_, kind)
|
||||
|
||||
def display_html(self, html, textview, conv_textview, iter_=None):
|
||||
buffer_ = self.get_buffer()
|
||||
if iter_:
|
||||
|
|
|
@ -3679,7 +3679,7 @@ class RosterWindow:
|
|||
When the join gc menuitem is clicked, show the join gc window
|
||||
"""
|
||||
app.app.activate_action('%s-join-groupchat' % account,
|
||||
GLib.Variant('s', account))
|
||||
GLib.Variant('as', [account, '']))
|
||||
|
||||
def on_show_transports_action(self, action, param):
|
||||
app.config.set('show_transports_group', param.get_boolean())
|
||||
|
|
Loading…
Reference in New Issue