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 @@ - - top - - - True - 6 - vertical - 6 - - - True - start - True - Change nickname: - - - - - True - True - - - - - _Change - True - True - True - end - True - True - - - - - - + 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; } });