Default chat icon, use other user's avatar

For one-on-one chats without a custom icon, the other user's avatar will
be used as the chat's icon.

A default chat icon was also added
(haiku/data/artwork/icons/WebsiteComments).
This commit is contained in:
Jaidyn Ann 2021-07-27 19:51:55 -05:00
parent 6c1c5ccf18
commit 7df377d996
7 changed files with 54 additions and 3 deletions

View File

@ -24,7 +24,8 @@ enum {
kExitMenuReplicant = 1401, kExitMenuReplicant = 1401,
kReplicantMessageReceived = 1402, kReplicantMessageReceived = 1402,
kPersonIcon = 1500 kPersonIcon = 1500,
kChatIcon = 1501
}; };
#endif // _APP_RESOURCES_H #endif // _APP_RESOURCES_H

View File

@ -20,6 +20,7 @@
#include "ConversationItem.h" #include "ConversationItem.h"
#include "ConversationView.h" #include "ConversationView.h"
#include "Flags.h" #include "Flags.h"
#include "ImageCache.h"
#include "MainWindow.h" #include "MainWindow.h"
#include "NotifyMessage.h" #include "NotifyMessage.h"
#include "ProtocolLooper.h" #include "ProtocolLooper.h"
@ -36,12 +37,13 @@ Conversation::Conversation(BString id, BMessenger msgn)
fMessenger(msgn), fMessenger(msgn),
fChatView(NULL), fChatView(NULL),
fLooper(NULL), fLooper(NULL),
fIcon(NULL), fIcon(ImageCache::Get()->GetImage("kChatIcon")),
fDateFormatter(), fDateFormatter(),
fRoomFlags(0), fRoomFlags(0),
fDisallowedFlags(0), fDisallowedFlags(0),
fNotifyMessageCount(0), fNotifyMessageCount(0),
fNotifyMentionCount(0) fNotifyMentionCount(0),
fUserIcon(false)
{ {
fConversationItem = new ConversationItem(fName.String(), this); fConversationItem = new ConversationItem(fName.String(), this);
RegisterObserver(fConversationItem); RegisterObserver(fConversationItem);
@ -275,6 +277,18 @@ Conversation::SetNotifySubject(const char* subject)
} }
bool
Conversation::SetIconBitmap(BBitmap* icon)
{
if (icon != NULL) {
fIcon = icon;
GetView()->UpdateIcon();
return true;
}
return false;
}
BMessenger BMessenger
Conversation::Messenger() const Conversation::Messenger() const
{ {
@ -564,6 +578,8 @@ Conversation::_EnsureUser(BMessage* msg)
fUsers.AddItem(id, serverUser); fUsers.AddItem(id, serverUser);
user = serverUser; user = serverUser;
GetView()->UpdateUserList(fUsers); GetView()->UpdateUserList(fUsers);
_CloneUserIcon(user);
} }
// Not anywhere; create user // Not anywhere; create user
else if (user == NULL) { else if (user == NULL) {
@ -573,6 +589,8 @@ Conversation::_EnsureUser(BMessage* msg)
fLooper->AddUser(user); fLooper->AddUser(user);
fUsers.AddItem(id, user); fUsers.AddItem(id, user);
GetView()->UpdateUserList(fUsers); GetView()->UpdateUserList(fUsers);
_CloneUserIcon(user);
} }
if (name.IsEmpty() == false) { if (name.IsEmpty() == false) {
@ -583,6 +601,23 @@ Conversation::_EnsureUser(BMessage* msg)
} }
void
Conversation::_CloneUserIcon(User* user)
{
// If it's a one-on-one chat without custom icon, steal a user's
if ((fUsers.CountItems() <= 2 && user->GetId() != GetOwnContact()->GetId())
&& (fIcon == ImageCache::Get()->GetImage("kChatIcon")
|| fIcon == NULL))
fUserIcon = SetIconBitmap(user->AvatarBitmap());
// If it's no longer one-on-one, revert
if (fUsers.CountItems() > 2 && fUserIcon == true) {
SetIconBitmap(ImageCache::Get()->GetImage("kChatIcon"));
fUserIcon = false;
}
}
void void
Conversation::_SortConversationList() Conversation::_SortConversationList()
{ {

View File

@ -44,6 +44,8 @@ public:
void SetNotifyName(const char* name); void SetNotifyName(const char* name);
void SetNotifySubject(const char* subject); void SetNotifySubject(const char* subject);
bool SetIconBitmap(BBitmap* icon);
BMessenger Messenger() const; BMessenger Messenger() const;
void SetMessenger(BMessenger messenger); void SetMessenger(BMessenger messenger);
@ -83,6 +85,7 @@ private:
void _EnsureCachePath(); void _EnsureCachePath();
User* _EnsureUser(BMessage* msg); User* _EnsureUser(BMessage* msg);
void _CloneUserIcon(User* user);
void _SortConversationList(); void _SortConversationList();
@ -100,6 +103,7 @@ private:
BString fSubject; BString fSubject;
BBitmap* fIcon; BBitmap* fIcon;
bool fUserIcon;
BPath fCachePath; BPath fCachePath;
BDateTimeFormat fDateFormatter; BDateTimeFormat fDateFormatter;

View File

@ -27,6 +27,7 @@ ImageCache* ImageCache::fInstance = NULL;
ImageCache::ImageCache() ImageCache::ImageCache()
{ {
_LoadResource(kPersonIcon, "kPersonIcon"); _LoadResource(kPersonIcon, "kPersonIcon");
_LoadResource(kChatIcon, "kChatIcon");
_LoadResource(kAwayReplicant, "kAwayReplicant"); _LoadResource(kAwayReplicant, "kAwayReplicant");
_LoadResource(kBusyReplicant, "kBusyReplicant"); _LoadResource(kBusyReplicant, "kBusyReplicant");

View File

@ -99,6 +99,7 @@ RDEFS = Cardie.rdef \
data/icons/replicant/MessageReceived.rdef \ data/icons/replicant/MessageReceived.rdef \
data/icons/replicant/Offline.rdef \ data/icons/replicant/Offline.rdef \
data/icons/replicant/Online.rdef \ data/icons/replicant/Online.rdef \
data/icons/misc/Chat.rdef \
data/icons/misc/Person.rdef \ data/icons/misc/Person.rdef \
data/icons/misc/Search.rdef \ data/icons/misc/Search.rdef \
data/icons/misc/Tool.rdef data/icons/misc/Tool.rdef

BIN
data/icons/misc/Chat Normal file

Binary file not shown.

View File

@ -0,0 +1,9 @@
#include "application/AppResources.h"
resource(kChatIcon) #'VICN' array {
$"6E63696604052803010100020106023E80000000000000003D800048C0004940"
$"0000F8E278FFFAECA9020106023E80000000000000003D800048000049000000"
$"FFFFFFFFF3E6AA010606BF0F3C30C36F30B8E030244024BC3A24C3453C50B8E0"
$"503C584858C160C5C14458C512C4DF544054C28454BC3A040A00010030282401"
$"158802040A0201002028240A01010030201401158802040A030100202014"
};