diff --git a/data/org.gnome.Polari.data.gresource.xml b/data/org.gnome.Polari.data.gresource.xml
index 0b43fbec21f3ccec711a387b86576dc74aff351a..dd19367f8cc5188c330d46faa79637411e1c9562 100644
--- a/data/org.gnome.Polari.data.gresource.xml
+++ b/data/org.gnome.Polari.data.gresource.xml
@@ -12,6 +12,7 @@
resources/entry-area.ui
resources/join-room-dialog.ui
resources/main-window.ui
+ resources/nick-popover.ui
resources/room-list-header.ui
resources/room-list-row.ui
resources/server-room-list.ui
diff --git a/data/resources/entry-area.ui b/data/resources/entry-area.ui
index 9de1d4381a17f58d52ec79a66aa0d2ac5615461c..ed57aaea2bfadfefc89988349c430786893b2b3d 100644
--- a/data/resources/entry-area.ui
+++ b/data/resources/entry-area.ui
@@ -1,44 +1,5 @@
-
True
end
@@ -58,7 +19,6 @@
True
True
False
- nickPopover
+
+
+
+
+
+
diff --git a/src/entryArea.js b/src/entryArea.js
index 2ffd30a78989fe2046cd8f8c50e4b5a0cc8c330d..ae912501ddc0bd5e51731e71dd76f2c0f91c147d 100644
--- a/src/entryArea.js
+++ b/src/entryArea.js
@@ -20,6 +20,7 @@ const MAX_LINES = 5;
let _checker = null;
let _emojiPicker = null;
+let _nickPopover = null;
var ChatEntry = GObject.registerClass({
Implements: [PasteManager.DropTargetIface],
@@ -135,14 +136,57 @@ var ChatEntry = GObject.registerClass({
}
});
+var NickPopover = GObject.registerClass({
+ Template: 'resource:///org/gnome/Polari/ui/nick-popover.ui',
+ InternalChildren: ['nickEntry',
+ 'changeButton'],
+ Properties: {
+ nick: GObject.ParamSpec.string('nick',
+ 'nick',
+ 'nick',
+ GObject.ParamFlags.READWRITE |
+ GObject.ParamFlags.EXPLICIT_NOTIFY,
+ '')
+ },
+ Signals: { 'nick-changed': {} }
+}, class NickPopover extends Gtk.Popover {
+ _init() {
+ this._nick = '';
+
+ super._init();
+
+ this.set_default_widget(this._changeButton);
+
+ this._changeButton.connect('clicked', () => {
+ if (!this._nickEntry.text)
+ return;
+
+ this._nick = this._nickEntry.text;
+ this.emit('nick-changed');
+ });
+ }
+
+ get nick() {
+ return this._nick;
+ }
+
+ set nick(nick) {
+ if (this._nick == nick)
+ return;
+
+ if (!this._nickEntry['is-focus'])
+ this._nickEntry.text = nick;
+ this._nick = nick;
+
+ this.notify('nick');
+ }
+});
+
var EntryArea = GObject.registerClass({
Template: 'resource:///org/gnome/Polari/ui/entry-area.ui',
InternalChildren: ['chatEntry',
'nickButton',
'nickLabel',
- 'nickPopover',
- 'nickEntry',
- 'changeButton',
'pasteBox',
'confirmLabel',
'uploadLabel',
@@ -162,6 +206,7 @@ var EntryArea = GObject.registerClass({
this._ircParser = new IrcParser.IrcParser(this._room);
this._maxNickChars = ChatView.MAX_NICK_CHARS;
+ this._nickChangedId = 0;
super._init(params);
@@ -172,6 +217,25 @@ var EntryArea = GObject.registerClass({
this._keyPressId = this._toplevel.connect('key-press-event',
Lang.bind(this, this._onKeyPressEvent));
});
+ this.connect('map', () => {
+ if (!_nickPopover)
+ _nickPopover = new NickPopover();
+ this._nickButton.popover = _nickPopover;
+
+ if (this._nickChangedId)
+ return;
+
+ this._nickChangedId = _nickPopover.connect('nick-changed', () => {
+ this._setNick(_nickPopover.nick);
+ this._nickButton.active = false;
+ });
+ this._updateNick();
+ });
+ this.connect('unmap', () => {
+ if (this._nickChangedId)
+ _nickPopover.disconnect(this._nickChangedId);
+ this._nickChangedId = 0;
+ });
this._nickLabel.set_state_flags(Gtk.StateFlags.LINK, false);
this._nickLabel.width_chars = this._maxNickChars;
@@ -187,13 +251,6 @@ var EntryArea = GObject.registerClass({
w.set_state_flags (state, true);
});
- this._changeButton.connect('clicked', () => {
- if (this._nickEntry.text)
- this._setNick(this._nickEntry.text);
- this._nickButton.active = false;
- });
- this._nickPopover.set_default_widget(this._changeButton);
-
this._chatEntry.connect('text-pasted', (entry, text, nLines) => {
this.pasteText(text, nLines);
});
@@ -422,6 +479,9 @@ var EntryArea = GObject.registerClass({
this._nickLabel.width_chars = Math.max(nick.length, this._maxNickChars);
this._nickLabel.label = nick;
+ if (!this.get_mapped())
+ return;
+
let app = Gio.Application.get_default();
app.setAccountNick(this._room.account, nick);
@@ -447,8 +507,8 @@ var EntryArea = GObject.registerClass({
this._nickLabel.width_chars = Math.max(nick.length, this._maxNickChars);
this._nickLabel.label = nick;
- if (!this._nickEntry['is-focus'])
- this._nickEntry.text = nick;
+ if (this.get_mapped())
+ _nickPopover.nick = nick;
}
_onDestroy() {
@@ -467,5 +527,8 @@ var EntryArea = GObject.registerClass({
if (this._keyPressId)
this._toplevel.disconnect(this._keyPressId);
this._keyPressId = 0;
+ if (this._nickChangedId)
+ _nickPopover.disconnect(this._nickChangedId);
+ this._nickChangedId = 0;
}
});