[polari/wip/raresv/finalRebase: 14/18] chatView: split out _createNickTag() and _onNickTagClicked() and use them. chatView: create popovers
- From: Rares Visalom <raresvisalom src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [polari/wip/raresv/finalRebase: 14/18] chatView: split out _createNickTag() and _onNickTagClicked() and use them. chatView: create popovers
- Date: Thu, 18 Aug 2016 18:52:07 +0000 (UTC)
commit 6b2c5c04216a04824861e9babe402cc7dc85930b
Author: raresv <rares visalom gmail com>
Date: Thu Aug 18 18:06:33 2016 +0300
chatView: split out _createNickTag() and _onNickTagClicked() and use them.
chatView: create popovers on demand, not upon creating the nickTag.
src/chatView.js | 64 ++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 52 insertions(+), 12 deletions(-)
---
diff --git a/src/chatView.js b/src/chatView.js
index 265413e..12d9c3b 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;
@@ -1168,15 +1169,19 @@ const ChatView = new Lang.Class({
let tags = [this._lookupTag('nick')];
let nickTagName = this._getNickTagName(message.nick);
let nickTag = this._lookupTag(nickTagName);
+ let buffer = this._view.get_buffer();
if (!nickTag) {
- nickTag = this._createNickTag(message.nick);
- this._view.get_buffer().get_tag_table().add(nickTag);
+ nickTag = this._createNickTag(nickTagName);
+ buffer.get_tag_table().add(nickTag);
+
+ this._updateNickTag(nickTag, this._userTracker.getNickStatus(message.nick));
}
tags.push(nickTag);
if (needsGap)
tags.push(this._lookupTag('gap'));
- this._insertWithTags(iter, message.nick + '\t', tags);
+ this._insertWithTags(iter, message.nick, tags);
+ buffer.insert(iter, '\t', -1);
}
state.lastNick = message.nick;
tags.push(this._lookupTag('message'));
@@ -1208,15 +1213,6 @@ const ChatView = new Lang.Class({
this._insertWithTags(iter, text.substr(pos), tags);
},
- _createNickTag: function(nickName) {
- let nickTagName = this._getNickTagName(nickName);
-
- let tag = new Gtk.TextTag({ name: nickTagName });
- this._updateNickTag(tag, this._userTracker.getNickStatus(nickName));
-
- return tag;
- },
-
_updateNickTag: function(tag, status) {
if (status == Tp.ConnectionPresenceType.AVAILABLE)
tag.foreground_rgba = this._activeNickColor;
@@ -1224,6 +1220,50 @@ const ChatView = new Lang.Class({
tag.foreground_rgba = this._inactiveNickColor;
},
+ _createNickTag: function(name) {
+ let tag = new ButtonTag({ name: name });
+ tag.connect('clicked', Lang.bind(this, this._onNickTagClicked));
+ return tag;
+ },
+
+ _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;
+
+ //TODO: special chars?
+ 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]