forked from cwtch.im/ui
Merge branch 'uistate' of dan/ui into master
This commit is contained in:
commit
e2c3a82ea0
2
go.mod
2
go.mod
|
@ -3,7 +3,7 @@ module cwtch.im/ui
|
|||
go 1.12
|
||||
|
||||
require (
|
||||
cwtch.im/cwtch v0.3.2
|
||||
cwtch.im/cwtch v0.3.3
|
||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f // indirect
|
||||
github.com/kr/pretty v0.1.0 // indirect
|
||||
|
|
10
go.sum
10
go.sum
|
@ -4,6 +4,8 @@ cwtch.im/cwtch v0.3.1 h1:C0DLIrOqpNs5aecKTjNJZhpMq4/EvWNmLiKklIS8RTM=
|
|||
cwtch.im/cwtch v0.3.1/go.mod h1:8tmtp3c7fccWw9H7s9u6E8GD2PKI3ar21i0fjN8pzd0=
|
||||
cwtch.im/cwtch v0.3.2 h1:JxoauToMckHjmQz3QCmI7XG9pun1tF3pV/o5ziuqV1A=
|
||||
cwtch.im/cwtch v0.3.2/go.mod h1:4b2qGW5bZKm4CwYxqc0+4pgpDU0LjjyoihC8a/ezOoQ=
|
||||
cwtch.im/cwtch v0.3.3 h1:mAypnkTCehej5ebSEzl43nPufsyyXLNz/dw2RWOO+Wk=
|
||||
cwtch.im/cwtch v0.3.3/go.mod h1:I95rbE3aK8uic7LsMOB1lfJDSzlNsRUP0/5cFCLkD0Y=
|
||||
cwtch.im/tapir v0.1.10 h1:V+TkmwXNd6gySZqlVw468wMYEkmDwMSyvhkkpOfUw7w=
|
||||
cwtch.im/tapir v0.1.10/go.mod h1:EuRYdVrwijeaGBQ4OijDDRHf7R2MDSypqHkSl5DxI34=
|
||||
cwtch.im/tapir v0.1.11 h1:JLm1MIYq4VXKzhj68+P8OuVPllAU9U6G0DtUor2fbc4=
|
||||
|
@ -14,6 +16,7 @@ git.openprivacy.ca/openprivacy/libricochet-go v1.0.6/go.mod h1:yMSG1gBaP4f1U+RMZ
|
|||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
|
||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
|
||||
github.com/c-bata/go-prompt v0.2.3/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cretz/bine v0.1.0 h1:1/fvhLE+fk0bPzjdO5Ci+0ComYxEMuB1JhM4X5skT3g=
|
||||
github.com/cretz/bine v0.1.0/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
@ -25,6 +28,7 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
|
|||
github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gordonklaus/ineffassign v0.0.0-20190601041439-ed7b1b5ee0f8/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
|
@ -61,14 +65,17 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U
|
|||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0=
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
@ -78,7 +85,10 @@ golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20191031220737-6d8f1af9ccc0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
|
|
@ -5,7 +5,6 @@ import (
|
|||
"cwtch.im/cwtch/event"
|
||||
"cwtch.im/ui/go/constants"
|
||||
"cwtch.im/ui/go/cwutil"
|
||||
"cwtch.im/ui/go/gobjects"
|
||||
"cwtch.im/ui/go/gothings"
|
||||
"cwtch.im/ui/go/the"
|
||||
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||
|
@ -86,35 +85,13 @@ func AppEventListener(gcd *gothings.GrandCentralDispatcher, subscribed chan bool
|
|||
|
||||
contacts := the.Peer.GetContacts()
|
||||
for i := range contacts {
|
||||
contact, _ := the.Peer.GetProfile().GetContact(contacts[i])
|
||||
displayName, _ := contact.GetAttribute("nick")
|
||||
|
||||
gcd.UIState.AddContact(&gobjects.Contact{
|
||||
Handle: contacts[i],
|
||||
DisplayName: displayName,
|
||||
Image: cwutil.RandomProfileImage(contacts[i]),
|
||||
Trusted: contact.Trusted,
|
||||
Blocked: contact.Blocked,
|
||||
Loading: false,
|
||||
})
|
||||
gcd.UIState.AddContact(contacts[i])
|
||||
}
|
||||
|
||||
groups := the.Peer.GetGroups()
|
||||
for i := range groups {
|
||||
group := the.Peer.GetGroup(groups[i])
|
||||
nick, exists := group.GetAttribute("nick")
|
||||
if !exists {
|
||||
nick = group.GroupID[:12]
|
||||
}
|
||||
// Only join servers for active and explicitly accepted groups.
|
||||
gcd.UIState.AddContact(&gobjects.Contact{
|
||||
Handle: group.GroupID,
|
||||
DisplayName: nick,
|
||||
Image: cwutil.RandomGroupImage(group.GroupID),
|
||||
Server: group.GroupServer,
|
||||
Trusted: group.Accepted,
|
||||
Loading: false,
|
||||
})
|
||||
gcd.UIState.AddContact(groups[i])
|
||||
}
|
||||
|
||||
if e.Data[event.Status] != "running" {
|
||||
|
|
|
@ -3,6 +3,7 @@ package characters
|
|||
import (
|
||||
"cwtch.im/cwtch/event"
|
||||
"cwtch.im/cwtch/protocol/connections"
|
||||
"cwtch.im/ui/go/constants"
|
||||
"cwtch.im/ui/go/cwutil"
|
||||
"cwtch.im/ui/go/gobjects"
|
||||
"cwtch.im/ui/go/gothings"
|
||||
|
@ -48,7 +49,7 @@ func IncomingListener(uiState *gothings.InterfaceState, subscribed chan bool) {
|
|||
var exists bool
|
||||
ctc := the.Peer.GetContact(e.Data[event.RemotePeer])
|
||||
if ctc != nil {
|
||||
name, exists = ctc.GetAttribute("nick")
|
||||
name, exists = ctc.GetAttribute(constants.Nick)
|
||||
if !exists || name == "" {
|
||||
name = e.Data[event.RemotePeer]
|
||||
}
|
||||
|
@ -72,14 +73,7 @@ func IncomingListener(uiState *gothings.InterfaceState, subscribed chan bool) {
|
|||
gid, err := the.Peer.GetProfile().ProcessInvite(e.Data[event.GroupInvite], e.Data[event.RemotePeer])
|
||||
group := the.Peer.GetGroup(gid)
|
||||
if err == nil && group != nil {
|
||||
uiState.AddContact(&gobjects.Contact{
|
||||
Handle: gid,
|
||||
DisplayName: gid,
|
||||
Image: cwutil.RandomGroupImage(gid),
|
||||
Server: group.GroupServer,
|
||||
Trusted: false,
|
||||
Loading: false,
|
||||
})
|
||||
uiState.AddContact(gid)
|
||||
}
|
||||
case event.SendMessageToGroupError:
|
||||
uiState.AddSendMessageError(e.Data[event.GroupServer], e.Data[event.Signature], e.Data[event.Error])
|
||||
|
@ -89,38 +83,21 @@ func IncomingListener(uiState *gothings.InterfaceState, subscribed chan bool) {
|
|||
cxnState := connections.ConnectionStateToType[e.Data[event.ConnectionState]]
|
||||
|
||||
// if it's not in the.Peer it's new. Only add once Authed
|
||||
_, exists := the.Peer.GetProfile().Contacts[e.Data[event.RemotePeer]]
|
||||
if !exists {
|
||||
if _, exists := the.Peer.GetProfile().Contacts[e.Data[event.RemotePeer]]; !exists {
|
||||
// Contact does not exist, we will add them but we won't know who they are until they are authenticated
|
||||
// So if we get any other state from an unknown contact we do nothing
|
||||
// (the next exists check will fail)
|
||||
if cxnState == connections.AUTHENTICATED {
|
||||
the.Peer.AddContact(e.Data[event.RemotePeer], e.Data[event.RemotePeer], false)
|
||||
uiState.AddContact(e.Data[event.RemotePeer])
|
||||
}
|
||||
}
|
||||
|
||||
// if it's in the.Peer its either existing and needs an update or not in the UI and needs to be added
|
||||
if contact, exists := the.Peer.GetProfile().Contacts[e.Data[event.RemotePeer]]; exists {
|
||||
contact.State = e.Data[event.ConnectionState]
|
||||
uiContact := uiState.GetContact(contact.Onion)
|
||||
if uiContact != nil {
|
||||
if uiContact.Status != int(cxnState) {
|
||||
uiContact.Status = int(cxnState)
|
||||
uiState.UpdateContact(contact.Onion)
|
||||
}
|
||||
} else {
|
||||
uiState.AddContact(&gobjects.Contact{
|
||||
e.Data[event.RemotePeer],
|
||||
e.Data[event.RemotePeer],
|
||||
cwutil.RandomProfileImage(e.Data[event.RemotePeer]),
|
||||
"",
|
||||
0,
|
||||
int(cxnState),
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
})
|
||||
}
|
||||
uiState.UpdateContactStatus(contact.Onion, int(cxnState), false)
|
||||
|
||||
}
|
||||
case event.ServerStateChange:
|
||||
serverOnion := e.Data[event.GroupServer]
|
||||
|
@ -128,15 +105,13 @@ func IncomingListener(uiState *gothings.InterfaceState, subscribed chan bool) {
|
|||
groups := the.Peer.GetGroups()
|
||||
for _, groupID := range groups {
|
||||
group := the.Peer.GetGroup(groupID)
|
||||
group.State = e.Data[event.ConnectionState]
|
||||
if group != nil && group.GroupServer == serverOnion {
|
||||
uiState.GetContact(group.GroupID).Status = int(state)
|
||||
group.State = e.Data[event.ConnectionState]
|
||||
loading := false
|
||||
if state == connections.AUTHENTICATED {
|
||||
uiState.GetContact(group.GroupID).Loading = true
|
||||
} else {
|
||||
uiState.GetContact(group.GroupID).Loading = false
|
||||
loading = true
|
||||
}
|
||||
uiState.UpdateContact(group.GroupID)
|
||||
uiState.UpdateContactStatus(group.GroupID, int(state), loading)
|
||||
} else {
|
||||
log.Errorf("found group that is nil :/")
|
||||
}
|
||||
|
|
|
@ -2,3 +2,4 @@ package constants
|
|||
|
||||
const Nick = "nick"
|
||||
const LastRead = "last-read"
|
||||
const Picture = "picture"
|
||||
|
|
|
@ -3,7 +3,6 @@ package cwutil
|
|||
import (
|
||||
"encoding/base32"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||
"strings"
|
||||
)
|
||||
|
@ -23,7 +22,7 @@ func RandomGroupImage(handle string) string {
|
|||
choices := []string{"001-borobudur", "002-opera-house", "003-burj-al-arab", "004-chrysler", "005-acropolis", "006-empire-state-building", "007-temple", "008-indonesia-1", "009-new-zealand", "010-notre-dame", "011-space-needle", "012-seoul", "013-mosque", "014-milan", "015-statue", "016-pyramid", "017-cologne", "018-brandenburg-gate", "019-berlin-cathedral", "020-hungarian-parliament", "021-buckingham", "022-thailand", "023-independence", "024-angkor-wat", "025-vaticano", "026-christ-the-redeemer", "027-colosseum", "028-golden-gate-bridge", "029-sphinx", "030-statue-of-liberty", "031-cradle-of-humankind", "032-istanbul", "033-london-eye", "034-sagrada-familia", "035-tower-bridge", "036-burj-khalifa", "037-washington", "038-big-ben", "039-stonehenge", "040-white-house", "041-ahu-tongariki", "042-capitol", "043-eiffel-tower", "044-church-of-the-savior-on-spilled-blood", "045-arc-de-triomphe", "046-windmill", "047-louvre", "048-torii-gate", "049-petronas", "050-matsumoto-castle", "051-fuji", "052-temple-of-heaven", "053-pagoda", "054-chichen-itza", "055-forbidden-city", "056-merlion", "057-great-wall-of-china", "058-taj-mahal", "059-pisa", "060-indonesia"}
|
||||
barr, err := hex.DecodeString(handle)
|
||||
if err != nil || len(barr) == 0 {
|
||||
fmt.Printf("error: %v %v %v\n", handle, err, barr)
|
||||
log.Errorf("error: %v %v %v\n", handle, err, barr)
|
||||
return "qrc:/qml/images/extra/openprivacy.png"
|
||||
}
|
||||
return "qrc:/qml/images/servers/" + choices[int(barr[0])%len(choices)] + ".png"
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
package gobjects
|
||||
|
||||
type Contact struct {
|
||||
Handle string
|
||||
DisplayName string
|
||||
Image string
|
||||
Server string
|
||||
Badge int // # of unread
|
||||
Status int
|
||||
Trusted bool
|
||||
Blocked bool
|
||||
Loading bool
|
||||
}
|
|
@ -2,6 +2,7 @@ package gothings
|
|||
|
||||
import (
|
||||
"cwtch.im/cwtch/event"
|
||||
"cwtch.im/cwtch/protocol/connections"
|
||||
"cwtch.im/ui/go/constants"
|
||||
"cwtch.im/ui/go/cwutil"
|
||||
"github.com/therecipe/qt/qml"
|
||||
|
@ -30,10 +31,13 @@ type GrandCentralDispatcher struct {
|
|||
_ string `property:"buildDate"`
|
||||
|
||||
// contact list stuff
|
||||
_ func(handle, displayName, image, server string, badge, status int, trusted bool, blocked bool, loading bool) `signal:"AddContact"`
|
||||
_ func(handle, displayName, image, server string, badge, status int, trusted bool, blocked bool, loading bool) `signal:"UpdateContact"`
|
||||
_ func(handle string) `signal:"RemoveContact"`
|
||||
_ func(handle, key, value string) `signal:"UpdateContactAttribute"`
|
||||
_ func(handle, displayName, image, server string, badge, status int, blocked bool, loading bool) `signal:"AddContact"`
|
||||
_ func(handle, displayName string) `signal:"UpdateContactDisplayName"`
|
||||
_ func(handle string, status int, loading bool) `signal:"UpdateContactStatus"`
|
||||
_ func(handle string, blocked bool) `signal:"UpdateContactBlocked"`
|
||||
_ func(handle string) `signal:"IncContactUnreadCount"`
|
||||
_ func(handle string) `signal:"RemoveContact"`
|
||||
_ func(handle, key, value string) `signal:"UpdateContactAttribute"`
|
||||
|
||||
// messages pane stuff
|
||||
_ func(handle, from, displayName, message, image string, mID string, fromMe bool, ts string, ackd bool, error bool) `signal:"AppendMessage"`
|
||||
|
@ -93,16 +97,13 @@ func (this *GrandCentralDispatcher) sendMessage(message string, mID string) {
|
|||
return
|
||||
}
|
||||
|
||||
if len(this.CurrentOpenConversation()) == 32 { // SEND TO GROUP
|
||||
if isGroup(this.CurrentOpenConversation()) {
|
||||
if !the.Peer.GetGroup(this.CurrentOpenConversation()).Accepted {
|
||||
err := the.Peer.AcceptInvite(this.CurrentOpenConversation())
|
||||
if err != nil {
|
||||
log.Errorf("tried to mark a nonexistent group as existed. bad!")
|
||||
return
|
||||
}
|
||||
c := this.UIState.GetContact(this.CurrentOpenConversation())
|
||||
c.Trusted = true
|
||||
this.UIState.UpdateContact(c.Handle)
|
||||
}
|
||||
|
||||
var err error
|
||||
|
@ -126,13 +127,6 @@ func (this *GrandCentralDispatcher) sendMessage(message string, mID string) {
|
|||
return
|
||||
}
|
||||
} else {
|
||||
|
||||
// TODO: require explicit invite accept/reject instead of implicitly trusting on send
|
||||
if !this.UIState.GetContact(this.CurrentOpenConversation()).Trusted {
|
||||
this.UIState.GetContact(this.CurrentOpenConversation()).Trusted = true
|
||||
this.UIState.UpdateContact(this.CurrentOpenConversation())
|
||||
}
|
||||
|
||||
to := this.CurrentOpenConversation()
|
||||
mID = the.Peer.SendMessageToPeer(to, message)
|
||||
|
||||
|
@ -162,29 +156,20 @@ func (this *GrandCentralDispatcher) loadMessagesPaneHelper(handle string) {
|
|||
}
|
||||
this.ClearMessages()
|
||||
this.SetCurrentOpenConversation(handle)
|
||||
c := this.UIState.GetContact(handle)
|
||||
|
||||
if c == nil {
|
||||
this.UIState.AddContact(&gobjects.Contact{
|
||||
handle,
|
||||
handle,
|
||||
cwutil.RandomProfileImage(handle),
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
})
|
||||
} else {
|
||||
c.Badge = 0
|
||||
this.UIState.UpdateContact(handle)
|
||||
}
|
||||
|
||||
if len(handle) == 32 { // LOAD GROUP
|
||||
if isGroup(handle) { // LOAD GROUP
|
||||
group := the.Peer.GetGroup(handle)
|
||||
|
||||
loading := false
|
||||
state := connections.ConnectionStateToType[group.State]
|
||||
if state == connections.AUTHENTICATED {
|
||||
loading = true
|
||||
}
|
||||
this.UpdateContactStatus(group.GroupID, int(state), loading)
|
||||
|
||||
tl := group.GetTimeline()
|
||||
nick, _ := group.GetAttribute("nick")
|
||||
nick, _ := group.GetAttribute(constants.Nick)
|
||||
updateLastReadTime(group.GroupID)
|
||||
if nick == "" {
|
||||
this.SetToolbarTitle(handle)
|
||||
} else {
|
||||
|
@ -201,7 +186,7 @@ func (this *GrandCentralDispatcher) loadMessagesPaneHelper(handle string) {
|
|||
var exists bool
|
||||
ctc := the.Peer.GetContact(tl[i].PeerID)
|
||||
if ctc != nil {
|
||||
name, exists = ctc.GetAttribute("nick")
|
||||
name, exists = ctc.GetAttribute(constants.Nick)
|
||||
if !exists || name == "" {
|
||||
name = tl[i].PeerID
|
||||
}
|
||||
|
@ -226,13 +211,17 @@ func (this *GrandCentralDispatcher) loadMessagesPaneHelper(handle string) {
|
|||
} // ELSE LOAD CONTACT
|
||||
|
||||
contact, _ := the.Peer.GetProfile().GetContact(handle)
|
||||
|
||||
this.UpdateContactStatus(handle, int(connections.ConnectionStateToType[contact.State]), false)
|
||||
|
||||
var nick string
|
||||
if contact != nil {
|
||||
nick, _ = contact.GetAttribute("nick")
|
||||
nick, _ = contact.GetAttribute(constants.Nick)
|
||||
if nick == "" {
|
||||
nick = handle
|
||||
}
|
||||
}
|
||||
updateLastReadTime(contact.Onion)
|
||||
this.SetToolbarTitle(nick)
|
||||
|
||||
peer := the.Peer.GetContact(handle)
|
||||
|
@ -248,7 +237,7 @@ func (this *GrandCentralDispatcher) loadMessagesPaneHelper(handle string) {
|
|||
ctc := the.Peer.GetContact(messages[i].PeerID)
|
||||
if ctc != nil {
|
||||
var exists bool
|
||||
displayname, exists = ctc.GetAttribute("nick")
|
||||
displayname, exists = ctc.GetAttribute(constants.Nick)
|
||||
if !exists || displayname == "" {
|
||||
displayname = messages[i].PeerID
|
||||
}
|
||||
|
@ -285,11 +274,7 @@ func (this *GrandCentralDispatcher) saveSettings(zoom, locale string) {
|
|||
return
|
||||
}
|
||||
|
||||
the.EventBus.Publish(event.NewEvent(event.SetAttribute, map[event.Field]string{
|
||||
event.Key: constants.ZoomSetting,
|
||||
event.Data: zoom,
|
||||
}))
|
||||
the.Peer.GetProfile().SetAttribute(constants.ZoomSetting, zoom)
|
||||
the.Peer.SetAttribute(constants.ZoomSetting, zoom)
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) requestPeerSettings() {
|
||||
|
@ -300,7 +285,7 @@ func (this *GrandCentralDispatcher) requestPeerSettings() {
|
|||
return
|
||||
}
|
||||
|
||||
name, exists := contact.GetAttribute("nick")
|
||||
name, exists := contact.GetAttribute(constants.Nick)
|
||||
if !exists {
|
||||
log.Errorf("error: couldn't find contact %v", this.CurrentOpenConversation())
|
||||
this.SupplyPeerSettings(this.CurrentOpenConversation(), this.CurrentOpenConversation(), contact.Blocked)
|
||||
|
@ -311,23 +296,8 @@ func (this *GrandCentralDispatcher) requestPeerSettings() {
|
|||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) savePeerSettings(onion, nick string) {
|
||||
contact := the.Peer.GetContact(onion)
|
||||
if contact == nil {
|
||||
log.Errorf("error: tried to save settings for unknown peer %v", onion)
|
||||
return
|
||||
}
|
||||
|
||||
contact.SetAttribute("nick", nick)
|
||||
the.EventBus.Publish(event.NewEvent(event.SetPeerAttribute, map[event.Field]string{
|
||||
event.RemotePeer: onion,
|
||||
event.Key: "nick",
|
||||
event.Data: nick,
|
||||
}))
|
||||
|
||||
cif, _ := this.UIState.contacts.Load(onion)
|
||||
c := cif.(*gobjects.Contact)
|
||||
c.DisplayName = nick
|
||||
this.UIState.UpdateContact(onion)
|
||||
the.Peer.SetContactAttribute(onion, constants.Nick, nick)
|
||||
this.UpdateContactDisplayName(onion, nick)
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) requestGroupSettings(groupID string) {
|
||||
|
@ -338,13 +308,13 @@ func (this *GrandCentralDispatcher) requestGroupSettings(groupID string) {
|
|||
return
|
||||
}
|
||||
|
||||
nick, _ := group.GetAttribute("nick")
|
||||
nick, _ := group.GetAttribute(constants.Nick)
|
||||
invite, _ := the.Peer.ExportGroup(groupID)
|
||||
|
||||
contactaddrs := the.Peer.GetContacts()
|
||||
contactnames := make([]string, len(contactaddrs))
|
||||
for i, contact := range contactaddrs {
|
||||
name, hasname := the.Peer.GetContact(contact).GetAttribute("nick")
|
||||
name, hasname := the.Peer.GetContact(contact).GetAttribute(constants.Nick)
|
||||
if hasname {
|
||||
contactnames[i] = name
|
||||
} else {
|
||||
|
@ -356,24 +326,8 @@ func (this *GrandCentralDispatcher) requestGroupSettings(groupID string) {
|
|||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) saveGroupSettings(groupID, nick string) {
|
||||
group := the.Peer.GetGroup(groupID)
|
||||
|
||||
if group == nil {
|
||||
log.Errorf("couldn't find group %v", groupID)
|
||||
return
|
||||
}
|
||||
|
||||
group.SetAttribute("nick", nick)
|
||||
the.EventBus.Publish(event.NewEvent(event.SetGroupAttribute, map[event.Field]string{
|
||||
event.GroupID: groupID,
|
||||
event.Key: "nick",
|
||||
event.Data: nick,
|
||||
}))
|
||||
|
||||
cif, _ := this.UIState.contacts.Load(groupID)
|
||||
c := cif.(*gobjects.Contact)
|
||||
c.DisplayName = nick
|
||||
this.UIState.UpdateContact(groupID)
|
||||
the.Peer.SetGroupAttribute(groupID, constants.Nick, nick)
|
||||
this.UpdateContactDisplayName(groupID, nick)
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) broadcast(signal string) {
|
||||
|
@ -445,12 +399,7 @@ func (this *GrandCentralDispatcher) importString(str string) {
|
|||
return //TODO: bring them to the duplicate
|
||||
}
|
||||
|
||||
this.UIState.AddContact(&gobjects.Contact{
|
||||
Handle: onion,
|
||||
DisplayName: name,
|
||||
Image: cwutil.RandomProfileImage(onion),
|
||||
Trusted: true,
|
||||
})
|
||||
this.UIState.AddContact(onion)
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) popup(str string) {
|
||||
|
@ -471,21 +420,9 @@ func (this *GrandCentralDispatcher) createGroup(server, groupName string) {
|
|||
return
|
||||
}
|
||||
|
||||
this.UIState.AddContact(&gobjects.Contact{
|
||||
Handle: groupID,
|
||||
DisplayName: groupName,
|
||||
Image: cwutil.RandomGroupImage(groupID),
|
||||
Server: server,
|
||||
Trusted: true,
|
||||
})
|
||||
this.UIState.AddContact(groupID)
|
||||
|
||||
group := the.Peer.GetGroup(groupID)
|
||||
group.SetAttribute("nick", groupName)
|
||||
the.EventBus.Publish(event.NewEvent(event.SetGroupAttribute, map[event.Field]string{
|
||||
event.GroupID: groupID,
|
||||
event.Key: "nick",
|
||||
event.Data: groupName,
|
||||
}))
|
||||
the.Peer.SetGroupAttribute(groupID, constants.Nick, groupName)
|
||||
|
||||
the.Peer.JoinServer(server)
|
||||
}
|
||||
|
@ -495,7 +432,7 @@ func (this *GrandCentralDispatcher) blockPeer(onion string) {
|
|||
if err != nil {
|
||||
this.InvokePopup("Error Blocking Peer: " + err.Error())
|
||||
}
|
||||
this.UIState.UpdateContact(onion)
|
||||
this.UpdateContactBlocked(onion, true)
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) unblockPeer(onion string) {
|
||||
|
@ -504,7 +441,7 @@ func (this *GrandCentralDispatcher) unblockPeer(onion string) {
|
|||
this.InvokePopup("Error Unblocking Peer: " + err.Error())
|
||||
}
|
||||
the.Peer.PeerWithOnion(onion)
|
||||
this.UIState.UpdateContact(onion)
|
||||
this.UpdateContactBlocked(onion, false)
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) inviteToGroup(onion, groupID string) {
|
||||
|
@ -527,54 +464,28 @@ func (this *GrandCentralDispatcher) deleteContact(onion string) {
|
|||
func (this *GrandCentralDispatcher) acceptGroup(groupID string) {
|
||||
if the.Peer.GetGroup(groupID) != nil {
|
||||
the.Peer.AcceptInvite(groupID)
|
||||
this.UIState.UpdateContact(groupID)
|
||||
}
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) setAttribute(onion, key, value string) {
|
||||
pp, _ := the.Peer.GetProfile().GetContact(onion)
|
||||
if pp != nil {
|
||||
pp.SetAttribute(key, value)
|
||||
the.EventBus.Publish(event.NewEvent(event.SetPeerAttribute, map[event.Field]string{
|
||||
event.RemotePeer: onion,
|
||||
event.Key: key,
|
||||
event.Data: value,
|
||||
}))
|
||||
this.UIState.UpdateContactAttribute(onion, key, value)
|
||||
}
|
||||
the.Peer.SetContactAttribute(onion, key, value)
|
||||
this.UIState.UpdateContactAttribute(onion, key, value)
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) blockUnknownPeers() {
|
||||
|
||||
// Save this setting
|
||||
the.EventBus.Publish(event.NewEvent(event.SetAttribute, map[event.Field]string{
|
||||
event.Key: constants.BlockUnknownPeersSetting,
|
||||
event.Data: "true",
|
||||
}))
|
||||
|
||||
the.Peer.GetProfile().SetAttribute(constants.BlockUnknownPeersSetting, "true")
|
||||
the.Peer.SetAttribute(constants.BlockUnknownPeersSetting, "true")
|
||||
the.EventBus.Publish(event.NewEvent(event.BlockUnknownPeers, map[event.Field]string{}))
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) allowUnknownPeers() {
|
||||
|
||||
// Save this setting
|
||||
the.EventBus.Publish(event.NewEvent(event.SetAttribute, map[event.Field]string{
|
||||
event.Key: constants.BlockUnknownPeersSetting,
|
||||
event.Data: "false",
|
||||
}))
|
||||
|
||||
the.Peer.GetProfile().SetAttribute(constants.BlockUnknownPeersSetting, "false")
|
||||
the.Peer.SetAttribute(constants.BlockUnknownPeersSetting, "false")
|
||||
the.EventBus.Publish(event.NewEvent(event.AllowUnknownPeers, map[event.Field]string{}))
|
||||
}
|
||||
|
||||
func (this *GrandCentralDispatcher) setLocale(locale string) {
|
||||
this.SetLocale_helper(locale)
|
||||
|
||||
the.EventBus.Publish(event.NewEvent(event.SetAttribute, map[event.Field]string{
|
||||
event.Key: constants.LocaleSetting,
|
||||
event.Data: locale,
|
||||
}))
|
||||
the.Peer.SetAttribute(constants.LocaleSetting, locale)
|
||||
|
||||
zoom, _ := the.Peer.GetProfile().GetAttribute(constants.ZoomSetting)
|
||||
blockunkownpeers, _ := the.Peer.GetProfile().GetAttribute(constants.BlockUnknownPeersSetting)
|
||||
|
|
|
@ -1,23 +1,89 @@
|
|||
package gothings
|
||||
|
||||
import (
|
||||
"cwtch.im/cwtch/model"
|
||||
"cwtch.im/cwtch/protocol/connections"
|
||||
"cwtch.im/ui/go/constants"
|
||||
"cwtch.im/ui/go/cwutil"
|
||||
"cwtch.im/ui/go/gobjects"
|
||||
"cwtch.im/ui/go/the"
|
||||
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||
"runtime/debug"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
func isGroup(id string) bool {
|
||||
return len(id) == 32
|
||||
}
|
||||
|
||||
func isPeer(id string) bool {
|
||||
return len(id) == 56
|
||||
}
|
||||
|
||||
func getWithSetDefault(id string, key, defaultVal string) string {
|
||||
var val string
|
||||
var ok bool
|
||||
if isGroup(id) {
|
||||
val, ok = the.Peer.GetGroupAttribute(id, key)
|
||||
} else {
|
||||
val, ok = the.Peer.GetContactAttribute(id, key)
|
||||
}
|
||||
if !ok {
|
||||
val = defaultVal
|
||||
if isGroup(id) {
|
||||
the.Peer.SetGroupAttribute(id, key, defaultVal)
|
||||
} else {
|
||||
the.Peer.SetContactAttribute(id, key, defaultVal)
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
// initLastReadTime checks and gets the Attributable's LastRead time or sets it to now
|
||||
func initLastReadTime(id string) time.Time {
|
||||
nowStr, _ := time.Now().MarshalText()
|
||||
lastReadStr := getWithSetDefault(id, constants.LastRead, string(nowStr))
|
||||
var lastRead time.Time
|
||||
lastRead.UnmarshalText([]byte(lastReadStr))
|
||||
return lastRead
|
||||
}
|
||||
|
||||
func initProfilePicture(id string) string {
|
||||
log.Infof("initProfilePic: %v\n", id)
|
||||
if isGroup(id) {
|
||||
return getWithSetDefault(id, constants.Picture, cwutil.RandomGroupImage(id))
|
||||
} else {
|
||||
return getWithSetDefault(id, constants.Picture, cwutil.RandomProfileImage(id))
|
||||
}
|
||||
}
|
||||
|
||||
func updateLastReadTime(id string) {
|
||||
lastRead, _ := time.Now().MarshalText()
|
||||
if isGroup(id) {
|
||||
the.Peer.SetGroupAttribute(id, constants.LastRead, string(lastRead))
|
||||
} else {
|
||||
the.Peer.SetContactAttribute(id, constants.LastRead, string(lastRead))
|
||||
}
|
||||
}
|
||||
|
||||
func countUnread(messages []model.Message, lastRead time.Time) int {
|
||||
count := 0
|
||||
for i := len(messages) - 1; i >= 0; i-- {
|
||||
if messages[i].Timestamp.After(lastRead) {
|
||||
count++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
type InterfaceState struct {
|
||||
parentGcd *GrandCentralDispatcher
|
||||
contacts sync.Map // string : *gobjects.Contact
|
||||
}
|
||||
|
||||
func NewUIState(gcd *GrandCentralDispatcher) (uis InterfaceState) {
|
||||
uis = InterfaceState{gcd, sync.Map{}}
|
||||
uis = InterfaceState{gcd}
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -25,86 +91,39 @@ func (this *InterfaceState) Acknowledge(mID string) {
|
|||
this.parentGcd.Acknowledged(mID)
|
||||
}
|
||||
|
||||
func (this *InterfaceState) AddContact(c *gobjects.Contact) {
|
||||
if len(c.Handle) == 32 { // ADD GROUP
|
||||
if _, found := this.contacts.Load(c.Handle); !found {
|
||||
this.parentGcd.AddContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted, c.Blocked, c.Loading)
|
||||
this.contacts.Store(c.Handle, c)
|
||||
func (this *InterfaceState) AddContact(Handle string) {
|
||||
if isGroup(Handle) {
|
||||
group := the.Peer.GetGroup(Handle)
|
||||
if group != nil {
|
||||
lastRead := initLastReadTime(group.GroupID)
|
||||
unread := countUnread(group.Timeline.GetMessages(), lastRead)
|
||||
picture := initProfilePicture(Handle)
|
||||
nick, exists := group.GetAttribute(constants.Nick)
|
||||
if !exists {
|
||||
nick = Handle
|
||||
}
|
||||
|
||||
this.parentGcd.AddContact(Handle, nick, picture, group.GroupServer, unread, int(connections.ConnectionStateToType[group.State]), false, false)
|
||||
}
|
||||
return
|
||||
} else if len(c.Handle) != 56 {
|
||||
log.Errorf("sorry, unable to handle AddContact(%v)", c.Handle)
|
||||
} else if !isPeer(Handle) {
|
||||
log.Errorf("sorry, unable to handle AddContact(%v)", Handle)
|
||||
debug.PrintStack()
|
||||
return
|
||||
}
|
||||
|
||||
if _, found := this.contacts.Load(c.Handle); !found {
|
||||
this.contacts.Store(c.Handle, c)
|
||||
this.parentGcd.AddContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted, c.Blocked, false)
|
||||
if the.Peer.GetContact(c.Handle) == nil {
|
||||
the.Peer.AddContact(c.DisplayName, c.Handle, c.Trusted)
|
||||
go the.Peer.PeerWithOnion(c.Handle)
|
||||
contact := the.Peer.GetContact(Handle)
|
||||
if contact != nil {
|
||||
lastRead := initLastReadTime(contact.Onion)
|
||||
unread := countUnread(contact.Timeline.GetMessages(), lastRead)
|
||||
picture := initProfilePicture(Handle)
|
||||
nick, exists := contact.GetAttribute(constants.Nick)
|
||||
if !exists {
|
||||
nick = Handle
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (this *InterfaceState) DeleteContact(id string) {
|
||||
this.contacts.Delete(id)
|
||||
}
|
||||
|
||||
func (this *InterfaceState) GetContact(handle string) *gobjects.Contact {
|
||||
if _, found := this.contacts.Load(handle); !found {
|
||||
if len(handle) == 32 {
|
||||
group := the.Peer.GetGroup(handle)
|
||||
if group != nil {
|
||||
nick, exists := group.GetAttribute("nick")
|
||||
if !exists {
|
||||
nick = group.GroupID[:12]
|
||||
}
|
||||
this.AddContact(&gobjects.Contact{
|
||||
handle,
|
||||
nick,
|
||||
cwutil.RandomGroupImage(handle),
|
||||
group.GroupServer,
|
||||
0,
|
||||
0,
|
||||
group.Accepted,
|
||||
false,
|
||||
false,
|
||||
})
|
||||
} else {
|
||||
log.Errorf("Attempting to add non existent group to ui %v", handle)
|
||||
}
|
||||
} else {
|
||||
contact := the.Peer.GetContact(handle)
|
||||
if contact != nil && handle != contact.Onion {
|
||||
nick, exists := contact.GetAttribute("name")
|
||||
if !exists {
|
||||
nick = contact.Onion
|
||||
}
|
||||
this.AddContact(&gobjects.Contact{
|
||||
handle,
|
||||
nick,
|
||||
cwutil.RandomProfileImage(handle),
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
false,
|
||||
contact.Blocked,
|
||||
false,
|
||||
})
|
||||
} else if contact == nil {
|
||||
//log.Errorf("Attempting to add non existent contact to ui %v", handle)
|
||||
}
|
||||
}
|
||||
this.parentGcd.AddContact(Handle, nick, picture, "", unread, int(connections.ConnectionStateToType[contact.State]), contact.Blocked, false)
|
||||
}
|
||||
|
||||
contactIntf, _ := this.contacts.Load(handle)
|
||||
if contactIntf == nil {
|
||||
return nil
|
||||
}
|
||||
contact := contactIntf.(*gobjects.Contact)
|
||||
return contact
|
||||
}
|
||||
|
||||
func (this *InterfaceState) AddSendMessageError(peer string, signature string, err string) {
|
||||
|
@ -115,7 +134,7 @@ func (this *InterfaceState) AddSendMessageError(peer string, signature string, e
|
|||
}
|
||||
|
||||
func (this *InterfaceState) AddMessage(m *gobjects.Message) {
|
||||
this.GetContact(m.From)
|
||||
updateLastReadTime(m.Handle)
|
||||
|
||||
// If we have this group loaded already
|
||||
if this.parentGcd.CurrentOpenConversation() == m.Handle {
|
||||
|
@ -126,25 +145,16 @@ func (this *InterfaceState) AddMessage(m *gobjects.Message) {
|
|||
this.parentGcd.Acknowledged(m.MessageID)
|
||||
}
|
||||
} else {
|
||||
c := this.GetContact(m.Handle)
|
||||
if c != nil {
|
||||
c.Badge++
|
||||
this.UpdateContact(c.Handle)
|
||||
}
|
||||
this.parentGcd.IncContactUnreadCount(m.Handle)
|
||||
}
|
||||
}
|
||||
|
||||
func (this *InterfaceState) UpdateContact(handle string) {
|
||||
contact := the.Peer.GetContact(handle)
|
||||
cif, found := this.contacts.Load(handle)
|
||||
if found {
|
||||
c := cif.(*gobjects.Contact)
|
||||
if contact != nil {
|
||||
c.Blocked = contact.Blocked
|
||||
}
|
||||
this.parentGcd.UpdateContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted, c.Blocked, c.Loading)
|
||||
func (this *InterfaceState) UpdateContactDisplayName(handle string, name string) {
|
||||
this.parentGcd.UpdateContactDisplayName(handle, name)
|
||||
}
|
||||
|
||||
}
|
||||
func (this *InterfaceState) UpdateContactStatus(handle string, status int, loading bool) {
|
||||
this.parentGcd.UpdateContactStatus(handle, status, loading)
|
||||
}
|
||||
|
||||
func (this *InterfaceState) UpdateContactAttribute(handle, key, value string) {
|
||||
|
|
|
@ -87,12 +87,12 @@ ColumnLayout {
|
|||
})
|
||||
}
|
||||
|
||||
if (sv.contentY + sv.height >= sv.contentHeight - colMessages.height && sv.contentHeight > sv.height) {
|
||||
/*if (sv.contentY + sv.height >= sv.contentHeight - colMessages.height && sv.contentHeight > sv.height) {
|
||||
sv.contentY = sv.contentHeight - sv.height
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
onUpdateContact: function(_handle, _displayName, _image, _server, _badge, _status, _trusted, _blocked, _loading) {
|
||||
onUpdateContactStatus: function(_handle, _status, _loading) {
|
||||
if (gcd.currentOpenConversation == _handle) {
|
||||
if (_loading == true) {
|
||||
newposttitle.enabled = false
|
||||
|
|
|
@ -110,10 +110,10 @@ ColumnLayout {
|
|||
messagesListView.positionViewAtEnd()
|
||||
}
|
||||
|
||||
onUpdateContact: function(_handle, _displayName, _image, _server, _badge, _status, _trusted, _blocked, _loading) {
|
||||
onUpdateContactStatus: function(_handle, _status, _loading) {
|
||||
if (gcd.currentOpenConversation == _handle) {
|
||||
// Group is Synced OR p2p is Authenticated
|
||||
if ( (_handle.length == 32 && _status == 4) || _status == 3) {
|
||||
if ( (_handle.length == 32 && _status == 4) || (_handle.length == 56 && _status == 3) ) {
|
||||
txtMessage.enabled = true
|
||||
btnSend.enabled = true
|
||||
} else {
|
||||
|
|
|
@ -87,16 +87,16 @@ ColumnLayout {
|
|||
})
|
||||
}
|
||||
|
||||
if(msg.c != undefined) {
|
||||
/*if(msg.c != undefined) {
|
||||
jsonModel4.get(msg.c).complete = true
|
||||
}
|
||||
|
||||
if (sv.contentY + sv.height >= sv.contentHeight - colMessages.height && sv.contentHeight > sv.height) {
|
||||
sv.contentY = sv.contentHeight - sv.height
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
onUpdateContact: function(_handle, _displayName, _image, _server, _badge, _status, _trusted, _blocked, _loading) {
|
||||
onUpdateContactStatus: function(_handle, _status, _loading) {
|
||||
if (gcd.currentOpenConversation == _handle) {
|
||||
if (_loading == true) {
|
||||
newposttitle.enabled = false
|
||||
|
|
|
@ -105,7 +105,6 @@ ColumnLayout {
|
|||
handle: _handle
|
||||
displayName: _displayName
|
||||
image: _image
|
||||
trusted: true
|
||||
blocked: false
|
||||
background: false
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ ColumnLayout {
|
|||
Connections { // ADD/REMOVE CONTACT ENTRIES
|
||||
target: gcd
|
||||
|
||||
onAddContact: function(handle, displayName, image, server, badge, status, trusted, blocked, loading) {
|
||||
onAddContact: function(handle, displayName, image, server, badge, status, blocked, loading) {
|
||||
contactsModel.append({
|
||||
"_handle": handle,
|
||||
"_displayName": displayName + (blocked ? " (blocked)" : "" ),
|
||||
|
@ -55,7 +55,6 @@ ColumnLayout {
|
|||
"_server": server,
|
||||
"_badge": badge,
|
||||
"_status": status,
|
||||
"_trusted": trusted,
|
||||
"_blocked": blocked,
|
||||
"_loading": loading,
|
||||
"_loading": loading
|
||||
|
@ -86,7 +85,6 @@ ColumnLayout {
|
|||
server: _server
|
||||
badge: _badge
|
||||
status: _status
|
||||
trusted: _trusted
|
||||
blocked: _blocked
|
||||
loading: _loading
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ Item {
|
|||
anchors.margins: 4 * logscale
|
||||
|
||||
|
||||
Rectangle { //-2:WtfCodeError,-1:Untrusted,0:Disconnected,1:Connecting,2:Connected,3:Authenticated,4:Synced,5:Failed,6:Killed
|
||||
Rectangle { //-2:WtfCodeError,-1:Error,0:Disconnected,1:Connecting,2:Connected,3:Authenticated,4:Synced,5:Failed,6:Killed
|
||||
color: status == 4 ? "green" : status == 3 ? "green" : status == -1 ? "blue" : status == 1 ? "orange" : status == 2 ? "orange" : "red"
|
||||
width: 5 * logscale
|
||||
height: 5 * logscale
|
||||
|
|
|
@ -22,7 +22,6 @@ Item { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY
|
|||
property int badge
|
||||
property bool isActive
|
||||
property bool isHover
|
||||
property bool trusted
|
||||
property bool blocked
|
||||
property bool loading
|
||||
property alias status: imgProfile.status
|
||||
|
@ -52,7 +51,6 @@ Item { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY
|
|||
anchors.right: loading ? loadingProgress.left : rectUnread.left
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.pixelSize: 16 * gcd.themeScale
|
||||
font.italic: !trusted
|
||||
font.strikeout: blocked
|
||||
textFormat: Text.PlainText
|
||||
//fontSizeMode: Text.HorizontalFit
|
||||
|
@ -123,6 +121,7 @@ Item { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY
|
|||
isActive = true
|
||||
theStack.pane = theStack.messagePane
|
||||
gcd.loadMessagesPane(handle)
|
||||
badge = 0
|
||||
if (handle.length == 32) {
|
||||
gcd.requestGroupSettings(handle)
|
||||
}
|
||||
|
@ -145,17 +144,29 @@ Item { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY
|
|||
isActive = false
|
||||
}
|
||||
|
||||
onUpdateContact: function(_handle, _displayName, _image, _server, _badge, _status, _trusted, _blocked, _loading) {
|
||||
if (handle == _handle) {
|
||||
displayName = _displayName + (_blocked == true ? " (blocked)" : "")
|
||||
image = _image
|
||||
server = _server
|
||||
badge = _badge
|
||||
status = _status
|
||||
trusted = _trusted
|
||||
blocked = _blocked
|
||||
onUpdateContactStatus: function(_handle, _status, _loading) {
|
||||
if (handle == _handle) {
|
||||
status = _status
|
||||
loadingProgress.visible = loadingProgress.running = loading = _loading
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onUpdateContactBlocked: function(_handle, _blocked) {
|
||||
if (handle == _handle) {
|
||||
blocked = _blocked
|
||||
}
|
||||
}
|
||||
|
||||
onUpdateContactDisplayName: function(_handle, _displayName) {
|
||||
if (handle == _handle) {
|
||||
displayName = _displayName + (_blocked == true ? " (blocked)" : "")
|
||||
}
|
||||
}
|
||||
|
||||
onIncContactUnreadCount: function(handle) {
|
||||
if (handle == _handle) {
|
||||
badge++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue