Merge branch 'lockProfile' into add-profile
This commit is contained in:
commit
ba14e8ad72
13
go/ui/gcd.go
13
go/ui/gcd.go
|
@ -18,9 +18,11 @@ import (
|
|||
type GrandCentralDispatcher struct {
|
||||
core.QObject
|
||||
|
||||
uIManagers map[string]Manager
|
||||
QMLEngine *qml.QQmlApplicationEngine
|
||||
Translator *core.QTranslator
|
||||
QMLEngine *qml.QQmlApplicationEngine
|
||||
Translator *core.QTranslator
|
||||
|
||||
uIManagers map[string]Manager // profile-onion : Manager
|
||||
|
||||
profileLock sync.Mutex
|
||||
conversationLock sync.Mutex
|
||||
|
||||
|
@ -107,6 +109,7 @@ func (this *GrandCentralDispatcher) init() {
|
|||
this.uIManagers = make(map[string]Manager)
|
||||
}
|
||||
|
||||
// GetUiManager gets (and creates if required) a ui Manager for the supplied profile id
|
||||
func (this *GrandCentralDispatcher) GetUiManager(profile string) Manager {
|
||||
this.profileLock.Lock()
|
||||
defer this.profileLock.Unlock()
|
||||
|
@ -137,6 +140,8 @@ func (this *GrandCentralDispatcher) selectedProfileChanged(onion string) {
|
|||
this.SelectedProfileChanged(onion)
|
||||
}
|
||||
|
||||
// DoIfProfile performs a gcd action for a profile IF it is the currently selected profile in the UI
|
||||
// otherwise it does nothing. it also locks profile switching for the duration of the action
|
||||
func (this *GrandCentralDispatcher) DoIfProfile(profile string, fn func()) {
|
||||
this.profileLock.Lock()
|
||||
defer this.profileLock.Unlock()
|
||||
|
@ -164,6 +169,8 @@ func (this *GrandCentralDispatcher) selectedConversationChanged(handle string) {
|
|||
this.SelectedConversationChanged(handle)
|
||||
}
|
||||
|
||||
// DoIfConversation performs a gcd action for a conversation IF it is the currently selected conversation in the UI
|
||||
// otherwise it does nothing. it also locks conversation switching for the duration of the action
|
||||
func (this *GrandCentralDispatcher) DoIfConversation(conversation string, fn func()) {
|
||||
this.conversationLock.Lock()
|
||||
defer this.conversationLock.Unlock()
|
||||
|
|
|
@ -107,6 +107,7 @@ func countUnread(messages []model.Message, lastRead time.Time) int {
|
|||
return count
|
||||
}
|
||||
|
||||
// AddProfile adds a new profile to the UI
|
||||
func AddProfile(gcd *GrandCentralDispatcher, handle string) {
|
||||
peer := the.CwtchApp.GetPeer(handle)
|
||||
if peer != nil {
|
||||
|
@ -131,6 +132,11 @@ type manager struct {
|
|||
profile string
|
||||
}
|
||||
|
||||
// Manager is a middleware helper for entities like peer event listeners wishing to trigger ui changes (via the gcd)
|
||||
// each manager is for one profile/peer
|
||||
// manager takes minimal arguments and builds the full struct of data (usually pulled from a cwtch peer) required to call the GCD to perform the ui action
|
||||
// manager also performs call filtering based on UI state: users of manager can safely always call it on events and not have to worry about weather the relevant ui is active
|
||||
// ie: you can always safely call AddMessage even if in the ui a different profile is selected. manager will check with gcd, and if the correct conditions are not met, it will not call on gcd to update the ui incorrectly
|
||||
type Manager interface {
|
||||
Acknowledge(mID string)
|
||||
AddContact(Handle string)
|
||||
|
@ -142,10 +148,12 @@ type Manager interface {
|
|||
UpdateContactAttribute(handle, key, value string)
|
||||
}
|
||||
|
||||
// NewManager returns a new Manager interface for a profile to the gcd
|
||||
func NewManager(profile string, gcd *GrandCentralDispatcher) Manager {
|
||||
return &manager{gcd: gcd, profile: profile}
|
||||
}
|
||||
|
||||
// Acknowledge acknowledges the given message id in the UI
|
||||
func (this *manager) Acknowledge(mID string) {
|
||||
this.gcd.DoIfProfile(this.profile, func() {
|
||||
this.gcd.Acknowledged(mID)
|
||||
|
@ -160,6 +168,7 @@ func getLastMessageTime(tl *model.Timeline) int {
|
|||
return int(tl.Messages[len(tl.Messages)-1].Timestamp.Unix())
|
||||
}
|
||||
|
||||
// AddContact adds a new contact to the ui for this manager's profile
|
||||
func (this *manager) AddContact(Handle string) {
|
||||
this.gcd.DoIfProfile(this.profile, func() {
|
||||
|
||||
|
@ -198,6 +207,7 @@ func (this *manager) AddContact(Handle string) {
|
|||
})
|
||||
}
|
||||
|
||||
// AddSendMessageError adds an error not and icon to a message in a conversation in the ui for the message identified by the peer/sig combo
|
||||
func (this *manager) AddSendMessageError(peer string, signature string, err string) {
|
||||
this.gcd.DoIfProfile(this.profile, func() {
|
||||
this.gcd.DoIfConversation(peer, func() {
|
||||
|
@ -209,6 +219,7 @@ func (this *manager) AddSendMessageError(peer string, signature string, err stri
|
|||
})
|
||||
}
|
||||
|
||||
// AddMessage adds a message to the message pane for the supplied conversation if it is active
|
||||
func (this *manager) AddMessage(handle string, from string, message string, fromMe bool, messageID string, timestamp time.Time, Acknowledged bool) {
|
||||
this.gcd.DoIfProfile(this.profile, func() {
|
||||
|
||||
|
@ -233,18 +244,21 @@ func (this *manager) AddMessage(handle string, from string, message string, from
|
|||
})
|
||||
}
|
||||
|
||||
// UpdateContactDisplayName updates a contact's display name in the contact list and conversations
|
||||
func (this *manager) UpdateContactDisplayName(handle string, name string) {
|
||||
this.gcd.DoIfProfile(this.profile, func() {
|
||||
this.gcd.UpdateContactDisplayName(handle, name)
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateContactStatus updates a contact's status in the ui
|
||||
func (this *manager) UpdateContactStatus(handle string, status int, loading bool) {
|
||||
this.gcd.DoIfProfile(this.profile, func() {
|
||||
this.gcd.UpdateContactStatus(handle, status, loading)
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateContactAttribute update's a contacts attribute in the ui
|
||||
func (this *manager) UpdateContactAttribute(handle, key, value string) {
|
||||
this.gcd.DoIfProfile(this.profile, func() {
|
||||
this.gcd.UpdateContactAttribute(handle, key, value)
|
||||
|
|
Reference in New Issue