1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Mark which peers are playing, styling is open to suggestions

closes #757
This commit is contained in:
Dubslow 2015-03-13 01:00:12 -05:00
parent 407ffef1b9
commit b6175ac96f
No known key found for this signature in database
GPG Key ID: 3DB8E05315C220AA
9 changed files with 89 additions and 40 deletions

View File

@ -242,11 +242,12 @@ void Audio::playMono16Sound(const QByteArray& data)
} }
void Audio::playGroupAudioQueued(Tox*,int group, int peer, const int16_t* data, void Audio::playGroupAudioQueued(Tox*,int group, int peer, const int16_t* data,
unsigned samples, uint8_t channels, unsigned sample_rate,void*) unsigned samples, uint8_t channels, unsigned sample_rate, void* core)
{ {
QMetaObject::invokeMethod(instance, "playGroupAudio", Qt::BlockingQueuedConnection, QMetaObject::invokeMethod(instance, "playGroupAudio", Qt::BlockingQueuedConnection,
Q_ARG(int,group), Q_ARG(int,peer), Q_ARG(const int16_t*,data), Q_ARG(int,group), Q_ARG(int,peer), Q_ARG(const int16_t*,data),
Q_ARG(unsigned,samples), Q_ARG(uint8_t,channels), Q_ARG(unsigned,sample_rate)); Q_ARG(unsigned,samples), Q_ARG(uint8_t,channels), Q_ARG(unsigned,sample_rate));
emit static_cast<Core*>(core)->groupPeerAudioPlaying(group, peer);
} }
void Audio::playGroupAudio(int group, int peer, const int16_t* data, void Audio::playGroupAudio(int group, int peer, const int16_t* data,

View File

@ -171,6 +171,7 @@ signals:
void groupMessageReceived(int groupnumber, int peernumber, const QString& message, bool isAction); void groupMessageReceived(int groupnumber, int peernumber, const QString& message, bool isAction);
void groupNamelistChanged(int groupnumber, int peernumber, uint8_t change); void groupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
void groupTitleChanged(int groupnumber, const QString& author, const QString& title); void groupTitleChanged(int groupnumber, const QString& author, const QString& title);
void groupPeerAudioPlaying(int groupnumber, int peernumber);
void usernameSet(const QString& username); void usernameSet(const QString& username);
void statusMessageSet(const QString& message); void statusMessageSet(const QString& message);

View File

@ -72,7 +72,6 @@ void Group::updatePeer(int peerId, QString name)
QString toxid = id.publicKey; QString toxid = id.publicKey;
peers[peerId] = name; peers[peerId] = name;
toxids[toxid] = name; toxids[toxid] = name;
Friend *f = FriendList::findFriend(id); Friend *f = FriendList::findFriend(id);
if (f) if (f)
{ {
@ -95,17 +94,16 @@ void Group::setName(const QString& name)
void Group::regeneratePeerList() void Group::regeneratePeerList()
{ {
QList<QString> peerLst = Core::getInstance()->getGroupPeerNames(groupId); peers = Core::getInstance()->getGroupPeerNames(groupId);
peers.clear();
toxids.clear(); toxids.clear();
nPeers = peerLst.size(); nPeers = peers.size();
for (int i = 0; i < peerLst.size(); i++) for (int i = 0; i < nPeers; i++)
{ {
ToxID id = Core::getInstance()->getGroupPeerToxID(groupId, i); ToxID id = Core::getInstance()->getGroupPeerToxID(groupId, i);
if (id.isMine())
selfPeerNum = i;
QString toxid = id.publicKey; QString toxid = id.publicKey;
peers[i] = peerLst.at(i); toxids[toxid] = peers[i];
toxids[toxid] = peerLst.at(i);
Friend *f = FriendList::findFriend(id); Friend *f = FriendList::findFriend(id);
if (f) if (f)
{ {
@ -145,9 +143,12 @@ GroupWidget *Group::getGroupWidget()
QStringList Group::getPeerList() const QStringList Group::getPeerList() const
{ {
QStringList peerNames(peers.values()); return peers;
peerNames.sort(Qt::CaseInsensitive); }
return peerNames;
bool Group::isSelfPeerNumber(int num) const
{
return num == selfPeerNum;
} }
void Group::setEventFlag(int f) void Group::setEventFlag(int f)

View File

@ -19,6 +19,7 @@
#include <QMap> #include <QMap>
#include <QObject> #include <QObject>
#include <QStringList>
#define RETRY_PEER_INFO_INTERVAL 500 #define RETRY_PEER_INFO_INTERVAL 500
@ -39,6 +40,7 @@ public:
int getPeersCount() const; int getPeersCount() const;
void regeneratePeerList(); void regeneratePeerList();
QStringList getPeerList() const; QStringList getPeerList() const;
bool isSelfPeerNumber(int peernumber) const;
GroupChatForm *getChatForm(); GroupChatForm *getChatForm();
GroupWidget *getGroupWidget(); GroupWidget *getGroupWidget();
@ -62,11 +64,12 @@ public:
private: private:
GroupWidget* widget; GroupWidget* widget;
GroupChatForm* chatForm; GroupChatForm* chatForm;
QMap<int, QString> peers; QStringList peers;
QMap<QString, QString> toxids; QMap<QString, QString> toxids;
int hasNewMessages, userWasMentioned; int hasNewMessages, userWasMentioned;
int groupId; int groupId;
int nPeers; int nPeers;
int selfPeerNum = -1;
bool avGroupchat; bool avGroupchat;
}; };

View File

@ -93,26 +93,27 @@ void Nexus::start()
//connect(androidgui, &AndroidGUI::friendRequestAccepted, core, &Core::acceptFriendRequest); //connect(androidgui, &AndroidGUI::friendRequestAccepted, core, &Core::acceptFriendRequest);
//connect(androidgui, &AndroidGUI::changeProfile, core, &Core::switchConfiguration); //connect(androidgui, &AndroidGUI::changeProfile, core, &Core::switchConfiguration);
#else #else
connect(core, &Core::connected, widget, &Widget::onConnected); connect(core, &Core::connected, widget, &Widget::onConnected);
connect(core, &Core::disconnected, widget, &Widget::onDisconnected); connect(core, &Core::disconnected, widget, &Widget::onDisconnected);
connect(core, &Core::failedToStart, widget, &Widget::onFailedToStartCore); connect(core, &Core::failedToStart, widget, &Widget::onFailedToStartCore);
connect(core, &Core::badProxy, widget, &Widget::onBadProxyCore); connect(core, &Core::badProxy, widget, &Widget::onBadProxyCore);
connect(core, &Core::statusSet, widget, &Widget::onStatusSet); connect(core, &Core::statusSet, widget, &Widget::onStatusSet);
connect(core, &Core::usernameSet, widget, &Widget::setUsername); connect(core, &Core::usernameSet, widget, &Widget::setUsername);
connect(core, &Core::statusMessageSet, widget, &Widget::setStatusMessage); connect(core, &Core::statusMessageSet, widget, &Widget::setStatusMessage);
connect(core, &Core::selfAvatarChanged, widget, &Widget::onSelfAvatarLoaded); connect(core, &Core::selfAvatarChanged, widget, &Widget::onSelfAvatarLoaded);
connect(core, &Core::friendAdded, widget, &Widget::addFriend); connect(core, &Core::friendAdded, widget, &Widget::addFriend);
connect(core, &Core::failedToAddFriend, widget, &Widget::addFriendFailed); connect(core, &Core::failedToAddFriend, widget, &Widget::addFriendFailed);
connect(core, &Core::friendUsernameChanged, widget, &Widget::onFriendUsernameChanged); connect(core, &Core::friendUsernameChanged, widget, &Widget::onFriendUsernameChanged);
connect(core, &Core::friendStatusChanged, widget, &Widget::onFriendStatusChanged); connect(core, &Core::friendStatusChanged, widget, &Widget::onFriendStatusChanged);
connect(core, &Core::friendStatusMessageChanged, widget, &Widget::onFriendStatusMessageChanged); connect(core, &Core::friendStatusMessageChanged, widget, &Widget::onFriendStatusMessageChanged);
connect(core, &Core::friendRequestReceived, widget, &Widget::onFriendRequestReceived); connect(core, &Core::friendRequestReceived, widget, &Widget::onFriendRequestReceived);
connect(core, &Core::friendMessageReceived, widget, &Widget::onFriendMessageReceived); connect(core, &Core::friendMessageReceived, widget, &Widget::onFriendMessageReceived);
connect(core, &Core::receiptRecieved, widget, &Widget::onReceiptRecieved); connect(core, &Core::receiptRecieved, widget, &Widget::onReceiptRecieved);
connect(core, &Core::groupInviteReceived, widget, &Widget::onGroupInviteReceived); connect(core, &Core::groupInviteReceived, widget, &Widget::onGroupInviteReceived);
connect(core, &Core::groupMessageReceived, widget, &Widget::onGroupMessageReceived); connect(core, &Core::groupMessageReceived, widget, &Widget::onGroupMessageReceived);
connect(core, &Core::groupNamelistChanged, widget, &Widget::onGroupNamelistChanged); connect(core, &Core::groupNamelistChanged, widget, &Widget::onGroupNamelistChanged);
connect(core, &Core::groupTitleChanged, widget, &Widget::onGroupTitleChanged); connect(core, &Core::groupTitleChanged, widget, &Widget::onGroupTitleChanged);
connect(core, &Core::groupPeerAudioPlaying, widget, &Widget::onGroupPeerAudioPlaying);
connect(core, &Core::emptyGroupCreated, widget, &Widget::onEmptyGroupCreated); connect(core, &Core::emptyGroupCreated, widget, &Widget::onEmptyGroupCreated);
connect(core, &Core::avInvite, widget, &Widget::playRingtone); connect(core, &Core::avInvite, widget, &Widget::playRingtone);
connect(core, &Core::blockingClearContacts, widget, &Widget::clearContactsList, Qt::BlockingQueuedConnection); connect(core, &Core::blockingClearContacts, widget, &Widget::clearContactsList, Qt::BlockingQueuedConnection);

View File

@ -29,6 +29,7 @@
#include "src/historykeeper.h" #include "src/historykeeper.h"
#include "src/misc/flowlayout.h" #include "src/misc/flowlayout.h"
#include <QDebug> #include <QDebug>
#include <QTimer>
GroupChatForm::GroupChatForm(Group* chatGroup) GroupChatForm::GroupChatForm(Group* chatGroup)
: group(chatGroup), inCall{false} : group(chatGroup), inCall{false}
@ -126,19 +127,45 @@ void GroupChatForm::onUserListChanged()
delete child->widget(); delete child->widget();
delete child; delete child;
} }
peerLabels.clear();
QStringList names(group->getPeerList()); // the list needs peers in peernumber order, nameLayout needs alphabetical
QMap<QString, QLabel*> orderizer;
// first traverse in peer number order, storing the QLabels as necessary
QStringList names = group->getPeerList();
unsigned nNames = names.size(); unsigned nNames = names.size();
for (unsigned i=0; i<nNames; ++i) for (unsigned i=0; i<nNames; ++i)
{ {
QString nameStr = names[i]; peerLabels.append(new QLabel(names[i]));
if (i!=nNames-1) peerLabels[i]->setTextFormat(Qt::PlainText);
nameStr+=", "; orderizer[names[i]] = peerLabels[i];
QLabel* nameLabel = new QLabel(nameStr); if (group->isSelfPeerNumber(i))
nameLabel->setObjectName("peersLabel"); peerLabels[i]->setStyleSheet("QLabel {color : green;}");
nameLabel->setTextFormat(Qt::PlainText);
namesListLayout->addWidget(nameLabel);
} }
// now alphabetize and add to layout
names.sort(Qt::CaseInsensitive);
for (unsigned i=0; i<nNames; ++i)
{
QLabel* label = orderizer[names[i]];
if (i != nNames - 1)
label->setText(label->text() + ", ");
namesListLayout->addWidget(label);
}
}
void GroupChatForm::peerAudioPlaying(int peer)
{
peerLabels[peer]->setStyleSheet("QLabel {color : red;}");
if (!peerAudioTimers[peer])
{
peerAudioTimers[peer] = new QTimer(this);
peerAudioTimers[peer]->setSingleShot(true);
connect(peerAudioTimers[peer], &QTimer::timeout, [=]{this->peerLabels[peer]->setStyleSheet("");
delete this->peerAudioTimers[peer];
this->peerAudioTimers[peer] = nullptr;});
}
peerAudioTimers[peer]->start(500);
} }
void GroupChatForm::dragEnterEvent(QDragEnterEvent *ev) void GroupChatForm::dragEnterEvent(QDragEnterEvent *ev)

View File

@ -18,11 +18,13 @@
#define GROUPCHATFORM_H #define GROUPCHATFORM_H
#include "genericchatform.h" #include "genericchatform.h"
#include <QMap>
namespace Ui {class MainWindow;} namespace Ui {class MainWindow;}
class Group; class Group;
class TabCompleter; class TabCompleter;
class FlowLayout; class FlowLayout;
class QTimer;
class GroupChatForm : public GenericChatForm class GroupChatForm : public GenericChatForm
{ {
@ -31,6 +33,7 @@ public:
GroupChatForm(Group* chatGroup); GroupChatForm(Group* chatGroup);
void onUserListChanged(); void onUserListChanged();
void peerAudioPlaying(int peer);
void keyPressEvent(QKeyEvent* ev); void keyPressEvent(QKeyEvent* ev);
void keyReleaseEvent(QKeyEvent* ev); void keyReleaseEvent(QKeyEvent* ev);
@ -51,6 +54,8 @@ protected:
private: private:
Group* group; Group* group;
QList<QLabel*> peerLabels; // maps peernumbers to the QLabels in namesListLayout
QMap<int, QTimer*> peerAudioTimers; // timeout = peer stopped sending audio
FlowLayout* namesListLayout; FlowLayout* namesListLayout;
QLabel *nusersLabel; QLabel *nusersLabel;
TabCompleter* tabber; TabCompleter* tabber;

View File

@ -906,6 +906,15 @@ void Widget::onGroupTitleChanged(int groupnumber, const QString& author, const Q
g->getChatForm()->addSystemInfoMessage(tr("%1 has set the title to %2").arg(author, title), ChatMessage::INFO, QDateTime::currentDateTime()); g->getChatForm()->addSystemInfoMessage(tr("%1 has set the title to %2").arg(author, title), ChatMessage::INFO, QDateTime::currentDateTime());
} }
void Widget::onGroupPeerAudioPlaying(int groupnumber, int peernumber)
{
Group* g = GroupList::findGroup(groupnumber);
if (!g)
return;
g->getChatForm()->peerAudioPlaying(peernumber);
}
void Widget::removeGroup(Group* g, bool fake) void Widget::removeGroup(Group* g, bool fake)
{ {
g->getGroupWidget()->setAsInactiveChatroom(); g->getGroupWidget()->setAsInactiveChatroom();

View File

@ -102,6 +102,7 @@ public slots:
void onGroupMessageReceived(int groupnumber, int peernumber, const QString& message, bool isAction); void onGroupMessageReceived(int groupnumber, int peernumber, const QString& message, bool isAction);
void onGroupNamelistChanged(int groupnumber, int peernumber, uint8_t change); void onGroupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
void onGroupTitleChanged(int groupnumber, const QString& author, const QString& title); void onGroupTitleChanged(int groupnumber, const QString& author, const QString& title);
void onGroupPeerAudioPlaying(int groupnumber, int peernumber);
void playRingtone(); void playRingtone();
void onFriendTypingChanged(int friendId, bool isTyping); void onFriendTypingChanged(int friendId, bool isTyping);
void nextContact(); void nextContact();