[polari/wip/raresv/nick-popover: 13/16] chatView: Add click and hover support for the nickTag
- From: Rares Visalom <raresvisalom src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [polari/wip/raresv/nick-popover: 13/16] chatView: Add click and hover support for the nickTag
- Date: Sun, 11 Sep 2016 18:32:13 +0000 (UTC)
commit 7a73df4d38b48469857bfa33b2c40de17c9772d5
Author: raresv <rares visalom gmail com>
Date: Sat Aug 20 19:48:23 2016 +0300
chatView: Add click and hover support for the nickTag
We want to be able to highlight the nickname upon hovering
above it and we also want to be able to click it so that
the UserPopover becomes visible. this is achieved through
two separate tags, the ButtonTag (for the clicking part)
and the HoverTag.
https://bugzilla.gnome.org/show_bug.cgi?id=760853
src/chatView.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 47 insertions(+), 2 deletions(-)
---
diff --git a/src/chatView.js b/src/chatView.js
index c94771b..c6da6bc 100644
--- a/src/chatView.js
+++ b/src/chatView.js
@@ -15,6 +15,7 @@ const PasteManager = imports.pasteManager;
const Signals = imports.signals;
const Utils = imports.utils;
const UserTracker = imports.userTracker;
+const UserList = imports.userList;
const MAX_NICK_CHARS = 8;
const IGNORE_STATUS_TIME = 5;
@@ -1236,13 +1237,20 @@ const ChatView = new Lang.Class({
let buffer = this._view.get_buffer();
if (!nickTag) {
- nickTag = new Gtk.TextTag({ name: nickTagName });
+ nickTag = new ButtonTag({ name: nickTagName });
+ nickTag.connect('clicked', Lang.bind(this, this._onNickTagClicked));
this._updateNickTag(nickTag, this._userTracker.getNickStatus(message.nick));
-
buffer.get_tag_table().add(nickTag);
}
tags.push(nickTag);
+
+ let hoverTag = new HoverFilterTag({ filtered_tag: nickTag,
+ hover_opacity: 0.8 });
+ buffer.get_tag_table().add(hoverTag);
+
+ tags.push(hoverTag);
+
if (needsGap)
tags.push(this._lookupTag('gap'));
this._insertWithTags(iter, message.nick, tags);
@@ -1299,6 +1307,43 @@ const ChatView = new Lang.Class({
tag.foreground_rgba = this._inactiveNickColor;
},
+ _onNickTagClicked: function(tag) {
+ let view = this._view;
+ let event = Gtk.get_current_event();
+ let [, eventX, eventY] = event.get_coords();
+ let [x, y] = view.window_to_buffer_coords(Gtk.TextWindowType.WIDGET,
+ eventX, eventY);
+ let [inside, start] = view.get_iter_at_location(x, y);
+ let end = start.copy();
+
+ if (!start.starts_tag(tag))
+ start.backward_to_tag_toggle(tag);
+
+ if (!end.ends_tag(tag))
+ end.forward_to_tag_toggle(tag);
+
+ let rect1 = view.get_iter_location(start);
+ let rect2 = view.get_iter_location(end);
+
+ [rect1.y, rect1.height] = view.get_line_yrange(start);
+
+ [rect1.x, rect1.y] = view.buffer_to_window_coords(Gtk.TextWindowType.WIDGET, rect1.x, rect1.y);
+ [rect2.x, rect2.y] = view.buffer_to_window_coords(Gtk.TextWindowType.WIDGET, rect2.x, rect2.y);
+ rect1.width = rect2.x - rect1.x;
+
+ let actualNickName = view.get_buffer().get_slice(start, end, false);
+
+ if (!tag._popover)
+ tag._popover = new UserList.UserPopover({ relative_to: this._view,
+ userTracker: this._userTracker,
+ room: this._room });
+
+ tag._popover.nickname = actualNickName;
+
+ tag._popover.pointing_to = rect1;
+ tag._popover.show();
+ },
+
_createUrlTag: function(url) {
if (url.indexOf(':') == -1)
url = 'http://' + url;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]