diff --git a/go/gothings/gcd.go b/go/gothings/gcd.go index e6b9d1bb..d8db152f 100644 --- a/go/gothings/gcd.go +++ b/go/gothings/gcd.go @@ -36,6 +36,7 @@ type GrandCentralDispatcher struct { // messages pane stuff _ func(handle, from, displayName, message, image string, mID string, fromMe bool, ts string, ackd bool, error bool) `signal:"AppendMessage"` + _ func(handle, from, displayName, message, image string, mID string, fromMe bool, ts string, ackd bool, error bool) `signal:"PrependMessage"` _ func() `signal:"ClearMessages"` _ func() `signal:"ResetMessagePane"` _ func(mID string) `signal:"Acknowledged"` @@ -188,7 +189,7 @@ func (this *GrandCentralDispatcher) loadMessagesPaneHelper(handle string) { this.SetToolbarTitle(nick) } log.Debugf("messages: %d", len(tl)) - for i := range tl { + for i := len(tl) - 1; i >= 0; i-- { if tl[i].PeerID == the.Peer.GetProfile().Onion { handle = "me" } else { @@ -203,7 +204,7 @@ func (this *GrandCentralDispatcher) loadMessagesPaneHelper(handle string) { name = tl[i].PeerID[:16] + "..." } } - this.AppendMessage( + this.PrependMessage( handle, tl[i].PeerID, name, diff --git a/qml/overlays/ChatOverlay.qml b/qml/overlays/ChatOverlay.qml index 9eb2c636..3b90577f 100644 --- a/qml/overlays/ChatOverlay.qml +++ b/qml/overlays/ChatOverlay.qml @@ -12,93 +12,101 @@ import "../utils.js" as Utils ColumnLayout { Layout.fillWidth: true - Flickable { // THE MESSAGE LIST ITSELF - id: sv - clip: true - Layout.alignment: Qt.AlignLeft | Qt.AlignTop - Layout.fillHeight: true - Layout.fillWidth: true - contentWidth: colMessages.width - contentHeight: colMessages.height - boundsBehavior: Flickable.StopAtBounds - maximumFlickVelocity: 800 + + ListModel { // MESSAGE OBJECTS ARE STORED HERE ... + id: messagesModel + } + + ListView { + id: messagesListView + Layout.fillHeight: true + Layout.fillWidth: true + model: messagesModel + spacing: 6 + clip: true + ScrollBar.vertical: ScrollBar {} + + delegate: Message { + handle: _handle + from: _from + displayName: _displayName + message: _message + rawMessage: _rawMessage + image: _image + messageID: _mid + fromMe: _fromMe + timestamp: _ts + ackd: _ackd + error: _error + } - Connections { - target: gcd + Connections { + target: gcd - onClearMessages: function() { - messagesModel.clear() - txtMessage.text = "" - } + onClearMessages: function() { + messagesModel.clear() + txtMessage.text = "" + } - onAppendMessage: function(handle, from, displayName, message, image, mid, fromMe, ts, ackd, error) { - var msg - try { - msg = JSON.parse(message) - } catch (e) { - msg = {"o": 1, "d": "(legacy message type) " + message} - } - if (msg.o != 1) return + onAppendMessage: function(handle, from, displayName, message, image, mid, fromMe, ts, ackd, error) { + var msg + try { + msg = JSON.parse(message) + } catch (e) { + msg = {"o": 1, "d": "(legacy message type) " + message} + } + if (msg.o != 1) return - messagesModel.append({ - "_handle": handle, - "_from": from, - "_displayName": displayName, - "_message":parse(msg.d, 12), - "_image": image, - "_mid": mid, - "_fromMe": fromMe, - "_ts": ts, - "_ackd": ackd, - "_error": error == true ? "this message failed to send" : "", - }) + messagesModel.append({ + "_handle": handle, + "_from": from, + "_displayName": displayName, + "_message":parse(msg.d, 12), + "_rawMessage":msg.d, + "_image": image, + "_mid": mid, + "_fromMe": fromMe, + "_ts": ts, + "_ackd": ackd, + "_error": error == true ? "this message failed to send" : "", + }) + + messagesListView.positionViewAtEnd() + + // If the window is out of focus, alert the user (makes taskbar light up) + windowItem.alert(0) + } + + onPrependMessage: function(handle, from, displayName, message, image, mid, fromMe, ts, ackd, error) { + var msg + try { + msg = JSON.parse(message) + } catch (e) { + msg = {"o": 1, "d": "(legacy message type) " + message} + } + if (msg.o != 1) return + messagesModel.insert(0, { + "_handle": handle, + "_from": from, + "_displayName": displayName, + "_message":parse(msg.d, 12), + "_rawMessage":msg.d, + "_image": image, + "_mid": mid, + "_fromMe": fromMe, + "_ts": ts, + "_ackd": ackd, + "_error": error == true ? "this message failed to send" : "", + }) - // If the window is out of focus, alert the user (makes taskbar light up) - windowItem.alert(0) - - if (sv.contentY + sv.height >= sv.contentHeight - colMessages.height && sv.contentHeight > sv.height) { - sv.contentY = sv.contentHeight - sv.height - } - } - } - - - ScrollBar.vertical: ScrollBar{ - policy: ScrollBar.AlwaysOn - } - - ColumnLayout { - id: colMessages - width: sv.width - - - ListModel { // MESSAGE OBJECTS ARE STORED HERE ... - id: messagesModel - } - - Item { height: 6 } - - Repeater { // ... AND DISPLAYED HERE - model: messagesModel - delegate: Message { - handle: _handle - from: _from - displayName: _displayName - message: _message - image: _image - messageID: _mid - fromMe: _fromMe - timestamp: _ts - ackd: _ackd - error: _error - } - } - } - } + messagesListView.positionViewAtEnd() + } + } + } RowLayout { // THE BOTTOM DRAWER Rectangle { // MESSAGE ENTRY TEXTFIELD diff --git a/qml/panes/GroupSettingsPane.qml b/qml/panes/GroupSettingsPane.qml index 3a7fd18a..d5531162 100644 --- a/qml/panes/GroupSettingsPane.qml +++ b/qml/panes/GroupSettingsPane.qml @@ -122,7 +122,6 @@ ColumnLayout { // groupSettingsPane target: gcd onSupplyGroupSettings: function(gid, name, server, invite, accepted, addrbooknames, addrbookaddrs) { - console.log("Supplied " + gid + " " + name) gsp.groupID = gid toolbar.text = name txtGroupName.text = name diff --git a/qml/panes/OverlayPane.qml b/qml/panes/OverlayPane.qml index bbd4e36f..6ac6f185 100644 --- a/qml/panes/OverlayPane.qml +++ b/qml/panes/OverlayPane.qml @@ -151,7 +151,6 @@ ColumnLayout { } onSupplyGroupSettings: function(gid, name, server, invite, accepted, addrbooknames, addrbookaddrs) { - console.log("Supplied " + gid + " " + name + "Accepted " + accepted) overlay.name = name overlay.accepted = accepted overlay.inGroup = true diff --git a/qml/widgets/Message.qml b/qml/widgets/Message.qml index 11427572..2b42e64e 100644 --- a/qml/widgets/Message.qml +++ b/qml/widgets/Message.qml @@ -14,6 +14,7 @@ RowLayout { height: Math.max(imgProfile.height, rectMessageBubble.height) property alias message: lbl.text + property string rawMessage property string from property string handle property string displayName @@ -112,7 +113,7 @@ RowLayout { padding: 6 leftPadding: 10 font.pixelSize: gcd.themeScale * 12 - selectByMouse: true + selectByMouse: false readOnly: true width: Math.min(dummy.width, root.parent.width - (imgProfile.visible ? imgProfile.width : 0) - 40) wrapMode: TextEdit.Wrap @@ -160,5 +161,22 @@ RowLayout { } } } + + TextEdit { + id: copyhelper + visible: false + text: root.rawMessage + } + + MouseArea { + anchors.fill: parent + + + onPressAndHold: { + copyhelper.selectAll() + copyhelper.copy() + gcd.popup("message copied") + } + } } } \ No newline at end of file